Jim Tcl
Diff
Not logged in

Differences From Artifact [b03f23c9258f53b7]:

To Artifact [4d403caa655fcf64]:


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 }