diff options
author | Steve Bennett <steveb@workware.net.au> | 2009-07-29 07:23:58 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2010-10-15 10:11:03 +1000 |
commit | 83dcd361c1a44264abd46de8f88d146dbaa4d0ab (patch) | |
tree | 2cd4016e6c82204a505368f2bd0a0acfae7caf55 | |
parent | a318fbc2f1c2c5c3ad23f0f61e9d3b205f1580d3 (diff) | |
download | jimtcl-83dcd361c1a44264abd46de8f88d146dbaa4d0ab.zip jimtcl-83dcd361c1a44264abd46de8f88d146dbaa4d0ab.tar.gz jimtcl-83dcd361c1a44264abd46de8f88d146dbaa4d0ab.tar.bz2 |
Fix some runtime errors
Need to duplicate a possibly shared object when loading a package fails
Need to initialise signal-related fields in the jim interp
Return an error from 'lsort -command' on failure
-rw-r--r-- | jim-package.c | 11 | ||||
-rw-r--r-- | jim.c | 19 |
2 files changed, 23 insertions, 7 deletions
diff --git a/jim-package.c b/jim-package.c index 26e8316..d963b4d 100644 --- a/jim-package.c +++ b/jim-package.c @@ -35,9 +35,11 @@ static char *JimFindPackage(Jim_Interp *interp, char **prefixes, if (prefixes[i] == NULL) continue; snprintf(buf, sizeof(buf), "%s/%s.tcl", prefixes[i], pkgName); + if (access(buf, R_OK) == 0) { return Jim_StrDup(buf); } + snprintf(buf, sizeof(buf), "%s/%s.so", prefixes[i], pkgName); if (access(buf, R_OK) == 0) { return Jim_StrDup(buf); @@ -125,9 +127,14 @@ const char *Jim_PackageRequire(Jim_Interp *interp, const char *name, int flags) /* No way... return an error. */ if (flags & JIM_ERRMSG) { int len; - Jim_GetString(Jim_GetResult(interp), &len); - Jim_AppendStrings(interp, Jim_GetResult(interp), len ? "\n" : "", + Jim_Obj *resultObj = Jim_GetResult(interp); + if (Jim_IsShared(resultObj)) { + resultObj = Jim_DuplicateObj(interp, resultObj); + } + Jim_GetString(resultObj, &len); + Jim_AppendStrings(interp, resultObj, len ? "\n" : "", "Can't find package '", name, "'", NULL); + Jim_SetResult(interp, resultObj); } return NULL; } else { @@ -4379,6 +4379,10 @@ Jim_Interp *Jim_CreateInterp(void) i->freeFramesList = NULL; i->prngState = NULL; i->evalRetcodeLevel = -1; + i->id = 0; + i->signal = 0; + i->signal_level = 0; + i->signal_to_name = NULL; /* Note that we can create objects only after the * interpreter liveList and freeList pointers are @@ -5239,7 +5243,7 @@ static int ListSortCommand(Jim_Obj **lhsObj, Jim_Obj **rhsObj) sort_result = Jim_EvalObj(sort_interp, compare_script); if (sort_result != JIM_OK) { - fprintf(stderr, "Failed to eval '%s'\n", Jim_GetString(compare_script, NULL)); + //fprintf(stderr, "Failed to eval '%s'\n", Jim_GetString(compare_script, NULL)); /* We have an error, so just compare pointers */ return (long)lhsObj - (long)rhsObj; } @@ -5249,7 +5253,7 @@ static int ListSortCommand(Jim_Obj **lhsObj, Jim_Obj **rhsObj) } /* Sort a list *in place*. MUST be called with non-shared objects. */ -static void ListSortElements(Jim_Interp *interp, Jim_Obj *listObjPtr, int type, int order, Jim_Obj *command) +static int ListSortElements(Jim_Interp *interp, Jim_Obj *listObjPtr, int type, int order, Jim_Obj *command) { typedef int (qsort_comparator)(const void *, const void *); int (*fn)(Jim_Obj**, Jim_Obj**); @@ -5281,6 +5285,8 @@ static void ListSortElements(Jim_Interp *interp, Jim_Obj *listObjPtr, int type, } qsort(vector, len, sizeof(Jim_Obj *), (qsort_comparator *)fn); Jim_InvalidateStringRep(listObjPtr); + + return sort_result; } /* This is the low-level function to append an element to a list. @@ -9937,6 +9943,7 @@ static int Jim_LsortCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const arg int i, lsortType = JIM_LSORT_ASCII; /* default sort type */ int lsort_order = 1; Jim_Obj *lsort_command = NULL; + int retCode; if (argc < 2) { Jim_WrongNumArgs(interp, 1, argv, "?options? list"); @@ -9958,9 +9965,11 @@ static int Jim_LsortCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const arg } } resObj = Jim_DuplicateObj(interp, argv[argc-1]); - ListSortElements(interp, resObj, lsortType, lsort_order, lsort_command); - Jim_SetResult(interp, resObj); - return JIM_OK; + retCode = ListSortElements(interp, resObj, lsortType, lsort_order, lsort_command); + if (retCode == JIM_OK) { + Jim_SetResult(interp, resObj); + } + return retCode; } /* [append] */ |