summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2021-02-24 15:29:19 (GMT)
committerdgp <dgp@users.sourceforge.net>2021-02-24 15:29:19 (GMT)
commita689964fd29863cbd791c79b35351c1bcee9f1f1 (patch)
treee1e7d9ae0388496d852462d0aa7af1a1ed8ec8cc
parentb33613724bccac4b5eaf90f55904948d39d34407 (diff)
parentbc0d60d931ae4b37a77de366f73addd1af213fb9 (diff)
downloadtcl-a689964fd29863cbd791c79b35351c1bcee9f1f1.zip
tcl-a689964fd29863cbd791c79b35351c1bcee9f1f1.tar.gz
tcl-a689964fd29863cbd791c79b35351c1bcee9f1f1.tar.bz2
merge trunk
-rw-r--r--.github/workflows/onefiledist.yml2
-rw-r--r--generic/regc_lex.c2
-rw-r--r--generic/tcl.decls3
-rw-r--r--generic/tclBasic.c15
-rw-r--r--generic/tclClock.c72
-rw-r--r--generic/tclEnv.c9
-rw-r--r--generic/tclIOUtil.c9
-rw-r--r--generic/tclInt.decls4
-rw-r--r--generic/tclInt.h7
-rw-r--r--generic/tclIntDecls.h8
-rw-r--r--generic/tclInterp.c22
-rw-r--r--generic/tclStubInit.c3
-rw-r--r--generic/tclTomMathDecls.h16
-rw-r--r--generic/tclZipfs.c30
-rw-r--r--library/clock.tcl3
-rw-r--r--tests/expr.test6
-rw-r--r--tests/interp.test4
-rw-r--r--tests/reg.test4
-rw-r--r--unix/Makefile.in5
-rw-r--r--unix/tclUnixCompat.c3
-rw-r--r--unix/tclUnixFile.c4
-rw-r--r--unix/tclUnixPort.h2
-rw-r--r--unix/tclUnixTime.c16
-rw-r--r--win/Makefile.in9
-rw-r--r--win/tclWinFile.c2
-rw-r--r--win/tclWinInit.c8
-rw-r--r--win/tclWinTime.c8
27 files changed, 185 insertions, 91 deletions
diff --git a/.github/workflows/onefiledist.yml b/.github/workflows/onefiledist.yml
index 3715555..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
diff --git a/generic/regc_lex.c b/generic/regc_lex.c
index c750a26..57ba8d5 100644
--- a/generic/regc_lex.c
+++ b/generic/regc_lex.c
@@ -427,7 +427,7 @@ next(
if (INCON(L_BBND) && NEXT1('}')) {
v->now++;
INTOCON(L_BRE);
- RET('}');
+ RETV('}', 1);
} else {
FAILW(REG_BADBR);
}
diff --git a/generic/tcl.decls b/generic/tcl.decls
index eb84ec1..238e36e 100644
--- a/generic/tcl.decls
+++ b/generic/tcl.decls
@@ -2554,6 +2554,9 @@ export {
export {
void Tcl_InitSubsystems(void)
}
+export {
+ int TclZipfs_AppHook(int *argc, char ***argv)
+}
# Local Variables:
# mode: tcl
diff --git a/generic/tclBasic.c b/generic/tclBasic.c
index 5e6fc98..b90e12d 100644
--- a/generic/tclBasic.c
+++ b/generic/tclBasic.c
@@ -744,6 +744,10 @@ Tcl_CreateInterp(void)
Tcl_InitHashTable(&iPtr->packageTable, TCL_STRING_KEYS);
iPtr->packageUnknown = NULL;
+#ifdef _WIN32
+# define getenv(x) _wgetenv(L##x) /* On Windows, use _wgetenv below */
+#endif
+
/* TIP #268 */
#if (TCL_RELEASE_LEVEL == TCL_FINAL_RELEASE)
if (getenv("TCL_PKG_PREFER_LATEST") == NULL) {
@@ -7151,7 +7155,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 810aeb2..bcc5256 100644
--- a/generic/tclClock.c
+++ b/generic/tclClock.c
@@ -1650,19 +1650,37 @@ ClockGetenvObjCmd(
int objc,
Tcl_Obj *const objv[])
{
+#ifdef _WIN32
+ const WCHAR *varName;
+ const WCHAR *varValue;
+ Tcl_DString ds;
+#else
const char *varName;
const char *varValue;
+#endif
if (objc != 2) {
Tcl_WrongNumArgs(interp, 1, objv, "name");
return TCL_ERROR;
}
+#ifdef _WIN32
+ Tcl_DStringInit(&ds);
+ varName = Tcl_UtfToWCharDString(TclGetString(objv[1]), -1, &ds);
+ varValue = _wgetenv(varName);
+ if (varValue == NULL) {
+ Tcl_DStringFree(&ds);
+ } else {
+ Tcl_DStringSetLength(&ds, 0);
+ Tcl_WCharToUtfDString(varValue, -1, &ds);
+ Tcl_DStringResult(interp, &ds);
+ }
+#else
varName = TclGetString(objv[1]);
varValue = getenv(varName);
- if (varValue == NULL) {
- varValue = "";
+ if (varValue != NULL) {
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(varValue, -1));
}
- Tcl_SetObjResult(interp, Tcl_NewStringObj(varValue, -1));
+#endif
return TCL_OK;
}
@@ -1762,13 +1780,13 @@ ClockClicksObjCmd(
switch (index) {
case CLICKS_MILLIS:
Tcl_GetTime(&now);
- clicks = (Tcl_WideInt) now.sec * 1000 + now.usec / 1000;
+ clicks = (Tcl_WideInt)(unsigned long)now.sec * 1000 + now.usec / 1000;
break;
case CLICKS_NATIVE:
#ifdef TCL_WIDE_CLICKS
clicks = TclpGetWideClicks();
#else
- clicks = (Tcl_WideInt) TclpGetClicks();
+ clicks = (Tcl_WideInt)TclpGetClicks();
#endif
break;
case CLICKS_MICROS:
@@ -2021,26 +2039,52 @@ ClockSecondsObjCmd(
*----------------------------------------------------------------------
*/
+#ifdef _WIN32
+#define getenv(x) _wgetenv(L##x)
+#else
+#define WCHAR char
+#define wcslen strlen
+#define wcscmp strcmp
+#define wcscpy strcpy
+#endif
+
static void
TzsetIfNecessary(void)
{
- static char* tzWas = (char *)INT2PTR(-1); /* Previous value of TZ, protected by
- * clockMutex. */
- const char *tzIsNow; /* Current value of TZ */
+ static WCHAR* tzWas = (WCHAR *)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 WCHAR *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)
- || strcmp(tzIsNow, tzWas) != 0)) {
+ if (tzIsNow != NULL && (tzWas == NULL || tzWas == (WCHAR *)INT2PTR(-1)
+ || wcscmp(tzIsNow, tzWas) != 0)) {
tzset();
- if (tzWas != NULL && tzWas != INT2PTR(-1)) {
+ if (tzWas != NULL && tzWas != (WCHAR *)INT2PTR(-1)) {
Tcl_Free(tzWas);
}
- tzWas = (char *)Tcl_Alloc(strlen(tzIsNow) + 1);
- strcpy(tzWas, tzIsNow);
+ tzWas = (WCHAR *)Tcl_Alloc(sizeof(WCHAR) * (wcslen(tzIsNow) + 1));
+ wcscpy(tzWas, tzIsNow);
} else if (tzIsNow == NULL && tzWas != NULL) {
tzset();
- if (tzWas != INT2PTR(-1)) Tcl_Free(tzWas);
+ if (tzWas != (WCHAR *)INT2PTR(-1)) Tcl_Free(tzWas);
tzWas = NULL;
}
Tcl_MutexUnlock(&clockMutex);
diff --git a/generic/tclEnv.c b/generic/tclEnv.c
index 76e45bb..7728439 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 {
size_t 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;
@@ -623,6 +629,7 @@ EnvTraceProc(
if (flags & TCL_TRACE_ARRAY) {
TclSetupEnv(interp);
+ TclEnvEpoch++;
return NULL;
}
@@ -643,6 +650,7 @@ EnvTraceProc(
value = Tcl_GetVar2(interp, "env", name2, TCL_GLOBAL_ONLY);
TclSetEnv(name2, value);
+ TclEnvEpoch++;
}
/*
@@ -666,6 +674,7 @@ EnvTraceProc(
if (flags & TCL_TRACE_UNSETS) {
TclUnsetEnv(name2);
+ TclEnvEpoch++;
}
return NULL;
}
diff --git a/generic/tclIOUtil.c b/generic/tclIOUtil.c
index 36d8dbc..df94367 100644
--- a/generic/tclIOUtil.c
+++ b/generic/tclIOUtil.c
@@ -3078,6 +3078,13 @@ Tcl_FSLoadFile(
*
*/
+#ifdef _WIN32
+#define getenv(x) _wgetenv(L##x)
+#define atoi(x) _wtoi(x)
+#else
+#define WCHAR char
+#endif
+
static int
skipUnlink(
Tcl_Obj *shlibFile)
@@ -3099,7 +3106,7 @@ skipUnlink(
(void)shlibFile;
return 1;
#else
- char *skipstr = getenv("TCL_TEMPLOAD_NO_UNLINK");
+ WCHAR *skipstr = getenv("TCL_TEMPLOAD_NO_UNLINK");
if (skipstr && (skipstr[0] != '\0')) {
return atoi(skipstr);
diff --git a/generic/tclInt.decls b/generic/tclInt.decls
index 6977c5a..69156b1 100644
--- a/generic/tclInt.decls
+++ b/generic/tclInt.decls
@@ -151,10 +151,10 @@ declare 74 {
void TclpFree(void *ptr)
}
declare 75 {
- Tcl_WideUInt TclpGetClicks(void)
+ unsigned long long TclpGetClicks(void)
}
declare 76 {
- Tcl_WideUInt TclpGetSeconds(void)
+ unsigned long long TclpGetSeconds(void)
}
declare 81 {
void *TclpRealloc(void *ptr, size_t size)
diff --git a/generic/tclInt.h b/generic/tclInt.h
index 1433743..7efd5d3 100644
--- a/generic/tclInt.h
+++ b/generic/tclInt.h
@@ -5093,6 +5093,13 @@ typedef struct NRE_callback {
#define Tcl_Free TclpFree
#endif
+/*
+ * Other externals.
+ */
+
+MODULE_SCOPE size_t TclEnvEpoch; /* Epoch of the tcl environment
+ * (if changed with tcl-env). */
+
#endif /* _TCLINT */
/*
diff --git a/generic/tclIntDecls.h b/generic/tclIntDecls.h
index 8b44ba5..aad437a 100644
--- a/generic/tclIntDecls.h
+++ b/generic/tclIntDecls.h
@@ -186,9 +186,9 @@ EXTERN void * TclpAlloc(size_t size);
/* 74 */
EXTERN void TclpFree(void *ptr);
/* 75 */
-EXTERN Tcl_WideUInt TclpGetClicks(void);
+EXTERN unsigned long long TclpGetClicks(void);
/* 76 */
-EXTERN Tcl_WideUInt TclpGetSeconds(void);
+EXTERN unsigned long long TclpGetSeconds(void);
/* Slot 77 is reserved */
/* Slot 78 is reserved */
/* Slot 79 is reserved */
@@ -660,8 +660,8 @@ typedef struct TclIntStubs {
void (*reserved72)(void);
void (*reserved73)(void);
void (*tclpFree) (void *ptr); /* 74 */
- Tcl_WideUInt (*tclpGetClicks) (void); /* 75 */
- Tcl_WideUInt (*tclpGetSeconds) (void); /* 76 */
+ unsigned long long (*tclpGetClicks) (void); /* 75 */
+ unsigned long long (*tclpGetSeconds) (void); /* 76 */
void (*reserved77)(void);
void (*reserved78)(void);
void (*reserved79)(void);
diff --git a/generic/tclInterp.c b/generic/tclInterp.c
index c9111d2..e1979e0 100644
--- a/generic/tclInterp.c
+++ b/generic/tclInterp.c
@@ -4796,7 +4796,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) {
@@ -4828,17 +4828,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];
@@ -4846,17 +4846,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/tclStubInit.c b/generic/tclStubInit.c
index 0aaef47..3e0b743 100644
--- a/generic/tclStubInit.c
+++ b/generic/tclStubInit.c
@@ -114,7 +114,6 @@ static void uniCodePanic() {
#define TclBN_mp_neg mp_neg
#define TclBN_mp_or mp_or
#define TclBN_mp_radix_size mp_radix_size
-#define TclBN_mp_reverse mp_reverse
#define TclBN_mp_read_radix mp_read_radix
#define TclBN_mp_rshd mp_rshd
#define TclBN_mp_set_i64 mp_set_i64
@@ -132,7 +131,7 @@ static void uniCodePanic() {
#define TclBN_mp_xor mp_xor
#define TclBN_mp_zero mp_zero
#define TclBN_s_mp_add s_mp_add
-#define TclBN_s_mp_balance_mul mp_balance_mul
+#define TclBN_mp_balance_mul s_mp_balance_mul
#define TclBN_mp_karatsuba_mul s_mp_karatsuba_mul
#define TclBN_mp_karatsuba_sqr s_mp_karatsuba_sqr
#define TclBN_s_mp_mul_digs s_mp_mul_digs
diff --git a/generic/tclTomMathDecls.h b/generic/tclTomMathDecls.h
index 4e259c7..a01446b 100644
--- a/generic/tclTomMathDecls.h
+++ b/generic/tclTomMathDecls.h
@@ -65,6 +65,22 @@ extern "C" {
#endif
MODULE_SCOPE mp_err TclBN_mp_sqr(const mp_int *a, mp_int *b);
MODULE_SCOPE mp_err TclBN_mp_div_3(const mp_int *a, mp_int *q, mp_digit *r);
+MODULE_SCOPE mp_err TclBN_mp_balance_mul(const mp_int *a, const mp_int *b, mp_int *c);
+MODULE_SCOPE mp_err TclBN_mp_karatsuba_mul(const mp_int *a, const mp_int *b, mp_int *c);
+MODULE_SCOPE mp_err TclBN_mp_karatsuba_sqr(const mp_int *a, mp_int *b);
+MODULE_SCOPE mp_err TclBN_mp_toom_mul(const mp_int *a, const mp_int *b, mp_int *c);
+MODULE_SCOPE mp_err TclBN_mp_toom_sqr(const mp_int *a, mp_int *b);
+MODULE_SCOPE mp_err TclBN_s_mp_add(const mp_int *a, const mp_int *b, mp_int *c);
+MODULE_SCOPE mp_err TclBN_s_mp_mul_digs(const mp_int *a, const mp_int *b, mp_int *c, int digs);
+MODULE_SCOPE mp_err TclBN_s_mp_mul_digs_fast(const mp_int *a, const mp_int *b, mp_int *c, int digs);
+MODULE_SCOPE void TclBN_s_mp_reverse(unsigned char *s, size_t len);
+MODULE_SCOPE mp_err TclBN_s_mp_sqr(const mp_int *a, mp_int *b);
+MODULE_SCOPE mp_err TclBN_s_mp_sqr_fast(const mp_int *a, mp_int *b);
+MODULE_SCOPE mp_err TclBN_s_mp_sub(const mp_int *a, const mp_int *b, mp_int *c);
+MODULE_SCOPE const char *const TclBN_mp_s_rmap;
+MODULE_SCOPE const uint8_t TclBN_mp_s_rmap_reverse[];
+MODULE_SCOPE const size_t TclBN_mp_s_rmap_reverse_sz;
+MODULE_SCOPE mp_err TclBN_mp_set_int(mp_int *a, unsigned long b);
#ifdef __cplusplus
}
#endif
diff --git a/generic/tclZipfs.c b/generic/tclZipfs.c
index de03c28..61dc02e 100644
--- a/generic/tclZipfs.c
+++ b/generic/tclZipfs.c
@@ -2,7 +2,7 @@
* tclZipfs.c --
*
* Implementation of the ZIP filesystem used in TIP 430
- * Adapted from the implentation for AndroWish.
+ * Adapted from the implementation for AndroWish.
*
* Copyright © 2016-2017 Sean Woods <yoda@etoyoc.com>
* Copyright © 2013-2015 Christian Werner <chw@ch-werner.de>
@@ -3090,16 +3090,13 @@ ZipFSListObjCmd(
*-------------------------------------------------------------------------
*/
-#ifdef _WIN32
-#define LIBRARY_SIZE 64
-#endif /* _WIN32 */
-
Tcl_Obj *
TclZipfs_TclLibrary(void)
{
Tcl_Obj *vfsInitScript;
int found;
-#if defined(_WIN32) && !defined(STATIC_BUILD)
+#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(STATIC_BUILD)
+# define LIBRARY_SIZE 64
HMODULE hModule;
WCHAR wName[MAX_PATH + LIBRARY_SIZE];
char dllName[(MAX_PATH + LIBRARY_SIZE) * 3];
@@ -3134,27 +3131,22 @@ TclZipfs_TclLibrary(void)
*/
#if !defined(STATIC_BUILD)
-#if defined(_WIN32)
+#if defined(_WIN32) || defined(__CYGWIN__)
hModule = (HMODULE)TclWinGetTclInstance();
GetModuleFileNameW(hModule, wName, MAX_PATH);
+#ifdef __CYGWIN__
+ cygwin_conv_path(3, wName, dllName, sizeof(dllName));
+#else
WideCharToMultiByte(CP_UTF8, 0, wName, -1, dllName, sizeof(dllName), NULL, NULL);
+#endif
if (ZipfsAppHookFindTclInit(dllName) == TCL_OK) {
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) {
+ if (ZipfsAppHookFindTclInit(CFG_RUNTIME_LIBDIR "/" CFG_RUNTIME_DLLFILE) == TCL_OK) {
return Tcl_NewStringObj(zipfs_literal_tcl_library, -1);
}
-# endif
#endif /* _WIN32 */
#endif /* !defined(STATIC_BUILD) */
@@ -4796,14 +4788,14 @@ TclZipfs_AppHook(
char ***argvPtr) /* Pointer to argv */
#endif /* _WIN32 */
{
- char *archive;
+ const char *archive;
#ifdef _WIN32
Tcl_FindExecutable(NULL);
#else
Tcl_FindExecutable((*argvPtr)[0]);
#endif
- archive = (char *) Tcl_GetNameOfExecutable();
+ archive = Tcl_GetNameOfExecutable();
TclZipfs_Init(NULL);
/*
diff --git a/library/clock.tcl b/library/clock.tcl
index 150ae3c..136ded2 100644
--- a/library/clock.tcl
+++ b/library/clock.tcl
@@ -2988,8 +2988,7 @@ proc ::tcl::clock::GetSystemTimeZone {} {
set timezone $result
} elseif {[set result [getenv TZ]] ne {}} {
set timezone $result
- }
- if {![info exists timezone]} {
+ } else {
# Cache the time zone only if it was detected by one of the
# expensive methods.
if { [info exists CachedSystemTimeZone] } {
diff --git a/tests/expr.test b/tests/expr.test
index a33d2b8..982cd43 100644
--- a/tests/expr.test
+++ b/tests/expr.test
@@ -6698,6 +6698,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/tests/reg.test b/tests/reg.test
index 3c9020d..5ebc2f9 100644
--- a/tests/reg.test
+++ b/tests/reg.test
@@ -1221,6 +1221,10 @@ test reg-33.29 {} {
test reg-33.30 {Bug 1080042} {
regexp {(\Y)+} foo
} 1
+test reg-33.31 {Bug 7c64aa5e1a} {
+ regexp -inline {(?b).\{1,10\}} {abcdef}
+} abcdef
+
# cleanup
::tcltest::cleanupTests
diff --git a/unix/Makefile.in b/unix/Makefile.in
index 7809acc..54fcf64 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,6 @@ 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)\"" \
-I$(ZLIB_DIR) -I$(ZLIB_DIR)/contrib/minizip \
$(GENERIC_DIR)/tclZipfs.c
@@ -2220,7 +2219,7 @@ ZIPNAME = tcl${MAJOR_VERSION}${MINOR_VERSION}${PATCH_LEVEL}-src.zip
DISTDIR = $(DISTROOT)/$(DISTNAME)
DIST_INSTALL_DATA = CPPROG='cp -p' $(INSTALL) -m 644
DIST_INSTALL_SCRIPT = CPPROG='cp -p' $(INSTALL) -m 755
-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 ef468f6..603285d 100644
--- a/unix/tclUnixCompat.c
+++ b/unix/tclUnixCompat.c
@@ -1007,6 +1007,9 @@ TclWinCPUID(
: "a"(index));
#endif
status = TCL_OK;
+#else
+ (void)index;
+ (void)regsPtr;
#endif
return status;
}
diff --git a/unix/tclUnixFile.c b/unix/tclUnixFile.c
index 3c8a318..05876a8 100644
--- a/unix/tclUnixFile.c
+++ b/unix/tclUnixFile.c
@@ -44,8 +44,8 @@ TclpFindExecutable(
wchar_t buf[PATH_MAX];
char name[PATH_MAX * 3 + 1];
- GetModuleFileNameW(NULL, buf, PATH_MAX);
- cygwin_conv_path(3, buf, name, PATH_MAX);
+ GetModuleFileNameW(NULL, buf, sizeof(buf)/sizeof(wchar_t));
+ cygwin_conv_path(3, buf, name, sizeof(name));
length = strlen(name);
if ((length > 4) && !strcasecmp(name + length - 4, ".exe")) {
/* Strip '.exe' part. */
diff --git a/unix/tclUnixPort.h b/unix/tclUnixPort.h
index cefe603..4027f1f 100644
--- a/unix/tclUnixPort.h
+++ b/unix/tclUnixPort.h
@@ -92,6 +92,8 @@ extern "C" {
/* Make some symbols available without including <windows.h> */
# define CP_UTF8 65001
# define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS 0x00000004
+# define HMODULE void *
+# define MAX_PATH 260
# define SOCKET unsigned int
# define WSAEWOULDBLOCK 10035
typedef unsigned short WCHAR;
diff --git a/unix/tclUnixTime.c b/unix/tclUnixTime.c
index dc48a32..990503d 100644
--- a/unix/tclUnixTime.c
+++ b/unix/tclUnixTime.c
@@ -49,10 +49,10 @@ void *tclTimeClientData = NULL;
*----------------------------------------------------------------------
*/
-Tcl_WideUInt
+unsigned long long
TclpGetSeconds(void)
{
- return time(NULL);
+ return (unsigned long long)time(NULL);
}
/*
@@ -78,7 +78,7 @@ TclpGetMicroseconds(void)
Tcl_Time time;
tclGetTimeProcPtr(&time, tclTimeClientData);
- return ((long long)time.sec)*1000000 + time.usec;
+ return ((long long)(unsigned long)time.sec)*1000000 + time.usec;
}
/*
@@ -100,30 +100,30 @@ TclpGetMicroseconds(void)
*----------------------------------------------------------------------
*/
-Tcl_WideUInt
+unsigned long long
TclpGetClicks(void)
{
- Tcl_WideUInt now;
+ unsigned long long now;
#ifdef NO_GETTOD
if (tclGetTimeProcPtr != NativeGetTime) {
Tcl_Time time;
tclGetTimeProcPtr(&time, tclTimeClientData);
- now = (Tcl_WideUInt)time.sec*1000000 + time.usec;
+ now = (unsigned long long)(unsigned long)time.sec*1000000 + time.usec;
} else {
/*
* A semi-NativeGetTime, specialized to clicks.
*/
struct tms dummy;
- now = (Tcl_WideUInt) times(&dummy);
+ now = (unsigned long long)times(&dummy);
}
#else
Tcl_Time time;
tclGetTimeProcPtr(&time, tclTimeClientData);
- now = (Tcl_WideUInt)time.sec*1000000 + time.usec;
+ now = (unsigned long long)time.sec*1000000 + time.usec;
#endif
return now;
diff --git a/win/Makefile.in b/win/Makefile.in
index a3595e3..1ace421 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; \
diff --git a/win/tclWinFile.c b/win/tclWinFile.c
index f954516..676ae38 100644
--- a/win/tclWinFile.c
+++ b/win/tclWinFile.c
@@ -866,7 +866,7 @@ TclpFindExecutable(
char name[MAX_PATH * 3];
(void)argv0;
- GetModuleFileNameW(NULL, wName, MAX_PATH);
+ GetModuleFileNameW(NULL, wName, sizeof(wName)/sizeof(WCHAR));
WideCharToMultiByte(CP_UTF8, 0, wName, -1, name, sizeof(name), NULL, NULL);
TclWinNoBackslash(name);
TclSetObjNameOfExecutable(Tcl_NewStringObj(name, -1), NULL);
diff --git a/win/tclWinInit.c b/win/tclWinInit.c
index 7205498..5817377 100644
--- a/win/tclWinInit.c
+++ b/win/tclWinInit.c
@@ -334,8 +334,8 @@ InitializeDefaultLibraryDir(
char name[(MAX_PATH + LIBRARY_SIZE) * 3];
char *end, *p;
- GetModuleFileNameW(hModule, wName, MAX_PATH);
- WideCharToMultiByte(CP_UTF8, 0, wName, -1, name, MAX_PATH * 3, NULL, NULL);
+ GetModuleFileNameW(hModule, wName, sizeof(wName)/sizeof(WCHAR));
+ WideCharToMultiByte(CP_UTF8, 0, wName, -1, name, sizeof(name), NULL, NULL);
end = strrchr(name, '\\');
*end = '\0';
@@ -382,8 +382,8 @@ InitializeSourceLibraryDir(
char name[(MAX_PATH + LIBRARY_SIZE) * 3];
char *end, *p;
- GetModuleFileNameW(hModule, wName, MAX_PATH);
- WideCharToMultiByte(CP_UTF8, 0, wName, -1, name, MAX_PATH * 3, NULL, NULL);
+ GetModuleFileNameW(hModule, wName, sizeof(wName)/sizeof(WCHAR));
+ WideCharToMultiByte(CP_UTF8, 0, wName, -1, name, sizeof(name), NULL, NULL);
end = strrchr(name, '\\');
*end = '\0';
diff --git a/win/tclWinTime.c b/win/tclWinTime.c
index 3c52451..0bd5b7e 100644
--- a/win/tclWinTime.c
+++ b/win/tclWinTime.c
@@ -144,7 +144,7 @@ ClientData tclTimeClientData = NULL;
*----------------------------------------------------------------------
*/
-Tcl_WideUInt
+unsigned long long
TclpGetSeconds(void)
{
long long usecSincePosixEpoch;
@@ -158,7 +158,7 @@ TclpGetSeconds(void)
Tcl_Time t;
tclGetTimeProcPtr(&t, tclTimeClientData); /* Tcl_GetTime inlined. */
- return t.sec;
+ return (unsigned long long)(unsigned long)t.sec;
}
}
@@ -181,7 +181,7 @@ TclpGetSeconds(void)
*----------------------------------------------------------------------
*/
-Tcl_WideUInt
+unsigned long long
TclpGetClicks(void)
{
long long usecSincePosixEpoch;
@@ -200,7 +200,7 @@ TclpGetClicks(void)
Tcl_Time now; /* Current Tcl time */
tclGetTimeProcPtr(&now, tclTimeClientData); /* Tcl_GetTime inlined */
- return (Tcl_WideUInt)(now.sec * 1000000) + now.usec;
+ return ((unsigned long long)(unsigned long)now.sec * 1000000ULL) + now.usec;
}
}