diff options
author | Steve Bennett <steveb@workware.net.au> | 2010-01-24 10:53:36 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2010-10-15 11:02:39 +1000 |
commit | 6ef810ae664dccd457fe1ed750f7d509b6f60878 (patch) | |
tree | 13f3ab69416d1fc7f5d10db06c1bf83aa0153e4f /jim.c | |
parent | a0017cc44c22a83df8f92600317ad8ccd635e2a1 (diff) | |
download | jimtcl-6ef810ae664dccd457fe1ed750f7d509b6f60878.zip jimtcl-6ef810ae664dccd457fe1ed750f7d509b6f60878.tar.gz jimtcl-6ef810ae664dccd457fe1ed750f7d509b6f60878.tar.bz2 |
Bugs, features and tests
source fails with zero length file
unknown can't be called recursively
*: This can be useful when using unknown to dynamically load code,
which may in turn want to dynamically load code
*: Limit it to 50 recursions though
Allow string greater/less comparison
*: Comparing two strings for order did not work
Implement file join
*: It's not to hard and is handy when working with the current dir, ""
Don't omit [unknown] completely from stack trace
*: Since we lose valuable informtion, just omit the name
Fix return from case
Turn regexp patterns into real objects
*: Thus caching the compiled regexps
Allow error to rethrow an error
Replace bcopy() with more standard memcpy()
Fixes to parray, improve errorInfo
*: errorInfo takes an optional stack trace
Add tests for rethrowing errors via errorInfo
Fix ndelay
*: Was looking at wrong param
*: Also fix usage/help for aio.socket
Package should be able to call exit
*: Currently any return from a package is changed to JIM_ERR
Line counting is incorrect for backlash newline
Diffstat (limited to 'jim.c')
-rw-r--r-- | jim.c | 40 |
1 files changed, 26 insertions, 14 deletions
@@ -1300,6 +1300,8 @@ int JimParseCmd(struct JimParserCtx *pc) if (!level) break; } else if (*pc->p == '\\') { pc->p++; pc->len--; + if (*pc->p == '\n') + pc->linenr++; } else if (*pc->p == '{') { blevel++; } else if (*pc->p == '}') { @@ -1439,6 +1441,9 @@ int JimParseStr(struct JimParserCtx *pc) return JIM_OK; } if (pc->len >= 2) { + if (*(pc->p+1) == '\n') { + pc->linenr++; + } pc->p++; pc->len--; } break; @@ -4657,9 +4662,9 @@ static void JimResetStackTrace(Jim_Interp *interp) static void JimAppendStackTrace(Jim_Interp *interp, const char *procname, const char *filename, int linenr) { - /* No need to add this dummy entry to the stack trace */ + /* XXX Omit "unknown" for now since it can be confusing (but it may help too!) */ if (strcmp(procname, "unknown") == 0) { - return; + procname = ""; } if (!*procname && !*filename) { /* No useful info here */ @@ -7946,10 +7951,10 @@ static int JimUnknown(Jim_Interp *interp, int argc, Jim_Obj *const *argv) Jim_Obj **v, *sv[JIM_EVAL_SARGV_LEN]; int retCode; - /* If JimUnknown() is recursively called (e.g. error in the unknown proc, + /* If JimUnknown() is recursively called too many times... * done here */ - if (interp->unknown_called) { + if (interp->unknown_called > 50) { return JIM_ERR; } @@ -8141,15 +8146,13 @@ void Jim_ExpandArgument(Jim_Interp *interp, Jim_Obj ***argv, static int JimAddErrorToStack(Jim_Interp *interp, int retcode, const char *filename, int line) { if (retcode == JIM_ERR || retcode == JIM_ERR_ADDSTACK) { - /*fprintf(stderr, "JimAddErrorToStack(retcode=%d, procname=%s, filename=%s, line=%d, errorFlag=%d\n", - retcode, Jim_GetString(interp->errorProc, NULL), filename, line, interp->errorFlag); - */ if (!interp->errorFlag) { /* This is the first error, so save the file/line information and reset the stack */ interp->errorFlag = 1; JimSetErrorFileName(interp, filename); JimSetErrorLineNumber(interp, line); + JimResetStackTrace(interp); /* Always add a stack frame at this level */ @@ -8157,14 +8160,10 @@ static int JimAddErrorToStack(Jim_Interp *interp, int retcode, const char *filen } if (retcode == JIM_ERR_ADDSTACK) { - //fprintf(stderr, " JimAddErrorToStack()\n"); /* Add the stack info for the current level */ JimAppendStackTrace(interp, Jim_GetString(interp->errorProc, NULL), filename, line); retcode = JIM_ERR; } - else { - //fprintf(stderr, " JimAddErrorToStack() ignoring error info\n"); - } Jim_DecrRefCount(interp, interp->errorProc); interp->errorProc = interp->emptyObj; @@ -8598,6 +8597,10 @@ int Jim_EvalFile(Jim_Interp *interp, const char *filename) " err: ", strerror(errno), NULL); return JIM_ERR_ADDSTACK; } + if (sb.st_size == 0) { + fclose(fp); + return JIM_OK; + } buf = Jim_Alloc(sb.st_size + 1); if (buf == 0 || fread(buf, sb.st_size, 1, fp) != 1) { @@ -11541,7 +11544,8 @@ static int Jim_ScanCoreCommand(Jim_Interp *interp, int argc, int len = 0; if (listPtr != 0 && listPtr != (Jim_Obj*)EOF) Jim_ListLength(interp, listPtr, &len); - if (listPtr == (Jim_Obj*)EOF || len == 0) { // XXX + if (listPtr == (Jim_Obj*)EOF || len == 0) { + /* XXX */ Jim_SetResult(interp, Jim_NewIntObj(interp, -1)); return JIM_OK; } @@ -11572,11 +11576,19 @@ err: static int Jim_ErrorCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { - if (argc != 2) { - Jim_WrongNumArgs(interp, 1, argv, "message"); + if (argc != 2 && argc != 3) { + Jim_WrongNumArgs(interp, 1, argv, "message ?stacktrace?"); return JIM_ERR; } Jim_SetResult(interp, argv[1]); + if (argc == 3) { + /* Increment reference first in case these are the same object */ + Jim_IncrRefCount(argv[2]); + Jim_DecrRefCount(interp, interp->stackTrace); + interp->stackTrace = argv[2]; + interp->errorFlag = 1; + return JIM_ERR; + } return JIM_ERR_ADDSTACK; } |