| ︙ | | | ︙ | |
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
case stmt.TOKEN_VAR_ARRAY_NAME:
case stmt.TOKEN_VAR:
result_var_ptr[0] = null;
obj_ptr = stmt.interp.variable_obj_type.getVariable(token.obj_ptr, stmt.FUNCTION_FLAGS_LEAVE_ERR_MSG, result_var_ptr);
result_var_ptr = result_var_ptr[0];
/* special case for ::itcl::type type variable !! */
if (obj_ptr == null && result_var_ptr != null && token.obj_ptr.getString() == "type") {
obj_ptr = stmt.interp.string_obj_type.newStringObj(result_var_ptr.namespace.full_name, -1);
obj_ptr.incrRefCount();
}
if (stmt.interp.frame_ptr.type == stmt.CALL_TYPE_MACROEXPAND) {
/* if we are expanding a macro and we find a not escaped variable not in the
* parameter/argument list, for the macro, we ignore that and return the variable
* as "$var_name" instead
*/
if (obj_ptr == null) {
obj_ptr = stmt.interp.string_obj_type.newStringObj("$"+token.obj_ptr.getString(), -1);
stmt.interp.setResult(stmt.interp.empty_string_obj);
} else {
/* if we are expanding a macro and the variable is a list put it into {} to be safe */
if (obj_ptr.obj_type = stmt.interp.list_obj_type) {
obj_ptr = stmt.interp.string_obj_type.newStringObj("{"+obj_ptr.getString()+"}", -1);
}
}
} else {
if (stmt.had_macro_cmd) {
obj_ptr = stmt.interp.string_obj_type.newStringObj("$"+token.obj_ptr.getString(), -1);
}
}
break;
case stmt.TOKEN_ARRAY_NAME_VAR:
obj_ptr = JimExpandDictSugar(stmt.interp, token.obj_ptr);
break;
case stmt.TOKEN_EXPRSUGAR:
obj_ptr = stmt.interp.expr_obj_type.expandExprSugar(token.obj_ptr);
break;
case stmt.TOKEN_BRACE:
if (!stmt.in_quotes) {
obj_ptr = token.obj_ptr;
} else {
if (token.obj_ptr.len == 0) {
/* we have a single pair of {} within quotes,
* so make a corresponding string object
*/
obj_ptr = stmt.interp.string_obj_type.newStringObj("{}", -1);
} else {
switch (stmt.interp.script_obj_type.substObj(token.obj_ptr, result_ptr, stmt.FUNCTION_FLAGS_LEAVE_ERR_MSG)) {
case stmt.OK:
obj_ptr = result_ptr[0];
/* special handling for expand in quotes !! */
if (obj_ptr.len == 1 && obj_ptr.bytes.substring(0,1) == "*") {
obj_ptr.len = 3;
|
|
|
|
|
|
|
|
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
case stmt.TOKEN_VAR_ARRAY_NAME:
case stmt.TOKEN_VAR:
result_var_ptr[0] = null;
obj_ptr = stmt.interp.variable_obj_type.getVariable(token.obj_ptr, stmt.FUNCTION_FLAGS_LEAVE_ERR_MSG, result_var_ptr);
result_var_ptr = result_var_ptr[0];
/* special case for ::itcl::type type variable !! */
if (obj_ptr == null && result_var_ptr != null && token.obj_ptr.getString() == "type") {
obj_ptr = stmt.interp.string_obj_type.newStringObj(result_var_ptr.namespace.full_name, -1, "EVAL_STATEMENT_1");
obj_ptr.incrRefCount("I_EVAL_STATEMENT_1");
}
if (stmt.interp.frame_ptr.type == stmt.CALL_TYPE_MACROEXPAND) {
/* if we are expanding a macro and we find a not escaped variable not in the
* parameter/argument list, for the macro, we ignore that and return the variable
* as "$var_name" instead
*/
if (obj_ptr == null) {
obj_ptr = stmt.interp.string_obj_type.newStringObj("$"+token.obj_ptr.getString(), -1, "EVAL_STATEMENT_2");
stmt.interp.setResult(stmt.interp.empty_string_obj);
} else {
/* if we are expanding a macro and the variable is a list put it into {} to be safe */
if (obj_ptr.obj_type = stmt.interp.list_obj_type) {
obj_ptr = stmt.interp.string_obj_type.newStringObj("{"+obj_ptr.getString()+"}", -1, "EVAL_STATEMENT_3");
}
}
} else {
if (stmt.had_macro_cmd) {
obj_ptr = stmt.interp.string_obj_type.newStringObj("$"+token.obj_ptr.getString(), -1, "EVAL_STATEMENT_4");
}
}
break;
case stmt.TOKEN_ARRAY_NAME_VAR:
obj_ptr = JimExpandDictSugar(stmt.interp, token.obj_ptr);
break;
case stmt.TOKEN_EXPRSUGAR:
obj_ptr = stmt.interp.expr_obj_type.expandExprSugar(token.obj_ptr);
break;
case stmt.TOKEN_BRACE:
if (!stmt.in_quotes) {
obj_ptr = token.obj_ptr;
} else {
if (token.obj_ptr.len == 0) {
/* we have a single pair of {} within quotes,
* so make a corresponding string object
*/
obj_ptr = stmt.interp.string_obj_type.newStringObj("{}", -1, "EVAL_STATEMENT_5");
} else {
switch (stmt.interp.script_obj_type.substObj(token.obj_ptr, result_ptr, stmt.FUNCTION_FLAGS_LEAVE_ERR_MSG)) {
case stmt.OK:
obj_ptr = result_ptr[0];
/* special handling for expand in quotes !! */
if (obj_ptr.len == 1 && obj_ptr.bytes.substring(0,1) == "*") {
obj_ptr.len = 3;
|
| ︙ | | | ︙ | |
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
|
retcode = stmt.substOneToken(script, idx + i, result_ptr);
intv2[j] = result_ptr[0];
if (stmt.eval_ipol_debug > 1) {
print("RES!"+result_ptr[0]+"!"+intv2+"!"+retcode+"!");
script.dumpToken(i+idx);
}
if (intv2[j] != null) {
intv2[j].incrRefCount();
}
switch(retcode) {
case stmt.OK:
case stmt.RETURN:
break;
case stmt.BREAK:
if (flags & stmt.SUBST_FLAG) {
|
|
|
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
|
retcode = stmt.substOneToken(script, idx + i, result_ptr);
intv2[j] = result_ptr[0];
if (stmt.eval_ipol_debug > 1) {
print("RES!"+result_ptr[0]+"!"+intv2+"!"+retcode+"!");
script.dumpToken(i+idx);
}
if (intv2[j] != null) {
intv2[j].incrRefCount("I_EVAL_STATEMENT_2");
}
switch(retcode) {
case stmt.OK:
case stmt.RETURN:
break;
case stmt.BREAK:
if (flags & stmt.SUBST_FLAG) {
|
| ︙ | | | ︙ | |
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
|
continue;
}
/* XXX: Ditto continue outside loop */
/* fall through to error */
default:
while (j--) {
if (intv2[j] != null) {
intv2[j].decrRefCount();
}
}
intv2 = null;
stmt.in_quotes = my_in_quotes;
return null;
}
total_len += intv2[j].toString().length;
j++;
}
/* Fast path return for a single token */
if (word_tokens == 1 && intv2[0]) {
intv2[0].decrRefCount();
stmt.in_quotes = my_in_quotes;
return intv2[0];
}
/* Concatenate every token in an unique
* object.
*/
obj_ptr = stmt.interp.string_obj_type.newStringObjNoAlloc(null, 0);
if (word_tokens == 4 && token.length > i + idx + 2 && token[i + idx + 0].token == stmt.TOKEN_ESC && token[i + idx + 1].token == stmt.TOKEN_ESC
&& token[i + idx + 2].token == stmt.TOKEN_VAR) {
/* May be able to do fast interpolated object -> array */
obj_ptr.obj_type = obj_ptr.interpolatedObjType;
obj_ptr.twoPtrValue.ptr1(token);
obj_ptr.twoPtrValue.ptr2(intv2[idx + 2]);
intv2[idx + 2].incrRefCount();
}
obj_ptr.bytes = "";
obj_ptr.length = total_len;
for (i = 0; i < j; i++) {
if (intv2[i]) {
obj_ptr.bytes += intv2[i].toString();
intv2[i].decrRefCount();
}
}
// obj_ptr.bytes[total_len] = '\0';
obj_ptr.len = total_len;
/* Free the intv2 vector. */
intv2 = null;
if (stmt.eval_ipol_debug > 1) {
|
|
|
|
|
|
|
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
|
continue;
}
/* XXX: Ditto continue outside loop */
/* fall through to error */
default:
while (j--) {
if (intv2[j] != null) {
intv2[j].decrRefCount("D_EVAL_STATEMENT_1");
}
}
intv2 = null;
stmt.in_quotes = my_in_quotes;
return null;
}
total_len += intv2[j].toString().length;
j++;
}
/* Fast path return for a single token */
if (word_tokens == 1 && intv2[0]) {
intv2[0].decrRefCount("D_EVAL_STATEMENT_2");
stmt.in_quotes = my_in_quotes;
return intv2[0];
}
/* Concatenate every token in an unique
* object.
*/
obj_ptr = stmt.interp.string_obj_type.newStringObjNoAlloc(null, 0, "EVAL_STATEMENT_6");
if (word_tokens == 4 && token.length > i + idx + 2 && token[i + idx + 0].token == stmt.TOKEN_ESC && token[i + idx + 1].token == stmt.TOKEN_ESC
&& token[i + idx + 2].token == stmt.TOKEN_VAR) {
/* May be able to do fast interpolated object -> array */
obj_ptr.obj_type = obj_ptr.interpolatedObjType;
obj_ptr.twoPtrValue.ptr1(token);
obj_ptr.twoPtrValue.ptr2(intv2[idx + 2]);
intv2[idx + 2].incrRefCount("I_EVAL_STATEMENT_3");
}
obj_ptr.bytes = "";
obj_ptr.length = total_len;
for (i = 0; i < j; i++) {
if (intv2[i]) {
obj_ptr.bytes += intv2[i].toString();
intv2[i].decrRefCount("D_EVAL_STATEMENT_3");
}
}
// obj_ptr.bytes[total_len] = '\0';
obj_ptr.len = total_len;
/* Free the intv2 vector. */
intv2 = null;
if (stmt.eval_ipol_debug > 1) {
|
| ︙ | | | ︙ | |
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
|
retcode = stmt.evalObjList(script_obj_ptr, stmt.interp.empty_obj, 1);
if (stmt.macro_cmd_level == stmt.eval_level) {
stmt.had_macro_cmd = false;
}
stmt.eval_level--;
return retcode;
}
script_obj_ptr.incrRefCount(); /* Make sure it's shared. */
script = script_obj_ptr.interp.script_obj_type.getScript(script_obj_ptr);
if (script == null) {
stmt.interp.setResultString("error in parsing script: \""+script_obj_ptr+"\"");
if (stmt.macro_cmd_level == stmt.eval_level) {
stmt.had_macro_cmd = false;
}
stmt.eval_level--;
return stmt.ERROR;
}
/* Reset the interpreter result. This is useful to
* return the empty result in the case of empty program. */
script_obj_ptr.interp.setEmptyResult();
/* Check for one of the following common scripts used by for, while
*
* {}
* incr a
*/
if (script.len == 0) {
script_obj_ptr.decrRefCount();
if (stmt.macro_cmd_level == stmt.eval_level) {
stmt.had_macro_cmd = false;
}
stmt.eval_level--;
return stmt.OK;
}
if (script.len == 3
&& script.script_object.tokens[1].obj_ptr.obj_type.type_name == "command"
&& script.script_object.tokens[1].obj_ptr.cmdValue.cmdPtr().is_proc == false
&& script.script_object.tokens[1].obj_ptr.cmdValue.cmdPtr().u.native_fcn.cmd_proc == script.interp.incrCoreCommand
&& script.script_object.tokens[2].obj_ptr.obj_typ.type_name == "variable") {
var obj_ptr = stmt.interp.getVariable(script.script_object.tokens[2].obj_ptr, stmt.TOKENNONE);
if (obj_ptr && !obj_ptr.isShared() && obj_ptrobj_type.name == "int") {
// JimWideValue(obj_ptr)++;
obj_ptr.invalidateStringRep();
script_obj_ptr.decrRefCount();
stmt.interp.setResult(obj_ptr);
if (stmt.macro_cmd_level == stmt.eval_level) {
stmt.had_macro_cmd = false;
}
stmt.eval_level--;
return stmt.OK;
}
|
|
|
|
|
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
|
retcode = stmt.evalObjList(script_obj_ptr, stmt.interp.empty_obj, 1);
if (stmt.macro_cmd_level == stmt.eval_level) {
stmt.had_macro_cmd = false;
}
stmt.eval_level--;
return retcode;
}
script_obj_ptr.incrRefCount("I_EVAL_STATEMENT_4"); /* Make sure it's shared. */
script = script_obj_ptr.interp.script_obj_type.getScript(script_obj_ptr);
if (script == null) {
stmt.interp.setResultString("error in parsing script: \""+script_obj_ptr+"\"");
if (stmt.macro_cmd_level == stmt.eval_level) {
stmt.had_macro_cmd = false;
}
stmt.eval_level--;
return stmt.ERROR;
}
/* Reset the interpreter result. This is useful to
* return the empty result in the case of empty program. */
script_obj_ptr.interp.setEmptyResult();
/* Check for one of the following common scripts used by for, while
*
* {}
* incr a
*/
if (script.len == 0) {
script_obj_ptr.decrRefCount("D_EVAL_STATEMENT_4");
if (stmt.macro_cmd_level == stmt.eval_level) {
stmt.had_macro_cmd = false;
}
stmt.eval_level--;
return stmt.OK;
}
if (script.len == 3
&& script.script_object.tokens[1].obj_ptr.obj_type.type_name == "command"
&& script.script_object.tokens[1].obj_ptr.cmdValue.cmdPtr().is_proc == false
&& script.script_object.tokens[1].obj_ptr.cmdValue.cmdPtr().u.native_fcn.cmd_proc == script.interp.incrCoreCommand
&& script.script_object.tokens[2].obj_ptr.obj_typ.type_name == "variable") {
var obj_ptr = stmt.interp.getVariable(script.script_object.tokens[2].obj_ptr, stmt.TOKENNONE);
if (obj_ptr && !obj_ptr.isShared() && obj_ptrobj_type.name == "int") {
// JimWideValue(obj_ptr)++;
obj_ptr.invalidateStringRep();
script_obj_ptr.decrRefCount("D_EVAL_STATEMENT_5");
stmt.interp.setResult(obj_ptr);
if (stmt.macro_cmd_level == stmt.eval_level) {
stmt.had_macro_cmd = false;
}
stmt.eval_level--;
return stmt.OK;
}
|
| ︙ | | | ︙ | |
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
|
case stmt.TOKEN_VAR:
var result_var_ptr = new Array();
result_var_ptr[0] = null;
word_obj_ptr = stmt.interp.variable_obj_type.getVariable(token[i].obj_ptr, stmt.FUNCTION_FLAGS_LEAVE_ERR_MSG, result_var_ptr);
result_var_ptr = result_var_ptr[0];
/* special case for ::itcl::type type variable !! */
if (word_obj_ptr == null && result_var_ptr != null && token[i].obj_ptr.getString() == "type") {
word_obj_ptr = stmt.interp.string_obj_type.newStringObj(result_var_ptr.namespace.full_name, -1);
word_obj_ptr.incrRefCount();
}
break;
case stmt.TOKEN_EXPRSUGAR:
word_obj_ptr = stmt.expandExprSugar(token[i].obj_ptr);
break;
case stmt.TOKEN_ARRAY_NAME_VAR:
word_obj_ptr = stmt.expandDictSugar(token[i].obj_ptr);
|
|
|
|
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
|
case stmt.TOKEN_VAR:
var result_var_ptr = new Array();
result_var_ptr[0] = null;
word_obj_ptr = stmt.interp.variable_obj_type.getVariable(token[i].obj_ptr, stmt.FUNCTION_FLAGS_LEAVE_ERR_MSG, result_var_ptr);
result_var_ptr = result_var_ptr[0];
/* special case for ::itcl::type type variable !! */
if (word_obj_ptr == null && result_var_ptr != null && token[i].obj_ptr.getString() == "type") {
word_obj_ptr = stmt.interp.string_obj_type.newStringObj(result_var_ptr.namespace.full_name, -1, "EVAL_STATEMENT_7");
word_obj_ptr.incrRefCount("I_EVAL_STATEMENT_5");
}
break;
case stmt.TOKEN_EXPRSUGAR:
word_obj_ptr = stmt.expandExprSugar(token[i].obj_ptr);
break;
case stmt.TOKEN_ARRAY_NAME_VAR:
word_obj_ptr = stmt.expandDictSugar(token[i].obj_ptr);
|
| ︙ | | | ︙ | |
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
|
if (!had_comment) {
if (!word_obj_ptr) {
if (retcode == stmt.OK) {
retcode = stmt.ERROR;
}
break;
}
word_obj_ptr.incrRefCount();
if (!expand) {
if (!had_comment) {
argv.push(word_obj_ptr);
}
} else {
/* Need to expand word_obj_ptr into multiple args from argv[j] ... */
var len = stmt.interp.list_obj_type.listLength(word_obj_ptr);
var newargc = argc + len - 1;
var k;
//print("EXPAND!"+argc+"!"+len+"!"+newargc+"!"+word_obj_ptr.toDebugString()+"!");
/* Now copy in the expanded version */
for (k = 0; k < len; k++) {
argv.push(word_obj_ptr.listValue.elem()[k]);
j++;
word_obj_ptr.listValue.elem()[k].incrRefCount();
}
/* The original object reference is no longer needed,
* after the expansion it is no longer present on
* the argument vector, but the single elements are
* in its place.
*/
word_obj_ptr.decrRefCount();
/* And update the indexes */
j--;
argc += len - 1;
}
}
}
if (had_comment) {
|
|
|
|
|
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
|
if (!had_comment) {
if (!word_obj_ptr) {
if (retcode == stmt.OK) {
retcode = stmt.ERROR;
}
break;
}
word_obj_ptr.incrRefCount("I_EVAL_STATEMENT_6");
if (!expand) {
if (!had_comment) {
argv.push(word_obj_ptr);
}
} else {
/* Need to expand word_obj_ptr into multiple args from argv[j] ... */
var len = stmt.interp.list_obj_type.listLength(word_obj_ptr);
var newargc = argc + len - 1;
var k;
//print("EXPAND!"+argc+"!"+len+"!"+newargc+"!"+word_obj_ptr.toDebugString()+"!");
/* Now copy in the expanded version */
for (k = 0; k < len; k++) {
argv.push(word_obj_ptr.listValue.elem()[k]);
j++;
word_obj_ptr.listValue.elem()[k].incrRefCount("I_EVAL_STATEMENT_7");
}
/* The original object reference is no longer needed,
* after the expansion it is no longer present on
* the argument vector, but the single elements are
* in its place.
*/
word_obj_ptr.decrRefCount("D_EVAL_STATEMENT_6");
/* And update the indexes */
j--;
argc += len - 1;
}
}
}
if (had_comment) {
|
| ︙ | | | ︙ | |
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
|
retcode = stmt.interp.unknownFcn(argc, argv, script.script_object.file_name_obj, line_no);
} else {
/* we do not call unknown, if we had only the empty string as command and no arguments */
}
}
}
// /* Finished with the command, so decrement ref counts of each argument */
j = argv.length - 1;
for (; j > 0; j--) {
argv[j].decrRefCount();
}
argv = new Array();
}
/* Possibly add to the error stack trace */
stmt.addErrorToStack(retcode, script.script_object.file_name_obj, line_no);
/* Note that we don't have to decrement ref_count, because the
* following code transfers our use of the reference again to
* the script object. */
script_obj_ptr.freeIntRep();
script_obj_ptr.obj_type = stmt.interp.script_obj_type;
script_obj_ptr.setIntRepPtr(script);
script_obj_ptr.decrRefCount();
//print("EVALOBJ end level!"+stmt.eval_level+"!"+retcode+"!");
if (stmt.macro_cmd_level == stmt.eval_level) {
stmt.had_macro_cmd = false;
}
stmt.eval_level--;
return retcode;
},
|
|
<
|
|
|
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
|
retcode = stmt.interp.unknownFcn(argc, argv, script.script_object.file_name_obj, line_no);
} else {
/* we do not call unknown, if we had only the empty string as command and no arguments */
}
}
}
// /* Finished with the command, so decrement ref counts of each argument */
for (j = 0; j < argv.length; j++) {
argv[j].decrRefCount("D_EVAL_STATEMENT_7");
}
argv = new Array();
}
/* Possibly add to the error stack trace */
stmt.addErrorToStack(retcode, script.script_object.file_name_obj, line_no);
/* Note that we don't have to decrement ref_count, because the
* following code transfers our use of the reference again to
* the script object. */
script_obj_ptr.freeIntRep();
script_obj_ptr.obj_type = stmt.interp.script_obj_type;
script_obj_ptr.setIntRepPtr(script);
script_obj_ptr.decrRefCount("D_EVAL_STATEMENT_8");
//print("EVALOBJ end level!"+stmt.eval_level+"!"+retcode+"!");
if (stmt.macro_cmd_level == stmt.eval_level) {
stmt.had_macro_cmd = false;
}
stmt.eval_level--;
return retcode;
},
|
| ︙ | | | ︙ | |
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
|
var stmt = this;
var i;
var retcode;
var cmd_ptr;
/* Incr refcount of arguments. */
for (i = 0; i < objc; i++) {
objv[i].incrRefCount();
}
/* Command lookup */
cmd_ptr = stmt.interp.getCommand(objv[0], stmt.interp.FUNCTION_FLAGS_LEAVE_ERR_MSG);
//print("EOV!"+cmd_ptr.toDebugString()+"!");
if (cmd_ptr == null) {
retcode = stmt.interp.unknown(objc, objv, file_name_obj, line_no);
} else {
|
|
|
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
|
var stmt = this;
var i;
var retcode;
var cmd_ptr;
/* Incr refcount of arguments. */
for (i = 0; i < objc; i++) {
objv[i].incrRefCount("I_EVAL_STATEMENT_8");
}
/* Command lookup */
cmd_ptr = stmt.interp.getCommand(objv[0], stmt.interp.FUNCTION_FLAGS_LEAVE_ERR_MSG);
//print("EOV!"+cmd_ptr.toDebugString()+"!");
if (cmd_ptr == null) {
retcode = stmt.interp.unknown(objc, objv, file_name_obj, line_no);
} else {
|
| ︙ | | | ︙ | |
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
|
stmt.interp.cmd_priv_data = cmd_ptr.u.native_fcn.priv_data;
retcode = cmd_ptr.u.native_fcn.cmd_proc(stmt.interp, objv);
}
cmd_ptr.decrCmdRefCount();
}
/* Decr refcount of arguments and return the retcode */
for (i = 0; i < objc; i++) {
objv[i].decrRefCount();
}
return retcode;
},
/* ==================== evalObjVector ===================================== */
evalObjVector: function(objc, objv) {
var stmt = this;
|
|
|
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
|
stmt.interp.cmd_priv_data = cmd_ptr.u.native_fcn.priv_data;
retcode = cmd_ptr.u.native_fcn.cmd_proc(stmt.interp, objv);
}
cmd_ptr.decrCmdRefCount();
}
/* Decr refcount of arguments and return the retcode */
for (i = 0; i < objc; i++) {
objv[i].decrRefCount("D_EVAL_STATEMENT_9");
}
return retcode;
},
/* ==================== evalObjVector ===================================== */
evalObjVector: function(objc, objv) {
var stmt = this;
|
| ︙ | | | ︙ | |
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
|
if (my_str.match(" ") != null) {
my_str += sep+"{"+args[i]+"}";
} else {
my_str += sep+args[i];
}
sep = " ";
}
my_ptr = stmt.interp.string_obj_type.newStringObj(my_str, -1);
my_ptr.incrRefCount();
ret_code = stmt.evalObj(my_ptr);
my_ptr.decrRefCount();
return ret_code;
},
/* ==================== evalObjList ===================================== */
/* If list_ptr is a list, call evalObjVector() with the given source info.
* Otherwise eval with evalObj()
*/
evalObjList: function (list_ptr, file_name_obj, linenr) {
var stmt = this;
var retcode = stmt.OK;
stmt.interp.panic(!list_ptr.isListObj(), "evalObjList() called without list arg");
if (list_ptr.listValue.len()) {
list_ptr.incrRefCount();
retcode = stmt.evalObjVector(list_ptr.listValue.len(), list_ptr.listValue.elem(), file_name_obj, linenr);
list_ptr.decrRefCount();
}
return retcode;
},
/* ==================== commandMatchObj ===================================== */
/* Returns 1 if match, 0 if no match or -<error> on error (e.g. -stmt.ERROR, -stmt.BREAK)*/
commandMatchObj: function(command_obj, pattern_obj, string_obj, nocase) {
var stmt = this;
var parms = new Array();
var argc = 0;
var eq = new Array();
var rc;
parms[argc++] = command_obj;
if (nocase) {
parms[argc++] = stmt.interp.string_obj_type.newStringObj("-nocase", -1);
}
parms[argc++] = pattern_obj;
parms[argc++] = string_obj;
rc = stmt.evalObjVector(argc, parms);
if (rc != stmt.OK || stmt.interp.int_obj_type.getLong(stmt.interp.getResult(), eq) != stmt.OK) {
eq[0] = -rc;
}
return eq[0];
},
/* ==================== addErrorToStack ===================================== */
addErrorToStack: function(retcode, file_name_obj, line) {
var stmt = this;
var rc = retcode;
if (rc == stmt.ERROR && !stmt.interp.error_flag) {
/* This is the first error, so save the file/line information and reset the stack */
stmt.interp.error_flag = 1;
file_name_obj.incrRefCount();
stmt.interp.error_file_name_obj.decrRefCount();
stmt.interp.error_file_name_obj = file_name_obj;
stmt.interp.error_line = line;
stmt.resetStackTrace();
/* Always add a level where the error first occurs */
stmt.interp.add_stack_trace++;
}
|
|
|
|
|
|
|
|
|
|
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
|
if (my_str.match(" ") != null) {
my_str += sep+"{"+args[i]+"}";
} else {
my_str += sep+args[i];
}
sep = " ";
}
my_ptr = stmt.interp.string_obj_type.newStringObj(my_str, -1, "EVAL_STATEMENT_8");
my_ptr.incrRefCount("I_EVAL_STATEMENT_9");
ret_code = stmt.evalObj(my_ptr);
my_ptr.decrRefCount("D_EVAL_STATEMENT_10");
return ret_code;
},
/* ==================== evalObjList ===================================== */
/* If list_ptr is a list, call evalObjVector() with the given source info.
* Otherwise eval with evalObj()
*/
evalObjList: function (list_ptr, file_name_obj, linenr) {
var stmt = this;
var retcode = stmt.OK;
stmt.interp.panic(!list_ptr.isListObj(), "evalObjList() called without list arg");
if (list_ptr.listValue.len()) {
list_ptr.incrRefCount("I_EVAL_STATEMENT_10");
retcode = stmt.evalObjVector(list_ptr.listValue.len(), list_ptr.listValue.elem(), file_name_obj, linenr);
list_ptr.decrRefCount("D_EVAL_STATEMENT_11");
}
return retcode;
},
/* ==================== commandMatchObj ===================================== */
/* Returns 1 if match, 0 if no match or -<error> on error (e.g. -stmt.ERROR, -stmt.BREAK)*/
commandMatchObj: function(command_obj, pattern_obj, string_obj, nocase) {
var stmt = this;
var parms = new Array();
var argc = 0;
var eq = new Array();
var rc;
parms[argc++] = command_obj;
if (nocase) {
parms[argc++] = stmt.interp.string_obj_type.newStringObj("-nocase", -1, "EVAL_STATEMENT_9");
}
parms[argc++] = pattern_obj;
parms[argc++] = string_obj;
rc = stmt.evalObjVector(argc, parms);
if (rc != stmt.OK || stmt.interp.int_obj_type.getLong(stmt.interp.getResult(), eq) != stmt.OK) {
eq[0] = -rc;
}
return eq[0];
},
/* ==================== addErrorToStack ===================================== */
addErrorToStack: function(retcode, file_name_obj, line) {
var stmt = this;
var rc = retcode;
if (rc == stmt.ERROR && !stmt.interp.error_flag) {
/* This is the first error, so save the file/line information and reset the stack */
stmt.interp.error_flag = 1;
file_name_obj.incrRefCount("I_EVAL_STATEMENT_11");
stmt.interp.error_file_name_obj.decrRefCount("D_EVAL_STATEMENT_12");
stmt.interp.error_file_name_obj = file_name_obj;
stmt.interp.error_line = line;
stmt.resetStackTrace();
/* Always add a level where the error first occurs */
stmt.interp.add_stack_trace++;
}
|
| ︙ | | | ︙ | |
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
|
* don't clear the addStackTrace flag
* so we can pick it up at the next level
*/
if (file_name_obj.getStringLength()) {
stmt.interp.add_stack_trace = 0;
}
stmt.interp.error_proc.decrRefCount();
file_name_obj.interp.error_proc = stmt.interp.empty_obj;
stmt.interp.error_proc.incrRefCount();
} else {
if (rc == stmt.RETURN && stmt.interp.return_code == stmt.ERROR) {
/* Propagate the addStackTrace value through 'return -code error' */
} else {
stmt.interp.add_stack_trace = 0;
}
}
},
/* ==================== resetStackTrace ===================================== */
resetStackTrace: function() {
var stmt = this;
stmt.interp.stack_trace.decrRefCount();
stmt.interp.stack_trace = stmt.interp.list_obj_type.newListObj(null, 0);
stmt.interp.stack_trace.incrRefCount();
},
/* ==================== setStackTrace ===================================== */
setStackTrace: function(stack_trace_obj) {
var stmt = this;
var len;
/* Increment reference first in case these are the same object */
stack_trace_obj.incrRefCount();
stmt.interp.stack_trace.decrRefCount();
stmt.interp.stack_trace = stack_trace_obj;
stmt.interp_error_flag = 1;
/* This is a bit ugly.
* If the filename of the last entry of the stack trace is empty,
* the next stack level should be added.
*/
|
|
|
|
|
|
|
|
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
|
* don't clear the addStackTrace flag
* so we can pick it up at the next level
*/
if (file_name_obj.getStringLength()) {
stmt.interp.add_stack_trace = 0;
}
stmt.interp.error_proc.decrRefCount("D_EVAL_STATEMENT_13");
file_name_obj.interp.error_proc = stmt.interp.empty_obj;
stmt.interp.error_proc.incrRefCount("I_EVAL_STATEMENT_12");
} else {
if (rc == stmt.RETURN && stmt.interp.return_code == stmt.ERROR) {
/* Propagate the addStackTrace value through 'return -code error' */
} else {
stmt.interp.add_stack_trace = 0;
}
}
},
/* ==================== resetStackTrace ===================================== */
resetStackTrace: function() {
var stmt = this;
stmt.interp.stack_trace.decrRefCount("D_EVAL_STATEMENT_14");
stmt.interp.stack_trace = stmt.interp.list_obj_type.newListObj(null, 0);
stmt.interp.stack_trace.incrRefCount("I_EVAL_STATEMENT_13");
},
/* ==================== setStackTrace ===================================== */
setStackTrace: function(stack_trace_obj) {
var stmt = this;
var len;
/* Increment reference first in case these are the same object */
stack_trace_obj.incrRefCount("I_EVAL_STATEMENT_14");
stmt.interp.stack_trace.decrRefCount("D_EVAL_STATEMENT_15");
stmt.interp.stack_trace = stack_trace_obj;
stmt.interp_error_flag = 1;
/* This is a bit ugly.
* If the filename of the last entry of the stack trace is empty,
* the next stack level should be added.
*/
|
| ︙ | | | ︙ | |
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
|
}
if (!procname && !file_name_obj.getStringLength()) {
/* No useful info here */
return;
}
if (stmt.interp.stack_trace.isShared()) {
stmt.interp.stack_trace.decrRefCount();
stmt.interp.stack_trace = file_name_obj.duplicateObj(stmt.interp.stack_trace);
stmt.interp.stack_trace.incrRefCount();
}
/* If we have no procname but the previous element did, merge with that frame */
if (!procname && file_name_obj.getStringLength()) {
/* Just a filename. Check the previous entry */
var len = stmt.interp.list_obj_type.listLength(stmt.interp.stack_trace);
if (len >= 3) {
var obj_ptr;
if (stmt.interp.list_obj_type.listIndex(stmt.interp.stack_trace, len - 3, obj_ptr, stmt.FUNCTION_FLAGS_NONE) == stmt.OK && obj_ptr.getStringLength()) {
/* Yes, the previous level had procname */
if (stmt.interp.list_obj_type.listIndex(stmt.interp.stack_trace, len - 2, objPtr, stmt.FUNCTION_FLAGS_NONE) == stmt.OK && !obj_ptr.getStringLength()) {
/* But no filename, so merge the new info with that frame */
stmt.interp.list_obj_type.listSetIndex(stmt.interp.stack_trace, len - 2, file_name_obj, 0);
stmt.interp.list_obj_type.listSetIndex(stmt.interp.stack_trace, len - 1, stmt.interp.int_obj_type.newIntObj(linenr), 0);
return;
}
}
}
}
stmt.interp.list_obj_type.listAppendElement(stmt.interp.stack_trace, stmt.interp.string_obj_type.newStringObj(procname, -1));
stmt.interp.list_obj_type.listAppendElement(stmt.interp.stack_trace, file_name_obj);
stmt.interp.list_obj_type.listAppendElement(stmt.interp.stack_trace, stmt.interp.int_obj_type.newIntObj(linenr));
},
});
EvalStatement.prototype.constructor = EvalStatement;
R.EvalStatement = EvalStatement;
}, "0.0.1", {});
|
|
|
|
|
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
|
}
if (!procname && !file_name_obj.getStringLength()) {
/* No useful info here */
return;
}
if (stmt.interp.stack_trace.isShared()) {
stmt.interp.stack_trace.decrRefCount("D_EVAL_STATEMENT_16");
stmt.interp.stack_trace = file_name_obj.duplicateObj(stmt.interp.stack_trace);
stmt.interp.stack_trace.incrRefCount("I_EVAL_STATEMENT_15");
}
/* If we have no procname but the previous element did, merge with that frame */
if (!procname && file_name_obj.getStringLength()) {
/* Just a filename. Check the previous entry */
var len = stmt.interp.list_obj_type.listLength(stmt.interp.stack_trace);
if (len >= 3) {
var obj_ptr;
if (stmt.interp.list_obj_type.listIndex(stmt.interp.stack_trace, len - 3, obj_ptr, stmt.FUNCTION_FLAGS_NONE) == stmt.OK && obj_ptr.getStringLength()) {
/* Yes, the previous level had procname */
if (stmt.interp.list_obj_type.listIndex(stmt.interp.stack_trace, len - 2, objPtr, stmt.FUNCTION_FLAGS_NONE) == stmt.OK && !obj_ptr.getStringLength()) {
/* But no filename, so merge the new info with that frame */
stmt.interp.list_obj_type.listSetIndex(stmt.interp.stack_trace, len - 2, file_name_obj, 0);
stmt.interp.list_obj_type.listSetIndex(stmt.interp.stack_trace, len - 1, stmt.interp.int_obj_type.newIntObj(linenr), 0);
return;
}
}
}
}
stmt.interp.list_obj_type.listAppendElement(stmt.interp.stack_trace, stmt.interp.string_obj_type.newStringObj(procname, -1, "EVAL_STATEMENT_10"));
stmt.interp.list_obj_type.listAppendElement(stmt.interp.stack_trace, file_name_obj);
stmt.interp.list_obj_type.listAppendElement(stmt.interp.stack_trace, stmt.interp.int_obj_type.newIntObj(linenr));
},
});
EvalStatement.prototype.constructor = EvalStatement;
R.EvalStatement = EvalStatement;
}, "0.0.1", {});
|