diff options
-rw-r--r-- | jim-aio.c | 8 | ||||
-rw-r--r-- | jim-sdl.c | 2 | ||||
-rw-r--r-- | jim-sqlite3.c | 4 | ||||
-rw-r--r-- | jim.c | 21 | ||||
-rw-r--r-- | jim.h | 5 | ||||
-rw-r--r-- | tests/jim.test | 11 |
6 files changed, 43 insertions, 8 deletions
@@ -667,8 +667,7 @@ static int aio_cmd_eof(Jim_Interp *interp, int argc, Jim_Obj *const *argv) static int aio_cmd_close(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { - Jim_DeleteCommand(interp, Jim_String(argv[0])); - return JIM_OK; + return Jim_DeleteCommand(interp, Jim_String(argv[0])); } static int aio_cmd_seek(Jim_Interp *interp, int argc, Jim_Obj *const *argv) @@ -1098,7 +1097,10 @@ static int JimMakeChannel(Jim_Interp *interp, FILE *fh, int fd, Jim_Obj *filenam snprintf(buf, sizeof(buf), hdlfmt, Jim_GetId(interp)); Jim_CreateCommand(interp, buf, JimAioSubCmdProc, af, JimAioDelProc); - Jim_SetResultString(interp, buf, -1); + /* Note that the command must use the global namespace, even if + * the current namespace is something different + */ + Jim_SetResult(interp, Jim_MakeGlobalNamespaceName(interp, Jim_NewStringObj(interp, buf, -1))); return JIM_OK; } @@ -228,7 +228,7 @@ static int JimSdlSurfaceCommand(Jim_Interp *interp, int argc, Jim_Obj *const *ar jss->screen = screen; sprintf(buf, "sdl.surface%ld", screenId); Jim_CreateCommand(interp, buf, JimSdlHandlerCommand, jss, JimSdlDelProc); - Jim_SetResultString(interp, buf, -1); + Jim_SetResult(interp, Jim_MakeGlobalNamespaceName(interp, Jim_NewStringObj(interp, buf, -1))); return JIM_OK; } diff --git a/jim-sqlite3.c b/jim-sqlite3.c index 62d8fa9..25efb26 100644 --- a/jim-sqlite3.c +++ b/jim-sqlite3.c @@ -286,7 +286,9 @@ static int JimSqliteOpenCommand(Jim_Interp *interp, int argc, Jim_Obj *const *ar sh->db = db; snprintf(buf, sizeof(buf), "sqlite.handle%ld", Jim_GetId(interp)); Jim_CreateCommand(interp, buf, JimSqliteHandlerCommand, sh, JimSqliteDelProc); - Jim_SetResultString(interp, buf, -1); + + Jim_SetResult(interp, Jim_MakeGlobalNamespaceName(interp, Jim_NewStringObj(interp, buf, -1))); + return JIM_OK; } @@ -3775,6 +3775,22 @@ static Jim_Obj *JimQualifyNameObj(Jim_Interp *interp, Jim_Obj *nsObj) return nsObj; } +Jim_Obj *Jim_MakeGlobalNamespaceName(Jim_Interp *interp, Jim_Obj *nameObjPtr) +{ + Jim_Obj *resultObj; + + const char *name = Jim_String(nameObjPtr); + if (name[0] == ':' && name[1] == ':') { + return nameObjPtr; + } + Jim_IncrRefCount(nameObjPtr); + resultObj = Jim_NewStringObj(interp, "::", -1); + Jim_AppendObj(interp, resultObj, nameObjPtr); + Jim_DecrRefCount(interp, nameObjPtr); + + return resultObj; +} + /** * An efficient version of JimQualifyNameObj() where the name is * available (and needed) as a 'const char *'. @@ -3807,6 +3823,11 @@ static const char *JimQualifyName(Jim_Interp *interp, const char *name, Jim_Obj /* We can be more efficient in the no-namespace case */ #define JimQualifyName(INTERP, NAME, DUMMY) (((NAME)[0] == ':' && (NAME)[1] == ':') ? (NAME) + 2 : (NAME)) #define JimFreeQualifiedName(INTERP, DUMMY) (void)(DUMMY) + +Jim_Obj *Jim_MakeGlobalNamespaceName(Jim_Interp *interp, Jim_Obj *nameObjPtr) +{ + return nameObjPtr; +} #endif static int JimCreateCommand(Jim_Interp *interp, const char *name, Jim_Cmd *cmd) @@ -760,9 +760,8 @@ JIM_EXPORT int Jim_SetVariableStrWithStr (Jim_Interp *interp, JIM_EXPORT int Jim_SetVariableLink (Jim_Interp *interp, Jim_Obj *nameObjPtr, Jim_Obj *targetNameObjPtr, Jim_CallFrame *targetCallFrame); -JIM_EXPORT int Jim_CreateNamespaceVariable(Jim_Interp *interp, - Jim_Obj *varNameObj, Jim_Obj *targetNameObj); -JIM_EXPORT int Jim_DiscardNamespaceVars(Jim_Interp *interp); +JIM_EXPORT Jim_Obj * Jim_MakeGlobalNamespaceName(Jim_Interp *interp, + Jim_Obj *nameObjPtr); JIM_EXPORT Jim_Obj * Jim_GetVariable (Jim_Interp *interp, Jim_Obj *nameObjPtr, int flags); JIM_EXPORT Jim_Obj * Jim_GetGlobalVariable (Jim_Interp *interp, diff --git a/tests/jim.test b/tests/jim.test index e8c125e..c1ab8e7 100644 --- a/tests/jim.test +++ b/tests/jim.test @@ -3486,5 +3486,16 @@ test regression-1.1 {lrange bug with negative indexes of type int} { lrange {a b c} 0 [- 0 1] } {} +test regression-1.2 {open/close from non-global namespace} { + proc a::b {} { + set f [open $::argv0] + $f close + return $f + } + set f [a::b] + rename a::b "" + expr {$f in [info channels]} +} {0} + testreport |