diff options
author | Steve Bennett <steveb@workware.net.au> | 2011-06-27 21:27:59 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2011-07-29 08:19:52 +1000 |
commit | 1b39c8ae42982012cea6795befbe2cc8bafaa2da (patch) | |
tree | 4e15ddcd8e3afbc86cd16e134eb771380ec596a0 | |
parent | 0d9e1adc2f892773a780b950d1518ae65be5d934 (diff) | |
download | jimtcl-1b39c8ae42982012cea6795befbe2cc8bafaa2da.zip jimtcl-1b39c8ae42982012cea6795befbe2cc8bafaa2da.tar.gz jimtcl-1b39c8ae42982012cea6795befbe2cc8bafaa2da.tar.bz2 |
Track source locations in expressions
Commands in expressions should continue
to track source location for the benefit of error messages
and the debugger.
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r-- | jim.c | 21 |
1 files changed, 17 insertions, 4 deletions
@@ -7835,6 +7835,9 @@ static int JimParseExpression(struct JimParserCtx *pc) { /* Discard spaces and quoted newline */ while (isspace(UCHAR(*pc->p)) || (*(pc->p) == '\\' && *(pc->p + 1) == '\n')) { + if (*pc->p == '\n') { + pc->linenr++; + } pc->p++; pc->len--; } @@ -8382,7 +8385,7 @@ static void ExprTernaryReorderExpression(Jim_Interp *interp, ExprByteCode *expr) } } -static ExprByteCode *ExprCreateByteCode(Jim_Interp *interp, const ParseTokenList *tokenlist) +static ExprByteCode *ExprCreateByteCode(Jim_Interp *interp, const ParseTokenList *tokenlist, const char *filename) { Jim_Stack stack; ExprByteCode *expr; @@ -8436,6 +8439,10 @@ static ExprByteCode *ExprCreateByteCode(Jim_Interp *interp, const ParseTokenList case JIM_TT_CMD: token->objPtr = Jim_NewStringObj(interp, t->token, t->len); token->type = t->type; + if (t->type == JIM_TT_CMD) { + /* Only commands need source info */ + JimSetSourceInfo(interp, token->objPtr, filename, t->line); + } expr->len++; break; @@ -8557,19 +8564,25 @@ static ExprByteCode *ExprCreateByteCode(Jim_Interp *interp, const ParseTokenList /* This method takes the string representation of an expression * and generates a program for the Expr's stack-based VM. */ -int SetExprFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr) +static int SetExprFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr) { int exprTextLen; const char *exprText; struct JimParserCtx parser; struct ExprByteCode *expr; ParseTokenList tokenlist; + int line; + const char *filename; int rc = JIM_ERR; - int line = 1; /* Try to get information about filename / line number */ if (objPtr->typePtr == &sourceObjType) { line = objPtr->internalRep.sourceValue.lineNumber; + filename = objPtr->internalRep.sourceValue.fileName; + } + else { + line = 1; + filename = NULL; } exprText = Jim_GetString(objPtr, &exprTextLen); @@ -8603,7 +8616,7 @@ int SetExprFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr) #endif /* Now create the expression bytecode from the tokenlist */ - expr = ExprCreateByteCode(interp, &tokenlist); + expr = ExprCreateByteCode(interp, &tokenlist, filename); /* No longer need the token list */ ScriptTokenListFree(&tokenlist); |