Index: src/wasm/asm-wasm-builder.cc |
diff --git a/src/wasm/asm-wasm-builder.cc b/src/wasm/asm-wasm-builder.cc |
index 7a0ae05a12ecb3a3f3207980610f1fa71f06cbcd..a675debc56a3f2557f735c2c5042c2a688b8e06b 100644 |
--- a/src/wasm/asm-wasm-builder.cc |
+++ b/src/wasm/asm-wasm-builder.cc |
@@ -60,7 +60,8 @@ class AsmWasmBuilderImpl : public AstVisitor { |
function_tables_(HashMap::PointersMatch, |
ZoneHashMap::kDefaultHashMapCapacity, |
ZoneAllocationPolicy(zone)), |
- imported_function_table_(this) { |
+ imported_function_table_(this), |
+ bounds_(typer->bounds()) { |
InitializeAstVisitor(isolate); |
} |
@@ -320,7 +321,7 @@ class AsmWasmBuilderImpl : public AstVisitor { |
Literal* label = clause->label()->AsLiteral(); |
Handle<Object> value = label->value(); |
DCHECK(value->IsNumber() && |
- label->bounds().upper->Is(cache_.kAsmSigned)); |
+ bounds_->get(label).upper->Is(cache_.kAsmSigned)); |
int32_t label_value; |
if (!value->ToInt32(&label_value)) { |
UNREACHABLE(); |
@@ -414,8 +415,8 @@ class AsmWasmBuilderImpl : public AstVisitor { |
void VisitFunctionLiteral(FunctionLiteral* expr) { |
Scope* scope = expr->scope(); |
if (scope_ == kFuncScope) { |
- if (expr->bounds().lower->IsFunction()) { |
- FunctionType* func_type = expr->bounds().lower->AsFunction(); |
+ if (bounds_->get(expr).lower->IsFunction()) { |
+ FunctionType* func_type = bounds_->get(expr).lower->AsFunction(); |
LocalType return_type = TypeFrom(func_type->Result()); |
current_function_builder_->ReturnType(return_type); |
for (int i = 0; i < expr->parameter_count(); i++) { |
@@ -523,7 +524,7 @@ class AsmWasmBuilderImpl : public AstVisitor { |
if (!value->IsNumber() || (scope_ != kFuncScope && scope_ != kInitScope)) { |
return; |
} |
- Type* type = expr->bounds().upper; |
+ Type* type = bounds_->get(expr).upper; |
if (type->Is(cache_.kAsmSigned)) { |
int32_t i = 0; |
if (!value->ToInt32(&i)) { |
@@ -585,7 +586,7 @@ class AsmWasmBuilderImpl : public AstVisitor { |
void AddFunctionTable(VariableProxy* table, ArrayLiteral* funcs) { |
FunctionType* func_type = |
- funcs->bounds().lower->AsArray()->Element()->AsFunction(); |
+ bounds_->get(funcs).lower->AsArray()->Element()->AsFunction(); |
LocalType return_type = TypeFrom(func_type->Result()); |
FunctionSig::Builder sig(zone(), return_type == kAstStmt ? 0 : 1, |
func_type->Arity()); |
@@ -758,8 +759,8 @@ class AsmWasmBuilderImpl : public AstVisitor { |
if (target_prop != nullptr) { |
// Left hand side is a property access, i.e. the asm.js heap. |
if (TypeOf(expr->value()) == kAstF64 && expr->target()->IsProperty() && |
- expr->target()->AsProperty()->obj()->bounds().lower->Is( |
- cache_.kFloat32Array)) { |
+ bounds_->get(expr->target()->AsProperty()->obj()) |
+ .lower->Is(cache_.kFloat32Array)) { |
current_function_builder_->Emit(kExprF32ConvertF64); |
} |
WasmOpcode opcode; |
@@ -799,7 +800,7 @@ class AsmWasmBuilderImpl : public AstVisitor { |
if (vp != nullptr && vp->var()->IsParameter() && |
vp->var()->index() == 1) { |
VariableProxy* target = expr->target()->AsVariableProxy(); |
- if (target->bounds().lower->Is(Type::Function())) { |
+ if (bounds_->get(target).lower->Is(Type::Function())) { |
const AstRawString* name = |
prop->key()->AsLiteral()->AsRawPropertyName(); |
imported_function_table_.AddImport(target->var(), name->raw_data(), |
@@ -811,7 +812,7 @@ class AsmWasmBuilderImpl : public AstVisitor { |
} |
ArrayLiteral* funcs = expr->value()->AsArrayLiteral(); |
if (funcs != nullptr && |
- funcs->bounds().lower->AsArray()->Element()->IsFunction()) { |
+ bounds_->get(funcs).lower->AsArray()->Element()->IsFunction()) { |
VariableProxy* target = expr->target()->AsVariableProxy(); |
DCHECK_NOT_NULL(target); |
AddFunctionTable(target, funcs); |
@@ -890,8 +891,8 @@ class AsmWasmBuilderImpl : public AstVisitor { |
void VisitPropertyAndEmitIndex(Property* expr, MachineType* mtype) { |
Expression* obj = expr->obj(); |
- DCHECK_EQ(obj->bounds().lower, obj->bounds().upper); |
- Type* type = obj->bounds().lower; |
+ DCHECK_EQ(bounds_->get(obj).lower, bounds_->get(obj).upper); |
+ Type* type = bounds_->get(obj).lower; |
int size; |
if (type->Is(cache_.kUint8Array)) { |
*mtype = MachineType::Uint8(); |
@@ -1261,7 +1262,7 @@ class AsmWasmBuilderImpl : public AstVisitor { |
uint16_t index; |
VariableProxy* vp = expr->expression()->AsVariableProxy(); |
if (vp != nullptr && |
- Type::Any()->Is(vp->bounds().lower->AsFunction()->Result())) { |
+ Type::Any()->Is(bounds_->get(vp).lower->AsFunction()->Result())) { |
LocalType return_type = TypeOf(expr); |
ZoneList<Expression*>* args = expr->arguments(); |
FunctionSig::Builder sig(zone(), return_type == kAstStmt ? 0 : 1, |
@@ -1582,8 +1583,8 @@ class AsmWasmBuilderImpl : public AstVisitor { |
} |
TypeIndex TypeIndexOf(Expression* expr) { |
- DCHECK_EQ(expr->bounds().lower, expr->bounds().upper); |
- Type* type = expr->bounds().lower; |
+ DCHECK_EQ(bounds_->get(expr).lower, bounds_->get(expr).upper); |
+ Type* type = bounds_->get(expr).lower; |
if (type->Is(cache_.kAsmFixnum)) { |
return kFixnum; |
} else if (type->Is(cache_.kAsmSigned)) { |
@@ -1688,8 +1689,8 @@ class AsmWasmBuilderImpl : public AstVisitor { |
} |
LocalType TypeOf(Expression* expr) { |
- DCHECK_EQ(expr->bounds().lower, expr->bounds().upper); |
- return TypeFrom(expr->bounds().lower); |
+ DCHECK_EQ(bounds_->get(expr).lower, bounds_->get(expr).upper); |
+ return TypeFrom(bounds_->get(expr).lower); |
} |
LocalType TypeFrom(Type* type) { |
@@ -1723,6 +1724,7 @@ class AsmWasmBuilderImpl : public AstVisitor { |
uint32_t next_table_index_; |
ZoneHashMap function_tables_; |
ImportedFunctionTable imported_function_table_; |
+ const AstTypeBounds* bounds_; |
DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); |