diff options
Diffstat (limited to 'src/type-checker.cc')
-rw-r--r-- | src/type-checker.cc | 110 |
1 files changed, 46 insertions, 64 deletions
diff --git a/src/type-checker.cc b/src/type-checker.cc index ef38a1bc..89d1fbf2 100644 --- a/src/type-checker.cc +++ b/src/type-checker.cc @@ -16,18 +16,6 @@ #include "type-checker.h" -#define CHECK_RESULT(expr) \ - do { \ - if (Failed(expr)) \ - return Result::Error; \ - } while (0) - -#define COMBINE_RESULT(result_var, result) \ - do { \ - (result_var) = static_cast<Result>(static_cast<int>(result_var) | \ - static_cast<int>(result)); \ - } while (0) - namespace wabt { TypeChecker::Label::Label(LabelType label_type, @@ -179,35 +167,32 @@ Result TypeChecker::CheckType(Type actual, Type expected, const char* desc) { } Result TypeChecker::CheckSignature(const TypeVector& sig, const char* desc) { - Result result = Result::Ok; - COMBINE_RESULT(result, CheckTypeStackLimit(sig.size(), desc)); + Result result = CheckTypeStackLimit(sig.size(), desc); for (size_t i = 0; i < sig.size(); ++i) { Type actual = Type::Any; - COMBINE_RESULT(result, PeekType(sig.size() - i - 1, &actual)); - COMBINE_RESULT(result, CheckType(actual, sig[i], desc)); + result |= PeekType(sig.size() - i - 1, &actual); + result |= CheckType(actual, sig[i], desc); } return result; } Result TypeChecker::PopAndCheckSignature(const TypeVector& sig, const char* desc) { - Result result = Result::Ok; - COMBINE_RESULT(result, CheckSignature(sig, desc)); - COMBINE_RESULT(result, DropTypes(sig.size())); + Result result = CheckSignature(sig, desc); + result |= DropTypes(sig.size()); return result; } Result TypeChecker::PopAndCheckCall(const TypeVector& param_types, const TypeVector& result_types, const char* desc) { - Result result = Result::Ok; - COMBINE_RESULT(result, CheckTypeStackLimit(param_types.size(), desc)); + Result result = CheckTypeStackLimit(param_types.size(), desc); for (size_t i = 0; i < param_types.size(); ++i) { Type actual = Type::Any; - COMBINE_RESULT(result, PeekType(param_types.size() - i - 1, &actual)); - COMBINE_RESULT(result, CheckType(actual, param_types[i], desc)); + result |= PeekType(param_types.size() - i - 1, &actual); + result |= CheckType(actual, param_types[i], desc); } - COMBINE_RESULT(result, DropTypes(param_types.size())); + result |= DropTypes(param_types.size()); PushTypes(result_types); return result; } @@ -215,9 +200,9 @@ Result TypeChecker::PopAndCheckCall(const TypeVector& param_types, Result TypeChecker::PopAndCheck1Type(Type expected, const char* desc) { Result result = Result::Ok; Type actual = Type::Any; - COMBINE_RESULT(result, CheckTypeStackLimit(1, desc)); - COMBINE_RESULT(result, PopType(&actual)); - COMBINE_RESULT(result, CheckType(actual, expected, desc)); + result |= CheckTypeStackLimit(1, desc); + result |= PopType(&actual); + result |= CheckType(actual, expected, desc); return result; } @@ -227,11 +212,11 @@ Result TypeChecker::PopAndCheck2Types(Type expected1, Result result = Result::Ok; Type actual1 = Type::Any; Type actual2 = Type::Any; - COMBINE_RESULT(result, CheckTypeStackLimit(2, desc)); - COMBINE_RESULT(result, PopType(&actual2)); - COMBINE_RESULT(result, PopType(&actual1)); - COMBINE_RESULT(result, CheckType(actual1, expected1, desc)); - COMBINE_RESULT(result, CheckType(actual2, expected2, desc)); + result |= CheckTypeStackLimit(2, desc); + result |= PopType(&actual2); + result |= PopType(&actual1); + result |= CheckType(actual1, expected1, desc); + result |= CheckType(actual2, expected2, desc); return result; } @@ -240,10 +225,10 @@ Result TypeChecker::PopAndCheck2TypesAreEqual(Type* out_type, Result result = Result::Ok; Type right = Type::Any; Type left = Type::Any; - COMBINE_RESULT(result, CheckTypeStackLimit(2, desc)); - COMBINE_RESULT(result, PopType(&right)); - COMBINE_RESULT(result, PopType(&left)); - COMBINE_RESULT(result, CheckType(left, right, desc)); + result |= CheckTypeStackLimit(2, desc); + result |= PopType(&right); + result |= PopType(&left); + result |= CheckType(left, right, desc); *out_type = right; return result; } @@ -282,18 +267,17 @@ Result TypeChecker::OnBr(Index depth) { Label* label; CHECK_RESULT(GetLabel(depth, &label)); if (label->label_type != LabelType::Loop) - COMBINE_RESULT(result, CheckSignature(label->sig, "br")); + result |= CheckSignature(label->sig, "br"); CHECK_RESULT(SetUnreachable()); return result; } Result TypeChecker::OnBrIf(Index depth) { - Result result = Result::Ok; - COMBINE_RESULT(result, PopAndCheck1Type(Type::I32, "br_if")); + Result result = PopAndCheck1Type(Type::I32, "br_if"); Label* label; CHECK_RESULT(GetLabel(depth, &label)); if (label->label_type != LabelType::Loop) { - COMBINE_RESULT(result, PopAndCheckSignature(label->sig, "br_if")); + result |= PopAndCheckSignature(label->sig, "br_if"); PushTypes(label->sig); } return result; @@ -316,11 +300,11 @@ Result TypeChecker::OnBrTableTarget(Index depth) { label_sig = label->sig.size() == 0 ? Type::Void : label->sig[0]; } - COMBINE_RESULT(result, CheckType(br_table_sig_, label_sig, "br_table")); + result |= CheckType(br_table_sig_, label_sig, "br_table"); br_table_sig_ = label_sig; if (label->label_type != LabelType::Loop) - COMBINE_RESULT(result, CheckSignature(label->sig, "br_table")); + result |= CheckSignature(label->sig, "br_table"); return result; } @@ -335,10 +319,8 @@ Result TypeChecker::OnCall(const TypeVector* param_types, Result TypeChecker::OnCallIndirect(const TypeVector* param_types, const TypeVector* result_types) { - Result result = Result::Ok; - COMBINE_RESULT(result, PopAndCheck1Type(Type::I32, "call_indirect")); - COMBINE_RESULT(result, - PopAndCheckCall(*param_types, *result_types, "call_indirect")); + Result result = PopAndCheck1Type(Type::I32, "call_indirect"); + result |= PopAndCheckCall(*param_types, *result_types, "call_indirect"); return result; } @@ -355,9 +337,9 @@ Result TypeChecker::OnCatchBlock(const TypeVector* sig) { Result result = Result::Ok; Label* label; CHECK_RESULT(TopLabel(&label)); - COMBINE_RESULT(result, CheckLabelType(label, LabelType::Try)); - COMBINE_RESULT(result, PopAndCheckSignature(label->sig, "try block")); - COMBINE_RESULT(result, CheckTypeStackEnd("try block")); + result |= CheckLabelType(label, LabelType::Try); + result |= PopAndCheckSignature(label->sig, "try block"); + result |= CheckTypeStackEnd("try block"); ResetTypeStackToLabel(label); label->label_type = LabelType::Catch; label->unreachable = false; @@ -381,8 +363,8 @@ Result TypeChecker::OnCurrentMemory() { Result TypeChecker::OnDrop() { Result result = Result::Ok; Type type = Type::Any; - COMBINE_RESULT(result, CheckTypeStackLimit(1, "drop")); - COMBINE_RESULT(result, PopType(&type)); + result |= CheckTypeStackLimit(1, "drop"); + result |= PopType(&type); return result; } @@ -390,9 +372,9 @@ Result TypeChecker::OnElse() { Result result = Result::Ok; Label* label; CHECK_RESULT(TopLabel(&label)); - COMBINE_RESULT(result, CheckLabelType(label, LabelType::If)); - COMBINE_RESULT(result, PopAndCheckSignature(label->sig, "if true branch")); - COMBINE_RESULT(result, CheckTypeStackEnd("if true branch")); + result |= CheckLabelType(label, LabelType::If); + result |= PopAndCheckSignature(label->sig, "if true branch"); + result |= CheckTypeStackEnd("if true branch"); ResetTypeStackToLabel(label); label->label_type = LabelType::Else; label->unreachable = false; @@ -403,8 +385,8 @@ Result TypeChecker::OnEnd(Label* label, const char* sig_desc, const char* end_desc) { Result result = Result::Ok; - COMBINE_RESULT(result, PopAndCheckSignature(label->sig, sig_desc)); - COMBINE_RESULT(result, CheckTypeStackEnd(end_desc)); + result |= PopAndCheckSignature(label->sig, sig_desc); + result |= CheckTypeStackEnd(end_desc); ResetTypeStackToLabel(label); PushTypes(label->sig); PopLabel(); @@ -427,7 +409,7 @@ Result TypeChecker::OnEnd() { } } const char* desc = s_label_type_name[static_cast<int>(label->label_type)]; - COMBINE_RESULT(result, OnEnd(label, desc, desc)); + result |= OnEnd(label, desc, desc); return result; } @@ -488,7 +470,7 @@ Result TypeChecker::OnRethrow(Index depth) { Result TypeChecker::OnThrow(const TypeVector* sig) { Result result = Result::Ok; - COMBINE_RESULT(result, PopAndCheckSignature(*sig, "throw")); + result |= PopAndCheckSignature(*sig, "throw"); CHECK_RESULT(SetUnreachable()); return result; } @@ -497,16 +479,16 @@ Result TypeChecker::OnReturn() { Result result = Result::Ok; Label* func_label; CHECK_RESULT(GetLabel(label_stack_.size() - 1, &func_label)); - COMBINE_RESULT(result, PopAndCheckSignature(func_label->sig, "return")); + result |= PopAndCheckSignature(func_label->sig, "return"); CHECK_RESULT(SetUnreachable()); return result; } Result TypeChecker::OnSelect() { Result result = Result::Ok; - COMBINE_RESULT(result, PopAndCheck1Type(Type::I32, "select")); + result |= PopAndCheck1Type(Type::I32, "select"); Type type = Type::Any; - COMBINE_RESULT(result, PopAndCheck2TypesAreEqual(&type, "select")); + result |= PopAndCheck2TypesAreEqual(&type, "select"); PushType(type); return result; } @@ -530,7 +512,7 @@ Result TypeChecker::OnTryBlock(const TypeVector* sig) { Result TypeChecker::OnTeeLocal(Type type) { Result result = Result::Ok; - COMBINE_RESULT(result, PopAndCheck1Type(type, "tee_local")); + result |= PopAndCheck1Type(type, "tee_local"); PushType(type); return result; } @@ -547,8 +529,8 @@ Result TypeChecker::EndFunction() { Result result = Result::Ok; Label* label; CHECK_RESULT(TopLabel(&label)); - COMBINE_RESULT(result, CheckLabelType(label, LabelType::Func)); - COMBINE_RESULT(result, OnEnd(label, "implicit return", "function")); + result |= CheckLabelType(label, LabelType::Func); + result |= OnEnd(label, "implicit return", "function"); return result; } |