mprAssert(ep);
mprAssert(script);
- if ((ep->input = mprMalloc(sizeof(EjsInput))) == NULL) {
+ if ((ip = mprMalloc(sizeof(EjsInput))) == NULL) {
return -1;
}
- ip = ep->input;
memset(ip, 0, sizeof(*ip));
+ ip->next = ep->input;
+ ep->input = ip;
+ ip->procName = ep->proc?ep->proc->procName:NULL;
/*
* Create the parse token buffer and script buffer
ip = ep->input;
mprAssert(ip);
+ ep->input = ip->next;
for (i = 0; i < EJS_TOKEN_STACK; i++) {
mprFree(ip->putBack[i].token);
int ejsEvalScript(EjsId eid, char *script, MprVar *vp, char **emsg)
{
Ejs *ep;
- EjsInput *oldBlock;
int state;
void *endlessLoopTest;
int loopCounter;
/*
* Allocate a new evaluation block, and save the old one
*/
- oldBlock = ep->input;
ejsLexOpenScript(ep, script);
/*
*emsg = mprStrdup(ep->error);
}
- /*
- * Restore the old evaluation block
- */
- ep->input = oldBlock;
-
if (state == EJS_STATE_ERR) {
return -1;
}
{
EjsInput *ip;
char *errbuf, *msgbuf;
+ int frame = 0;
mprAssert(ep);
msgbuf = NULL;
mprAllocVsprintf(&msgbuf, MPR_MAX_STRING, fmt, args);
- if (ep) {
- ip = ep->input;
- if (ip) {
- mprAllocSprintf(&errbuf, MPR_MAX_STRING,
- "%s\nError on line %d. Offending line: %s\n\n",
- msgbuf, ip->lineNumber, ip->line);
- } else {
- mprAllocSprintf(&errbuf, MPR_MAX_STRING, "%s\n", msgbuf);
- }
- mprFree(ep->error);
- ep->error = errbuf;
+ ip = ep->input;
+ mprAllocSprintf(&errbuf, MPR_MAX_STRING, "%s\nBacktrace:\n", msgbuf);
+
+ /* form a backtrace */
+ while (ip) {
+ char *msg2, *ebuf2;
+ mprAllocSprintf(&msg2, MPR_MAX_STRING,
+ "\t[%2d] %20s:%-4d -> %s\n",
+ frame++, ip->procName?ip->procName:"", ip->lineNumber, ip->line);
+ ebuf2 = mprRealloc(errbuf, strlen(errbuf) + strlen(msg2) + 1);
+ if (ebuf2 == NULL) break;
+ errbuf = ebuf2;
+ memcpy(errbuf+strlen(errbuf), msg2, strlen(msg2)+1);
+ mprFree(msg2);
+ ip = ip->next;
}
+ mprFree(ep->error);
+ ep->error = errbuf;
mprFree(msgbuf);
}