summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/interp/binary-reader-interp.cc14
-rw-r--r--src/type-checker.cc9
-rw-r--r--src/type-checker.h10
-rw-r--r--src/validator.cc8
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;
}