Differences From Artifact [b03f23c9258f53b7]:
- File
jim.c
-
2011-07-27 04:20:43
- part of checkin
[bc40c93bd2]
on branch trunk
- Return codes > 7 should be caught by default
Fix a recent change which meant that return codes between 8 and 64 were no longer caught by default.
Signed-off-by: Steve Bennett <steveb@workware.net.au> (user: steveb@workware.net.au
-
2011-07-27 04:20:43
- part of checkin
[bc40c93bd2]
on branch trunk
- Return codes > 7 should be caught by default
To Artifact [4d403caa655fcf64]:
- File
jim.c
-
2011-07-28 22:19:52
- part of checkin
[4eebba3983]
on branch trunk
- 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> (user: steveb@workware.net.au
-
2011-07-28 22:19:52
- part of checkin
[4eebba3983]
on branch trunk
- Track source locations in expressions
7831 7831 #define JIM_EXPR_OPERATORS_NUM \
7832 7832 (sizeof(Jim_ExprOperators)/sizeof(struct Jim_ExprOperator))
7833 7833
7834 7834 static int JimParseExpression(struct JimParserCtx *pc)
7835 7835 {
7836 7836 /* Discard spaces and quoted newline */
7837 7837 while (isspace(UCHAR(*pc->p)) || (*(pc->p) == '\\' && *(pc->p + 1) == '\n')) {
7838 + if (*pc->p == '\n') {
7839 + pc->linenr++;
7840 + }
7838 7841 pc->p++;
7839 7842 pc->len--;
7840 7843 }
7841 7844
7842 7845 if (pc->len == 0) {
7843 7846 pc->tstart = pc->tend = pc->p;
7844 7847 pc->tline = pc->linenr;
................................................................................
8378 8381 JimWideValue(expr->token[prev_left_index-1].objPtr) += (i - prev_right_index);
8379 8382
8380 8383 /* Adjust for i-- in the loop */
8381 8384 i++;
8382 8385 }
8383 8386 }
8384 8387
8385 -static ExprByteCode *ExprCreateByteCode(Jim_Interp *interp, const ParseTokenList *tokenlist)
8388 +static ExprByteCode *ExprCreateByteCode(Jim_Interp *interp, const ParseTokenList *tokenlist, const char *filename)
8386 8389 {
8387 8390 Jim_Stack stack;
8388 8391 ExprByteCode *expr;
8389 8392 int ok = 1;
8390 8393 int i;
8391 8394 int prevtt = JIM_TT_NONE;
8392 8395 int have_ternary = 0;
................................................................................
8432 8435 case JIM_TT_ESC:
8433 8436 case JIM_TT_VAR:
8434 8437 case JIM_TT_DICTSUGAR:
8435 8438 case JIM_TT_EXPRSUGAR:
8436 8439 case JIM_TT_CMD:
8437 8440 token->objPtr = Jim_NewStringObj(interp, t->token, t->len);
8438 8441 token->type = t->type;
8442 + if (t->type == JIM_TT_CMD) {
8443 + /* Only commands need source info */
8444 + JimSetSourceInfo(interp, token->objPtr, filename, t->line);
8445 + }
8439 8446 expr->len++;
8440 8447 break;
8441 8448
8442 8449 case JIM_TT_EXPR_INT:
8443 8450 token->objPtr = Jim_NewIntObj(interp, strtoull(t->token, NULL, 0));
8444 8451 token->type = t->type;
8445 8452 expr->len++;
................................................................................
8553 8560
8554 8561 return expr;
8555 8562 }
8556 8563
8557 8564
8558 8565 /* This method takes the string representation of an expression
8559 8566 * and generates a program for the Expr's stack-based VM. */
8560 -int SetExprFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
8567 +static int SetExprFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
8561 8568 {
8562 8569 int exprTextLen;
8563 8570 const char *exprText;
8564 8571 struct JimParserCtx parser;
8565 8572 struct ExprByteCode *expr;
8566 8573 ParseTokenList tokenlist;
8574 + int line;
8575 + const char *filename;
8567 8576 int rc = JIM_ERR;
8568 - int line = 1;
8569 8577
8570 8578 /* Try to get information about filename / line number */
8571 8579 if (objPtr->typePtr == &sourceObjType) {
8572 8580 line = objPtr->internalRep.sourceValue.lineNumber;
8581 + filename = objPtr->internalRep.sourceValue.fileName;
8582 + }
8583 + else {
8584 + line = 1;
8585 + filename = NULL;
8573 8586 }
8574 8587
8575 8588 exprText = Jim_GetString(objPtr, &exprTextLen);
8576 8589
8577 8590 /* Initially tokenise the expression into tokenlist */
8578 8591 ScriptTokenListInit(&tokenlist);
8579 8592
................................................................................
8599 8612 printf("[%2d]@%d %s '%.*s'\n", i, tokenlist.list[i].line, jim_tt_name(tokenlist.list[i].type),
8600 8613 tokenlist.list[i].len, tokenlist.list[i].token);
8601 8614 }
8602 8615 }
8603 8616 #endif
8604 8617
8605 8618 /* Now create the expression bytecode from the tokenlist */
8606 - expr = ExprCreateByteCode(interp, &tokenlist);
8619 + expr = ExprCreateByteCode(interp, &tokenlist, filename);
8607 8620
8608 8621 /* No longer need the token list */
8609 8622 ScriptTokenListFree(&tokenlist);
8610 8623
8611 8624 if (!expr) {
8612 8625 goto err;
8613 8626 }