Compare commits
170
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d9cf1f5ee1 | ||
|
|
f69b62fe3c | ||
|
|
8c066a970f | ||
|
|
a9dbadf46a | ||
|
|
02e79b9ec1 | ||
|
|
5aa514f49a | ||
|
|
2bc8d915a2 | ||
|
|
008c7038cb | ||
|
|
dfb2a3f2e2 | ||
|
|
e8aa220d08 | ||
|
|
8d3c0c2e81 | ||
|
|
3adfe07f74 | ||
|
|
7aae664d12 | ||
|
|
cdb1ef8aac | ||
|
|
e7e4c74b7f | ||
|
|
3d6c6683bb | ||
|
|
bf9e61ca6a | ||
|
|
db811061d4 | ||
|
|
63a316c43b | ||
|
|
3da8f74e75 | ||
|
|
3833c42f54 | ||
|
|
2bfb7b96c0 | ||
|
|
35141afcc9 | ||
|
|
6053836b97 | ||
|
|
e13460b1fb | ||
|
|
41512fe1fa | ||
|
|
4ef0c69aaa | ||
|
|
7660c04aff | ||
|
|
7ca470456b | ||
|
|
ab18c108f7 | ||
|
|
7ccdd3657b | ||
|
|
98dbefe2cc | ||
|
|
b748232291 | ||
|
|
d35a5023da | ||
|
|
c4b6cab579 | ||
|
|
cf8c1e7bdc | ||
|
|
6f860bc18d | ||
|
|
2bd794f7cc | ||
|
|
5b7e79f851 | ||
|
|
3b2cb79ab1 | ||
|
|
0cce018c67 | ||
|
|
f2115ca085 | ||
|
|
ac673f63d0 | ||
|
|
5001d7d18c | ||
|
|
a134b03eda | ||
|
|
d823d4a2d5 | ||
|
|
27696b490b | ||
|
|
b37c60fe43 | ||
|
|
d0af5aa92c | ||
|
|
d4eb48d90f | ||
|
|
9faead9d18 | ||
|
|
404eadfdaf | ||
|
|
722ba1aa44 | ||
|
|
4cead413c9 | ||
|
|
2501dbb8d0 | ||
|
|
0050652afb | ||
|
|
4704b442fb | ||
|
|
5b8d20e6de | ||
|
|
2151838b5b | ||
|
|
acb9c613f1 | ||
|
|
ee54cd02de | ||
|
|
ad4538af95 | ||
|
|
c2e7b1ce36 | ||
|
|
a8f05c5339 | ||
|
|
e26431e0f3 | ||
|
|
23a34a26fe | ||
|
|
3cd3541039 | ||
|
|
f846b3f965 | ||
|
|
a22b8736ec | ||
|
|
87a97e0609 | ||
|
|
f5bf1de995 | ||
|
|
6f9ac81ae9 | ||
|
|
c947326c4a | ||
|
|
9b1a5dc878 | ||
|
|
4bc50a0a12 | ||
|
|
26532df53f | ||
|
|
0b8d92332a | ||
|
|
0cf3369f9f | ||
|
|
8f28138f6e | ||
|
|
c0d0df8550 | ||
|
|
67a6300cc4 | ||
|
|
fd72878261 | ||
|
|
9df68a3879 | ||
|
|
bd8c790e2e | ||
|
|
5c3b0101a2 | ||
|
|
fed06f2292 | ||
|
|
2edc274601 | ||
|
|
f68e18d159 | ||
|
|
66a18f91c0 | ||
|
|
4c4629d5fd | ||
|
|
89796adf9c | ||
|
|
11b61660d2 | ||
|
|
d214692a28 | ||
|
|
eec270dc08 | ||
|
|
34d3a97939 | ||
|
|
1f93e78598 | ||
|
|
c3c52cf7b0 | ||
|
|
b11d2bb62d | ||
|
|
96d7deb99b | ||
|
|
e0a4741204 | ||
|
|
0ceae7a885 | ||
|
|
e19d125606 | ||
|
|
9b324cef64 | ||
|
|
68432b7ed1 | ||
|
|
f1f3820560 | ||
|
|
363cf0a6f1 | ||
|
|
508b6fc60d | ||
|
|
75f3cb9d07 | ||
|
|
31ec149e21 | ||
|
|
6076256c3f | ||
|
|
77e9a375ff | ||
|
|
25f7d3b86e | ||
|
|
464153fecd | ||
|
|
139a16f600 | ||
|
|
600487a9d6 | ||
|
|
a2962cc586 | ||
|
|
d6ae741f7f | ||
|
|
48e3873f19 | ||
|
|
57a42f683c | ||
|
|
b2e1bb03b1 | ||
|
|
d8785b8358 | ||
|
|
7de7029fa5 | ||
|
|
47620e4ba8 | ||
|
|
f290d19b27 | ||
|
|
1446838d71 | ||
|
|
8c8c1a6415 | ||
|
|
07f3d3e393 | ||
|
|
1e5db76cc1 | ||
|
|
85d1666247 | ||
|
|
bf0a1dc6c5 | ||
|
|
31e1e2a8c4 | ||
|
|
8f4ed81159 | ||
|
|
966906b7ae | ||
|
|
20e8eaedc8 | ||
|
|
d65776f03f | ||
|
|
7b6eaf23e9 | ||
|
|
bf33e5524b | ||
|
|
2ee0bbf7fb | ||
|
|
23c3438aee | ||
|
|
21124cf6ab | ||
|
|
1694cf05a6 | ||
|
|
8e39be1340 | ||
|
|
4110638cdd | ||
|
|
65bd912b77 | ||
|
|
dd879c794d | ||
|
|
e68b3d0183 | ||
|
|
1481e6f3da | ||
|
|
42c2792287 | ||
|
|
08826b79fe | ||
|
|
d5617720bb | ||
|
|
e95143affd | ||
|
|
a67b58390b | ||
|
|
ced0d271ff | ||
|
|
b6f5ea3c8f | ||
|
|
38e85a2dbe | ||
|
|
680d1a1513 | ||
|
|
f2718ded6d | ||
|
|
221b47806c | ||
|
|
286034431c | ||
|
|
c1ce97106f | ||
|
|
c8212c36e9 | ||
|
|
964477ea36 | ||
|
|
88fc841203 | ||
|
|
04633c731b | ||
|
|
ef99853da4 | ||
|
|
46d0e89d6e | ||
|
|
84f95a3ef4 | ||
|
|
76d0eb32fc | ||
|
|
76f6131b81 | ||
|
|
1438a1b7f7 |
@@ -17,8 +17,10 @@
|
||||
*/tclsh*
|
||||
*/tcltest*
|
||||
*/versions.vc
|
||||
unix/autoMkindex.tcl
|
||||
unix/dltest.marker
|
||||
unix/tcl.pc
|
||||
unix/tclIndex
|
||||
unix/pkgs/*
|
||||
win/pkgs/*
|
||||
win/tcl.hpj
|
||||
|
||||
+1
-1
@@ -119,7 +119,7 @@ retrieve the stack trace when script evaluation returns
|
||||
\fBTCL_ERROR\fR, like so:
|
||||
.PP
|
||||
.CS
|
||||
int code = Tcl_Eval(interp, script);
|
||||
int code = Tcl_EvalEx(interp, script, -1, 0);
|
||||
if (code == TCL_ERROR) {
|
||||
Tcl_Obj *options = \fBTcl_GetReturnOptions\fR(interp, code);
|
||||
Tcl_Obj *key = Tcl_NewStringObj("-errorinfo", -1);
|
||||
|
||||
+1
-1
@@ -281,7 +281,7 @@ The \fIhashKeyProc\fR member contains the address of a function called to
|
||||
calculate a hash value for the key.
|
||||
.PP
|
||||
.CS
|
||||
typedef unsigned int \fBTcl_HashKeyProc\fR(
|
||||
typedef TCL_HASH_TYPE \fBTcl_HashKeyProc\fR(
|
||||
Tcl_HashTable *\fItablePtr\fR,
|
||||
void *\fIkeyPtr\fR);
|
||||
.CE
|
||||
|
||||
+1
-1
@@ -164,7 +164,7 @@ The source interpreter will have its result reset by this operation.
|
||||
.SH "DEPRECATED INTERFACES"
|
||||
.SS "OLD STRING PROCEDURES"
|
||||
.PP
|
||||
Use of the following procedures (is deprecated
|
||||
Use of the following procedures is deprecated
|
||||
since they manipulate the Tcl result as a string.
|
||||
Procedures such as \fBTcl_SetObjResult\fR
|
||||
that manipulate the result as a value
|
||||
|
||||
+20
-6
@@ -287,12 +287,14 @@ slow destinations like network sockets.
|
||||
.RS
|
||||
.PP
|
||||
The \fBchan copy\fR command transfers data from \fIinputChan\fR until
|
||||
end of file or \fIsize\fR bytes have been transferred. If no
|
||||
\fB\-size\fR argument is given, then the copy goes until end of file.
|
||||
All the data read from \fIinputChan\fR is copied to \fIoutputChan\fR.
|
||||
Without the \fB\-command\fR option, \fBchan copy\fR blocks until the
|
||||
copy is complete and returns the number of bytes written to
|
||||
\fIoutputChan\fR.
|
||||
end of file or \fIsize\fR bytes or characters have been transferred;
|
||||
\fIsize\fR is in bytes if the two channels are using the same encoding,
|
||||
and is in characters otherwise. If no \fB\-size\fR argument is given,
|
||||
then the copy goes until end of file. All the data read from
|
||||
\fIinputChan\fR is copied to \fIoutputChan\fR. Without the
|
||||
\fB\-command\fR option, \fBchan copy\fR blocks until the copy is
|
||||
complete and returns the number of bytes or characters (using the same
|
||||
rules as for the \fB\-size\fR option) written to \fIoutputChan\fR.
|
||||
.PP
|
||||
The \fB\-command\fR argument makes \fBchan copy\fR work in the
|
||||
background. In this case it returns immediately and the
|
||||
@@ -547,6 +549,18 @@ this, spawn with "2>@" or
|
||||
">@" redirection operators onto the write side of a pipe, and then
|
||||
immediately close it in the parent. This is necessary to get an EOF on
|
||||
the read side once the child has exited or otherwise closed its output.
|
||||
.RS
|
||||
.PP
|
||||
Note that the pipe buffering semantics can vary at the operating system level
|
||||
substantially; it is not safe to assume that a write performed on the output
|
||||
side of the pipe will appear instantly to the input side. This is a
|
||||
fundamental difference and Tcl cannot conceal it. The overall stream semantics
|
||||
\fIare\fR compatible, so blocking reads and writes will not see most of the
|
||||
differences, but the details of what exactly gets written when are not. This
|
||||
is most likely to show up when using pipelines for testing; care should be
|
||||
taken to ensure that deadlocks do not occur and that potential short reads are
|
||||
allowed for.
|
||||
.RE
|
||||
.VE 8.6
|
||||
.TP
|
||||
\fBchan pop \fIchannelId\fR
|
||||
|
||||
+3
-2
@@ -271,8 +271,9 @@ limitation as \fBexec\fR wants to communicate over pipes. The Expect
|
||||
extension addresses this issue when communicating with a TUI application.
|
||||
.PP
|
||||
When attempting to execute an application, \fBexec\fR first searches for
|
||||
the name as it was specified. Then, in order, \fB.com\fR, \fB.exe\fR, and
|
||||
\fB.bat\fR are appended to the end of the specified name and it searches
|
||||
the name as it was specified. Then, in order,
|
||||
\fB.com\fR, \fB.exe\fR, \fB.bat\fR and \fB.cmd\fR
|
||||
are appended to the end of the specified name and it searches
|
||||
for the longer name. If a directory name was not specified as part of the
|
||||
application name, the following directories are automatically searched in
|
||||
order when attempting to locate the application:
|
||||
|
||||
+3
-3
@@ -133,15 +133,15 @@ Exponentiation. Valid for any numeric operands.
|
||||
Multiply, divide, remainder. None of these operators may be
|
||||
applied to string operands, and remainder may be applied only
|
||||
to integers.
|
||||
The remainder will always have the same sign as the divisor and
|
||||
The remainder always has the same sign as the divisor and
|
||||
an absolute value smaller than the absolute value of the divisor.
|
||||
.RS
|
||||
.PP
|
||||
When applied to integers, the division and remainder operators can be
|
||||
considered to partition the number line into a sequence of equal-sized
|
||||
adjacent non-overlapping pieces where each piece is the size of the divisor;
|
||||
the division result identifies which piece the divisor lay within, and the
|
||||
remainder result identifies where within that piece the divisor lay. A
|
||||
the division result identifies which piece the dividend lies within, and the
|
||||
remainder result identifies where within that piece the dividend lies. A
|
||||
consequence of this is that the result of
|
||||
.QW "-57 \fB/\fR 10"
|
||||
is always -6, and the result of
|
||||
|
||||
+9
-3
@@ -25,12 +25,15 @@ network sockets.
|
||||
.PP
|
||||
The \fBfcopy\fR
|
||||
command transfers data from \fIinchan\fR until end of file
|
||||
or \fIsize\fR bytes have been
|
||||
transferred. If no \fB\-size\fR argument is given,
|
||||
or \fIsize\fR bytes or characters have been
|
||||
transferred; \fIsize\fR is in bytes if the two channels are using the
|
||||
same encoding, and is in characters otherwise.
|
||||
If no \fB\-size\fR argument is given,
|
||||
then the copy goes until end of file.
|
||||
All the data read from \fIinchan\fR is copied to \fIoutchan\fR.
|
||||
Without the \fB\-command\fR option, \fBfcopy\fR blocks until the copy is complete
|
||||
and returns the number of bytes written to \fIoutchan\fR.
|
||||
and returns the number of bytes or characters (using the same rules as
|
||||
for the \fB\-size\fR option) written to \fIoutchan\fR.
|
||||
.PP
|
||||
The \fB\-command\fR argument makes \fBfcopy\fR work in the background.
|
||||
In this case it returns immediately and the \fIcallback\fR is invoked
|
||||
@@ -174,3 +177,6 @@ vwait done
|
||||
eof(n), fblocked(n), fconfigure(n), file(n)
|
||||
.SH KEYWORDS
|
||||
blocking, channel, end of line, end of file, nonblocking, read, translation
|
||||
'\" Local Variables:
|
||||
'\" mode: nroff
|
||||
'\" End:
|
||||
|
||||
+6
-5
@@ -162,7 +162,9 @@ returns \fB/home\fR (or something similar).
|
||||
\fBfile executable \fIname\fR
|
||||
.
|
||||
Returns \fB1\fR if file \fIname\fR is executable by the current user,
|
||||
\fB0\fR otherwise.
|
||||
\fB0\fR otherwise. On Windows, which does not have an executable attribute,
|
||||
the command treats all directories and any files with extensions
|
||||
\fBexe\fR, \fBcom\fR, \fBcmd\fR or \fBbat\fR as executable.
|
||||
.TP
|
||||
\fBfile exists \fIname\fR
|
||||
.
|
||||
@@ -482,10 +484,9 @@ not the effective ones.
|
||||
.TP
|
||||
\fBWindows\fR\0\0\0\0
|
||||
.
|
||||
The \fBfile owned\fR subcommand currently always reports that the current user
|
||||
is the owner of the file, without regard for what the operating system
|
||||
believes to be true, making an ownership test useless. This issue (#3613671)
|
||||
may be fixed in a future release of Tcl.
|
||||
The \fBfile owned\fR subcommand uses the user identifier (SID) of
|
||||
the process token, not the thread token which may be impersonating
|
||||
some other user.
|
||||
.SH EXAMPLES
|
||||
.PP
|
||||
This procedure shows how to search for C files in a given directory
|
||||
|
||||
+5
-1
@@ -1157,11 +1157,15 @@ typedef struct Tcl_DString {
|
||||
* Forward declarations of Tcl_HashTable and related types.
|
||||
*/
|
||||
|
||||
#ifndef TCL_HASH_TYPE
|
||||
# define TCL_HASH_TYPE unsigned
|
||||
#endif
|
||||
|
||||
typedef struct Tcl_HashKeyType Tcl_HashKeyType;
|
||||
typedef struct Tcl_HashTable Tcl_HashTable;
|
||||
typedef struct Tcl_HashEntry Tcl_HashEntry;
|
||||
|
||||
typedef unsigned (Tcl_HashKeyProc) (Tcl_HashTable *tablePtr, void *keyPtr);
|
||||
typedef TCL_HASH_TYPE (Tcl_HashKeyProc) (Tcl_HashTable *tablePtr, void *keyPtr);
|
||||
typedef int (Tcl_CompareHashKeysProc) (void *keyPtr, Tcl_HashEntry *hPtr);
|
||||
typedef Tcl_HashEntry * (Tcl_AllocHashEntryProc) (Tcl_HashTable *tablePtr,
|
||||
void *keyPtr);
|
||||
|
||||
@@ -1299,8 +1299,8 @@ AssembleOneLine(
|
||||
if (GetNextOperand(assemEnvPtr, &tokenPtr, &operand1Obj) != TCL_OK) {
|
||||
goto cleanup;
|
||||
}
|
||||
operand1 = Tcl_GetStringFromObj(operand1Obj, &operand1Len);
|
||||
litIndex = TclRegisterNewLiteral(envPtr, operand1, operand1Len);
|
||||
operand1 = TclGetStringFromObj(operand1Obj, &operand1Len);
|
||||
litIndex = TclRegisterLiteral(envPtr, operand1, operand1Len, 0);
|
||||
BBEmitInst1or4(assemEnvPtr, tblIdx, litIndex, 0);
|
||||
break;
|
||||
|
||||
@@ -1448,8 +1448,8 @@ AssembleOneLine(
|
||||
&operand1Obj) != TCL_OK) {
|
||||
goto cleanup;
|
||||
} else {
|
||||
operand1 = Tcl_GetStringFromObj(operand1Obj, &operand1Len);
|
||||
litIndex = TclRegisterNewLiteral(envPtr, operand1, operand1Len);
|
||||
operand1 = TclGetStringFromObj(operand1Obj, &operand1Len);
|
||||
litIndex = TclRegisterLiteral(envPtr, operand1, operand1Len, 0);
|
||||
|
||||
/*
|
||||
* Assumes that PUSH is the first slot!
|
||||
@@ -2288,7 +2288,7 @@ FindLocalVar(
|
||||
if (GetNextOperand(assemEnvPtr, tokenPtrPtr, &varNameObj) != TCL_OK) {
|
||||
return -1;
|
||||
}
|
||||
varNameStr = Tcl_GetStringFromObj(varNameObj, &varNameLen);
|
||||
varNameStr = TclGetStringFromObj(varNameObj, &varNameLen);
|
||||
if (CheckNamespaceQualifiers(interp, varNameStr, varNameLen)) {
|
||||
Tcl_DecrRefCount(varNameObj);
|
||||
return -1;
|
||||
@@ -3541,7 +3541,7 @@ StackCheckExit(
|
||||
* Emit a 'push' of the empty literal.
|
||||
*/
|
||||
|
||||
litIndex = TclRegisterNewLiteral(envPtr, "", 0);
|
||||
litIndex = TclRegisterLiteral(envPtr, "", 0, 0);
|
||||
|
||||
/*
|
||||
* Assumes that 'push' is at slot 0 in TalInstructionTable.
|
||||
|
||||
+25
-18
@@ -128,7 +128,7 @@ static void MathFuncWrongNumArgs(Tcl_Interp *interp, int expected,
|
||||
int actual, Tcl_Obj *const *objv);
|
||||
static Tcl_NRPostProc NRCoroutineCallerCallback;
|
||||
static Tcl_NRPostProc NRCoroutineExitCallback;
|
||||
static int NRCommand(ClientData data[], Tcl_Interp *interp, int result);
|
||||
static Tcl_NRPostProc NRCommand;
|
||||
|
||||
static Tcl_ObjCmdProc OldMathFuncProc;
|
||||
static void OldMathFuncDeleteProc(ClientData clientData);
|
||||
@@ -146,7 +146,6 @@ static int TEOV_RunEnterTraces(Tcl_Interp *interp,
|
||||
Command **cmdPtrPtr, Tcl_Obj *commandPtr, int objc,
|
||||
Tcl_Obj *const objv[]);
|
||||
static Tcl_NRPostProc RewindCoroutineCallback;
|
||||
static Tcl_NRPostProc TailcallCleanup;
|
||||
static Tcl_NRPostProc TEOEx_ByteCodeCallback;
|
||||
static Tcl_NRPostProc TEOEx_ListCallback;
|
||||
static Tcl_NRPostProc TEOV_Error;
|
||||
@@ -941,8 +940,8 @@ Tcl_CreateInterp(void)
|
||||
* Set up other variables such as tcl_version and tcl_library
|
||||
*/
|
||||
|
||||
Tcl_SetVar(interp, "tcl_patchLevel", TCL_PATCH_LEVEL, TCL_GLOBAL_ONLY);
|
||||
Tcl_SetVar(interp, "tcl_version", TCL_VERSION, TCL_GLOBAL_ONLY);
|
||||
Tcl_SetVar2(interp, "tcl_patchLevel", NULL, TCL_PATCH_LEVEL, TCL_GLOBAL_ONLY);
|
||||
Tcl_SetVar2(interp, "tcl_version", NULL, TCL_VERSION, TCL_GLOBAL_ONLY);
|
||||
Tcl_TraceVar2(interp, "tcl_precision", NULL,
|
||||
TCL_GLOBAL_ONLY|TCL_TRACE_READS|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
|
||||
TclPrecTraceProc, NULL);
|
||||
@@ -3944,7 +3943,7 @@ Tcl_Canceled(
|
||||
*/
|
||||
|
||||
if (iPtr->asyncCancelMsg != NULL) {
|
||||
message = Tcl_GetStringFromObj(iPtr->asyncCancelMsg, &length);
|
||||
message = TclGetStringFromObj(iPtr->asyncCancelMsg, &length);
|
||||
} else {
|
||||
length = 0;
|
||||
}
|
||||
@@ -4043,7 +4042,7 @@ Tcl_CancelEval(
|
||||
*/
|
||||
|
||||
if (resultObjPtr != NULL) {
|
||||
result = Tcl_GetStringFromObj(resultObjPtr, &cancelInfo->length);
|
||||
result = TclGetStringFromObj(resultObjPtr, &cancelInfo->length);
|
||||
cancelInfo->result = ckrealloc(cancelInfo->result,cancelInfo->length);
|
||||
memcpy(cancelInfo->result, result, (size_t) cancelInfo->length);
|
||||
TclDecrRefCount(resultObjPtr); /* Discard their result object. */
|
||||
@@ -4555,7 +4554,7 @@ TEOV_Error(
|
||||
*/
|
||||
|
||||
listPtr = Tcl_NewListObj(objc, objv);
|
||||
cmdString = Tcl_GetStringFromObj(listPtr, &cmdLen);
|
||||
cmdString = TclGetStringFromObj(listPtr, &cmdLen);
|
||||
Tcl_LogCommandInfo(interp, cmdString, cmdString, cmdLen);
|
||||
Tcl_DecrRefCount(listPtr);
|
||||
}
|
||||
@@ -4701,7 +4700,7 @@ TEOV_RunEnterTraces(
|
||||
Command *cmdPtr = *cmdPtrPtr;
|
||||
int newEpoch, cmdEpoch = cmdPtr->cmdEpoch;
|
||||
int length, traceCode = TCL_OK;
|
||||
const char *command = Tcl_GetStringFromObj(commandPtr, &length);
|
||||
const char *command = TclGetStringFromObj(commandPtr, &length);
|
||||
|
||||
/*
|
||||
* Call trace functions.
|
||||
@@ -4753,7 +4752,7 @@ TEOV_RunLeaveTraces(
|
||||
Command *cmdPtr = data[2];
|
||||
Tcl_Obj **objv = data[3];
|
||||
int length;
|
||||
const char *command = Tcl_GetStringFromObj(commandPtr, &length);
|
||||
const char *command = TclGetStringFromObj(commandPtr, &length);
|
||||
|
||||
if (!(cmdPtr->flags & CMD_IS_DELETED)) {
|
||||
if (cmdPtr->flags & CMD_HAS_EXEC_TRACES){
|
||||
@@ -6118,7 +6117,7 @@ TclNREvalObjEx(
|
||||
|
||||
Tcl_IncrRefCount(objPtr);
|
||||
|
||||
script = Tcl_GetStringFromObj(objPtr, &numSrcBytes);
|
||||
script = TclGetStringFromObj(objPtr, &numSrcBytes);
|
||||
result = Tcl_EvalEx(interp, script, numSrcBytes, flags);
|
||||
|
||||
TclDecrRefCount(objPtr);
|
||||
@@ -6149,7 +6148,7 @@ TEOEx_ByteCodeCallback(
|
||||
|
||||
ProcessUnexpectedResult(interp, result);
|
||||
result = TCL_ERROR;
|
||||
script = Tcl_GetStringFromObj(objPtr, &numSrcBytes);
|
||||
script = TclGetStringFromObj(objPtr, &numSrcBytes);
|
||||
Tcl_LogCommandInfo(interp, script, script, numSrcBytes);
|
||||
}
|
||||
|
||||
@@ -6848,7 +6847,7 @@ Tcl_VarEvalVA(
|
||||
Tcl_DStringAppend(&buf, string, -1);
|
||||
}
|
||||
|
||||
result = Tcl_Eval(interp, Tcl_DStringValue(&buf));
|
||||
result = Tcl_EvalEx(interp, Tcl_DStringValue(&buf), -1, 0);
|
||||
Tcl_DStringFree(&buf);
|
||||
return result;
|
||||
}
|
||||
@@ -6918,7 +6917,7 @@ Tcl_GlobalEval(
|
||||
|
||||
savedVarFramePtr = iPtr->varFramePtr;
|
||||
iPtr->varFramePtr = iPtr->rootFramePtr;
|
||||
result = Tcl_Eval(interp, command);
|
||||
result = Tcl_EvalEx(interp, command, -1, 0);
|
||||
iPtr->varFramePtr = savedVarFramePtr;
|
||||
return result;
|
||||
}
|
||||
@@ -8372,7 +8371,7 @@ TclNRTailcallEval(
|
||||
* a now-gone namespace: cleanup and return.
|
||||
*/
|
||||
|
||||
TailcallCleanup(data, interp, result);
|
||||
Tcl_DecrRefCount(listPtr);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -8381,18 +8380,26 @@ TclNRTailcallEval(
|
||||
*/
|
||||
|
||||
TclMarkTailcall(interp);
|
||||
TclNRAddCallback(interp, TailcallCleanup, listPtr, NULL, NULL,NULL);
|
||||
TclNRAddCallback(interp, TclNRReleaseValues, listPtr, NULL, NULL,NULL);
|
||||
iPtr->lookupNsPtr = (Namespace *) nsPtr;
|
||||
return TclNREvalObjv(interp, objc-1, objv+1, 0, NULL);
|
||||
}
|
||||
|
||||
static int
|
||||
TailcallCleanup(
|
||||
int
|
||||
TclNRReleaseValues(
|
||||
ClientData data[],
|
||||
Tcl_Interp *interp,
|
||||
int result)
|
||||
{
|
||||
Tcl_DecrRefCount((Tcl_Obj *) data[0]);
|
||||
int i = 0;
|
||||
while (i < 4) {
|
||||
if (data[i]) {
|
||||
Tcl_DecrRefCount((Tcl_Obj *) data[i]);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -2500,7 +2500,7 @@ BinaryEncode64(
|
||||
}
|
||||
break;
|
||||
case OPT_WRAPCHAR:
|
||||
wrapchar = Tcl_GetStringFromObj(objv[i+1], &wrapcharlen);
|
||||
wrapchar = TclGetStringFromObj(objv[i+1], &wrapcharlen);
|
||||
if (wrapcharlen == 0) {
|
||||
maxlen = 0;
|
||||
}
|
||||
|
||||
@@ -1499,7 +1499,19 @@ GetJulianDayFromEraYearMonthDay(
|
||||
* Try an initial conversion in the Gregorian calendar.
|
||||
*/
|
||||
|
||||
#if 0 /* BUG http://core.tcl.tk/tcl/tktview?name=da340d4f32 */
|
||||
ym1o4 = ym1 / 4;
|
||||
#else
|
||||
/*
|
||||
* Have to make sure quotient is truncated towards 0 when negative.
|
||||
* See above bug for details. The casts are necessary.
|
||||
*/
|
||||
if (ym1 >= 0)
|
||||
ym1o4 = ym1 / 4;
|
||||
else {
|
||||
ym1o4 = - (int) (((unsigned int) -ym1) / 4);
|
||||
}
|
||||
#endif
|
||||
if (ym1 % 4 < 0) {
|
||||
ym1o4--;
|
||||
}
|
||||
|
||||
+31
-12
@@ -12,6 +12,9 @@
|
||||
*/
|
||||
|
||||
#include "tclInt.h"
|
||||
#ifdef _WIN32
|
||||
# include "tclWinInt.h"
|
||||
#endif
|
||||
#include <locale.h>
|
||||
|
||||
/*
|
||||
@@ -1157,6 +1160,16 @@ FileAttrAccessTimeCmd(
|
||||
if (GetStatBuf(interp, objv[1], Tcl_FSStat, &buf) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
#if defined(_WIN32)
|
||||
/* We use a value of 0 to indicate the access time not available */
|
||||
if (buf.st_atime == 0) {
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"could not get access time for file \"%s\"",
|
||||
TclGetString(objv[1])));
|
||||
return TCL_ERROR;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (objc == 3) {
|
||||
/*
|
||||
* Need separate variable for reading longs from an object on 64-bit
|
||||
@@ -1229,6 +1242,15 @@ FileAttrModifyTimeCmd(
|
||||
if (GetStatBuf(interp, objv[1], Tcl_FSStat, &buf) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
#if defined(_WIN32)
|
||||
/* We use a value of 0 to indicate the modification time not available */
|
||||
if (buf.st_mtime == 0) {
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"could not get modification time for file \"%s\"",
|
||||
TclGetString(objv[1])));
|
||||
return TCL_ERROR;
|
||||
}
|
||||
#endif
|
||||
if (objc == 3) {
|
||||
/*
|
||||
* Need separate variable for reading longs from an object on 64-bit
|
||||
@@ -1574,28 +1596,25 @@ FileAttrIsOwnedCmd(
|
||||
int objc,
|
||||
Tcl_Obj *const objv[])
|
||||
{
|
||||
#ifdef __CYGWIN__
|
||||
#define geteuid() (short)(geteuid)()
|
||||
#endif
|
||||
#if !defined(_WIN32)
|
||||
Tcl_StatBuf buf;
|
||||
#endif
|
||||
int value = 0;
|
||||
|
||||
if (objc != 2) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "name");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (GetStatBuf(NULL, objv[1], Tcl_FSStat, &buf) == TCL_OK) {
|
||||
/*
|
||||
* For Windows, there are no user ids associated with a file, so we
|
||||
* always return 1.
|
||||
*
|
||||
* TODO: use GetSecurityInfo to get the real owner of the file and
|
||||
* test for equivalence to the current user.
|
||||
*/
|
||||
|
||||
#if defined(_WIN32) || defined(__CYGWIN__)
|
||||
value = 1;
|
||||
#if defined(_WIN32)
|
||||
value = TclWinFileOwned(objv[1]);
|
||||
#else
|
||||
if (GetStatBuf(NULL, objv[1], Tcl_FSStat, &buf) == TCL_OK) {
|
||||
value = (geteuid() == buf.st_uid);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
Tcl_SetObjResult(interp, Tcl_NewBooleanObj(value));
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
+3
-4
@@ -105,8 +105,7 @@ typedef struct SortInfo {
|
||||
*/
|
||||
|
||||
static int DictionaryCompare(const char *left, const char *right);
|
||||
static int IfConditionCallback(ClientData data[],
|
||||
Tcl_Interp *interp, int result);
|
||||
static Tcl_NRPostProc IfConditionCallback;
|
||||
static int InfoArgsCmd(ClientData dummy, Tcl_Interp *interp,
|
||||
int objc, Tcl_Obj *const objv[]);
|
||||
static int InfoBodyCmd(ClientData dummy, Tcl_Interp *interp,
|
||||
@@ -1678,7 +1677,7 @@ InfoLibraryCmd(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
libDirName = Tcl_GetVar(interp, "tcl_library", TCL_GLOBAL_ONLY);
|
||||
libDirName = Tcl_GetVar2(interp, "tcl_library", NULL, TCL_GLOBAL_ONLY);
|
||||
if (libDirName != NULL) {
|
||||
Tcl_SetObjResult(interp, Tcl_NewStringObj(libDirName, -1));
|
||||
return TCL_OK;
|
||||
@@ -1804,7 +1803,7 @@ InfoPatchLevelCmd(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
patchlevel = Tcl_GetVar(interp, "tcl_patchLevel",
|
||||
patchlevel = Tcl_GetVar2(interp, "tcl_patchLevel", NULL,
|
||||
(TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG));
|
||||
if (patchlevel != NULL) {
|
||||
Tcl_SetObjResult(interp, Tcl_NewStringObj(patchlevel, -1));
|
||||
|
||||
+4
-8
@@ -22,14 +22,10 @@
|
||||
|
||||
static inline Tcl_Obj * During(Tcl_Interp *interp, int resultCode,
|
||||
Tcl_Obj *oldOptions, Tcl_Obj *errorInfo);
|
||||
static int SwitchPostProc(ClientData data[], Tcl_Interp *interp,
|
||||
int result);
|
||||
static int TryPostBody(ClientData data[], Tcl_Interp *interp,
|
||||
int result);
|
||||
static int TryPostFinal(ClientData data[], Tcl_Interp *interp,
|
||||
int result);
|
||||
static int TryPostHandler(ClientData data[], Tcl_Interp *interp,
|
||||
int result);
|
||||
static Tcl_NRPostProc SwitchPostProc;
|
||||
static Tcl_NRPostProc TryPostBody;
|
||||
static Tcl_NRPostProc TryPostFinal;
|
||||
static Tcl_NRPostProc TryPostHandler;
|
||||
static int UniCharIsAscii(int character);
|
||||
static int UniCharIsHexDigit(int character);
|
||||
|
||||
|
||||
@@ -801,7 +801,7 @@ TclCompileConcatCmd(
|
||||
Tcl_ListObjGetElements(NULL, listObj, &len, &objs);
|
||||
objPtr = Tcl_ConcatObj(len, objs);
|
||||
Tcl_DecrRefCount(listObj);
|
||||
bytes = Tcl_GetStringFromObj(objPtr, &len);
|
||||
bytes = TclGetStringFromObj(objPtr, &len);
|
||||
PushLiteral(envPtr, bytes, len);
|
||||
Tcl_DecrRefCount(objPtr);
|
||||
return TCL_OK;
|
||||
@@ -1209,7 +1209,7 @@ TclCompileDictCreateCmd(
|
||||
* We did! Excellent. The "verifyDict" is to do type forcing.
|
||||
*/
|
||||
|
||||
bytes = Tcl_GetStringFromObj(dictObj, &len);
|
||||
bytes = TclGetStringFromObj(dictObj, &len);
|
||||
PushLiteral(envPtr, bytes, len);
|
||||
TclEmitOpcode( INST_DUP, envPtr);
|
||||
TclEmitOpcode( INST_DICT_VERIFY, envPtr);
|
||||
@@ -2650,7 +2650,7 @@ CompileEachloopCmd(
|
||||
int numBytes, varIndex;
|
||||
|
||||
Tcl_ListObjIndex(NULL, varListObj, j, &varNameObj);
|
||||
bytes = Tcl_GetStringFromObj(varNameObj, &numBytes);
|
||||
bytes = TclGetStringFromObj(varNameObj, &numBytes);
|
||||
varIndex = LocalScalar(bytes, numBytes, envPtr);
|
||||
if (varIndex < 0) {
|
||||
code = TCL_ERROR;
|
||||
@@ -3087,7 +3087,7 @@ TclCompileFormatCmd(
|
||||
* literal. Job done.
|
||||
*/
|
||||
|
||||
bytes = Tcl_GetStringFromObj(tmpObj, &len);
|
||||
bytes = TclGetStringFromObj(tmpObj, &len);
|
||||
PushLiteral(envPtr, bytes, len);
|
||||
Tcl_DecrRefCount(tmpObj);
|
||||
return TCL_OK;
|
||||
@@ -3158,7 +3158,7 @@ TclCompileFormatCmd(
|
||||
if (*++bytes == '%') {
|
||||
Tcl_AppendToObj(tmpObj, "%", 1);
|
||||
} else {
|
||||
char *b = Tcl_GetStringFromObj(tmpObj, &len);
|
||||
char *b = TclGetStringFromObj(tmpObj, &len);
|
||||
|
||||
/*
|
||||
* If there is a non-empty literal from the format string,
|
||||
@@ -3192,7 +3192,7 @@ TclCompileFormatCmd(
|
||||
*/
|
||||
|
||||
Tcl_AppendToObj(tmpObj, start, bytes - start);
|
||||
bytes = Tcl_GetStringFromObj(tmpObj, &len);
|
||||
bytes = TclGetStringFromObj(tmpObj, &len);
|
||||
if (len > 0) {
|
||||
PushLiteral(envPtr, bytes, len);
|
||||
i++;
|
||||
|
||||
@@ -2451,7 +2451,7 @@ TclCompileRegsubCmd(
|
||||
* replacement "simple"?
|
||||
*/
|
||||
|
||||
bytes = Tcl_GetStringFromObj(patternObj, &len);
|
||||
bytes = TclGetStringFromObj(patternObj, &len);
|
||||
if (TclReToGlob(NULL, bytes, len, &pattern, &exact, &quantified)
|
||||
!= TCL_OK || exact || quantified) {
|
||||
goto done;
|
||||
@@ -2499,7 +2499,7 @@ TclCompileRegsubCmd(
|
||||
result = TCL_OK;
|
||||
bytes = Tcl_DStringValue(&pattern) + 1;
|
||||
PushLiteral(envPtr, bytes, len);
|
||||
bytes = Tcl_GetStringFromObj(replacementObj, &len);
|
||||
bytes = TclGetStringFromObj(replacementObj, &len);
|
||||
PushLiteral(envPtr, bytes, len);
|
||||
CompileWord(envPtr, stringTokenPtr, interp, parsePtr->numWords-2);
|
||||
TclEmitOpcode( INST_STR_MAP, envPtr);
|
||||
@@ -2761,7 +2761,7 @@ TclCompileSyntaxError(
|
||||
const char *bytes = TclGetStringFromObj(msg, &numBytes);
|
||||
|
||||
TclErrorStackResetIf(interp, bytes, numBytes);
|
||||
TclEmitPush(TclRegisterNewLiteral(envPtr, bytes, numBytes), envPtr);
|
||||
TclEmitPush(TclRegisterLiteral(envPtr, bytes, numBytes, 0), envPtr);
|
||||
CompileReturnInternal(envPtr, INST_SYNTAX, TCL_ERROR, 0,
|
||||
TclNoErrorStack(interp, Tcl_GetReturnOptions(interp, TCL_ERROR)));
|
||||
Tcl_ResetResult(interp);
|
||||
|
||||
+12
-12
@@ -312,7 +312,7 @@ TclCompileStringCatCmd(
|
||||
Tcl_DecrRefCount(obj);
|
||||
if (folded) {
|
||||
int len;
|
||||
const char *bytes = Tcl_GetStringFromObj(folded, &len);
|
||||
const char *bytes = TclGetStringFromObj(folded, &len);
|
||||
|
||||
PushLiteral(envPtr, bytes, len);
|
||||
Tcl_DecrRefCount(folded);
|
||||
@@ -330,7 +330,7 @@ TclCompileStringCatCmd(
|
||||
}
|
||||
if (folded) {
|
||||
int len;
|
||||
const char *bytes = Tcl_GetStringFromObj(folded, &len);
|
||||
const char *bytes = TclGetStringFromObj(folded, &len);
|
||||
|
||||
PushLiteral(envPtr, bytes, len);
|
||||
Tcl_DecrRefCount(folded);
|
||||
@@ -948,12 +948,12 @@ TclCompileStringMapCmd(
|
||||
* correct semantics for mapping.
|
||||
*/
|
||||
|
||||
bytes = Tcl_GetStringFromObj(objv[0], &len);
|
||||
bytes = TclGetStringFromObj(objv[0], &len);
|
||||
if (len == 0) {
|
||||
CompileWord(envPtr, stringTokenPtr, interp, 2);
|
||||
} else {
|
||||
PushLiteral(envPtr, bytes, len);
|
||||
bytes = Tcl_GetStringFromObj(objv[1], &len);
|
||||
bytes = TclGetStringFromObj(objv[1], &len);
|
||||
PushLiteral(envPtr, bytes, len);
|
||||
CompileWord(envPtr, stringTokenPtr, interp, 2);
|
||||
OP(STR_MAP);
|
||||
@@ -1456,8 +1456,8 @@ TclSubstCompile(
|
||||
|
||||
switch (tokenPtr->type) {
|
||||
case TCL_TOKEN_TEXT:
|
||||
literal = TclRegisterNewLiteral(envPtr,
|
||||
tokenPtr->start, tokenPtr->size);
|
||||
literal = TclRegisterLiteral(envPtr,
|
||||
tokenPtr->start, tokenPtr->size, 0);
|
||||
TclEmitPush(literal, envPtr);
|
||||
TclAdvanceLines(&bline, tokenPtr->start,
|
||||
tokenPtr->start + tokenPtr->size);
|
||||
@@ -1466,7 +1466,7 @@ TclSubstCompile(
|
||||
case TCL_TOKEN_BS:
|
||||
length = TclParseBackslash(tokenPtr->start, tokenPtr->size,
|
||||
NULL, buf);
|
||||
literal = TclRegisterNewLiteral(envPtr, buf, length);
|
||||
literal = TclRegisterLiteral(envPtr, buf, length, 0);
|
||||
TclEmitPush(literal, envPtr);
|
||||
count++;
|
||||
continue;
|
||||
@@ -2825,7 +2825,7 @@ TclCompileTryCmd(
|
||||
}
|
||||
if (objc > 0) {
|
||||
int len;
|
||||
const char *varname = Tcl_GetStringFromObj(objv[0], &len);
|
||||
const char *varname = TclGetStringFromObj(objv[0], &len);
|
||||
|
||||
resultVarIndices[i] = LocalScalar(varname, len, envPtr);
|
||||
if (resultVarIndices[i] < 0) {
|
||||
@@ -2837,7 +2837,7 @@ TclCompileTryCmd(
|
||||
}
|
||||
if (objc == 2) {
|
||||
int len;
|
||||
const char *varname = Tcl_GetStringFromObj(objv[1], &len);
|
||||
const char *varname = TclGetStringFromObj(objv[1], &len);
|
||||
|
||||
optionVarIndices[i] = LocalScalar(varname, len, envPtr);
|
||||
if (optionVarIndices[i] < 0) {
|
||||
@@ -3040,7 +3040,7 @@ IssueTryClausesInstructions(
|
||||
OP4( DICT_GET, 1);
|
||||
TclAdjustStackDepth(-1, envPtr);
|
||||
OP44( LIST_RANGE_IMM, 0, len-1);
|
||||
p = Tcl_GetStringFromObj(matchClauses[i], &len);
|
||||
p = TclGetStringFromObj(matchClauses[i], &len);
|
||||
PushLiteral(envPtr, p, len);
|
||||
OP( STR_EQ);
|
||||
JUMP4( JUMP_FALSE, notECJumpSource);
|
||||
@@ -3251,7 +3251,7 @@ IssueTryClausesFinallyInstructions(
|
||||
OP4( DICT_GET, 1);
|
||||
TclAdjustStackDepth(-1, envPtr);
|
||||
OP44( LIST_RANGE_IMM, 0, len-1);
|
||||
p = Tcl_GetStringFromObj(matchClauses[i], &len);
|
||||
p = TclGetStringFromObj(matchClauses[i], &len);
|
||||
PushLiteral(envPtr, p, len);
|
||||
OP( STR_EQ);
|
||||
JUMP4( JUMP_FALSE, notECJumpSource);
|
||||
@@ -3579,7 +3579,7 @@ TclCompileUnsetCmd(
|
||||
const char *bytes;
|
||||
int len;
|
||||
|
||||
bytes = Tcl_GetStringFromObj(leadingWord, &len);
|
||||
bytes = TclGetStringFromObj(leadingWord, &len);
|
||||
if (i == 1 && len == 11 && !strncmp("-nocomplain", bytes, 11)) {
|
||||
flags = 0;
|
||||
haveFlags++;
|
||||
|
||||
@@ -2267,9 +2267,9 @@ CompileExprTree(
|
||||
p = TclGetStringFromObj(*funcObjv, &length);
|
||||
funcObjv++;
|
||||
Tcl_DStringAppend(&cmdName, p, length);
|
||||
TclEmitPush(TclRegisterNewCmdLiteral(envPtr,
|
||||
TclEmitPush(TclRegisterLiteral(envPtr,
|
||||
Tcl_DStringValue(&cmdName),
|
||||
Tcl_DStringLength(&cmdName)), envPtr);
|
||||
Tcl_DStringLength(&cmdName), LITERAL_CMD_NAME), envPtr);
|
||||
Tcl_DStringFree(&cmdName);
|
||||
|
||||
/*
|
||||
@@ -2376,8 +2376,8 @@ CompileExprTree(
|
||||
pc1 = CurrentOffset(envPtr);
|
||||
TclEmitInstInt1((nodePtr->lexeme == AND) ? INST_JUMP_FALSE1
|
||||
: INST_JUMP_TRUE1, 0, envPtr);
|
||||
TclEmitPush(TclRegisterNewLiteral(envPtr,
|
||||
(nodePtr->lexeme == AND) ? "1" : "0", 1), envPtr);
|
||||
TclEmitPush(TclRegisterLiteral(envPtr,
|
||||
(nodePtr->lexeme == AND) ? "1" : "0", 1, 0), envPtr);
|
||||
pc2 = CurrentOffset(envPtr);
|
||||
TclEmitInstInt1(INST_JUMP1, 0, envPtr);
|
||||
TclAdjustStackDepth(-1, envPtr);
|
||||
@@ -2386,8 +2386,8 @@ CompileExprTree(
|
||||
if (TclFixupForwardJumpToHere(envPtr, &jumpPtr->jump, 127)) {
|
||||
pc2 += 3;
|
||||
}
|
||||
TclEmitPush(TclRegisterNewLiteral(envPtr,
|
||||
(nodePtr->lexeme == AND) ? "0" : "1", 1), envPtr);
|
||||
TclEmitPush(TclRegisterLiteral(envPtr,
|
||||
(nodePtr->lexeme == AND) ? "0" : "1", 1, 0), envPtr);
|
||||
TclStoreInt1AtPtr(CurrentOffset(envPtr) - pc2,
|
||||
envPtr->codeStart + pc2 + 1);
|
||||
convert = 0;
|
||||
@@ -2421,7 +2421,7 @@ CompileExprTree(
|
||||
if (optimize) {
|
||||
int length;
|
||||
const char *bytes = TclGetStringFromObj(literal, &length);
|
||||
int index = TclRegisterNewLiteral(envPtr, bytes, length);
|
||||
int index = TclRegisterLiteral(envPtr, bytes, length, 0);
|
||||
Tcl_Obj *objPtr = TclFetchLiteral(envPtr, index);
|
||||
|
||||
if ((objPtr->typePtr == NULL) && (literal->typePtr != NULL)) {
|
||||
@@ -2479,8 +2479,8 @@ CompileExprTree(
|
||||
if (objPtr->bytes) {
|
||||
Tcl_Obj *tableValue;
|
||||
|
||||
index = TclRegisterNewLiteral(envPtr, objPtr->bytes,
|
||||
objPtr->length);
|
||||
index = TclRegisterLiteral(envPtr, objPtr->bytes,
|
||||
objPtr->length, 0);
|
||||
tableValue = TclFetchLiteral(envPtr, index);
|
||||
if ((tableValue->typePtr == NULL) &&
|
||||
(objPtr->typePtr != NULL)) {
|
||||
|
||||
+18
-10
@@ -1314,7 +1314,7 @@ CompileSubstObj(
|
||||
if (objPtr->typePtr != &substCodeType) {
|
||||
CompileEnv compEnv;
|
||||
int numBytes;
|
||||
const char *bytes = Tcl_GetStringFromObj(objPtr, &numBytes);
|
||||
const char *bytes = TclGetStringFromObj(objPtr, &numBytes);
|
||||
|
||||
/* TODO: Check for more TIP 280 */
|
||||
TclInitCompileEnv(interp, &compEnv, bytes, numBytes, NULL, 0);
|
||||
@@ -1792,9 +1792,17 @@ CompileCmdLiteral(
|
||||
CompileEnv *envPtr)
|
||||
{
|
||||
int numBytes;
|
||||
const char *bytes = Tcl_GetStringFromObj(cmdObj, &numBytes);
|
||||
int cmdLitIdx = TclRegisterNewCmdLiteral(envPtr, bytes, numBytes);
|
||||
Command *cmdPtr = (Command *) Tcl_GetCommandFromObj(interp, cmdObj);
|
||||
const char *bytes;
|
||||
Command *cmdPtr;
|
||||
int cmdLitIdx, extraLiteralFlags = LITERAL_CMD_NAME;
|
||||
|
||||
cmdPtr = (Command *) Tcl_GetCommandFromObj(interp, cmdObj);
|
||||
if ((cmdPtr != NULL) && (cmdPtr->flags & CMD_VIA_RESOLVER)) {
|
||||
extraLiteralFlags |= LITERAL_UNSHARED;
|
||||
}
|
||||
|
||||
bytes = Tcl_GetStringFromObj(cmdObj, &numBytes);
|
||||
cmdLitIdx = TclRegisterLiteral(envPtr, bytes, numBytes, extraLiteralFlags);
|
||||
|
||||
if (cmdPtr) {
|
||||
TclSetCmdNameObj(interp, TclFetchLiteral(envPtr, cmdLitIdx), cmdPtr);
|
||||
@@ -1829,8 +1837,8 @@ TclCompileInvocation(
|
||||
continue;
|
||||
}
|
||||
|
||||
objIdx = TclRegisterNewLiteral(envPtr,
|
||||
tokenPtr[1].start, tokenPtr[1].size);
|
||||
objIdx = TclRegisterLiteral(envPtr,
|
||||
tokenPtr[1].start, tokenPtr[1].size, 0);
|
||||
if (envPtr->clNext) {
|
||||
TclContinuationsEnterDerived(TclFetchLiteral(envPtr, objIdx),
|
||||
tokenPtr[1].start - envPtr->source, envPtr->clNext);
|
||||
@@ -1879,8 +1887,8 @@ CompileExpanded(
|
||||
continue;
|
||||
}
|
||||
|
||||
objIdx = TclRegisterNewLiteral(envPtr,
|
||||
tokenPtr[1].start, tokenPtr[1].size);
|
||||
objIdx = TclRegisterLiteral(envPtr,
|
||||
tokenPtr[1].start, tokenPtr[1].size, 0);
|
||||
if (envPtr->clNext) {
|
||||
TclContinuationsEnterDerived(TclFetchLiteral(envPtr, objIdx),
|
||||
tokenPtr[1].start - envPtr->source, envPtr->clNext);
|
||||
@@ -2729,7 +2737,7 @@ PreventCycle(
|
||||
* the intrep.
|
||||
*/
|
||||
int numBytes;
|
||||
const char *bytes = Tcl_GetStringFromObj(objPtr, &numBytes);
|
||||
const char *bytes = TclGetStringFromObj(objPtr, &numBytes);
|
||||
Tcl_Obj *copyPtr = Tcl_NewStringObj(bytes, numBytes);
|
||||
|
||||
Tcl_IncrRefCount(copyPtr);
|
||||
@@ -2968,7 +2976,7 @@ TclFindCompiledLocal(
|
||||
varNamePtr = &cachePtr->varName0;
|
||||
for (i=0; i < cachePtr->numVars; varNamePtr++, i++) {
|
||||
if (*varNamePtr) {
|
||||
localName = Tcl_GetStringFromObj(*varNamePtr, &len);
|
||||
localName = TclGetStringFromObj(*varNamePtr, &len);
|
||||
if ((len == nameBytes) && !strncmp(name, localName, len)) {
|
||||
return i;
|
||||
}
|
||||
|
||||
+4
-26
@@ -1095,7 +1095,7 @@ MODULE_SCOPE int TclCreateAuxData(ClientData clientData,
|
||||
MODULE_SCOPE int TclCreateExceptRange(ExceptionRangeType type,
|
||||
CompileEnv *envPtr);
|
||||
MODULE_SCOPE ExecEnv * TclCreateExecEnv(Tcl_Interp *interp, int size);
|
||||
MODULE_SCOPE Tcl_Obj * TclCreateLiteral(Interp *iPtr, char *bytes,
|
||||
MODULE_SCOPE Tcl_Obj * TclCreateLiteral(Interp *iPtr, const char *bytes,
|
||||
int length, unsigned int hash, int *newPtr,
|
||||
Namespace *nsPtr, int flags,
|
||||
LiteralEntry **globalPtrPtr);
|
||||
@@ -1210,29 +1210,7 @@ MODULE_SCOPE int TclPushProcCallFrame(ClientData clientData,
|
||||
|
||||
#define LITERAL_ON_HEAP 0x01
|
||||
#define LITERAL_CMD_NAME 0x02
|
||||
|
||||
/*
|
||||
* Form of TclRegisterLiteral with flags == 0. In that case, it is safe to
|
||||
* cast away constness, and it is cleanest to do that here, all in one place.
|
||||
*
|
||||
* int TclRegisterNewLiteral(CompileEnv *envPtr, const char *bytes,
|
||||
* int length);
|
||||
*/
|
||||
|
||||
#define TclRegisterNewLiteral(envPtr, bytes, length) \
|
||||
TclRegisterLiteral(envPtr, (char *)(bytes), length, /*flags*/ 0)
|
||||
|
||||
/*
|
||||
* Form of TclRegisterLiteral with flags == LITERAL_CMD_NAME. In that case, it
|
||||
* is safe to cast away constness, and it is cleanest to do that here, all in
|
||||
* one place.
|
||||
*
|
||||
* int TclRegisterNewNSLiteral(CompileEnv *envPtr, const char *bytes,
|
||||
* int length);
|
||||
*/
|
||||
|
||||
#define TclRegisterNewCmdLiteral(envPtr, bytes, length) \
|
||||
TclRegisterLiteral(envPtr, (char *)(bytes), length, LITERAL_CMD_NAME)
|
||||
#define LITERAL_UNSHARED 0x04
|
||||
|
||||
/*
|
||||
* Macro used to manually adjust the stack requirements; used in cases where
|
||||
@@ -1549,9 +1527,9 @@ MODULE_SCOPE int TclPushProcCallFrame(ClientData clientData,
|
||||
*/
|
||||
|
||||
#define PushLiteral(envPtr, string, length) \
|
||||
TclEmitPush(TclRegisterNewLiteral((envPtr), (string), (length)), (envPtr))
|
||||
TclEmitPush(TclRegisterLiteral(envPtr, string, length, 0), (envPtr))
|
||||
#define PushStringLiteral(envPtr, string) \
|
||||
PushLiteral((envPtr), (string), (int) (sizeof(string "") - 1))
|
||||
PushLiteral(envPtr, string, (int) (sizeof(string "") - 1))
|
||||
|
||||
/*
|
||||
* Macro to advance to the next token; it is more mnemonic than the address
|
||||
|
||||
+6
-12
@@ -70,18 +70,12 @@ static inline void DeleteChainTable(struct Dict *dict);
|
||||
static inline Tcl_HashEntry *CreateChainEntry(struct Dict *dict,
|
||||
Tcl_Obj *keyPtr, int *newPtr);
|
||||
static inline int DeleteChainEntry(struct Dict *dict, Tcl_Obj *keyPtr);
|
||||
static int FinalizeDictUpdate(ClientData data[],
|
||||
Tcl_Interp *interp, int result);
|
||||
static int FinalizeDictWith(ClientData data[],
|
||||
Tcl_Interp *interp, int result);
|
||||
static int DictForNRCmd(ClientData dummy, Tcl_Interp *interp,
|
||||
int objc, Tcl_Obj *const *objv);
|
||||
static int DictMapNRCmd(ClientData dummy, Tcl_Interp *interp,
|
||||
int objc, Tcl_Obj *const *objv);
|
||||
static int DictForLoopCallback(ClientData data[],
|
||||
Tcl_Interp *interp, int result);
|
||||
static int DictMapLoopCallback(ClientData data[],
|
||||
Tcl_Interp *interp, int result);
|
||||
static Tcl_NRPostProc FinalizeDictUpdate;
|
||||
static Tcl_NRPostProc FinalizeDictWith;
|
||||
static Tcl_ObjCmdProc DictForNRCmd;
|
||||
static Tcl_ObjCmdProc DictMapNRCmd;
|
||||
static Tcl_NRPostProc DictForLoopCallback;
|
||||
static Tcl_NRPostProc DictMapLoopCallback;
|
||||
|
||||
/*
|
||||
* Table of dict subcommand names and implementations.
|
||||
|
||||
+136
-3
@@ -6,7 +6,7 @@
|
||||
*
|
||||
* Copyright (c) 1996-1998 Sun Microsystems, Inc.
|
||||
* Copyright (c) 2001 by Kevin B. Kenny. All rights reserved.
|
||||
* Copyright (c) 2013 Donal K. Fellows.
|
||||
* Copyright (c) 2013-2016 Donal K. Fellows.
|
||||
*
|
||||
* See the file "license.terms" for information on usage and redistribution of
|
||||
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||
@@ -193,7 +193,7 @@ TclPrintObject(
|
||||
char *bytes;
|
||||
int length;
|
||||
|
||||
bytes = Tcl_GetStringFromObj(objPtr, &length);
|
||||
bytes = TclGetStringFromObj(objPtr, &length);
|
||||
TclPrintSource(outFile, bytes, TclMin(length, maxChars));
|
||||
}
|
||||
|
||||
@@ -650,7 +650,7 @@ FormatInstruction(
|
||||
int length;
|
||||
|
||||
Tcl_AppendToObj(bufferObj, "\t# ", -1);
|
||||
bytes = Tcl_GetStringFromObj(codePtr->objArrayPtr[opnd], &length);
|
||||
bytes = TclGetStringFromObj(codePtr->objArrayPtr[opnd], &length);
|
||||
PrintSourceToObj(bufferObj, bytes, TclMin(length, 40));
|
||||
} else if (suffixBuffer[0]) {
|
||||
Tcl_AppendPrintfToObj(bufferObj, "\t# %s", suffixBuffer);
|
||||
@@ -1279,9 +1279,11 @@ Tcl_DisassembleObjCmd(
|
||||
Tcl_Obj *const objv[]) /* Argument objects. */
|
||||
{
|
||||
static const char *const types[] = {
|
||||
"constructor", "destructor",
|
||||
"lambda", "method", "objmethod", "proc", "script", NULL
|
||||
};
|
||||
enum Types {
|
||||
DISAS_CLASS_CONSTRUCTOR, DISAS_CLASS_DESTRUCTOR,
|
||||
DISAS_LAMBDA, DISAS_CLASS_METHOD, DISAS_OBJECT_METHOD, DISAS_PROC,
|
||||
DISAS_SCRIPT
|
||||
};
|
||||
@@ -1290,6 +1292,7 @@ Tcl_DisassembleObjCmd(
|
||||
Proc *procPtr = NULL;
|
||||
Tcl_HashEntry *hPtr;
|
||||
Object *oPtr;
|
||||
Method *methodPtr;
|
||||
|
||||
if (objc < 2) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "type ...");
|
||||
@@ -1384,6 +1387,136 @@ Tcl_DisassembleObjCmd(
|
||||
codeObjPtr = objv[2];
|
||||
break;
|
||||
|
||||
case DISAS_CLASS_CONSTRUCTOR:
|
||||
if (objc != 3) {
|
||||
Tcl_WrongNumArgs(interp, 2, objv, "className");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
/*
|
||||
* Look up the body of a constructor.
|
||||
*/
|
||||
|
||||
oPtr = (Object *) Tcl_GetObjectFromObj(interp, objv[2]);
|
||||
if (oPtr == NULL) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (oPtr->classPtr == NULL) {
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"\"%s\" is not a class", TclGetString(objv[2])));
|
||||
Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "CLASS",
|
||||
TclGetString(objv[2]), NULL);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
methodPtr = oPtr->classPtr->constructorPtr;
|
||||
if (methodPtr == NULL) {
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"\"%s\" has no defined constructor",
|
||||
TclGetString(objv[2])));
|
||||
Tcl_SetErrorCode(interp, "TCL", "OPERATION", "DISASSEMBLE",
|
||||
"CONSRUCTOR", NULL);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
procPtr = TclOOGetProcFromMethod(methodPtr);
|
||||
if (procPtr == NULL) {
|
||||
Tcl_SetObjResult(interp, Tcl_NewStringObj(
|
||||
"body not available for this kind of constructor", -1));
|
||||
Tcl_SetErrorCode(interp, "TCL", "OPERATION", "DISASSEMBLE",
|
||||
"METHODTYPE", NULL);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
/*
|
||||
* Compile if necessary.
|
||||
*/
|
||||
|
||||
if (procPtr->bodyPtr->typePtr != &tclByteCodeType) {
|
||||
Command cmd;
|
||||
|
||||
/*
|
||||
* Yes, this is ugly, but we need to pass the namespace in to the
|
||||
* compiler in two places.
|
||||
*/
|
||||
|
||||
cmd.nsPtr = (Namespace *) oPtr->namespacePtr;
|
||||
procPtr->cmdPtr = &cmd;
|
||||
result = TclProcCompileProc(interp, procPtr, procPtr->bodyPtr,
|
||||
(Namespace *) oPtr->namespacePtr, "body of constructor",
|
||||
TclGetString(objv[2]));
|
||||
procPtr->cmdPtr = NULL;
|
||||
if (result != TCL_OK) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
codeObjPtr = procPtr->bodyPtr;
|
||||
break;
|
||||
|
||||
case DISAS_CLASS_DESTRUCTOR:
|
||||
if (objc != 3) {
|
||||
Tcl_WrongNumArgs(interp, 2, objv, "className");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
/*
|
||||
* Look up the body of a destructor.
|
||||
*/
|
||||
|
||||
oPtr = (Object *) Tcl_GetObjectFromObj(interp, objv[2]);
|
||||
if (oPtr == NULL) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (oPtr->classPtr == NULL) {
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"\"%s\" is not a class", TclGetString(objv[2])));
|
||||
Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "CLASS",
|
||||
TclGetString(objv[2]), NULL);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
methodPtr = oPtr->classPtr->destructorPtr;
|
||||
if (methodPtr == NULL) {
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"\"%s\" has no defined destructor",
|
||||
TclGetString(objv[2])));
|
||||
Tcl_SetErrorCode(interp, "TCL", "OPERATION", "DISASSEMBLE",
|
||||
"DESRUCTOR", NULL);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
procPtr = TclOOGetProcFromMethod(methodPtr);
|
||||
if (procPtr == NULL) {
|
||||
Tcl_SetObjResult(interp, Tcl_NewStringObj(
|
||||
"body not available for this kind of destructor", -1));
|
||||
Tcl_SetErrorCode(interp, "TCL", "OPERATION", "DISASSEMBLE",
|
||||
"METHODTYPE", NULL);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
/*
|
||||
* Compile if necessary.
|
||||
*/
|
||||
|
||||
if (procPtr->bodyPtr->typePtr != &tclByteCodeType) {
|
||||
Command cmd;
|
||||
|
||||
/*
|
||||
* Yes, this is ugly, but we need to pass the namespace in to the
|
||||
* compiler in two places.
|
||||
*/
|
||||
|
||||
cmd.nsPtr = (Namespace *) oPtr->namespacePtr;
|
||||
procPtr->cmdPtr = &cmd;
|
||||
result = TclProcCompileProc(interp, procPtr, procPtr->bodyPtr,
|
||||
(Namespace *) oPtr->namespacePtr, "body of destructor",
|
||||
TclGetString(objv[2]));
|
||||
procPtr->cmdPtr = NULL;
|
||||
if (result != TCL_OK) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
codeObjPtr = procPtr->bodyPtr;
|
||||
break;
|
||||
|
||||
case DISAS_CLASS_METHOD:
|
||||
if (objc != 4) {
|
||||
Tcl_WrongNumArgs(interp, 2, objv, "className methodName");
|
||||
|
||||
@@ -3633,7 +3633,7 @@ InitializeEncodingSearchPath(
|
||||
if (*encodingPtr) {
|
||||
((Encoding *)(*encodingPtr))->refCount++;
|
||||
}
|
||||
bytes = Tcl_GetStringFromObj(searchPathObj, &numBytes);
|
||||
bytes = TclGetStringFromObj(searchPathObj, &numBytes);
|
||||
|
||||
*lengthPtr = numBytes;
|
||||
*valuePtr = ckalloc(numBytes + 1);
|
||||
|
||||
+250
-139
@@ -30,11 +30,10 @@ static int NsEnsembleStringOrder(const void *strPtr1,
|
||||
const void *strPtr2);
|
||||
static void DeleteEnsembleConfig(ClientData clientData);
|
||||
static void MakeCachedEnsembleCommand(Tcl_Obj *objPtr,
|
||||
EnsembleConfig *ensemblePtr,
|
||||
const char *subcmdName, Tcl_Obj *prefixObjPtr);
|
||||
EnsembleConfig *ensemblePtr, Tcl_HashEntry *hPtr,
|
||||
Tcl_Obj *fix);
|
||||
static void FreeEnsembleCmdRep(Tcl_Obj *objPtr);
|
||||
static void DupEnsembleCmdRep(Tcl_Obj *objPtr, Tcl_Obj *copyPtr);
|
||||
static void StringOfEnsembleCmdRep(Tcl_Obj *objPtr);
|
||||
static void CompileToInvokedCommand(Tcl_Interp *interp,
|
||||
Tcl_Parse *parsePtr, Tcl_Obj *replacements,
|
||||
Command *cmdPtr, CompileEnv *envPtr);
|
||||
@@ -42,6 +41,8 @@ static int CompileBasicNArgCommand(Tcl_Interp *interp,
|
||||
Tcl_Parse *parsePtr, Command *cmdPtr,
|
||||
CompileEnv *envPtr);
|
||||
|
||||
static Tcl_NRPostProc FreeER;
|
||||
|
||||
/*
|
||||
* The lists of subcommands and options for the [namespace ensemble] command.
|
||||
*/
|
||||
@@ -77,14 +78,30 @@ enum EnsConfigOpts {
|
||||
* that implements it.
|
||||
*/
|
||||
|
||||
const Tcl_ObjType tclEnsembleCmdType = {
|
||||
static const Tcl_ObjType ensembleCmdType = {
|
||||
"ensembleCommand", /* the type's name */
|
||||
FreeEnsembleCmdRep, /* freeIntRepProc */
|
||||
DupEnsembleCmdRep, /* dupIntRepProc */
|
||||
StringOfEnsembleCmdRep, /* updateStringProc */
|
||||
NULL, /* updateStringProc */
|
||||
NULL /* setFromAnyProc */
|
||||
};
|
||||
|
||||
/*
|
||||
* The internal rep for caching ensemble subcommand lookups and
|
||||
* spell corrections.
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
int epoch; /* Used to confirm when the data in this
|
||||
* really structure matches up with the
|
||||
* ensemble. */
|
||||
Command *token; /* Reference to the command for which this
|
||||
* structure is a cache of the resolution. */
|
||||
Tcl_Obj *fix; /* Corrected spelling, if needed. */
|
||||
Tcl_HashEntry *hPtr; /* Direct link to entry in the subcommand
|
||||
* hash table. */
|
||||
} EnsembleCmdRep;
|
||||
|
||||
|
||||
static inline Tcl_Obj *
|
||||
NewNsObj(
|
||||
@@ -1643,6 +1660,8 @@ NsEnsembleImplementationCmdNR(
|
||||
* names. */
|
||||
int reparseCount = 0; /* Number of reparses. */
|
||||
Tcl_Obj *errorObj; /* Used for building error messages. */
|
||||
Tcl_Obj *subObj;
|
||||
int subIdx;
|
||||
|
||||
/*
|
||||
* Must recheck objc, since numParameters might have changed. Cf. test
|
||||
@@ -1650,24 +1669,18 @@ NsEnsembleImplementationCmdNR(
|
||||
*/
|
||||
|
||||
restartEnsembleParse:
|
||||
if (objc < 2 + ensemblePtr->numParameters) {
|
||||
subIdx = 1 + ensemblePtr->numParameters;
|
||||
if (objc < subIdx + 1) {
|
||||
/*
|
||||
* We don't have a subcommand argument. Make error message.
|
||||
*/
|
||||
|
||||
Tcl_DString buf; /* Message being built */
|
||||
Tcl_Obj **elemPtrs; /* Parameter names */
|
||||
int len; /* Number of parameters to append */
|
||||
|
||||
Tcl_DStringInit(&buf);
|
||||
if (ensemblePtr->parameterList == NULL) {
|
||||
len = 0;
|
||||
} else if (TclListObjGetElements(NULL, ensemblePtr->parameterList,
|
||||
&len, &elemPtrs) != TCL_OK) {
|
||||
Tcl_Panic("List of ensemble parameters is not a list");
|
||||
}
|
||||
for (; len>0; len--,elemPtrs++) {
|
||||
TclDStringAppendObj(&buf, *elemPtrs);
|
||||
if (ensemblePtr->parameterList) {
|
||||
Tcl_DStringAppend(&buf,
|
||||
TclGetString(ensemblePtr->parameterList), -1);
|
||||
TclDStringAppendLiteral(&buf, " ");
|
||||
}
|
||||
TclDStringAppendLiteral(&buf, "subcommand ?arg ...?");
|
||||
@@ -1695,6 +1708,8 @@ NsEnsembleImplementationCmdNR(
|
||||
* up in there and go straight to dispatch.
|
||||
*/
|
||||
|
||||
subObj = objv[subIdx];
|
||||
|
||||
if (ensemblePtr->epoch == ensemblePtr->nsPtr->exportLookupEpoch) {
|
||||
/*
|
||||
* Table of subcommands is still valid; therefore there might be a
|
||||
@@ -1703,15 +1718,16 @@ NsEnsembleImplementationCmdNR(
|
||||
* part where we do the invocation of the subcommand.
|
||||
*/
|
||||
|
||||
if (objv[1+ensemblePtr->numParameters]->typePtr==&tclEnsembleCmdType){
|
||||
EnsembleCmdRep *ensembleCmd = objv[1+ensemblePtr->numParameters]
|
||||
->internalRep.twoPtrValue.ptr1;
|
||||
if (subObj->typePtr==&ensembleCmdType){
|
||||
EnsembleCmdRep *ensembleCmd = subObj->internalRep.twoPtrValue.ptr1;
|
||||
|
||||
if (ensembleCmd->nsPtr == ensemblePtr->nsPtr &&
|
||||
ensembleCmd->epoch == ensemblePtr->epoch &&
|
||||
ensembleCmd->token == ensemblePtr->token) {
|
||||
prefixObj = ensembleCmd->realPrefixObj;
|
||||
if (ensembleCmd->epoch == ensemblePtr->epoch &&
|
||||
ensembleCmd->token == (Command *)ensemblePtr->token) {
|
||||
prefixObj = Tcl_GetHashValue(ensembleCmd->hPtr);
|
||||
Tcl_IncrRefCount(prefixObj);
|
||||
if (ensembleCmd->fix) {
|
||||
TclSpellFix(interp, objv, objc, subIdx, subObj, ensembleCmd->fix);
|
||||
}
|
||||
goto runResultingSubcommand;
|
||||
}
|
||||
}
|
||||
@@ -1726,18 +1742,14 @@ NsEnsembleImplementationCmdNR(
|
||||
*/
|
||||
|
||||
hPtr = Tcl_FindHashEntry(&ensemblePtr->subcommandTable,
|
||||
TclGetString(objv[1 + ensemblePtr->numParameters]));
|
||||
TclGetString(subObj));
|
||||
if (hPtr != NULL) {
|
||||
char *fullName = Tcl_GetHashKey(&ensemblePtr->subcommandTable, hPtr);
|
||||
|
||||
prefixObj = Tcl_GetHashValue(hPtr);
|
||||
|
||||
/*
|
||||
* Cache for later in the subcommand object.
|
||||
*/
|
||||
|
||||
MakeCachedEnsembleCommand(objv[1 + ensemblePtr->numParameters],
|
||||
ensemblePtr, fullName, prefixObj);
|
||||
MakeCachedEnsembleCommand(subObj, ensemblePtr, hPtr, NULL);
|
||||
} else if (!(ensemblePtr->flags & TCL_ENSEMBLE_PREFIX)) {
|
||||
/*
|
||||
* Could not map, no prefixing, go to unknown/error handling.
|
||||
@@ -1757,9 +1769,9 @@ NsEnsembleImplementationCmdNR(
|
||||
char *fullName = NULL; /* Full name of the subcommand. */
|
||||
int stringLength, i;
|
||||
int tableLength = ensemblePtr->subcommandTable.numEntries;
|
||||
Tcl_Obj *fix;
|
||||
|
||||
subcmdName = TclGetString(objv[1 + ensemblePtr->numParameters]);
|
||||
stringLength = objv[1 + ensemblePtr->numParameters]->length;
|
||||
subcmdName = TclGetStringFromObj(subObj, &stringLength);
|
||||
for (i=0 ; i<tableLength ; i++) {
|
||||
register int cmp = strncmp(subcmdName,
|
||||
ensemblePtr->subcommandArrayPtr[i],
|
||||
@@ -1799,16 +1811,22 @@ NsEnsembleImplementationCmdNR(
|
||||
Tcl_Panic("full name %s not found in supposedly synchronized hash",
|
||||
fullName);
|
||||
}
|
||||
prefixObj = Tcl_GetHashValue(hPtr);
|
||||
|
||||
/*
|
||||
* Record the spelling correction for usage message.
|
||||
*/
|
||||
|
||||
fix = Tcl_NewStringObj(fullName, -1);
|
||||
|
||||
/*
|
||||
* Cache for later in the subcommand object.
|
||||
*/
|
||||
|
||||
MakeCachedEnsembleCommand(objv[1 + ensemblePtr->numParameters],
|
||||
ensemblePtr, fullName, prefixObj);
|
||||
MakeCachedEnsembleCommand(subObj, ensemblePtr, hPtr, fix);
|
||||
TclSpellFix(interp, objv, objc, subIdx, subObj, fix);
|
||||
}
|
||||
|
||||
prefixObj = Tcl_GetHashValue(hPtr);
|
||||
Tcl_IncrRefCount(prefixObj);
|
||||
runResultingSubcommand:
|
||||
|
||||
@@ -1827,46 +1845,26 @@ NsEnsembleImplementationCmdNR(
|
||||
*/
|
||||
|
||||
{
|
||||
Tcl_Obj **prefixObjv; /* The list of objects to substitute in as the
|
||||
* target command prefix. */
|
||||
Tcl_Obj *copyPtr; /* The actual list of words to dispatch to.
|
||||
* Will be freed by the dispatch engine. */
|
||||
int prefixObjc, copyObjc;
|
||||
Tcl_Obj **copyObjv;
|
||||
int copyObjc, prefixObjc;
|
||||
|
||||
/*
|
||||
* Get the prefix that we're rewriting to. To do this we need to
|
||||
* ensure that the internal representation of the list does not change
|
||||
* so that we can safely keep the internal representations of the
|
||||
* elements in the list.
|
||||
*
|
||||
* TODO: Use conventional list operations to make this code sane!
|
||||
*/
|
||||
Tcl_ListObjLength(NULL, prefixObj, &prefixObjc);
|
||||
|
||||
TclListObjGetElements(NULL, prefixObj, &prefixObjc, &prefixObjv);
|
||||
|
||||
copyObjc = objc - 2 + prefixObjc;
|
||||
copyPtr = Tcl_NewListObj(copyObjc, NULL);
|
||||
if (copyObjc > 0) {
|
||||
register Tcl_Obj **copyObjv;
|
||||
/* Space used to construct the list of
|
||||
* arguments to pass to the command that
|
||||
* implements the ensemble subcommand. */
|
||||
register List *listRepPtr = copyPtr->internalRep.twoPtrValue.ptr1;
|
||||
register int i;
|
||||
|
||||
listRepPtr->elemCount = copyObjc;
|
||||
copyObjv = &listRepPtr->elements;
|
||||
memcpy(copyObjv, prefixObjv, sizeof(Tcl_Obj *) * prefixObjc);
|
||||
memcpy(copyObjv+prefixObjc, objv+1,
|
||||
sizeof(Tcl_Obj *) * ensemblePtr->numParameters);
|
||||
memcpy(copyObjv+prefixObjc+ensemblePtr->numParameters,
|
||||
objv+ensemblePtr->numParameters+2,
|
||||
sizeof(Tcl_Obj *) * (objc-ensemblePtr->numParameters-2));
|
||||
|
||||
for (i=0; i < copyObjc; i++) {
|
||||
Tcl_IncrRefCount(copyObjv[i]);
|
||||
}
|
||||
if (objc == 2) {
|
||||
copyPtr = TclListObjCopy(NULL, prefixObj);
|
||||
} else {
|
||||
copyPtr = Tcl_NewListObj(objc - 2 + prefixObjc, NULL);
|
||||
Tcl_ListObjAppendList(NULL, copyPtr, prefixObj);
|
||||
Tcl_ListObjReplace(NULL, copyPtr, LIST_MAX, 0,
|
||||
ensemblePtr->numParameters, objv + 1);
|
||||
Tcl_ListObjReplace(NULL, copyPtr, LIST_MAX, 0,
|
||||
objc - 2 - ensemblePtr->numParameters,
|
||||
objv + 2 + ensemblePtr->numParameters);
|
||||
}
|
||||
Tcl_IncrRefCount(copyPtr);
|
||||
TclNRAddCallback(interp, TclNRReleaseValues, copyPtr, NULL, NULL, NULL);
|
||||
TclDecrRefCount(prefixObj);
|
||||
|
||||
/*
|
||||
@@ -1886,7 +1884,8 @@ NsEnsembleImplementationCmdNR(
|
||||
*/
|
||||
|
||||
TclSkipTailcall(interp);
|
||||
return TclNREvalObjEx(interp, copyPtr, TCL_EVAL_INVOKE, NULL,INT_MIN);
|
||||
Tcl_ListObjGetElements(NULL, copyPtr, ©Objc, ©Objv);
|
||||
return TclNREvalObjv(interp, copyObjc, copyObjv, TCL_EVAL_INVOKE, NULL);
|
||||
}
|
||||
|
||||
unknownOrAmbiguousSubcommand:
|
||||
@@ -1918,20 +1917,17 @@ NsEnsembleImplementationCmdNR(
|
||||
|
||||
Tcl_ResetResult(interp);
|
||||
Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "SUBCOMMAND",
|
||||
TclGetString(objv[1+ensemblePtr->numParameters]), NULL);
|
||||
TclGetString(subObj), NULL);
|
||||
if (ensemblePtr->subcommandTable.numEntries == 0) {
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"unknown subcommand \"%s\": namespace %s does not"
|
||||
" export any commands",
|
||||
TclGetString(objv[1+ensemblePtr->numParameters]),
|
||||
" export any commands", TclGetString(subObj),
|
||||
ensemblePtr->nsPtr->fullName));
|
||||
Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "SUBCOMMAND",
|
||||
TclGetString(objv[1+ensemblePtr->numParameters]), NULL);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
errorObj = Tcl_ObjPrintf("unknown%s subcommand \"%s\": must be ",
|
||||
(ensemblePtr->flags & TCL_ENSEMBLE_PREFIX ? " or ambiguous" : ""),
|
||||
TclGetString(objv[1+ensemblePtr->numParameters]));
|
||||
TclGetString(subObj));
|
||||
if (ensemblePtr->subcommandTable.numEntries == 1) {
|
||||
Tcl_AppendToObj(errorObj, ensemblePtr->subcommandArrayPtr[0], -1);
|
||||
} else {
|
||||
@@ -2037,6 +2033,149 @@ TclResetRewriteEnsemble(
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* TclSpellFix --
|
||||
*
|
||||
* Record a spelling correction that needs making in the
|
||||
* generation of the WrongNumArgs usage message.
|
||||
*
|
||||
* Results:
|
||||
* None.
|
||||
*
|
||||
* Side effects:
|
||||
* Can create an alternative ensemble rewrite structure.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static int
|
||||
FreeER(
|
||||
ClientData data[],
|
||||
Tcl_Interp *interp,
|
||||
int result)
|
||||
{
|
||||
Tcl_Obj **tmp = (Tcl_Obj **)data[0];
|
||||
|
||||
ckfree(tmp[2]);
|
||||
ckfree(tmp);
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
TclSpellFix(
|
||||
Tcl_Interp *interp,
|
||||
Tcl_Obj *const *objv,
|
||||
int objc,
|
||||
int badIdx,
|
||||
Tcl_Obj *bad,
|
||||
Tcl_Obj *fix)
|
||||
{
|
||||
Interp *iPtr = (Interp *) interp;
|
||||
Tcl_Obj *const *search;
|
||||
Tcl_Obj **store;
|
||||
int idx;
|
||||
int size;
|
||||
|
||||
if (iPtr->ensembleRewrite.sourceObjs == NULL) {
|
||||
iPtr->ensembleRewrite.sourceObjs = objv;
|
||||
iPtr->ensembleRewrite.numRemovedObjs = 0;
|
||||
iPtr->ensembleRewrite.numInsertedObjs = 0;
|
||||
}
|
||||
|
||||
/* Compute the valid length of the ensemble root */
|
||||
|
||||
size = iPtr->ensembleRewrite.numRemovedObjs + objc
|
||||
- iPtr->ensembleRewrite.numInsertedObjs;
|
||||
|
||||
search = iPtr->ensembleRewrite.sourceObjs;
|
||||
if (search[0] == NULL) {
|
||||
/* Awful casting abuse here */
|
||||
search = (Tcl_Obj *const *) search[1];
|
||||
}
|
||||
|
||||
if (badIdx < iPtr->ensembleRewrite.numInsertedObjs) {
|
||||
/*
|
||||
* Misspelled value was inserted. We cannot directly jump
|
||||
* to the bad value, but have to search.
|
||||
*/
|
||||
idx = 1;
|
||||
while (idx < size) {
|
||||
if (search[idx] == bad) {
|
||||
break;
|
||||
}
|
||||
idx++;
|
||||
}
|
||||
if (idx == size) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
/* Jump to the misspelled value. */
|
||||
idx = iPtr->ensembleRewrite.numRemovedObjs + badIdx
|
||||
- iPtr->ensembleRewrite.numInsertedObjs;
|
||||
|
||||
/* Verify */
|
||||
if (search[idx] != bad) {
|
||||
Tcl_Panic("SpellFix: programming error");
|
||||
}
|
||||
}
|
||||
|
||||
search = iPtr->ensembleRewrite.sourceObjs;
|
||||
if (search[0] == NULL) {
|
||||
store = (Tcl_Obj **)search[2];
|
||||
} else {
|
||||
Tcl_Obj **tmp = ckalloc(3 * sizeof(Tcl_Obj *));
|
||||
tmp[0] = NULL;
|
||||
tmp[1] = (Tcl_Obj *)iPtr->ensembleRewrite.sourceObjs;
|
||||
tmp[2] = (Tcl_Obj *)ckalloc(size * sizeof(Tcl_Obj *));
|
||||
memcpy(tmp[2], tmp[1], size*sizeof(Tcl_Obj *));
|
||||
|
||||
iPtr->ensembleRewrite.sourceObjs = (Tcl_Obj *const *) tmp;
|
||||
TclNRAddCallback(interp, FreeER, tmp, NULL, NULL, NULL);
|
||||
store = (Tcl_Obj **)tmp[2];
|
||||
}
|
||||
|
||||
store[idx] = fix;
|
||||
Tcl_IncrRefCount(fix);
|
||||
TclNRAddCallback(interp, TclNRReleaseValues, fix, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* TclFetchEnsembleRoot --
|
||||
*
|
||||
* Returns the root of ensemble rewriting, if any.
|
||||
* If no root exists, returns objv instead.
|
||||
*
|
||||
* Results:
|
||||
* None.
|
||||
*
|
||||
* Side effects:
|
||||
* None.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
Tcl_Obj *const *
|
||||
TclFetchEnsembleRoot(
|
||||
Tcl_Interp *interp,
|
||||
Tcl_Obj *const *objv,
|
||||
int objc,
|
||||
int *objcPtr)
|
||||
{
|
||||
Interp *iPtr = (Interp *) interp;
|
||||
|
||||
if (iPtr->ensembleRewrite.sourceObjs) {
|
||||
*objcPtr = objc + iPtr->ensembleRewrite.numRemovedObjs
|
||||
- iPtr->ensembleRewrite.numInsertedObjs;
|
||||
return iPtr->ensembleRewrite.sourceObjs;
|
||||
}
|
||||
*objcPtr = objc;
|
||||
return objv;
|
||||
}
|
||||
|
||||
/*
|
||||
* ----------------------------------------------------------------------
|
||||
*
|
||||
@@ -2202,17 +2341,17 @@ static void
|
||||
MakeCachedEnsembleCommand(
|
||||
Tcl_Obj *objPtr,
|
||||
EnsembleConfig *ensemblePtr,
|
||||
const char *subcommandName,
|
||||
Tcl_Obj *prefixObjPtr)
|
||||
Tcl_HashEntry *hPtr,
|
||||
Tcl_Obj *fix)
|
||||
{
|
||||
register EnsembleCmdRep *ensembleCmd;
|
||||
int length;
|
||||
|
||||
if (objPtr->typePtr == &tclEnsembleCmdType) {
|
||||
if (objPtr->typePtr == &ensembleCmdType) {
|
||||
ensembleCmd = objPtr->internalRep.twoPtrValue.ptr1;
|
||||
Tcl_DecrRefCount(ensembleCmd->realPrefixObj);
|
||||
TclNsDecrRefCount(ensembleCmd->nsPtr);
|
||||
ckfree(ensembleCmd->fullSubcmdName);
|
||||
TclCleanupCommandMacro(ensembleCmd->token);
|
||||
if (ensembleCmd->fix) {
|
||||
Tcl_DecrRefCount(ensembleCmd->fix);
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* Kill the old internal rep, and replace it with a brand new one of
|
||||
@@ -2222,22 +2361,21 @@ MakeCachedEnsembleCommand(
|
||||
TclFreeIntRep(objPtr);
|
||||
ensembleCmd = ckalloc(sizeof(EnsembleCmdRep));
|
||||
objPtr->internalRep.twoPtrValue.ptr1 = ensembleCmd;
|
||||
objPtr->typePtr = &tclEnsembleCmdType;
|
||||
objPtr->typePtr = &ensembleCmdType;
|
||||
}
|
||||
|
||||
/*
|
||||
* Populate the internal rep.
|
||||
*/
|
||||
|
||||
ensembleCmd->nsPtr = ensemblePtr->nsPtr;
|
||||
ensembleCmd->epoch = ensemblePtr->epoch;
|
||||
ensembleCmd->token = ensemblePtr->token;
|
||||
ensemblePtr->nsPtr->refCount++;
|
||||
ensembleCmd->realPrefixObj = prefixObjPtr;
|
||||
length = strlen(subcommandName)+1;
|
||||
ensembleCmd->fullSubcmdName = ckalloc(length);
|
||||
memcpy(ensembleCmd->fullSubcmdName, subcommandName, (unsigned) length);
|
||||
Tcl_IncrRefCount(ensembleCmd->realPrefixObj);
|
||||
ensembleCmd->token = (Command *) ensemblePtr->token;
|
||||
ensembleCmd->token->refCount++;
|
||||
if (fix) {
|
||||
Tcl_IncrRefCount(fix);
|
||||
}
|
||||
ensembleCmd->fix = fix;
|
||||
ensembleCmd->hPtr = hPtr;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2618,9 +2756,10 @@ FreeEnsembleCmdRep(
|
||||
{
|
||||
EnsembleCmdRep *ensembleCmd = objPtr->internalRep.twoPtrValue.ptr1;
|
||||
|
||||
Tcl_DecrRefCount(ensembleCmd->realPrefixObj);
|
||||
ckfree(ensembleCmd->fullSubcmdName);
|
||||
TclNsDecrRefCount(ensembleCmd->nsPtr);
|
||||
TclCleanupCommandMacro(ensembleCmd->token);
|
||||
if (ensembleCmd->fix) {
|
||||
Tcl_DecrRefCount(ensembleCmd->fix);
|
||||
}
|
||||
ckfree(ensembleCmd);
|
||||
objPtr->typePtr = NULL;
|
||||
}
|
||||
@@ -2650,48 +2789,17 @@ DupEnsembleCmdRep(
|
||||
{
|
||||
EnsembleCmdRep *ensembleCmd = objPtr->internalRep.twoPtrValue.ptr1;
|
||||
EnsembleCmdRep *ensembleCopy = ckalloc(sizeof(EnsembleCmdRep));
|
||||
int length = strlen(ensembleCmd->fullSubcmdName);
|
||||
|
||||
copyPtr->typePtr = &tclEnsembleCmdType;
|
||||
copyPtr->typePtr = &ensembleCmdType;
|
||||
copyPtr->internalRep.twoPtrValue.ptr1 = ensembleCopy;
|
||||
ensembleCopy->nsPtr = ensembleCmd->nsPtr;
|
||||
ensembleCopy->epoch = ensembleCmd->epoch;
|
||||
ensembleCopy->token = ensembleCmd->token;
|
||||
ensembleCopy->nsPtr->refCount++;
|
||||
ensembleCopy->realPrefixObj = ensembleCmd->realPrefixObj;
|
||||
Tcl_IncrRefCount(ensembleCopy->realPrefixObj);
|
||||
ensembleCopy->fullSubcmdName = ckalloc(length + 1);
|
||||
memcpy(ensembleCopy->fullSubcmdName, ensembleCmd->fullSubcmdName,
|
||||
(unsigned) length+1);
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* StringOfEnsembleCmdRep --
|
||||
*
|
||||
* Creates a string representation of a Tcl_Obj that holds a subcommand
|
||||
* of an ensemble.
|
||||
*
|
||||
* Results:
|
||||
* None.
|
||||
*
|
||||
* Side effects:
|
||||
* The object gains a string (UTF-8) representation.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static void
|
||||
StringOfEnsembleCmdRep(
|
||||
Tcl_Obj *objPtr)
|
||||
{
|
||||
EnsembleCmdRep *ensembleCmd = objPtr->internalRep.twoPtrValue.ptr1;
|
||||
int length = strlen(ensembleCmd->fullSubcmdName);
|
||||
|
||||
objPtr->length = length;
|
||||
objPtr->bytes = ckalloc(length + 1);
|
||||
memcpy(objPtr->bytes, ensembleCmd->fullSubcmdName, (unsigned) length+1);
|
||||
ensembleCopy->token->refCount++;
|
||||
ensembleCopy->fix = ensembleCmd->fix;
|
||||
if (ensembleCopy->fix) {
|
||||
Tcl_IncrRefCount(ensembleCopy->fix);
|
||||
}
|
||||
ensembleCopy->hPtr = ensembleCmd->hPtr;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2809,7 +2917,7 @@ TclCompileEnsemble(
|
||||
goto failed;
|
||||
}
|
||||
for (i=0 ; i<len ; i++) {
|
||||
str = Tcl_GetStringFromObj(elems[i], &sclen);
|
||||
str = TclGetStringFromObj(elems[i], &sclen);
|
||||
if ((sclen == (int) numBytes) && !memcmp(word, str, numBytes)) {
|
||||
/*
|
||||
* Exact match! Excellent!
|
||||
@@ -3198,7 +3306,7 @@ CompileToInvokedCommand(
|
||||
Tcl_Token *tokPtr;
|
||||
Tcl_Obj *objPtr, **words;
|
||||
char *bytes;
|
||||
int length, i, numWords, cmdLit;
|
||||
int length, i, numWords, cmdLit, extraLiteralFlags = LITERAL_CMD_NAME;
|
||||
DefineLineInformation;
|
||||
|
||||
/*
|
||||
@@ -3211,15 +3319,15 @@ CompileToInvokedCommand(
|
||||
for (i = 0, tokPtr = parsePtr->tokenPtr; i < parsePtr->numWords;
|
||||
i++, tokPtr = TokenAfter(tokPtr)) {
|
||||
if (i > 0 && i < numWords+1) {
|
||||
bytes = Tcl_GetStringFromObj(words[i-1], &length);
|
||||
bytes = TclGetStringFromObj(words[i-1], &length);
|
||||
PushLiteral(envPtr, bytes, length);
|
||||
continue;
|
||||
}
|
||||
|
||||
SetLineInformation(i);
|
||||
if (tokPtr->type == TCL_TOKEN_SIMPLE_WORD) {
|
||||
int literal = TclRegisterNewLiteral(envPtr,
|
||||
tokPtr[1].start, tokPtr[1].size);
|
||||
int literal = TclRegisterLiteral(envPtr,
|
||||
tokPtr[1].start, tokPtr[1].size, 0);
|
||||
|
||||
if (envPtr->clNext) {
|
||||
TclContinuationsEnterDerived(
|
||||
@@ -3241,7 +3349,10 @@ CompileToInvokedCommand(
|
||||
objPtr = Tcl_NewObj();
|
||||
Tcl_GetCommandFullName(interp, (Tcl_Command) cmdPtr, objPtr);
|
||||
bytes = Tcl_GetStringFromObj(objPtr, &length);
|
||||
cmdLit = TclRegisterNewCmdLiteral(envPtr, bytes, length);
|
||||
if ((cmdPtr != NULL) && (cmdPtr->flags & CMD_VIA_RESOLVER)) {
|
||||
extraLiteralFlags |= LITERAL_UNSHARED;
|
||||
}
|
||||
cmdLit = TclRegisterLiteral(envPtr, bytes, length, extraLiteralFlags);
|
||||
TclSetCmdNameObj(interp, TclFetchLiteral(envPtr, cmdLit), cmdPtr);
|
||||
TclEmitPush(cmdLit, envPtr);
|
||||
TclDecrRefCount(objPtr);
|
||||
|
||||
+67
-39
@@ -1554,7 +1554,7 @@ CompileExprObj(
|
||||
*/
|
||||
|
||||
if (compEnv.codeNext == compEnv.codeStart) {
|
||||
TclEmitPush(TclRegisterNewLiteral(&compEnv, "0", 1),
|
||||
TclEmitPush(TclRegisterLiteral(&compEnv, "0", 1, 0),
|
||||
&compEnv);
|
||||
}
|
||||
|
||||
@@ -2071,11 +2071,16 @@ TclNRExecuteByteCode(
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Push the callback for bytecode execution
|
||||
* Test namespace-50.9 demonstrates the need for this call.
|
||||
* Use a --enable-symbols=mem bug to see.
|
||||
*/
|
||||
|
||||
TclResetRewriteEnsemble(interp, 1);
|
||||
|
||||
/*
|
||||
* Push the callback for bytecode execution
|
||||
*/
|
||||
|
||||
TclNRAddCallback(interp, TEBCresume, TD, /* pc */ NULL,
|
||||
/* cleanup */ INT2PTR(0), NULL);
|
||||
return TCL_OK;
|
||||
@@ -3155,20 +3160,7 @@ TEBCresume(
|
||||
fflush(stdout);
|
||||
}
|
||||
#endif /*TCL_COMPILE_DEBUG*/
|
||||
{
|
||||
Tcl_Obj *copyPtr = Tcl_NewListObj(objc - opnd + 1, NULL);
|
||||
register List *listRepPtr = copyPtr->internalRep.twoPtrValue.ptr1;
|
||||
Tcl_Obj **copyObjv = &listRepPtr->elements;
|
||||
int i;
|
||||
|
||||
listRepPtr->elemCount = objc - opnd + 1;
|
||||
copyObjv[0] = objPtr;
|
||||
memcpy(copyObjv+1, objv+opnd, sizeof(Tcl_Obj *) * (objc - opnd));
|
||||
for (i=1 ; i<objc-opnd+1 ; i++) {
|
||||
Tcl_IncrRefCount(copyObjv[i]);
|
||||
}
|
||||
objPtr = copyPtr;
|
||||
}
|
||||
bcFramePtr->data.tebc.pc = (char *) pc;
|
||||
iPtr->cmdFramePtr = bcFramePtr;
|
||||
if (iPtr->flags & INTERP_DEBUG_FRAME) {
|
||||
@@ -3176,13 +3168,26 @@ TEBCresume(
|
||||
}
|
||||
|
||||
TclInitRewriteEnsemble(interp, opnd, 1, objv);
|
||||
|
||||
{
|
||||
Tcl_Obj *copyPtr = Tcl_NewListObj(objc - opnd + 1, NULL);
|
||||
|
||||
Tcl_ListObjAppendElement(NULL, copyPtr, objPtr);
|
||||
Tcl_ListObjReplace(NULL, copyPtr, LIST_MAX, 0,
|
||||
objc - opnd, objv + opnd);
|
||||
Tcl_DecrRefCount(objPtr);
|
||||
objPtr = copyPtr;
|
||||
}
|
||||
|
||||
DECACHE_STACK_INFO();
|
||||
pc += 6;
|
||||
TEBC_YIELD();
|
||||
|
||||
TclMarkTailcall(interp);
|
||||
TclNRAddCallback(interp, TclClearRootEnsemble, NULL,NULL,NULL,NULL);
|
||||
return TclNREvalObjEx(interp, objPtr, TCL_EVAL_INVOKE, NULL, INT_MIN);
|
||||
TclNRAddCallback(interp, TclClearRootEnsemble, NULL, NULL, NULL, NULL);
|
||||
Tcl_ListObjGetElements(NULL, objPtr, &objc, &objv);
|
||||
TclNRAddCallback(interp, TclNRReleaseValues, objPtr, NULL, NULL, NULL);
|
||||
return TclNREvalObjv(interp, objc, objv, TCL_EVAL_INVOKE, NULL);
|
||||
|
||||
/*
|
||||
* -----------------------------------------------------------------
|
||||
@@ -4415,8 +4420,8 @@ TEBCresume(
|
||||
savedNsPtr = iPtr->varFramePtr->nsPtr;
|
||||
iPtr->varFramePtr->nsPtr = (Namespace *) nsPtr;
|
||||
otherPtr = TclObjLookupVarEx(interp, OBJ_AT_TOS, NULL,
|
||||
(TCL_NAMESPACE_ONLY | TCL_LEAVE_ERR_MSG), "access",
|
||||
/*createPart1*/ 1, /*createPart2*/ 1, &varPtr);
|
||||
(TCL_NAMESPACE_ONLY|TCL_LEAVE_ERR_MSG|TCL_AVOID_RESOLVERS),
|
||||
"access", /*createPart1*/ 1, /*createPart2*/ 1, &varPtr);
|
||||
iPtr->varFramePtr->nsPtr = savedNsPtr;
|
||||
if (!otherPtr) {
|
||||
TRACE_ERROR(interp);
|
||||
@@ -5278,23 +5283,10 @@ TEBCresume(
|
||||
toIdx = objc-1;
|
||||
}
|
||||
if (fromIdx == 0 && toIdx != objc-1 && !Tcl_IsShared(valuePtr)) {
|
||||
/*
|
||||
* BEWARE! This is looking inside the implementation of the
|
||||
* list type.
|
||||
*/
|
||||
|
||||
List *listPtr = valuePtr->internalRep.twoPtrValue.ptr1;
|
||||
|
||||
if (listPtr->refCount == 1) {
|
||||
for (index=toIdx+1; index<objc ; index++) {
|
||||
TclDecrRefCount(objv[index]);
|
||||
}
|
||||
listPtr->elemCount = toIdx+1;
|
||||
listPtr->canonicalFlag = 1;
|
||||
TclInvalidateStringRep(valuePtr);
|
||||
TRACE_APPEND(("%.30s\n", O2S(valuePtr)));
|
||||
NEXT_INST_F(9, 0, 0);
|
||||
}
|
||||
Tcl_ListObjReplace(interp, valuePtr,
|
||||
toIdx + 1, LIST_MAX, 0, NULL);
|
||||
TRACE_APPEND(("%.30s\n", O2S(valuePtr)));
|
||||
NEXT_INST_F(9, 0, 0);
|
||||
}
|
||||
objResultPtr = Tcl_NewListObj(toIdx-fromIdx+1, objv+fromIdx);
|
||||
} else {
|
||||
@@ -5386,9 +5378,42 @@ TEBCresume(
|
||||
case INST_STR_NEQ: /* String (in)equality check */
|
||||
case INST_STR_CMP: /* String compare. */
|
||||
stringCompare:
|
||||
{
|
||||
ClientData ptr1;
|
||||
int type1;
|
||||
value2Ptr = OBJ_AT_TOS;
|
||||
valuePtr = OBJ_UNDER_TOS;
|
||||
|
||||
GetNumberFromObj(NULL, valuePtr, &ptr1, &type1);
|
||||
GetNumberFromObj(NULL, value2Ptr, &ptr1, &type1);
|
||||
|
||||
if (valuePtr->typePtr == &tclDoubleType
|
||||
|| valuePtr->typePtr == &tclIntType
|
||||
#ifndef TCL_WIDE_INT_IS_LONG
|
||||
|| valuePtr->typePtr == &tclWideIntType
|
||||
#endif
|
||||
|| valuePtr->typePtr == &tclBignumType
|
||||
) {
|
||||
valuePtr = Tcl_DuplicateObj(valuePtr);
|
||||
TclInvalidateStringRep(valuePtr);
|
||||
TclGetString(valuePtr);
|
||||
}
|
||||
|
||||
if (value2Ptr->typePtr == &tclDoubleType
|
||||
|| value2Ptr->typePtr == &tclIntType
|
||||
#ifndef TCL_WIDE_INT_IS_LONG
|
||||
|| value2Ptr->typePtr == &tclWideIntType
|
||||
#endif
|
||||
|| value2Ptr->typePtr == &tclBignumType
|
||||
) {
|
||||
value2Ptr = Tcl_DuplicateObj(value2Ptr);
|
||||
TclInvalidateStringRep(value2Ptr);
|
||||
TclGetString(value2Ptr);
|
||||
}
|
||||
|
||||
Tcl_IncrRefCount(valuePtr);
|
||||
Tcl_IncrRefCount(value2Ptr);
|
||||
|
||||
if (valuePtr == value2Ptr) {
|
||||
match = 0;
|
||||
} else {
|
||||
@@ -5509,7 +5534,10 @@ TEBCresume(
|
||||
|
||||
TRACE(("\"%.20s\" \"%.20s\" => %d\n", O2S(valuePtr), O2S(value2Ptr),
|
||||
(match < 0 ? -1 : match > 0 ? 1 : 0)));
|
||||
Tcl_DecrRefCount(valuePtr);
|
||||
Tcl_DecrRefCount(value2Ptr);
|
||||
JUMP_PEEPHOLE_F(match, 1, 2);
|
||||
}
|
||||
|
||||
case INST_STR_LEN:
|
||||
valuePtr = OBJ_AT_TOS;
|
||||
@@ -9828,7 +9856,7 @@ IllegalExprOperandType(
|
||||
|
||||
if (GetNumberFromObj(NULL, opndPtr, &ptr, &type) != TCL_OK) {
|
||||
int numBytes;
|
||||
const char *bytes = Tcl_GetStringFromObj(opndPtr, &numBytes);
|
||||
const char *bytes = TclGetStringFromObj(opndPtr, &numBytes);
|
||||
|
||||
if (numBytes == 0) {
|
||||
description = "empty string";
|
||||
@@ -10457,7 +10485,7 @@ EvalStatsCmd(
|
||||
if (entryPtr->objPtr->typePtr == &tclByteCodeType) {
|
||||
numByteCodeLits++;
|
||||
}
|
||||
(void) Tcl_GetStringFromObj(entryPtr->objPtr, &length);
|
||||
(void) TclGetStringFromObj(entryPtr->objPtr, &length);
|
||||
refCountSum += entryPtr->refCount;
|
||||
objBytesIfUnshared += (entryPtr->refCount * sizeof(Tcl_Obj));
|
||||
strBytesIfUnshared += (entryPtr->refCount * (length+1));
|
||||
@@ -10679,7 +10707,7 @@ EvalStatsCmd(
|
||||
Tcl_SetObjResult(interp, objPtr);
|
||||
} else {
|
||||
Tcl_Channel outChan;
|
||||
char *str = Tcl_GetStringFromObj(objv[1], &length);
|
||||
char *str = TclGetStringFromObj(objv[1], &length);
|
||||
|
||||
if (length) {
|
||||
if (strcmp(str, "stdout") == 0) {
|
||||
|
||||
+2
-8
@@ -1079,12 +1079,9 @@ TclFileAttrsCmd(
|
||||
}
|
||||
|
||||
if (Tcl_GetIndexFromObj(interp, objv[0], attributeStrings,
|
||||
"option", 0, &index) != TCL_OK) {
|
||||
"option", INDEX_TEMP_TABLE, &index) != TCL_OK) {
|
||||
goto end;
|
||||
}
|
||||
if (attributeStringsAllocated != NULL) {
|
||||
TclFreeIntRep(objv[0]);
|
||||
}
|
||||
if (Tcl_FSFileAttrsGet(interp, index, filePtr,
|
||||
&objPtr) != TCL_OK) {
|
||||
goto end;
|
||||
@@ -1107,12 +1104,9 @@ TclFileAttrsCmd(
|
||||
|
||||
for (i = 0; i < objc ; i += 2) {
|
||||
if (Tcl_GetIndexFromObj(interp, objv[i], attributeStrings,
|
||||
"option", 0, &index) != TCL_OK) {
|
||||
"option", INDEX_TEMP_TABLE, &index) != TCL_OK) {
|
||||
goto end;
|
||||
}
|
||||
if (attributeStringsAllocated != NULL) {
|
||||
TclFreeIntRep(objv[i]);
|
||||
}
|
||||
if (i + 1 == objc) {
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"value for \"%s\" missing", TclGetString(objv[i])));
|
||||
|
||||
+16
-16
@@ -387,7 +387,7 @@ TclpGetNativePathType(
|
||||
{
|
||||
Tcl_PathType type = TCL_PATH_ABSOLUTE;
|
||||
int pathLen;
|
||||
const char *path = Tcl_GetStringFromObj(pathPtr, &pathLen);
|
||||
const char *path = TclGetStringFromObj(pathPtr, &pathLen);
|
||||
|
||||
if (path[0] == '~') {
|
||||
/*
|
||||
@@ -578,7 +578,7 @@ Tcl_SplitPath(
|
||||
size = 1;
|
||||
for (i = 0; i < *argcPtr; i++) {
|
||||
Tcl_ListObjIndex(NULL, resultPtr, i, &eltPtr);
|
||||
Tcl_GetStringFromObj(eltPtr, &len);
|
||||
TclGetStringFromObj(eltPtr, &len);
|
||||
size += len + 1;
|
||||
}
|
||||
|
||||
@@ -597,7 +597,7 @@ Tcl_SplitPath(
|
||||
p = (char *) &(*argvPtr)[(*argcPtr) + 1];
|
||||
for (i = 0; i < *argcPtr; i++) {
|
||||
Tcl_ListObjIndex(NULL, resultPtr, i, &eltPtr);
|
||||
str = Tcl_GetStringFromObj(eltPtr, &len);
|
||||
str = TclGetStringFromObj(eltPtr, &len);
|
||||
memcpy(p, str, (size_t) len+1);
|
||||
p += len+1;
|
||||
}
|
||||
@@ -857,7 +857,7 @@ TclpNativeJoinPath(
|
||||
const char *p;
|
||||
const char *start;
|
||||
|
||||
start = Tcl_GetStringFromObj(prefix, &length);
|
||||
start = TclGetStringFromObj(prefix, &length);
|
||||
|
||||
/*
|
||||
* Remove the ./ from tilde prefixed elements, and drive-letter prefixed
|
||||
@@ -885,7 +885,7 @@ TclpNativeJoinPath(
|
||||
|
||||
if (length > 0 && (start[length-1] != '/')) {
|
||||
Tcl_AppendToObj(prefix, "/", 1);
|
||||
Tcl_GetStringFromObj(prefix, &length);
|
||||
TclGetStringFromObj(prefix, &length);
|
||||
}
|
||||
needsSep = 0;
|
||||
|
||||
@@ -921,7 +921,7 @@ TclpNativeJoinPath(
|
||||
if ((length > 0) &&
|
||||
(start[length-1] != '/') && (start[length-1] != ':')) {
|
||||
Tcl_AppendToObj(prefix, "/", 1);
|
||||
Tcl_GetStringFromObj(prefix, &length);
|
||||
TclGetStringFromObj(prefix, &length);
|
||||
}
|
||||
needsSep = 0;
|
||||
|
||||
@@ -1003,7 +1003,7 @@ Tcl_JoinPath(
|
||||
* Store the result.
|
||||
*/
|
||||
|
||||
resultStr = Tcl_GetStringFromObj(resultObj, &len);
|
||||
resultStr = TclGetStringFromObj(resultObj, &len);
|
||||
Tcl_DStringAppend(resultPtr, resultStr, len);
|
||||
Tcl_DecrRefCount(resultObj);
|
||||
|
||||
@@ -1249,7 +1249,7 @@ Tcl_GlobObjCmd(
|
||||
for (i = 1; i < objc; i++) {
|
||||
if (Tcl_GetIndexFromObj(interp, objv[i], options, "option", 0,
|
||||
&index) != TCL_OK) {
|
||||
string = Tcl_GetStringFromObj(objv[i], &length);
|
||||
string = TclGetStringFromObj(objv[i], &length);
|
||||
if (string[0] == '-') {
|
||||
/*
|
||||
* It looks like the command contains an option so signal an
|
||||
@@ -1357,7 +1357,7 @@ Tcl_GlobObjCmd(
|
||||
if (dir == PATH_GENERAL) {
|
||||
int pathlength;
|
||||
const char *last;
|
||||
const char *first = Tcl_GetStringFromObj(pathOrDir,&pathlength);
|
||||
const char *first = TclGetStringFromObj(pathOrDir,&pathlength);
|
||||
|
||||
/*
|
||||
* Find the last path separator in the path
|
||||
@@ -1460,7 +1460,7 @@ Tcl_GlobObjCmd(
|
||||
const char *str;
|
||||
|
||||
Tcl_ListObjIndex(interp, typePtr, length, &look);
|
||||
str = Tcl_GetStringFromObj(look, &len);
|
||||
str = TclGetStringFromObj(look, &len);
|
||||
if (strcmp("readonly", str) == 0) {
|
||||
globTypes->perm |= TCL_GLOB_PERM_RONLY;
|
||||
} else if (strcmp("hidden", str) == 0) {
|
||||
@@ -1992,7 +1992,7 @@ TclGlob(
|
||||
Tcl_Panic("Called TclGlob with TCL_GLOBMODE_TAILS and pathPrefix==NULL");
|
||||
}
|
||||
|
||||
pre = Tcl_GetStringFromObj(pathPrefix, &prefixLen);
|
||||
pre = TclGetStringFromObj(pathPrefix, &prefixLen);
|
||||
if (prefixLen > 0
|
||||
&& (strchr(separators, pre[prefixLen-1]) == NULL)) {
|
||||
/*
|
||||
@@ -2010,7 +2010,7 @@ TclGlob(
|
||||
Tcl_ListObjGetElements(NULL, filenamesObj, &objc, &objv);
|
||||
for (i = 0; i< objc; i++) {
|
||||
int len;
|
||||
const char *oldStr = Tcl_GetStringFromObj(objv[i], &len);
|
||||
const char *oldStr = TclGetStringFromObj(objv[i], &len);
|
||||
Tcl_Obj *elem;
|
||||
|
||||
if (len == prefixLen) {
|
||||
@@ -2362,7 +2362,7 @@ DoGlob(
|
||||
Tcl_Obj *fixme, *newObj;
|
||||
|
||||
Tcl_ListObjIndex(NULL, matchesObj, repair, &fixme);
|
||||
bytes = Tcl_GetStringFromObj(fixme, &numBytes);
|
||||
bytes = TclGetStringFromObj(fixme, &numBytes);
|
||||
newObj = Tcl_NewStringObj(bytes+2, numBytes-2);
|
||||
Tcl_ListObjReplace(NULL, matchesObj, repair, 1,
|
||||
1, &newObj);
|
||||
@@ -2400,7 +2400,7 @@ DoGlob(
|
||||
Tcl_DStringAppend(&append, pattern, p-pattern);
|
||||
|
||||
if (pathPtr != NULL) {
|
||||
(void) Tcl_GetStringFromObj(pathPtr, &length);
|
||||
(void) TclGetStringFromObj(pathPtr, &length);
|
||||
} else {
|
||||
length = 0;
|
||||
}
|
||||
@@ -2446,7 +2446,7 @@ DoGlob(
|
||||
*/
|
||||
|
||||
int len;
|
||||
const char *joined = Tcl_GetStringFromObj(joinedPtr,&len);
|
||||
const char *joined = TclGetStringFromObj(joinedPtr,&len);
|
||||
|
||||
if (strchr(separators, joined[len-1]) == NULL) {
|
||||
Tcl_AppendToObj(joinedPtr, "/", 1);
|
||||
@@ -2483,7 +2483,7 @@ DoGlob(
|
||||
*/
|
||||
|
||||
int len;
|
||||
const char *joined = Tcl_GetStringFromObj(joinedPtr,&len);
|
||||
const char *joined = TclGetStringFromObj(joinedPtr,&len);
|
||||
|
||||
if (strchr(separators, joined[len-1]) == NULL) {
|
||||
if (Tcl_FSGetPathType(pathPtr) != TCL_PATH_VOLUME_RELATIVE) {
|
||||
|
||||
+6
-6
@@ -43,7 +43,7 @@
|
||||
|
||||
static Tcl_HashEntry * AllocArrayEntry(Tcl_HashTable *tablePtr, void *keyPtr);
|
||||
static int CompareArrayKeys(void *keyPtr, Tcl_HashEntry *hPtr);
|
||||
static unsigned int HashArrayKey(Tcl_HashTable *tablePtr, void *keyPtr);
|
||||
static TCL_HASH_TYPE HashArrayKey(Tcl_HashTable *tablePtr, void *keyPtr);
|
||||
|
||||
/*
|
||||
* Prototypes for the one word hash key methods. Not actually declared because
|
||||
@@ -65,7 +65,7 @@ static unsigned int HashOneWordKey(Tcl_HashTable *tablePtr, void *keyPtr);
|
||||
static Tcl_HashEntry * AllocStringEntry(Tcl_HashTable *tablePtr,
|
||||
void *keyPtr);
|
||||
static int CompareStringKeys(void *keyPtr, Tcl_HashEntry *hPtr);
|
||||
static unsigned int HashStringKey(Tcl_HashTable *tablePtr, void *keyPtr);
|
||||
static TCL_HASH_TYPE HashStringKey(Tcl_HashTable *tablePtr, void *keyPtr);
|
||||
|
||||
/*
|
||||
* Function prototypes for static functions in this file:
|
||||
@@ -774,7 +774,7 @@ CompareArrayKeys(
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static unsigned int
|
||||
static TCL_HASH_TYPE
|
||||
HashArrayKey(
|
||||
Tcl_HashTable *tablePtr, /* Hash table. */
|
||||
void *keyPtr) /* Key from which to compute hash value. */
|
||||
@@ -787,7 +787,7 @@ HashArrayKey(
|
||||
count--, array++) {
|
||||
result += *array;
|
||||
}
|
||||
return result;
|
||||
return (TCL_HASH_TYPE) result;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -870,7 +870,7 @@ CompareStringKeys(
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static unsigned
|
||||
static TCL_HASH_TYPE
|
||||
HashStringKey(
|
||||
Tcl_HashTable *tablePtr, /* Hash table. */
|
||||
void *keyPtr) /* Key from which to compute hash value. */
|
||||
@@ -916,7 +916,7 @@ HashStringKey(
|
||||
result += (result << 3) + UCHAR(c);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
return (TCL_HASH_TYPE) result;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+73
-86
@@ -313,15 +313,20 @@ static int WillRead(Channel *chanPtr);
|
||||
&& (strncmp(optionName, (nameString), len) == 0))
|
||||
|
||||
/*
|
||||
* The ChannelObjType type. We actually store the ChannelState structure
|
||||
* as that lives longest and we want to return the bottomChanPtr when
|
||||
* requested (consistent with Tcl_GetChannel). The setFromAny and
|
||||
* updateString can be NULL as they should not be called.
|
||||
* The ChannelObjType type. Used to store the result of looking up
|
||||
* a channel name in the context of an interp. Saves the lookup
|
||||
* result and values needed to check its continued validity.
|
||||
*/
|
||||
|
||||
typedef struct ResolvedChanName {
|
||||
ChannelState *statePtr; /* The saved lookup result */
|
||||
Tcl_Interp *interp; /* The interp in which the lookup was done. */
|
||||
int epoch; /* The epoch of the channel when the lookup
|
||||
* was done. Use to verify validity. */
|
||||
int refCount; /* Share this struct among many Tcl_Obj. */
|
||||
} ResolvedChanName;
|
||||
|
||||
static void DupChannelIntRep(Tcl_Obj *objPtr, Tcl_Obj *copyPtr);
|
||||
static int SetChannelFromAny(Tcl_Interp *interp,
|
||||
Tcl_Obj *objPtr);
|
||||
static void FreeChannelIntRep(Tcl_Obj *objPtr);
|
||||
|
||||
static const Tcl_ObjType chanObjType = {
|
||||
@@ -329,18 +334,9 @@ static const Tcl_ObjType chanObjType = {
|
||||
FreeChannelIntRep, /* freeIntRepProc */
|
||||
DupChannelIntRep, /* dupIntRepProc */
|
||||
NULL, /* updateStringProc */
|
||||
NULL /* setFromAnyProc SetChannelFromAny */
|
||||
NULL /* setFromAnyProc */
|
||||
};
|
||||
|
||||
#define GET_CHANNELSTATE(objPtr) \
|
||||
((ChannelState *) (objPtr)->internalRep.twoPtrValue.ptr1)
|
||||
#define SET_CHANNELSTATE(objPtr, storePtr) \
|
||||
((objPtr)->internalRep.twoPtrValue.ptr1 = (void *) (storePtr))
|
||||
#define GET_CHANNELINTERP(objPtr) \
|
||||
((Tcl_Interp *) (objPtr)->internalRep.twoPtrValue.ptr2)
|
||||
#define SET_CHANNELINTERP(objPtr, storePtr) \
|
||||
((objPtr)->internalRep.twoPtrValue.ptr2 = (void *) (storePtr))
|
||||
|
||||
#define BUSY_STATE(st, fl) \
|
||||
((((st)->csPtrR) && ((fl) & TCL_READABLE)) || \
|
||||
(((st)->csPtrW) && ((fl) & TCL_WRITABLE)))
|
||||
@@ -1021,7 +1017,7 @@ DeleteChannelTable(
|
||||
*/
|
||||
|
||||
Tcl_DeleteHashEntry(hPtr);
|
||||
SetFlag(statePtr, CHANNEL_TAINTED);
|
||||
statePtr->epoch++;
|
||||
if (statePtr->refCount-- <= 1) {
|
||||
if (!GotFlag(statePtr, BG_FLUSH_SCHEDULED)) {
|
||||
(void) Tcl_Close(interp, (Tcl_Channel) chanPtr);
|
||||
@@ -1365,7 +1361,7 @@ DetachChannel(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
Tcl_DeleteHashEntry(hPtr);
|
||||
SetFlag(statePtr, CHANNEL_TAINTED);
|
||||
statePtr->epoch++;
|
||||
|
||||
/*
|
||||
* Remove channel handlers that refer to this interpreter, so that
|
||||
@@ -1498,12 +1494,57 @@ TclGetChannelFromObj(
|
||||
int flags)
|
||||
{
|
||||
ChannelState *statePtr;
|
||||
ResolvedChanName *resPtr = NULL;
|
||||
Tcl_Channel chan;
|
||||
|
||||
if (SetChannelFromAny(interp, objPtr) != TCL_OK) {
|
||||
if (interp == NULL) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
statePtr = GET_CHANNELSTATE(objPtr);
|
||||
if (objPtr->typePtr == &chanObjType) {
|
||||
/*
|
||||
* Confirm validity of saved lookup results.
|
||||
*/
|
||||
|
||||
resPtr = (ResolvedChanName *) objPtr->internalRep.twoPtrValue.ptr1;
|
||||
statePtr = resPtr->statePtr;
|
||||
if ((resPtr->interp == interp) /* Same interp context */
|
||||
/* No epoch change in channel since lookup */
|
||||
&& (resPtr->epoch == statePtr->epoch)) {
|
||||
|
||||
/* Have a valid saved lookup. Jump to end to return it. */
|
||||
goto valid;
|
||||
}
|
||||
}
|
||||
|
||||
chan = Tcl_GetChannel(interp, TclGetString(objPtr), NULL);
|
||||
|
||||
if (chan == NULL) {
|
||||
if (resPtr) {
|
||||
FreeChannelIntRep(objPtr);
|
||||
}
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
if (resPtr && resPtr->refCount == 1) {
|
||||
/* Re-use the ResolvedCmdName struct */
|
||||
Tcl_Release((ClientData) resPtr->statePtr);
|
||||
|
||||
} else {
|
||||
TclFreeIntRep(objPtr);
|
||||
|
||||
resPtr = (ResolvedChanName *) ckalloc(sizeof(ResolvedChanName));
|
||||
resPtr->refCount = 1;
|
||||
objPtr->internalRep.twoPtrValue.ptr1 = (ClientData) resPtr;
|
||||
objPtr->typePtr = &chanObjType;
|
||||
}
|
||||
statePtr = ((Channel *)chan)->state;
|
||||
resPtr->statePtr = statePtr;
|
||||
Tcl_Preserve((ClientData) statePtr);
|
||||
resPtr->interp = interp;
|
||||
resPtr->epoch = statePtr->epoch;
|
||||
|
||||
valid:
|
||||
*channelPtr = (Tcl_Channel) statePtr->bottomChanPtr;
|
||||
|
||||
if (modePtr != NULL) {
|
||||
@@ -1676,6 +1717,8 @@ Tcl_CreateChannel(
|
||||
statePtr->chanMsg = NULL;
|
||||
statePtr->unreportedMsg = NULL;
|
||||
|
||||
statePtr->epoch = 0;
|
||||
|
||||
/*
|
||||
* Link the channel into the list of all channels; create an on-exit
|
||||
* handler if there is not one already, to close off all the channels in
|
||||
@@ -11121,75 +11164,13 @@ DupChannelIntRep(
|
||||
register Tcl_Obj *copyPtr) /* Object with internal rep to set. Must not
|
||||
* currently have an internal rep.*/
|
||||
{
|
||||
ChannelState *statePtr = GET_CHANNELSTATE(srcPtr);
|
||||
ResolvedChanName *resPtr = srcPtr->internalRep.twoPtrValue.ptr1;
|
||||
|
||||
SET_CHANNELSTATE(copyPtr, statePtr);
|
||||
SET_CHANNELINTERP(copyPtr, GET_CHANNELINTERP(srcPtr));
|
||||
Tcl_Preserve(statePtr);
|
||||
resPtr->refCount++;
|
||||
copyPtr->internalRep.twoPtrValue.ptr1 = resPtr;
|
||||
copyPtr->typePtr = srcPtr->typePtr;
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* SetChannelFromAny --
|
||||
*
|
||||
* Create an internal representation of type "Channel" for an object.
|
||||
*
|
||||
* Results:
|
||||
* This operation always succeeds and returns TCL_OK.
|
||||
*
|
||||
* Side effects:
|
||||
* Any old internal reputation for objPtr is freed and the internal
|
||||
* representation is set to "Channel".
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static int
|
||||
SetChannelFromAny(
|
||||
Tcl_Interp *interp, /* Used for error reporting if not NULL. */
|
||||
register Tcl_Obj *objPtr) /* The object to convert. */
|
||||
{
|
||||
ChannelState *statePtr;
|
||||
|
||||
if (interp == NULL) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (objPtr->typePtr == &chanObjType) {
|
||||
/*
|
||||
* TODO: TAINT Flag and dup'd channel values?
|
||||
* The channel is valid until any call to DetachChannel occurs.
|
||||
* Ensure consistency checks are done.
|
||||
*/
|
||||
|
||||
statePtr = GET_CHANNELSTATE(objPtr);
|
||||
if (GotFlag(statePtr, CHANNEL_TAINTED|CHANNEL_CLOSED)) {
|
||||
ResetFlag(statePtr, CHANNEL_TAINTED);
|
||||
Tcl_Release(statePtr);
|
||||
objPtr->typePtr = NULL;
|
||||
} else if (interp != GET_CHANNELINTERP(objPtr)) {
|
||||
Tcl_Release(statePtr);
|
||||
objPtr->typePtr = NULL;
|
||||
}
|
||||
}
|
||||
if (objPtr->typePtr != &chanObjType) {
|
||||
Tcl_Channel chan = Tcl_GetChannel(interp, TclGetString(objPtr), NULL);
|
||||
|
||||
if (chan == NULL) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
TclFreeIntRep(objPtr);
|
||||
statePtr = ((Channel *) chan)->state;
|
||||
Tcl_Preserve(statePtr);
|
||||
SET_CHANNELSTATE(objPtr, statePtr);
|
||||
SET_CHANNELINTERP(objPtr, interp);
|
||||
objPtr->typePtr = &chanObjType;
|
||||
}
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
@@ -11210,8 +11191,14 @@ static void
|
||||
FreeChannelIntRep(
|
||||
Tcl_Obj *objPtr) /* Object with internal rep to free. */
|
||||
{
|
||||
Tcl_Release(GET_CHANNELSTATE(objPtr));
|
||||
ResolvedChanName *resPtr = objPtr->internalRep.twoPtrValue.ptr1;
|
||||
|
||||
objPtr->typePtr = NULL;
|
||||
if (--resPtr->refCount) {
|
||||
return;
|
||||
}
|
||||
Tcl_Release(resPtr->statePtr);
|
||||
ckfree(resPtr);
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
||||
+2
-4
@@ -214,6 +214,8 @@ typedef struct ChannelState {
|
||||
* because it happened in the background. The
|
||||
* value is the chanMg, if any. #219's
|
||||
* companion to 'unreportedError'. */
|
||||
int epoch; /* Used to test validity of stored channelname
|
||||
* lookup results. */
|
||||
} ChannelState;
|
||||
|
||||
/*
|
||||
@@ -275,10 +277,6 @@ typedef struct ChannelState {
|
||||
* usable, but it may not be closed
|
||||
* again from within the close
|
||||
* handler. */
|
||||
#define CHANNEL_TAINTED (1<<20) /* Channel stack structure has changed.
|
||||
* Used by Channel Tcl_Obj type to
|
||||
* determine if we have to revalidate
|
||||
* the channel. */
|
||||
#define CHANNEL_CLOSEDWRITE (1<<21) /* Channel write side has been closed.
|
||||
* No further Tcl-level write IO on
|
||||
* the channel is allowed. */
|
||||
|
||||
@@ -1946,7 +1946,7 @@ ReflectGetOption(
|
||||
goto error;
|
||||
} else {
|
||||
int len;
|
||||
const char *str = Tcl_GetStringFromObj(resObj, &len);
|
||||
const char *str = TclGetStringFromObj(resObj, &len);
|
||||
|
||||
if (len) {
|
||||
TclDStringAppendLiteral(dsPtr, " ");
|
||||
@@ -2319,7 +2319,7 @@ InvokeTclMethod(
|
||||
|
||||
if (result != TCL_ERROR) {
|
||||
int cmdLen;
|
||||
const char *cmdString = Tcl_GetStringFromObj(cmd, &cmdLen);
|
||||
const char *cmdString = TclGetStringFromObj(cmd, &cmdLen);
|
||||
|
||||
Tcl_IncrRefCount(cmd);
|
||||
Tcl_ResetResult(rcPtr->interp);
|
||||
@@ -3174,7 +3174,7 @@ ForwardProc(
|
||||
ForwardSetDynamicError(paramPtr, buf);
|
||||
} else {
|
||||
int len;
|
||||
const char *str = Tcl_GetStringFromObj(resObj, &len);
|
||||
const char *str = TclGetStringFromObj(resObj, &len);
|
||||
|
||||
if (len) {
|
||||
TclDStringAppendLiteral(paramPtr->getOpt.value, " ");
|
||||
@@ -3273,7 +3273,7 @@ ForwardSetObjError(
|
||||
Tcl_Obj *obj)
|
||||
{
|
||||
int len;
|
||||
const char *msgStr = Tcl_GetStringFromObj(obj, &len);
|
||||
const char *msgStr = TclGetStringFromObj(obj, &len);
|
||||
|
||||
len++;
|
||||
ForwardSetDynamicError(paramPtr, ckalloc(len));
|
||||
|
||||
@@ -2043,7 +2043,7 @@ InvokeTclMethod(
|
||||
if (result != TCL_ERROR) {
|
||||
Tcl_Obj *cmd = Tcl_NewListObj(cmdc, rtPtr->argv);
|
||||
int cmdLen;
|
||||
const char *cmdString = Tcl_GetStringFromObj(cmd, &cmdLen);
|
||||
const char *cmdString = TclGetStringFromObj(cmd, &cmdLen);
|
||||
|
||||
Tcl_IncrRefCount(cmd);
|
||||
Tcl_ResetResult(rtPtr->interp);
|
||||
@@ -2807,7 +2807,7 @@ ForwardSetObjError(
|
||||
Tcl_Obj *obj)
|
||||
{
|
||||
int len;
|
||||
const char *msgStr = Tcl_GetStringFromObj(obj, &len);
|
||||
const char *msgStr = TclGetStringFromObj(obj, &len);
|
||||
|
||||
len++;
|
||||
ForwardSetDynamicError(paramPtr, ckalloc(len));
|
||||
|
||||
+1
-1
@@ -197,7 +197,7 @@ TclCreateSocketAddress(
|
||||
*/
|
||||
|
||||
if (interp != NULL) {
|
||||
family = Tcl_GetVar(interp, "::tcl::unsupported::socketAF", 0);
|
||||
family = Tcl_GetVar2(interp, "::tcl::unsupported::socketAF", NULL, 0);
|
||||
if (family != NULL) {
|
||||
if (strcmp(family, "inet") == 0) {
|
||||
hints.ai_family = AF_INET;
|
||||
|
||||
+15
-16
@@ -71,8 +71,7 @@ typedef struct ThreadSpecificData {
|
||||
* Prototypes for functions defined later in this file.
|
||||
*/
|
||||
|
||||
static int EvalFileCallback(ClientData data[],
|
||||
Tcl_Interp *interp, int result);
|
||||
static Tcl_NRPostProc EvalFileCallback;
|
||||
static FilesystemRecord*FsGetFirstFilesystem(void);
|
||||
static void FsThrExitProc(ClientData cd);
|
||||
static Tcl_Obj * FsListMounts(Tcl_Obj *pathPtr, const char *pattern);
|
||||
@@ -545,8 +544,8 @@ TclFSCwdPointerEquals(
|
||||
int len1, len2;
|
||||
const char *str1, *str2;
|
||||
|
||||
str1 = Tcl_GetStringFromObj(tsdPtr->cwdPathPtr, &len1);
|
||||
str2 = Tcl_GetStringFromObj(*pathPtrPtr, &len2);
|
||||
str1 = TclGetStringFromObj(tsdPtr->cwdPathPtr, &len1);
|
||||
str2 = TclGetStringFromObj(*pathPtrPtr, &len2);
|
||||
if ((len1 == len2) && !memcmp(str1, str2, len1)) {
|
||||
/*
|
||||
* They are equal, but different objects. Update so they will be
|
||||
@@ -689,7 +688,7 @@ FsUpdateCwd(
|
||||
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&fsDataKey);
|
||||
|
||||
if (cwdObj != NULL) {
|
||||
str = Tcl_GetStringFromObj(cwdObj, &len);
|
||||
str = TclGetStringFromObj(cwdObj, &len);
|
||||
}
|
||||
|
||||
Tcl_MutexLock(&cwdMutex);
|
||||
@@ -1225,8 +1224,8 @@ FsAddMountsToGlobResult(
|
||||
if (norm != NULL) {
|
||||
const char *path, *mount;
|
||||
|
||||
mount = Tcl_GetStringFromObj(mElt, &mlen);
|
||||
path = Tcl_GetStringFromObj(norm, &len);
|
||||
mount = TclGetStringFromObj(mElt, &mlen);
|
||||
path = TclGetStringFromObj(norm, &len);
|
||||
if (path[len-1] == '/') {
|
||||
/*
|
||||
* Deal with the root of the volume.
|
||||
@@ -1817,7 +1816,7 @@ Tcl_FSEvalFileEx(
|
||||
oldScriptFile = iPtr->scriptFile;
|
||||
iPtr->scriptFile = pathPtr;
|
||||
Tcl_IncrRefCount(iPtr->scriptFile);
|
||||
string = Tcl_GetStringFromObj(objPtr, &length);
|
||||
string = TclGetStringFromObj(objPtr, &length);
|
||||
|
||||
/*
|
||||
* TIP #280 Force the evaluator to open a frame for a sourced file.
|
||||
@@ -1844,7 +1843,7 @@ Tcl_FSEvalFileEx(
|
||||
* Record information telling where the error occurred.
|
||||
*/
|
||||
|
||||
const char *pathString = Tcl_GetStringFromObj(pathPtr, &length);
|
||||
const char *pathString = TclGetStringFromObj(pathPtr, &length);
|
||||
int limit = 150;
|
||||
int overflow = (length > limit);
|
||||
|
||||
@@ -1995,7 +1994,7 @@ EvalFileCallback(
|
||||
*/
|
||||
|
||||
int length;
|
||||
const char *pathString = Tcl_GetStringFromObj(pathPtr, &length);
|
||||
const char *pathString = TclGetStringFromObj(pathPtr, &length);
|
||||
const int limit = 150;
|
||||
int overflow = (length > limit);
|
||||
|
||||
@@ -2847,8 +2846,8 @@ Tcl_FSGetCwd(
|
||||
int len1, len2;
|
||||
const char *str1, *str2;
|
||||
|
||||
str1 = Tcl_GetStringFromObj(tsdPtr->cwdPathPtr, &len1);
|
||||
str2 = Tcl_GetStringFromObj(norm, &len2);
|
||||
str1 = TclGetStringFromObj(tsdPtr->cwdPathPtr, &len1);
|
||||
str2 = TclGetStringFromObj(norm, &len2);
|
||||
if ((len1 == len2) && (strcmp(str1, str2) == 0)) {
|
||||
/*
|
||||
* If the paths were equal, we can be more efficient and
|
||||
@@ -4116,7 +4115,7 @@ TclGetPathType(
|
||||
* caller. */
|
||||
{
|
||||
int pathLen;
|
||||
const char *path = Tcl_GetStringFromObj(pathPtr, &pathLen);
|
||||
const char *path = TclGetStringFromObj(pathPtr, &pathLen);
|
||||
Tcl_PathType type;
|
||||
|
||||
type = TclFSNonnativePathType(path, pathLen, filesystemPtrPtr,
|
||||
@@ -4228,7 +4227,7 @@ TclFSNonnativePathType(
|
||||
|
||||
numVolumes--;
|
||||
Tcl_ListObjIndex(NULL, thisFsVolumes, numVolumes, &vol);
|
||||
strVol = Tcl_GetStringFromObj(vol,&len);
|
||||
strVol = TclGetStringFromObj(vol,&len);
|
||||
if (pathLen < len) {
|
||||
continue;
|
||||
}
|
||||
@@ -4575,8 +4574,8 @@ Tcl_FSRemoveDirectory(
|
||||
Tcl_Obj *normPath = Tcl_FSGetNormalizedPath(NULL, pathPtr);
|
||||
|
||||
if (normPath != NULL) {
|
||||
normPathStr = Tcl_GetStringFromObj(normPath, &normLen);
|
||||
cwdStr = Tcl_GetStringFromObj(cwdPtr, &cwdLen);
|
||||
normPathStr = TclGetStringFromObj(normPath, &normLen);
|
||||
cwdStr = TclGetStringFromObj(cwdPtr, &cwdLen);
|
||||
if ((cwdLen >= normLen) && (strncmp(normPathStr, cwdStr,
|
||||
(size_t) normLen) == 0)) {
|
||||
/*
|
||||
|
||||
+28
-35
@@ -114,14 +114,13 @@ Tcl_GetIndexFromObj(
|
||||
int flags, /* 0 or TCL_EXACT */
|
||||
int *indexPtr) /* Place to store resulting integer index. */
|
||||
{
|
||||
|
||||
/*
|
||||
* See if there is a valid cached result from a previous lookup (doing the
|
||||
* check here saves the overhead of calling Tcl_GetIndexFromObjStruct in
|
||||
* the common case where the result is cached).
|
||||
*/
|
||||
|
||||
if (objPtr->typePtr == &indexType) {
|
||||
if (!(flags & INDEX_TEMP_TABLE) && objPtr->typePtr == &indexType) {
|
||||
IndexRep *indexRep = objPtr->internalRep.twoPtrValue.ptr1;
|
||||
|
||||
/*
|
||||
@@ -211,13 +210,8 @@ GetIndexFromObjList(
|
||||
tablePtr[objc] = NULL;
|
||||
|
||||
result = Tcl_GetIndexFromObjStruct(interp, objPtr, tablePtr,
|
||||
sizeof(char *), msg, flags, indexPtr);
|
||||
sizeof(char *), msg, flags | INDEX_TEMP_TABLE, indexPtr);
|
||||
|
||||
/*
|
||||
* The internal rep must be cleared since tablePtr will go away.
|
||||
*/
|
||||
|
||||
TclFreeIntRep(objPtr);
|
||||
ckfree(tablePtr);
|
||||
|
||||
return result;
|
||||
@@ -279,7 +273,7 @@ Tcl_GetIndexFromObjStruct(
|
||||
* See if there is a valid cached result from a previous lookup.
|
||||
*/
|
||||
|
||||
if (objPtr->typePtr == &indexType) {
|
||||
if (!(flags & INDEX_TEMP_TABLE) && objPtr->typePtr == &indexType) {
|
||||
indexRep = objPtr->internalRep.twoPtrValue.ptr1;
|
||||
if (indexRep->tablePtr==tablePtr && indexRep->offset==offset) {
|
||||
*indexPtr = indexRep->index;
|
||||
@@ -340,17 +334,19 @@ Tcl_GetIndexFromObjStruct(
|
||||
* operation.
|
||||
*/
|
||||
|
||||
if (objPtr->typePtr == &indexType) {
|
||||
indexRep = objPtr->internalRep.twoPtrValue.ptr1;
|
||||
} else {
|
||||
TclFreeIntRep(objPtr);
|
||||
indexRep = ckalloc(sizeof(IndexRep));
|
||||
objPtr->internalRep.twoPtrValue.ptr1 = indexRep;
|
||||
objPtr->typePtr = &indexType;
|
||||
if (!(flags & INDEX_TEMP_TABLE)) {
|
||||
if (objPtr->typePtr == &indexType) {
|
||||
indexRep = objPtr->internalRep.twoPtrValue.ptr1;
|
||||
} else {
|
||||
TclFreeIntRep(objPtr);
|
||||
indexRep = ckalloc(sizeof(IndexRep));
|
||||
objPtr->internalRep.twoPtrValue.ptr1 = indexRep;
|
||||
objPtr->typePtr = &indexType;
|
||||
}
|
||||
indexRep->tablePtr = (void *) tablePtr;
|
||||
indexRep->offset = offset;
|
||||
indexRep->index = index;
|
||||
}
|
||||
indexRep->tablePtr = (void *) tablePtr;
|
||||
indexRep->offset = offset;
|
||||
indexRep->index = index;
|
||||
|
||||
*indexPtr = index;
|
||||
return TCL_OK;
|
||||
@@ -712,10 +708,10 @@ PrefixAllObjCmd(
|
||||
return result;
|
||||
}
|
||||
resultPtr = Tcl_NewListObj(0, NULL);
|
||||
string = Tcl_GetStringFromObj(objv[2], &length);
|
||||
string = TclGetStringFromObj(objv[2], &length);
|
||||
|
||||
for (t = 0; t < tableObjc; t++) {
|
||||
elemString = Tcl_GetStringFromObj(tableObjv[t], &elemLength);
|
||||
elemString = TclGetStringFromObj(tableObjv[t], &elemLength);
|
||||
|
||||
/*
|
||||
* A prefix cannot match if it is longest.
|
||||
@@ -768,13 +764,13 @@ PrefixLongestObjCmd(
|
||||
if (result != TCL_OK) {
|
||||
return result;
|
||||
}
|
||||
string = Tcl_GetStringFromObj(objv[2], &length);
|
||||
string = TclGetStringFromObj(objv[2], &length);
|
||||
|
||||
resultString = NULL;
|
||||
resultLength = 0;
|
||||
|
||||
for (t = 0; t < tableObjc; t++) {
|
||||
elemString = Tcl_GetStringFromObj(tableObjv[t], &elemLength);
|
||||
elemString = TclGetStringFromObj(tableObjv[t], &elemLength);
|
||||
|
||||
/*
|
||||
* First check if the prefix string matches the element. A prefix
|
||||
@@ -924,6 +920,14 @@ Tcl_WrongNumArgs(
|
||||
int toPrint = iPtr->ensembleRewrite.numRemovedObjs;
|
||||
Tcl_Obj *const *origObjv = iPtr->ensembleRewrite.sourceObjs;
|
||||
|
||||
/*
|
||||
* Check for spelling fixes, and substitute the fixed values.
|
||||
*/
|
||||
|
||||
if (origObjv[0] == NULL) {
|
||||
origObjv = (Tcl_Obj *const *)origObjv[2];
|
||||
}
|
||||
|
||||
/*
|
||||
* We only know how to do rewriting if all the replaced objects are
|
||||
* actually arguments (in objv) to this function. Otherwise it just
|
||||
@@ -957,12 +961,6 @@ Tcl_WrongNumArgs(
|
||||
|
||||
elementStr = EXPAND_OF(indexRep);
|
||||
elemLen = strlen(elementStr);
|
||||
} else if (origObjv[i]->typePtr == &tclEnsembleCmdType) {
|
||||
register EnsembleCmdRep *ecrPtr =
|
||||
origObjv[i]->internalRep.twoPtrValue.ptr1;
|
||||
|
||||
elementStr = ecrPtr->fullSubcmdName;
|
||||
elemLen = strlen(elementStr);
|
||||
} else {
|
||||
elementStr = TclGetStringFromObj(origObjv[i], &elemLen);
|
||||
}
|
||||
@@ -1011,11 +1009,6 @@ Tcl_WrongNumArgs(
|
||||
register IndexRep *indexRep = objv[i]->internalRep.twoPtrValue.ptr1;
|
||||
|
||||
Tcl_AppendStringsToObj(objPtr, EXPAND_OF(indexRep), NULL);
|
||||
} else if (objv[i]->typePtr == &tclEnsembleCmdType) {
|
||||
register EnsembleCmdRep *ecrPtr =
|
||||
objv[i]->internalRep.twoPtrValue.ptr1;
|
||||
|
||||
Tcl_AppendStringsToObj(objPtr, ecrPtr->fullSubcmdName, NULL);
|
||||
} else {
|
||||
/*
|
||||
* Quote the argument if it contains spaces (Bug 942757).
|
||||
@@ -1151,7 +1144,7 @@ Tcl_ParseArgsObjv(
|
||||
curArg = objv[srcIndex];
|
||||
srcIndex++;
|
||||
objc--;
|
||||
str = Tcl_GetStringFromObj(curArg, &length);
|
||||
str = TclGetStringFromObj(curArg, &length);
|
||||
if (length > 0) {
|
||||
c = str[1];
|
||||
} else {
|
||||
|
||||
@@ -1009,7 +1009,7 @@ declare 250 {
|
||||
# Allow extensions for optimization
|
||||
declare 251 {
|
||||
int TclRegisterLiteral(void *envPtr,
|
||||
char *bytes, int length, int flags)
|
||||
const char *bytes, int length, int flags)
|
||||
}
|
||||
|
||||
##############################################################################
|
||||
|
||||
+51
-29
@@ -25,6 +25,19 @@
|
||||
|
||||
#undef ACCEPT_NAN
|
||||
|
||||
/*
|
||||
* In Tcl 8.7, stop supporting special hacks for legacy Itcl 3.
|
||||
* Itcl 4 doesn't need them. Itcl 3 can be updated to not need them
|
||||
* using the Tcl(Init|Reset)RewriteEnsemble() routines in all Tcl 8.6+
|
||||
* releases. Perhaps Tcl 8.7 will add even better public interfaces
|
||||
* supporting all the re-invocation mechanisms extensions like Itcl 3
|
||||
* need. As an absolute last resort, folks who must make Itcl 3 work
|
||||
* unchanged with Tcl 8.7 can remove this line to regain the migration
|
||||
* support. Tcl 9 will no longer offer even that option.
|
||||
*/
|
||||
|
||||
#define AVOID_HACKS_FOR_ITCL 1
|
||||
|
||||
/*
|
||||
* Common include files needed by most of the Tcl source files are included
|
||||
* here, so that system-dependent personalizations for the include files only
|
||||
@@ -169,6 +182,21 @@ typedef struct Tcl_ResolverInfo {
|
||||
* at compile time. */
|
||||
} Tcl_ResolverInfo;
|
||||
|
||||
/*
|
||||
* This flag bit should not interfere with TCL_GLOBAL_ONLY,
|
||||
* TCL_NAMESPACE_ONLY, or TCL_LEAVE_ERR_MSG; it signals that the variable
|
||||
* lookup is performed for upvar (or similar) purposes, with slightly
|
||||
* different rules:
|
||||
* - Bug #696893 - variable is either proc-local or in the current
|
||||
* namespace; never follow the second (global) resolution path
|
||||
* - Bug #631741 - do not use special namespace or interp resolvers
|
||||
*
|
||||
* It should also not collide with the (deprecated) TCL_PARSE_PART1 flag
|
||||
* (Bug #835020)
|
||||
*/
|
||||
|
||||
#define TCL_AVOID_RESOLVERS 0x40000
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------
|
||||
* Data structures related to namespaces.
|
||||
@@ -389,27 +417,6 @@ struct NamespacePathEntry {
|
||||
#define TCL_CREATE_NS_IF_UNKNOWN 0x800
|
||||
#define TCL_FIND_ONLY_NS 0x1000
|
||||
|
||||
/*
|
||||
* The data cached in an ensemble subcommand's Tcl_Obj rep (reference in
|
||||
* twoPtrValue.ptr1 field). This structure is not shared between Tcl_Objs
|
||||
* referring to the same subcommand, even where one is a duplicate of another.
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
Namespace *nsPtr; /* The namespace backing the ensemble which
|
||||
* this is a subcommand of. */
|
||||
int epoch; /* Used to confirm when the data in this
|
||||
* really structure matches up with the
|
||||
* ensemble. */
|
||||
Tcl_Command token; /* Reference to the comamnd for which this
|
||||
* structure is a cache of the resolution. */
|
||||
char *fullSubcmdName; /* The full (local) name of the subcommand,
|
||||
* allocated with ckalloc(). */
|
||||
Tcl_Obj *realPrefixObj; /* Object containing the prefix words of the
|
||||
* command that implements this ensemble
|
||||
* subcommand. */
|
||||
} EnsembleCmdRep;
|
||||
|
||||
/*
|
||||
* The client data for an ensemble command. This consists of the table of
|
||||
* commands that are actually exported by the namespace, and an epoch counter
|
||||
@@ -1683,11 +1690,13 @@ typedef struct Command {
|
||||
* (these last two flags are defined in tcl.h)
|
||||
*/
|
||||
|
||||
#define CMD_IS_DELETED 0x1
|
||||
#define CMD_TRACE_ACTIVE 0x2
|
||||
#define CMD_HAS_EXEC_TRACES 0x4
|
||||
#define CMD_COMPILES_EXPANDED 0x8
|
||||
#define CMD_IS_DELETED 0x01
|
||||
#define CMD_TRACE_ACTIVE 0x02
|
||||
#define CMD_HAS_EXEC_TRACES 0x04
|
||||
#define CMD_COMPILES_EXPANDED 0x08
|
||||
#define CMD_REDEF_IN_PROGRESS 0x10
|
||||
#define CMD_VIA_RESOLVER 0x20
|
||||
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------
|
||||
@@ -2540,6 +2549,15 @@ typedef struct TclFileAttrProcs {
|
||||
TclSetFileAttrProc *setProc;/* The procedure for setting attrs. */
|
||||
} TclFileAttrProcs;
|
||||
|
||||
/*
|
||||
* Private flag value which controls Tcl_GetIndexFromObj*() routines
|
||||
* to instruct them not to cache lookups because the table will not
|
||||
* live long enough to make it worthwhile. Must not clash with public
|
||||
* flag value TCL_EXACT.
|
||||
*/
|
||||
|
||||
#define INDEX_TEMP_TABLE 2
|
||||
|
||||
/*
|
||||
* Opaque handle used in pipeline routines to encapsulate platform-dependent
|
||||
* state.
|
||||
@@ -2691,7 +2709,6 @@ MODULE_SCOPE const Tcl_ObjType tclListType;
|
||||
MODULE_SCOPE const Tcl_ObjType tclDictType;
|
||||
MODULE_SCOPE const Tcl_ObjType tclProcBodyType;
|
||||
MODULE_SCOPE const Tcl_ObjType tclStringType;
|
||||
MODULE_SCOPE const Tcl_ObjType tclArraySearchType;
|
||||
MODULE_SCOPE const Tcl_ObjType tclEnsembleCmdType;
|
||||
#ifndef TCL_WIDE_INT_IS_LONG
|
||||
MODULE_SCOPE const Tcl_ObjType tclWideIntType;
|
||||
@@ -2762,6 +2779,7 @@ MODULE_SCOPE Tcl_ObjCmdProc TclNRYieldObjCmd;
|
||||
MODULE_SCOPE Tcl_ObjCmdProc TclNRYieldmObjCmd;
|
||||
MODULE_SCOPE Tcl_ObjCmdProc TclNRYieldToObjCmd;
|
||||
MODULE_SCOPE Tcl_ObjCmdProc TclNRInvoke;
|
||||
MODULE_SCOPE Tcl_NRPostProc TclNRReleaseValues;
|
||||
|
||||
MODULE_SCOPE void TclSetTailcall(Tcl_Interp *interp, Tcl_Obj *tailcallPtr);
|
||||
MODULE_SCOPE void TclPushTailcallPoint(Tcl_Interp *interp);
|
||||
@@ -2872,8 +2890,7 @@ MODULE_SCOPE int TclCheckBadOctal(Tcl_Interp *interp,
|
||||
MODULE_SCOPE int TclChanCaughtErrorBypass(Tcl_Interp *interp,
|
||||
Tcl_Channel chan);
|
||||
MODULE_SCOPE Tcl_ObjCmdProc TclChannelNamesCmd;
|
||||
MODULE_SCOPE int TclClearRootEnsemble(ClientData data[],
|
||||
Tcl_Interp *interp, int result);
|
||||
MODULE_SCOPE Tcl_NRPostProc TclClearRootEnsemble;
|
||||
MODULE_SCOPE ContLineLoc *TclContinuationsEnter(Tcl_Obj *objPtr, int num,
|
||||
int *loc);
|
||||
MODULE_SCOPE void TclContinuationsEnterDerived(Tcl_Obj *objPtr,
|
||||
@@ -2909,6 +2926,8 @@ MODULE_SCOPE char * TclDStringAppendObj(Tcl_DString *dsPtr,
|
||||
MODULE_SCOPE char * TclDStringAppendDString(Tcl_DString *dsPtr,
|
||||
Tcl_DString *toAppendPtr);
|
||||
MODULE_SCOPE Tcl_Obj * TclDStringToObj(Tcl_DString *dsPtr);
|
||||
MODULE_SCOPE Tcl_Obj *const * TclFetchEnsembleRoot(Tcl_Interp *interp,
|
||||
Tcl_Obj *const *objv, int objc, int *objcPtr);
|
||||
MODULE_SCOPE void TclFinalizeAllocSubsystem(void);
|
||||
MODULE_SCOPE void TclFinalizeAsync(void);
|
||||
MODULE_SCOPE void TclFinalizeDoubleConversion(void);
|
||||
@@ -3111,6 +3130,9 @@ MODULE_SCOPE void TclSetDuplicateObj(Tcl_Obj *dupPtr, Tcl_Obj *objPtr);
|
||||
MODULE_SCOPE void TclSetProcessGlobalValue(ProcessGlobalValue *pgvPtr,
|
||||
Tcl_Obj *newValue, Tcl_Encoding encoding);
|
||||
MODULE_SCOPE void TclSignalExitThread(Tcl_ThreadId id, int result);
|
||||
MODULE_SCOPE void TclSpellFix(Tcl_Interp *interp,
|
||||
Tcl_Obj *const *objv, int objc, int subIdx,
|
||||
Tcl_Obj *bad, Tcl_Obj *fix);
|
||||
MODULE_SCOPE void * TclStackRealloc(Tcl_Interp *interp, void *ptr,
|
||||
int numBytes);
|
||||
MODULE_SCOPE int TclStringMatch(const char *str, int strLen,
|
||||
@@ -3965,7 +3987,7 @@ MODULE_SCOPE int TclObjCallVarTraces(Interp *iPtr, Var *arrayPtr,
|
||||
|
||||
MODULE_SCOPE int TclCompareObjKeys(void *keyPtr, Tcl_HashEntry *hPtr);
|
||||
MODULE_SCOPE void TclFreeObjEntry(Tcl_HashEntry *hPtr);
|
||||
MODULE_SCOPE unsigned TclHashObjKey(Tcl_HashTable *tablePtr, void *keyPtr);
|
||||
MODULE_SCOPE TCL_HASH_TYPE TclHashObjKey(Tcl_HashTable *tablePtr, void *keyPtr);
|
||||
|
||||
MODULE_SCOPE int TclFullFinalizationRequested(void);
|
||||
|
||||
|
||||
@@ -615,7 +615,7 @@ EXTERN char * TclDoubleDigits(double dv, int ndigits, int flags,
|
||||
EXTERN void TclSetSlaveCancelFlags(Tcl_Interp *interp, int flags,
|
||||
int force);
|
||||
/* 251 */
|
||||
EXTERN int TclRegisterLiteral(void *envPtr, char *bytes,
|
||||
EXTERN int TclRegisterLiteral(void *envPtr, const char *bytes,
|
||||
int length, int flags);
|
||||
|
||||
typedef struct TclIntStubs {
|
||||
@@ -873,7 +873,7 @@ typedef struct TclIntStubs {
|
||||
int (*tclCopyChannel) (Tcl_Interp *interp, Tcl_Channel inChan, Tcl_Channel outChan, Tcl_WideInt toRead, Tcl_Obj *cmdPtr); /* 248 */
|
||||
char * (*tclDoubleDigits) (double dv, int ndigits, int flags, int *decpt, int *signum, char **endPtr); /* 249 */
|
||||
void (*tclSetSlaveCancelFlags) (Tcl_Interp *interp, int flags, int force); /* 250 */
|
||||
int (*tclRegisterLiteral) (void *envPtr, char *bytes, int length, int flags); /* 251 */
|
||||
int (*tclRegisterLiteral) (void *envPtr, const char *bytes, int length, int flags); /* 251 */
|
||||
} TclIntStubs;
|
||||
|
||||
extern const TclIntStubs *tclIntStubsPtr;
|
||||
|
||||
+14
-19
@@ -336,7 +336,7 @@ Tcl_Init(
|
||||
Tcl_Interp *interp) /* Interpreter to initialize. */
|
||||
{
|
||||
if (tclPreInitScript != NULL) {
|
||||
if (Tcl_Eval(interp, tclPreInitScript) == TCL_ERROR) {
|
||||
if (Tcl_EvalEx(interp, tclPreInitScript, -1, 0) == TCL_ERROR) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
}
|
||||
@@ -382,7 +382,7 @@ Tcl_Init(
|
||||
* alternate tclInit command before calling Tcl_Init().
|
||||
*/
|
||||
|
||||
return Tcl_Eval(interp,
|
||||
return Tcl_EvalEx(interp,
|
||||
"if {[namespace which -command tclInit] eq \"\"} {\n"
|
||||
" proc tclInit {} {\n"
|
||||
" global tcl_libPath tcl_library env tclDefaultLibrary\n"
|
||||
@@ -444,7 +444,7 @@ Tcl_Init(
|
||||
" error $msg\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"tclInit");
|
||||
"tclInit", -1, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -660,14 +660,9 @@ NRInterpCmd(
|
||||
if (masterInterp == NULL) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (TclGetString(objv[5])[0] == '\0') {
|
||||
if (objc == 6) {
|
||||
return AliasDelete(interp, slaveInterp, objv[3]);
|
||||
}
|
||||
} else {
|
||||
return AliasCreate(interp, slaveInterp, masterInterp, objv[3],
|
||||
objv[5], objc - 6, objv + 6);
|
||||
}
|
||||
|
||||
return AliasCreate(interp, slaveInterp, masterInterp, objv[3],
|
||||
objv[5], objc - 6, objv + 6);
|
||||
}
|
||||
goto aliasArgs;
|
||||
}
|
||||
@@ -2368,7 +2363,7 @@ SlaveCreate(
|
||||
SlaveObjCmd, NRSlaveCmd, slaveInterp, SlaveObjCmdDeleteProc);
|
||||
Tcl_InitHashTable(&slavePtr->aliasTable, TCL_STRING_KEYS);
|
||||
Tcl_SetHashValue(hPtr, slavePtr);
|
||||
Tcl_SetVar(slaveInterp, "tcl_interactive", "0", TCL_GLOBAL_ONLY);
|
||||
Tcl_SetVar2(slaveInterp, "tcl_interactive", NULL, "0", TCL_GLOBAL_ONLY);
|
||||
|
||||
/*
|
||||
* Inherit the recursion limit.
|
||||
@@ -3195,8 +3190,8 @@ Tcl_MakeSafe(
|
||||
* Assume these functions all work. [Bug 2895741]
|
||||
*/
|
||||
|
||||
(void) Tcl_Eval(interp,
|
||||
"namespace eval ::tcl {namespace eval mathfunc {}}");
|
||||
(void) Tcl_EvalEx(interp,
|
||||
"namespace eval ::tcl {namespace eval mathfunc {}}", -1, 0);
|
||||
(void) Tcl_CreateAlias(interp, "::tcl::mathfunc::min", master,
|
||||
"::tcl::mathfunc::min", 0, NULL);
|
||||
(void) Tcl_CreateAlias(interp, "::tcl::mathfunc::max", master,
|
||||
@@ -4502,7 +4497,7 @@ SlaveCommandLimitCmd(
|
||||
switch ((enum Options) index) {
|
||||
case OPT_CMD:
|
||||
scriptObj = objv[i+1];
|
||||
(void) Tcl_GetStringFromObj(objv[i+1], &scriptLen);
|
||||
(void) TclGetStringFromObj(scriptObj, &scriptLen);
|
||||
break;
|
||||
case OPT_GRAN:
|
||||
granObj = objv[i+1];
|
||||
@@ -4519,7 +4514,7 @@ SlaveCommandLimitCmd(
|
||||
break;
|
||||
case OPT_VAL:
|
||||
limitObj = objv[i+1];
|
||||
(void) Tcl_GetStringFromObj(objv[i+1], &limitLen);
|
||||
(void) TclGetStringFromObj(objv[i+1], &limitLen);
|
||||
if (limitLen == 0) {
|
||||
break;
|
||||
}
|
||||
@@ -4711,7 +4706,7 @@ SlaveTimeLimitCmd(
|
||||
switch ((enum Options) index) {
|
||||
case OPT_CMD:
|
||||
scriptObj = objv[i+1];
|
||||
(void) Tcl_GetStringFromObj(objv[i+1], &scriptLen);
|
||||
(void) TclGetStringFromObj(objv[i+1], &scriptLen);
|
||||
break;
|
||||
case OPT_GRAN:
|
||||
granObj = objv[i+1];
|
||||
@@ -4728,7 +4723,7 @@ SlaveTimeLimitCmd(
|
||||
break;
|
||||
case OPT_MILLI:
|
||||
milliObj = objv[i+1];
|
||||
(void) Tcl_GetStringFromObj(objv[i+1], &milliLen);
|
||||
(void) TclGetStringFromObj(objv[i+1], &milliLen);
|
||||
if (milliLen == 0) {
|
||||
break;
|
||||
}
|
||||
@@ -4746,7 +4741,7 @@ SlaveTimeLimitCmd(
|
||||
break;
|
||||
case OPT_SEC:
|
||||
secObj = objv[i+1];
|
||||
(void) Tcl_GetStringFromObj(objv[i+1], &secLen);
|
||||
(void) TclGetStringFromObj(objv[i+1], &secLen);
|
||||
if (secLen == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
+1
-1
@@ -526,7 +526,7 @@ LinkTraceProc(
|
||||
break;
|
||||
|
||||
case TCL_LINK_STRING:
|
||||
value = Tcl_GetStringFromObj(valueObj, &valueLength);
|
||||
value = TclGetStringFromObj(valueObj, &valueLength);
|
||||
valueLength++;
|
||||
pp = (char **) linkPtr->addr;
|
||||
|
||||
|
||||
+32
-23
@@ -174,7 +174,7 @@ TclDeleteLiteralTable(
|
||||
Tcl_Obj *
|
||||
TclCreateLiteral(
|
||||
Interp *iPtr,
|
||||
char *bytes, /* The start of the string. Note that this is
|
||||
const char *bytes, /* The start of the string. Note that this is
|
||||
* not a NUL-terminated string. */
|
||||
int length, /* Number of bytes in the string. */
|
||||
unsigned hash, /* The string's hash. If -1, it will be
|
||||
@@ -214,7 +214,7 @@ TclCreateLiteral(
|
||||
if (globalPtrPtr) {
|
||||
*globalPtrPtr = globalPtr;
|
||||
}
|
||||
if (flags & LITERAL_ON_HEAP) {
|
||||
if ((flags & LITERAL_ON_HEAP)) {
|
||||
ckfree(bytes);
|
||||
}
|
||||
globalPtr->refCount++;
|
||||
@@ -222,26 +222,40 @@ TclCreateLiteral(
|
||||
}
|
||||
}
|
||||
if (!newPtr) {
|
||||
if (flags & LITERAL_ON_HEAP) {
|
||||
if ((flags & LITERAL_ON_HEAP)) {
|
||||
ckfree(bytes);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* The literal is new to the interpreter. Add it to the global literal
|
||||
* table.
|
||||
* The literal is new to the interpreter.
|
||||
*/
|
||||
|
||||
TclNewObj(objPtr);
|
||||
Tcl_IncrRefCount(objPtr);
|
||||
if (flags & LITERAL_ON_HEAP) {
|
||||
objPtr->bytes = bytes;
|
||||
if ((flags & LITERAL_ON_HEAP)) {
|
||||
objPtr->bytes = (char *) bytes;
|
||||
objPtr->length = length;
|
||||
} else {
|
||||
TclInitStringRep(objPtr, bytes, length);
|
||||
}
|
||||
|
||||
/* Should the new literal be shared globally? */
|
||||
|
||||
if ((flags & LITERAL_UNSHARED)) {
|
||||
/*
|
||||
* No, do *not* add it the global literal table
|
||||
* Make clear, that no global value is returned
|
||||
*/
|
||||
if (globalPtrPtr != NULL) {
|
||||
*globalPtrPtr = NULL;
|
||||
}
|
||||
return objPtr;
|
||||
}
|
||||
|
||||
/*
|
||||
* Yes, add it to the global literal table.
|
||||
*/
|
||||
#ifdef TCL_COMPILE_DEBUG
|
||||
if (LookupLiteralEntry((Tcl_Interp *) iPtr, objPtr) != NULL) {
|
||||
Tcl_Panic("%s: literal \"%.*s\" found globally but shouldn't be",
|
||||
@@ -251,6 +265,7 @@ TclCreateLiteral(
|
||||
|
||||
globalPtr = ckalloc(sizeof(LiteralEntry));
|
||||
globalPtr->objPtr = objPtr;
|
||||
Tcl_IncrRefCount(objPtr);
|
||||
globalPtr->refCount = 1;
|
||||
globalPtr->nsPtr = nsPtr;
|
||||
globalPtr->nextPtr = globalTablePtr->buckets[globalHash];
|
||||
@@ -360,7 +375,7 @@ int
|
||||
TclRegisterLiteral(
|
||||
void *ePtr, /* Points to the CompileEnv in whose object
|
||||
* array an object is found or created. */
|
||||
register char *bytes, /* Points to string for which to find or
|
||||
register const char *bytes, /* Points to string for which to find or
|
||||
* create an object in CompileEnv's object
|
||||
* array. */
|
||||
int length, /* Number of bytes in the string. If < 0, the
|
||||
@@ -398,7 +413,7 @@ TclRegisterLiteral(
|
||||
if ((objPtr->length == length) && ((length == 0)
|
||||
|| ((objPtr->bytes[0] == bytes[0])
|
||||
&& (memcmp(objPtr->bytes, bytes, (unsigned) length) == 0)))) {
|
||||
if (flags & LITERAL_ON_HEAP) {
|
||||
if ((flags & LITERAL_ON_HEAP)) {
|
||||
ckfree(bytes);
|
||||
}
|
||||
objIndex = (localPtr - envPtr->literalArrayPtr);
|
||||
@@ -417,7 +432,7 @@ TclRegisterLiteral(
|
||||
* the namespace as the interp's global NS.
|
||||
*/
|
||||
|
||||
if (flags & LITERAL_CMD_NAME) {
|
||||
if ((flags & LITERAL_CMD_NAME)) {
|
||||
if ((length >= 2) && (bytes[0] == ':') && (bytes[1] == ':')) {
|
||||
nsPtr = iPtr->globalNsPtr;
|
||||
} else {
|
||||
@@ -431,12 +446,13 @@ TclRegisterLiteral(
|
||||
* Is it in the interpreter's global literal table? If not, create it.
|
||||
*/
|
||||
|
||||
globalPtr = NULL;
|
||||
objPtr = TclCreateLiteral(iPtr, bytes, length, hash, &new, nsPtr, flags,
|
||||
&globalPtr);
|
||||
objIndex = AddLocalLiteralEntry(envPtr, objPtr, localHash);
|
||||
|
||||
#ifdef TCL_COMPILE_DEBUG
|
||||
if (globalPtr->refCount < 1) {
|
||||
if (globalPtr != NULL && globalPtr->refCount < 1) {
|
||||
Tcl_Panic("%s: global literal \"%.*s\" had bad refCount %d",
|
||||
"TclRegisterLiteral", (length>60? 60 : length), bytes,
|
||||
globalPtr->refCount);
|
||||
@@ -671,7 +687,7 @@ AddLocalLiteralEntry(
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
bytes = Tcl_GetStringFromObj(objPtr, &length);
|
||||
bytes = TclGetStringFromObj(objPtr, &length);
|
||||
Tcl_Panic("%s: literal \"%.*s\" wasn't found locally",
|
||||
"AddLocalLiteralEntry", (length>60? 60 : length), bytes);
|
||||
}
|
||||
@@ -1025,7 +1041,7 @@ TclInvalidateCmdLiteral(
|
||||
* invalidate a cmd literal. */
|
||||
{
|
||||
Interp *iPtr = (Interp *) interp;
|
||||
Tcl_Obj *literalObjPtr = TclCreateLiteral(iPtr, (char *) name,
|
||||
Tcl_Obj *literalObjPtr = TclCreateLiteral(iPtr, name,
|
||||
strlen(name), -1, NULL, nsPtr, 0, NULL);
|
||||
|
||||
if (literalObjPtr != NULL) {
|
||||
@@ -1147,18 +1163,11 @@ TclVerifyLocalLiteralTable(
|
||||
localPtr=localPtr->nextPtr) {
|
||||
count++;
|
||||
if (localPtr->refCount != -1) {
|
||||
bytes = Tcl_GetStringFromObj(localPtr->objPtr, &length);
|
||||
bytes = TclGetStringFromObj(localPtr->objPtr, &length);
|
||||
Tcl_Panic("%s: local literal \"%.*s\" had bad refCount %d",
|
||||
"TclVerifyLocalLiteralTable",
|
||||
(length>60? 60 : length), bytes, localPtr->refCount);
|
||||
}
|
||||
if (LookupLiteralEntry((Tcl_Interp *) envPtr->iPtr,
|
||||
localPtr->objPtr) == NULL) {
|
||||
bytes = Tcl_GetStringFromObj(localPtr->objPtr, &length);
|
||||
Tcl_Panic("%s: local literal \"%.*s\" is not global",
|
||||
"TclVerifyLocalLiteralTable",
|
||||
(length>60? 60 : length), bytes);
|
||||
}
|
||||
if (localPtr->objPtr->bytes == NULL) {
|
||||
Tcl_Panic("%s: literal has NULL string rep",
|
||||
"TclVerifyLocalLiteralTable");
|
||||
@@ -1205,7 +1214,7 @@ TclVerifyGlobalLiteralTable(
|
||||
globalPtr=globalPtr->nextPtr) {
|
||||
count++;
|
||||
if (globalPtr->refCount < 1) {
|
||||
bytes = Tcl_GetStringFromObj(globalPtr->objPtr, &length);
|
||||
bytes = TclGetStringFromObj(globalPtr->objPtr, &length);
|
||||
Tcl_Panic("%s: global literal \"%.*s\" had bad refCount %d",
|
||||
"TclVerifyGlobalLiteralTable",
|
||||
(length>60? 60 : length), bytes, globalPtr->refCount);
|
||||
|
||||
+12
-23
@@ -112,7 +112,7 @@ typedef enum {
|
||||
PROMPT_CONTINUE /* Print prompt for command continuation */
|
||||
} PromptType;
|
||||
|
||||
typedef struct InteractiveState {
|
||||
typedef struct {
|
||||
Tcl_Channel input; /* The standard input channel from which lines
|
||||
* are read. */
|
||||
int tty; /* Non-zero means standard input is a
|
||||
@@ -246,7 +246,7 @@ Tcl_SourceRCFile(
|
||||
const char *fileName;
|
||||
Tcl_Channel chan;
|
||||
|
||||
fileName = Tcl_GetVar(interp, "tcl_rcFileName", TCL_GLOBAL_ONLY);
|
||||
fileName = Tcl_GetVar2(interp, "tcl_rcFileName", NULL, TCL_GLOBAL_ONLY);
|
||||
if (fileName != NULL) {
|
||||
Tcl_Channel c;
|
||||
const char *fullName;
|
||||
@@ -266,14 +266,18 @@ Tcl_SourceRCFile(
|
||||
|
||||
c = Tcl_OpenFileChannel(NULL, fullName, "r", 0);
|
||||
if (c != NULL) {
|
||||
Tcl_Obj *fullNameObj = Tcl_NewStringObj(fullName, -1);
|
||||
|
||||
Tcl_Close(NULL, c);
|
||||
if (Tcl_EvalFile(interp, fullName) != TCL_OK) {
|
||||
Tcl_IncrRefCount(fullNameObj);
|
||||
if (Tcl_FSEvalFileEx(interp, fullNameObj, NULL) != TCL_OK) {
|
||||
chan = Tcl_GetStdChannel(TCL_STDERR);
|
||||
if (chan) {
|
||||
Tcl_WriteObj(chan, Tcl_GetObjResult(interp));
|
||||
Tcl_WriteChars(chan, "\n", 1);
|
||||
}
|
||||
}
|
||||
Tcl_DecrRefCount(fullNameObj);
|
||||
}
|
||||
}
|
||||
Tcl_DStringFree(&temp);
|
||||
@@ -283,7 +287,7 @@ Tcl_SourceRCFile(
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
*
|
||||
* Tcl_Main, Tcl_MainEx --
|
||||
* Tcl_MainEx --
|
||||
*
|
||||
* Main program for tclsh and most other Tcl-based applications.
|
||||
*
|
||||
@@ -532,7 +536,7 @@ Tcl_MainEx(
|
||||
* error messages troubles deeper in, so lop it back off.
|
||||
*/
|
||||
|
||||
Tcl_GetStringFromObj(is.commandPtr, &length);
|
||||
TclGetStringFromObj(is.commandPtr, &length);
|
||||
Tcl_SetObjLength(is.commandPtr, --length);
|
||||
code = Tcl_RecordAndEvalObj(interp, is.commandPtr,
|
||||
TCL_EVAL_GLOBAL);
|
||||
@@ -549,7 +553,7 @@ Tcl_MainEx(
|
||||
} else if (is.tty) {
|
||||
resultPtr = Tcl_GetObjResult(interp);
|
||||
Tcl_IncrRefCount(resultPtr);
|
||||
Tcl_GetStringFromObj(resultPtr, &length);
|
||||
TclGetStringFromObj(resultPtr, &length);
|
||||
chan = Tcl_GetStdChannel(TCL_STDOUT);
|
||||
if ((length > 0) && chan) {
|
||||
Tcl_WriteObj(chan, resultPtr);
|
||||
@@ -634,21 +638,6 @@ Tcl_MainEx(
|
||||
|
||||
Tcl_Exit(exitCode);
|
||||
}
|
||||
|
||||
#if (TCL_MAJOR_VERSION == 8) && !defined(UNICODE)
|
||||
#undef Tcl_Main
|
||||
extern DLLEXPORT void
|
||||
Tcl_Main(
|
||||
int argc, /* Number of arguments. */
|
||||
char **argv, /* Array of argument strings. */
|
||||
Tcl_AppInitProc *appInitProc)
|
||||
/* Application-specific initialization
|
||||
* function to call after most initialization
|
||||
* but before starting to execute commands. */
|
||||
{
|
||||
Tcl_MainEx(argc, argv, appInitProc, Tcl_CreateInterp());
|
||||
}
|
||||
#endif /* TCL_MAJOR_VERSION == 8 && !UNICODE */
|
||||
|
||||
#ifndef TCL_ASCII_MAIN
|
||||
|
||||
@@ -808,7 +797,7 @@ StdinProc(
|
||||
goto prompt;
|
||||
}
|
||||
isPtr->prompt = PROMPT_START;
|
||||
Tcl_GetStringFromObj(commandPtr, &length);
|
||||
TclGetStringFromObj(commandPtr, &length);
|
||||
Tcl_SetObjLength(commandPtr, --length);
|
||||
|
||||
/*
|
||||
@@ -839,7 +828,7 @@ StdinProc(
|
||||
chan = Tcl_GetStdChannel(TCL_STDOUT);
|
||||
|
||||
Tcl_IncrRefCount(resultPtr);
|
||||
Tcl_GetStringFromObj(resultPtr, &length);
|
||||
TclGetStringFromObj(resultPtr, &length);
|
||||
if ((length > 0) && (chan != NULL)) {
|
||||
Tcl_WriteObj(chan, resultPtr);
|
||||
Tcl_WriteChars(chan, "\n", 1);
|
||||
|
||||
+11
-23
@@ -2566,7 +2566,9 @@ Tcl_FindCommand(
|
||||
}
|
||||
|
||||
if (result == TCL_OK) {
|
||||
((Command *)cmd)->flags |= CMD_VIA_RESOLVER;
|
||||
return cmd;
|
||||
|
||||
} else if (result != TCL_CONTINUE) {
|
||||
return NULL;
|
||||
}
|
||||
@@ -2658,6 +2660,7 @@ Tcl_FindCommand(
|
||||
}
|
||||
|
||||
if (cmdPtr != NULL) {
|
||||
cmdPtr->flags &= ~CMD_VIA_RESOLVER;
|
||||
return (Tcl_Command) cmdPtr;
|
||||
}
|
||||
|
||||
@@ -2883,9 +2886,9 @@ GetNamespaceFromObj(
|
||||
resNamePtr = objPtr->internalRep.twoPtrValue.ptr1;
|
||||
nsPtr = resNamePtr->nsPtr;
|
||||
refNsPtr = resNamePtr->refNsPtr;
|
||||
if (!(nsPtr->flags & NS_DYING) && (interp == nsPtr->interp) &&
|
||||
(!refNsPtr || ((interp == refNsPtr->interp) &&
|
||||
(refNsPtr== (Namespace *) Tcl_GetCurrentNamespace(interp))))){
|
||||
if (!(nsPtr->flags & NS_DYING) && (interp == nsPtr->interp)
|
||||
&& (!refNsPtr || (refNsPtr ==
|
||||
(Namespace *) TclGetCurrentNamespace(interp)))) {
|
||||
*nsPtrPtr = (Tcl_Namespace *) nsPtr;
|
||||
return TCL_OK;
|
||||
}
|
||||
@@ -3354,14 +3357,7 @@ NRNamespaceEvalCmd(
|
||||
(void) TclPushStackFrame(interp, (Tcl_CallFrame **) framePtrPtr,
|
||||
namespacePtr, /*isProcCallFrame*/ 0);
|
||||
|
||||
if (iPtr->ensembleRewrite.sourceObjs == NULL) {
|
||||
framePtr->objc = objc;
|
||||
framePtr->objv = objv;
|
||||
} else {
|
||||
framePtr->objc = objc + iPtr->ensembleRewrite.numRemovedObjs
|
||||
- iPtr->ensembleRewrite.numInsertedObjs;
|
||||
framePtr->objv = iPtr->ensembleRewrite.sourceObjs;
|
||||
}
|
||||
framePtr->objv = TclFetchEnsembleRoot(interp, objv, objc, &framePtr->objc);
|
||||
|
||||
if (objc == 3) {
|
||||
/*
|
||||
@@ -3768,7 +3764,6 @@ NRNamespaceInscopeCmd(
|
||||
{
|
||||
Tcl_Namespace *namespacePtr;
|
||||
CallFrame *framePtr, **framePtrPtr;
|
||||
register Interp *iPtr = (Interp *) interp;
|
||||
int i;
|
||||
Tcl_Obj *cmdObjPtr;
|
||||
|
||||
@@ -3794,14 +3789,7 @@ NRNamespaceInscopeCmd(
|
||||
(void) TclPushStackFrame(interp, (Tcl_CallFrame **) framePtrPtr,
|
||||
namespacePtr, /*isProcCallFrame*/ 0);
|
||||
|
||||
if (iPtr->ensembleRewrite.sourceObjs == NULL) {
|
||||
framePtr->objc = objc;
|
||||
framePtr->objv = objv;
|
||||
} else {
|
||||
framePtr->objc = objc + iPtr->ensembleRewrite.numRemovedObjs
|
||||
- iPtr->ensembleRewrite.numInsertedObjs;
|
||||
framePtr->objv = iPtr->ensembleRewrite.sourceObjs;
|
||||
}
|
||||
framePtr->objv = TclFetchEnsembleRoot(interp, objv, objc, &framePtr->objc);
|
||||
|
||||
/*
|
||||
* Execute the command. If there is just one argument, just treat it as a
|
||||
@@ -4553,8 +4541,8 @@ NamespaceUpvarCmd(
|
||||
savedNsPtr = (Tcl_Namespace *) iPtr->varFramePtr->nsPtr;
|
||||
iPtr->varFramePtr->nsPtr = (Namespace *) nsPtr;
|
||||
otherPtr = TclObjLookupVarEx(interp, objv[0], NULL,
|
||||
(TCL_NAMESPACE_ONLY | TCL_LEAVE_ERR_MSG), "access",
|
||||
/*createPart1*/ 1, /*createPart2*/ 1, &arrayPtr);
|
||||
(TCL_NAMESPACE_ONLY|TCL_LEAVE_ERR_MSG|TCL_AVOID_RESOLVERS),
|
||||
"access", /*createPart1*/ 1, /*createPart2*/ 1, &arrayPtr);
|
||||
iPtr->varFramePtr->nsPtr = (Namespace *) savedNsPtr;
|
||||
if (otherPtr == NULL) {
|
||||
return TCL_ERROR;
|
||||
@@ -4794,7 +4782,7 @@ SetNsNameFromAny(
|
||||
if ((name[0] == ':') && (name[1] == ':')) {
|
||||
resNamePtr->refNsPtr = NULL;
|
||||
} else {
|
||||
resNamePtr->refNsPtr = (Namespace *) Tcl_GetCurrentNamespace(interp);
|
||||
resNamePtr->refNsPtr = (Namespace *) TclGetCurrentNamespace(interp);
|
||||
}
|
||||
resNamePtr->refCount = 1;
|
||||
TclFreeIntRep(objPtr);
|
||||
|
||||
+5
-8
@@ -68,12 +68,9 @@ static int CloneObjectMethod(Tcl_Interp *interp, Object *oPtr,
|
||||
static void DeletedDefineNamespace(ClientData clientData);
|
||||
static void DeletedObjdefNamespace(ClientData clientData);
|
||||
static void DeletedHelpersNamespace(ClientData clientData);
|
||||
static int FinalizeAlloc(ClientData data[],
|
||||
Tcl_Interp *interp, int result);
|
||||
static int FinalizeNext(ClientData data[],
|
||||
Tcl_Interp *interp, int result);
|
||||
static int FinalizeObjectCall(ClientData data[],
|
||||
Tcl_Interp *interp, int result);
|
||||
static Tcl_NRPostProc FinalizeAlloc;
|
||||
static Tcl_NRPostProc FinalizeNext;
|
||||
static Tcl_NRPostProc FinalizeObjectCall;
|
||||
static int InitFoundation(Tcl_Interp *interp);
|
||||
static void KillFoundation(ClientData clientData,
|
||||
Tcl_Interp *interp);
|
||||
@@ -269,7 +266,7 @@ TclOOInit(
|
||||
* to be fully provided.
|
||||
*/
|
||||
|
||||
if (Tcl_Eval(interp, initScript) != TCL_OK) {
|
||||
if (Tcl_EvalEx(interp, initScript, -1, 0) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
@@ -463,7 +460,7 @@ InitFoundation(
|
||||
if (TclOODefineSlots(fPtr) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
return Tcl_Eval(interp, slotScript);
|
||||
return Tcl_EvalEx(interp, slotScript, -1, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+3
-6
@@ -70,15 +70,12 @@ static void AddSimpleClassChainToCallContext(Class *classPtr,
|
||||
Class *const filterDecl);
|
||||
static int CmpStr(const void *ptr1, const void *ptr2);
|
||||
static void DupMethodNameRep(Tcl_Obj *srcPtr, Tcl_Obj *dstPtr);
|
||||
static int FinalizeMethodRefs(ClientData data[],
|
||||
Tcl_Interp *interp, int result);
|
||||
static Tcl_NRPostProc FinalizeMethodRefs;
|
||||
static void FreeMethodNameRep(Tcl_Obj *objPtr);
|
||||
static inline int IsStillValid(CallChain *callPtr, Object *oPtr,
|
||||
int flags, int reuseMask);
|
||||
static int ResetFilterFlags(ClientData data[],
|
||||
Tcl_Interp *interp, int result);
|
||||
static int SetFilterFlags(ClientData data[],
|
||||
Tcl_Interp *interp, int result);
|
||||
static Tcl_NRPostProc ResetFilterFlags;
|
||||
static Tcl_NRPostProc SetFilterFlags;
|
||||
static inline void StashCallChain(Tcl_Obj *objPtr, CallChain *callPtr);
|
||||
|
||||
/*
|
||||
|
||||
@@ -525,7 +525,7 @@ TclOOUnknownDefinition(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
soughtStr = Tcl_GetStringFromObj(objv[1], &soughtLen);
|
||||
soughtStr = TclGetStringFromObj(objv[1], &soughtLen);
|
||||
if (soughtLen == 0) {
|
||||
goto noMatch;
|
||||
}
|
||||
@@ -585,7 +585,7 @@ FindCommand(
|
||||
Tcl_Namespace *const namespacePtr)
|
||||
{
|
||||
int length;
|
||||
const char *nameStr, *string = Tcl_GetStringFromObj(stringObj, &length);
|
||||
const char *nameStr, *string = TclGetStringFromObj(stringObj, &length);
|
||||
register Namespace *const nsPtr = (Namespace *) namespacePtr;
|
||||
FOREACH_HASH_DECLS;
|
||||
Tcl_Command cmd, cmd2;
|
||||
@@ -774,7 +774,7 @@ GenerateErrorInfo(
|
||||
int length;
|
||||
Tcl_Obj *realNameObj = Tcl_ObjectDeleted((Tcl_Object) oPtr)
|
||||
? savedNameObj : TclOOObjectName(interp, oPtr);
|
||||
const char *objName = Tcl_GetStringFromObj(realNameObj, &length);
|
||||
const char *objName = TclGetStringFromObj(realNameObj, &length);
|
||||
int limit = OBJNAME_LENGTH_IN_ERRORINFO_LIMIT;
|
||||
int overflow = (length > limit);
|
||||
|
||||
@@ -1239,7 +1239,7 @@ TclOODefineConstructorObjCmd(
|
||||
}
|
||||
clsPtr = oPtr->classPtr;
|
||||
|
||||
Tcl_GetStringFromObj(objv[2], &bodyLength);
|
||||
TclGetStringFromObj(objv[2], &bodyLength);
|
||||
if (bodyLength > 0) {
|
||||
/*
|
||||
* Create the method structure.
|
||||
@@ -1358,7 +1358,7 @@ TclOODefineDestructorObjCmd(
|
||||
}
|
||||
clsPtr = oPtr->classPtr;
|
||||
|
||||
Tcl_GetStringFromObj(objv[1], &bodyLength);
|
||||
TclGetStringFromObj(objv[1], &bodyLength);
|
||||
if (bodyLength > 0) {
|
||||
/*
|
||||
* Create the method structure.
|
||||
|
||||
@@ -70,10 +70,8 @@ static Tcl_Obj ** InitEnsembleRewrite(Tcl_Interp *interp, int objc,
|
||||
static int InvokeProcedureMethod(ClientData clientData,
|
||||
Tcl_Interp *interp, Tcl_ObjectContext context,
|
||||
int objc, Tcl_Obj *const *objv);
|
||||
static int FinalizeForwardCall(ClientData data[], Tcl_Interp *interp,
|
||||
int result);
|
||||
static int FinalizePMCall(ClientData data[], Tcl_Interp *interp,
|
||||
int result);
|
||||
static Tcl_NRPostProc FinalizeForwardCall;
|
||||
static Tcl_NRPostProc FinalizePMCall;
|
||||
static int PushMethodCallFrame(Tcl_Interp *interp,
|
||||
CallContext *contextPtr, ProcedureMethod *pmPtr,
|
||||
int objc, Tcl_Obj *const *objv,
|
||||
@@ -1168,7 +1166,7 @@ MethodErrorHandler(
|
||||
CallContext *contextPtr = ((Interp *) interp)->varFramePtr->clientData;
|
||||
Method *mPtr = contextPtr->callPtr->chain[contextPtr->index].mPtr;
|
||||
const char *objectName, *kindName, *methodName =
|
||||
Tcl_GetStringFromObj(mPtr->namePtr, &nameLen);
|
||||
TclGetStringFromObj(mPtr->namePtr, &nameLen);
|
||||
Object *declarerPtr;
|
||||
|
||||
if (mPtr->declaringObjectPtr != NULL) {
|
||||
|
||||
+80
-92
@@ -402,7 +402,6 @@ TclInitObjSubsystem(void)
|
||||
Tcl_RegisterObjType(&tclListType);
|
||||
Tcl_RegisterObjType(&tclDictType);
|
||||
Tcl_RegisterObjType(&tclByteCodeType);
|
||||
Tcl_RegisterObjType(&tclArraySearchType);
|
||||
Tcl_RegisterObjType(&tclCmdNameType);
|
||||
Tcl_RegisterObjType(&tclRegexpType);
|
||||
Tcl_RegisterObjType(&tclProcBodyType);
|
||||
@@ -663,7 +662,7 @@ TclContinuationsEnterDerived(
|
||||
* better way which doesn't shimmer?)
|
||||
*/
|
||||
|
||||
Tcl_GetStringFromObj(objPtr, &length);
|
||||
TclGetStringFromObj(objPtr, &length);
|
||||
end = start + length; /* First char after the word */
|
||||
|
||||
/*
|
||||
@@ -1989,7 +1988,7 @@ TclSetBooleanFromAny(
|
||||
badBoolean:
|
||||
if (interp != NULL) {
|
||||
int length;
|
||||
const char *str = Tcl_GetStringFromObj(objPtr, &length);
|
||||
const char *str = TclGetStringFromObj(objPtr, &length);
|
||||
Tcl_Obj *msg;
|
||||
|
||||
TclNewLiteralStringObj(msg, "expected boolean value but got \"");
|
||||
@@ -4048,7 +4047,7 @@ TclFreeObjEntry(
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
unsigned int
|
||||
TCL_HASH_TYPE
|
||||
TclHashObjKey(
|
||||
Tcl_HashTable *tablePtr, /* Hash table. */
|
||||
void *keyPtr) /* Key from which to compute hash value. */
|
||||
@@ -4098,7 +4097,7 @@ TclHashObjKey(
|
||||
result += (result << 3) + UCHAR(*++string);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
return (TCL_HASH_TYPE) result;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -4152,11 +4151,10 @@ Tcl_GetCommandFromObj(
|
||||
*/
|
||||
|
||||
resPtr = objPtr->internalRep.twoPtrValue.ptr1;
|
||||
if ((objPtr->typePtr == &tclCmdNameType) && (resPtr != NULL)) {
|
||||
if (objPtr->typePtr == &tclCmdNameType) {
|
||||
register Command *cmdPtr = resPtr->cmdPtr;
|
||||
|
||||
if ((cmdPtr->cmdEpoch == resPtr->cmdEpoch)
|
||||
&& !(cmdPtr->flags & CMD_IS_DELETED)
|
||||
&& (interp == cmdPtr->nsPtr->interp)
|
||||
&& !(cmdPtr->nsPtr->flags & NS_DYING)) {
|
||||
register Namespace *refNsPtr = (Namespace *)
|
||||
@@ -4204,6 +4202,59 @@ Tcl_GetCommandFromObj(
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static void
|
||||
SetCmdNameObj(
|
||||
Tcl_Interp *interp,
|
||||
Tcl_Obj *objPtr,
|
||||
Command *cmdPtr,
|
||||
ResolvedCmdName *resPtr)
|
||||
{
|
||||
Interp *iPtr = (Interp *) interp;
|
||||
ResolvedCmdName *fillPtr;
|
||||
const char *name = TclGetString(objPtr);
|
||||
|
||||
if (resPtr) {
|
||||
fillPtr = resPtr;
|
||||
} else {
|
||||
fillPtr = ckalloc(sizeof(ResolvedCmdName));
|
||||
fillPtr->refCount = 1;
|
||||
}
|
||||
|
||||
fillPtr->cmdPtr = cmdPtr;
|
||||
cmdPtr->refCount++;
|
||||
fillPtr->cmdEpoch = cmdPtr->cmdEpoch;
|
||||
|
||||
/* NOTE: relying on NULL termination here. */
|
||||
if ((name[0] == ':') && (name[1] == ':')) {
|
||||
/*
|
||||
* Fully qualified names always resolve to same thing. No need
|
||||
* to record resolution context information.
|
||||
*/
|
||||
|
||||
fillPtr->refNsPtr = NULL;
|
||||
fillPtr->refNsId = 0; /* Will not be read */
|
||||
fillPtr->refNsCmdEpoch = 0; /* Will not be read */
|
||||
} else {
|
||||
/*
|
||||
* Record current state of current namespace as the resolution
|
||||
* context of this command name lookup.
|
||||
*/
|
||||
Namespace *currNsPtr = iPtr->varFramePtr->nsPtr;
|
||||
|
||||
fillPtr->refNsPtr = currNsPtr;
|
||||
fillPtr->refNsId = currNsPtr->nsId;
|
||||
fillPtr->refNsCmdEpoch = currNsPtr->cmdRefEpoch;
|
||||
}
|
||||
|
||||
if (resPtr == NULL) {
|
||||
TclFreeIntRep(objPtr);
|
||||
|
||||
objPtr->internalRep.twoPtrValue.ptr1 = fillPtr;
|
||||
objPtr->internalRep.twoPtrValue.ptr2 = NULL;
|
||||
objPtr->typePtr = &tclCmdNameType;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
TclSetCmdNameObj(
|
||||
Tcl_Interp *interp, /* Points to interpreter containing command
|
||||
@@ -4213,45 +4264,16 @@ TclSetCmdNameObj(
|
||||
Command *cmdPtr) /* Points to Command structure that the
|
||||
* CmdName object should refer to. */
|
||||
{
|
||||
Interp *iPtr = (Interp *) interp;
|
||||
register ResolvedCmdName *resPtr;
|
||||
register Namespace *currNsPtr;
|
||||
const char *name;
|
||||
|
||||
if (objPtr->typePtr == &tclCmdNameType) {
|
||||
return;
|
||||
resPtr = objPtr->internalRep.twoPtrValue.ptr1;
|
||||
if (resPtr != NULL && resPtr->cmdPtr == cmdPtr) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
cmdPtr->refCount++;
|
||||
resPtr = ckalloc(sizeof(ResolvedCmdName));
|
||||
resPtr->cmdPtr = cmdPtr;
|
||||
resPtr->cmdEpoch = cmdPtr->cmdEpoch;
|
||||
resPtr->refCount = 1;
|
||||
|
||||
name = TclGetString(objPtr);
|
||||
if ((*name++ == ':') && (*name == ':')) {
|
||||
/*
|
||||
* The name is fully qualified: set the referring namespace to
|
||||
* NULL.
|
||||
*/
|
||||
|
||||
resPtr->refNsPtr = NULL;
|
||||
} else {
|
||||
/*
|
||||
* Get the current namespace.
|
||||
*/
|
||||
|
||||
currNsPtr = iPtr->varFramePtr->nsPtr;
|
||||
|
||||
resPtr->refNsPtr = currNsPtr;
|
||||
resPtr->refNsId = currNsPtr->nsId;
|
||||
resPtr->refNsCmdEpoch = currNsPtr->cmdRefEpoch;
|
||||
}
|
||||
|
||||
TclFreeIntRep(objPtr);
|
||||
objPtr->internalRep.twoPtrValue.ptr1 = resPtr;
|
||||
objPtr->internalRep.twoPtrValue.ptr2 = NULL;
|
||||
objPtr->typePtr = &tclCmdNameType;
|
||||
SetCmdNameObj(interp, objPtr, cmdPtr, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -4282,7 +4304,6 @@ FreeCmdNameInternalRep(
|
||||
{
|
||||
register ResolvedCmdName *resPtr = objPtr->internalRep.twoPtrValue.ptr1;
|
||||
|
||||
if (resPtr != NULL) {
|
||||
/*
|
||||
* Decrement the reference count of the ResolvedCmdName structure. If
|
||||
* there are no more uses, free the ResolvedCmdName structure.
|
||||
@@ -4300,7 +4321,6 @@ FreeCmdNameInternalRep(
|
||||
TclCleanupCommandMacro(cmdPtr);
|
||||
ckfree(resPtr);
|
||||
}
|
||||
}
|
||||
objPtr->typePtr = NULL;
|
||||
}
|
||||
|
||||
@@ -4333,9 +4353,7 @@ DupCmdNameInternalRep(
|
||||
|
||||
copyPtr->internalRep.twoPtrValue.ptr1 = resPtr;
|
||||
copyPtr->internalRep.twoPtrValue.ptr2 = NULL;
|
||||
if (resPtr != NULL) {
|
||||
resPtr->refCount++;
|
||||
}
|
||||
copyPtr->typePtr = &tclCmdNameType;
|
||||
}
|
||||
|
||||
@@ -4365,10 +4383,8 @@ SetCmdNameFromAny(
|
||||
Tcl_Interp *interp, /* Used for error reporting if not NULL. */
|
||||
register Tcl_Obj *objPtr) /* The object to convert. */
|
||||
{
|
||||
Interp *iPtr = (Interp *) interp;
|
||||
const char *name;
|
||||
register Command *cmdPtr;
|
||||
Namespace *currNsPtr;
|
||||
register ResolvedCmdName *resPtr;
|
||||
|
||||
if (interp == NULL) {
|
||||
@@ -4388,59 +4404,31 @@ SetCmdNameFromAny(
|
||||
Tcl_FindCommand(interp, name, /*ns*/ NULL, /*flags*/ 0);
|
||||
|
||||
/*
|
||||
* Free the old internalRep before setting the new one. Do this after
|
||||
* getting the string rep to allow the conversion code (in particular,
|
||||
* Tcl_GetStringFromObj) to use that old internalRep.
|
||||
* Stop shimmering and caching nothing when we found nothing. Just
|
||||
* report the failure to find the command as an error.
|
||||
*/
|
||||
|
||||
if (cmdPtr) {
|
||||
cmdPtr->refCount++;
|
||||
resPtr = objPtr->internalRep.twoPtrValue.ptr1;
|
||||
if ((objPtr->typePtr == &tclCmdNameType)
|
||||
&& resPtr && (resPtr->refCount == 1)) {
|
||||
/*
|
||||
* Reuse the old ResolvedCmdName struct instead of freeing it
|
||||
*/
|
||||
if (cmdPtr == NULL) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
Command *oldCmdPtr = resPtr->cmdPtr;
|
||||
resPtr = objPtr->internalRep.twoPtrValue.ptr1;
|
||||
if ((objPtr->typePtr == &tclCmdNameType) && (resPtr->refCount == 1)) {
|
||||
/*
|
||||
* Re-use existing ResolvedCmdName struct when possible.
|
||||
* Cleanup the old fields that need it.
|
||||
*/
|
||||
|
||||
if (--oldCmdPtr->refCount == 0) {
|
||||
TclCleanupCommandMacro(oldCmdPtr);
|
||||
}
|
||||
} else {
|
||||
TclFreeIntRep(objPtr);
|
||||
resPtr = ckalloc(sizeof(ResolvedCmdName));
|
||||
resPtr->refCount = 1;
|
||||
objPtr->internalRep.twoPtrValue.ptr1 = resPtr;
|
||||
objPtr->internalRep.twoPtrValue.ptr2 = NULL;
|
||||
objPtr->typePtr = &tclCmdNameType;
|
||||
}
|
||||
resPtr->cmdPtr = cmdPtr;
|
||||
resPtr->cmdEpoch = cmdPtr->cmdEpoch;
|
||||
if ((*name++ == ':') && (*name == ':')) {
|
||||
/*
|
||||
* The name is fully qualified: set the referring namespace to
|
||||
* NULL.
|
||||
*/
|
||||
Command *oldCmdPtr = resPtr->cmdPtr;
|
||||
|
||||
resPtr->refNsPtr = NULL;
|
||||
} else {
|
||||
/*
|
||||
* Get the current namespace.
|
||||
*/
|
||||
|
||||
currNsPtr = iPtr->varFramePtr->nsPtr;
|
||||
|
||||
resPtr->refNsPtr = currNsPtr;
|
||||
resPtr->refNsId = currNsPtr->nsId;
|
||||
resPtr->refNsCmdEpoch = currNsPtr->cmdRefEpoch;
|
||||
if (--oldCmdPtr->refCount == 0) {
|
||||
TclCleanupCommandMacro(oldCmdPtr);
|
||||
}
|
||||
} else {
|
||||
TclFreeIntRep(objPtr);
|
||||
objPtr->internalRep.twoPtrValue.ptr1 = NULL;
|
||||
objPtr->internalRep.twoPtrValue.ptr2 = NULL;
|
||||
objPtr->typePtr = &tclCmdNameType;
|
||||
resPtr = NULL;
|
||||
}
|
||||
|
||||
SetCmdNameObj(interp, objPtr, cmdPtr, resPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -233,7 +233,7 @@ ConvertZeroEffectToNOP(
|
||||
TclGetUInt1AtPtr(currentInstPtr + 1));
|
||||
int numBytes;
|
||||
|
||||
(void) Tcl_GetStringFromObj(litPtr, &numBytes);
|
||||
(void) TclGetStringFromObj(litPtr, &numBytes);
|
||||
if (numBytes == 0) {
|
||||
blank = size + InstLength(nextInst);
|
||||
}
|
||||
@@ -248,7 +248,7 @@ ConvertZeroEffectToNOP(
|
||||
TclGetUInt4AtPtr(currentInstPtr + 1));
|
||||
int numBytes;
|
||||
|
||||
(void) Tcl_GetStringFromObj(litPtr, &numBytes);
|
||||
(void) TclGetStringFromObj(litPtr, &numBytes);
|
||||
if (numBytes == 0) {
|
||||
blank = size + InstLength(nextInst);
|
||||
}
|
||||
|
||||
+3
-3
@@ -1022,7 +1022,7 @@ ParseComment(
|
||||
if (parsePtr->commentStart == NULL) {
|
||||
parsePtr->commentStart = p;
|
||||
}
|
||||
|
||||
|
||||
p++;
|
||||
numBytes--;
|
||||
while (numBytes) {
|
||||
@@ -2220,7 +2220,7 @@ TclSubstTokens(
|
||||
if (result == 0) {
|
||||
clPos = 0;
|
||||
} else {
|
||||
Tcl_GetStringFromObj(result, &clPos);
|
||||
TclGetStringFromObj(result, &clPos);
|
||||
}
|
||||
|
||||
if (numCL >= maxNumCL) {
|
||||
@@ -2496,7 +2496,7 @@ TclObjCommandComplete(
|
||||
* check. */
|
||||
{
|
||||
int length;
|
||||
const char *script = Tcl_GetStringFromObj(objPtr, &length);
|
||||
const char *script = TclGetStringFromObj(objPtr, &length);
|
||||
|
||||
return CommandComplete(script, length);
|
||||
}
|
||||
|
||||
+33
-29
@@ -231,7 +231,7 @@ TclFSNormalizeAbsolutePath(
|
||||
retVal = Tcl_NewStringObj(path, dirSep - path);
|
||||
Tcl_IncrRefCount(retVal);
|
||||
}
|
||||
Tcl_GetStringFromObj(retVal, &curLen);
|
||||
TclGetStringFromObj(retVal, &curLen);
|
||||
if (curLen == 0) {
|
||||
Tcl_AppendToObj(retVal, dirSep, 1);
|
||||
}
|
||||
@@ -257,7 +257,7 @@ TclFSNormalizeAbsolutePath(
|
||||
retVal = Tcl_NewStringObj(path, dirSep - path);
|
||||
Tcl_IncrRefCount(retVal);
|
||||
}
|
||||
Tcl_GetStringFromObj(retVal, &curLen);
|
||||
TclGetStringFromObj(retVal, &curLen);
|
||||
if (curLen == 0) {
|
||||
Tcl_AppendToObj(retVal, dirSep, 1);
|
||||
}
|
||||
@@ -288,7 +288,7 @@ TclFSNormalizeAbsolutePath(
|
||||
*/
|
||||
|
||||
const char *path =
|
||||
Tcl_GetStringFromObj(retVal, &curLen);
|
||||
TclGetStringFromObj(retVal, &curLen);
|
||||
|
||||
while (--curLen >= 0) {
|
||||
if (IsSeparatorOrNull(path[curLen])) {
|
||||
@@ -303,7 +303,7 @@ TclFSNormalizeAbsolutePath(
|
||||
Tcl_SetObjLength(retVal, curLen+1);
|
||||
Tcl_AppendObjToObj(retVal, linkObj);
|
||||
TclDecrRefCount(linkObj);
|
||||
linkStr = Tcl_GetStringFromObj(retVal, &curLen);
|
||||
linkStr = TclGetStringFromObj(retVal, &curLen);
|
||||
} else {
|
||||
/*
|
||||
* Absolute link.
|
||||
@@ -316,7 +316,7 @@ TclFSNormalizeAbsolutePath(
|
||||
} else {
|
||||
retVal = linkObj;
|
||||
}
|
||||
linkStr = Tcl_GetStringFromObj(retVal, &curLen);
|
||||
linkStr = TclGetStringFromObj(retVal, &curLen);
|
||||
|
||||
/*
|
||||
* Convert to forward-slashes on windows.
|
||||
@@ -333,7 +333,7 @@ TclFSNormalizeAbsolutePath(
|
||||
}
|
||||
}
|
||||
} else {
|
||||
linkStr = Tcl_GetStringFromObj(retVal, &curLen);
|
||||
linkStr = TclGetStringFromObj(retVal, &curLen);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -404,7 +404,7 @@ TclFSNormalizeAbsolutePath(
|
||||
|
||||
if (tclPlatform == TCL_PLATFORM_WINDOWS) {
|
||||
int len;
|
||||
const char *path = Tcl_GetStringFromObj(retVal, &len);
|
||||
const char *path = TclGetStringFromObj(retVal, &len);
|
||||
|
||||
if (len == 2 && path[0] != 0 && path[1] == ':') {
|
||||
if (Tcl_IsShared(retVal)) {
|
||||
@@ -579,7 +579,7 @@ TclPathPart(
|
||||
|
||||
int numBytes;
|
||||
const char *rest =
|
||||
Tcl_GetStringFromObj(fsPathPtr->normPathPtr, &numBytes);
|
||||
TclGetStringFromObj(fsPathPtr->normPathPtr, &numBytes);
|
||||
|
||||
if (strchr(rest, '/') != NULL) {
|
||||
goto standardPath;
|
||||
@@ -617,7 +617,7 @@ TclPathPart(
|
||||
|
||||
int numBytes;
|
||||
const char *rest =
|
||||
Tcl_GetStringFromObj(fsPathPtr->normPathPtr, &numBytes);
|
||||
TclGetStringFromObj(fsPathPtr->normPathPtr, &numBytes);
|
||||
|
||||
if (strchr(rest, '/') != NULL) {
|
||||
goto standardPath;
|
||||
@@ -646,7 +646,7 @@ TclPathPart(
|
||||
const char *fileName, *extension;
|
||||
int length;
|
||||
|
||||
fileName = Tcl_GetStringFromObj(fsPathPtr->normPathPtr,
|
||||
fileName = TclGetStringFromObj(fsPathPtr->normPathPtr,
|
||||
&length);
|
||||
extension = TclGetExtension(fileName);
|
||||
if (extension == NULL) {
|
||||
@@ -698,7 +698,7 @@ TclPathPart(
|
||||
int length;
|
||||
const char *fileName, *extension;
|
||||
|
||||
fileName = Tcl_GetStringFromObj(pathPtr, &length);
|
||||
fileName = TclGetStringFromObj(pathPtr, &length);
|
||||
extension = TclGetExtension(fileName);
|
||||
if (extension == NULL) {
|
||||
Tcl_IncrRefCount(pathPtr);
|
||||
@@ -869,19 +869,23 @@ TclJoinPath(
|
||||
* object which can be normalized more efficiently. Currently we only
|
||||
* use the special case when we have exactly two elements, but we
|
||||
* could expand that in the future.
|
||||
*
|
||||
* Bugfix [a47641a0]. TclNewFSPathObj requires first argument
|
||||
* to be an absolute path. Added a check for that elt is absolute.
|
||||
*/
|
||||
|
||||
if ((i == (elements-2)) && (i == 0)
|
||||
&& (elt->typePtr == &tclFsPathType)
|
||||
&& !((elt->bytes != NULL) && (elt->bytes[0] == '\0'))) {
|
||||
Tcl_Obj *tailObj = objv[i+1];
|
||||
&& (elt->typePtr == &tclFsPathType)
|
||||
&& !((elt->bytes != NULL) && (elt->bytes[0] == '\0'))
|
||||
&& TclGetPathType(elt, NULL, NULL, NULL) == TCL_PATH_ABSOLUTE) {
|
||||
Tcl_Obj *tailObj = objv[i+1];
|
||||
|
||||
type = TclGetPathType(tailObj, NULL, NULL, NULL);
|
||||
if (type == TCL_PATH_RELATIVE) {
|
||||
const char *str;
|
||||
int len;
|
||||
|
||||
str = Tcl_GetStringFromObj(tailObj, &len);
|
||||
str = TclGetStringFromObj(tailObj, &len);
|
||||
if (len == 0) {
|
||||
/*
|
||||
* This happens if we try to handle the root volume '/'.
|
||||
@@ -943,7 +947,7 @@ TclJoinPath(
|
||||
}
|
||||
}
|
||||
}
|
||||
strElt = Tcl_GetStringFromObj(elt, &strEltLen);
|
||||
strElt = TclGetStringFromObj(elt, &strEltLen);
|
||||
type = TclGetPathType(elt, &fsPtr, &driveNameLength, &driveName);
|
||||
if (type != TCL_PATH_RELATIVE) {
|
||||
/*
|
||||
@@ -1030,9 +1034,9 @@ TclJoinPath(
|
||||
noQuickReturn:
|
||||
if (res == NULL) {
|
||||
res = Tcl_NewObj();
|
||||
ptr = Tcl_GetStringFromObj(res, &length);
|
||||
ptr = TclGetStringFromObj(res, &length);
|
||||
} else {
|
||||
ptr = Tcl_GetStringFromObj(res, &length);
|
||||
ptr = TclGetStringFromObj(res, &length);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1077,7 +1081,7 @@ TclJoinPath(
|
||||
|
||||
if (length > 0 && ptr[length -1] != '/') {
|
||||
Tcl_AppendToObj(res, &separator, 1);
|
||||
Tcl_GetStringFromObj(res, &length);
|
||||
TclGetStringFromObj(res, &length);
|
||||
}
|
||||
Tcl_SetObjLength(res, length + (int) strlen(strElt));
|
||||
|
||||
@@ -1372,7 +1376,7 @@ AppendPath(
|
||||
* intrep produce the same results; that is, bugward compatibility. If
|
||||
* we need to fix that bug here, it needs fixing in TclJoinPath() too.
|
||||
*/
|
||||
bytes = Tcl_GetStringFromObj(tail, &numBytes);
|
||||
bytes = TclGetStringFromObj(tail, &numBytes);
|
||||
if (numBytes == 0) {
|
||||
Tcl_AppendToObj(copy, "/", 1);
|
||||
} else {
|
||||
@@ -1431,7 +1435,7 @@ TclFSMakePathRelative(
|
||||
* too little below, leading to wrong answers returned by glob.
|
||||
*/
|
||||
|
||||
tempStr = Tcl_GetStringFromObj(cwdPtr, &cwdLen);
|
||||
tempStr = TclGetStringFromObj(cwdPtr, &cwdLen);
|
||||
|
||||
/*
|
||||
* Should we perhaps use 'Tcl_FSPathSeparator'? But then what about the
|
||||
@@ -1451,7 +1455,7 @@ TclFSMakePathRelative(
|
||||
}
|
||||
break;
|
||||
}
|
||||
tempStr = Tcl_GetStringFromObj(pathPtr, &len);
|
||||
tempStr = TclGetStringFromObj(pathPtr, &len);
|
||||
|
||||
return Tcl_NewStringObj(tempStr + cwdLen, len - cwdLen);
|
||||
}
|
||||
@@ -1715,7 +1719,7 @@ Tcl_FSGetTranslatedStringPath(
|
||||
|
||||
if (transPtr != NULL) {
|
||||
int len;
|
||||
const char *orig = Tcl_GetStringFromObj(transPtr, &len);
|
||||
const char *orig = TclGetStringFromObj(transPtr, &len);
|
||||
char *result = ckalloc(len+1);
|
||||
|
||||
memcpy(result, orig, (size_t) len+1);
|
||||
@@ -1776,7 +1780,7 @@ Tcl_FSGetNormalizedPath(
|
||||
UpdateStringOfFsPath(pathPtr);
|
||||
}
|
||||
|
||||
Tcl_GetStringFromObj(fsPathPtr->normPathPtr, &tailLen);
|
||||
TclGetStringFromObj(fsPathPtr->normPathPtr, &tailLen);
|
||||
if (tailLen) {
|
||||
copy = AppendPath(dir, fsPathPtr->normPathPtr);
|
||||
} else {
|
||||
@@ -1789,7 +1793,7 @@ Tcl_FSGetNormalizedPath(
|
||||
* We now own a reference on both 'dir' and 'copy'
|
||||
*/
|
||||
|
||||
(void) Tcl_GetStringFromObj(dir, &cwdLen);
|
||||
(void) TclGetStringFromObj(dir, &cwdLen);
|
||||
cwdLen += (Tcl_GetString(copy)[cwdLen] == '/');
|
||||
|
||||
/* Normalize the combined string. */
|
||||
@@ -1883,7 +1887,7 @@ Tcl_FSGetNormalizedPath(
|
||||
|
||||
copy = AppendPath(fsPathPtr->cwdPtr, pathPtr);
|
||||
|
||||
(void) Tcl_GetStringFromObj(fsPathPtr->cwdPtr, &cwdLen);
|
||||
(void) TclGetStringFromObj(fsPathPtr->cwdPtr, &cwdLen);
|
||||
cwdLen += (Tcl_GetString(copy)[cwdLen] == '/');
|
||||
|
||||
/*
|
||||
@@ -2333,7 +2337,7 @@ SetFsPathFromAny(
|
||||
* cmdAH.test exercise most of the code).
|
||||
*/
|
||||
|
||||
name = Tcl_GetStringFromObj(pathPtr, &len);
|
||||
name = TclGetStringFromObj(pathPtr, &len);
|
||||
|
||||
/*
|
||||
* Handle tilde substitutions, if needed.
|
||||
@@ -2602,7 +2606,7 @@ UpdateStringOfFsPath(
|
||||
|
||||
copy = AppendPath(fsPathPtr->cwdPtr, fsPathPtr->normPathPtr);
|
||||
|
||||
pathPtr->bytes = Tcl_GetStringFromObj(copy, &cwdLen);
|
||||
pathPtr->bytes = TclGetStringFromObj(copy, &cwdLen);
|
||||
pathPtr->length = cwdLen;
|
||||
copy->bytes = tclEmptyStringRep;
|
||||
copy->length = 0;
|
||||
@@ -2663,7 +2667,7 @@ TclNativePathInFilesystem(
|
||||
|
||||
int len;
|
||||
|
||||
(void) Tcl_GetStringFromObj(pathPtr, &len);
|
||||
(void) TclGetStringFromObj(pathPtr, &len);
|
||||
if (len == 0) {
|
||||
/*
|
||||
* We reject the empty path "".
|
||||
|
||||
+4
-4
@@ -842,7 +842,7 @@ Tcl_PackageObjCmd(
|
||||
} else {
|
||||
pkgPtr = FindPackage(interp, argv2);
|
||||
}
|
||||
argv3 = Tcl_GetStringFromObj(objv[3], &length);
|
||||
argv3 = TclGetStringFromObj(objv[3], &length);
|
||||
|
||||
for (availPtr = pkgPtr->availPtr, prevPtr = NULL; availPtr != NULL;
|
||||
prevPtr = availPtr, availPtr = availPtr->nextPtr) {
|
||||
@@ -883,7 +883,7 @@ Tcl_PackageObjCmd(
|
||||
prevPtr->nextPtr = availPtr;
|
||||
}
|
||||
}
|
||||
argv4 = Tcl_GetStringFromObj(objv[4], &length);
|
||||
argv4 = TclGetStringFromObj(objv[4], &length);
|
||||
DupBlock(availPtr->script, argv4, (unsigned) length + 1);
|
||||
break;
|
||||
}
|
||||
@@ -1034,7 +1034,7 @@ Tcl_PackageObjCmd(
|
||||
if (iPtr->packageUnknown != NULL) {
|
||||
ckfree(iPtr->packageUnknown);
|
||||
}
|
||||
argv2 = Tcl_GetStringFromObj(objv[2], &length);
|
||||
argv2 = TclGetStringFromObj(objv[2], &length);
|
||||
if (argv2[0] == 0) {
|
||||
iPtr->packageUnknown = NULL;
|
||||
} else {
|
||||
@@ -1682,7 +1682,7 @@ AddRequirementsToResult(
|
||||
int i, length;
|
||||
|
||||
for (i = 0; i < reqc; i++) {
|
||||
const char *v = Tcl_GetStringFromObj(reqv[i], &length);
|
||||
const char *v = TclGetStringFromObj(reqv[i], &length);
|
||||
|
||||
if ((length & 0x1) && (v[length/2] == '-')
|
||||
&& (strncmp(v, v+((length+1)/2), length/2) == 0)) {
|
||||
|
||||
+8
-34
@@ -343,7 +343,7 @@ Tcl_ProcObjCmd(
|
||||
* The argument list is just "args"; check the body
|
||||
*/
|
||||
|
||||
procBody = Tcl_GetStringFromObj(objv[3], &numBytes);
|
||||
procBody = TclGetStringFromObj(objv[3], &numBytes);
|
||||
if (TclParseAllWhiteSpace(procBody, numBytes) < numBytes) {
|
||||
goto done;
|
||||
}
|
||||
@@ -1087,12 +1087,10 @@ ProcWrongNumArgs(
|
||||
if (framePtr->isProcCallFrame & FRAME_IS_LAMBDA) {
|
||||
desiredObjs[0] = Tcl_NewStringObj("lambdaExpr", -1);
|
||||
} else {
|
||||
((Interp *) interp)->ensembleRewrite.numInsertedObjs -= skip - 1;
|
||||
|
||||
#ifdef AVOID_HACKS_FOR_ITCL
|
||||
desiredObjs[0] = framePtr->objv[skip-1];
|
||||
#else
|
||||
desiredObjs[0] = Tcl_NewListObj(skip, framePtr->objv);
|
||||
desiredObjs[0] = Tcl_NewListObj(1, framePtr->objv + skip - 1);
|
||||
#endif /* AVOID_HACKS_FOR_ITCL */
|
||||
}
|
||||
Tcl_IncrRefCount(desiredObjs[0]);
|
||||
@@ -1527,6 +1525,10 @@ InitArgsAndLocals(
|
||||
*/
|
||||
|
||||
incorrectArgs:
|
||||
if ((skip != 1) &&
|
||||
TclInitRewriteEnsemble(interp, skip-1, 0, framePtr->objv)) {
|
||||
TclNRAddCallback(interp, TclClearRootEnsemble, NULL, NULL, NULL, NULL);
|
||||
}
|
||||
memset(varPtr, 0,
|
||||
((framePtr->compiledLocals + localCt)-varPtr) * sizeof(Var));
|
||||
return ProcWrongNumArgs(interp, skip);
|
||||
@@ -2081,7 +2083,7 @@ MakeProcError(
|
||||
* messages and trace information. */
|
||||
{
|
||||
int overflow, limit = 60, nameLen;
|
||||
const char *procName = Tcl_GetStringFromObj(procNameObj, &nameLen);
|
||||
const char *procName = TclGetStringFromObj(procNameObj, &nameLen);
|
||||
|
||||
overflow = (nameLen > limit);
|
||||
Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf(
|
||||
@@ -2652,30 +2654,6 @@ TclNRApplyObjCmd(
|
||||
procPtr = lambdaPtr->internalRep.twoPtrValue.ptr1;
|
||||
}
|
||||
|
||||
#define JOE_EXTENSION 0
|
||||
/*
|
||||
* Note: this code is NOT FUNCTIONAL due to the NR implementation; DO NOT
|
||||
* ENABLE! Leaving here as reminder to (a) TIP the suggestion, and (b) adapt
|
||||
* the code. (MS)
|
||||
*/
|
||||
|
||||
#if JOE_EXTENSION
|
||||
else {
|
||||
/*
|
||||
* Joe English's suggestion to allow cmdNames to function as lambdas.
|
||||
*/
|
||||
|
||||
Tcl_Obj *elemPtr;
|
||||
int numElem;
|
||||
|
||||
if ((lambdaPtr->typePtr == &tclCmdNameType) ||
|
||||
(TclListObjGetElements(interp, lambdaPtr, &numElem,
|
||||
&elemPtr) == TCL_OK && numElem == 1)) {
|
||||
return Tcl_EvalObjv(interp, objc-1, objv+1, 0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if ((procPtr == NULL) || (procPtr->iPtr != iPtr)) {
|
||||
result = SetLambdaFromAny(interp, lambdaPtr);
|
||||
if (result != TCL_OK) {
|
||||
@@ -2716,10 +2694,6 @@ TclNRApplyObjCmd(
|
||||
extraPtr->efi.fields[0].clientData = lambdaPtr;
|
||||
extraPtr->cmd.clientData = &extraPtr->efi;
|
||||
|
||||
if (TclInitRewriteEnsemble(interp, 1, 0, objv)) {
|
||||
TclNRAddCallback(interp, TclClearRootEnsemble, NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
result = TclPushProcCallFrame(procPtr, interp, objc, objv, 1);
|
||||
if (result == TCL_OK) {
|
||||
TclNRAddCallback(interp, ApplyNR2, extraPtr, NULL, NULL, NULL);
|
||||
@@ -2766,7 +2740,7 @@ MakeLambdaError(
|
||||
* messages and trace information. */
|
||||
{
|
||||
int overflow, limit = 60, nameLen;
|
||||
const char *procName = Tcl_GetStringFromObj(procNameObj, &nameLen);
|
||||
const char *procName = TclGetStringFromObj(procNameObj, &nameLen);
|
||||
|
||||
overflow = (nameLen > limit);
|
||||
Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf(
|
||||
|
||||
@@ -2285,7 +2285,7 @@ Tcl_AppendFormatToObj(
|
||||
}
|
||||
}
|
||||
|
||||
Tcl_GetStringFromObj(segment, &segmentNumBytes);
|
||||
TclGetStringFromObj(segment, &segmentNumBytes);
|
||||
if (segmentNumBytes > limit) {
|
||||
if (allocSegment) {
|
||||
Tcl_DecrRefCount(segment);
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
* tcl.h, but do not do that unless you are sure what you're doing!
|
||||
*/
|
||||
|
||||
typedef struct String {
|
||||
typedef struct {
|
||||
int numChars; /* The number of chars in the string. -1 means
|
||||
* this value has not been calculated. >= 0
|
||||
* means that there is a valid Unicode rep, or
|
||||
|
||||
+97
-40
@@ -42,16 +42,8 @@
|
||||
* Declare external functions used in Windows tests.
|
||||
*/
|
||||
|
||||
/*
|
||||
* TCL_STORAGE_CLASS is set unconditionally to DLLEXPORT because the
|
||||
* Tcltest_Init declaration is in the source file itself, which is only
|
||||
* accessed when we are building a library.
|
||||
*/
|
||||
|
||||
#undef TCL_STORAGE_CLASS
|
||||
#define TCL_STORAGE_CLASS DLLEXPORT
|
||||
EXTERN int Tcltest_Init(Tcl_Interp *interp);
|
||||
EXTERN int Tcltest_SafeInit(Tcl_Interp *interp);
|
||||
DLLEXPORT int Tcltest_Init(Tcl_Interp *interp);
|
||||
DLLEXPORT int Tcltest_SafeInit(Tcl_Interp *interp);
|
||||
|
||||
/*
|
||||
* Dynamic string shared by TestdcallCmd and DelCallbackProc; used to collect
|
||||
@@ -416,8 +408,7 @@ static int TestHashSystemHashCmd(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc,
|
||||
Tcl_Obj *const objv[]);
|
||||
|
||||
static int NREUnwind_callback(ClientData data[], Tcl_Interp *interp,
|
||||
int result);
|
||||
static Tcl_NRPostProc NREUnwind_callback;
|
||||
static int TestNREUnwind(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc,
|
||||
Tcl_Obj *const objv[]);
|
||||
@@ -1294,7 +1285,7 @@ TestcmdtraceCmd(
|
||||
cmdTrace = Tcl_CreateObjTrace(interp, 50000,
|
||||
TCL_ALLOW_INLINE_COMPILATION, ObjTraceProc,
|
||||
(ClientData) &deleteCalled, ObjTraceDeleteProc);
|
||||
result = Tcl_Eval(interp, argv[2]);
|
||||
result = Tcl_EvalEx(interp, argv[2], -1, 0);
|
||||
Tcl_DeleteTrace(interp, cmdTrace);
|
||||
if (!deleteCalled) {
|
||||
Tcl_SetResult(interp, "Delete wasn't called", TCL_STATIC);
|
||||
@@ -1308,7 +1299,7 @@ TestcmdtraceCmd(
|
||||
Tcl_DStringInit(&buffer);
|
||||
t1 = Tcl_CreateTrace(interp, 1, CmdTraceProc, &buffer);
|
||||
t2 = Tcl_CreateTrace(interp, 50000, CmdTraceProc, &buffer);
|
||||
result = Tcl_Eval(interp, argv[2]);
|
||||
result = Tcl_EvalEx(interp, argv[2], -1, 0);
|
||||
if (result == TCL_OK) {
|
||||
Tcl_ResetResult(interp);
|
||||
Tcl_AppendResult(interp, Tcl_DStringValue(&buffer), NULL);
|
||||
@@ -1637,7 +1628,7 @@ DelDeleteProc(
|
||||
{
|
||||
DelCmd *dPtr = clientData;
|
||||
|
||||
Tcl_Eval(dPtr->interp, dPtr->deleteCmd);
|
||||
Tcl_EvalEx(dPtr->interp, dPtr->deleteCmd, -1, 0);
|
||||
Tcl_ResetResult(dPtr->interp);
|
||||
ckfree(dPtr->deleteCmd);
|
||||
ckfree(dPtr);
|
||||
@@ -3972,7 +3963,7 @@ TestregexpObjCmd(
|
||||
varName = Tcl_GetString(objv[2]);
|
||||
TclRegExpRangeUniChar(regExpr, -1, &start, &end);
|
||||
sprintf(resinfo, "%d %d", start, end-1);
|
||||
value = Tcl_SetVar(interp, varName, resinfo, 0);
|
||||
value = Tcl_SetVar2(interp, varName, NULL, resinfo, 0);
|
||||
if (value == NULL) {
|
||||
Tcl_AppendResult(interp, "couldn't set variable \"",
|
||||
varName, "\"", NULL);
|
||||
@@ -3986,7 +3977,7 @@ TestregexpObjCmd(
|
||||
Tcl_RegExpGetInfo(regExpr, &info);
|
||||
varName = Tcl_GetString(objv[2]);
|
||||
sprintf(resinfo, "%ld", info.extendStart);
|
||||
value = Tcl_SetVar(interp, varName, resinfo, 0);
|
||||
value = Tcl_SetVar2(interp, varName, NULL, resinfo, 0);
|
||||
if (value == NULL) {
|
||||
Tcl_AppendResult(interp, "couldn't set variable \"",
|
||||
varName, "\"", NULL);
|
||||
@@ -4329,7 +4320,7 @@ StaticInitProc(
|
||||
Tcl_Interp *interp) /* Interpreter in which package is supposedly
|
||||
* being loaded. */
|
||||
{
|
||||
Tcl_SetVar(interp, "x", "loaded", TCL_GLOBAL_ONLY);
|
||||
Tcl_SetVar2(interp, "x", NULL, "loaded", TCL_GLOBAL_ONLY);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -4413,7 +4404,7 @@ TestupvarCmd(
|
||||
} else if (strcmp(argv[4], "namespace") == 0) {
|
||||
flags = TCL_NAMESPACE_ONLY;
|
||||
}
|
||||
return Tcl_UpVar(interp, argv[1], argv[2], argv[3], flags);
|
||||
return Tcl_UpVar2(interp, argv[1], argv[2], NULL, argv[3], flags);
|
||||
} else {
|
||||
if (strcmp(argv[5], "global") == 0) {
|
||||
flags = TCL_GLOBAL_ONLY;
|
||||
@@ -4907,10 +4898,10 @@ GetTimesObjCmd(
|
||||
timePer/100000);
|
||||
|
||||
/* Tcl_SetVar 100000 times */
|
||||
fprintf(stderr, "Tcl_SetVar of \"12345\" 100000 times\n");
|
||||
fprintf(stderr, "Tcl_SetVar2 of \"12345\" 100000 times\n");
|
||||
Tcl_GetTime(&start);
|
||||
for (i = 0; i < 100000; i++) {
|
||||
s = Tcl_SetVar(interp, "a", "12345", TCL_LEAVE_ERR_MSG);
|
||||
s = Tcl_SetVar2(interp, "a", NULL, "12345", TCL_LEAVE_ERR_MSG);
|
||||
if (s == NULL) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
@@ -4924,7 +4915,7 @@ GetTimesObjCmd(
|
||||
fprintf(stderr, "Tcl_GetVar of a==\"12345\" 100000 times\n");
|
||||
Tcl_GetTime(&start);
|
||||
for (i = 0; i < 100000; i++) {
|
||||
s = Tcl_GetVar(interp, "a", TCL_LEAVE_ERR_MSG);
|
||||
s = Tcl_GetVar2(interp, "a", NULL, TCL_LEAVE_ERR_MSG);
|
||||
if (s == NULL) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
@@ -5194,7 +5185,7 @@ TestsaveresultCmd(
|
||||
if (((enum options) index) == RESULT_OBJECT) {
|
||||
result = Tcl_EvalObjEx(interp, objv[2], 0);
|
||||
} else {
|
||||
result = Tcl_Eval(interp, Tcl_GetString(objv[2]));
|
||||
result = Tcl_EvalEx(interp, Tcl_GetString(objv[2]), -1, 0);
|
||||
}
|
||||
|
||||
if (discard) {
|
||||
@@ -6297,7 +6288,7 @@ TestReport(
|
||||
savedResult = Tcl_GetObjResult(interp);
|
||||
Tcl_IncrRefCount(savedResult);
|
||||
Tcl_SetObjResult(interp, Tcl_NewObj());
|
||||
Tcl_Eval(interp, Tcl_DStringValue(&ds));
|
||||
Tcl_EvalEx(interp, Tcl_DStringValue(&ds), -1, 0);
|
||||
Tcl_DStringFree(&ds);
|
||||
Tcl_ResetResult(interp);
|
||||
Tcl_SetObjResult(interp, savedResult);
|
||||
@@ -7335,23 +7326,82 @@ InterpCmdResolver(
|
||||
CallFrame *varFramePtr = iPtr->varFramePtr;
|
||||
Proc *procPtr = (varFramePtr->isProcCallFrame & FRAME_IS_PROC) ?
|
||||
varFramePtr->procPtr : NULL;
|
||||
Namespace *ns2NsPtr = (Namespace *)
|
||||
Tcl_FindNamespace(interp, "::ns2", NULL, 0);
|
||||
Namespace *callerNsPtr = varFramePtr->nsPtr;
|
||||
Tcl_Command resolvedCmdPtr = NULL;
|
||||
|
||||
if (procPtr && (procPtr->cmdPtr->nsPtr == iPtr->globalNsPtr
|
||||
|| (ns2NsPtr && procPtr->cmdPtr->nsPtr == ns2NsPtr))) {
|
||||
const char *callingCmdName =
|
||||
/*
|
||||
* Just do something special on a cmd literal "z" in two cases:
|
||||
* A) when the caller is a proc "x", and the proc is either in "::" or in "::ns2".
|
||||
* B) the caller's namespace is "ctx1" or "ctx2"
|
||||
*/
|
||||
if ( (name[0] == 'z') && (name[1] == '\0') ) {
|
||||
Namespace *ns2NsPtr = (Namespace *) Tcl_FindNamespace(interp, "::ns2", NULL, 0);
|
||||
|
||||
if (procPtr != NULL
|
||||
&& ((procPtr->cmdPtr->nsPtr == iPtr->globalNsPtr)
|
||||
|| (ns2NsPtr != NULL && procPtr->cmdPtr->nsPtr == ns2NsPtr)
|
||||
)
|
||||
) {
|
||||
/*
|
||||
* Case A)
|
||||
*
|
||||
* - The context, in which this resolver becomes active, is
|
||||
* determined by the name of the caller proc, which has to be
|
||||
* named "x".
|
||||
*
|
||||
* - To determine the name of the caller proc, the proc is taken
|
||||
* from the topmost stack frame.
|
||||
*
|
||||
* - Note that the context is NOT provided during byte-code
|
||||
* compilation (e.g. in TclProcCompileProc)
|
||||
*
|
||||
* When these conditions hold, this function resolves the
|
||||
* passed-in cmd literal into a cmd "y", which is taken from the
|
||||
* the global namespace (for simplicity).
|
||||
*/
|
||||
|
||||
const char *callingCmdName =
|
||||
Tcl_GetCommandName(interp, (Tcl_Command) procPtr->cmdPtr);
|
||||
|
||||
if ((callingCmdName[0] == 'x') && (callingCmdName[1] == '\0')
|
||||
&& (name[0] == 'z') && (name[1] == '\0')) {
|
||||
Tcl_Command sourceCmdPtr = Tcl_FindCommand(interp, "y", NULL,
|
||||
TCL_GLOBAL_ONLY);
|
||||
|
||||
if (sourceCmdPtr != NULL) {
|
||||
*rPtr = sourceCmdPtr;
|
||||
return TCL_OK;
|
||||
if ( callingCmdName[0] == 'x' && callingCmdName[1] == '\0' ) {
|
||||
resolvedCmdPtr = Tcl_FindCommand(interp, "y", NULL, TCL_GLOBAL_ONLY);
|
||||
}
|
||||
} else if (callerNsPtr != NULL) {
|
||||
/*
|
||||
* Case B)
|
||||
*
|
||||
* - The context, in which this resolver becomes active, is
|
||||
* determined by the name of the parent namespace, which has
|
||||
* to be named "ctx1" or "ctx2".
|
||||
*
|
||||
* - To determine the name of the parent namesace, it is taken
|
||||
* from the 2nd highest stack frame.
|
||||
*
|
||||
* - Note that the context can be provided during byte-code
|
||||
* compilation (e.g. in TclProcCompileProc)
|
||||
*
|
||||
* When these conditions hold, this function resolves the
|
||||
* passed-in cmd literal into a cmd "y" or "Y" depending on the
|
||||
* context. The resolved procs are taken from the the global
|
||||
* namespace (for simplicity).
|
||||
*/
|
||||
|
||||
CallFrame *parentFramePtr = varFramePtr->callerPtr;
|
||||
char *context = parentFramePtr != NULL ? parentFramePtr->nsPtr->name : "(NULL)";
|
||||
|
||||
if (strcmp(context, "ctx1") == 0 && (name[0] == 'z') && (name[1] == '\0')) {
|
||||
resolvedCmdPtr = Tcl_FindCommand(interp, "y", NULL, TCL_GLOBAL_ONLY);
|
||||
/* fprintf(stderr, "... y ==> %p\n", resolvedCmdPtr);*/
|
||||
|
||||
} else if (strcmp(context, "ctx2") == 0 && (name[0] == 'z') && (name[1] == '\0')) {
|
||||
resolvedCmdPtr = Tcl_FindCommand(interp, "Y", NULL, TCL_GLOBAL_ONLY);
|
||||
/*fprintf(stderr, "... Y ==> %p\n", resolvedCmdPtr);*/
|
||||
}
|
||||
}
|
||||
|
||||
if (resolvedCmdPtr != NULL) {
|
||||
*rPtr = resolvedCmdPtr;
|
||||
return TCL_OK;
|
||||
}
|
||||
}
|
||||
return TCL_CONTINUE;
|
||||
@@ -7485,9 +7535,16 @@ TestInterpResolverCmd(
|
||||
int idx;
|
||||
#define RESOLVER_KEY "testInterpResolver"
|
||||
|
||||
if (objc != 2) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "up|down");
|
||||
return TCL_ERROR;
|
||||
if ((objc < 2) || (objc > 3)) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "up|down ?interp?");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (objc == 3) {
|
||||
interp = Tcl_GetSlave(interp, Tcl_GetString(objv[2]));
|
||||
if (interp == NULL) {
|
||||
Tcl_AppendResult(interp, "provided interpreter not found", NULL);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
}
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], table, "operation", TCL_EXACT,
|
||||
&idx) != TCL_OK) {
|
||||
|
||||
+4
-24
@@ -19,6 +19,7 @@
|
||||
#endif
|
||||
#include "tclInt.h"
|
||||
#include "tommath.h"
|
||||
#include "tclStringRep.h"
|
||||
|
||||
|
||||
/*
|
||||
@@ -46,13 +47,6 @@ static int TestobjCmd(ClientData dummy, Tcl_Interp *interp,
|
||||
int objc, Tcl_Obj *const objv[]);
|
||||
static int TeststringobjCmd(ClientData dummy, Tcl_Interp *interp,
|
||||
int objc, Tcl_Obj *const objv[]);
|
||||
|
||||
typedef struct TestString {
|
||||
int numChars;
|
||||
int allocated;
|
||||
int maxChars;
|
||||
Tcl_UniChar unicode[2];
|
||||
} TestString;
|
||||
|
||||
#define VARPTR_KEY "TCLOBJTEST_VARPTR"
|
||||
#define NUMBER_OF_OBJECT_VARS 20
|
||||
@@ -583,23 +577,9 @@ TestindexobjCmd(
|
||||
}
|
||||
argv[objc-4] = NULL;
|
||||
|
||||
/*
|
||||
* Tcl_GetIndexFromObj assumes that the table is statically-allocated so
|
||||
* that its address is different for each index object. If we accidently
|
||||
* allocate a table at the same address as that cached in the index
|
||||
* object, clear out the object's cached state.
|
||||
*/
|
||||
|
||||
if (objv[3]->typePtr != NULL
|
||||
&& !strcmp("index", objv[3]->typePtr->name)) {
|
||||
indexRep = objv[3]->internalRep.twoPtrValue.ptr1;
|
||||
if (indexRep->tablePtr == (void *) argv) {
|
||||
TclFreeIntRep(objv[3]);
|
||||
}
|
||||
}
|
||||
|
||||
result = Tcl_GetIndexFromObj((setError? interp : NULL), objv[3],
|
||||
argv, "token", (allowAbbrev? 0 : TCL_EXACT), &index);
|
||||
argv, "token", INDEX_TEMP_TABLE|(allowAbbrev? 0 : TCL_EXACT),
|
||||
&index);
|
||||
ckfree(argv);
|
||||
if (result == TCL_OK) {
|
||||
Tcl_SetIntObj(Tcl_GetObjResult(interp), index);
|
||||
@@ -1141,7 +1121,7 @@ TeststringobjCmd(
|
||||
int varIndex, option, i, length;
|
||||
#define MAX_STRINGS 11
|
||||
const char *index, *string, *strings[MAX_STRINGS+1];
|
||||
TestString *strPtr;
|
||||
String *strPtr;
|
||||
Tcl_Obj **varPtr;
|
||||
static const char *const options[] = {
|
||||
"append", "appendstrings", "get", "get2", "length", "length2",
|
||||
|
||||
@@ -657,7 +657,7 @@ ThreadErrorProc(
|
||||
|
||||
sprintf(buf, "%" TCL_LL_MODIFIER "d", (Tcl_WideInt)(size_t)Tcl_GetCurrentThread());
|
||||
|
||||
errorInfo = Tcl_GetVar(interp, "errorInfo", TCL_GLOBAL_ONLY);
|
||||
errorInfo = Tcl_GetVar2(interp, "errorInfo", NULL, TCL_GLOBAL_ONLY);
|
||||
if (errorProcString == NULL) {
|
||||
errChannel = Tcl_GetStdChannel(TCL_STDERR);
|
||||
Tcl_WriteChars(errChannel, "Error from thread ", -1);
|
||||
@@ -1032,8 +1032,8 @@ ThreadEventProc(
|
||||
code = Tcl_EvalEx(interp, threadEventPtr->script,-1,TCL_EVAL_GLOBAL);
|
||||
Tcl_DeleteThreadExitHandler(ThreadFreeProc, threadEventPtr->script);
|
||||
if (code != TCL_OK) {
|
||||
errorCode = Tcl_GetVar(interp, "errorCode", TCL_GLOBAL_ONLY);
|
||||
errorInfo = Tcl_GetVar(interp, "errorInfo", TCL_GLOBAL_ONLY);
|
||||
errorCode = Tcl_GetVar2(interp, "errorCode", NULL, TCL_GLOBAL_ONLY);
|
||||
errorInfo = Tcl_GetVar2(interp, "errorInfo", NULL, TCL_GLOBAL_ONLY);
|
||||
} else {
|
||||
errorCode = errorInfo = NULL;
|
||||
}
|
||||
|
||||
+3
-3
@@ -91,7 +91,7 @@ typedef struct IdleHandler {
|
||||
* The structure defined below is used in this file only.
|
||||
*/
|
||||
|
||||
typedef struct ThreadSpecificData {
|
||||
typedef struct {
|
||||
TimerHandler *firstTimerHandlerPtr; /* First event in queue. */
|
||||
int lastTimerId; /* Timer identifier of most recently created
|
||||
* timer. */
|
||||
@@ -900,10 +900,10 @@ Tcl_AfterObjCmd(
|
||||
} else {
|
||||
commandPtr = Tcl_ConcatObj(objc-2, objv+2);;
|
||||
}
|
||||
command = Tcl_GetStringFromObj(commandPtr, &length);
|
||||
command = TclGetStringFromObj(commandPtr, &length);
|
||||
for (afterPtr = assocPtr->firstAfterPtr; afterPtr != NULL;
|
||||
afterPtr = afterPtr->nextPtr) {
|
||||
tempCommand = Tcl_GetStringFromObj(afterPtr->commandPtr,
|
||||
tempCommand = TclGetStringFromObj(afterPtr->commandPtr,
|
||||
&tempLength);
|
||||
if ((length == tempLength)
|
||||
&& !memcmp(command, tempCommand, (unsigned) length)) {
|
||||
|
||||
+5
-5
@@ -143,7 +143,7 @@ static int TraceVarEx(Tcl_Interp *interp, const char *part1,
|
||||
* trace procs
|
||||
*/
|
||||
|
||||
typedef struct StringTraceData {
|
||||
typedef struct {
|
||||
ClientData clientData; /* Client data from Tcl_CreateTrace */
|
||||
Tcl_CmdTraceProc *proc; /* Trace function from Tcl_CreateTrace */
|
||||
} StringTraceData;
|
||||
@@ -278,7 +278,7 @@ Tcl_TraceObjCmd(
|
||||
|
||||
opsList = Tcl_NewObj();
|
||||
Tcl_IncrRefCount(opsList);
|
||||
flagOps = Tcl_GetStringFromObj(objv[3], &numFlags);
|
||||
flagOps = TclGetStringFromObj(objv[3], &numFlags);
|
||||
if (numFlags == 0) {
|
||||
Tcl_DecrRefCount(opsList);
|
||||
goto badVarOps;
|
||||
@@ -462,7 +462,7 @@ TraceExecutionObjCmd(
|
||||
break;
|
||||
}
|
||||
}
|
||||
command = Tcl_GetStringFromObj(objv[5], &commandLength);
|
||||
command = TclGetStringFromObj(objv[5], &commandLength);
|
||||
length = (size_t) commandLength;
|
||||
if ((enum traceOptions) optionIndex == TRACE_ADD) {
|
||||
TraceCommandInfo *tcmdPtr = ckalloc(
|
||||
@@ -701,7 +701,7 @@ TraceCommandObjCmd(
|
||||
}
|
||||
}
|
||||
|
||||
command = Tcl_GetStringFromObj(objv[5], &commandLength);
|
||||
command = TclGetStringFromObj(objv[5], &commandLength);
|
||||
length = (size_t) commandLength;
|
||||
if ((enum traceOptions) optionIndex == TRACE_ADD) {
|
||||
TraceCommandInfo *tcmdPtr = ckalloc(
|
||||
@@ -904,7 +904,7 @@ TraceVariableObjCmd(
|
||||
break;
|
||||
}
|
||||
}
|
||||
command = Tcl_GetStringFromObj(objv[5], &commandLength);
|
||||
command = TclGetStringFromObj(objv[5], &commandLength);
|
||||
length = (size_t) commandLength;
|
||||
if ((enum traceOptions) optionIndex == TRACE_ADD) {
|
||||
CombinedTraceVarInfo *ctvarPtr = ckalloc(
|
||||
|
||||
+23
-43
@@ -73,16 +73,7 @@ static const unsigned char totalBytes[256] = {
|
||||
#else
|
||||
1,1,1,1,1,1,1,1,
|
||||
#endif
|
||||
#if TCL_UTF_MAX > 4
|
||||
5,5,5,5,
|
||||
#else
|
||||
1,1,1,1,
|
||||
#endif
|
||||
#if TCL_UTF_MAX > 5
|
||||
6,6,6,6
|
||||
#else
|
||||
1,1,1,1
|
||||
#endif
|
||||
1,1,1,1,1,1,1,1
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -105,14 +96,14 @@ int
|
||||
TclUtfCount(
|
||||
int ch) /* The Tcl_UniChar whose size is returned. */
|
||||
{
|
||||
if ((ch > 0) && (ch < UNICODE_SELF)) {
|
||||
if ((unsigned)(ch - 1) < (UNICODE_SELF - 1)) {
|
||||
return 1;
|
||||
}
|
||||
if (ch <= 0x7FF) {
|
||||
return 2;
|
||||
}
|
||||
#if TCL_UTF_MAX > 3
|
||||
if ((ch > 0xFFFF) && (ch <= 0x10FFFF)) {
|
||||
if (((unsigned)(ch - 0x10000) <= 0xfffff)) {
|
||||
return 4;
|
||||
}
|
||||
#endif
|
||||
@@ -146,7 +137,7 @@ Tcl_UniCharToUtf(
|
||||
* large enough to hold the UTF-8 character
|
||||
* (at most TCL_UTF_MAX bytes). */
|
||||
{
|
||||
if ((ch > 0) && (ch < UNICODE_SELF)) {
|
||||
if ((unsigned)(ch - 1) < (UNICODE_SELF - 1)) {
|
||||
buf[0] = (char) ch;
|
||||
return 1;
|
||||
}
|
||||
@@ -174,11 +165,7 @@ Tcl_UniCharToUtf(
|
||||
}
|
||||
}
|
||||
#endif
|
||||
three:
|
||||
buf[2] = (char) ((ch | 0x80) & 0xBF);
|
||||
buf[1] = (char) (((ch >> 6) | 0x80) & 0xBF);
|
||||
buf[0] = (char) ((ch >> 12) | 0xE0);
|
||||
return 3;
|
||||
goto three;
|
||||
}
|
||||
|
||||
#if TCL_UTF_MAX > 3
|
||||
@@ -193,7 +180,11 @@ Tcl_UniCharToUtf(
|
||||
}
|
||||
|
||||
ch = 0xFFFD;
|
||||
goto three;
|
||||
three:
|
||||
buf[2] = (char) ((ch | 0x80) & 0xBF);
|
||||
buf[1] = (char) (((ch >> 6) | 0x80) & 0xBF);
|
||||
buf[0] = (char) ((ch >> 12) | 0xE0);
|
||||
return 3;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -308,9 +299,6 @@ Tcl_UtfToUniChar(
|
||||
* A two-byte-character lead-byte not followed by trail-byte
|
||||
* represents itself.
|
||||
*/
|
||||
|
||||
*chPtr = (Tcl_UniChar) byte;
|
||||
return 1;
|
||||
} else if (byte < 0xF0) {
|
||||
if (((src[1] & 0xC0) == 0x80) && ((src[2] & 0xC0) == 0x80)) {
|
||||
/*
|
||||
@@ -326,31 +314,23 @@ Tcl_UtfToUniChar(
|
||||
* A three-byte-character lead-byte not followed by two trail-bytes
|
||||
* represents itself.
|
||||
*/
|
||||
|
||||
*chPtr = (Tcl_UniChar) byte;
|
||||
return 1;
|
||||
}
|
||||
#if TCL_UTF_MAX > 3
|
||||
{
|
||||
int ch, total, trail;
|
||||
else if (byte < 0xF8) {
|
||||
if (((src[1] & 0xC0) == 0x80) && ((src[2] & 0xC0) == 0x80) && ((src[3] & 0xC0) == 0x80)) {
|
||||
/*
|
||||
* Four-byte-character lead byte followed by three trail bytes.
|
||||
*/
|
||||
|
||||
total = totalBytes[byte];
|
||||
trail = total - 1;
|
||||
if (trail > 0) {
|
||||
ch = byte & (0x3F >> trail);
|
||||
do {
|
||||
src++;
|
||||
if ((*src & 0xC0) != 0x80) {
|
||||
*chPtr = byte;
|
||||
return 1;
|
||||
}
|
||||
ch <<= 6;
|
||||
ch |= (*src & 0x3F);
|
||||
trail--;
|
||||
} while (trail > 0);
|
||||
*chPtr = ch;
|
||||
return total;
|
||||
*chPtr = (Tcl_UniChar) (((byte & 0x0E) << 18) | ((src[1] & 0x3F) << 12)
|
||||
| ((src[2] & 0x3F) << 6) | (src[3] & 0x3F));
|
||||
return 4;
|
||||
}
|
||||
|
||||
/*
|
||||
* A three-byte-character lead-byte not followed by two trail-bytes
|
||||
* represents itself.
|
||||
*/
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
+3
-3
@@ -1968,7 +1968,7 @@ Tcl_ConcatObj(
|
||||
if (TclListObjIsCanonical(objPtr)) {
|
||||
continue;
|
||||
}
|
||||
Tcl_GetStringFromObj(objPtr, &length);
|
||||
TclGetStringFromObj(objPtr, &length);
|
||||
if (length > 0) {
|
||||
break;
|
||||
}
|
||||
@@ -2677,7 +2677,7 @@ TclDStringAppendObj(
|
||||
Tcl_Obj *objPtr)
|
||||
{
|
||||
int length;
|
||||
char *bytes = Tcl_GetStringFromObj(objPtr, &length);
|
||||
char *bytes = TclGetStringFromObj(objPtr, &length);
|
||||
|
||||
return Tcl_DStringAppend(dsPtr, bytes, length);
|
||||
}
|
||||
@@ -4000,7 +4000,7 @@ TclSetProcessGlobalValue(
|
||||
} else {
|
||||
Tcl_CreateExitHandler(FreeProcessGlobalValue, pgvPtr);
|
||||
}
|
||||
bytes = Tcl_GetStringFromObj(newValue, &pgvPtr->numBytes);
|
||||
bytes = TclGetStringFromObj(newValue, &pgvPtr->numBytes);
|
||||
pgvPtr->value = ckalloc(pgvPtr->numBytes + 1);
|
||||
memcpy(pgvPtr->value, bytes, (unsigned) pgvPtr->numBytes + 1);
|
||||
if (pgvPtr->encoding) {
|
||||
|
||||
+145
-368
@@ -149,6 +149,7 @@ static const char *isArrayElement =
|
||||
*/
|
||||
|
||||
typedef struct ArraySearch {
|
||||
Tcl_Obj *name; /* Name of this search */
|
||||
int id; /* Integer id used to distinguish among
|
||||
* multiple concurrent searches for the same
|
||||
* array. */
|
||||
@@ -188,8 +189,7 @@ static ArraySearch * ParseSearchId(Tcl_Interp *interp, const Var *varPtr,
|
||||
static void UnsetVarStruct(Var *varPtr, Var *arrayPtr,
|
||||
Interp *iPtr, Tcl_Obj *part1Ptr,
|
||||
Tcl_Obj *part2Ptr, int flags, int index);
|
||||
static int SetArraySearchObj(Tcl_Interp *interp,
|
||||
Tcl_Obj *objPtr);
|
||||
static Var * VerifyArray(Tcl_Interp *interp, Tcl_Obj *varNameObj);
|
||||
|
||||
/*
|
||||
* Functions defined in this file that may be exported in the future for use
|
||||
@@ -214,10 +214,6 @@ static Tcl_DupInternalRepProc DupParsedVarName;
|
||||
* or NULL if it is this same obj
|
||||
* twoPtrValue.ptr2: index into locals table
|
||||
*
|
||||
* nsVarName - INTERNALREP DEFINITION:
|
||||
* twoPtrValue.ptr1: pointer to the namespace containing the reference
|
||||
* twoPtrValue.ptr2: pointer to the corresponding Var
|
||||
*
|
||||
* parsedVarName - INTERNALREP DEFINITION:
|
||||
* twoPtrValue.ptr1: pointer to the array name Tcl_Obj, or NULL if it is a
|
||||
* scalar variable
|
||||
@@ -235,22 +231,6 @@ static const Tcl_ObjType tclParsedVarNameType = {
|
||||
FreeParsedVarName, DupParsedVarName, NULL, NULL
|
||||
};
|
||||
|
||||
/*
|
||||
* Type of Tcl_Objs used to speed up array searches.
|
||||
*
|
||||
* INTERNALREP DEFINITION:
|
||||
* twoPtrValue.ptr1: searchIdNumber (cast to pointer)
|
||||
* twoPtrValue.ptr2: variableNameStartInString (cast to pointer)
|
||||
*
|
||||
* Note that the value stored in ptr2 is the offset into the string of the
|
||||
* start of the variable name and not the address of the variable name itself,
|
||||
* as this can be safely copied.
|
||||
*/
|
||||
|
||||
const Tcl_ObjType tclArraySearchType = {
|
||||
"array search",
|
||||
NULL, NULL, NULL, SetArraySearchObj
|
||||
};
|
||||
|
||||
Var *
|
||||
TclVarHashCreateVar(
|
||||
@@ -521,16 +501,13 @@ TclObjLookupVarEx(
|
||||
* is set to NULL. */
|
||||
{
|
||||
Interp *iPtr = (Interp *) interp;
|
||||
CallFrame *varFramePtr = iPtr->varFramePtr;
|
||||
register Var *varPtr; /* Points to the variable's in-frame Var
|
||||
* structure. */
|
||||
const char *part1;
|
||||
int index, len1, len2;
|
||||
int parsed = 0;
|
||||
Tcl_Obj *objPtr;
|
||||
const Tcl_ObjType *typePtr = part1Ptr->typePtr;
|
||||
const char *errMsg = NULL;
|
||||
CallFrame *varFramePtr = iPtr->varFramePtr;
|
||||
const char *part2 = part2Ptr? TclGetString(part2Ptr):NULL;
|
||||
int index, parsed = 0;
|
||||
const Tcl_ObjType *typePtr = part1Ptr->typePtr;
|
||||
|
||||
*arrayPtrPtr = NULL;
|
||||
|
||||
if (typePtr == &localVarNameType) {
|
||||
@@ -546,7 +523,7 @@ TclObjLookupVarEx(
|
||||
*/
|
||||
|
||||
Tcl_Obj *namePtr = part1Ptr->internalRep.twoPtrValue.ptr1;
|
||||
Tcl_Obj *checkNamePtr = localName(iPtr->varFramePtr, localIndex);
|
||||
Tcl_Obj *checkNamePtr = localName(varFramePtr, localIndex);
|
||||
|
||||
if ((!namePtr && (checkNamePtr == part1Ptr)) ||
|
||||
(namePtr && (checkNamePtr == namePtr))) {
|
||||
@@ -577,11 +554,7 @@ TclObjLookupVarEx(
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
if ((part2Ptr = part1Ptr->internalRep.twoPtrValue.ptr2)) {
|
||||
if (createPart2) {
|
||||
Tcl_IncrRefCount(part2Ptr);
|
||||
}
|
||||
}
|
||||
part2Ptr = part1Ptr->internalRep.twoPtrValue.ptr2;
|
||||
part1Ptr = part1Ptr->internalRep.twoPtrValue.ptr1;
|
||||
typePtr = part1Ptr->typePtr;
|
||||
if (typePtr == &localVarNameType) {
|
||||
@@ -590,18 +563,23 @@ TclObjLookupVarEx(
|
||||
}
|
||||
parsed = 1;
|
||||
}
|
||||
part1 = TclGetStringFromObj(part1Ptr, &len1);
|
||||
|
||||
if (!parsed && len1 && (*(part1 + len1 - 1) == ')')) {
|
||||
if (!parsed) {
|
||||
|
||||
/*
|
||||
* part1Ptr is possibly an unparsed array element.
|
||||
*/
|
||||
|
||||
register int i;
|
||||
int len;
|
||||
const char *part1 = TclGetStringFromObj(part1Ptr, &len);
|
||||
|
||||
if (len > 1 && (part1[len - 1] == ')')) {
|
||||
|
||||
const char *part2 = strchr(part1, '(');
|
||||
|
||||
if (part2) {
|
||||
Tcl_Obj *arrayPtr;
|
||||
|
||||
len2 = -1;
|
||||
for (i = 0; i < len1; i++) {
|
||||
if (*(part1 + i) == '(') {
|
||||
if (part2Ptr != NULL) {
|
||||
if (flags & TCL_LEAVE_ERR_MSG) {
|
||||
TclObjVarErrMsg(interp, part1Ptr, part2Ptr, msg,
|
||||
@@ -612,47 +590,19 @@ TclObjLookupVarEx(
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* part1Ptr points to an array element; first copy the element
|
||||
* name to a new string part2.
|
||||
*/
|
||||
arrayPtr = Tcl_NewStringObj(part1, (part2 - part1));
|
||||
part2Ptr = Tcl_NewStringObj(part2 + 1, len - (part2 - part1) - 2);
|
||||
|
||||
part2 = part1 + i + 1;
|
||||
len2 = len1 - i - 2;
|
||||
len1 = i;
|
||||
TclFreeIntRep(part1Ptr);
|
||||
|
||||
part2Ptr = Tcl_NewStringObj(part2, len2);
|
||||
if (createPart2) {
|
||||
Tcl_IncrRefCount(part2Ptr);
|
||||
}
|
||||
Tcl_IncrRefCount(arrayPtr);
|
||||
part1Ptr->internalRep.twoPtrValue.ptr1 = arrayPtr;
|
||||
Tcl_IncrRefCount(part2Ptr);
|
||||
part1Ptr->internalRep.twoPtrValue.ptr2 = part2Ptr;
|
||||
part1Ptr->typePtr = &tclParsedVarNameType;
|
||||
|
||||
/*
|
||||
* Free the internal rep of the original part1Ptr, now renamed
|
||||
* objPtr, and set it to tclParsedVarNameType.
|
||||
*/
|
||||
|
||||
objPtr = part1Ptr;
|
||||
TclFreeIntRep(objPtr);
|
||||
objPtr->typePtr = &tclParsedVarNameType;
|
||||
|
||||
/*
|
||||
* Define a new string object to hold the new part1Ptr, i.e.,
|
||||
* the array name. Set the internal rep of objPtr, reset
|
||||
* typePtr and part1 to contain the references to the array
|
||||
* name.
|
||||
*/
|
||||
|
||||
TclNewStringObj(part1Ptr, part1, len1);
|
||||
Tcl_IncrRefCount(part1Ptr);
|
||||
|
||||
objPtr->internalRep.twoPtrValue.ptr1 = part1Ptr;
|
||||
Tcl_IncrRefCount(part2Ptr);
|
||||
objPtr->internalRep.twoPtrValue.ptr2 = part2Ptr;
|
||||
|
||||
typePtr = part1Ptr->typePtr;
|
||||
part1 = TclGetString(part1Ptr);
|
||||
break;
|
||||
}
|
||||
part1Ptr = arrayPtr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -662,8 +612,6 @@ TclObjLookupVarEx(
|
||||
* the cached types if possible.
|
||||
*/
|
||||
|
||||
TclFreeIntRep(part1Ptr);
|
||||
|
||||
varPtr = TclLookupSimpleVar(interp, part1Ptr, flags, createPart1,
|
||||
&errMsg, &index);
|
||||
if (varPtr == NULL) {
|
||||
@@ -679,11 +627,12 @@ TclObjLookupVarEx(
|
||||
* Cache the newly found variable if possible.
|
||||
*/
|
||||
|
||||
TclFreeIntRep(part1Ptr);
|
||||
if (index >= 0) {
|
||||
/*
|
||||
* An indexed local variable.
|
||||
*/
|
||||
Tcl_Obj *cachedNamePtr = localName(iPtr->varFramePtr, index);
|
||||
Tcl_Obj *cachedNamePtr = localName(varFramePtr, index);
|
||||
|
||||
part1Ptr->typePtr = &localVarNameType;
|
||||
if (part1Ptr != cachedNamePtr) {
|
||||
@@ -724,21 +673,6 @@ TclObjLookupVarEx(
|
||||
return varPtr;
|
||||
}
|
||||
|
||||
/*
|
||||
* This flag bit should not interfere with TCL_GLOBAL_ONLY,
|
||||
* TCL_NAMESPACE_ONLY, or TCL_LEAVE_ERR_MSG; it signals that the variable
|
||||
* lookup is performed for upvar (or similar) purposes, with slightly
|
||||
* different rules:
|
||||
* - Bug #696893 - variable is either proc-local or in the current
|
||||
* namespace; never follow the second (global) resolution path
|
||||
* - Bug #631741 - do not use special namespace or interp resolvers
|
||||
*
|
||||
* It should also not collide with the (deprecated) TCL_PARSE_PART1 flag
|
||||
* (Bug #835020)
|
||||
*/
|
||||
|
||||
#define AVOID_RESOLVERS 0x40000
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
@@ -788,8 +722,8 @@ TclLookupSimpleVar(
|
||||
Tcl_Obj *varNamePtr, /* This is a simple variable name that could
|
||||
* represent a scalar or an array. */
|
||||
int flags, /* Only TCL_GLOBAL_ONLY, TCL_NAMESPACE_ONLY,
|
||||
* AVOID_RESOLVERS and TCL_LEAVE_ERR_MSG bits
|
||||
* matter. */
|
||||
* TCL_AVOID_RESOLVERS and TCL_LEAVE_ERR_MSG
|
||||
* bits matter. */
|
||||
const int create, /* If 1, create hash table entry for varname,
|
||||
* if it doesn't already exist. If 0, return
|
||||
* error if it doesn't exist. */
|
||||
@@ -829,7 +763,7 @@ TclLookupSimpleVar(
|
||||
*/
|
||||
|
||||
if ((cxtNsPtr->varResProc != NULL || iPtr->resolverPtr != NULL)
|
||||
&& !(flags & AVOID_RESOLVERS)) {
|
||||
&& !(flags & TCL_AVOID_RESOLVERS)) {
|
||||
resPtr = iPtr->resolverPtr;
|
||||
if (cxtNsPtr->varResProc) {
|
||||
result = cxtNsPtr->varResProc(interp, varName,
|
||||
@@ -882,7 +816,7 @@ TclLookupSimpleVar(
|
||||
*indexPtr = -1;
|
||||
flags = (flags | TCL_GLOBAL_ONLY) & ~TCL_NAMESPACE_ONLY;
|
||||
} else {
|
||||
if (flags & AVOID_RESOLVERS) {
|
||||
if (flags & TCL_AVOID_RESOLVERS) {
|
||||
flags = (flags | TCL_NAMESPACE_ONLY);
|
||||
}
|
||||
if (flags & TCL_NAMESPACE_ONLY) {
|
||||
@@ -897,7 +831,7 @@ TclLookupSimpleVar(
|
||||
|
||||
varPtr = (Var *) ObjFindNamespaceVar(interp, varNamePtr,
|
||||
(Tcl_Namespace *) cxtNsPtr,
|
||||
(flags | AVOID_RESOLVERS) & ~TCL_LEAVE_ERR_MSG);
|
||||
(flags | TCL_AVOID_RESOLVERS) & ~TCL_LEAVE_ERR_MSG);
|
||||
if (varPtr == NULL) {
|
||||
Tcl_Obj *tailPtr;
|
||||
|
||||
@@ -2913,34 +2847,22 @@ TclArraySet(
|
||||
*/
|
||||
|
||||
/* ARGSUSED */
|
||||
static int
|
||||
ArrayStartSearchCmd(
|
||||
ClientData clientData,
|
||||
|
||||
static Var *
|
||||
VerifyArray(
|
||||
Tcl_Interp *interp,
|
||||
int objc,
|
||||
Tcl_Obj *const objv[])
|
||||
Tcl_Obj *varNameObj)
|
||||
{
|
||||
Interp *iPtr = (Interp *) interp;
|
||||
Var *varPtr, *arrayPtr;
|
||||
Tcl_HashEntry *hPtr;
|
||||
Tcl_Obj *varNameObj;
|
||||
int isNew;
|
||||
ArraySearch *searchPtr;
|
||||
const char *varName;
|
||||
|
||||
if (objc != 2) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "arrayName");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
varNameObj = objv[1];
|
||||
const char *varName = TclGetString(varNameObj);
|
||||
Var *arrayPtr;
|
||||
|
||||
/*
|
||||
* Locate the array variable.
|
||||
*/
|
||||
|
||||
varPtr = TclObjLookupVarEx(interp, varNameObj, NULL, /*flags*/ 0,
|
||||
Var *varPtr = TclObjLookupVarEx(interp, varNameObj, NULL, /*flags*/ 0,
|
||||
/*msg*/ 0, /*createPart1*/ 0, /*createPart2*/ 0, &arrayPtr);
|
||||
varName = TclGetString(varNameObj);
|
||||
|
||||
/*
|
||||
* Special array trace used to keep the env array in sync for array names,
|
||||
@@ -2952,7 +2874,7 @@ ArrayStartSearchCmd(
|
||||
if (TclObjCallVarTraces(iPtr, arrayPtr, varPtr, varNameObj, NULL,
|
||||
(TCL_LEAVE_ERR_MSG|TCL_NAMESPACE_ONLY|TCL_GLOBAL_ONLY|
|
||||
TCL_TRACE_ARRAY), /* leaveErrMsg */ 1, -1) == TCL_ERROR) {
|
||||
return TCL_ERROR;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2962,11 +2884,36 @@ ArrayStartSearchCmd(
|
||||
* traces.
|
||||
*/
|
||||
|
||||
if ((varPtr == NULL) || !TclIsVarArray(varPtr)
|
||||
|| TclIsVarUndefined(varPtr)) {
|
||||
if ((varPtr == NULL) || !TclIsVarArray(varPtr) || TclIsVarUndefined(varPtr)) {
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"\"%s\" isn't an array", varName));
|
||||
Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ARRAY", varName, NULL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return varPtr;
|
||||
}
|
||||
|
||||
static int
|
||||
ArrayStartSearchCmd(
|
||||
ClientData clientData,
|
||||
Tcl_Interp *interp,
|
||||
int objc,
|
||||
Tcl_Obj *const objv[])
|
||||
{
|
||||
Interp *iPtr = (Interp *) interp;
|
||||
Var *varPtr;
|
||||
Tcl_HashEntry *hPtr;
|
||||
int isNew;
|
||||
ArraySearch *searchPtr;
|
||||
|
||||
if (objc != 2) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "arrayName");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
varPtr = VerifyArray(interp, objv[1]);
|
||||
if (varPtr == NULL) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
@@ -2988,8 +2935,9 @@ ArrayStartSearchCmd(
|
||||
searchPtr->nextEntry = VarHashFirstEntry(varPtr->value.tablePtr,
|
||||
&searchPtr->search);
|
||||
Tcl_SetHashValue(hPtr, searchPtr);
|
||||
Tcl_SetObjResult(interp,
|
||||
Tcl_ObjPrintf("s-%d-%s", searchPtr->id, varName));
|
||||
searchPtr->name = Tcl_ObjPrintf("s-%d-%s", searchPtr->id, TclGetString(objv[1]));
|
||||
Tcl_IncrRefCount(searchPtr->name);
|
||||
Tcl_SetObjResult(interp, searchPtr->name);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -3019,7 +2967,7 @@ ArrayAnyMoreCmd(
|
||||
Tcl_Obj *const objv[])
|
||||
{
|
||||
Interp *iPtr = (Interp *) interp;
|
||||
Var *varPtr, *arrayPtr;
|
||||
Var *varPtr;
|
||||
Tcl_Obj *varNameObj, *searchObj;
|
||||
int gotValue;
|
||||
ArraySearch *searchPtr;
|
||||
@@ -3031,39 +2979,8 @@ ArrayAnyMoreCmd(
|
||||
varNameObj = objv[1];
|
||||
searchObj = objv[2];
|
||||
|
||||
/*
|
||||
* Locate the array variable.
|
||||
*/
|
||||
|
||||
varPtr = TclObjLookupVarEx(interp, varNameObj, NULL, /*flags*/ 0,
|
||||
/*msg*/ 0, /*createPart1*/ 0, /*createPart2*/ 0, &arrayPtr);
|
||||
|
||||
/*
|
||||
* Special array trace used to keep the env array in sync for array names,
|
||||
* array get, etc.
|
||||
*/
|
||||
|
||||
if (varPtr && (varPtr->flags & VAR_TRACED_ARRAY)
|
||||
&& (TclIsVarArray(varPtr) || TclIsVarUndefined(varPtr))) {
|
||||
if (TclObjCallVarTraces(iPtr, arrayPtr, varPtr, varNameObj, NULL,
|
||||
(TCL_LEAVE_ERR_MSG|TCL_NAMESPACE_ONLY|TCL_GLOBAL_ONLY|
|
||||
TCL_TRACE_ARRAY), /* leaveErrMsg */ 1, -1) == TCL_ERROR) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Verify that it is indeed an array variable. This test comes after the
|
||||
* traces - the variable may actually become an array as an effect of said
|
||||
* traces.
|
||||
*/
|
||||
|
||||
if ((varPtr == NULL) || !TclIsVarArray(varPtr)
|
||||
|| TclIsVarUndefined(varPtr)) {
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"\"%s\" isn't an array", TclGetString(varNameObj)));
|
||||
Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ARRAY",
|
||||
TclGetString(varNameObj), NULL);
|
||||
varPtr = VerifyArray(interp, varNameObj);
|
||||
if (varPtr == NULL) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
@@ -3125,8 +3042,7 @@ ArrayNextElementCmd(
|
||||
int objc,
|
||||
Tcl_Obj *const objv[])
|
||||
{
|
||||
Interp *iPtr = (Interp *) interp;
|
||||
Var *varPtr, *arrayPtr;
|
||||
Var *varPtr;
|
||||
Tcl_Obj *varNameObj, *searchObj;
|
||||
ArraySearch *searchPtr;
|
||||
|
||||
@@ -3137,39 +3053,8 @@ ArrayNextElementCmd(
|
||||
varNameObj = objv[1];
|
||||
searchObj = objv[2];
|
||||
|
||||
/*
|
||||
* Locate the array variable.
|
||||
*/
|
||||
|
||||
varPtr = TclObjLookupVarEx(interp, varNameObj, NULL, /*flags*/ 0,
|
||||
/*msg*/ 0, /*createPart1*/ 0, /*createPart2*/ 0, &arrayPtr);
|
||||
|
||||
/*
|
||||
* Special array trace used to keep the env array in sync for array names,
|
||||
* array get, etc.
|
||||
*/
|
||||
|
||||
if (varPtr && (varPtr->flags & VAR_TRACED_ARRAY)
|
||||
&& (TclIsVarArray(varPtr) || TclIsVarUndefined(varPtr))) {
|
||||
if (TclObjCallVarTraces(iPtr, arrayPtr, varPtr, varNameObj, NULL,
|
||||
(TCL_LEAVE_ERR_MSG|TCL_NAMESPACE_ONLY|TCL_GLOBAL_ONLY|
|
||||
TCL_TRACE_ARRAY), /* leaveErrMsg */ 1, -1) == TCL_ERROR) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Verify that it is indeed an array variable. This test comes after the
|
||||
* traces - the variable may actually become an array as an effect of said
|
||||
* traces.
|
||||
*/
|
||||
|
||||
if ((varPtr == NULL) || !TclIsVarArray(varPtr)
|
||||
|| TclIsVarUndefined(varPtr)) {
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"\"%s\" isn't an array", TclGetString(varNameObj)));
|
||||
Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ARRAY",
|
||||
TclGetString(varNameObj), NULL);
|
||||
varPtr = VerifyArray(interp, varNameObj);
|
||||
if (varPtr == NULL) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
@@ -3235,7 +3120,7 @@ ArrayDoneSearchCmd(
|
||||
Tcl_Obj *const objv[])
|
||||
{
|
||||
Interp *iPtr = (Interp *) interp;
|
||||
Var *varPtr, *arrayPtr;
|
||||
Var *varPtr;
|
||||
Tcl_HashEntry *hPtr;
|
||||
Tcl_Obj *varNameObj, *searchObj;
|
||||
ArraySearch *searchPtr, *prevPtr;
|
||||
@@ -3247,39 +3132,8 @@ ArrayDoneSearchCmd(
|
||||
varNameObj = objv[1];
|
||||
searchObj = objv[2];
|
||||
|
||||
/*
|
||||
* Locate the array variable.
|
||||
*/
|
||||
|
||||
varPtr = TclObjLookupVarEx(interp, varNameObj, NULL, /*flags*/ 0,
|
||||
/*msg*/ 0, /*createPart1*/ 0, /*createPart2*/ 0, &arrayPtr);
|
||||
|
||||
/*
|
||||
* Special array trace used to keep the env array in sync for array names,
|
||||
* array get, etc.
|
||||
*/
|
||||
|
||||
if (varPtr && (varPtr->flags & VAR_TRACED_ARRAY)
|
||||
&& (TclIsVarArray(varPtr) || TclIsVarUndefined(varPtr))) {
|
||||
if (TclObjCallVarTraces(iPtr, arrayPtr, varPtr, varNameObj, NULL,
|
||||
(TCL_LEAVE_ERR_MSG|TCL_NAMESPACE_ONLY|TCL_GLOBAL_ONLY|
|
||||
TCL_TRACE_ARRAY), /* leaveErrMsg */ 1, -1) == TCL_ERROR) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Verify that it is indeed an array variable. This test comes after the
|
||||
* traces - the variable may actually become an array as an effect of said
|
||||
* traces.
|
||||
*/
|
||||
|
||||
if ((varPtr == NULL) || !TclIsVarArray(varPtr)
|
||||
|| TclIsVarUndefined(varPtr)) {
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"\"%s\" isn't an array", TclGetString(varNameObj)));
|
||||
Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ARRAY",
|
||||
TclGetString(varNameObj), NULL);
|
||||
varPtr = VerifyArray(interp, varNameObj);
|
||||
if (varPtr == NULL) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
@@ -3313,6 +3167,7 @@ ArrayDoneSearchCmd(
|
||||
}
|
||||
}
|
||||
}
|
||||
Tcl_DecrRefCount(searchPtr->name);
|
||||
ckfree(searchPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
@@ -4379,15 +4234,15 @@ TclPtrObjMakeUpvar(
|
||||
|
||||
/*
|
||||
* Lookup and eventually create the new variable. Set the flag bit
|
||||
* AVOID_RESOLVERS to indicate the special resolution rules for upvar
|
||||
* purposes:
|
||||
* TCL_AVOID_RESOLVERS to indicate the special resolution rules for
|
||||
* upvar purposes:
|
||||
* - Bug #696893 - variable is either proc-local or in the current
|
||||
* namespace; never follow the second (global) resolution path.
|
||||
* - Bug #631741 - do not use special namespace or interp resolvers.
|
||||
*/
|
||||
|
||||
varPtr = TclLookupSimpleVar(interp, myNamePtr,
|
||||
myFlags|AVOID_RESOLVERS, /* create */ 1, &errMsg, &index);
|
||||
myFlags|TCL_AVOID_RESOLVERS, /* create */ 1, &errMsg, &index);
|
||||
if (varPtr == NULL) {
|
||||
TclObjVarErrMsg(interp, myNamePtr, NULL, "create", errMsg, -1);
|
||||
Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "VARNAME",
|
||||
@@ -4949,75 +4804,6 @@ Tcl_UpvarObjCmd(
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* SetArraySearchObj --
|
||||
*
|
||||
* This function converts the given tcl object into one that has the
|
||||
* "array search" internal type.
|
||||
*
|
||||
* Results:
|
||||
* TCL_OK if the conversion succeeded, and TCL_ERROR if it failed (when
|
||||
* an error message will be placed in the interpreter's result.)
|
||||
*
|
||||
* Side effects:
|
||||
* Updates the internal type and representation of the object to make
|
||||
* this an array-search object. See the tclArraySearchType declaration
|
||||
* above for details of the internal representation.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static int
|
||||
SetArraySearchObj(
|
||||
Tcl_Interp *interp,
|
||||
Tcl_Obj *objPtr)
|
||||
{
|
||||
const char *string;
|
||||
char *end; /* Can't be const due to strtoul defn. */
|
||||
int id;
|
||||
size_t offset;
|
||||
|
||||
/*
|
||||
* Get the string representation. Make it up-to-date if necessary.
|
||||
*/
|
||||
|
||||
string = TclGetString(objPtr);
|
||||
|
||||
/*
|
||||
* Parse the id into the three parts separated by dashes.
|
||||
*/
|
||||
|
||||
if ((string[0] != 's') || (string[1] != '-')) {
|
||||
goto syntax;
|
||||
}
|
||||
id = strtoul(string+2, &end, 10);
|
||||
if ((end == (string+2)) || (*end != '-')) {
|
||||
goto syntax;
|
||||
}
|
||||
|
||||
/*
|
||||
* Can't perform value check in this context, so place reference to place
|
||||
* in string to use for the check in the object instead.
|
||||
*/
|
||||
|
||||
end++;
|
||||
offset = end - string;
|
||||
|
||||
TclFreeIntRep(objPtr);
|
||||
objPtr->typePtr = &tclArraySearchType;
|
||||
objPtr->internalRep.twoPtrValue.ptr1 = INT2PTR(id);
|
||||
objPtr->internalRep.twoPtrValue.ptr2 = INT2PTR(offset);
|
||||
return TCL_OK;
|
||||
|
||||
syntax:
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"illegal search identifier \"%s\"", string));
|
||||
Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ARRAYSEARCH", string, NULL);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
@@ -5031,10 +4817,6 @@ SetArraySearchObj(
|
||||
* or NULL if there isn't one. If NULL is returned, the interp's result
|
||||
* contains an error message.
|
||||
*
|
||||
* Side effects:
|
||||
* The tcl object might have its internal type and representation
|
||||
* modified.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
@@ -5050,65 +4832,43 @@ ParseSearchId(
|
||||
* name. */
|
||||
{
|
||||
Interp *iPtr = (Interp *) interp;
|
||||
register const char *string;
|
||||
register size_t offset;
|
||||
int id;
|
||||
ArraySearch *searchPtr;
|
||||
const char *varName = TclGetString(varNamePtr);
|
||||
|
||||
/*
|
||||
* Parse the id.
|
||||
*/
|
||||
|
||||
if ((handleObj->typePtr != &tclArraySearchType)
|
||||
&& (SetArraySearchObj(interp, handleObj) != TCL_OK)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Extract the information out of the Tcl_Obj.
|
||||
*/
|
||||
|
||||
id = PTR2INT(handleObj->internalRep.twoPtrValue.ptr1);
|
||||
string = TclGetString(handleObj);
|
||||
offset = PTR2INT(handleObj->internalRep.twoPtrValue.ptr2);
|
||||
|
||||
/*
|
||||
* This test cannot be placed inside the Tcl_Obj machinery, since it is
|
||||
* dependent on the variable context.
|
||||
*/
|
||||
|
||||
if (strcmp(string+offset, varName) != 0) {
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"search identifier \"%s\" isn't for variable \"%s\"",
|
||||
string, varName));
|
||||
goto badLookup;
|
||||
}
|
||||
|
||||
/*
|
||||
* Search through the list of active searches on the interpreter to see if
|
||||
* the desired one exists.
|
||||
*
|
||||
* Note that we cannot store the searchPtr directly in the Tcl_Obj as that
|
||||
* would run into trouble when DeleteSearches() was called so we must scan
|
||||
* this list every time.
|
||||
*/
|
||||
const char *handle = TclGetString(handleObj);
|
||||
char *end;
|
||||
|
||||
if (varPtr->flags & VAR_SEARCH_ACTIVE) {
|
||||
Tcl_HashEntry *hPtr =
|
||||
Tcl_FindHashEntry(&iPtr->varSearches, varPtr);
|
||||
|
||||
/* First look for same (Tcl_Obj *) */
|
||||
for (searchPtr = Tcl_GetHashValue(hPtr); searchPtr != NULL;
|
||||
searchPtr = searchPtr->nextPtr) {
|
||||
if (searchPtr->id == id) {
|
||||
if (searchPtr->name == handleObj) {
|
||||
return searchPtr;
|
||||
}
|
||||
}
|
||||
/* Fallback: do string compares. */
|
||||
for (searchPtr = Tcl_GetHashValue(hPtr); searchPtr != NULL;
|
||||
searchPtr = searchPtr->nextPtr) {
|
||||
if (strcmp(TclGetString(searchPtr->name), handle) == 0) {
|
||||
return searchPtr;
|
||||
}
|
||||
}
|
||||
}
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"couldn't find search \"%s\"", string));
|
||||
badLookup:
|
||||
Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ARRAYSEARCH", string, NULL);
|
||||
if ((handle[0] != 's') || (handle[1] != '-')
|
||||
|| (strtoul(handle + 2, &end, 10), end == (handle + 2))
|
||||
|| (*end != '-')) {
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"illegal search identifier \"%s\"", handle));
|
||||
} else if (strcmp(end + 1, TclGetString(varNamePtr)) != 0) {
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"search identifier \"%s\" isn't for variable \"%s\"",
|
||||
handle, TclGetString(varNamePtr)));
|
||||
} else {
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"couldn't find search \"%s\"", handle));
|
||||
}
|
||||
Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ARRAYSEARCH", handle, NULL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -5143,6 +4903,7 @@ DeleteSearches(
|
||||
for (searchPtr = Tcl_GetHashValue(sPtr); searchPtr != NULL;
|
||||
searchPtr = nextPtr) {
|
||||
nextPtr = searchPtr->nextPtr;
|
||||
Tcl_DecrRefCount(searchPtr->name);
|
||||
ckfree(searchPtr);
|
||||
}
|
||||
arrayVarPtr->flags &= ~VAR_SEARCH_ACTIVE;
|
||||
@@ -5195,13 +4956,16 @@ TclDeleteNamespaceVars(
|
||||
VarHashRefCount(varPtr)++; /* Make sure we get to remove from
|
||||
* hash. */
|
||||
Tcl_GetVariableFullName(interp, (Tcl_Var) varPtr, objPtr);
|
||||
UnsetVarStruct(varPtr, NULL, iPtr, /* part1 */ objPtr, NULL, flags,
|
||||
-1);
|
||||
Tcl_DecrRefCount(objPtr); /* Free no longer needed obj */
|
||||
UnsetVarStruct(varPtr, NULL, iPtr, /* part1 */ objPtr,
|
||||
NULL, flags, -1);
|
||||
|
||||
/*
|
||||
* Remove the variable from the table and force it undefined in case
|
||||
* an unset trace brought it back from the dead.
|
||||
* We just unset the variable. However, an unset trace might
|
||||
* have re-set it, or might have re-established traces on it.
|
||||
* This namespace and its vartable are going away unconditionally,
|
||||
* so we cannot let such things linger. That would be a leak.
|
||||
*
|
||||
* First we destroy all traces. ...
|
||||
*/
|
||||
|
||||
if (TclIsVarTraced(varPtr)) {
|
||||
@@ -5225,6 +4989,17 @@ TclDeleteNamespaceVars(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* ...and then, if the variable still holds a value, we unset it
|
||||
* again. This time with no traces left, we're sure it goes away.
|
||||
*/
|
||||
|
||||
if (!TclIsVarUndefined(varPtr)) {
|
||||
UnsetVarStruct(varPtr, NULL, iPtr, /* part1 */ objPtr,
|
||||
NULL, flags, -1);
|
||||
}
|
||||
Tcl_DecrRefCount(objPtr); /* free no longer needed obj */
|
||||
VarHashRefCount(varPtr)--;
|
||||
VarHashDeleteEntry(varPtr);
|
||||
}
|
||||
@@ -5615,11 +5390,12 @@ Tcl_FindNamespaceVar(
|
||||
* Otherwise, points to namespace in which to
|
||||
* resolve name. If NULL, look up name in the
|
||||
* current namespace. */
|
||||
int flags) /* An OR'd combination of: AVOID_RESOLVERS,
|
||||
* TCL_GLOBAL_ONLY (look up name only in
|
||||
* global namespace), TCL_NAMESPACE_ONLY (look
|
||||
* up only in contextNsPtr, or the current
|
||||
* namespace if contextNsPtr is NULL), and
|
||||
int flags) /* An OR'd combination of:
|
||||
* TCL_AVOID_RESOLVERS, TCL_GLOBAL_ONLY (look
|
||||
* up name only in global namespace),
|
||||
* TCL_NAMESPACE_ONLY (look up only in
|
||||
* contextNsPtr, or the current namespace if
|
||||
* contextNsPtr is NULL), and
|
||||
* TCL_LEAVE_ERR_MSG. If both TCL_GLOBAL_ONLY
|
||||
* and TCL_NAMESPACE_ONLY are given,
|
||||
* TCL_GLOBAL_ONLY is ignored. */
|
||||
@@ -5645,11 +5421,12 @@ ObjFindNamespaceVar(
|
||||
* Otherwise, points to namespace in which to
|
||||
* resolve name. If NULL, look up name in the
|
||||
* current namespace. */
|
||||
int flags) /* An OR'd combination of: AVOID_RESOLVERS,
|
||||
* TCL_GLOBAL_ONLY (look up name only in
|
||||
* global namespace), TCL_NAMESPACE_ONLY (look
|
||||
* up only in contextNsPtr, or the current
|
||||
* namespace if contextNsPtr is NULL), and
|
||||
int flags) /* An OR'd combination of:
|
||||
* TCL_AVOID_RESOLVERS, TCL_GLOBAL_ONLY (look
|
||||
* up name only in global namespace),
|
||||
* TCL_NAMESPACE_ONLY (look up only in
|
||||
* contextNsPtr, or the current namespace if
|
||||
* contextNsPtr is NULL), and
|
||||
* TCL_LEAVE_ERR_MSG. If both TCL_GLOBAL_ONLY
|
||||
* and TCL_NAMESPACE_ONLY are given,
|
||||
* TCL_GLOBAL_ONLY is ignored. */
|
||||
@@ -5679,7 +5456,7 @@ ObjFindNamespaceVar(
|
||||
cxtNsPtr = (Namespace *) TclGetCurrentNamespace(interp);
|
||||
}
|
||||
|
||||
if (!(flags & AVOID_RESOLVERS) &&
|
||||
if (!(flags & TCL_AVOID_RESOLVERS) &&
|
||||
(cxtNsPtr->varResProc != NULL || iPtr->resolverPtr != NULL)) {
|
||||
resPtr = iPtr->resolverPtr;
|
||||
|
||||
|
||||
+36
-18
@@ -438,7 +438,7 @@ GenerateHeader(
|
||||
if (GetValue(interp, dictObj, "comment", &value) != TCL_OK) {
|
||||
goto error;
|
||||
} else if (value != NULL) {
|
||||
valueStr = Tcl_GetStringFromObj(value, &len);
|
||||
valueStr = TclGetStringFromObj(value, &len);
|
||||
Tcl_UtfToExternal(NULL, latin1enc, valueStr, len, 0, NULL,
|
||||
headerPtr->nativeCommentBuf, MAX_COMMENT_LEN-1, NULL, &len,
|
||||
NULL);
|
||||
@@ -459,7 +459,7 @@ GenerateHeader(
|
||||
if (GetValue(interp, dictObj, "filename", &value) != TCL_OK) {
|
||||
goto error;
|
||||
} else if (value != NULL) {
|
||||
valueStr = Tcl_GetStringFromObj(value, &len);
|
||||
valueStr = TclGetStringFromObj(value, &len);
|
||||
Tcl_UtfToExternal(NULL, latin1enc, valueStr, len, 0, NULL,
|
||||
headerPtr->nativeFilenameBuf, MAXPATHLEN-1, NULL, &len, NULL);
|
||||
headerPtr->nativeFilenameBuf[len] = '\0';
|
||||
@@ -2864,7 +2864,7 @@ ZlibTransformClose(
|
||||
Tcl_Interp *interp)
|
||||
{
|
||||
ZlibChannelData *cd = instanceData;
|
||||
int e, result = TCL_OK;
|
||||
int e, written, result = TCL_OK;
|
||||
|
||||
/*
|
||||
* Delete the support timer.
|
||||
@@ -2882,6 +2882,17 @@ ZlibTransformClose(
|
||||
cd->outStream.next_out = (Bytef *) cd->outBuffer;
|
||||
cd->outStream.avail_out = (unsigned) cd->outAllocated;
|
||||
e = deflate(&cd->outStream, Z_FINISH);
|
||||
written = cd->outAllocated - cd->outStream.avail_out;
|
||||
|
||||
/*
|
||||
* Can't be sure that deflate() won't declare the buffer to be
|
||||
* full (with Z_BUF_ERROR) so handle that case.
|
||||
*/
|
||||
|
||||
if (e == Z_BUF_ERROR) {
|
||||
e = Z_OK;
|
||||
written = cd->outAllocated;
|
||||
}
|
||||
if (e != Z_OK && e != Z_STREAM_END) {
|
||||
/* TODO: is this the right way to do errors on close? */
|
||||
if (!TclInThreadExit()) {
|
||||
@@ -2890,20 +2901,17 @@ ZlibTransformClose(
|
||||
result = TCL_ERROR;
|
||||
break;
|
||||
}
|
||||
if (cd->outStream.avail_out != (unsigned) cd->outAllocated) {
|
||||
if (Tcl_WriteRaw(cd->parent, cd->outBuffer,
|
||||
cd->outAllocated - cd->outStream.avail_out) < 0) {
|
||||
/* TODO: is this the right way to do errors on close?
|
||||
* Note: when close is called from FinalizeIOSubsystem
|
||||
* then interp may be NULL */
|
||||
if (!TclInThreadExit() && interp) {
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"error while finalizing file: %s",
|
||||
Tcl_PosixError(interp)));
|
||||
}
|
||||
result = TCL_ERROR;
|
||||
break;
|
||||
if (written && Tcl_WriteRaw(cd->parent, cd->outBuffer, written) < 0) {
|
||||
/* TODO: is this the right way to do errors on close?
|
||||
* Note: when close is called from FinalizeIOSubsystem then
|
||||
* interp may be NULL */
|
||||
if (!TclInThreadExit() && interp) {
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"error while finalizing file: %s",
|
||||
Tcl_PosixError(interp)));
|
||||
}
|
||||
result = TCL_ERROR;
|
||||
break;
|
||||
}
|
||||
} while (e != Z_STREAM_END);
|
||||
(void) deflateEnd(&cd->outStream);
|
||||
@@ -3084,7 +3092,17 @@ ZlibTransformOutput(
|
||||
e = deflate(&cd->outStream, Z_NO_FLUSH);
|
||||
produced = cd->outAllocated - cd->outStream.avail_out;
|
||||
|
||||
if (e == Z_OK && produced > 0) {
|
||||
if ((e == Z_OK && produced > 0) || e == Z_BUF_ERROR) {
|
||||
/*
|
||||
* deflate() indicates that it is out of space by returning
|
||||
* Z_BUF_ERROR; in that case, we must write the whole buffer out
|
||||
* and retry to compress what is left.
|
||||
*/
|
||||
|
||||
if (e == Z_BUF_ERROR) {
|
||||
produced = cd->outAllocated;
|
||||
e = Z_OK;
|
||||
}
|
||||
if (Tcl_WriteRaw(cd->parent, cd->outBuffer, produced) < 0) {
|
||||
*errorCodePtr = Tcl_GetErrno();
|
||||
return -1;
|
||||
@@ -3346,7 +3364,7 @@ ZlibTransformGetOption(
|
||||
} else {
|
||||
if (cd->compDictObj) {
|
||||
int len;
|
||||
const char *str = Tcl_GetStringFromObj(cd->compDictObj, &len);
|
||||
const char *str = TclGetStringFromObj(cd->compDictObj, &len);
|
||||
|
||||
Tcl_DStringAppend(dsPtr, str, len);
|
||||
}
|
||||
|
||||
+3
-8
@@ -122,11 +122,9 @@ proc tcl_findLibrary {basename version patch initScript enVarName varName} {
|
||||
# uniquify $dirs in order
|
||||
array set seen {}
|
||||
foreach i $dirs {
|
||||
# Take note that the [file normalize] below has been noted to cause
|
||||
# difficulties for the freewrap utility. See Bug 1072136. Until
|
||||
# freewrap resolves the matter, one might work around the problem by
|
||||
# disabling that branch.
|
||||
# Make sure $i is unique under normalization. Avoid repeated [source].
|
||||
if {[interp issafe]} {
|
||||
# Safe interps have no [file normalize].
|
||||
set norm $i
|
||||
} else {
|
||||
set norm [file normalize $i]
|
||||
@@ -135,10 +133,7 @@ proc tcl_findLibrary {basename version patch initScript enVarName varName} {
|
||||
continue
|
||||
}
|
||||
set seen($norm) {}
|
||||
lappend uniqdirs $i
|
||||
}
|
||||
set dirs $uniqdirs
|
||||
foreach i $dirs {
|
||||
|
||||
set the_library $i
|
||||
set file [file join $i $initScript]
|
||||
|
||||
|
||||
@@ -2709,7 +2709,7 @@ proc tcltest::GetMatchingDirectories {rootdir} {
|
||||
DebugPuts 1 "No test directories remain after applying match\
|
||||
and skip patterns!"
|
||||
}
|
||||
return $matchDirs
|
||||
return [lsort $matchDirs]
|
||||
}
|
||||
|
||||
# tcltest::runAllTests --
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:America/Cambridge_Bay) {
|
||||
{-9223372036854775808 0 0 zzz}
|
||||
{-9223372036854775808 0 0 -00}
|
||||
{-1577923200 -25200 0 MST}
|
||||
{-880210800 -21600 1 MWT}
|
||||
{-769395600 -21600 1 MPT}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:America/Inuvik) {
|
||||
{-9223372036854775808 0 0 zzz}
|
||||
{-9223372036854775808 0 0 -00}
|
||||
{-536457600 -28800 0 PST}
|
||||
{-147888000 -21600 1 PDDT}
|
||||
{-131558400 -28800 0 PST}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:America/Iqaluit) {
|
||||
{-9223372036854775808 0 0 zzz}
|
||||
{-9223372036854775808 0 0 -00}
|
||||
{-865296000 -14400 0 EWT}
|
||||
{-769395600 -14400 1 EPT}
|
||||
{-765396000 -18000 0 EST}
|
||||
|
||||
@@ -11,41 +11,41 @@ set TZData(:America/Los_Angeles) {
|
||||
{-769395600 -25200 1 PPT}
|
||||
{-765385200 -28800 0 PST}
|
||||
{-757353600 -28800 0 PST}
|
||||
{-687967200 -25200 1 PDT}
|
||||
{-687967140 -25200 1 PDT}
|
||||
{-662655600 -28800 0 PST}
|
||||
{-620834400 -25200 1 PDT}
|
||||
{-620838000 -25200 1 PDT}
|
||||
{-608137200 -28800 0 PST}
|
||||
{-589384800 -25200 1 PDT}
|
||||
{-589388400 -25200 1 PDT}
|
||||
{-576082800 -28800 0 PST}
|
||||
{-557935200 -25200 1 PDT}
|
||||
{-557938800 -25200 1 PDT}
|
||||
{-544633200 -28800 0 PST}
|
||||
{-526485600 -25200 1 PDT}
|
||||
{-526489200 -25200 1 PDT}
|
||||
{-513183600 -28800 0 PST}
|
||||
{-495036000 -25200 1 PDT}
|
||||
{-495039600 -25200 1 PDT}
|
||||
{-481734000 -28800 0 PST}
|
||||
{-463586400 -25200 1 PDT}
|
||||
{-463590000 -25200 1 PDT}
|
||||
{-450284400 -28800 0 PST}
|
||||
{-431532000 -25200 1 PDT}
|
||||
{-431535600 -25200 1 PDT}
|
||||
{-418230000 -28800 0 PST}
|
||||
{-400082400 -25200 1 PDT}
|
||||
{-400086000 -25200 1 PDT}
|
||||
{-386780400 -28800 0 PST}
|
||||
{-368632800 -25200 1 PDT}
|
||||
{-368636400 -25200 1 PDT}
|
||||
{-355330800 -28800 0 PST}
|
||||
{-337183200 -25200 1 PDT}
|
||||
{-337186800 -25200 1 PDT}
|
||||
{-323881200 -28800 0 PST}
|
||||
{-305733600 -25200 1 PDT}
|
||||
{-305737200 -25200 1 PDT}
|
||||
{-292431600 -28800 0 PST}
|
||||
{-273679200 -25200 1 PDT}
|
||||
{-273682800 -25200 1 PDT}
|
||||
{-260982000 -28800 0 PST}
|
||||
{-242229600 -25200 1 PDT}
|
||||
{-242233200 -25200 1 PDT}
|
||||
{-226508400 -28800 0 PST}
|
||||
{-210780000 -25200 1 PDT}
|
||||
{-210783600 -25200 1 PDT}
|
||||
{-195058800 -28800 0 PST}
|
||||
{-179330400 -25200 1 PDT}
|
||||
{-179334000 -25200 1 PDT}
|
||||
{-163609200 -28800 0 PST}
|
||||
{-147880800 -25200 1 PDT}
|
||||
{-147884400 -25200 1 PDT}
|
||||
{-131554800 -28800 0 PST}
|
||||
{-116431200 -25200 1 PDT}
|
||||
{-116434800 -25200 1 PDT}
|
||||
{-100105200 -28800 0 PST}
|
||||
{-94665600 -28800 0 PST}
|
||||
{-84376800 -25200 1 PDT}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:America/Pangnirtung) {
|
||||
{-9223372036854775808 0 0 zzz}
|
||||
{-9223372036854775808 0 0 -00}
|
||||
{-1546300800 -14400 0 AST}
|
||||
{-880221600 -10800 1 AWT}
|
||||
{-769395600 -10800 1 APT}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:America/Rankin_Inlet) {
|
||||
{-9223372036854775808 0 0 zzz}
|
||||
{-9223372036854775808 0 0 -00}
|
||||
{-410227200 -21600 0 CST}
|
||||
{-147895200 -14400 1 CDDT}
|
||||
{-131565600 -21600 0 CST}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:America/Resolute) {
|
||||
{-9223372036854775808 0 0 zzz}
|
||||
{-9223372036854775808 0 0 -00}
|
||||
{-704937600 -21600 0 CST}
|
||||
{-147895200 -14400 1 CDDT}
|
||||
{-131565600 -21600 0 CST}
|
||||
|
||||
@@ -14,19 +14,19 @@ set TZData(:America/Tijuana) {
|
||||
{-686073600 -25200 1 PDT}
|
||||
{-661539600 -28800 0 PST}
|
||||
{-504892800 -28800 0 PST}
|
||||
{-495036000 -25200 1 PDT}
|
||||
{-495039600 -25200 1 PDT}
|
||||
{-481734000 -28800 0 PST}
|
||||
{-463586400 -25200 1 PDT}
|
||||
{-463590000 -25200 1 PDT}
|
||||
{-450284400 -28800 0 PST}
|
||||
{-431532000 -25200 1 PDT}
|
||||
{-431535600 -25200 1 PDT}
|
||||
{-418230000 -28800 0 PST}
|
||||
{-400082400 -25200 1 PDT}
|
||||
{-400086000 -25200 1 PDT}
|
||||
{-386780400 -28800 0 PST}
|
||||
{-368632800 -25200 1 PDT}
|
||||
{-368636400 -25200 1 PDT}
|
||||
{-355330800 -28800 0 PST}
|
||||
{-337183200 -25200 1 PDT}
|
||||
{-337186800 -25200 1 PDT}
|
||||
{-323881200 -28800 0 PST}
|
||||
{-305733600 -25200 1 PDT}
|
||||
{-305737200 -25200 1 PDT}
|
||||
{-292431600 -28800 0 PST}
|
||||
{-283968000 -28800 0 PST}
|
||||
{189331200 -28800 0 PST}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:America/Yellowknife) {
|
||||
{-9223372036854775808 0 0 zzz}
|
||||
{-9223372036854775808 0 0 -00}
|
||||
{-1104537600 -25200 0 MST}
|
||||
{-880210800 -21600 1 MWT}
|
||||
{-769395600 -21600 1 MPT}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Antarctica/Casey) {
|
||||
{-9223372036854775808 0 0 zzz}
|
||||
{-31536000 28800 0 AWST}
|
||||
{1255802400 39600 0 CAST}
|
||||
{1267714800 28800 0 AWST}
|
||||
{1319738400 39600 0 CAST}
|
||||
{1329843600 28800 0 AWST}
|
||||
{-9223372036854775808 0 0 -00}
|
||||
{-31536000 28800 0 +08}
|
||||
{1255802400 39600 0 +11}
|
||||
{1267714800 28800 0 +08}
|
||||
{1319738400 39600 0 +11}
|
||||
{1329843600 28800 0 +08}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Antarctica/Davis) {
|
||||
{-9223372036854775808 0 0 zzz}
|
||||
{-409190400 25200 0 DAVT}
|
||||
{-163062000 0 0 zzz}
|
||||
{-28857600 25200 0 DAVT}
|
||||
{1255806000 18000 0 DAVT}
|
||||
{1268251200 25200 0 DAVT}
|
||||
{1319742000 18000 0 DAVT}
|
||||
{1329854400 25200 0 DAVT}
|
||||
{-9223372036854775808 0 0 -00}
|
||||
{-409190400 25200 0 +07}
|
||||
{-163062000 0 0 -00}
|
||||
{-28857600 25200 0 +07}
|
||||
{1255806000 18000 0 +05}
|
||||
{1268251200 25200 0 +07}
|
||||
{1319742000 18000 0 +05}
|
||||
{1329854400 25200 0 +07}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Antarctica/DumontDUrville) {
|
||||
{-9223372036854775808 0 0 zzz}
|
||||
{-725846400 36000 0 PMT}
|
||||
{-566992800 0 0 zzz}
|
||||
{-415497600 36000 0 DDUT}
|
||||
{-9223372036854775808 0 0 -00}
|
||||
{-725846400 36000 0 +10}
|
||||
{-566992800 0 0 -00}
|
||||
{-415497600 36000 0 +10}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Antarctica/Macquarie) {
|
||||
{-9223372036854775808 0 0 zzz}
|
||||
{-9223372036854775808 0 0 -00}
|
||||
{-2214259200 36000 0 AEST}
|
||||
{-1680508800 39600 1 AEDT}
|
||||
{-1669892400 39600 0 AEDT}
|
||||
{-1665392400 36000 0 AEST}
|
||||
{-1601719200 0 0 zzz}
|
||||
{-1601719200 0 0 -00}
|
||||
{-94730400 36000 0 AEST}
|
||||
{-71136000 39600 1 AEDT}
|
||||
{-55411200 36000 0 AEST}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Antarctica/Mawson) {
|
||||
{-9223372036854775808 0 0 zzz}
|
||||
{-501206400 21600 0 MAWT}
|
||||
{1255809600 18000 0 MAWT}
|
||||
{-9223372036854775808 0 0 -00}
|
||||
{-501206400 21600 0 +06}
|
||||
{1255809600 18000 0 +05}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Antarctica/Palmer) {
|
||||
{-9223372036854775808 0 0 zzz}
|
||||
{-9223372036854775808 0 0 -00}
|
||||
{-157766400 -14400 0 ART}
|
||||
{-152654400 -14400 0 ART}
|
||||
{-132955200 -10800 1 ARST}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Antarctica/Rothera) {
|
||||
{-9223372036854775808 0 0 zzz}
|
||||
{218246400 -10800 0 ROTT}
|
||||
{-9223372036854775808 0 0 -00}
|
||||
{218246400 -10800 0 -03}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Antarctica/Syowa) {
|
||||
{-9223372036854775808 0 0 zzz}
|
||||
{-407808000 10800 0 SYOT}
|
||||
{-9223372036854775808 0 0 -00}
|
||||
{-407808000 10800 0 +03}
|
||||
}
|
||||
|
||||
+192
-192
@@ -1,196 +1,196 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Antarctica/Troll) {
|
||||
{-9223372036854775808 0 0 zzz}
|
||||
{1108166400 0 0 UTC}
|
||||
{1111885200 7200 1 CEST}
|
||||
{1130634000 0 0 UTC}
|
||||
{1143334800 7200 1 CEST}
|
||||
{1162083600 0 0 UTC}
|
||||
{1174784400 7200 1 CEST}
|
||||
{1193533200 0 0 UTC}
|
||||
{1206838800 7200 1 CEST}
|
||||
{1224982800 0 0 UTC}
|
||||
{1238288400 7200 1 CEST}
|
||||
{1256432400 0 0 UTC}
|
||||
{1269738000 7200 1 CEST}
|
||||
{1288486800 0 0 UTC}
|
||||
{1301187600 7200 1 CEST}
|
||||
{1319936400 0 0 UTC}
|
||||
{1332637200 7200 1 CEST}
|
||||
{1351386000 0 0 UTC}
|
||||
{1364691600 7200 1 CEST}
|
||||
{1382835600 0 0 UTC}
|
||||
{1396141200 7200 1 CEST}
|
||||
{1414285200 0 0 UTC}
|
||||
{1427590800 7200 1 CEST}
|
||||
{1445734800 0 0 UTC}
|
||||
{1459040400 7200 1 CEST}
|
||||
{1477789200 0 0 UTC}
|
||||
{1490490000 7200 1 CEST}
|
||||
{1509238800 0 0 UTC}
|
||||
{1521939600 7200 1 CEST}
|
||||
{1540688400 0 0 UTC}
|
||||
{1553994000 7200 1 CEST}
|
||||
{1572138000 0 0 UTC}
|
||||
{1585443600 7200 1 CEST}
|
||||
{1603587600 0 0 UTC}
|
||||
{1616893200 7200 1 CEST}
|
||||
{1635642000 0 0 UTC}
|
||||
{1648342800 7200 1 CEST}
|
||||
{1667091600 0 0 UTC}
|
||||
{1679792400 7200 1 CEST}
|
||||
{1698541200 0 0 UTC}
|
||||
{1711846800 7200 1 CEST}
|
||||
{1729990800 0 0 UTC}
|
||||
{1743296400 7200 1 CEST}
|
||||
{1761440400 0 0 UTC}
|
||||
{1774746000 7200 1 CEST}
|
||||
{1792890000 0 0 UTC}
|
||||
{1806195600 7200 1 CEST}
|
||||
{1824944400 0 0 UTC}
|
||||
{1837645200 7200 1 CEST}
|
||||
{1856394000 0 0 UTC}
|
||||
{1869094800 7200 1 CEST}
|
||||
{1887843600 0 0 UTC}
|
||||
{1901149200 7200 1 CEST}
|
||||
{1919293200 0 0 UTC}
|
||||
{1932598800 7200 1 CEST}
|
||||
{1950742800 0 0 UTC}
|
||||
{1964048400 7200 1 CEST}
|
||||
{1982797200 0 0 UTC}
|
||||
{1995498000 7200 1 CEST}
|
||||
{2014246800 0 0 UTC}
|
||||
{2026947600 7200 1 CEST}
|
||||
{2045696400 0 0 UTC}
|
||||
{2058397200 7200 1 CEST}
|
||||
{2077146000 0 0 UTC}
|
||||
{2090451600 7200 1 CEST}
|
||||
{2108595600 0 0 UTC}
|
||||
{2121901200 7200 1 CEST}
|
||||
{2140045200 0 0 UTC}
|
||||
{2153350800 7200 1 CEST}
|
||||
{2172099600 0 0 UTC}
|
||||
{2184800400 7200 1 CEST}
|
||||
{2203549200 0 0 UTC}
|
||||
{2216250000 7200 1 CEST}
|
||||
{2234998800 0 0 UTC}
|
||||
{2248304400 7200 1 CEST}
|
||||
{2266448400 0 0 UTC}
|
||||
{2279754000 7200 1 CEST}
|
||||
{2297898000 0 0 UTC}
|
||||
{2311203600 7200 1 CEST}
|
||||
{2329347600 0 0 UTC}
|
||||
{2342653200 7200 1 CEST}
|
||||
{2361402000 0 0 UTC}
|
||||
{2374102800 7200 1 CEST}
|
||||
{2392851600 0 0 UTC}
|
||||
{2405552400 7200 1 CEST}
|
||||
{2424301200 0 0 UTC}
|
||||
{2437606800 7200 1 CEST}
|
||||
{2455750800 0 0 UTC}
|
||||
{2469056400 7200 1 CEST}
|
||||
{2487200400 0 0 UTC}
|
||||
{2500506000 7200 1 CEST}
|
||||
{2519254800 0 0 UTC}
|
||||
{2531955600 7200 1 CEST}
|
||||
{2550704400 0 0 UTC}
|
||||
{2563405200 7200 1 CEST}
|
||||
{2582154000 0 0 UTC}
|
||||
{2595459600 7200 1 CEST}
|
||||
{2613603600 0 0 UTC}
|
||||
{2626909200 7200 1 CEST}
|
||||
{2645053200 0 0 UTC}
|
||||
{2658358800 7200 1 CEST}
|
||||
{2676502800 0 0 UTC}
|
||||
{2689808400 7200 1 CEST}
|
||||
{2708557200 0 0 UTC}
|
||||
{2721258000 7200 1 CEST}
|
||||
{2740006800 0 0 UTC}
|
||||
{2752707600 7200 1 CEST}
|
||||
{2771456400 0 0 UTC}
|
||||
{2784762000 7200 1 CEST}
|
||||
{2802906000 0 0 UTC}
|
||||
{2816211600 7200 1 CEST}
|
||||
{2834355600 0 0 UTC}
|
||||
{2847661200 7200 1 CEST}
|
||||
{2866410000 0 0 UTC}
|
||||
{2879110800 7200 1 CEST}
|
||||
{2897859600 0 0 UTC}
|
||||
{2910560400 7200 1 CEST}
|
||||
{2929309200 0 0 UTC}
|
||||
{2942010000 7200 1 CEST}
|
||||
{2960758800 0 0 UTC}
|
||||
{2974064400 7200 1 CEST}
|
||||
{2992208400 0 0 UTC}
|
||||
{3005514000 7200 1 CEST}
|
||||
{3023658000 0 0 UTC}
|
||||
{3036963600 7200 1 CEST}
|
||||
{3055712400 0 0 UTC}
|
||||
{3068413200 7200 1 CEST}
|
||||
{3087162000 0 0 UTC}
|
||||
{3099862800 7200 1 CEST}
|
||||
{3118611600 0 0 UTC}
|
||||
{3131917200 7200 1 CEST}
|
||||
{3150061200 0 0 UTC}
|
||||
{3163366800 7200 1 CEST}
|
||||
{3181510800 0 0 UTC}
|
||||
{3194816400 7200 1 CEST}
|
||||
{3212960400 0 0 UTC}
|
||||
{3226266000 7200 1 CEST}
|
||||
{3245014800 0 0 UTC}
|
||||
{3257715600 7200 1 CEST}
|
||||
{3276464400 0 0 UTC}
|
||||
{3289165200 7200 1 CEST}
|
||||
{3307914000 0 0 UTC}
|
||||
{3321219600 7200 1 CEST}
|
||||
{3339363600 0 0 UTC}
|
||||
{3352669200 7200 1 CEST}
|
||||
{3370813200 0 0 UTC}
|
||||
{3384118800 7200 1 CEST}
|
||||
{3402867600 0 0 UTC}
|
||||
{3415568400 7200 1 CEST}
|
||||
{3434317200 0 0 UTC}
|
||||
{3447018000 7200 1 CEST}
|
||||
{3465766800 0 0 UTC}
|
||||
{3479072400 7200 1 CEST}
|
||||
{3497216400 0 0 UTC}
|
||||
{3510522000 7200 1 CEST}
|
||||
{3528666000 0 0 UTC}
|
||||
{3541971600 7200 1 CEST}
|
||||
{3560115600 0 0 UTC}
|
||||
{3573421200 7200 1 CEST}
|
||||
{3592170000 0 0 UTC}
|
||||
{3604870800 7200 1 CEST}
|
||||
{3623619600 0 0 UTC}
|
||||
{3636320400 7200 1 CEST}
|
||||
{3655069200 0 0 UTC}
|
||||
{3668374800 7200 1 CEST}
|
||||
{3686518800 0 0 UTC}
|
||||
{3699824400 7200 1 CEST}
|
||||
{3717968400 0 0 UTC}
|
||||
{3731274000 7200 1 CEST}
|
||||
{3750022800 0 0 UTC}
|
||||
{3762723600 7200 1 CEST}
|
||||
{3781472400 0 0 UTC}
|
||||
{3794173200 7200 1 CEST}
|
||||
{3812922000 0 0 UTC}
|
||||
{3825622800 7200 1 CEST}
|
||||
{3844371600 0 0 UTC}
|
||||
{3857677200 7200 1 CEST}
|
||||
{3875821200 0 0 UTC}
|
||||
{3889126800 7200 1 CEST}
|
||||
{3907270800 0 0 UTC}
|
||||
{3920576400 7200 1 CEST}
|
||||
{3939325200 0 0 UTC}
|
||||
{3952026000 7200 1 CEST}
|
||||
{3970774800 0 0 UTC}
|
||||
{3983475600 7200 1 CEST}
|
||||
{4002224400 0 0 UTC}
|
||||
{4015530000 7200 1 CEST}
|
||||
{4033674000 0 0 UTC}
|
||||
{4046979600 7200 1 CEST}
|
||||
{4065123600 0 0 UTC}
|
||||
{4078429200 7200 1 CEST}
|
||||
{4096573200 0 0 UTC}
|
||||
{-9223372036854775808 0 0 -00}
|
||||
{1108166400 0 0 +00}
|
||||
{1111885200 7200 1 +02}
|
||||
{1130634000 0 0 +00}
|
||||
{1143334800 7200 1 +02}
|
||||
{1162083600 0 0 +00}
|
||||
{1174784400 7200 1 +02}
|
||||
{1193533200 0 0 +00}
|
||||
{1206838800 7200 1 +02}
|
||||
{1224982800 0 0 +00}
|
||||
{1238288400 7200 1 +02}
|
||||
{1256432400 0 0 +00}
|
||||
{1269738000 7200 1 +02}
|
||||
{1288486800 0 0 +00}
|
||||
{1301187600 7200 1 +02}
|
||||
{1319936400 0 0 +00}
|
||||
{1332637200 7200 1 +02}
|
||||
{1351386000 0 0 +00}
|
||||
{1364691600 7200 1 +02}
|
||||
{1382835600 0 0 +00}
|
||||
{1396141200 7200 1 +02}
|
||||
{1414285200 0 0 +00}
|
||||
{1427590800 7200 1 +02}
|
||||
{1445734800 0 0 +00}
|
||||
{1459040400 7200 1 +02}
|
||||
{1477789200 0 0 +00}
|
||||
{1490490000 7200 1 +02}
|
||||
{1509238800 0 0 +00}
|
||||
{1521939600 7200 1 +02}
|
||||
{1540688400 0 0 +00}
|
||||
{1553994000 7200 1 +02}
|
||||
{1572138000 0 0 +00}
|
||||
{1585443600 7200 1 +02}
|
||||
{1603587600 0 0 +00}
|
||||
{1616893200 7200 1 +02}
|
||||
{1635642000 0 0 +00}
|
||||
{1648342800 7200 1 +02}
|
||||
{1667091600 0 0 +00}
|
||||
{1679792400 7200 1 +02}
|
||||
{1698541200 0 0 +00}
|
||||
{1711846800 7200 1 +02}
|
||||
{1729990800 0 0 +00}
|
||||
{1743296400 7200 1 +02}
|
||||
{1761440400 0 0 +00}
|
||||
{1774746000 7200 1 +02}
|
||||
{1792890000 0 0 +00}
|
||||
{1806195600 7200 1 +02}
|
||||
{1824944400 0 0 +00}
|
||||
{1837645200 7200 1 +02}
|
||||
{1856394000 0 0 +00}
|
||||
{1869094800 7200 1 +02}
|
||||
{1887843600 0 0 +00}
|
||||
{1901149200 7200 1 +02}
|
||||
{1919293200 0 0 +00}
|
||||
{1932598800 7200 1 +02}
|
||||
{1950742800 0 0 +00}
|
||||
{1964048400 7200 1 +02}
|
||||
{1982797200 0 0 +00}
|
||||
{1995498000 7200 1 +02}
|
||||
{2014246800 0 0 +00}
|
||||
{2026947600 7200 1 +02}
|
||||
{2045696400 0 0 +00}
|
||||
{2058397200 7200 1 +02}
|
||||
{2077146000 0 0 +00}
|
||||
{2090451600 7200 1 +02}
|
||||
{2108595600 0 0 +00}
|
||||
{2121901200 7200 1 +02}
|
||||
{2140045200 0 0 +00}
|
||||
{2153350800 7200 1 +02}
|
||||
{2172099600 0 0 +00}
|
||||
{2184800400 7200 1 +02}
|
||||
{2203549200 0 0 +00}
|
||||
{2216250000 7200 1 +02}
|
||||
{2234998800 0 0 +00}
|
||||
{2248304400 7200 1 +02}
|
||||
{2266448400 0 0 +00}
|
||||
{2279754000 7200 1 +02}
|
||||
{2297898000 0 0 +00}
|
||||
{2311203600 7200 1 +02}
|
||||
{2329347600 0 0 +00}
|
||||
{2342653200 7200 1 +02}
|
||||
{2361402000 0 0 +00}
|
||||
{2374102800 7200 1 +02}
|
||||
{2392851600 0 0 +00}
|
||||
{2405552400 7200 1 +02}
|
||||
{2424301200 0 0 +00}
|
||||
{2437606800 7200 1 +02}
|
||||
{2455750800 0 0 +00}
|
||||
{2469056400 7200 1 +02}
|
||||
{2487200400 0 0 +00}
|
||||
{2500506000 7200 1 +02}
|
||||
{2519254800 0 0 +00}
|
||||
{2531955600 7200 1 +02}
|
||||
{2550704400 0 0 +00}
|
||||
{2563405200 7200 1 +02}
|
||||
{2582154000 0 0 +00}
|
||||
{2595459600 7200 1 +02}
|
||||
{2613603600 0 0 +00}
|
||||
{2626909200 7200 1 +02}
|
||||
{2645053200 0 0 +00}
|
||||
{2658358800 7200 1 +02}
|
||||
{2676502800 0 0 +00}
|
||||
{2689808400 7200 1 +02}
|
||||
{2708557200 0 0 +00}
|
||||
{2721258000 7200 1 +02}
|
||||
{2740006800 0 0 +00}
|
||||
{2752707600 7200 1 +02}
|
||||
{2771456400 0 0 +00}
|
||||
{2784762000 7200 1 +02}
|
||||
{2802906000 0 0 +00}
|
||||
{2816211600 7200 1 +02}
|
||||
{2834355600 0 0 +00}
|
||||
{2847661200 7200 1 +02}
|
||||
{2866410000 0 0 +00}
|
||||
{2879110800 7200 1 +02}
|
||||
{2897859600 0 0 +00}
|
||||
{2910560400 7200 1 +02}
|
||||
{2929309200 0 0 +00}
|
||||
{2942010000 7200 1 +02}
|
||||
{2960758800 0 0 +00}
|
||||
{2974064400 7200 1 +02}
|
||||
{2992208400 0 0 +00}
|
||||
{3005514000 7200 1 +02}
|
||||
{3023658000 0 0 +00}
|
||||
{3036963600 7200 1 +02}
|
||||
{3055712400 0 0 +00}
|
||||
{3068413200 7200 1 +02}
|
||||
{3087162000 0 0 +00}
|
||||
{3099862800 7200 1 +02}
|
||||
{3118611600 0 0 +00}
|
||||
{3131917200 7200 1 +02}
|
||||
{3150061200 0 0 +00}
|
||||
{3163366800 7200 1 +02}
|
||||
{3181510800 0 0 +00}
|
||||
{3194816400 7200 1 +02}
|
||||
{3212960400 0 0 +00}
|
||||
{3226266000 7200 1 +02}
|
||||
{3245014800 0 0 +00}
|
||||
{3257715600 7200 1 +02}
|
||||
{3276464400 0 0 +00}
|
||||
{3289165200 7200 1 +02}
|
||||
{3307914000 0 0 +00}
|
||||
{3321219600 7200 1 +02}
|
||||
{3339363600 0 0 +00}
|
||||
{3352669200 7200 1 +02}
|
||||
{3370813200 0 0 +00}
|
||||
{3384118800 7200 1 +02}
|
||||
{3402867600 0 0 +00}
|
||||
{3415568400 7200 1 +02}
|
||||
{3434317200 0 0 +00}
|
||||
{3447018000 7200 1 +02}
|
||||
{3465766800 0 0 +00}
|
||||
{3479072400 7200 1 +02}
|
||||
{3497216400 0 0 +00}
|
||||
{3510522000 7200 1 +02}
|
||||
{3528666000 0 0 +00}
|
||||
{3541971600 7200 1 +02}
|
||||
{3560115600 0 0 +00}
|
||||
{3573421200 7200 1 +02}
|
||||
{3592170000 0 0 +00}
|
||||
{3604870800 7200 1 +02}
|
||||
{3623619600 0 0 +00}
|
||||
{3636320400 7200 1 +02}
|
||||
{3655069200 0 0 +00}
|
||||
{3668374800 7200 1 +02}
|
||||
{3686518800 0 0 +00}
|
||||
{3699824400 7200 1 +02}
|
||||
{3717968400 0 0 +00}
|
||||
{3731274000 7200 1 +02}
|
||||
{3750022800 0 0 +00}
|
||||
{3762723600 7200 1 +02}
|
||||
{3781472400 0 0 +00}
|
||||
{3794173200 7200 1 +02}
|
||||
{3812922000 0 0 +00}
|
||||
{3825622800 7200 1 +02}
|
||||
{3844371600 0 0 +00}
|
||||
{3857677200 7200 1 +02}
|
||||
{3875821200 0 0 +00}
|
||||
{3889126800 7200 1 +02}
|
||||
{3907270800 0 0 +00}
|
||||
{3920576400 7200 1 +02}
|
||||
{3939325200 0 0 +00}
|
||||
{3952026000 7200 1 +02}
|
||||
{3970774800 0 0 +00}
|
||||
{3983475600 7200 1 +02}
|
||||
{4002224400 0 0 +00}
|
||||
{4015530000 7200 1 +02}
|
||||
{4033674000 0 0 +00}
|
||||
{4046979600 7200 1 +02}
|
||||
{4065123600 0 0 +00}
|
||||
{4078429200 7200 1 +02}
|
||||
{4096573200 0 0 +00}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Antarctica/Vostok) {
|
||||
{-9223372036854775808 0 0 zzz}
|
||||
{-380073600 21600 0 VOST}
|
||||
{-9223372036854775808 0 0 -00}
|
||||
{-380073600 21600 0 +06}
|
||||
}
|
||||
|
||||
+67
-67
@@ -2,71 +2,71 @@
|
||||
|
||||
set TZData(:Asia/Anadyr) {
|
||||
{-9223372036854775808 42596 0 LMT}
|
||||
{-1441194596 43200 0 ANAT}
|
||||
{-1247572800 46800 0 ANAMMTT}
|
||||
{354884400 50400 1 ANAST}
|
||||
{370692000 46800 0 ANAT}
|
||||
{386420400 43200 0 ANAMMTT}
|
||||
{386424000 46800 1 ANAST}
|
||||
{402231600 43200 0 ANAT}
|
||||
{417960000 46800 1 ANAST}
|
||||
{433767600 43200 0 ANAT}
|
||||
{449582400 46800 1 ANAST}
|
||||
{465314400 43200 0 ANAT}
|
||||
{481039200 46800 1 ANAST}
|
||||
{496764000 43200 0 ANAT}
|
||||
{512488800 46800 1 ANAST}
|
||||
{528213600 43200 0 ANAT}
|
||||
{543938400 46800 1 ANAST}
|
||||
{559663200 43200 0 ANAT}
|
||||
{575388000 46800 1 ANAST}
|
||||
{591112800 43200 0 ANAT}
|
||||
{606837600 46800 1 ANAST}
|
||||
{622562400 43200 0 ANAT}
|
||||
{638287200 46800 1 ANAST}
|
||||
{654616800 43200 0 ANAT}
|
||||
{670341600 39600 0 ANAMMTT}
|
||||
{670345200 43200 1 ANAST}
|
||||
{686070000 39600 0 ANAT}
|
||||
{695746800 43200 0 ANAMMTT}
|
||||
{701791200 46800 1 ANAST}
|
||||
{717516000 43200 0 ANAT}
|
||||
{733240800 46800 1 ANAST}
|
||||
{748965600 43200 0 ANAT}
|
||||
{764690400 46800 1 ANAST}
|
||||
{780415200 43200 0 ANAT}
|
||||
{796140000 46800 1 ANAST}
|
||||
{811864800 43200 0 ANAT}
|
||||
{828194400 46800 1 ANAST}
|
||||
{846338400 43200 0 ANAT}
|
||||
{859644000 46800 1 ANAST}
|
||||
{877788000 43200 0 ANAT}
|
||||
{891093600 46800 1 ANAST}
|
||||
{909237600 43200 0 ANAT}
|
||||
{922543200 46800 1 ANAST}
|
||||
{941292000 43200 0 ANAT}
|
||||
{953992800 46800 1 ANAST}
|
||||
{972741600 43200 0 ANAT}
|
||||
{985442400 46800 1 ANAST}
|
||||
{1004191200 43200 0 ANAT}
|
||||
{1017496800 46800 1 ANAST}
|
||||
{1035640800 43200 0 ANAT}
|
||||
{1048946400 46800 1 ANAST}
|
||||
{1067090400 43200 0 ANAT}
|
||||
{1080396000 46800 1 ANAST}
|
||||
{1099144800 43200 0 ANAT}
|
||||
{1111845600 46800 1 ANAST}
|
||||
{1130594400 43200 0 ANAT}
|
||||
{1143295200 46800 1 ANAST}
|
||||
{1162044000 43200 0 ANAT}
|
||||
{1174744800 46800 1 ANAST}
|
||||
{1193493600 43200 0 ANAT}
|
||||
{1206799200 46800 1 ANAST}
|
||||
{1224943200 43200 0 ANAT}
|
||||
{1238248800 46800 1 ANAST}
|
||||
{1256392800 43200 0 ANAT}
|
||||
{1269698400 39600 0 ANAMMTT}
|
||||
{1269702000 43200 1 ANAST}
|
||||
{1288450800 39600 0 ANAT}
|
||||
{1301151600 43200 0 ANAT}
|
||||
{-1441194596 43200 0 +12}
|
||||
{-1247572800 46800 0 +14}
|
||||
{354884400 50400 1 +14}
|
||||
{370692000 46800 0 +13}
|
||||
{386420400 43200 0 +13}
|
||||
{386424000 46800 1 +13}
|
||||
{402231600 43200 0 +12}
|
||||
{417960000 46800 1 +13}
|
||||
{433767600 43200 0 +12}
|
||||
{449582400 46800 1 +13}
|
||||
{465314400 43200 0 +12}
|
||||
{481039200 46800 1 +13}
|
||||
{496764000 43200 0 +12}
|
||||
{512488800 46800 1 +13}
|
||||
{528213600 43200 0 +12}
|
||||
{543938400 46800 1 +13}
|
||||
{559663200 43200 0 +12}
|
||||
{575388000 46800 1 +13}
|
||||
{591112800 43200 0 +12}
|
||||
{606837600 46800 1 +13}
|
||||
{622562400 43200 0 +12}
|
||||
{638287200 46800 1 +13}
|
||||
{654616800 43200 0 +12}
|
||||
{670341600 39600 0 +12}
|
||||
{670345200 43200 1 +12}
|
||||
{686070000 39600 0 +11}
|
||||
{695746800 43200 0 +13}
|
||||
{701791200 46800 1 +13}
|
||||
{717516000 43200 0 +12}
|
||||
{733240800 46800 1 +13}
|
||||
{748965600 43200 0 +12}
|
||||
{764690400 46800 1 +13}
|
||||
{780415200 43200 0 +12}
|
||||
{796140000 46800 1 +13}
|
||||
{811864800 43200 0 +12}
|
||||
{828194400 46800 1 +13}
|
||||
{846338400 43200 0 +12}
|
||||
{859644000 46800 1 +13}
|
||||
{877788000 43200 0 +12}
|
||||
{891093600 46800 1 +13}
|
||||
{909237600 43200 0 +12}
|
||||
{922543200 46800 1 +13}
|
||||
{941292000 43200 0 +12}
|
||||
{953992800 46800 1 +13}
|
||||
{972741600 43200 0 +12}
|
||||
{985442400 46800 1 +13}
|
||||
{1004191200 43200 0 +12}
|
||||
{1017496800 46800 1 +13}
|
||||
{1035640800 43200 0 +12}
|
||||
{1048946400 46800 1 +13}
|
||||
{1067090400 43200 0 +12}
|
||||
{1080396000 46800 1 +13}
|
||||
{1099144800 43200 0 +12}
|
||||
{1111845600 46800 1 +13}
|
||||
{1130594400 43200 0 +12}
|
||||
{1143295200 46800 1 +13}
|
||||
{1162044000 43200 0 +12}
|
||||
{1174744800 46800 1 +13}
|
||||
{1193493600 43200 0 +12}
|
||||
{1206799200 46800 1 +13}
|
||||
{1224943200 43200 0 +12}
|
||||
{1238248800 46800 1 +13}
|
||||
{1256392800 43200 0 +12}
|
||||
{1269698400 39600 0 +12}
|
||||
{1269702000 43200 1 +12}
|
||||
{1288450800 39600 0 +11}
|
||||
{1301151600 43200 0 +12}
|
||||
}
|
||||
|
||||
@@ -2,30 +2,30 @@
|
||||
|
||||
set TZData(:Asia/Ashgabat) {
|
||||
{-9223372036854775808 14012 0 LMT}
|
||||
{-1441166012 14400 0 ASHT}
|
||||
{-1247544000 18000 0 ASHT}
|
||||
{354913200 21600 1 ASHST}
|
||||
{370720800 18000 0 ASHT}
|
||||
{386449200 21600 1 ASHST}
|
||||
{402256800 18000 0 ASHT}
|
||||
{417985200 21600 1 ASHST}
|
||||
{433792800 18000 0 ASHT}
|
||||
{449607600 21600 1 ASHST}
|
||||
{465339600 18000 0 ASHT}
|
||||
{481064400 21600 1 ASHST}
|
||||
{496789200 18000 0 ASHT}
|
||||
{512514000 21600 1 ASHST}
|
||||
{528238800 18000 0 ASHT}
|
||||
{543963600 21600 1 ASHST}
|
||||
{559688400 18000 0 ASHT}
|
||||
{575413200 21600 1 ASHST}
|
||||
{591138000 18000 0 ASHT}
|
||||
{606862800 21600 1 ASHST}
|
||||
{622587600 18000 0 ASHT}
|
||||
{638312400 21600 1 ASHST}
|
||||
{654642000 18000 0 ASHT}
|
||||
{670366800 14400 0 ASHT}
|
||||
{670370400 18000 1 ASHST}
|
||||
{686095200 14400 0 ASHT}
|
||||
{695772000 18000 0 TMT}
|
||||
{-1441166012 14400 0 +04}
|
||||
{-1247544000 18000 0 +05}
|
||||
{354913200 21600 1 +06}
|
||||
{370720800 18000 0 +05}
|
||||
{386449200 21600 1 +06}
|
||||
{402256800 18000 0 +05}
|
||||
{417985200 21600 1 +06}
|
||||
{433792800 18000 0 +05}
|
||||
{449607600 21600 1 +06}
|
||||
{465339600 18000 0 +05}
|
||||
{481064400 21600 1 +06}
|
||||
{496789200 18000 0 +05}
|
||||
{512514000 21600 1 +06}
|
||||
{528238800 18000 0 +05}
|
||||
{543963600 21600 1 +06}
|
||||
{559688400 18000 0 +05}
|
||||
{575413200 21600 1 +06}
|
||||
{591138000 18000 0 +05}
|
||||
{606862800 21600 1 +06}
|
||||
{622587600 18000 0 +05}
|
||||
{638312400 21600 1 +06}
|
||||
{654642000 18000 0 +05}
|
||||
{670366800 14400 0 +04}
|
||||
{670370400 18000 1 +05}
|
||||
{686095200 14400 0 +04}
|
||||
{695772000 18000 0 +05}
|
||||
}
|
||||
|
||||
+69
-69
@@ -2,73 +2,73 @@
|
||||
|
||||
set TZData(:Asia/Baku) {
|
||||
{-9223372036854775808 11964 0 LMT}
|
||||
{-1441163964 10800 0 BAKT}
|
||||
{-405140400 14400 0 BAKT}
|
||||
{354916800 18000 1 BAKST}
|
||||
{370724400 14400 0 BAKT}
|
||||
{386452800 18000 1 BAKST}
|
||||
{402260400 14400 0 BAKT}
|
||||
{417988800 18000 1 BAKST}
|
||||
{433796400 14400 0 BAKT}
|
||||
{449611200 18000 1 BAKST}
|
||||
{465343200 14400 0 BAKT}
|
||||
{481068000 18000 1 BAKST}
|
||||
{496792800 14400 0 BAKT}
|
||||
{512517600 18000 1 BAKST}
|
||||
{528242400 14400 0 BAKT}
|
||||
{543967200 18000 1 BAKST}
|
||||
{559692000 14400 0 BAKT}
|
||||
{575416800 18000 1 BAKST}
|
||||
{591141600 14400 0 BAKT}
|
||||
{606866400 18000 1 BAKST}
|
||||
{622591200 14400 0 BAKT}
|
||||
{638316000 18000 1 BAKST}
|
||||
{654645600 14400 0 BAKT}
|
||||
{670370400 14400 1 BAKST}
|
||||
{683496000 14400 0 AZST}
|
||||
{686098800 10800 0 AZT}
|
||||
{701823600 14400 1 AZST}
|
||||
{717537600 14400 0 AZT}
|
||||
{820440000 14400 0 AZT}
|
||||
{828234000 18000 1 AZST}
|
||||
{846378000 14400 0 AZT}
|
||||
{852062400 14400 0 AZT}
|
||||
{859680000 18000 1 AZST}
|
||||
{877824000 14400 0 AZT}
|
||||
{891129600 18000 1 AZST}
|
||||
{909273600 14400 0 AZT}
|
||||
{922579200 18000 1 AZST}
|
||||
{941328000 14400 0 AZT}
|
||||
{954028800 18000 1 AZST}
|
||||
{972777600 14400 0 AZT}
|
||||
{985478400 18000 1 AZST}
|
||||
{1004227200 14400 0 AZT}
|
||||
{1017532800 18000 1 AZST}
|
||||
{1035676800 14400 0 AZT}
|
||||
{1048982400 18000 1 AZST}
|
||||
{1067126400 14400 0 AZT}
|
||||
{1080432000 18000 1 AZST}
|
||||
{1099180800 14400 0 AZT}
|
||||
{1111881600 18000 1 AZST}
|
||||
{1130630400 14400 0 AZT}
|
||||
{1143331200 18000 1 AZST}
|
||||
{1162080000 14400 0 AZT}
|
||||
{1174780800 18000 1 AZST}
|
||||
{1193529600 14400 0 AZT}
|
||||
{1206835200 18000 1 AZST}
|
||||
{1224979200 14400 0 AZT}
|
||||
{1238284800 18000 1 AZST}
|
||||
{1256428800 14400 0 AZT}
|
||||
{1269734400 18000 1 AZST}
|
||||
{1288483200 14400 0 AZT}
|
||||
{1301184000 18000 1 AZST}
|
||||
{1319932800 14400 0 AZT}
|
||||
{1332633600 18000 1 AZST}
|
||||
{1351382400 14400 0 AZT}
|
||||
{1364688000 18000 1 AZST}
|
||||
{1382832000 14400 0 AZT}
|
||||
{1396137600 18000 1 AZST}
|
||||
{1414281600 14400 0 AZT}
|
||||
{1427587200 18000 1 AZST}
|
||||
{1445731200 14400 0 AZT}
|
||||
{-1441163964 10800 0 +03}
|
||||
{-405140400 14400 0 +04}
|
||||
{354916800 18000 1 +05}
|
||||
{370724400 14400 0 +04}
|
||||
{386452800 18000 1 +05}
|
||||
{402260400 14400 0 +04}
|
||||
{417988800 18000 1 +05}
|
||||
{433796400 14400 0 +04}
|
||||
{449611200 18000 1 +05}
|
||||
{465343200 14400 0 +04}
|
||||
{481068000 18000 1 +05}
|
||||
{496792800 14400 0 +04}
|
||||
{512517600 18000 1 +05}
|
||||
{528242400 14400 0 +04}
|
||||
{543967200 18000 1 +05}
|
||||
{559692000 14400 0 +04}
|
||||
{575416800 18000 1 +05}
|
||||
{591141600 14400 0 +04}
|
||||
{606866400 18000 1 +05}
|
||||
{622591200 14400 0 +04}
|
||||
{638316000 18000 1 +05}
|
||||
{654645600 14400 0 +04}
|
||||
{670370400 10800 0 +03}
|
||||
{670374000 14400 1 +04}
|
||||
{686098800 10800 0 +03}
|
||||
{701823600 14400 1 +04}
|
||||
{717548400 14400 0 +04}
|
||||
{820440000 14400 0 +04}
|
||||
{828234000 18000 1 +05}
|
||||
{846378000 14400 0 +04}
|
||||
{852062400 14400 0 +04}
|
||||
{859680000 18000 1 +05}
|
||||
{877824000 14400 0 +04}
|
||||
{891129600 18000 1 +05}
|
||||
{909273600 14400 0 +04}
|
||||
{922579200 18000 1 +05}
|
||||
{941328000 14400 0 +04}
|
||||
{954028800 18000 1 +05}
|
||||
{972777600 14400 0 +04}
|
||||
{985478400 18000 1 +05}
|
||||
{1004227200 14400 0 +04}
|
||||
{1017532800 18000 1 +05}
|
||||
{1035676800 14400 0 +04}
|
||||
{1048982400 18000 1 +05}
|
||||
{1067126400 14400 0 +04}
|
||||
{1080432000 18000 1 +05}
|
||||
{1099180800 14400 0 +04}
|
||||
{1111881600 18000 1 +05}
|
||||
{1130630400 14400 0 +04}
|
||||
{1143331200 18000 1 +05}
|
||||
{1162080000 14400 0 +04}
|
||||
{1174780800 18000 1 +05}
|
||||
{1193529600 14400 0 +04}
|
||||
{1206835200 18000 1 +05}
|
||||
{1224979200 14400 0 +04}
|
||||
{1238284800 18000 1 +05}
|
||||
{1256428800 14400 0 +04}
|
||||
{1269734400 18000 1 +05}
|
||||
{1288483200 14400 0 +04}
|
||||
{1301184000 18000 1 +05}
|
||||
{1319932800 14400 0 +04}
|
||||
{1332633600 18000 1 +05}
|
||||
{1351382400 14400 0 +04}
|
||||
{1364688000 18000 1 +05}
|
||||
{1382832000 14400 0 +04}
|
||||
{1396137600 18000 1 +05}
|
||||
{1414281600 14400 0 +04}
|
||||
{1427587200 18000 1 +05}
|
||||
{1445731200 14400 0 +04}
|
||||
}
|
||||
|
||||
+53
-52
@@ -2,56 +2,57 @@
|
||||
|
||||
set TZData(:Asia/Bishkek) {
|
||||
{-9223372036854775808 17904 0 LMT}
|
||||
{-1441169904 18000 0 FRUT}
|
||||
{-1247547600 21600 0 FRUT}
|
||||
{354909600 25200 1 FRUST}
|
||||
{370717200 21600 0 FRUT}
|
||||
{386445600 25200 1 FRUST}
|
||||
{402253200 21600 0 FRUT}
|
||||
{417981600 25200 1 FRUST}
|
||||
{433789200 21600 0 FRUT}
|
||||
{449604000 25200 1 FRUST}
|
||||
{465336000 21600 0 FRUT}
|
||||
{481060800 25200 1 FRUST}
|
||||
{496785600 21600 0 FRUT}
|
||||
{512510400 25200 1 FRUST}
|
||||
{528235200 21600 0 FRUT}
|
||||
{543960000 25200 1 FRUST}
|
||||
{559684800 21600 0 FRUT}
|
||||
{575409600 25200 1 FRUST}
|
||||
{591134400 21600 0 FRUT}
|
||||
{606859200 25200 1 FRUST}
|
||||
{622584000 21600 0 FRUT}
|
||||
{638308800 25200 1 FRUST}
|
||||
{654638400 21600 0 FRUT}
|
||||
{670363200 21600 1 FRUST}
|
||||
{683582400 21600 0 KGT}
|
||||
{703018800 21600 1 KGST}
|
||||
{717530400 18000 0 KGT}
|
||||
{734468400 21600 1 KGST}
|
||||
{748980000 18000 0 KGT}
|
||||
{765918000 21600 1 KGST}
|
||||
{780429600 18000 0 KGT}
|
||||
{797367600 21600 1 KGST}
|
||||
{811879200 18000 0 KGT}
|
||||
{828817200 21600 1 KGST}
|
||||
{843933600 18000 0 KGT}
|
||||
{859671000 21600 1 KGST}
|
||||
{877811400 18000 0 KGT}
|
||||
{891120600 21600 1 KGST}
|
||||
{909261000 18000 0 KGT}
|
||||
{922570200 21600 1 KGST}
|
||||
{941315400 18000 0 KGT}
|
||||
{954019800 21600 1 KGST}
|
||||
{972765000 18000 0 KGT}
|
||||
{985469400 21600 1 KGST}
|
||||
{1004214600 18000 0 KGT}
|
||||
{1017523800 21600 1 KGST}
|
||||
{1035664200 18000 0 KGT}
|
||||
{1048973400 21600 1 KGST}
|
||||
{1067113800 18000 0 KGT}
|
||||
{1080423000 21600 1 KGST}
|
||||
{1099168200 18000 0 KGT}
|
||||
{1111872600 21600 1 KGST}
|
||||
{1123783200 21600 0 KGT}
|
||||
{-1441169904 18000 0 +05}
|
||||
{-1247547600 21600 0 +06}
|
||||
{354909600 25200 1 +07}
|
||||
{370717200 21600 0 +06}
|
||||
{386445600 25200 1 +07}
|
||||
{402253200 21600 0 +06}
|
||||
{417981600 25200 1 +07}
|
||||
{433789200 21600 0 +06}
|
||||
{449604000 25200 1 +07}
|
||||
{465336000 21600 0 +06}
|
||||
{481060800 25200 1 +07}
|
||||
{496785600 21600 0 +06}
|
||||
{512510400 25200 1 +07}
|
||||
{528235200 21600 0 +06}
|
||||
{543960000 25200 1 +07}
|
||||
{559684800 21600 0 +06}
|
||||
{575409600 25200 1 +07}
|
||||
{591134400 21600 0 +06}
|
||||
{606859200 25200 1 +07}
|
||||
{622584000 21600 0 +06}
|
||||
{638308800 25200 1 +07}
|
||||
{654638400 21600 0 +06}
|
||||
{670363200 18000 0 +05}
|
||||
{670366800 21600 1 +06}
|
||||
{683586000 18000 0 +05}
|
||||
{703018800 21600 1 +06}
|
||||
{717530400 18000 0 +05}
|
||||
{734468400 21600 1 +06}
|
||||
{748980000 18000 0 +05}
|
||||
{765918000 21600 1 +06}
|
||||
{780429600 18000 0 +05}
|
||||
{797367600 21600 1 +06}
|
||||
{811879200 18000 0 +05}
|
||||
{828817200 21600 1 +06}
|
||||
{843933600 18000 0 +05}
|
||||
{859671000 21600 1 +06}
|
||||
{877811400 18000 0 +05}
|
||||
{891120600 21600 1 +06}
|
||||
{909261000 18000 0 +05}
|
||||
{922570200 21600 1 +06}
|
||||
{941315400 18000 0 +05}
|
||||
{954019800 21600 1 +06}
|
||||
{972765000 18000 0 +05}
|
||||
{985469400 21600 1 +06}
|
||||
{1004214600 18000 0 +05}
|
||||
{1017523800 21600 1 +06}
|
||||
{1035664200 18000 0 +05}
|
||||
{1048973400 21600 1 +06}
|
||||
{1067113800 18000 0 +05}
|
||||
{1080423000 21600 1 +06}
|
||||
{1099168200 18000 0 +05}
|
||||
{1111872600 21600 1 +06}
|
||||
{1123783200 21600 0 +06}
|
||||
}
|
||||
|
||||
+67
-67
@@ -2,71 +2,71 @@
|
||||
|
||||
set TZData(:Asia/Chita) {
|
||||
{-9223372036854775808 27232 0 LMT}
|
||||
{-1579419232 28800 0 YAKT}
|
||||
{-1247558400 32400 0 YAKMMTT}
|
||||
{354898800 36000 1 YAKST}
|
||||
{370706400 32400 0 YAKT}
|
||||
{386434800 36000 1 YAKST}
|
||||
{402242400 32400 0 YAKT}
|
||||
{417970800 36000 1 YAKST}
|
||||
{433778400 32400 0 YAKT}
|
||||
{449593200 36000 1 YAKST}
|
||||
{465325200 32400 0 YAKT}
|
||||
{481050000 36000 1 YAKST}
|
||||
{496774800 32400 0 YAKT}
|
||||
{512499600 36000 1 YAKST}
|
||||
{528224400 32400 0 YAKT}
|
||||
{543949200 36000 1 YAKST}
|
||||
{559674000 32400 0 YAKT}
|
||||
{575398800 36000 1 YAKST}
|
||||
{591123600 32400 0 YAKT}
|
||||
{606848400 36000 1 YAKST}
|
||||
{622573200 32400 0 YAKT}
|
||||
{638298000 36000 1 YAKST}
|
||||
{654627600 32400 0 YAKT}
|
||||
{670352400 28800 0 YAKMMTT}
|
||||
{670356000 32400 1 YAKST}
|
||||
{686080800 28800 0 YAKT}
|
||||
{695757600 32400 0 YAKMMTT}
|
||||
{701802000 36000 1 YAKST}
|
||||
{717526800 32400 0 YAKT}
|
||||
{733251600 36000 1 YAKST}
|
||||
{748976400 32400 0 YAKT}
|
||||
{764701200 36000 1 YAKST}
|
||||
{780426000 32400 0 YAKT}
|
||||
{796150800 36000 1 YAKST}
|
||||
{811875600 32400 0 YAKT}
|
||||
{828205200 36000 1 YAKST}
|
||||
{846349200 32400 0 YAKT}
|
||||
{859654800 36000 1 YAKST}
|
||||
{877798800 32400 0 YAKT}
|
||||
{891104400 36000 1 YAKST}
|
||||
{909248400 32400 0 YAKT}
|
||||
{922554000 36000 1 YAKST}
|
||||
{941302800 32400 0 YAKT}
|
||||
{954003600 36000 1 YAKST}
|
||||
{972752400 32400 0 YAKT}
|
||||
{985453200 36000 1 YAKST}
|
||||
{1004202000 32400 0 YAKT}
|
||||
{1017507600 36000 1 YAKST}
|
||||
{1035651600 32400 0 YAKT}
|
||||
{1048957200 36000 1 YAKST}
|
||||
{1067101200 32400 0 YAKT}
|
||||
{1080406800 36000 1 YAKST}
|
||||
{1099155600 32400 0 YAKT}
|
||||
{1111856400 36000 1 YAKST}
|
||||
{1130605200 32400 0 YAKT}
|
||||
{1143306000 36000 1 YAKST}
|
||||
{1162054800 32400 0 YAKT}
|
||||
{1174755600 36000 1 YAKST}
|
||||
{1193504400 32400 0 YAKT}
|
||||
{1206810000 36000 1 YAKST}
|
||||
{1224954000 32400 0 YAKT}
|
||||
{1238259600 36000 1 YAKST}
|
||||
{1256403600 32400 0 YAKT}
|
||||
{1269709200 36000 1 YAKST}
|
||||
{1288458000 32400 0 YAKT}
|
||||
{1301158800 36000 0 YAKT}
|
||||
{1414252800 28800 0 IRKT}
|
||||
{1459015200 32400 0 YAKT}
|
||||
{-1579419232 28800 0 +08}
|
||||
{-1247558400 32400 0 +10}
|
||||
{354898800 36000 1 +10}
|
||||
{370706400 32400 0 +09}
|
||||
{386434800 36000 1 +10}
|
||||
{402242400 32400 0 +09}
|
||||
{417970800 36000 1 +10}
|
||||
{433778400 32400 0 +09}
|
||||
{449593200 36000 1 +10}
|
||||
{465325200 32400 0 +09}
|
||||
{481050000 36000 1 +10}
|
||||
{496774800 32400 0 +09}
|
||||
{512499600 36000 1 +10}
|
||||
{528224400 32400 0 +09}
|
||||
{543949200 36000 1 +10}
|
||||
{559674000 32400 0 +09}
|
||||
{575398800 36000 1 +10}
|
||||
{591123600 32400 0 +09}
|
||||
{606848400 36000 1 +10}
|
||||
{622573200 32400 0 +09}
|
||||
{638298000 36000 1 +10}
|
||||
{654627600 32400 0 +09}
|
||||
{670352400 28800 0 +09}
|
||||
{670356000 32400 1 +09}
|
||||
{686080800 28800 0 +08}
|
||||
{695757600 32400 0 +10}
|
||||
{701802000 36000 1 +10}
|
||||
{717526800 32400 0 +09}
|
||||
{733251600 36000 1 +10}
|
||||
{748976400 32400 0 +09}
|
||||
{764701200 36000 1 +10}
|
||||
{780426000 32400 0 +09}
|
||||
{796150800 36000 1 +10}
|
||||
{811875600 32400 0 +09}
|
||||
{828205200 36000 1 +10}
|
||||
{846349200 32400 0 +09}
|
||||
{859654800 36000 1 +10}
|
||||
{877798800 32400 0 +09}
|
||||
{891104400 36000 1 +10}
|
||||
{909248400 32400 0 +09}
|
||||
{922554000 36000 1 +10}
|
||||
{941302800 32400 0 +09}
|
||||
{954003600 36000 1 +10}
|
||||
{972752400 32400 0 +09}
|
||||
{985453200 36000 1 +10}
|
||||
{1004202000 32400 0 +09}
|
||||
{1017507600 36000 1 +10}
|
||||
{1035651600 32400 0 +09}
|
||||
{1048957200 36000 1 +10}
|
||||
{1067101200 32400 0 +09}
|
||||
{1080406800 36000 1 +10}
|
||||
{1099155600 32400 0 +09}
|
||||
{1111856400 36000 1 +10}
|
||||
{1130605200 32400 0 +09}
|
||||
{1143306000 36000 1 +10}
|
||||
{1162054800 32400 0 +09}
|
||||
{1174755600 36000 1 +10}
|
||||
{1193504400 32400 0 +09}
|
||||
{1206810000 36000 1 +10}
|
||||
{1224954000 32400 0 +09}
|
||||
{1238259600 36000 1 +10}
|
||||
{1256403600 32400 0 +09}
|
||||
{1269709200 36000 1 +10}
|
||||
{1288458000 32400 0 +09}
|
||||
{1301158800 36000 0 +10}
|
||||
{1414252800 28800 0 +08}
|
||||
{1459015200 32400 0 +09}
|
||||
}
|
||||
|
||||
@@ -2,28 +2,28 @@
|
||||
|
||||
set TZData(:Asia/Dushanbe) {
|
||||
{-9223372036854775808 16512 0 LMT}
|
||||
{-1441168512 18000 0 DUST}
|
||||
{-1247547600 21600 0 DUST}
|
||||
{354909600 25200 1 DUSST}
|
||||
{370717200 21600 0 DUST}
|
||||
{386445600 25200 1 DUSST}
|
||||
{402253200 21600 0 DUST}
|
||||
{417981600 25200 1 DUSST}
|
||||
{433789200 21600 0 DUST}
|
||||
{449604000 25200 1 DUSST}
|
||||
{465336000 21600 0 DUST}
|
||||
{481060800 25200 1 DUSST}
|
||||
{496785600 21600 0 DUST}
|
||||
{512510400 25200 1 DUSST}
|
||||
{528235200 21600 0 DUST}
|
||||
{543960000 25200 1 DUSST}
|
||||
{559684800 21600 0 DUST}
|
||||
{575409600 25200 1 DUSST}
|
||||
{591134400 21600 0 DUST}
|
||||
{606859200 25200 1 DUSST}
|
||||
{622584000 21600 0 DUST}
|
||||
{638308800 25200 1 DUSST}
|
||||
{654638400 21600 0 DUST}
|
||||
{670363200 21600 1 DUSST}
|
||||
{684363600 18000 0 TJT}
|
||||
{-1441168512 18000 0 +05}
|
||||
{-1247547600 21600 0 +06}
|
||||
{354909600 25200 1 +07}
|
||||
{370717200 21600 0 +06}
|
||||
{386445600 25200 1 +07}
|
||||
{402253200 21600 0 +06}
|
||||
{417981600 25200 1 +07}
|
||||
{433789200 21600 0 +06}
|
||||
{449604000 25200 1 +07}
|
||||
{465336000 21600 0 +06}
|
||||
{481060800 25200 1 +07}
|
||||
{496785600 21600 0 +06}
|
||||
{512510400 25200 1 +07}
|
||||
{528235200 21600 0 +06}
|
||||
{543960000 25200 1 +07}
|
||||
{559684800 21600 0 +06}
|
||||
{575409600 25200 1 +07}
|
||||
{591134400 21600 0 +06}
|
||||
{606859200 25200 1 +07}
|
||||
{622584000 21600 0 +06}
|
||||
{638308800 25200 1 +07}
|
||||
{654638400 21600 0 +06}
|
||||
{670363200 21600 1 +06}
|
||||
{684363600 18000 0 +05}
|
||||
}
|
||||
|
||||
+66
-66
@@ -3,70 +3,70 @@
|
||||
set TZData(:Asia/Irkutsk) {
|
||||
{-9223372036854775808 25025 0 LMT}
|
||||
{-2840165825 25025 0 IMT}
|
||||
{-1575874625 25200 0 IRKT}
|
||||
{-1247554800 28800 0 IRKMMTT}
|
||||
{354902400 32400 1 IRKST}
|
||||
{370710000 28800 0 IRKT}
|
||||
{386438400 32400 1 IRKST}
|
||||
{402246000 28800 0 IRKT}
|
||||
{417974400 32400 1 IRKST}
|
||||
{433782000 28800 0 IRKT}
|
||||
{449596800 32400 1 IRKST}
|
||||
{465328800 28800 0 IRKT}
|
||||
{481053600 32400 1 IRKST}
|
||||
{496778400 28800 0 IRKT}
|
||||
{512503200 32400 1 IRKST}
|
||||
{528228000 28800 0 IRKT}
|
||||
{543952800 32400 1 IRKST}
|
||||
{559677600 28800 0 IRKT}
|
||||
{575402400 32400 1 IRKST}
|
||||
{591127200 28800 0 IRKT}
|
||||
{606852000 32400 1 IRKST}
|
||||
{622576800 28800 0 IRKT}
|
||||
{638301600 32400 1 IRKST}
|
||||
{654631200 28800 0 IRKT}
|
||||
{670356000 25200 0 IRKMMTT}
|
||||
{670359600 28800 1 IRKST}
|
||||
{686084400 25200 0 IRKT}
|
||||
{695761200 28800 0 IRKMMTT}
|
||||
{701805600 32400 1 IRKST}
|
||||
{717530400 28800 0 IRKT}
|
||||
{733255200 32400 1 IRKST}
|
||||
{748980000 28800 0 IRKT}
|
||||
{764704800 32400 1 IRKST}
|
||||
{780429600 28800 0 IRKT}
|
||||
{796154400 32400 1 IRKST}
|
||||
{811879200 28800 0 IRKT}
|
||||
{828208800 32400 1 IRKST}
|
||||
{846352800 28800 0 IRKT}
|
||||
{859658400 32400 1 IRKST}
|
||||
{877802400 28800 0 IRKT}
|
||||
{891108000 32400 1 IRKST}
|
||||
{909252000 28800 0 IRKT}
|
||||
{922557600 32400 1 IRKST}
|
||||
{941306400 28800 0 IRKT}
|
||||
{954007200 32400 1 IRKST}
|
||||
{972756000 28800 0 IRKT}
|
||||
{985456800 32400 1 IRKST}
|
||||
{1004205600 28800 0 IRKT}
|
||||
{1017511200 32400 1 IRKST}
|
||||
{1035655200 28800 0 IRKT}
|
||||
{1048960800 32400 1 IRKST}
|
||||
{1067104800 28800 0 IRKT}
|
||||
{1080410400 32400 1 IRKST}
|
||||
{1099159200 28800 0 IRKT}
|
||||
{1111860000 32400 1 IRKST}
|
||||
{1130608800 28800 0 IRKT}
|
||||
{1143309600 32400 1 IRKST}
|
||||
{1162058400 28800 0 IRKT}
|
||||
{1174759200 32400 1 IRKST}
|
||||
{1193508000 28800 0 IRKT}
|
||||
{1206813600 32400 1 IRKST}
|
||||
{1224957600 28800 0 IRKT}
|
||||
{1238263200 32400 1 IRKST}
|
||||
{1256407200 28800 0 IRKT}
|
||||
{1269712800 32400 1 IRKST}
|
||||
{1288461600 28800 0 IRKT}
|
||||
{1301162400 32400 0 IRKT}
|
||||
{1414256400 28800 0 IRKT}
|
||||
{-1575874625 25200 0 +07}
|
||||
{-1247554800 28800 0 +09}
|
||||
{354902400 32400 1 +09}
|
||||
{370710000 28800 0 +08}
|
||||
{386438400 32400 1 +09}
|
||||
{402246000 28800 0 +08}
|
||||
{417974400 32400 1 +09}
|
||||
{433782000 28800 0 +08}
|
||||
{449596800 32400 1 +09}
|
||||
{465328800 28800 0 +08}
|
||||
{481053600 32400 1 +09}
|
||||
{496778400 28800 0 +08}
|
||||
{512503200 32400 1 +09}
|
||||
{528228000 28800 0 +08}
|
||||
{543952800 32400 1 +09}
|
||||
{559677600 28800 0 +08}
|
||||
{575402400 32400 1 +09}
|
||||
{591127200 28800 0 +08}
|
||||
{606852000 32400 1 +09}
|
||||
{622576800 28800 0 +08}
|
||||
{638301600 32400 1 +09}
|
||||
{654631200 28800 0 +08}
|
||||
{670356000 25200 0 +08}
|
||||
{670359600 28800 1 +08}
|
||||
{686084400 25200 0 +07}
|
||||
{695761200 28800 0 +09}
|
||||
{701805600 32400 1 +09}
|
||||
{717530400 28800 0 +08}
|
||||
{733255200 32400 1 +09}
|
||||
{748980000 28800 0 +08}
|
||||
{764704800 32400 1 +09}
|
||||
{780429600 28800 0 +08}
|
||||
{796154400 32400 1 +09}
|
||||
{811879200 28800 0 +08}
|
||||
{828208800 32400 1 +09}
|
||||
{846352800 28800 0 +08}
|
||||
{859658400 32400 1 +09}
|
||||
{877802400 28800 0 +08}
|
||||
{891108000 32400 1 +09}
|
||||
{909252000 28800 0 +08}
|
||||
{922557600 32400 1 +09}
|
||||
{941306400 28800 0 +08}
|
||||
{954007200 32400 1 +09}
|
||||
{972756000 28800 0 +08}
|
||||
{985456800 32400 1 +09}
|
||||
{1004205600 28800 0 +08}
|
||||
{1017511200 32400 1 +09}
|
||||
{1035655200 28800 0 +08}
|
||||
{1048960800 32400 1 +09}
|
||||
{1067104800 28800 0 +08}
|
||||
{1080410400 32400 1 +09}
|
||||
{1099159200 28800 0 +08}
|
||||
{1111860000 32400 1 +09}
|
||||
{1130608800 28800 0 +08}
|
||||
{1143309600 32400 1 +09}
|
||||
{1162058400 28800 0 +08}
|
||||
{1174759200 32400 1 +09}
|
||||
{1193508000 28800 0 +08}
|
||||
{1206813600 32400 1 +09}
|
||||
{1224957600 28800 0 +08}
|
||||
{1238263200 32400 1 +09}
|
||||
{1256407200 28800 0 +08}
|
||||
{1269712800 32400 1 +09}
|
||||
{1288461600 28800 0 +08}
|
||||
{1301162400 32400 0 +09}
|
||||
{1414256400 28800 0 +08}
|
||||
}
|
||||
|
||||
@@ -2,70 +2,70 @@
|
||||
|
||||
set TZData(:Asia/Kamchatka) {
|
||||
{-9223372036854775808 38076 0 LMT}
|
||||
{-1487759676 39600 0 PETT}
|
||||
{-1247569200 43200 0 PETMMTT}
|
||||
{354888000 46800 1 PETST}
|
||||
{370695600 43200 0 PETT}
|
||||
{386424000 46800 1 PETST}
|
||||
{402231600 43200 0 PETT}
|
||||
{417960000 46800 1 PETST}
|
||||
{433767600 43200 0 PETT}
|
||||
{449582400 46800 1 PETST}
|
||||
{465314400 43200 0 PETT}
|
||||
{481039200 46800 1 PETST}
|
||||
{496764000 43200 0 PETT}
|
||||
{512488800 46800 1 PETST}
|
||||
{528213600 43200 0 PETT}
|
||||
{543938400 46800 1 PETST}
|
||||
{559663200 43200 0 PETT}
|
||||
{575388000 46800 1 PETST}
|
||||
{591112800 43200 0 PETT}
|
||||
{606837600 46800 1 PETST}
|
||||
{622562400 43200 0 PETT}
|
||||
{638287200 46800 1 PETST}
|
||||
{654616800 43200 0 PETT}
|
||||
{670341600 39600 0 PETMMTT}
|
||||
{670345200 43200 1 PETST}
|
||||
{686070000 39600 0 PETT}
|
||||
{695746800 43200 0 PETMMTT}
|
||||
{701791200 46800 1 PETST}
|
||||
{717516000 43200 0 PETT}
|
||||
{733240800 46800 1 PETST}
|
||||
{748965600 43200 0 PETT}
|
||||
{764690400 46800 1 PETST}
|
||||
{780415200 43200 0 PETT}
|
||||
{796140000 46800 1 PETST}
|
||||
{811864800 43200 0 PETT}
|
||||
{828194400 46800 1 PETST}
|
||||
{846338400 43200 0 PETT}
|
||||
{859644000 46800 1 PETST}
|
||||
{877788000 43200 0 PETT}
|
||||
{891093600 46800 1 PETST}
|
||||
{909237600 43200 0 PETT}
|
||||
{922543200 46800 1 PETST}
|
||||
{941292000 43200 0 PETT}
|
||||
{953992800 46800 1 PETST}
|
||||
{972741600 43200 0 PETT}
|
||||
{985442400 46800 1 PETST}
|
||||
{1004191200 43200 0 PETT}
|
||||
{1017496800 46800 1 PETST}
|
||||
{1035640800 43200 0 PETT}
|
||||
{1048946400 46800 1 PETST}
|
||||
{1067090400 43200 0 PETT}
|
||||
{1080396000 46800 1 PETST}
|
||||
{1099144800 43200 0 PETT}
|
||||
{1111845600 46800 1 PETST}
|
||||
{1130594400 43200 0 PETT}
|
||||
{1143295200 46800 1 PETST}
|
||||
{1162044000 43200 0 PETT}
|
||||
{1174744800 46800 1 PETST}
|
||||
{1193493600 43200 0 PETT}
|
||||
{1206799200 46800 1 PETST}
|
||||
{1224943200 43200 0 PETT}
|
||||
{1238248800 46800 1 PETST}
|
||||
{1256392800 43200 0 PETT}
|
||||
{1269698400 39600 0 PETMMTT}
|
||||
{1269702000 43200 1 PETST}
|
||||
{1288450800 39600 0 PETT}
|
||||
{1301151600 43200 0 PETT}
|
||||
{-1487759676 39600 0 +11}
|
||||
{-1247569200 43200 0 +13}
|
||||
{354888000 46800 1 +13}
|
||||
{370695600 43200 0 +12}
|
||||
{386424000 46800 1 +13}
|
||||
{402231600 43200 0 +12}
|
||||
{417960000 46800 1 +13}
|
||||
{433767600 43200 0 +12}
|
||||
{449582400 46800 1 +13}
|
||||
{465314400 43200 0 +12}
|
||||
{481039200 46800 1 +13}
|
||||
{496764000 43200 0 +12}
|
||||
{512488800 46800 1 +13}
|
||||
{528213600 43200 0 +12}
|
||||
{543938400 46800 1 +13}
|
||||
{559663200 43200 0 +12}
|
||||
{575388000 46800 1 +13}
|
||||
{591112800 43200 0 +12}
|
||||
{606837600 46800 1 +13}
|
||||
{622562400 43200 0 +12}
|
||||
{638287200 46800 1 +13}
|
||||
{654616800 43200 0 +12}
|
||||
{670341600 39600 0 +12}
|
||||
{670345200 43200 1 +12}
|
||||
{686070000 39600 0 +11}
|
||||
{695746800 43200 0 +13}
|
||||
{701791200 46800 1 +13}
|
||||
{717516000 43200 0 +12}
|
||||
{733240800 46800 1 +13}
|
||||
{748965600 43200 0 +12}
|
||||
{764690400 46800 1 +13}
|
||||
{780415200 43200 0 +12}
|
||||
{796140000 46800 1 +13}
|
||||
{811864800 43200 0 +12}
|
||||
{828194400 46800 1 +13}
|
||||
{846338400 43200 0 +12}
|
||||
{859644000 46800 1 +13}
|
||||
{877788000 43200 0 +12}
|
||||
{891093600 46800 1 +13}
|
||||
{909237600 43200 0 +12}
|
||||
{922543200 46800 1 +13}
|
||||
{941292000 43200 0 +12}
|
||||
{953992800 46800 1 +13}
|
||||
{972741600 43200 0 +12}
|
||||
{985442400 46800 1 +13}
|
||||
{1004191200 43200 0 +12}
|
||||
{1017496800 46800 1 +13}
|
||||
{1035640800 43200 0 +12}
|
||||
{1048946400 46800 1 +13}
|
||||
{1067090400 43200 0 +12}
|
||||
{1080396000 46800 1 +13}
|
||||
{1099144800 43200 0 +12}
|
||||
{1111845600 46800 1 +13}
|
||||
{1130594400 43200 0 +12}
|
||||
{1143295200 46800 1 +13}
|
||||
{1162044000 43200 0 +12}
|
||||
{1174744800 46800 1 +13}
|
||||
{1193493600 43200 0 +12}
|
||||
{1206799200 46800 1 +13}
|
||||
{1224943200 43200 0 +12}
|
||||
{1238248800 46800 1 +13}
|
||||
{1256392800 43200 0 +12}
|
||||
{1269698400 39600 0 +12}
|
||||
{1269702000 43200 1 +12}
|
||||
{1288450800 39600 0 +11}
|
||||
{1301151600 43200 0 +12}
|
||||
}
|
||||
|
||||
@@ -2,72 +2,72 @@
|
||||
|
||||
set TZData(:Asia/Khandyga) {
|
||||
{-9223372036854775808 32533 0 LMT}
|
||||
{-1579424533 28800 0 YAKT}
|
||||
{-1247558400 32400 0 YAKMMTT}
|
||||
{354898800 36000 1 YAKST}
|
||||
{370706400 32400 0 YAKT}
|
||||
{386434800 36000 1 YAKST}
|
||||
{402242400 32400 0 YAKT}
|
||||
{417970800 36000 1 YAKST}
|
||||
{433778400 32400 0 YAKT}
|
||||
{449593200 36000 1 YAKST}
|
||||
{465325200 32400 0 YAKT}
|
||||
{481050000 36000 1 YAKST}
|
||||
{496774800 32400 0 YAKT}
|
||||
{512499600 36000 1 YAKST}
|
||||
{528224400 32400 0 YAKT}
|
||||
{543949200 36000 1 YAKST}
|
||||
{559674000 32400 0 YAKT}
|
||||
{575398800 36000 1 YAKST}
|
||||
{591123600 32400 0 YAKT}
|
||||
{606848400 36000 1 YAKST}
|
||||
{622573200 32400 0 YAKT}
|
||||
{638298000 36000 1 YAKST}
|
||||
{654627600 32400 0 YAKT}
|
||||
{670352400 28800 0 YAKMMTT}
|
||||
{670356000 32400 1 YAKST}
|
||||
{686080800 28800 0 YAKT}
|
||||
{695757600 32400 0 YAKMMTT}
|
||||
{701802000 36000 1 YAKST}
|
||||
{717526800 32400 0 YAKT}
|
||||
{733251600 36000 1 YAKST}
|
||||
{748976400 32400 0 YAKT}
|
||||
{764701200 36000 1 YAKST}
|
||||
{780426000 32400 0 YAKT}
|
||||
{796150800 36000 1 YAKST}
|
||||
{811875600 32400 0 YAKT}
|
||||
{828205200 36000 1 YAKST}
|
||||
{846349200 32400 0 YAKT}
|
||||
{859654800 36000 1 YAKST}
|
||||
{877798800 32400 0 YAKT}
|
||||
{891104400 36000 1 YAKST}
|
||||
{909248400 32400 0 YAKT}
|
||||
{922554000 36000 1 YAKST}
|
||||
{941302800 32400 0 YAKT}
|
||||
{954003600 36000 1 YAKST}
|
||||
{972752400 32400 0 YAKT}
|
||||
{985453200 36000 1 YAKST}
|
||||
{1004202000 32400 0 YAKT}
|
||||
{1017507600 36000 1 YAKST}
|
||||
{1035651600 32400 0 YAKT}
|
||||
{1048957200 36000 1 YAKST}
|
||||
{1067101200 32400 0 YAKT}
|
||||
{1072882800 36000 0 VLAMMTT}
|
||||
{1080403200 39600 1 VLAST}
|
||||
{1099152000 36000 0 VLAT}
|
||||
{1111852800 39600 1 VLAST}
|
||||
{1130601600 36000 0 VLAT}
|
||||
{1143302400 39600 1 VLAST}
|
||||
{1162051200 36000 0 VLAT}
|
||||
{1174752000 39600 1 VLAST}
|
||||
{1193500800 36000 0 VLAT}
|
||||
{1206806400 39600 1 VLAST}
|
||||
{1224950400 36000 0 VLAT}
|
||||
{1238256000 39600 1 VLAST}
|
||||
{1256400000 36000 0 VLAT}
|
||||
{1269705600 39600 1 VLAST}
|
||||
{1288454400 36000 0 VLAT}
|
||||
{1301155200 39600 0 VLAT}
|
||||
{1315832400 36000 0 YAKT}
|
||||
{1414252800 32400 0 YAKT}
|
||||
{-1579424533 28800 0 +08}
|
||||
{-1247558400 32400 0 +10}
|
||||
{354898800 36000 1 +10}
|
||||
{370706400 32400 0 +09}
|
||||
{386434800 36000 1 +10}
|
||||
{402242400 32400 0 +09}
|
||||
{417970800 36000 1 +10}
|
||||
{433778400 32400 0 +09}
|
||||
{449593200 36000 1 +10}
|
||||
{465325200 32400 0 +09}
|
||||
{481050000 36000 1 +10}
|
||||
{496774800 32400 0 +09}
|
||||
{512499600 36000 1 +10}
|
||||
{528224400 32400 0 +09}
|
||||
{543949200 36000 1 +10}
|
||||
{559674000 32400 0 +09}
|
||||
{575398800 36000 1 +10}
|
||||
{591123600 32400 0 +09}
|
||||
{606848400 36000 1 +10}
|
||||
{622573200 32400 0 +09}
|
||||
{638298000 36000 1 +10}
|
||||
{654627600 32400 0 +09}
|
||||
{670352400 28800 0 +09}
|
||||
{670356000 32400 1 +09}
|
||||
{686080800 28800 0 +08}
|
||||
{695757600 32400 0 +10}
|
||||
{701802000 36000 1 +10}
|
||||
{717526800 32400 0 +09}
|
||||
{733251600 36000 1 +10}
|
||||
{748976400 32400 0 +09}
|
||||
{764701200 36000 1 +10}
|
||||
{780426000 32400 0 +09}
|
||||
{796150800 36000 1 +10}
|
||||
{811875600 32400 0 +09}
|
||||
{828205200 36000 1 +10}
|
||||
{846349200 32400 0 +09}
|
||||
{859654800 36000 1 +10}
|
||||
{877798800 32400 0 +09}
|
||||
{891104400 36000 1 +10}
|
||||
{909248400 32400 0 +09}
|
||||
{922554000 36000 1 +10}
|
||||
{941302800 32400 0 +09}
|
||||
{954003600 36000 1 +10}
|
||||
{972752400 32400 0 +09}
|
||||
{985453200 36000 1 +10}
|
||||
{1004202000 32400 0 +09}
|
||||
{1017507600 36000 1 +10}
|
||||
{1035651600 32400 0 +09}
|
||||
{1048957200 36000 1 +10}
|
||||
{1067101200 32400 0 +09}
|
||||
{1072882800 36000 0 +11}
|
||||
{1080403200 39600 1 +11}
|
||||
{1099152000 36000 0 +10}
|
||||
{1111852800 39600 1 +11}
|
||||
{1130601600 36000 0 +10}
|
||||
{1143302400 39600 1 +11}
|
||||
{1162051200 36000 0 +10}
|
||||
{1174752000 39600 1 +11}
|
||||
{1193500800 36000 0 +10}
|
||||
{1206806400 39600 1 +11}
|
||||
{1224950400 36000 0 +10}
|
||||
{1238256000 39600 1 +11}
|
||||
{1256400000 36000 0 +10}
|
||||
{1269705600 39600 1 +11}
|
||||
{1288454400 36000 0 +10}
|
||||
{1301155200 39600 0 +11}
|
||||
{1315832400 36000 0 +10}
|
||||
{1414252800 32400 0 +09}
|
||||
}
|
||||
|
||||
@@ -2,70 +2,70 @@
|
||||
|
||||
set TZData(:Asia/Krasnoyarsk) {
|
||||
{-9223372036854775808 22286 0 LMT}
|
||||
{-1577513486 21600 0 KRAT}
|
||||
{-1247551200 25200 0 KRAMMTT}
|
||||
{354906000 28800 1 KRAST}
|
||||
{370713600 25200 0 KRAT}
|
||||
{386442000 28800 1 KRAST}
|
||||
{402249600 25200 0 KRAT}
|
||||
{417978000 28800 1 KRAST}
|
||||
{433785600 25200 0 KRAT}
|
||||
{449600400 28800 1 KRAST}
|
||||
{465332400 25200 0 KRAT}
|
||||
{481057200 28800 1 KRAST}
|
||||
{496782000 25200 0 KRAT}
|
||||
{512506800 28800 1 KRAST}
|
||||
{528231600 25200 0 KRAT}
|
||||
{543956400 28800 1 KRAST}
|
||||
{559681200 25200 0 KRAT}
|
||||
{575406000 28800 1 KRAST}
|
||||
{591130800 25200 0 KRAT}
|
||||
{606855600 28800 1 KRAST}
|
||||
{622580400 25200 0 KRAT}
|
||||
{638305200 28800 1 KRAST}
|
||||
{654634800 25200 0 KRAT}
|
||||
{670359600 21600 0 KRAMMTT}
|
||||
{670363200 25200 1 KRAST}
|
||||
{686088000 21600 0 KRAT}
|
||||
{695764800 25200 0 KRAMMTT}
|
||||
{701809200 28800 1 KRAST}
|
||||
{717534000 25200 0 KRAT}
|
||||
{733258800 28800 1 KRAST}
|
||||
{748983600 25200 0 KRAT}
|
||||
{764708400 28800 1 KRAST}
|
||||
{780433200 25200 0 KRAT}
|
||||
{796158000 28800 1 KRAST}
|
||||
{811882800 25200 0 KRAT}
|
||||
{828212400 28800 1 KRAST}
|
||||
{846356400 25200 0 KRAT}
|
||||
{859662000 28800 1 KRAST}
|
||||
{877806000 25200 0 KRAT}
|
||||
{891111600 28800 1 KRAST}
|
||||
{909255600 25200 0 KRAT}
|
||||
{922561200 28800 1 KRAST}
|
||||
{941310000 25200 0 KRAT}
|
||||
{954010800 28800 1 KRAST}
|
||||
{972759600 25200 0 KRAT}
|
||||
{985460400 28800 1 KRAST}
|
||||
{1004209200 25200 0 KRAT}
|
||||
{1017514800 28800 1 KRAST}
|
||||
{1035658800 25200 0 KRAT}
|
||||
{1048964400 28800 1 KRAST}
|
||||
{1067108400 25200 0 KRAT}
|
||||
{1080414000 28800 1 KRAST}
|
||||
{1099162800 25200 0 KRAT}
|
||||
{1111863600 28800 1 KRAST}
|
||||
{1130612400 25200 0 KRAT}
|
||||
{1143313200 28800 1 KRAST}
|
||||
{1162062000 25200 0 KRAT}
|
||||
{1174762800 28800 1 KRAST}
|
||||
{1193511600 25200 0 KRAT}
|
||||
{1206817200 28800 1 KRAST}
|
||||
{1224961200 25200 0 KRAT}
|
||||
{1238266800 28800 1 KRAST}
|
||||
{1256410800 25200 0 KRAT}
|
||||
{1269716400 28800 1 KRAST}
|
||||
{1288465200 25200 0 KRAT}
|
||||
{1301166000 28800 0 KRAT}
|
||||
{1414260000 25200 0 KRAT}
|
||||
{-1577513486 21600 0 +06}
|
||||
{-1247551200 25200 0 +08}
|
||||
{354906000 28800 1 +08}
|
||||
{370713600 25200 0 +07}
|
||||
{386442000 28800 1 +08}
|
||||
{402249600 25200 0 +07}
|
||||
{417978000 28800 1 +08}
|
||||
{433785600 25200 0 +07}
|
||||
{449600400 28800 1 +08}
|
||||
{465332400 25200 0 +07}
|
||||
{481057200 28800 1 +08}
|
||||
{496782000 25200 0 +07}
|
||||
{512506800 28800 1 +08}
|
||||
{528231600 25200 0 +07}
|
||||
{543956400 28800 1 +08}
|
||||
{559681200 25200 0 +07}
|
||||
{575406000 28800 1 +08}
|
||||
{591130800 25200 0 +07}
|
||||
{606855600 28800 1 +08}
|
||||
{622580400 25200 0 +07}
|
||||
{638305200 28800 1 +08}
|
||||
{654634800 25200 0 +07}
|
||||
{670359600 21600 0 +07}
|
||||
{670363200 25200 1 +07}
|
||||
{686088000 21600 0 +06}
|
||||
{695764800 25200 0 +08}
|
||||
{701809200 28800 1 +08}
|
||||
{717534000 25200 0 +07}
|
||||
{733258800 28800 1 +08}
|
||||
{748983600 25200 0 +07}
|
||||
{764708400 28800 1 +08}
|
||||
{780433200 25200 0 +07}
|
||||
{796158000 28800 1 +08}
|
||||
{811882800 25200 0 +07}
|
||||
{828212400 28800 1 +08}
|
||||
{846356400 25200 0 +07}
|
||||
{859662000 28800 1 +08}
|
||||
{877806000 25200 0 +07}
|
||||
{891111600 28800 1 +08}
|
||||
{909255600 25200 0 +07}
|
||||
{922561200 28800 1 +08}
|
||||
{941310000 25200 0 +07}
|
||||
{954010800 28800 1 +08}
|
||||
{972759600 25200 0 +07}
|
||||
{985460400 28800 1 +08}
|
||||
{1004209200 25200 0 +07}
|
||||
{1017514800 28800 1 +08}
|
||||
{1035658800 25200 0 +07}
|
||||
{1048964400 28800 1 +08}
|
||||
{1067108400 25200 0 +07}
|
||||
{1080414000 28800 1 +08}
|
||||
{1099162800 25200 0 +07}
|
||||
{1111863600 28800 1 +08}
|
||||
{1130612400 25200 0 +07}
|
||||
{1143313200 28800 1 +08}
|
||||
{1162062000 25200 0 +07}
|
||||
{1174762800 28800 1 +08}
|
||||
{1193511600 25200 0 +07}
|
||||
{1206817200 28800 1 +08}
|
||||
{1224961200 25200 0 +07}
|
||||
{1238266800 28800 1 +08}
|
||||
{1256410800 25200 0 +07}
|
||||
{1269716400 28800 1 +08}
|
||||
{1288465200 25200 0 +07}
|
||||
{1301166000 28800 0 +08}
|
||||
{1414260000 25200 0 +07}
|
||||
}
|
||||
|
||||
+67
-67
@@ -2,71 +2,71 @@
|
||||
|
||||
set TZData(:Asia/Magadan) {
|
||||
{-9223372036854775808 36192 0 LMT}
|
||||
{-1441188192 36000 0 MAGT}
|
||||
{-1247565600 39600 0 MAGMMTT}
|
||||
{354891600 43200 1 MAGST}
|
||||
{370699200 39600 0 MAGT}
|
||||
{386427600 43200 1 MAGST}
|
||||
{402235200 39600 0 MAGT}
|
||||
{417963600 43200 1 MAGST}
|
||||
{433771200 39600 0 MAGT}
|
||||
{449586000 43200 1 MAGST}
|
||||
{465318000 39600 0 MAGT}
|
||||
{481042800 43200 1 MAGST}
|
||||
{496767600 39600 0 MAGT}
|
||||
{512492400 43200 1 MAGST}
|
||||
{528217200 39600 0 MAGT}
|
||||
{543942000 43200 1 MAGST}
|
||||
{559666800 39600 0 MAGT}
|
||||
{575391600 43200 1 MAGST}
|
||||
{591116400 39600 0 MAGT}
|
||||
{606841200 43200 1 MAGST}
|
||||
{622566000 39600 0 MAGT}
|
||||
{638290800 43200 1 MAGST}
|
||||
{654620400 39600 0 MAGT}
|
||||
{670345200 36000 0 MAGMMTT}
|
||||
{670348800 39600 1 MAGST}
|
||||
{686073600 36000 0 MAGT}
|
||||
{695750400 39600 0 MAGMMTT}
|
||||
{701794800 43200 1 MAGST}
|
||||
{717519600 39600 0 MAGT}
|
||||
{733244400 43200 1 MAGST}
|
||||
{748969200 39600 0 MAGT}
|
||||
{764694000 43200 1 MAGST}
|
||||
{780418800 39600 0 MAGT}
|
||||
{796143600 43200 1 MAGST}
|
||||
{811868400 39600 0 MAGT}
|
||||
{828198000 43200 1 MAGST}
|
||||
{846342000 39600 0 MAGT}
|
||||
{859647600 43200 1 MAGST}
|
||||
{877791600 39600 0 MAGT}
|
||||
{891097200 43200 1 MAGST}
|
||||
{909241200 39600 0 MAGT}
|
||||
{922546800 43200 1 MAGST}
|
||||
{941295600 39600 0 MAGT}
|
||||
{953996400 43200 1 MAGST}
|
||||
{972745200 39600 0 MAGT}
|
||||
{985446000 43200 1 MAGST}
|
||||
{1004194800 39600 0 MAGT}
|
||||
{1017500400 43200 1 MAGST}
|
||||
{1035644400 39600 0 MAGT}
|
||||
{1048950000 43200 1 MAGST}
|
||||
{1067094000 39600 0 MAGT}
|
||||
{1080399600 43200 1 MAGST}
|
||||
{1099148400 39600 0 MAGT}
|
||||
{1111849200 43200 1 MAGST}
|
||||
{1130598000 39600 0 MAGT}
|
||||
{1143298800 43200 1 MAGST}
|
||||
{1162047600 39600 0 MAGT}
|
||||
{1174748400 43200 1 MAGST}
|
||||
{1193497200 39600 0 MAGT}
|
||||
{1206802800 43200 1 MAGST}
|
||||
{1224946800 39600 0 MAGT}
|
||||
{1238252400 43200 1 MAGST}
|
||||
{1256396400 39600 0 MAGT}
|
||||
{1269702000 43200 1 MAGST}
|
||||
{1288450800 39600 0 MAGT}
|
||||
{1301151600 43200 0 MAGT}
|
||||
{1414245600 36000 0 MAGT}
|
||||
{1461427200 39600 0 MAGT}
|
||||
{-1441188192 36000 0 +10}
|
||||
{-1247565600 39600 0 +12}
|
||||
{354891600 43200 1 +12}
|
||||
{370699200 39600 0 +11}
|
||||
{386427600 43200 1 +12}
|
||||
{402235200 39600 0 +11}
|
||||
{417963600 43200 1 +12}
|
||||
{433771200 39600 0 +11}
|
||||
{449586000 43200 1 +12}
|
||||
{465318000 39600 0 +11}
|
||||
{481042800 43200 1 +12}
|
||||
{496767600 39600 0 +11}
|
||||
{512492400 43200 1 +12}
|
||||
{528217200 39600 0 +11}
|
||||
{543942000 43200 1 +12}
|
||||
{559666800 39600 0 +11}
|
||||
{575391600 43200 1 +12}
|
||||
{591116400 39600 0 +11}
|
||||
{606841200 43200 1 +12}
|
||||
{622566000 39600 0 +11}
|
||||
{638290800 43200 1 +12}
|
||||
{654620400 39600 0 +11}
|
||||
{670345200 36000 0 +11}
|
||||
{670348800 39600 1 +11}
|
||||
{686073600 36000 0 +10}
|
||||
{695750400 39600 0 +12}
|
||||
{701794800 43200 1 +12}
|
||||
{717519600 39600 0 +11}
|
||||
{733244400 43200 1 +12}
|
||||
{748969200 39600 0 +11}
|
||||
{764694000 43200 1 +12}
|
||||
{780418800 39600 0 +11}
|
||||
{796143600 43200 1 +12}
|
||||
{811868400 39600 0 +11}
|
||||
{828198000 43200 1 +12}
|
||||
{846342000 39600 0 +11}
|
||||
{859647600 43200 1 +12}
|
||||
{877791600 39600 0 +11}
|
||||
{891097200 43200 1 +12}
|
||||
{909241200 39600 0 +11}
|
||||
{922546800 43200 1 +12}
|
||||
{941295600 39600 0 +11}
|
||||
{953996400 43200 1 +12}
|
||||
{972745200 39600 0 +11}
|
||||
{985446000 43200 1 +12}
|
||||
{1004194800 39600 0 +11}
|
||||
{1017500400 43200 1 +12}
|
||||
{1035644400 39600 0 +11}
|
||||
{1048950000 43200 1 +12}
|
||||
{1067094000 39600 0 +11}
|
||||
{1080399600 43200 1 +12}
|
||||
{1099148400 39600 0 +11}
|
||||
{1111849200 43200 1 +12}
|
||||
{1130598000 39600 0 +11}
|
||||
{1143298800 43200 1 +12}
|
||||
{1162047600 39600 0 +11}
|
||||
{1174748400 43200 1 +12}
|
||||
{1193497200 39600 0 +11}
|
||||
{1206802800 43200 1 +12}
|
||||
{1224946800 39600 0 +11}
|
||||
{1238252400 43200 1 +12}
|
||||
{1256396400 39600 0 +11}
|
||||
{1269702000 43200 1 +12}
|
||||
{1288450800 39600 0 +11}
|
||||
{1301151600 43200 0 +12}
|
||||
{1414245600 36000 0 +10}
|
||||
{1461427200 39600 0 +11}
|
||||
}
|
||||
|
||||
@@ -2,71 +2,70 @@
|
||||
|
||||
set TZData(:Asia/Novokuznetsk) {
|
||||
{-9223372036854775808 20928 0 LMT}
|
||||
{-1441259328 21600 0 KRAT}
|
||||
{-1247551200 25200 0 KRAMMTT}
|
||||
{354906000 28800 1 KRAST}
|
||||
{370713600 25200 0 KRAT}
|
||||
{386442000 28800 1 KRAST}
|
||||
{402249600 25200 0 KRAT}
|
||||
{417978000 28800 1 KRAST}
|
||||
{433785600 25200 0 KRAT}
|
||||
{449600400 28800 1 KRAST}
|
||||
{465332400 25200 0 KRAT}
|
||||
{481057200 28800 1 KRAST}
|
||||
{496782000 25200 0 KRAT}
|
||||
{512506800 28800 1 KRAST}
|
||||
{528231600 25200 0 KRAT}
|
||||
{543956400 28800 1 KRAST}
|
||||
{559681200 25200 0 KRAT}
|
||||
{575406000 28800 1 KRAST}
|
||||
{591130800 25200 0 KRAT}
|
||||
{606855600 28800 1 KRAST}
|
||||
{622580400 25200 0 KRAT}
|
||||
{638305200 28800 1 KRAST}
|
||||
{654634800 25200 0 KRAT}
|
||||
{670359600 21600 0 KRAMMTT}
|
||||
{670363200 25200 1 KRAST}
|
||||
{686088000 21600 0 KRAT}
|
||||
{695764800 25200 0 KRAMMTT}
|
||||
{701809200 28800 1 KRAST}
|
||||
{717534000 25200 0 KRAT}
|
||||
{733258800 28800 1 KRAST}
|
||||
{748983600 25200 0 KRAT}
|
||||
{764708400 28800 1 KRAST}
|
||||
{780433200 25200 0 KRAT}
|
||||
{796158000 28800 1 KRAST}
|
||||
{811882800 25200 0 KRAT}
|
||||
{828212400 28800 1 KRAST}
|
||||
{846356400 25200 0 KRAT}
|
||||
{859662000 28800 1 KRAST}
|
||||
{877806000 25200 0 KRAT}
|
||||
{891111600 28800 1 KRAST}
|
||||
{909255600 25200 0 KRAT}
|
||||
{922561200 28800 1 KRAST}
|
||||
{941310000 25200 0 KRAT}
|
||||
{954010800 28800 1 KRAST}
|
||||
{972759600 25200 0 KRAT}
|
||||
{985460400 28800 1 KRAST}
|
||||
{1004209200 25200 0 KRAT}
|
||||
{1017514800 28800 1 KRAST}
|
||||
{1035658800 25200 0 KRAT}
|
||||
{1048964400 28800 1 KRAST}
|
||||
{1067108400 25200 0 KRAT}
|
||||
{1080414000 28800 1 KRAST}
|
||||
{1099162800 25200 0 KRAT}
|
||||
{1111863600 28800 1 KRAST}
|
||||
{1130612400 25200 0 KRAT}
|
||||
{1143313200 28800 1 KRAST}
|
||||
{1162062000 25200 0 KRAT}
|
||||
{1174762800 28800 1 KRAST}
|
||||
{1193511600 25200 0 KRAT}
|
||||
{1206817200 28800 1 KRAST}
|
||||
{1224961200 25200 0 KRAT}
|
||||
{1238266800 28800 1 KRAST}
|
||||
{1256410800 25200 0 KRAT}
|
||||
{1269716400 21600 0 NOVMMTT}
|
||||
{1269720000 25200 1 NOVST}
|
||||
{1288468800 21600 0 NOVT}
|
||||
{1301169600 25200 0 NOVT}
|
||||
{1414263600 25200 0 KRAT}
|
||||
{-1441259328 21600 0 +06}
|
||||
{-1247551200 25200 0 +08}
|
||||
{354906000 28800 1 +08}
|
||||
{370713600 25200 0 +07}
|
||||
{386442000 28800 1 +08}
|
||||
{402249600 25200 0 +07}
|
||||
{417978000 28800 1 +08}
|
||||
{433785600 25200 0 +07}
|
||||
{449600400 28800 1 +08}
|
||||
{465332400 25200 0 +07}
|
||||
{481057200 28800 1 +08}
|
||||
{496782000 25200 0 +07}
|
||||
{512506800 28800 1 +08}
|
||||
{528231600 25200 0 +07}
|
||||
{543956400 28800 1 +08}
|
||||
{559681200 25200 0 +07}
|
||||
{575406000 28800 1 +08}
|
||||
{591130800 25200 0 +07}
|
||||
{606855600 28800 1 +08}
|
||||
{622580400 25200 0 +07}
|
||||
{638305200 28800 1 +08}
|
||||
{654634800 25200 0 +07}
|
||||
{670359600 21600 0 +07}
|
||||
{670363200 25200 1 +07}
|
||||
{686088000 21600 0 +06}
|
||||
{695764800 25200 0 +08}
|
||||
{701809200 28800 1 +08}
|
||||
{717534000 25200 0 +07}
|
||||
{733258800 28800 1 +08}
|
||||
{748983600 25200 0 +07}
|
||||
{764708400 28800 1 +08}
|
||||
{780433200 25200 0 +07}
|
||||
{796158000 28800 1 +08}
|
||||
{811882800 25200 0 +07}
|
||||
{828212400 28800 1 +08}
|
||||
{846356400 25200 0 +07}
|
||||
{859662000 28800 1 +08}
|
||||
{877806000 25200 0 +07}
|
||||
{891111600 28800 1 +08}
|
||||
{909255600 25200 0 +07}
|
||||
{922561200 28800 1 +08}
|
||||
{941310000 25200 0 +07}
|
||||
{954010800 28800 1 +08}
|
||||
{972759600 25200 0 +07}
|
||||
{985460400 28800 1 +08}
|
||||
{1004209200 25200 0 +07}
|
||||
{1017514800 28800 1 +08}
|
||||
{1035658800 25200 0 +07}
|
||||
{1048964400 28800 1 +08}
|
||||
{1067108400 25200 0 +07}
|
||||
{1080414000 28800 1 +08}
|
||||
{1099162800 25200 0 +07}
|
||||
{1111863600 28800 1 +08}
|
||||
{1130612400 25200 0 +07}
|
||||
{1143313200 28800 1 +08}
|
||||
{1162062000 25200 0 +07}
|
||||
{1174762800 28800 1 +08}
|
||||
{1193511600 25200 0 +07}
|
||||
{1206817200 28800 1 +08}
|
||||
{1224961200 25200 0 +07}
|
||||
{1238266800 28800 1 +08}
|
||||
{1256410800 25200 0 +07}
|
||||
{1269716400 21600 0 +07}
|
||||
{1269720000 25200 1 +07}
|
||||
{1288468800 21600 0 +06}
|
||||
{1301169600 25200 0 +07}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user