aboutsummaryrefslogtreecommitdiff
path: root/jim.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2010-01-24 10:53:36 +1000
committerSteve Bennett <steveb@workware.net.au>2010-10-15 11:02:39 +1000
commit6ef810ae664dccd457fe1ed750f7d509b6f60878 (patch)
tree13f3ab69416d1fc7f5d10db06c1bf83aa0153e4f /jim.c
parenta0017cc44c22a83df8f92600317ad8ccd635e2a1 (diff)
downloadjimtcl-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.c40
1 files changed, 26 insertions, 14 deletions
diff --git a/jim.c b/jim.c
index 9841bfc..1d68fa9 100644
--- a/jim.c
+++ b/jim.c
@@ -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;
}