summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/type-checker.c18
-rw-r--r--src/type-checker.h3
2 files changed, 20 insertions, 1 deletions
diff --git a/src/type-checker.c b/src/type-checker.c
index 134669a2..e8935a27 100644
--- a/src/type-checker.c
+++ b/src/type-checker.c
@@ -332,6 +332,7 @@ WabtResult wabt_typechecker_on_br_if(WabtTypeChecker* tc, size_t depth) {
}
WabtResult wabt_typechecker_begin_br_table(WabtTypeChecker* tc) {
+ tc->br_table_sig = WABT_TYPE_ANY;
return pop_and_check_1_type(tc, WABT_TYPE_I32, "br_table");
}
@@ -340,6 +341,13 @@ WabtResult wabt_typechecker_on_br_table_target(WabtTypeChecker* tc,
WabtResult result = WABT_OK;
WabtTypeCheckerLabel* label;
CHECK_RESULT(wabt_typechecker_get_label(tc, depth, &label));
+ assert(label->sig.size <= 1);
+ WabtType label_sig =
+ label->sig.size == 0 ? WABT_TYPE_VOID : label->sig.data[0];
+ COMBINE_RESULT(result,
+ check_type(tc, tc->br_table_sig, label_sig, "br_table"));
+ tc->br_table_sig = label_sig;
+
if (label->label_type != WABT_LABEL_TYPE_LOOP)
COMBINE_RESULT(result, check_signature(tc, &label->sig, "br_table"));
return result;
@@ -421,6 +429,7 @@ static WabtResult on_end(WabtTypeChecker* tc,
}
WabtResult wabt_typechecker_on_end(WabtTypeChecker* tc) {
+ WabtResult result = WABT_OK;
static const char* s_label_type_name[] = {"function", "block", "loop", "if",
"if false branch"};
WABT_STATIC_ASSERT(WABT_ARRAY_SIZE(s_label_type_name) ==
@@ -428,8 +437,15 @@ WabtResult wabt_typechecker_on_end(WabtTypeChecker* tc) {
WabtTypeCheckerLabel* label;
CHECK_RESULT(top_label(tc, &label));
assert(label->label_type < WABT_NUM_LABEL_TYPES);
+ if (label->label_type == WABT_LABEL_TYPE_IF) {
+ if (label->sig.size != 0) {
+ print_error(tc, "if without else cannot have type signature.");
+ result = WABT_ERROR;
+ }
+ }
const char* desc = s_label_type_name[label->label_type];
- return on_end(tc, label, desc, desc);
+ COMBINE_RESULT(result, on_end(tc, label, desc, desc));
+ return result;
}
WabtResult wabt_typechecker_on_grow_memory(WabtTypeChecker* tc) {
diff --git a/src/type-checker.h b/src/type-checker.h
index 978fc728..5e9f6629 100644
--- a/src/type-checker.h
+++ b/src/type-checker.h
@@ -42,6 +42,9 @@ typedef struct WabtTypeChecker {
WabtTypeCheckerErrorHandler* error_handler;
WabtTypeVector type_stack;
WabtTypeCheckerLabelVector label_stack;
+/* TODO(binji): will need to be complete signature when signatures with
+ * multiple types are allowed. */
+ WabtType br_table_sig;
} WabtTypeChecker;
WABT_EXTERN_C_BEGIN