diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/interp/binary-reader-interp.cc | 14 | ||||
-rw-r--r-- | src/type-checker.cc | 9 | ||||
-rw-r--r-- | src/type-checker.h | 10 | ||||
-rw-r--r-- | src/validator.cc | 8 |
4 files changed, 25 insertions, 16 deletions
diff --git a/src/interp/binary-reader-interp.cc b/src/interp/binary-reader-interp.cc index 9bdb1c84..22595e8e 100644 --- a/src/interp/binary-reader-interp.cc +++ b/src/interp/binary-reader-interp.cc @@ -267,6 +267,7 @@ class BinaryReaderInterp : public BinaryReaderNop { TypeVector* out_result_types); FuncSignature* GetSignatureByModuleIndex(Index sig_index); Index TranslateFuncIndexToEnv(Index func_index); + Table* GetTableByModuleIndex(Index table_index); Index TranslateTableIndexToEnv(Index table_index); Index TranslateModuleFuncIndexToDefined(Index func_index); Func* GetFuncByModuleIndex(Index func_index); @@ -456,6 +457,10 @@ Func* BinaryReaderInterp::GetFuncByModuleIndex(Index func_index) { return env_->GetFunc(TranslateFuncIndexToEnv(func_index)); } +Table* BinaryReaderInterp::GetTableByModuleIndex(Index table_index) { + return env_->GetTable(TranslateTableIndexToEnv(table_index)); +} + Index BinaryReaderInterp::TranslateGlobalIndexToEnv(Index global_index) { return global_index_mapping_[global_index]; } @@ -1126,8 +1131,7 @@ wabt::Result BinaryReaderInterp::OnElemSegmentElemExprCount(Index index, elem_segment_->dropped = true; assert(segment_table_index_ != kInvalidIndex); - Table* table = - env_->GetTable(TranslateTableIndexToEnv(segment_table_index_)); + Table* table = GetTableByModuleIndex(segment_table_index_); elem_segment_infos_.emplace_back(table, table_offset_); elem_segment_info_ = &elem_segment_infos_.back(); } @@ -1851,14 +1855,16 @@ wabt::Result BinaryReaderInterp::OnMemoryInitExpr(Index segment_index) { } wabt::Result BinaryReaderInterp::OnTableGetExpr(Index table_index) { - CHECK_RESULT(typechecker_.OnTableGet(table_index)); + const Table* table = GetTableByModuleIndex(table_index); + CHECK_RESULT(typechecker_.OnTableGet(table->elem_type)); CHECK_RESULT(EmitOpcode(Opcode::TableGet)); CHECK_RESULT(EmitI32(TranslateTableIndexToEnv(table_index))); return wabt::Result::Ok; } wabt::Result BinaryReaderInterp::OnTableSetExpr(Index table_index) { - CHECK_RESULT(typechecker_.OnTableSet(table_index)); + const Table* table = GetTableByModuleIndex(table_index); + CHECK_RESULT(typechecker_.OnTableSet(table->elem_type)); CHECK_RESULT(EmitOpcode(Opcode::TableSet)); CHECK_RESULT(EmitI32(TranslateTableIndexToEnv(table_index))); return wabt::Result::Ok; diff --git a/src/type-checker.cc b/src/type-checker.cc index 6a224d8f..cc7618d5 100644 --- a/src/type-checker.cc +++ b/src/type-checker.cc @@ -645,15 +645,14 @@ Result TypeChecker::OnTableInit(uint32_t table, uint32_t segment) { return CheckOpcode3(Opcode::TableInit); } -Result TypeChecker::OnTableGet(Index table_index) { +Result TypeChecker::OnTableGet(Type elem_type) { Result result = PopAndCheck1Type(Type::I32, "table.get"); - PushType(Type::Nullref); // TODO: should be the table's type + PushType(elem_type); return result; } -Result TypeChecker::OnTableSet(Index table_index) { - // TODO: anyref here should be the table's type - return PopAndCheck2Types(Type::I32, Type::Anyref, "table.set"); +Result TypeChecker::OnTableSet(Type elem_type) { + return PopAndCheck2Types(Type::I32, elem_type, "table.set"); } Result TypeChecker::OnTableGrow(Index segment) { diff --git a/src/type-checker.h b/src/type-checker.h index c5e9d3d8..b345a2df 100644 --- a/src/type-checker.h +++ b/src/type-checker.h @@ -102,11 +102,11 @@ class TypeChecker { Result OnTableCopy(); Result OnElemDrop(Index); Result OnTableInit(Index, Index); - Result OnTableGet(Index); - Result OnTableSet(Index); - Result OnTableGrow(Index); - Result OnTableSize(Index); - Result OnRefFuncExpr(Index); + Result OnTableGet(Type elem_type); + Result OnTableSet(Type elem_type); + Result OnTableGrow(Index table_index); + Result OnTableSize(Index table_index); + Result OnRefFuncExpr(Index func_index); Result OnRefNullExpr(); Result OnRefIsNullExpr(); Result OnRethrow(); diff --git a/src/validator.cc b/src/validator.cc index 8f53661e..0f93a781 100644 --- a/src/validator.cc +++ b/src/validator.cc @@ -803,16 +803,20 @@ Result Validator::OnTableInitExpr(TableInitExpr* expr) { } Result Validator::OnTableGetExpr(TableGetExpr* expr) { + const Table* table; + CheckTableVar(&expr->var, &table); expr_loc_ = &expr->loc; CheckHasTable(&expr->loc, Opcode::TableGet, expr->var.index()); - typechecker_.OnTableGet(expr->var.index()); + typechecker_.OnTableGet(table->elem_type); return Result::Ok; } Result Validator::OnTableSetExpr(TableSetExpr* expr) { + const Table* table; + CheckTableVar(&expr->var, &table); expr_loc_ = &expr->loc; CheckHasTable(&expr->loc, Opcode::TableSet, expr->var.index()); - typechecker_.OnTableSet(expr->var.index()); + typechecker_.OnTableSet(table->elem_type); return Result::Ok; } |