| Index: src/asmjs/asm-wasm-builder.cc
|
| diff --git a/src/asmjs/asm-wasm-builder.cc b/src/asmjs/asm-wasm-builder.cc
|
| index 9415a84521e2c276ff8dc319fd46fab9ff2da274..f928ae1b97e4bcdbe9e9785f16a181d0a281e50f 100644
|
| --- a/src/asmjs/asm-wasm-builder.cc
|
| +++ b/src/asmjs/asm-wasm-builder.cc
|
| @@ -71,7 +71,8 @@ class AsmWasmBuilderImpl final : public AstVisitor<AsmWasmBuilderImpl> {
|
| foreign_init_function_(nullptr),
|
| function_tables_(ZoneHashMap::kDefaultHashMapCapacity,
|
| ZoneAllocationPolicy(zone)),
|
| - imported_function_table_(this) {
|
| + imported_function_table_(this),
|
| + parent_binop_(nullptr) {
|
| InitializeAstVisitor(isolate);
|
| }
|
|
|
| @@ -1398,6 +1399,10 @@ class AsmWasmBuilderImpl final : public AstVisitor<AsmWasmBuilderImpl> {
|
| bool VisitCallExpression(Call* expr) {
|
| Call::CallType call_type = expr->GetCallType();
|
| bool returns_value = true;
|
| +
|
| + // Save the parent now, it might be overwritten in VisitCallArgs.
|
| + BinaryOperation* parent_binop = parent_binop_;
|
| +
|
| switch (call_type) {
|
| case Call::OTHER_CALL: {
|
| VariableProxy* proxy = expr->expression()->AsVariableProxy();
|
| @@ -1428,13 +1433,20 @@ class AsmWasmBuilderImpl final : public AstVisitor<AsmWasmBuilderImpl> {
|
| uint32_t index = imported_function_table_.LookupOrInsertImportUse(
|
| vp->var(), sig.Build());
|
| VisitCallArgs(expr);
|
| - current_function_builder_->AddAsmWasmOffset(expr->position());
|
| + // For non-void functions, we must know the parent node.
|
| + DCHECK_IMPLIES(returns_value, parent_binop != nullptr);
|
| + DCHECK_IMPLIES(returns_value, parent_binop->left() == expr ||
|
| + parent_binop->right() == expr);
|
| + int pos = expr->position();
|
| + int parent_pos = returns_value ? parent_binop->position() : pos;
|
| + current_function_builder_->AddAsmWasmOffset(pos, parent_pos);
|
| current_function_builder_->Emit(kExprCallFunction);
|
| current_function_builder_->EmitVarInt(index);
|
| } else {
|
| WasmFunctionBuilder* function = LookupOrInsertFunction(vp->var());
|
| VisitCallArgs(expr);
|
| - current_function_builder_->AddAsmWasmOffset(expr->position());
|
| + current_function_builder_->AddAsmWasmOffset(expr->position(),
|
| + expr->position());
|
| current_function_builder_->Emit(kExprCallFunction);
|
| current_function_builder_->EmitDirectCallIndex(
|
| function->func_index());
|
| @@ -1460,7 +1472,8 @@ class AsmWasmBuilderImpl final : public AstVisitor<AsmWasmBuilderImpl> {
|
| VisitCallArgs(expr);
|
|
|
| current_function_builder_->EmitGetLocal(tmp.index());
|
| - current_function_builder_->AddAsmWasmOffset(expr->position());
|
| + current_function_builder_->AddAsmWasmOffset(expr->position(),
|
| + expr->position());
|
| current_function_builder_->Emit(kExprCallIndirect);
|
| current_function_builder_->EmitVarInt(indices->signature_index);
|
| current_function_builder_->EmitVarInt(0); // table index
|
| @@ -1632,6 +1645,7 @@ class AsmWasmBuilderImpl final : public AstVisitor<AsmWasmBuilderImpl> {
|
| void VisitBinaryOperation(BinaryOperation* expr) {
|
| ConvertOperation convertOperation = MatchBinaryOperation(expr);
|
| static const bool kDontIgnoreSign = false;
|
| + parent_binop_ = expr;
|
| if (convertOperation == kToDouble) {
|
| RECURSE(Visit(expr->left()));
|
| TypeIndex type = TypeIndexOf(expr->left(), kDontIgnoreSign);
|
| @@ -1935,6 +1949,9 @@ class AsmWasmBuilderImpl final : public AstVisitor<AsmWasmBuilderImpl> {
|
| uint32_t next_table_index_;
|
| ZoneHashMap function_tables_;
|
| ImportedFunctionTable imported_function_table_;
|
| + // Remember the parent node for reporting the correct location for ToNumber
|
| + // conversions after calls.
|
| + BinaryOperation* parent_binop_;
|
|
|
| DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
|
|
|
|
|