Index: src/compiler/bytecode-graph-builder.cc |
diff --git a/src/compiler/bytecode-graph-builder.cc b/src/compiler/bytecode-graph-builder.cc |
index a6c19af58fadc122923aca0f4b69bcdaa94db2c4..6a4d0c2f9d7719a6f894b1cc61f5bccc1c9d32fb 100644 |
--- a/src/compiler/bytecode-graph-builder.cc |
+++ b/src/compiler/bytecode-graph-builder.cc |
@@ -1041,7 +1041,7 @@ Node* BytecodeGraphBuilder::ProcessCallArguments(const Operator* call_op, |
return value; |
} |
-void BytecodeGraphBuilder::BuildCall() { |
+void BytecodeGraphBuilder::BuildCall(TailCallMode tail_call_mode) { |
FrameStateBeforeAndAfter states(this); |
// TODO(rmcilroy): Set receiver_hint correctly based on whether the receiver |
// register has been loaded with null / undefined explicitly or we are sure it |
@@ -1054,16 +1054,23 @@ void BytecodeGraphBuilder::BuildCall() { |
VectorSlotPair feedback = |
CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(3)); |
- // TODO(ishell): provide correct tail_call_mode value to CallFunction. |
const Operator* call = javascript()->CallFunction( |
- arg_count + 1, language_mode(), feedback, receiver_hint); |
+ arg_count + 1, language_mode(), feedback, receiver_hint, tail_call_mode); |
Node* value = ProcessCallArguments(call, callee, receiver, arg_count + 1); |
environment()->BindAccumulator(value, &states); |
} |
-void BytecodeGraphBuilder::VisitCall() { BuildCall(); } |
+void BytecodeGraphBuilder::VisitCall() { BuildCall(TailCallMode::kDisallow); } |
-void BytecodeGraphBuilder::VisitCallWide() { BuildCall(); } |
+void BytecodeGraphBuilder::VisitCallWide() { |
+ BuildCall(TailCallMode::kDisallow); |
+} |
+ |
+void BytecodeGraphBuilder::VisitTailCall() { BuildCall(TailCallMode::kAllow); } |
+ |
+void BytecodeGraphBuilder::VisitTailCallWide() { |
+ BuildCall(TailCallMode::kAllow); |
+} |
void BytecodeGraphBuilder::BuildCallJSRuntime() { |
FrameStateBeforeAndAfter states(this); |