Index: src/asmjs/asm-wasm-builder.cc |
diff --git a/src/asmjs/asm-wasm-builder.cc b/src/asmjs/asm-wasm-builder.cc |
index 30eb0274f925820ed0e2be154ad9535a69323307..e11b31ef24cd33a846aa86e342efe18fc8ea29fe 100644 |
--- a/src/asmjs/asm-wasm-builder.cc |
+++ b/src/asmjs/asm-wasm-builder.cc |
@@ -35,6 +35,20 @@ namespace wasm { |
if (HasStackOverflow()) return; \ |
} while (false) |
+#ifdef DEBUG |
+namespace { |
+bool IsChild(Expression* parent, Expression* child) { |
bradnelson
2016/12/07 19:19:06
IsBinOpChild ?
Clemens Hammacher
2016/12/08 10:50:23
I just removed the function completely :)
By stori
|
+ DCHECK_NOT_NULL(parent); |
+ if (parent->IsBinaryOperation()) { |
+ BinaryOperation* bin_op = static_cast<BinaryOperation*>(parent); |
+ return bin_op->left() == child || bin_op->right() == child; |
+ } |
+ UNREACHABLE(); |
+ return false; |
+} |
+} // namespace |
+#endif |
+ |
enum AsmScope { kModuleScope, kInitScope, kFuncScope, kExportScope }; |
enum ValueFate { kDrop, kLeaveOnStack }; |
@@ -71,7 +85,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_(nullptr) { |
InitializeAstVisitor(isolate); |
} |
@@ -1396,6 +1411,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. |
+ Expression* this_parent = parent_; |
+ |
switch (call_type) { |
case Call::OTHER_CALL: { |
VariableProxy* proxy = expr->expression()->AsVariableProxy(); |
@@ -1426,13 +1445,18 @@ 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, IsChild(this_parent, expr)); |
+ int pos = expr->position(); |
+ int parent_pos = returns_value ? this_parent->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()); |
@@ -1458,7 +1482,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 |
@@ -1630,6 +1655,7 @@ class AsmWasmBuilderImpl final : public AstVisitor<AsmWasmBuilderImpl> { |
void VisitBinaryOperation(BinaryOperation* expr) { |
ConvertOperation convertOperation = MatchBinaryOperation(expr); |
static const bool kDontIgnoreSign = false; |
+ parent_ = expr; |
if (convertOperation == kToDouble) { |
RECURSE(Visit(expr->left())); |
TypeIndex type = TypeIndexOf(expr->left(), kDontIgnoreSign); |
@@ -1933,6 +1959,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. |
+ Expression* parent_; |
DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); |