1 Subject: modifications to the InterpretDebug patch
5 source/interpret.c | 117 ++++++++++++++++++++++++++++++++++-------------------
6 source/interpret.h | 5 +-
7 source/parse.y | 14 ++----
8 source/userCmds.c | 4 -
9 4 files changed, 86 insertions(+), 54 deletions(-)
11 diff --quilt old/source/interpret.c new/source/interpret.c
12 --- old/source/interpret.c
13 +++ new/source/interpret.c
14 @@ -114,21 +114,21 @@ static const char *tagToStr(enum typeTag
15 #define DEBUG_DISASSEMBLER
16 static const char *printd(const char *f, ...);
17 static int outPrintd();
18 -static void disasm(Inst *inst, int nInstr);
19 +static void disasm(const char *name, Inst *inst, int nInstr);
20 static void disasmInternal(Inst *inst, int nInstr);
21 #endif /* #if defined(DEBUG_ASSEMBLY) || defined(DEBUG_STACK) */
23 #ifdef DEBUG_ASSEMBLY /* for disassembly */
24 -#define DISASM(i, n) disasm(i, n)
25 +#define DISASM(name, i, n) disasm(name, i, n)
26 #else /* #ifndef DEBUG_ASSEMBLY */
28 +#define DISASM(name, i, n)
29 #endif /* #ifndef DEBUG_ASSEMBLY */
31 #ifdef DEBUG_STACK /* for run-time instruction and stack trace */
32 static void stackdump(int n, int extra);
33 static void stackdumpInternal(int n, int extra);
34 #define STACKDUMP(n, x) stackdump(n, x)
35 -#define DISASM_RT(i, n) disasm(i, n)
36 +#define DISASM_RT(i, n) disasm(NULL, i, n)
37 #else /* #ifndef DEBUG_STACK */
38 #define STACKDUMP(n, x)
39 #define DISASM_RT(i, n)
40 @@ -161,6 +161,8 @@ static Inst *ProgP; /* next free spot
41 static Inst *LoopStack[LOOP_STACK_SIZE]; /* addresses of break, cont stmts */
42 static Inst **LoopStackPtr = LoopStack; /* to fill at the end of a loop */
44 +static const char *ProgramName = "";
46 /* Global data for the interpreter */
47 static DataValue *TheStack; /* the stack */
48 static DataValue *StackP; /* next free spot on stack */
49 @@ -253,7 +255,7 @@ void InitMacroGlobals(void)
50 ** Start collecting instructions for a program. Clears the program
51 ** and the symbol table.
53 -void BeginCreatingProgram(AccumulatorData *acc)
54 +void BeginCreatingProgram(const char *name, AccumulatorData *acc)
57 acc->localSymList = LocalSymList;
58 @@ -261,10 +263,12 @@ void BeginCreatingProgram(AccumulatorDat
60 memcpy(acc->loopStack, LoopStack, sizeof(Inst) * LOOP_STACK_SIZE);
61 acc->loopStackPtr = LoopStackPtr;
62 + acc->name = ProgramName;
66 LoopStackPtr = LoopStack;
71 @@ -278,12 +282,12 @@ Program *FinishCreatingProgram(Accumulat
72 int progLen, fpOffset = 0;
75 - newProg = (Program *)XtMalloc(sizeof(Program));
76 + newProg = (Program *)XtMalloc(sizeof(Program) + strlen(ProgramName));
77 progLen = ((char *)ProgP) - ((char *)Prog);
78 newProg->code = (Inst *)XtMalloc(progLen);
79 memcpy(newProg->code, Prog, progLen);
80 newProg->localSymList = LocalSymList;
81 - newProg->name = NULL;
82 + strcpy(newProg->name, ProgramName);
83 newProg->refcount = 1;
85 /* Local variables' values are stored on the stack. Here we assign
86 @@ -291,7 +295,7 @@ Program *FinishCreatingProgram(Accumulat
87 for (s = newProg->localSymList; s != NULL; s = s->next)
88 s->value.val.n = fpOffset++;
90 - DISASM(newProg->code, ProgP - Prog);
91 + DISASM(newProg->name, newProg->code, ProgP - Prog);
94 LocalSymList = acc->localSymList;
95 @@ -299,6 +303,7 @@ Program *FinishCreatingProgram(Accumulat
97 memcpy(LoopStack, acc->loopStack, sizeof(Inst) * LOOP_STACK_SIZE);
98 LoopStackPtr = acc->loopStackPtr;
99 + ProgramName = acc->name;
103 @@ -308,7 +313,6 @@ void FreeProgram(Program *prog)
104 if (--prog->refcount == 0) {
105 freeSymbolTable(prog->localSymList);
106 XtFree((char *)prog->code);
107 - XtFree((char *)prog->name);
108 XtFree((char *)prog);
111 @@ -3074,7 +3078,7 @@ static void arrayDisposeNode(rbTreeNode
113 SparseArrayEntry *ArrayNew(void)
115 - return((SparseArrayEntry *)rbTreeNew(arrayEmptyAllocator));
116 + return((SparseArrayEntry *)rbTreeNew(arrayEmptyAllocator));
120 @@ -3772,28 +3776,46 @@ static void dumpVal(DataValue dv)
124 - printd("i=%d", dv.val.n);
125 + printd("<integer> %d", dv.val.n);
133 char *src = dv.val.str.rep;
135 - printd("s=<NULL>");
136 + printd("<string> <NULL>");
139 - for (k = 0; src[k] && k < sizeof s - 1; k++) {
140 - s[k] = isprint(src[k]) ? src[k] : '?';
141 + for (k = 0, l = 0; src[k] && l < sizeof s - 1; k++, l++) {
143 + const char to[] = "\\\"ntbrfave";
144 +#ifdef EBCDIC_CHARSET
145 + const char from[] = "\\\"\n\t\b\r\f\a\v\x27"; /* EBCDIC escape */
147 + const char from[] = "\\\"\n\t\b\r\f\a\v\x1B"; /* ASCII escape */
149 + if ((e = strchr(from, src[k]))) {
150 + if (l < sizeof s - 2) {
152 + s[l] = to[e - from];
155 + else if (isprint(src[k])) {
163 - printd("s=\"%s\"%s[%d]", s,
165 + printd("<string> \"%s\"%s[%d]", s,
166 src[k] ? "..." : "", strlen(src));
171 - printd("%08p <array>[%d]", dv.val.arrayPtr, ArraySize(&dv));
172 + printd("<array> %8p[%d]", dv.val.arrayPtr, ArraySize(&dv));
176 @@ -3819,57 +3841,66 @@ static void disasmInternal(Inst *inst, i
180 + static size_t opLen;
184 + for (j = 0; j < N_OPS; ++j) {
185 + if (opLen < strlen(opNames[j])) {
186 + opLen = strlen(opNames[j]);
191 for (i = 0; i < nInstr; ++i) {
192 - printd("Prog %8p ", &inst[i]);
193 + printd("Prog %8p", &inst[i]);
194 for (j = 0; j < N_OPS; ++j) {
195 if (inst[i].func == OpFns[j]) {
196 - printd("%22s ", opNames[j]);
197 + printd(" %*s", (int)opLen, opNames[j]);
198 if (j == OP_PUSH_SYM || j == OP_ASSIGN) {
199 Symbol *sym = inst[i+1].sym;
200 - printd("%s", sym->name);
201 + printd(" %s", sym->name);
202 if (sym->value.tag == STRING_TAG &&
203 strncmp(sym->name, "string #", 8) == 0) {
209 else if (j == OP_PUSH_IMMED) {
210 - printd("%d", inst[i+1].value);
211 + printd(" %d", inst[i+1].value);
214 else if (j == OP_BRANCH || j == OP_BRANCH_FALSE ||
215 j == OP_BRANCH_NEVER || j == OP_BRANCH_TRUE) {
216 - printd("to=(%d) %p", inst[i+1].value,
217 + printd(" to=(%+d) %8p", inst[i+1].value,
218 &inst[i+1] + inst[i+1].value);
221 else if (j == OP_CONCAT) {
222 - printd("nExpr=%d", inst[i+1].value);
223 + printd(" nExpr=%d", inst[i+1].value);
226 else if (j == OP_SUBR_CALL) {
227 int args = inst[i+2].value;
228 - printd("%s ", inst[i+1].sym->name);
229 + printd(" %s", inst[i+1].sym->name);
231 - printd("%d+args[] (%d)", -args - 1, args);
232 + printd(" %d+args[] (%d)", -args - 1, args);
235 - printd("%d args", args);
236 + printd(" %d args", args);
240 else if (j == OP_SUBR_CALL_STACKED_N) {
241 - printd("%s args[] (?)", inst[i+1].sym->name);
242 + printd(" %s args[] (?)", inst[i+1].sym->name);
245 else if (j == OP_BEGIN_ARRAY_ITER) {
246 - printd("%s in", inst[i+1].sym->name);
247 + printd(" %s in", inst[i+1].sym->name);
250 else if (j == OP_ARRAY_ITER) {
251 - printd("%s = %s++ end-loop=(%d) %p",
252 + printd(" %s = %s++ end-loop=(%+d) %8p",
255 inst[i+3].value, &inst[i+3] + inst[i+3].value);
256 @@ -3881,18 +3912,20 @@ static void disasmInternal(Inst *inst, i
257 j == OP_ANONARRAY_INDEX_VAL ||
258 j == OP_NAMED_ARG1 ||
259 j == OP_NAMED_ARGN) {
260 - printd("nDim=%d", inst[i+1].value);
261 + printd(" nDim=%d", inst[i+1].value);
264 else if (j == OP_ARRAY_REF_ASSIGN_SETUP) {
265 - printd("binOp=%s ", inst[i+1].value ? "true" : "false");
266 - printd("nDim=%d", inst[i+2].value);
267 + printd(" binOp=%s nDim=%d",
268 + inst[i+1].value ? "true" : "false",
272 else if (j == OP_PUSH_ARRAY_SYM) {
273 - printd("%s", inst[++i].sym->name);
274 - printd(" %s", inst[i+1].value ? "createAndRef" : "refOnly");
277 + inst[i+1].sym->name,
278 + inst[i+2].value ? "createAndRef" : "refOnly");
283 @@ -3900,18 +3933,20 @@ static void disasmInternal(Inst *inst, i
287 - printd("%x\n", inst[i].value);
288 + printd(" %x\n", inst[i].value);
293 -static void disasm(Inst *inst, int nInstr)
294 +static void disasm(const char *name, Inst *inst, int nInstr)
296 static int outIsTTY = -1;
297 if (outIsTTY == -1) outIsTTY = isatty(fileno(stdout));
298 if (outIsTTY) { printd("\033[H"); }
299 + if (name) printd(">> %s\n", name);
300 disasmInternal(inst, nInstr);
301 if (outIsTTY) { printd("\033[J\n"); }
302 + if (name) printd("\n");
305 #endif /* #ifdef DEBUG_DISASSEMBLER */
306 @@ -4040,7 +4075,7 @@ static void stackdumpInternal(int n, int
307 if (outpt < TheStack)
308 printd("--------------Stack base--------------\n");
309 stackdumpframe(arrow, outpt, FrameP, StackP, '*');
310 - printd("Stack ----->\n");
311 + printd("Stack ----->\n\n");
312 #endif /* #ifdef DEBUG_STACK_HEADFIRST */
315 diff --quilt old/source/interpret.h new/source/interpret.h
316 --- old/source/interpret.h
317 +++ new/source/interpret.h
318 @@ -108,7 +108,7 @@ typedef struct ProgramTag {
319 Symbol *localSymList;
326 /* Information needed to re-start a preempted macro */
327 @@ -128,6 +128,7 @@ typedef struct AccumulatorDataTag {
329 Inst *loopStack[LOOP_STACK_SIZE];
334 void InitMacroGlobals(void);
335 @@ -144,7 +145,7 @@ int ArrayCopy(DataValue *dstArray, DataV
337 /* Routines for creating a program, (accumulated beginning with
338 BeginCreatingProgram and returned via FinishCreatingProgram) */
339 -void BeginCreatingProgram(AccumulatorData *acc);
340 +void BeginCreatingProgram(const char *name, AccumulatorData *acc);
341 int AddOp(int op, char **msg);
342 int AddSym(Symbol *sym, char **msg);
343 int AddImmediate(int value, char **msg);
344 diff --quilt old/source/parse.y new/source/parse.y
345 --- old/source/parse.y
346 +++ new/source/parse.y
347 @@ -192,7 +192,7 @@ define: DEFINE {
348 yyerror("try to override built-in subroutine"); YYERROR;
350 $4 = PromoteToGlobal($4);
351 - BeginCreatingProgram($1);
352 + BeginCreatingProgram($4->name, $1);
355 ADD_OP(OP_RETURN_NO_VAL);
356 @@ -742,9 +742,11 @@ Program *ParseMacro(char *expr, char **m
359 AccumulatorData *acc = (AccumulatorData *)XtMalloc(sizeof(*acc));
360 - static const char *prefix = ">> ";
362 - BeginCreatingProgram(acc);
364 + name = "--unknown--";
366 + BeginCreatingProgram(name, acc);
368 /* whether we allow the "define" keyword */
369 AllowDefine = allowDefine;
370 @@ -765,12 +767,6 @@ Program *ParseMacro(char *expr, char **m
371 prog = FinishCreatingProgram(acc);
375 - name = "--unknown--";
377 - prog->name = XtMalloc(strlen(name) + strlen(prefix) + 1);
378 - strcat(strcpy(prog->name, prefix), name);
380 /* parse succeeded */
383 diff --quilt old/source/userCmds.c new/source/userCmds.c
384 --- old/source/userCmds.c
385 +++ new/source/userCmds.c
386 @@ -1286,13 +1286,13 @@ static int doMacroMenuCmd(WindowInfo *wi
387 int DoNamedMacroMenuCmd(WindowInfo *window, const char *itemName)
389 return doMacroMenuCmd(window, itemName, MacroMenuItems, NMacroMenuItems,
394 int DoNamedBGMenuCmd(WindowInfo *window, const char *itemName)
396 return doMacroMenuCmd(window, itemName, BGMenuItems, NBGMenuItems,
397 - "background-menu>");
398 + "Background Menu>");