diff options
Diffstat (limited to 'src/type-checker.cc')
-rw-r--r-- | src/type-checker.cc | 42 |
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); } |