summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/onefiledist.yml3
-rw-r--r--generic/tclBasic.c11
-rw-r--r--generic/tclClock.c19
-rw-r--r--generic/tclEnv.c9
-rw-r--r--generic/tclInt.h7
-rw-r--r--generic/tclInterp.c22
-rw-r--r--generic/tclZipfs.c15
-rw-r--r--tests/expr.test6
-rw-r--r--tests/interp.test4
-rw-r--r--unix/Makefile.in6
-rw-r--r--unix/tclUnixCompat.c3
-rw-r--r--win/Makefile.in9
12 files changed, 77 insertions, 37 deletions
diff --git a/.github/workflows/onefiledist.yml b/.github/workflows/onefiledist.yml
index df98bec..a60428d 100644
--- a/.github/workflows/onefiledist.yml
+++ b/.github/workflows/onefiledist.yml
@@ -38,7 +38,7 @@ jobs:
path: 1dist/*.tar
macos:
name: macOS
- runs-on: macos-latest
+ runs-on: macos-11.0
defaults:
run:
shell: bash
@@ -60,6 +60,7 @@ jobs:
sudo chmod a+x /usr/local/bin/macher
echo "VER_PATH=$(cd tools; pwd)/addVerToFile.tcl" >> $GITHUB_ENV
echo "CREATE_DMG=$(cd create-dmg;pwd)/create-dmg" >> $GITHUB_ENV
+ echo "CFLAGS=-arch x86_64 -arch arm64e" >> $GITHUB_ENV
- name: Configure
run: ./configure --disable-symbols --disable-shared --enable-zipfs
working-directory: unix
diff --git a/generic/tclBasic.c b/generic/tclBasic.c
index 2ed4270..b2d3f28 100644
--- a/generic/tclBasic.c
+++ b/generic/tclBasic.c
@@ -7906,7 +7906,16 @@ ExprAbsFunc(
}
goto unChanged;
} else if (l == WIDE_MIN) {
- if (mp_init_i64(&big, l) != MP_OKAY) {
+ if (sizeof(Tcl_WideInt) > sizeof(int64_t)) {
+ Tcl_WideUInt ul = -(Tcl_WideUInt)WIDE_MIN;
+ if (mp_init(&big) != MP_OKAY || mp_unpack(&big, 1, 1,
+ sizeof(Tcl_WideInt), 0, 0, &ul) != MP_OKAY) {
+ return TCL_ERROR;
+ }
+ if (mp_neg(&big, &big) != MP_OKAY) {
+ return TCL_ERROR;
+ }
+ } else if (mp_init_i64(&big, l) != MP_OKAY) {
return TCL_ERROR;
}
goto tooLarge;
diff --git a/generic/tclClock.c b/generic/tclClock.c
index eb52244..7863f84 100644
--- a/generic/tclClock.c
+++ b/generic/tclClock.c
@@ -2024,10 +2024,27 @@ ClockSecondsObjCmd(
static void
TzsetIfNecessary(void)
{
- static char* tzWas = (char *)INT2PTR(-1); /* Previous value of TZ, protected by
+ static char *tzWas = (char *)INT2PTR(-1); /* Previous value of TZ, protected by
* clockMutex. */
+ static long tzLastRefresh = 0; /* Used for latency before next refresh */
+ static size_t tzEnvEpoch = 0; /* Last env epoch, for faster signaling,
+ that TZ changed via TCL */
const char *tzIsNow; /* Current value of TZ */
+ /*
+ * Prevent performance regression on some platforms by resolving of system time zone:
+ * small latency for check whether environment was changed (once per second)
+ * no latency if environment was changed with tcl-env (compare both epoch values)
+ */
+ Tcl_Time now;
+ Tcl_GetTime(&now);
+ if (now.sec == tzLastRefresh && tzEnvEpoch == TclEnvEpoch) {
+ return;
+ }
+
+ tzEnvEpoch = TclEnvEpoch;
+ tzLastRefresh = now.sec;
+
Tcl_MutexLock(&clockMutex);
tzIsNow = getenv("TZ");
if (tzIsNow != NULL && (tzWas == NULL || tzWas == INT2PTR(-1)
diff --git a/generic/tclEnv.c b/generic/tclEnv.c
index ad55645..64d0309 100644
--- a/generic/tclEnv.c
+++ b/generic/tclEnv.c
@@ -36,6 +36,11 @@ TCL_DECLARE_MUTEX(envMutex) /* To serialize access to environ. */
# define techar char
#endif
+
+/* MODULE_SCOPE */
+size_t TclEnvEpoch = 0; /* Epoch of the tcl environment
+ * (if changed with tcl-env). */
+
static struct {
int cacheSize; /* Number of env strings in cache. */
char **cache; /* Array containing all of the environment
@@ -417,6 +422,7 @@ Tcl_PutEnv(
value[0] = '\0';
TclSetEnv(name, value+1);
}
+ TclEnvEpoch++;
Tcl_DStringFree(&nameString);
return 0;
@@ -624,6 +630,7 @@ EnvTraceProc(
if (flags & TCL_TRACE_ARRAY) {
TclSetupEnv(interp);
+ TclEnvEpoch++;
return NULL;
}
@@ -644,6 +651,7 @@ EnvTraceProc(
value = Tcl_GetVar2(interp, "env", name2, TCL_GLOBAL_ONLY);
TclSetEnv(name2, value);
+ TclEnvEpoch++;
}
/*
@@ -667,6 +675,7 @@ EnvTraceProc(
if (flags & TCL_TRACE_UNSETS) {
TclUnsetEnv(name2);
+ TclEnvEpoch++;
}
return NULL;
}
diff --git a/generic/tclInt.h b/generic/tclInt.h
index 96315fb..f9b2852 100644
--- a/generic/tclInt.h
+++ b/generic/tclInt.h
@@ -5144,6 +5144,13 @@ typedef struct NRE_callback {
#define Tcl_Free(ptr) TclpFree(ptr)
#endif
+/*
+ * Other externals.
+ */
+
+MODULE_SCOPE size_t TclEnvEpoch; /* Epoch of the tcl environment
+ * (if changed with tcl-env). */
+
#endif /* _TCLINT */
/*
diff --git a/generic/tclInterp.c b/generic/tclInterp.c
index a263a66..d63add2 100644
--- a/generic/tclInterp.c
+++ b/generic/tclInterp.c
@@ -4785,7 +4785,7 @@ ChildTimeLimitCmd(
Tcl_Obj *milliObj = NULL, *secObj = NULL;
int gran = 0;
Tcl_Time limitMoment;
- int tmp;
+ Tcl_WideInt tmp;
Tcl_LimitGetTime(childInterp, &limitMoment);
for (i=consumedObjc ; i<objc ; i+=2) {
@@ -4817,17 +4817,17 @@ ChildTimeLimitCmd(
if (milliLen == 0) {
break;
}
- if (TclGetIntFromObj(interp, objv[i+1], &tmp) != TCL_OK) {
+ if (TclGetWideIntFromObj(interp, objv[i+1], &tmp) != TCL_OK) {
return TCL_ERROR;
}
- if (tmp < 0) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(
- "milliseconds must be at least 0", -1));
+ if (tmp < 0 || tmp > LONG_MAX) {
+ Tcl_SetObjResult(interp, Tcl_ObjPrintf(
+ "milliseconds must be between 0 and %ld", LONG_MAX));
Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP",
"BADVALUE", NULL);
return TCL_ERROR;
}
- limitMoment.usec = ((long) tmp)*1000;
+ limitMoment.usec = ((long)tmp)*1000;
break;
case OPT_SEC:
secObj = objv[i+1];
@@ -4835,17 +4835,17 @@ ChildTimeLimitCmd(
if (secLen == 0) {
break;
}
- if (TclGetIntFromObj(interp, objv[i+1], &tmp) != TCL_OK) {
+ if (TclGetWideIntFromObj(interp, objv[i+1], &tmp) != TCL_OK) {
return TCL_ERROR;
}
- if (tmp < 0) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(
- "seconds must be at least 0", -1));
+ if (tmp < 0 || tmp > LONG_MAX) {
+ Tcl_SetObjResult(interp, Tcl_ObjPrintf(
+ "seconds must be between 0 and %ld", LONG_MAX));
Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP",
"BADVALUE", NULL);
return TCL_ERROR;
}
- limitMoment.sec = tmp;
+ limitMoment.sec = (long)tmp;
break;
}
}
diff --git a/generic/tclZipfs.c b/generic/tclZipfs.c
index 0d646aa..f052c2e 100644
--- a/generic/tclZipfs.c
+++ b/generic/tclZipfs.c
@@ -3157,18 +3157,15 @@ TclZipfs_TclLibrary(void)
return Tcl_NewStringObj(zipfs_literal_tcl_library, -1);
}
#else
-# if defined(CFG_RUNTIME_LIBDIR)
if (ZipfsAppHookFindTclInit(
- CFG_RUNTIME_LIBDIR "/" CFG_RUNTIME_DLLFILE) == TCL_OK) {
- return Tcl_NewStringObj(zipfs_literal_tcl_library, -1);
- }
-# endif
-# if defined(CFG_RUNTIME_BINDIR)
- if (ZipfsAppHookFindTclInit(
- CFG_RUNTIME_BINDIR "/" CFG_RUNTIME_DLLFILE) == TCL_OK) {
+#ifdef __CYGWIN__
+ CFG_RUNTIME_BINDIR
+#else
+ CFG_RUNTIME_LIBDIR
+#endif
+ "/" CFG_RUNTIME_DLLFILE) == TCL_OK) {
return Tcl_NewStringObj(zipfs_literal_tcl_library, -1);
}
-# endif
#endif /* _WIN32 */
#endif /* !defined(STATIC_BUILD) */
diff --git a/tests/expr.test b/tests/expr.test
index 9add1f1..8d2f668 100644
--- a/tests/expr.test
+++ b/tests/expr.test
@@ -6699,6 +6699,12 @@ test expr-38.12 {abs and -0x0 [Bug 2954959]} {
test expr-38.13 {abs and 0.0 [Bug 2954959]} {
::tcl::mathfunc::abs 1e-324
} 1e-324
+test expr-38.14 {abs and INT64_MIN special-case} {
+ ::tcl::mathfunc::abs -9223372036854775808
+} 9223372036854775808
+test expr-38.15 {abs and INT128_MIN special-case} {
+ ::tcl::mathfunc::abs -170141183460469231731687303715884105728
+} 170141183460469231731687303715884105728
testConstraint testexprlongobj [llength [info commands testexprlongobj]]
testConstraint testexprdoubleobj [llength [info commands testexprdoubleobj]]
diff --git a/tests/interp.test b/tests/interp.test
index c19755f..385d3e2 100644
--- a/tests/interp.test
+++ b/tests/interp.test
@@ -3524,7 +3524,7 @@ test interp-35.19 {interp limit syntax} -body {
interp limit $i time -seconds -1
} -cleanup {
interp delete $i
-} -returnCodes error -result {seconds must be at least 0}
+} -match glob -returnCodes error -result {seconds must be between 0 and *}
test interp-35.20 {interp limit syntax} -body {
set i [interp create]
interp limit $i time -millis foobar
@@ -3536,7 +3536,7 @@ test interp-35.21 {interp limit syntax} -body {
interp limit $i time -millis -1
} -cleanup {
interp delete $i
-} -returnCodes error -result {milliseconds must be at least 0}
+} -match glob -returnCodes error -result {milliseconds must be between 0 and *}
test interp-35.22 {interp time limits normalize milliseconds} -body {
set i [interp create]
interp limit $i time -seconds 1 -millis 1500
diff --git a/unix/Makefile.in b/unix/Makefile.in
index 32b99a2..15d80cb 100644
--- a/unix/Makefile.in
+++ b/unix/Makefile.in
@@ -778,7 +778,7 @@ ${TCL_ZIP_FILE}: ${ZIP_INSTALL_OBJS}
cp -a $(TOP_DIR)/library/* ${TCL_VFS_PATH}; \
fi
mv ${TCL_VFS_PATH}/manifest.txt ${TCL_VFS_PATH}/pkgIndex.tcl
- rm -rf ${TCL_VFS_PATH}/dde ${TCL_VFS_PATH}/reg
+ rm -rf ${TCL_VFS_PATH}/dde ${TCL_VFS_PATH}/registry
@find ${TCL_VFS_ROOT} -type d -empty -delete
@echo "creating ${TCL_ZIP_FILE} from ${TCL_VFS_PATH}"
@(zip=`(realpath '${NATIVE_ZIP}' || readlink -m '${NATIVE_ZIP}' || \
@@ -1523,7 +1523,7 @@ tclZipfs.o: $(GENERIC_DIR)/tclZipfs.c
$(CC) -c $(CC_SWITCHES) \
-DCFG_RUNTIME_DLLFILE="\"$(TCL_LIB_FILE)\"" \
-DCFG_RUNTIME_LIBDIR="\"$(libdir)\"" \
- -DCFG_RUNTIME_SCRDIR="\"$(TCL_LIBRARY)\"" \
+ -DCFG_RUNTIME_BINDIR="\"$(bindir)\"" \
-I$(ZLIB_DIR) -I$(ZLIB_DIR)/contrib/minizip \
$(GENERIC_DIR)/tclZipfs.c
@@ -2218,7 +2218,7 @@ DISTROOT = /tmp/dist
DISTNAME = tcl${VERSION}${PATCH_LEVEL}
ZIPNAME = tcl${MAJOR_VERSION}${MINOR_VERSION}${PATCH_LEVEL}-src.zip
DISTDIR = $(DISTROOT)/$(DISTNAME)
-BUILTIN_PACKAGE_LIST = cookiejar http opt msgcat reg dde tcltest platform
+BUILTIN_PACKAGE_LIST = cookiejar http opt msgcat registry dde tcltest platform
$(UNIX_DIR)/configure: $(UNIX_DIR)/configure.ac $(UNIX_DIR)/tcl.m4 \
$(UNIX_DIR)/aclocal.m4
diff --git a/unix/tclUnixCompat.c b/unix/tclUnixCompat.c
index 74b4bf3..9e43c01 100644
--- a/unix/tclUnixCompat.c
+++ b/unix/tclUnixCompat.c
@@ -1009,6 +1009,9 @@ TclWinCPUID(
: "a"(index));
#endif
status = TCL_OK;
+#else
+ (void)index;
+ (void)regsPtr;
#endif
return status;
}
diff --git a/win/Makefile.in b/win/Makefile.in
index cdaeec4..3a8e0a9 100644
--- a/win/Makefile.in
+++ b/win/Makefile.in
@@ -524,15 +524,6 @@ ${TCL_ZIP_FILE}: ${ZIP_INSTALL_OBJS} ${DDE_DLL_FILE} ${REG_DLL_FILE}
@mkdir -p ${TCL_VFS_PATH}
@echo "creating ${TCL_VFS_PATH} (prepare compression)"
@( \
- $(LN) $$(find $(TOP_DIR)/library/* -maxdepth 0 -type f) ${TCL_VFS_PATH}/ && \
- (for D in $$(find $(TOP_DIR)/library/* -maxdepth 0 -type d); do \
- mkdir -p "${TCL_VFS_PATH}/$$(basename $$D)"; \
- $(LN) -s $$D/* ${TCL_VFS_PATH}/$$(basename $$D)/; \
- done) && \
- $(LN) ${TCL_VFS_PATH}/manifest.txt ${TCL_VFS_PATH}/pkgIndex.tcl && \
- $(LN) ${DDE_DLL_FILE} ${TCL_VFS_PATH}/dde/ && \
- $(LN) ${REG_DLL_FILE} ${TCL_VFS_PATH}/registry/ \
- ) || ( \
$(COPY) -a $(TOP_DIR)/library/* ${TCL_VFS_PATH}; \
$(COPY) -a ${TCL_VFS_PATH}/manifest.txt ${TCL_VFS_PATH}/pkgIndex.tcl; \
$(COPY) ${DDE_DLL_FILE} ${TCL_VFS_PATH}/dde; \