aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2009-07-29 07:23:58 +1000
committerSteve Bennett <steveb@workware.net.au>2010-10-15 10:11:03 +1000
commit83dcd361c1a44264abd46de8f88d146dbaa4d0ab (patch)
tree2cd4016e6c82204a505368f2bd0a0acfae7caf55
parenta318fbc2f1c2c5c3ad23f0f61e9d3b205f1580d3 (diff)
downloadjimtcl-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.c11
-rw-r--r--jim.c19
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 {
diff --git a/jim.c b/jim.c
index 68f414a..2b63f69 100644
--- a/jim.c
+++ b/jim.c
@@ -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] */