aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog19
-rw-r--r--ecos/language/tcl/jim/current/src/jim.c26
-rw-r--r--jim.c26
3 files changed, 44 insertions, 27 deletions
diff --git a/ChangeLog b/ChangeLog
index 60af8b7..d1d4870 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,13 +1,22 @@
+2008-11-04 Steve Bennett <steveb@workware.net.au>
+
+ * jim.c: fix problems with "puts [list ${a}]". Resulted in syntax
+ error.
+ * jim.c: :: scoping for set
+ * jim.c: Creating a C command when a Tcl command of the same name
+ already exists can cause a crash.
+
+
2008-11-03 Steve Bennett <steveb@workware.net.au>
- * Allow env with no arguments to retrieve all environment variables
+ * jim.c: Allow env with no arguments to retrieve all environment variables
as a list of name value ...
- * Add format support for %o -- octal
- * Allow direct access to variables in the global scope by
+ * jim.c: Add format support for %o -- octal
+ * jim.c: Allow direct access to variables in the global scope by
prefixing with ::
- * For compatibility with older versions of Tcl, allow == and != to
+ * jim.c: For compatibility with older versions of Tcl, allow == and != to
compare strings if the arguments can't be interpreted as numbers
- * Ensure that the string representation exists before doing
+ * jim.c: Ensure that the string representation exists before doing
string toupper or tolower
2008-08-31 Duane Ellis
diff --git a/ecos/language/tcl/jim/current/src/jim.c b/ecos/language/tcl/jim/current/src/jim.c
index df4dc91..3425561 100644
--- a/ecos/language/tcl/jim/current/src/jim.c
+++ b/ecos/language/tcl/jim/current/src/jim.c
@@ -1323,18 +1323,15 @@ int JimParseVar(struct JimParserCtx *pc)
if (brace) {
while (!stop) {
if (*pc->p == '}' || pc->len == 0) {
+ pc->tend = pc->p-1;
stop = 1;
if (pc->len == 0)
- continue;
+ break;
}
else if (*pc->p == '\n')
pc->linenr++;
pc->p++; pc->len--;
}
- if (pc->len == 0)
- pc->tend = pc->p-1;
- else
- pc->tend = pc->p-2;
} else {
/* Include leading colons */
while (*pc->p == ':') {
@@ -3175,9 +3172,6 @@ int Jim_CreateCommand(Jim_Interp *interp, const char *cmdName,
he = Jim_FindHashEntry(&interp->commands, cmdName);
if (he == NULL) { /* New command to create */
cmdPtr = Jim_Alloc(sizeof(*cmdPtr));
- cmdPtr->cmdProc = cmdProc;
- cmdPtr->privData = privData;
- cmdPtr->delProc = delProc;
Jim_AddHashEntry(&interp->commands, cmdName, cmdPtr);
} else {
Jim_InterpIncrProcEpoch(interp);
@@ -3195,9 +3189,13 @@ int Jim_CreateCommand(Jim_Interp *interp, const char *cmdName,
/* If it was a C coded command, call the delProc if any */
cmdPtr->delProc(interp, cmdPtr->privData);
}
- cmdPtr->cmdProc = cmdProc;
- cmdPtr->privData = privData;
}
+
+ /* Store the new details for this proc */
+ cmdPtr->delProc = delProc;
+ cmdPtr->cmdProc = cmdProc;
+ cmdPtr->privData = privData;
+
/* There is no need to increment the 'proc epoch' because
* creation of a new procedure can never affect existing
* cached commands. We don't do negative caching. */
@@ -3531,7 +3529,13 @@ int Jim_SetVariable(Jim_Interp *interp, Jim_Obj *nameObjPtr, Jim_Obj *valObjPtr)
Jim_IncrRefCount(valObjPtr);
var->linkFramePtr = NULL;
/* Insert the new variable */
- Jim_AddHashEntry(&interp->framePtr->vars, name, var);
+ if (name[0] == ':' && name[1] == ':') {
+ /* Into to the top evel frame */
+ Jim_AddHashEntry(&interp->topFramePtr->vars, name + 2, var);
+ }
+ else {
+ Jim_AddHashEntry(&interp->framePtr->vars, name, var);
+ }
/* Make the object int rep a variable */
Jim_FreeIntRep(interp, nameObjPtr);
nameObjPtr->typePtr = &variableObjType;
diff --git a/jim.c b/jim.c
index 9360bd9..47b686c 100644
--- a/jim.c
+++ b/jim.c
@@ -1323,18 +1323,15 @@ int JimParseVar(struct JimParserCtx *pc)
if (brace) {
while (!stop) {
if (*pc->p == '}' || pc->len == 0) {
+ pc->tend = pc->p-1;
stop = 1;
if (pc->len == 0)
- continue;
+ break;
}
else if (*pc->p == '\n')
pc->linenr++;
pc->p++; pc->len--;
}
- if (pc->len == 0)
- pc->tend = pc->p-1;
- else
- pc->tend = pc->p-2;
} else {
/* Include leading colons */
while (*pc->p == ':') {
@@ -3175,9 +3172,6 @@ int Jim_CreateCommand(Jim_Interp *interp, const char *cmdName,
he = Jim_FindHashEntry(&interp->commands, cmdName);
if (he == NULL) { /* New command to create */
cmdPtr = Jim_Alloc(sizeof(*cmdPtr));
- cmdPtr->cmdProc = cmdProc;
- cmdPtr->privData = privData;
- cmdPtr->delProc = delProc;
Jim_AddHashEntry(&interp->commands, cmdName, cmdPtr);
} else {
Jim_InterpIncrProcEpoch(interp);
@@ -3195,9 +3189,13 @@ int Jim_CreateCommand(Jim_Interp *interp, const char *cmdName,
/* If it was a C coded command, call the delProc if any */
cmdPtr->delProc(interp, cmdPtr->privData);
}
- cmdPtr->cmdProc = cmdProc;
- cmdPtr->privData = privData;
}
+
+ /* Store the new details for this proc */
+ cmdPtr->delProc = delProc;
+ cmdPtr->cmdProc = cmdProc;
+ cmdPtr->privData = privData;
+
/* There is no need to increment the 'proc epoch' because
* creation of a new procedure can never affect existing
* cached commands. We don't do negative caching. */
@@ -3531,7 +3529,13 @@ int Jim_SetVariable(Jim_Interp *interp, Jim_Obj *nameObjPtr, Jim_Obj *valObjPtr)
Jim_IncrRefCount(valObjPtr);
var->linkFramePtr = NULL;
/* Insert the new variable */
- Jim_AddHashEntry(&interp->framePtr->vars, name, var);
+ if (name[0] == ':' && name[1] == ':') {
+ /* Into to the top evel frame */
+ Jim_AddHashEntry(&interp->topFramePtr->vars, name + 2, var);
+ }
+ else {
+ Jim_AddHashEntry(&interp->framePtr->vars, name, var);
+ }
/* Make the object int rep a variable */
Jim_FreeIntRep(interp, nameObjPtr);
nameObjPtr->typePtr = &variableObjType;