summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilliam Langford <wlangfor@gmail.com>2017-02-20 00:49:28 -0500
committerNicolas Williams <nico@cryptonector.com>2017-03-26 05:36:22 -0500
commit94035be3fa80ea201e82ee4b59ee6434357732f6 (patch)
tree42dc185f1e7d1caefdded7d549768c1573c47ec0
parentc8a2a0acc23e87cb28db794ee95f7d8b87d3ccbb (diff)
Add --debug-trace=all for detailed debug output
When tracing execution, print the whole stack, not just the items used by the current opcode
-rw-r--r--src/execute.c17
-rw-r--r--src/jq.h6
-rw-r--r--src/main.c4
3 files changed, 18 insertions, 9 deletions
diff --git a/src/execute.c b/src/execute.c
index 0fcaaf02..d5672165 100644
--- a/src/execute.c
+++ b/src/execute.c
@@ -365,10 +365,9 @@ jv jq_next(jq_state *jq) {
if (!backtracking) {
int stack_in = opdesc->stack_in;
if (stack_in == -1) stack_in = pc[1];
+ param = jq->stk_top;
for (int i=0; i<stack_in; i++) {
- if (i == 0) {
- param = jq->stk_top;
- } else {
+ if (i != 0) {
printf(" | ");
param = *stack_block_next(&jq->stk, param);
}
@@ -378,6 +377,12 @@ jv jq_next(jq_state *jq) {
//printf(" -- ");
//jv_dump(jv_copy(jq->path), 0);
}
+ if (jq->debug_trace_enabled & JQ_DEBUG_TRACE_DETAIL) {
+ while ((param = *stack_block_next(&jq->stk, param))) {
+ printf(" || ");
+ jv_dump(jv_copy(*(jv*)stack_block(&jq->stk, param)), JV_PRINT_REFCOUNT);
+ }
+ }
} else {
printf("\t<backtracking>");
}
@@ -1033,11 +1038,7 @@ void jq_start(jq_state *jq, jv input, int flags) {
stack_push(jq, input);
stack_save(jq, jq->bc->code, stack_get_pos(jq));
- if (flags & JQ_DEBUG_TRACE) {
- jq->debug_trace_enabled = 1;
- } else {
- jq->debug_trace_enabled = 0;
- }
+ jq->debug_trace_enabled = flags & JQ_DEBUG_TRACE_ALL;
jq->initial_execution = 1;
}
diff --git a/src/jq.h b/src/jq.h
index b80d442f..3067d8ae 100644
--- a/src/jq.h
+++ b/src/jq.h
@@ -4,7 +4,11 @@
#include <stdio.h>
#include "jv.h"
-enum {JQ_DEBUG_TRACE = 1};
+enum {
+ JQ_DEBUG_TRACE = 1,
+ JQ_DEBUG_TRACE_DETAIL = 2,
+ JQ_DEBUG_TRACE_ALL = JQ_DEBUG_TRACE | JQ_DEBUG_TRACE_DETAIL,
+};
typedef struct jq_state jq_state;
typedef void (*jq_msg_cb)(void *, jv);
diff --git a/src/main.c b/src/main.c
index 6d3964b1..3cbf3152 100644
--- a/src/main.c
+++ b/src/main.c
@@ -475,6 +475,10 @@ int main(int argc, char* argv[]) {
options |= DUMP_DISASM;
continue;
}
+ if (isoption(argv[i], 0, "debug-trace=all", &short_opts)) {
+ jq_flags |= JQ_DEBUG_TRACE_ALL;
+ if (!short_opts) continue;
+ }
if (isoption(argv[i], 0, "debug-trace", &short_opts)) {
jq_flags |= JQ_DEBUG_TRACE;
continue;