MEM_VEC_FUNCTIONS(qc_program, prog_builtin, builtins)
+MEM_VEC_FUNCTIONS(qc_program, const char*, function_stack)
+
static void loaderror(const char *fmt, ...)
{
int err = errno;
len = printf("$");
else
len = printf("%s ", name);
- vtype = def->type;
+ vtype = def->type & DEF_TYPEMASK;
}
else
len = printf("[@%u] ", glob);
printf("<illegal instruction %d>\n", st->opcode);
return;
}
+ if ((prog->xflags & VMXF_TRACE) && prog->function_stack_count) {
+ size_t i;
+ for (i = 0; i < prog->function_stack_count; ++i)
+ printf("->");
+ printf("%s:", prog->function_stack[prog->function_stack_count-1]);
+ }
printf(" <> %-12s", asm_instr[st->opcode].m);
if (st->opcode >= INSTR_IF &&
st->opcode <= INSTR_IFNOT)
else if (st->opcode >= INSTR_CALL0 &&
st->opcode <= INSTR_CALL8)
{
+ trace_print_global(prog, st->o1.u1, TYPE_FUNCTION);
printf("\n");
}
else if (st->opcode == INSTR_GOTO)
st.stmt = prog->statement;
st.function = func;
+ if (prog->xflags & VMXF_TRACE) {
+ (void)!qc_program_function_stack_add(prog, prog_getstring(prog, func->name));
+ }
+
#ifdef QCVM_BACKUP_STRATEGY_CALLER_VARS
if (prog->stack_count)
{
qc_exec_stack st = prog->stack[prog->stack_count-1];
+ if (prog->xflags & VMXF_TRACE) {
+ if (prog->function_stack_count)
+ prog->function_stack_count--;
+ }
+
#ifdef QCVM_BACKUP_STRATEGY_CALLER_VARS
if (prog->stack_count > 1) {
prev = prog->stack[prog->stack_count-2].function;
}
ed = prog_getedict(prog, OPA->edict);
- OPC->_int = ((qcint*)ed) - prog->entitydata;
- OPC->_int += OPB->_int;
+ OPC->_int = ((qcint*)ed) - prog->entitydata + OPB->_int;
break;
case INSTR_STORE_F:
if(!OPA->function || OPA->function >= (unsigned int)prog->functions_count)
{
- qcvmerror(prog, "CALL outside the program in `%s`", prog->filename);
+ qcvmerror(prog, "CALL outside the program in `%s` (%i)", prog->filename, (int)OPA->function);
goto cleanup;
}