summaryrefslogtreecommitdiff
path: root/src/type-checker.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/type-checker.cc')
-rw-r--r--src/type-checker.cc110
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;
}