commit 4d8f10e515d8e3df12be07bd81cda96f116c3c89
parent 7d0b3bff7882cdfe878cf36786110e787241b2eb
Author: William Casarin <jb55@jb55.com>
Date: Sun, 18 Jul 2021 17:33:48 -0700
fix unresolved break bug
Signed-off-by: William Casarin <jb55@jb55.com>
Diffstat:
3 files changed, 23 insertions(+), 10 deletions(-)
diff --git a/.gitignore b/.gitignore
@@ -10,3 +10,4 @@ todo/done.txt
/test
*.wasm
/tags
+todo/todo.txt.bak
diff --git a/src/wasm.c b/src/wasm.c
@@ -2755,13 +2755,16 @@ static INLINE int resolve_label(struct label *label, struct cursor *code)
return 1;
}
-static INLINE int pop_resolver(struct wasm_interp *interp, struct resolver *resolver)
+static INLINE int pop_resolver(struct wasm_interp *interp,
+ struct resolver *resolver)
{
if (!cursor_pop(&interp->resolver_stack, (u8*)resolver, sizeof(*resolver))) {
return interp_error(interp, "pop resolver");
}
- debug("popped resolver stack %d i_%s %d\n",
- resolver->label, instr_name(resolver->end_tag),
+ debug("popped stack %d i_%s i_%s %d\n",
+ resolver->label,
+ instr_name(resolver->start_tag),
+ instr_name(resolver->end_tag),
count_resolvers(interp));
return 1;
}
@@ -2843,8 +2846,10 @@ static int upsert_label(struct wasm_interp *interp, int fn,
return 0;
}
- debug("upsert_label: %d labels for %s\n",
- *num_labels, get_function_name(interp->module, fn));
+ /*
+ debug("upsert_label: %d labels for %s:%d\n",
+ *num_labels, get_function_name(interp->module, fn), fn);
+ */
*ind = *num_labels;
if (unlikely(!(label = index_label(&interp->labels, fn, *ind))))
@@ -2906,8 +2911,10 @@ static int push_label_checkpoint(struct wasm_interp *interp, struct label **labe
return interp_error(interp, "push label index to resolver stack oob");
}
- debug("pushed resolver stack %d i_%s %ld \n",
- resolver.label, instr_name(resolver.end_tag),
+ debug("pushed resolver %d i_%s i_%s %ld \n",
+ resolver.label,
+ instr_name(resolver.start_tag),
+ instr_name(resolver.end_tag),
cursor_count(&interp->resolver_stack, sizeof(resolver)));
return 1;
@@ -3022,7 +3029,8 @@ static int parse_br_table(struct cursor *code, struct errors *errs,
static int parse_instr(struct expr_parser *p, u8 tag, struct instr *op)
{
/*debug("%04lX parsing instr %s (0x%02x)\n",
- p->code->p - 1 - p->code->start, instr_name(tag), tag);*/
+ p->code->p - 1 - p->code->start, instr_name(tag), tag);
+ */
op->pos = p->code->p - 1 - p->code->start;
op->tag = tag;
@@ -3377,7 +3385,10 @@ static int unresolved_break(struct wasm_interp *interp, int index)
// TODO: breaking from functions (return)
if (is_label_resolved(label)) {
- return pop_label_and_jump(interp, label->jump);
+ if (!pop_label_and_jump(interp, label->jump))
+ return interp_error(interp, "pop and jump");
+ else
+ continue;
}
if (unlikely(!parse_instrs_until(&parser, resolver->end_tag,
@@ -3388,6 +3399,8 @@ static int unresolved_break(struct wasm_interp *interp, int index)
if (unlikely(!pop_label_checkpoint(interp))) {
return interp_error(interp, "pop label");
}
+
+
}
return 1;
diff --git a/src/wasm.h b/src/wasm.h
@@ -568,7 +568,6 @@ struct resolver {
u16 label;
u8 end_tag;
u8 start_tag;
- unsigned char unused;
};
struct wasm_interp {