@@ -23,48 +23,14 @@
23 23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef FOSSIL_ENABLE_TCL
24 24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25 25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include "th.h"
26 26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include "tcl.h"
27 27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Has the decision about whether or not to use Tcl_EvalObjv already been made
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** via the Makefile?
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if !defined(USE_TCL_EVALOBJV)
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Are we being compiled against Tcl 8.6b1 or b2? This check is [mostly]
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** wrong for at the following reason:
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** 1. Technically, this check is completely useless when the stubs mechanism
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is in use. In that case, a runtime version check would be required and
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** that has not been implemented.
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** However, if a particular user compiles and runs against Tcl 8.6b1 or b2,
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** this will cause a fallback to using the "conservative" method of directly
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** invoking a Tcl command. In that case, potential crashes will be avoided if
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the user just so happened to compile or run against Tcl 8.6b1 or b2.
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if (TCL_MAJOR_VERSION == 8) && (TCL_MINOR_VERSION == 6) && \
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- (TCL_RELEASE_LEVEL == TCL_BETA_RELEASE) && (TCL_RELEASE_SERIAL < 3)
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Workaround NRE-specific issue in Tcl_EvalObjCmd (SF bug #3399564) by using
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Tcl_EvalObjv instead of invoking the objProc directly.
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # define USE_TCL_EVALOBJV (1)
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #else
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** We should be able to safely use Tcl_GetCommandInfoFromToken, when the need
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** arises, to invoke a specific Tcl command "directly" with some arguments.
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # define USE_TCL_EVALOBJV (0)
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* (TCL_MAJOR_VERSION > 8) ... */
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* !defined(USE_TCL_EVALOBJV) */
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
62 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
63 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** These macros are designed to reduce the redundant code required to marshal
64 30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** arguments from TH1 to Tcl.
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
66 32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define USE_ARGV_TO_OBJV() \
67 33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int objc; \
68 34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Tcl_Obj **objv; \
69 35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
70 36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -83,18 +49,25 @@
83 49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ckfree((char *)objv);
84 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
85 51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
86 52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Fetch the Tcl interpreter from the specified void pointer, cast to a Tcl
87 53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** context.
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
89 55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define GET_CTX_TCL_INTERP(ctx) \
90 56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
((struct TclContext *)(ctx))->interp
91 57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Fetch the (logically boolean) value from the specified void pointer that
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** indicates whether or not we can/should use direct objProc calls.
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define GET_CTX_TCL_USEOBJPROC(ctx) \
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ((struct TclContext *)(ctx))->useObjProc
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
92 65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
93 66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Define the Tcl shared library name, some exported function names, and some
94 67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** cross-platform macros for use with the Tcl stubs mechanism, when enabled.
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
96 69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if defined(USE_TCL_STUBS)
97 70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# if defined(_WIN32)
98 71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# define WIN32_LEAN_AND_MEAN
99 72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# include <windows.h>
100 73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# ifndef TCL_LIBRARY_NAME
@@ -144,33 +117,37 @@
144 117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# define TCL_CREATEINTERP_NAME "_Tcl_CreateInterp"
145 118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# endif
146 119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# ifndef TCL_DELETEINTERP_NAME
147 120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# define TCL_DELETEINTERP_NAME "_Tcl_DeleteInterp"
148 121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# endif
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # ifndef TCL_FINALIZE_NAME
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define TCL_FINALIZE_NAME "_Tcl_Finalize"
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # endif
149 125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* defined(USE_TCL_STUBS) */
150 126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
151 127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
152 128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The function types for Tcl_FindExecutable and Tcl_CreateInterp are needed
153 129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** when the Tcl library is being loaded dynamically by a stubs-enabled
154 130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** application (i.e. the inverse of using a stubs-enabled package). These are
155 131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the only Tcl API functions that MUST be called prior to being able to call
156 132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Tcl_InitStubs (i.e. because it requires a Tcl interpreter). For complete
157 133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** cleanup if the Tcl stubs initialization fails somehow, the Tcl_DeleteInterp
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** function type is also required.
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and Tcl_Finalize function types are also required.
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
160 136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef void (tcl_FindExecutableProc) (const char * argv0);
161 137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef Tcl_Interp *(tcl_CreateInterpProc) (void);
162 138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef void (tcl_DeleteInterpProc) (Tcl_Interp *interp);
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef void (tcl_FinalizeProc) (void);
163 140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
164 141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
165 142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The function types for the "hook" functions to be called before and after a
166 143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** TH1 command makes a call to evaluate a Tcl script. If the "pre" function
167 144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** returns anything but TH_OK, then evaluation of the Tcl script is skipped and
168 145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** that value is used as the return code. If the "post" function returns
169 146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** anything other than its rc argument, that will become the new return code
170 147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** for the command.
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
172 149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef int (tcl_NotifyProc) (
173 150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *pContext, /* The context for this notification. */
174 151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Th_Interp *interp, /* The TH1 interpreter being used. */
175 152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *ctx, /* The original TH1 command context. */
176 153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int argc, /* Number of arguments for the TH1 command. */
@@ -181,27 +158,27 @@
181 158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
182 159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
183 160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Are we using our own private implementation of the Tcl stubs mechanism? If
184 161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** this is enabled, it prevents the user from having to link against the Tcl
185 162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** stubs library for the target platform, which may not be readily available.
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
187 164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if defined(FOSSIL_ENABLE_TCL_PRIVATE_STUBS)
188 165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
189 166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** HACK: Using some preprocessor magic and a private static variable, redirect
190 167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the Tcl API calls [found within this file] to the function pointers
191 168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** that will be contained in our private Tcl stubs table. This takes
192 169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** advantage of the fact that the Tcl headers always define the Tcl API
193 170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** functions in terms of the "tclStubsPtr" variable.
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
195 172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define tclStubsPtr privateTclStubsPtr
196 173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static const TclStubs *tclStubsPtr = NULL;
197 174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
198 175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
199 176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Create a Tcl interpreter structure that mirrors just enough fields to get
200 177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** it up and running successfully with our private implementation of the Tcl
201 178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** stubs mechanism.
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
203 180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct PrivateTclInterp {
204 181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *result;
205 182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Tcl_FreeProc *freeProc;
206 183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int errorLine;
207 184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const struct TclStubs *stubTable;
@@ -209,11 +186,11 @@
209 186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
210 187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
211 188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Fossil can now be compiled without linking to the actual Tcl stubs library.
212 189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** In that case, this function will be used to perform those steps that would
213 190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** normally be performed within the Tcl stubs library.
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
215 192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int initTclStubs(
216 193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Th_Interp *interp,
217 194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Tcl_Interp *tclInterp
218 195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
219 196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tclStubsPtr = ((struct PrivateTclInterp *)tclInterp)->stubTable;
@@ -231,24 +208,56 @@
231 208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return TH_ERROR;
232 209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
233 210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return TH_OK;
234 211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
235 212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* defined(FOSSIL_ENABLE_TCL_PRIVATE_STUBS) */
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Is the loaded version of Tcl one where querying and/or calling the objProc
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** for a command does not work for some reason? The following special cases
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** are currently handled by this function:
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 1. All versions of Tcl 8.4 have a bug that causes a crash when calling into
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the Tcl_GetCommandFromObj function via stubs (i.e. the stubs table entry
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is NULL).
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 2. Various beta builds of Tcl 8.6, namely 1 and 2, have an NRE-specific bug
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in Tcl_EvalObjCmd (SF bug #3399564) that cause a panic when calling into
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the objProc directly.
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** For both of the above cases, the Tcl_EvalObjv function must be used instead
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of the more direct route of querying and calling the objProc directly.
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int canUseObjProc(){
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int major = -1, minor = -1, patchLevel = -1, type = -1;
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Tcl_GetVersion(&major, &minor, &patchLevel, &type);
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( major<0 || minor<0 || patchLevel<0 || type<0 ){
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0; /* NOTE: Invalid version info, assume bad. */
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( major==8 && minor==4 ){
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0; /* NOTE: Disabled on Tcl 8.4, missing public API. */
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( major==8 && minor==6 && type==TCL_BETA_RELEASE && patchLevel<3 ){
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0; /* NOTE: Disabled on Tcl 8.6b1/b2, SF bug #3399564. */
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1; /* NOTE: For all other cases, assume good. */
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
236 245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
237 246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
238 247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Creates and initializes a Tcl interpreter for use with the specified TH1
239 248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** interpreter. Stores the created Tcl interpreter in the Tcl context supplied
240 249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** by the caller. This must be declared here because quite a few functions in
241 250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** this file need to use it before it can be defined.
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
243 252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int createTclInterp(Th_Interp *interp, void *pContext);
244 253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
245 254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
246 255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Returns the Tcl interpreter result as a string with the associated length.
247 256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If the Tcl interpreter or the Tcl result are NULL, the length will be 0.
248 257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If the length pointer is NULL, the length will not be stored.
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
250 259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static char *getTclResult(
251 260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Tcl_Interp *pInterp,
252 261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int *pN
253 262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
254 263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Tcl_Obj *resultPtr;
@@ -274,11 +283,13 @@
274 283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char **argv; /* Full copy of the original arguments. */
275 284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *library; /* The Tcl library module handle. */
276 285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tcl_FindExecutableProc *xFindExecutable; /* Tcl_FindExecutable() pointer. */
277 286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tcl_CreateInterpProc *xCreateInterp; /* Tcl_CreateInterp() pointer. */
278 287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tcl_DeleteInterpProc *xDeleteInterp; /* Tcl_DeleteInterp() pointer. */
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tcl_FinalizeProc *xFinalize; /* Tcl_Finalize() pointer. */
279 289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Tcl_Interp *interp; /* The on-demand created Tcl interpreter. */
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int useObjProc; /* Non-zero if an objProc can be called directly. */
280 291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *setup; /* The optional Tcl setup script. */
281 292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tcl_NotifyProc *xPreEval; /* Optional, called before Tcl_Eval*(). */
282 293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *pPreContext; /* Optional, provided to xPreEval(). */
283 294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tcl_NotifyProc *xPostEval; /* Optional, called after Tcl_Eval*(). */
284 295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *pPostContext; /* Optional, provided to xPostEval(). */
@@ -443,20 +454,13 @@
443 454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int argc,
444 455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char **argv,
445 456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int *argl
446 457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
447 458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Tcl_Interp *tclInterp;
448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if !defined(USE_TCL_EVALOBJV) || !USE_TCL_EVALOBJV
449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Tcl_Command command;
450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Tcl_CmdInfo cmdInfo;
451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* !defined(USE_TCL_EVALOBJV) || !USE_TCL_EVALOBJV */
452 459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = TH_OK;
453 460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nResult;
454 461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zResult;
455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if !defined(USE_TCL_EVALOBJV) || !USE_TCL_EVALOBJV
456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Tcl_Obj *objPtr;
457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* !defined(USE_TCL_EVALOBJV) || !USE_TCL_EVALOBJV */
458 462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
USE_ARGV_TO_OBJV();
459 463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
460 464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( createTclInterp(interp, ctx)!=TH_OK ){
461 465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return TH_ERROR;
462 466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -472,35 +476,40 @@
472 476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=TH_OK ){
473 477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
474 478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
475 479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Tcl_Preserve((ClientData)tclInterp);
476 480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if !defined(USE_TCL_EVALOBJV) || !USE_TCL_EVALOBJV
477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- objPtr = Tcl_NewStringObj(argv[1], argl[1]);
478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Tcl_IncrRefCount(objPtr);
479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- command = Tcl_GetCommandFromObj(tclInterp, objPtr);
480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !command || Tcl_GetCommandInfoFromToken(command, &cmdInfo)==0 ){
481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Th_ErrorMessage(interp, "Tcl command not found:", argv[1], argl[1]);
482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Tcl_DecrRefCount(objPtr);
483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Tcl_Release((ClientData)tclInterp);
484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return TH_ERROR;
485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !cmdInfo.objProc ){
487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Th_ErrorMessage(interp, "cannot invoke Tcl command:", argv[1], argl[1]);
488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Tcl_DecrRefCount(objPtr);
489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Tcl_Release((ClientData)tclInterp);
490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return TH_ERROR;
491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Tcl_DecrRefCount(objPtr);
493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* !defined(USE_TCL_EVALOBJV) || !USE_TCL_EVALOBJV */
494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- COPY_ARGV_TO_OBJV();
495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if defined(USE_TCL_EVALOBJV) && USE_TCL_EVALOBJV
496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = Tcl_EvalObjv(tclInterp, objc, objv, 0);
497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #else
498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Tcl_ResetResult(tclInterp);
499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = cmdInfo.objProc(cmdInfo.objClientData, tclInterp, objc, objv);
500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* defined(USE_TCL_EVALOBJV) && USE_TCL_EVALOBJV */
501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- FREE_ARGV_TO_OBJV();
481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( GET_CTX_TCL_USEOBJPROC(ctx) ){
482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Tcl_Command command;
483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Tcl_CmdInfo cmdInfo;
484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Tcl_Obj *objPtr = Tcl_NewStringObj(argv[1], argl[1]);
485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Tcl_IncrRefCount(objPtr);
486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ command = Tcl_GetCommandFromObj(tclInterp, objPtr);
487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !command || Tcl_GetCommandInfoFromToken(command, &cmdInfo)==0 ){
488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Th_ErrorMessage(interp, "Tcl command not found:", argv[1], argl[1]);
489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Tcl_DecrRefCount(objPtr);
490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Tcl_Release((ClientData)tclInterp);
491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return TH_ERROR;
492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !cmdInfo.objProc ){
494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Th_ErrorMessage(interp, "cannot invoke Tcl command:", argv[1], argl[1]);
495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Tcl_DecrRefCount(objPtr);
496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Tcl_Release((ClientData)tclInterp);
497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return TH_ERROR;
498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Tcl_DecrRefCount(objPtr);
500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ COPY_ARGV_TO_OBJV();
501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Tcl_ResetResult(tclInterp);
502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = cmdInfo.objProc(cmdInfo.objClientData, tclInterp, objc, objv);
503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FREE_ARGV_TO_OBJV();
504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else
505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* !defined(USE_TCL_EVALOBJV) || !USE_TCL_EVALOBJV */
506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {
507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ COPY_ARGV_TO_OBJV();
508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = Tcl_EvalObjv(tclInterp, objc, objv, 0);
509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FREE_ARGV_TO_OBJV();
510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
502 511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zResult = getTclResult(tclInterp, &nResult);
503 512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Th_SetResult(interp, zResult, nResult);
504 513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Tcl_Release((ClientData)tclInterp);
505 514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = notifyPreOrPostEval(1, interp, ctx, argc, argv, argl, rc);
506 515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
@@ -586,11 +595,11 @@
586 595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
587 596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
588 597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
589 598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Called if the Tcl interpreter is deleted. Removes the Tcl integration
590 599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** commands from the TH1 interpreter.
591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
592 601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void Th1DeleteProc(
593 602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ClientData clientData,
594 603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Tcl_Interp *interp
595 604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
596 605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
@@ -607,23 +616,25 @@
607 616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** When Tcl stubs support is enabled, attempts to dynamically load the Tcl
608 617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** shared library and fetch the function pointers necessary to create an
609 618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** interpreter and initialize the stubs mechanism; otherwise, simply setup
610 619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the function pointers provided by the caller with the statically linked
611 620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** functions.
612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
613 622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int loadTcl(
614 623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Th_Interp *interp,
615 624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void **pLibrary,
616 625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tcl_FindExecutableProc **pxFindExecutable,
617 626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tcl_CreateInterpProc **pxCreateInterp,
618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- tcl_DeleteInterpProc **pxDeleteInterp
627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tcl_DeleteInterpProc **pxDeleteInterp,
628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tcl_FinalizeProc **pxFinalize
619 629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
620 630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if defined(USE_TCL_STUBS)
621 631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char fileName[] = TCL_LIBRARY_NAME;
622 632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* defined(USE_TCL_STUBS) */
623 633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !pLibrary || !pxFindExecutable || !pxCreateInterp || !pxDeleteInterp ){
634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !pLibrary || !pxFindExecutable || !pxCreateInterp ||
635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ !pxDeleteInterp || !pxFinalize ){
625 636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Th_ErrorMessage(interp,
626 637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"invalid Tcl loader argument(s)", (const char *)"", 0);
627 638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return TH_ERROR;
628 639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
629 640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if defined(USE_TCL_STUBS)
@@ -631,10 +642,11 @@
631 642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *library = dlopen(fileName, RTLD_NOW | RTLD_GLOBAL);
632 643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( library ){
633 644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tcl_FindExecutableProc *xFindExecutable;
634 645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tcl_CreateInterpProc *xCreateInterp;
635 646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tcl_DeleteInterpProc *xDeleteInterp;
647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tcl_FinalizeProc *xFinalize;
636 648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *procName = TCL_FINDEXECUTABLE_NAME;
637 649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
xFindExecutable = (tcl_FindExecutableProc *)dlsym(library, procName + 1);
638 650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !xFindExecutable ){
639 651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
xFindExecutable = (tcl_FindExecutableProc *)dlsym(library, procName);
640 652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -663,15 +675,27 @@
663 675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !xDeleteInterp ){
664 676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Th_ErrorMessage(interp,
665 677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"could not locate Tcl_DeleteInterp", (const char *)"", 0);
666 678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
dlclose(library);
667 679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return TH_ERROR;
680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ procName = TCL_FINALIZE_NAME;
682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ xFinalize = (tcl_FinalizeProc *)dlsym(library, procName + 1);
683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !xFinalize ){
684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ xFinalize = (tcl_FinalizeProc *)dlsym(library, procName);
685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !xFinalize ){
687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Th_ErrorMessage(interp,
688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "could not locate Tcl_Finalize", (const char *)"", 0);
689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dlclose(library);
690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return TH_ERROR;
668 691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
669 692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pLibrary = library;
670 693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pxFindExecutable = xFindExecutable;
671 694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pxCreateInterp = xCreateInterp;
672 695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pxDeleteInterp = xDeleteInterp;
696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pxFinalize = xFinalize;
673 697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return TH_OK;
674 698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
675 699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} while( --fileName[TCL_MINOR_OFFSET]>'3' ); /* Tcl 8.4+ */
676 700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fileName[TCL_MINOR_OFFSET] = 'x';
677 701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Th_ErrorMessage(interp,
@@ -681,18 +705,19 @@
681 705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
682 706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pLibrary = 0;
683 707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pxFindExecutable = Tcl_FindExecutable;
684 708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pxCreateInterp = Tcl_CreateInterp;
685 709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pxDeleteInterp = Tcl_DeleteInterp;
710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pxFinalize = Tcl_Finalize;
686 711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return TH_OK;
687 712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* defined(USE_TCL_STUBS) */
688 713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
689 714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
690 715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
691 716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Sets the "argv0", "argc", and "argv" script variables in the Tcl interpreter
692 717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** based on the supplied command line arguments.
693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
694 719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int setTclArguments(
695 720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Tcl_Interp *pInterp,
696 721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int argc,
697 722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char **argv
698 723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
@@ -746,11 +771,11 @@
746 771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
747 772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
748 773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Creates and initializes a Tcl interpreter for use with the specified TH1
749 774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** interpreter. Stores the created Tcl interpreter in the Tcl context supplied
750 775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** by the caller.
751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
752 777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int createTclInterp(
753 778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Th_Interp *interp,
754 779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *pContext
755 780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
756 781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct TclContext *tclContext = (struct TclContext *)pContext;
@@ -767,11 +792,12 @@
767 792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
768 793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if ( tclContext->interp ){
769 794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return TH_OK;
770 795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
771 796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( loadTcl(interp, &tclContext->library, &tclContext->xFindExecutable,
772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- &tclContext->xCreateInterp, &tclContext->xDeleteInterp)!=TH_OK ){
797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ &tclContext->xCreateInterp, &tclContext->xDeleteInterp,
798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ &tclContext->xFinalize)!=TH_OK ){
773 799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return TH_ERROR;
774 800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
775 801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
argc = tclContext->argc;
776 802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
argv = tclContext->argv;
777 803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( argc>0 && argv ){
@@ -821,10 +847,15 @@
821 847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"Tcl error setting arguments:", Tcl_GetStringResult(tclInterp), -1);
822 848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Tcl_DeleteInterp(tclInterp);
823 849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tclContext->interp = tclInterp = 0;
824 850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return TH_ERROR;
825 851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Determine if an objProc can be called directly for a Tcl command invoked
854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** via the tclInvoke TH1 command.
855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tclContext->useObjProc = canUseObjProc();
826 857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Add the TH1 integration commands to Tcl. */
827 858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Tcl_CallWhenDeleted(tclInterp, Th1DeleteProc, interp);
828 859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Tcl_CreateObjCommand(tclInterp, "th1Eval", Th1EvalObjCmd, interp, NULL);
829 860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Tcl_CreateObjCommand(tclInterp, "th1Expr", Th1ExprObjCmd, interp, NULL);
830 861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If necessary, evaluate the custom Tcl setup script. */
@@ -836,10 +867,68 @@
836 867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tclContext->interp = tclInterp = 0;
837 868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return TH_ERROR;
838 869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
839 870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return TH_OK;
840 871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Finalizes and unloads the previously loaded Tcl library, if applicable.
875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int unloadTcl(
877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Th_Interp *interp,
878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void *pContext
879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct TclContext *tclContext = (struct TclContext *)pContext;
881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Tcl_Interp *tclInterp;
882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tcl_FinalizeProc *xFinalize;
883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if defined(USE_TCL_STUBS)
884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void *library;
885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* defined(USE_TCL_STUBS) */
886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if ( !tclContext ){
888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Th_ErrorMessage(interp,
889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "invalid Tcl context", (const char *)"", 0);
890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return TH_ERROR;
891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Grab the Tcl_Finalize function pointer prior to deleting the Tcl
894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** interpreter because the memory backing the Tcl stubs table will
895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** be going away.
896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ xFinalize = tclContext->xFinalize;
898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the Tcl interpreter has been created, formally delete it now.
900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tclInterp = tclContext->interp;
902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if ( tclInterp ){
903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Tcl_DeleteInterp(tclInterp);
904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tclContext->interp = tclInterp = 0;
905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the Tcl library is not finalized prior to unloading it, a deadlock
908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** can occur in some circumstances (i.e. the [clock] thread is running).
909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( xFinalize ) xFinalize();
911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if defined(USE_TCL_STUBS)
912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If Tcl is compiled on Windows using the latest MinGW, Fossil can crash
914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** when exiting while a stubs-enabled Tcl is still loaded. This is due to
915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a bug in MinGW, see:
916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** http://comments.gmane.org/gmane.comp.gnu.mingw.user/41724
918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The workaround is to manually unload the loaded Tcl library prior to
920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** exiting the process.
921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ library = tclContext->library;
923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( library ){
924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dlclose(library);
925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tclContext->library = library = 0;
926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* defined(USE_TCL_STUBS) */
928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return TH_OK;
929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
841 930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
842 931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
843 932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Register the Tcl language commands with interpreter interp.
844 933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Usually this is called soon after interpreter creation.
845 934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
846 935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!