From 9c3d14ec05762aa0eecbbf074a1fabf40a0ce242 Mon Sep 17 00:00:00 2001 From: oharboe Date: Tue, 4 Nov 2008 07:55:14 +0000 Subject: 2008-11-04 Steve Bennett * 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. --- ChangeLog | 19 ++++++++++++++----- ecos/language/tcl/jim/current/src/jim.c | 26 +++++++++++++++----------- jim.c | 26 +++++++++++++++----------- 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 + + * 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 - * 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; -- cgit v1.1