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.cc42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/type-checker.cc b/src/type-checker.cc
index b213a4c3..a54f53ba 100644
--- a/src/type-checker.cc
+++ b/src/type-checker.cc
@@ -220,6 +220,24 @@ Result TypeChecker::PopAndCheck2Types(Type expected1,
return result;
}
+Result TypeChecker::PopAndCheck3Types(Type expected1,
+ Type expected2,
+ Type expected3,
+ const char* desc) {
+ Result result = Result::Ok;
+ Type actual1 = Type::Any;
+ Type actual2 = Type::Any;
+ Type actual3 = Type::Any;
+ result |= CheckTypeStackLimit(3, desc);
+ result |= PopType(&actual3);
+ result |= PopType(&actual2);
+ result |= PopType(&actual1);
+ result |= CheckType(actual1, expected1, desc);
+ result |= CheckType(actual2, expected2, desc);
+ result |= CheckType(actual3, expected3, desc);
+ return result;
+}
+
Result TypeChecker::PopAndCheck2TypesAreEqual(Type* out_type,
const char* desc) {
Result result = Result::Ok;
@@ -246,6 +264,14 @@ Result TypeChecker::CheckOpcode2(Opcode opcode) {
return result;
}
+Result TypeChecker::CheckOpcode3(Opcode opcode) {
+ Result result =
+ PopAndCheck3Types(opcode.GetParamType1(), opcode.GetParamType2(),
+ opcode.GetParamType3(), opcode.GetName());
+ PushType(opcode.GetResultType());
+ return result;
+}
+
Result TypeChecker::BeginFunction(const TypeVector* sig) {
type_stack_.clear();
label_stack_.clear();
@@ -253,6 +279,22 @@ Result TypeChecker::BeginFunction(const TypeVector* sig) {
return Result::Ok;
}
+Result TypeChecker::OnAtomicLoad(Opcode opcode) {
+ return CheckOpcode1(opcode);
+}
+
+Result TypeChecker::OnAtomicStore(Opcode opcode) {
+ return CheckOpcode2(opcode);
+}
+
+Result TypeChecker::OnAtomicRmw(Opcode opcode) {
+ return CheckOpcode2(opcode);
+}
+
+Result TypeChecker::OnAtomicRmwCmpxchg(Opcode opcode) {
+ return CheckOpcode3(opcode);
+}
+
Result TypeChecker::OnBinary(Opcode opcode) {
return CheckOpcode2(opcode);
}