summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2019-05-17 14:22:50 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2019-05-17 14:22:50 (GMT)
commitf51c5464dcfb28580b92ba3f16a3d22ec36a8005 (patch)
tree12a330bf0c46f607123ad46d457b54910cde1174
parent3a37a573a27026dabb2ec4f9dc001787542914d2 (diff)
parenta68f7032b3a1880b9edd85bcf98d5a38e7705067 (diff)
downloadtcl-f51c5464dcfb28580b92ba3f16a3d22ec36a8005.zip
tcl-f51c5464dcfb28580b92ba3f16a3d22ec36a8005.tar.gz
tcl-f51c5464dcfb28580b92ba3f16a3d22ec36a8005.tar.bz2
Merge 8.7
-rw-r--r--generic/tcl.decls22
-rw-r--r--generic/tclCmdMZ.c47
-rw-r--r--generic/tclDecls.h65
-rw-r--r--generic/tclStrToD.c30
-rw-r--r--generic/tclStringObj.c10
-rw-r--r--generic/tclStubInit.c21
-rw-r--r--generic/tclTomMath.h78
-rw-r--r--generic/tclTomMathDecls.h7
-rw-r--r--tests/cmdMZ.test14
-rw-r--r--unix/Makefile.in58
10 files changed, 214 insertions, 138 deletions
diff --git a/generic/tcl.decls b/generic/tcl.decls
index 08b5016..2c1e801 100644
--- a/generic/tcl.decls
+++ b/generic/tcl.decls
@@ -2386,43 +2386,43 @@ declare 644 {
}
# TIP #542
-declare 645 {
- Tcl_Obj *Tcl_NewUnicodeObj(const int *unicode, int numChars)
-}
declare 646 {
void Tcl_SetUnicodeObj(Tcl_Obj *objPtr, const int *unicode,
int numChars)
}
declare 647 {
- int *Tcl_GetUnicodeFromObj(Tcl_Obj *objPtr, int *lengthPtr)
+ Tcl_Obj *Tcl_NewUnicodeObj(const int *unicode, int numChars)
}
declare 648 {
+ int *Tcl_GetUnicodeFromObj(Tcl_Obj *objPtr, int *lengthPtr)
+}
+declare 649 {
void Tcl_AppendUnicodeToObj(Tcl_Obj *objPtr, const int *unicode,
int length)
}
-declare 649 {
+declare 650 {
int Tcl_UtfToUniChar(const char *src, int *chPtr)
}
-declare 650 {
+declare 651 {
char *Tcl_UniCharToUtfDString(const int *uniStr,
int uniLength, Tcl_DString *dsPtr)
}
-declare 651 {
+declare 652 {
int *Tcl_UtfToUniCharDString(const char *src,
int length, Tcl_DString *dsPtr)
}
-declare 652 {
+declare 653 {
int Tcl_UniCharLen(const int *uniStr)
}
-declare 653 {
+declare 654 {
int Tcl_UniCharNcmp(const int *ucs, const int *uct,
unsigned long numChars)
}
-declare 654 {
+declare 655 {
int Tcl_UniCharNcasecmp(const int *ucs, const int *uct,
unsigned long numChars)
}
-declare 655 {
+declare 656 {
int Tcl_UniCharCaseMatch(const int *uniStr,
const int *uniPattern, int nocase)
}
diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c
index 52e3f36..15ea989 100644
--- a/generic/tclCmdMZ.c
+++ b/generic/tclCmdMZ.c
@@ -4188,6 +4188,7 @@ Tcl_TimeRateObjCmd(
};
NRE_callback *rootPtr;
ByteCode *codePtr = NULL;
+ int codeOptimized = 0;
for (i = 1; i < objc - 1; i++) {
int index;
@@ -4372,6 +4373,15 @@ Tcl_TimeRateObjCmd(
}
codePtr = TclCompileObj(interp, objPtr, NULL, 0);
TclPreserveByteCode(codePtr);
+ /*
+ * Replace last compiled done instruction with continue: it's a part of
+ * iteration, this way evaluation will be more similar to a cycle (also
+ * avoids extra overhead to set result to interp, etc.)
+ */
+ if (codePtr->codeStart[codePtr->numCodeBytes-1] == INST_DONE) {
+ codePtr->codeStart[codePtr->numCodeBytes-1] = INST_CONTINUE;
+ codeOptimized = 1;
+ }
}
/*
@@ -4418,23 +4428,25 @@ Tcl_TimeRateObjCmd(
} else { /* eval */
result = TclEvalObjEx(interp, objPtr, 0, NULL, 0);
}
- if (result != TCL_OK) {
- /*
- * Allow break from measurement cycle (used for conditional
- * stop).
- */
+ /*
+ * Allow break and continue from measurement cycle (used for
+ * conditional stop and flow control of iterations).
+ */
- if (result != TCL_BREAK) {
+ switch (result) {
+ case TCL_OK:
+ break;
+ case TCL_BREAK:
+ /*
+ * Force stop immediately.
+ */
+ threshold = 1;
+ maxcnt = 0;
+ case TCL_CONTINUE:
+ result = TCL_OK;
+ break;
+ default:
goto done;
- }
-
- /*
- * Force stop immediately.
- */
-
- threshold = 1;
- maxcnt = 0;
- result = TCL_OK;
}
/*
@@ -4660,6 +4672,11 @@ Tcl_TimeRateObjCmd(
done:
if (codePtr != NULL) {
+ if ( codeOptimized
+ && codePtr->codeStart[codePtr->numCodeBytes-1] == INST_CONTINUE
+ ) {
+ codePtr->codeStart[codePtr->numCodeBytes-1] = INST_DONE;
+ }
TclReleaseByteCode(codePtr);
}
return result;
diff --git a/generic/tclDecls.h b/generic/tclDecls.h
index 1d35635..65b7b0a 100644
--- a/generic/tclDecls.h
+++ b/generic/tclDecls.h
@@ -1901,34 +1901,35 @@ EXTERN int Tcl_IsShared(Tcl_Obj *objPtr);
EXTERN int Tcl_LinkArray(Tcl_Interp *interp,
const char *varName, void *addr, int type,
int size);
-/* 645 */
-EXTERN Tcl_Obj * Tcl_NewUnicodeObj(const int *unicode, int numChars);
+/* Slot 645 is reserved */
/* 646 */
EXTERN void Tcl_SetUnicodeObj(Tcl_Obj *objPtr,
const int *unicode, int numChars);
/* 647 */
+EXTERN Tcl_Obj * Tcl_NewUnicodeObj(const int *unicode, int numChars);
+/* 648 */
EXTERN int * Tcl_GetUnicodeFromObj(Tcl_Obj *objPtr,
int *lengthPtr);
-/* 648 */
+/* 649 */
EXTERN void Tcl_AppendUnicodeToObj(Tcl_Obj *objPtr,
const int *unicode, int length);
-/* 649 */
-EXTERN int Tcl_UtfToUniChar(const char *src, int *chPtr);
/* 650 */
+EXTERN int Tcl_UtfToUniChar(const char *src, int *chPtr);
+/* 651 */
EXTERN char * Tcl_UniCharToUtfDString(const int *uniStr,
int uniLength, Tcl_DString *dsPtr);
-/* 651 */
+/* 652 */
EXTERN int * Tcl_UtfToUniCharDString(const char *src, int length,
Tcl_DString *dsPtr);
-/* 652 */
-EXTERN int Tcl_UniCharLen(const int *uniStr);
/* 653 */
+EXTERN int Tcl_UniCharLen(const int *uniStr);
+/* 654 */
EXTERN int Tcl_UniCharNcmp(const int *ucs, const int *uct,
unsigned long numChars);
-/* 654 */
+/* 655 */
EXTERN int Tcl_UniCharNcasecmp(const int *ucs, const int *uct,
unsigned long numChars);
-/* 655 */
+/* 656 */
EXTERN int Tcl_UniCharCaseMatch(const int *uniStr,
const int *uniPattern, int nocase);
@@ -2611,17 +2612,18 @@ typedef struct TclStubs {
void (*tcl_DecrRefCount) (Tcl_Obj *objPtr); /* 642 */
int (*tcl_IsShared) (Tcl_Obj *objPtr); /* 643 */
int (*tcl_LinkArray) (Tcl_Interp *interp, const char *varName, void *addr, int type, int size); /* 644 */
- Tcl_Obj * (*tcl_NewUnicodeObj) (const int *unicode, int numChars); /* 645 */
+ void (*reserved645)(void);
void (*tcl_SetUnicodeObj) (Tcl_Obj *objPtr, const int *unicode, int numChars); /* 646 */
- int * (*tcl_GetUnicodeFromObj) (Tcl_Obj *objPtr, int *lengthPtr); /* 647 */
- void (*tcl_AppendUnicodeToObj) (Tcl_Obj *objPtr, const int *unicode, int length); /* 648 */
- int (*tcl_UtfToUniChar) (const char *src, int *chPtr); /* 649 */
- char * (*tcl_UniCharToUtfDString) (const int *uniStr, int uniLength, Tcl_DString *dsPtr); /* 650 */
- int * (*tcl_UtfToUniCharDString) (const char *src, int length, Tcl_DString *dsPtr); /* 651 */
- int (*tcl_UniCharLen) (const int *uniStr); /* 652 */
- int (*tcl_UniCharNcmp) (const int *ucs, const int *uct, unsigned long numChars); /* 653 */
- int (*tcl_UniCharNcasecmp) (const int *ucs, const int *uct, unsigned long numChars); /* 654 */
- int (*tcl_UniCharCaseMatch) (const int *uniStr, const int *uniPattern, int nocase); /* 655 */
+ Tcl_Obj * (*tcl_NewUnicodeObj) (const int *unicode, int numChars); /* 647 */
+ int * (*tcl_GetUnicodeFromObj) (Tcl_Obj *objPtr, int *lengthPtr); /* 648 */
+ void (*tcl_AppendUnicodeToObj) (Tcl_Obj *objPtr, const int *unicode, int length); /* 649 */
+ int (*tcl_UtfToUniChar) (const char *src, int *chPtr); /* 650 */
+ char * (*tcl_UniCharToUtfDString) (const int *uniStr, int uniLength, Tcl_DString *dsPtr); /* 651 */
+ int * (*tcl_UtfToUniCharDString) (const char *src, int length, Tcl_DString *dsPtr); /* 652 */
+ int (*tcl_UniCharLen) (const int *uniStr); /* 653 */
+ int (*tcl_UniCharNcmp) (const int *ucs, const int *uct, unsigned long numChars); /* 654 */
+ int (*tcl_UniCharNcasecmp) (const int *ucs, const int *uct, unsigned long numChars); /* 655 */
+ int (*tcl_UniCharCaseMatch) (const int *uniStr, const int *uniPattern, int nocase); /* 656 */
} TclStubs;
extern const TclStubs *tclStubsPtr;
@@ -3942,28 +3944,29 @@ extern const TclStubs *tclStubsPtr;
(tclStubsPtr->tcl_IsShared) /* 643 */
#define Tcl_LinkArray \
(tclStubsPtr->tcl_LinkArray) /* 644 */
-#define Tcl_NewUnicodeObj \
- (tclStubsPtr->tcl_NewUnicodeObj) /* 645 */
+/* Slot 645 is reserved */
#define Tcl_SetUnicodeObj \
(tclStubsPtr->tcl_SetUnicodeObj) /* 646 */
+#define Tcl_NewUnicodeObj \
+ (tclStubsPtr->tcl_NewUnicodeObj) /* 647 */
#define Tcl_GetUnicodeFromObj \
- (tclStubsPtr->tcl_GetUnicodeFromObj) /* 647 */
+ (tclStubsPtr->tcl_GetUnicodeFromObj) /* 648 */
#define Tcl_AppendUnicodeToObj \
- (tclStubsPtr->tcl_AppendUnicodeToObj) /* 648 */
+ (tclStubsPtr->tcl_AppendUnicodeToObj) /* 649 */
#define Tcl_UtfToUniChar \
- (tclStubsPtr->tcl_UtfToUniChar) /* 649 */
+ (tclStubsPtr->tcl_UtfToUniChar) /* 650 */
#define Tcl_UniCharToUtfDString \
- (tclStubsPtr->tcl_UniCharToUtfDString) /* 650 */
+ (tclStubsPtr->tcl_UniCharToUtfDString) /* 651 */
#define Tcl_UtfToUniCharDString \
- (tclStubsPtr->tcl_UtfToUniCharDString) /* 651 */
+ (tclStubsPtr->tcl_UtfToUniCharDString) /* 652 */
#define Tcl_UniCharLen \
- (tclStubsPtr->tcl_UniCharLen) /* 652 */
+ (tclStubsPtr->tcl_UniCharLen) /* 653 */
#define Tcl_UniCharNcmp \
- (tclStubsPtr->tcl_UniCharNcmp) /* 653 */
+ (tclStubsPtr->tcl_UniCharNcmp) /* 654 */
#define Tcl_UniCharNcasecmp \
- (tclStubsPtr->tcl_UniCharNcasecmp) /* 654 */
+ (tclStubsPtr->tcl_UniCharNcasecmp) /* 655 */
#define Tcl_UniCharCaseMatch \
- (tclStubsPtr->tcl_UniCharCaseMatch) /* 655 */
+ (tclStubsPtr->tcl_UniCharCaseMatch) /* 656 */
#endif /* defined(USE_TCL_STUBS) */
diff --git a/generic/tclStrToD.c b/generic/tclStrToD.c
index e7cb2c5..c9abb1a 100644
--- a/generic/tclStrToD.c
+++ b/generic/tclStrToD.c
@@ -1849,15 +1849,15 @@ RefineApproximation(
*/
msb = binExponent + M2; /* 1008 */
- nDigits = msb / DIGIT_BIT + 1;
+ nDigits = msb / MP_DIGIT_BIT + 1;
mp_init_size(&twoMv, nDigits);
- i = (msb % DIGIT_BIT + 1);
+ i = (msb % MP_DIGIT_BIT + 1);
twoMv.used = nDigits;
significand *= SafeLdExp(1.0, i);
while (--nDigits >= 0) {
twoMv.dp[nDigits] = (mp_digit) significand;
significand -= (mp_digit) significand;
- significand = SafeLdExp(significand, DIGIT_BIT);
+ significand = SafeLdExp(significand, MP_DIGIT_BIT);
}
for (i = 0; i <= 8; ++i) {
if (M5 & (1 << i)) {
@@ -3145,7 +3145,7 @@ ShouldBankerRoundUpPowD(
int isodd) /* 1 if the digit is odd, 0 if even. */
{
int i;
- static const mp_digit topbit = ((mp_digit)1) << (DIGIT_BIT - 1);
+ static const mp_digit topbit = ((mp_digit)1) << (MP_DIGIT_BIT - 1);
if (b->used < sd || (b->dp[sd-1] & topbit) == 0) {
return 0;
@@ -4214,8 +4214,8 @@ TclDoubleDigits(
* in the denominator' case.
*/
- if (s2 % DIGIT_BIT != 0) {
- int delta = DIGIT_BIT - (s2 % DIGIT_BIT);
+ if (s2 % MP_DIGIT_BIT != 0) {
+ int delta = MP_DIGIT_BIT - (s2 % MP_DIGIT_BIT);
b2 += delta;
m2plus += delta;
@@ -4223,7 +4223,7 @@ TclDoubleDigits(
s2 += delta;
}
return ShorteningBignumConversionPowD(&d, bw, b2, b5,
- m2plus, m2minus, m5, s2/DIGIT_BIT, k, len, ilim, ilim1,
+ m2plus, m2minus, m5, s2/MP_DIGIT_BIT, k, len, ilim, ilim1,
decpt, endPtr);
} else {
/*
@@ -4270,14 +4270,14 @@ TclDoubleDigits(
* in the denominator' case.
*/
- if (s2 % DIGIT_BIT != 0) {
- int delta = DIGIT_BIT - (s2 % DIGIT_BIT);
+ if (s2 % MP_DIGIT_BIT != 0) {
+ int delta = MP_DIGIT_BIT - (s2 % MP_DIGIT_BIT);
b2 += delta;
s2 += delta;
}
return StrictBignumConversionPowD(&d, bw, b2, b5,
- s2/DIGIT_BIT, k, len, ilim, ilim1, decpt, endPtr);
+ s2/MP_DIGIT_BIT, k, len, ilim, ilim1, decpt, endPtr);
} else {
/*
* There are no helpful special cases, but at least we know in
@@ -4402,7 +4402,7 @@ TclInitDoubleConversion(void)
+ 0.5 * log(10.)) / log(10.));
minDigits = (int) floor((DBL_MIN_EXP - DBL_MANT_DIG)
* log((double) FLT_RADIX) / log(10.));
- log10_DIGIT_MAX = (int) floor(DIGIT_BIT * log(2.) / log(10.));
+ log10_DIGIT_MAX = (int) floor(MP_DIGIT_BIT * log(2.) / log(10.));
/*
* Nokia 770's software-emulated floating point is "middle endian": the
@@ -4606,7 +4606,7 @@ TclBignumToDouble(
r = 0.0;
for (i=b.used-1 ; i>=0 ; --i) {
- r = ldexp(r, DIGIT_BIT) + b.dp[i];
+ r = ldexp(r, MP_DIGIT_BIT) + b.dp[i];
}
mp_clear(&b);
@@ -4675,7 +4675,7 @@ TclCeil(
mp_add_d(&b, 1, &b);
}
for (i=b.used-1 ; i>=0 ; --i) {
- r = ldexp(r, DIGIT_BIT) + b.dp[i];
+ r = ldexp(r, MP_DIGIT_BIT) + b.dp[i];
}
r = ldexp(r, bits - mantBits);
}
@@ -4725,7 +4725,7 @@ TclFloor(
mp_copy(a, &b);
}
for (i=b.used-1 ; i>=0 ; --i) {
- r = ldexp(r, DIGIT_BIT) + b.dp[i];
+ r = ldexp(r, MP_DIGIT_BIT) + b.dp[i];
}
r = ldexp(r, bits - mantBits);
}
@@ -4787,7 +4787,7 @@ BignumToBiasedFrExp(
r = 0.0;
for (i=b.used-1; i>=0; --i) {
- r = ldexp(r, DIGIT_BIT) + b.dp[i];
+ r = ldexp(r, MP_DIGIT_BIT) + b.dp[i];
}
mp_clear(&b);
diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c
index 587334f..d5edaf3 100644
--- a/generic/tclStringObj.c
+++ b/generic/tclStringObj.c
@@ -2270,11 +2270,11 @@ Tcl_AppendFormatToObj(
}
#endif
} else if (useBig && big.used) {
- int leftover = (big.used * DIGIT_BIT) % numBits;
- mp_digit mask = (~(mp_digit)0) << (DIGIT_BIT-leftover);
+ int leftover = (big.used * MP_DIGIT_BIT) % numBits;
+ mp_digit mask = (~(mp_digit)0) << (MP_DIGIT_BIT-leftover);
numDigits = 1 +
- (((Tcl_WideInt) big.used * DIGIT_BIT) / numBits);
+ (((Tcl_WideInt) big.used * MP_DIGIT_BIT) / numBits);
while ((mask & big.dp[big.used-1]) == 0) {
numDigits--;
mask >>= numBits;
@@ -2310,9 +2310,9 @@ Tcl_AppendFormatToObj(
if (useBig && big.used) {
if (index < big.used && (size_t) shift <
- CHAR_BIT*sizeof(Tcl_WideUInt) - DIGIT_BIT) {
+ CHAR_BIT*sizeof(Tcl_WideUInt) - MP_DIGIT_BIT) {
bits |= ((Tcl_WideUInt) big.dp[index++]) << shift;
- shift += DIGIT_BIT;
+ shift += MP_DIGIT_BIT;
}
shift -= numBits;
}
diff --git a/generic/tclStubInit.c b/generic/tclStubInit.c
index 5b8b692..e11c641 100644
--- a/generic/tclStubInit.c
+++ b/generic/tclStubInit.c
@@ -1683,17 +1683,18 @@ const TclStubs tclStubs = {
Tcl_DecrRefCount, /* 642 */
Tcl_IsShared, /* 643 */
Tcl_LinkArray, /* 644 */
- Tcl_NewUnicodeObj, /* 645 */
+ 0, /* 645 */
Tcl_SetUnicodeObj, /* 646 */
- Tcl_GetUnicodeFromObj, /* 647 */
- Tcl_AppendUnicodeToObj, /* 648 */
- Tcl_UtfToUniChar, /* 649 */
- Tcl_UniCharToUtfDString, /* 650 */
- Tcl_UtfToUniCharDString, /* 651 */
- Tcl_UniCharLen, /* 652 */
- Tcl_UniCharNcmp, /* 653 */
- Tcl_UniCharNcasecmp, /* 654 */
- Tcl_UniCharCaseMatch, /* 655 */
+ Tcl_NewUnicodeObj, /* 647 */
+ Tcl_GetUnicodeFromObj, /* 648 */
+ Tcl_AppendUnicodeToObj, /* 649 */
+ Tcl_UtfToUniChar, /* 650 */
+ Tcl_UniCharToUtfDString, /* 651 */
+ Tcl_UtfToUniCharDString, /* 652 */
+ Tcl_UniCharLen, /* 653 */
+ Tcl_UniCharNcmp, /* 654 */
+ Tcl_UniCharNcasecmp, /* 655 */
+ Tcl_UniCharCaseMatch, /* 656 */
};
/* !END!: Do not edit above this line. */
diff --git a/generic/tclTomMath.h b/generic/tclTomMath.h
index 26eef26..cc9f286 100644
--- a/generic/tclTomMath.h
+++ b/generic/tclTomMath.h
@@ -1,14 +1,6 @@
-/* LibTomMath, multiple-precision integer library -- Tom St Denis
- *
- * LibTomMath is a library that provides multiple-precision
- * integer arithmetic as well as number theoretic functionality.
- *
- * The library was designed directly after the MPI library by
- * Michael Fromberger but has been written from scratch with
- * additional optimizations in place.
- *
- * SPDX-License-Identifier: Unlicense
- */
+/* LibTomMath, multiple-precision integer library -- Tom St Denis */
+/* SPDX-License-Identifier: Unlicense */
+
#ifndef BN_H_
#define BN_H_
@@ -115,29 +107,30 @@ typedef unsigned long long mp_word;
#define MP_MASK ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1))
#define MP_DIGIT_MAX MP_MASK
-/* equalities */
+typedef int mp_sign;
+#define MP_ZPOS 0 /* positive integer */
+#define MP_NEG 1 /* negative */
+typedef int mp_ord;
#define MP_LT -1 /* less than */
#define MP_EQ 0 /* equal to */
#define MP_GT 1 /* greater than */
-
-#define MP_ZPOS 0 /* positive integer */
-#define MP_NEG 1 /* negative */
-
+typedef int mp_bool;
+#define MP_YES 1 /* yes response */
+#define MP_NO 0 /* no response */
+typedef int mp_err;
#define MP_OKAY 0 /* ok result */
+#define MP_ERR -1 /* unknown error */
#define MP_MEM -2 /* out of mem */
#define MP_VAL -3 /* invalid input */
#define MP_RANGE MP_VAL
#define MP_ITER -4 /* Max. iterations reached */
-#define MP_YES 1 /* yes response */
-#define MP_NO 0 /* no response */
-
/* Primality generation flags */
#define LTM_PRIME_BBS 0x0001 /* BBS style prime */
#define LTM_PRIME_SAFE 0x0002 /* Safe prime (p-1)/2 == prime */
#define LTM_PRIME_2MSB_ON 0x0008 /* force 2nd MSB to 1 */
-typedef int mp_err;
+/* tunable cutoffs */
/* define this to use lower memory usage routines (exptmods mostly) */
/* #define MP_LOW_MEM */
@@ -146,6 +139,8 @@ typedef int mp_err;
#ifndef MP_PREC
# ifndef MP_LOW_MEM
# define MP_PREC 32 /* default digits of precision */
+# elif defined(MP_8BIT)
+# define MP_PREC 16 /* default digits of precision */
# else
# define MP_PREC 8 /* default digits of precision */
# endif
@@ -154,6 +149,45 @@ typedef int mp_err;
/* size of comba arrays, should be at least 2 * 2**(BITS_PER_WORD - BITS_PER_DIGIT*2) */
#define MP_WARRAY (1u << (((sizeof(mp_word) * CHAR_BIT) - (2 * DIGIT_BIT)) + 1))
+/*
+ * MP_WUR - warn unused result
+ * ---------------------------
+ *
+ * The result of functions annotated with MP_WUR must be
+ * checked and cannot be ignored.
+ *
+ * Most functions in libtommath return an error code.
+ * This error code must be checked in order to prevent crashes or invalid
+ * results.
+ *
+ * If you still want to avoid the error checks for quick and dirty programs
+ * without robustness guarantees, you can `#define MP_WUR` before including
+ * tommath.h, disabling the warnings.
+ */
+#ifndef MP_WUR
+# if defined(__GNUC__) && __GNUC__ >= 4
+# define MP_WUR __attribute__((warn_unused_result))
+# else
+# define MP_WUR
+# endif
+#endif
+
+#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 301)
+# define MP_DEPRECATED(x) __attribute__((deprecated("replaced by " #x)))
+# define PRIVATE_MP_DEPRECATED_PRAGMA(s) _Pragma(#s)
+# define MP_DEPRECATED_PRAGMA(s) PRIVATE_MP_DEPRECATED_PRAGMA(GCC warning s)
+#elif defined(_MSC_VER) && _MSC_VER >= 1500
+# define MP_DEPRECATED(x) __declspec(deprecated("replaced by " #x))
+# define MP_DEPRECATED_PRAGMA(s) __pragma(message(s))
+#else
+# define MP_DEPRECATED
+# define MP_DEPRECATED_PRAGMA(s)
+#endif
+
+#define USED(m) ((m)->used)
+#define DIGIT(m,k) ((m)->dp[(k)])
+#define SIGN(m) ((m)->sign)
+
/* the infamous mp_int structure */
#ifndef MP_INT_DECLARED
#define MP_INT_DECLARED
@@ -168,10 +202,6 @@ struct mp_int {
typedef int ltm_prime_callback(unsigned char *dst, int len, void *dat);
-#define USED(m) ((m)->used)
-#define DIGIT(m, k) ((m)->dp[(k)])
-#define SIGN(m) ((m)->sign)
-
/* error code to char* string */
const char *mp_error_to_string(int code);
diff --git a/generic/tclTomMathDecls.h b/generic/tclTomMathDecls.h
index 165e3b7..c5ed4d5 100644
--- a/generic/tclTomMathDecls.h
+++ b/generic/tclTomMathDecls.h
@@ -45,8 +45,11 @@
/* Rename the global symbols in libtommath to avoid linkage conflicts */
#define bn_reverse TclBN_reverse
+#define s_mp_reverse TclBN_reverse
#define fast_s_mp_mul_digs TclBN_fast_s_mp_mul_digs
+#define s_mp_mul_digs_fast TclBN_fast_s_mp_mul_digs
#define fast_s_mp_sqr TclBN_fast_s_mp_sqr
+#define s_mp_sqr_fast TclBN_fast_s_mp_sqr
#define mp_add TclBN_mp_add
#define mp_add_d TclBN_mp_add_d
#define mp_and TclBN_mp_and
@@ -79,7 +82,9 @@
#define mp_init_set_int TclBN_mp_init_set_int
#define mp_init_size TclBN_mp_init_size
#define mp_karatsuba_mul TclBN_mp_karatsuba_mul
+#define s_mp_karatsuba_mul TclBN_mp_karatsuba_mul
#define mp_karatsuba_sqr TclBN_mp_karatsuba_sqr
+#define s_mp_karatsuba_sqr TclBN_mp_karatsuba_sqr
#define mp_lshd TclBN_mp_lshd
#define mp_mod TclBN_mp_mod
#define mp_mod_2d TclBN_mp_mod_2d
@@ -108,7 +113,9 @@
#define mp_to_unsigned_bin TclBN_mp_to_unsigned_bin
#define mp_to_unsigned_bin_n TclBN_mp_to_unsigned_bin_n
#define mp_toom_mul TclBN_mp_toom_mul
+#define s_mp_toom_mul TclBN_mp_toom_mul
#define mp_toom_sqr TclBN_mp_toom_sqr
+#define s_mp_toom_sqr TclBN_mp_toom_sqr
#define mp_toradix_n TclBN_mp_toradix_n
#define mp_unsigned_bin_size TclBN_mp_unsigned_bin_size
#define mp_xor TclBN_mp_xor
diff --git a/tests/cmdMZ.test b/tests/cmdMZ.test
index 2c2d51c..60cc621 100644
--- a/tests/cmdMZ.test
+++ b/tests/cmdMZ.test
@@ -403,6 +403,14 @@ test cmdMZ-6.8 {Tcl_TimeRateObjCmd: allow (conditional) break from timerate} {
[expr {[lindex $m1 4] > 1000}] \
[expr {[lindex $m1 6] < 10}]
} {1 1 1 1}
+test cmdMZ-6.8.1 {Tcl_TimeRateObjCmd: allow (conditional) continue in timerate} {
+ set m1 [timerate {continue; return -code error "unexpected"} 1000 10]
+ list \
+ [expr {[lindex $m1 0] < 1000}] \
+ [expr {[lindex $m1 2] == 10}] \
+ [expr {[lindex $m1 4] > 1000}] \
+ [expr {[lindex $m1 6] < 100}]
+} {1 1 1 1}
test cmdMZ-6.9 {Tcl_TimeRateObjCmd: max count of iterations} {
set m1 [timerate {} 1000 5]; # max-count wins
set m2 [timerate {_nrt_sleep 20} 1 5]; # max-time wins
@@ -416,6 +424,12 @@ test cmdMZ-6.10 {Tcl_TimeRateObjCmd: huge overhead cause 0us result} {
[expr {[lindex $m1 4] == 1000000}] \
[expr {[lindex $m1 6] <= 0.001}]
} {1 1 1 1}
+test cmdMZ-6.11 {Tcl_TimeRateObjCmd: done/continue optimization rollback} {
+ set m1 {set m2 ok}
+ if 1 $m1
+ timerate $m1 1000 10
+ if 1 $m1; # if rollback is missing throws an error: invoked "continue" outside of a loop
+} ok
test cmdMZ-try-1.0 {
diff --git a/unix/Makefile.in b/unix/Makefile.in
index 74bee41..2dd50b3 100644
--- a/unix/Makefile.in
+++ b/unix/Makefile.in
@@ -685,20 +685,20 @@ ${TCL_ZIP_FILE}: ${ZIP_INSTALL_OBJS}
@rm -rf ${TCL_VFS_ROOT}
@mkdir -p ${TCL_VFS_PATH}
@echo "creating ${TCL_VFS_PATH} (prepare compression)"
- @( \
- ln -s $(TOP_DIR)/library/* ${TCL_VFS_PATH}/ && \
- ln ${TCL_VFS_PATH}/manifest.txt ${TCL_VFS_PATH}/pkgIndex.tcl \
- ) || ( \
- cp -a $(TOP_DIR)/library/* ${TCL_VFS_PATH}; \
- cp -a ${TCL_VFS_PATH}/manifest.txt ${TCL_VFS_PATH}/pkgIndex.tcl; \
- )
+ @if \
+ ln -s $(TOP_DIR)/library/* ${TCL_VFS_PATH}/ && \
+ ln ${TCL_VFS_PATH}/manifest.txt ${TCL_VFS_PATH}/pkgIndex.tcl; \
+ then : ; else \
+ cp -a $(TOP_DIR)/library/* ${TCL_VFS_PATH}; \
+ cp -a ${TCL_VFS_PATH}/manifest.txt ${TCL_VFS_PATH}/pkgIndex.tcl; \
+ fi
@find ${TCL_VFS_ROOT} -type d -empty -delete
- (zip=`(realpath '${NATIVE_ZIP}' || readlink -m '${NATIVE_ZIP}') 2>/dev/null || \
- (echo '${NATIVE_ZIP}' | sed "s?^\./?$$(pwd)/?")`; \
- cd ${TCL_VFS_ROOT} && \
- $$zip ${ZIP_PROG_OPTIONS} ../${TCL_ZIP_FILE} ${ZIP_PROG_VFSSEARCH} >/dev/null && \
- echo "${TCL_ZIP_FILE} successful created with $$zip" && \
- cd ..)
+ @echo "creating ${TCL_ZIP_FILE} from ${TCL_VFS_PATH}"
+ @(zip=`(realpath '${NATIVE_ZIP}' || readlink -m '${NATIVE_ZIP}' || \
+ echo '${NATIVE_ZIP}' | sed "s?^\./?$$(pwd)/?") 2>/dev/null`; \
+ echo 'cd ${TCL_VFS_ROOT} &&' $$zip '${ZIP_PROG_OPTIONS} ../${TCL_ZIP_FILE} ${ZIP_PROG_VFSSEARCH}'; \
+ cd ${TCL_VFS_ROOT} && \
+ $$zip ${ZIP_PROG_OPTIONS} ../${TCL_ZIP_FILE} ${ZIP_PROG_VFSSEARCH} >/dev/null)
# The following target is configured by autoconf to generate either a shared
# library or non-shared library for Tcl.
@@ -706,9 +706,9 @@ ${LIB_FILE}: ${STUB_LIB_FILE} ${OBJS} ${TCL_ZIP_FILE}
rm -f $@
@MAKE_LIB@
@if test "${ZIPFS_BUILD}" = "1" ; then \
- cat ${TCL_ZIP_FILE} >> ${LIB_FILE}; \
- ${NATIVE_ZIP} -A ${LIB_FILE} \
- || echo 'ignore zip-error by adjust sfx process (not executable?)'; \
+ cat ${TCL_ZIP_FILE} >> ${LIB_FILE}; \
+ ${NATIVE_ZIP} -A ${LIB_FILE} \
+ || echo 'ignore zip-error by adjust sfx process (not executable?)'; \
fi
${STUB_LIB_FILE}: ${STUB_LIB_OBJS}
@@ -2088,8 +2088,9 @@ checkstubs: $(TCL_LIB_FILE)
checkdoc: $(TCL_LIB_FILE)
-@for i in `nm -p $(TCL_LIB_FILE) | awk '$$3 ~ /Tcl_/ { print $$3 }' \
- | grep -v 'Cmd$$' | sort -n` ; do \
+ | grep -Fv . | grep -v 'Cmd$$' | sort -n` ; do \
match=0; \
+ i=`echo $$i | sed 's/^_//'`; \
for j in $(TOP_DIR)/doc/*.3 ; do \
if [ `grep '\-' $$j | grep -c $$i` -gt 0 ] ; then \
match=1; \
@@ -2105,7 +2106,7 @@ checkdoc: $(TCL_LIB_FILE)
#
checkuchar:
- -egrep isalnum\|isalpha\|iscntrl\|isdigit\|islower\|isprint\|ispunct\|isspace\|isupper\|isxdigit\|toupper\|tolower $(SRCS) | grep -v UCHAR
+ -@egrep isalnum\|isalpha\|iscntrl\|isdigit\|islower\|isprint\|ispunct\|isspace\|isupper\|isxdigit\|toupper\|tolower $(SRCS) | grep -v UCHAR
#
# Target to make sure that only symbols with "Tcl" prefixes are exported.
@@ -2125,14 +2126,17 @@ checkexports: $(TCL_LIB_FILE)
# system.
#
+RPM_PLATFORMS = i386
rpm: all
-@rm -f THIS.TCL.SPEC
echo "%define _builddir `pwd`" > THIS.TCL.SPEC
echo "%define _rpmdir `pwd`/RPMS" >> THIS.TCL.SPEC
cat tcl.spec >> THIS.TCL.SPEC
- mkdir -p RPMS/i386
- rpmbuild -bb THIS.TCL.SPEC
- mv RPMS/i386/*.rpm .
+ for platform in $(RPM_PLATFORMS); do \
+ mkdir -p RPMS/$$platform && \
+ rpmbuild -bb THIS.TCL.SPEC && \
+ mv RPMS/$$platform/*.rpm .; \
+ done
-rm -rf RPMS THIS.TCL.SPEC
#
@@ -2155,7 +2159,8 @@ $(MAC_OSX_DIR)/configure: $(MAC_OSX_DIR)/configure.ac $(UNIX_DIR)/configure
$(UNIX_DIR)/tclConfig.h.in: $(MAC_OSX_DIR)/configure
cd $(MAC_OSX_DIR); autoheader; touch $@
-dist: $(UNIX_DIR)/configure $(UNIX_DIR)/tclConfig.h.in $(UNIX_DIR)/tcl.pc.in $(MAC_OSX_DIR)/configure genstubs dist-packages ${NATIVE_TCLSH}
+dist: $(UNIX_DIR)/configure $(UNIX_DIR)/tclConfig.h.in $(UNIX_DIR)/tcl.pc.in \
+ $(MAC_OSX_DIR)/configure genstubs dist-packages ${NATIVE_TCLSH}
rm -rf $(DISTDIR)
mkdir -p $(DISTDIR)/unix
cp -p $(UNIX_DIR)/*.[ch] $(DISTDIR)/unix
@@ -2181,7 +2186,7 @@ dist: $(UNIX_DIR)/configure $(UNIX_DIR)/tclConfig.h.in $(UNIX_DIR)/tcl.pc.in $(M
@mkdir $(DISTDIR)/library
cp -p $(TOP_DIR)/license.terms $(TOP_DIR)/library/*.tcl \
$(TOP_DIR)/library/tclIndex $(DISTDIR)/library
- for i in $(BUILTIN_PACKAGE_LIST) ; do \
+ @for i in $(BUILTIN_PACKAGE_LIST) ; do \
mkdir $(DISTDIR)/library/$$i;\
cp -p $(TOP_DIR)/library/$$i/*.tcl $(DISTDIR)/library/$$i; \
done
@@ -2190,8 +2195,7 @@ dist: $(UNIX_DIR)/configure $(UNIX_DIR)/tclConfig.h.in $(UNIX_DIR)/tcl.pc.in $(M
@mkdir $(DISTDIR)/library/msgs
cp -p $(TOP_DIR)/library/msgs/*.msg $(DISTDIR)/library/msgs
@echo cp -r $(TOP_DIR)/library/tzdata $(DISTDIR)/library/tzdata
- @( cd $(TOP_DIR); \
- find library/tzdata -name CVS -prune -o -type f -print ) \
+ @( cd $(TOP_DIR); find library/tzdata -type f -print ) \
| ( cd $(TOP_DIR) ; xargs tar cf - ) \
| ( cd $(DISTDIR) ; tar xfp - )
@mkdir $(DISTDIR)/doc
@@ -2201,8 +2205,8 @@ dist: $(UNIX_DIR)/configure $(UNIX_DIR)/tclConfig.h.in $(UNIX_DIR)/tcl.pc.in $(M
cp -p $(TOP_DIR)/license.terms $(COMPAT_DIR)/*.[ch] \
$(COMPAT_DIR)/README $(DISTDIR)/compat
@mkdir $(DISTDIR)/compat/zlib
- ( cd $(COMPAT_DIR)/zlib; \
- find . -name CVS -prune -o -type f -print ) \
+ @echo cp -r $(COMPAT_DIR)/zlib $(DISTDIR)/compat/zlib
+ @( cd $(COMPAT_DIR)/zlib; find . -type f -print ) \
| ( cd $(COMPAT_DIR)/zlib ; xargs tar cf - ) \
| ( cd $(DISTDIR)/compat/zlib ; tar xfp - )
@mkdir $(DISTDIR)/tests