Index: src/crankshaft/hydrogen.h |
diff --git a/src/crankshaft/hydrogen.h b/src/crankshaft/hydrogen.h |
index 183ab051118f98ba26fb52e5e0d87aea60a6ff26..5c17a336e10354966ea6f0419c8318ee2d47144d 100644 |
--- a/src/crankshaft/hydrogen.h |
+++ b/src/crankshaft/hydrogen.h |
@@ -849,10 +849,9 @@ class TestContext final : public AstContext { |
class FunctionState final { |
public: |
- FunctionState(HOptimizedGraphBuilder* owner, |
- CompilationInfo* info, |
- InliningKind inlining_kind, |
- int inlining_id); |
+ FunctionState(HOptimizedGraphBuilder* owner, CompilationInfo* info, |
+ InliningKind inlining_kind, int inlining_id, |
+ TailCallMode tail_call_mode); |
~FunctionState(); |
CompilationInfo* compilation_info() { return compilation_info_; } |
@@ -867,6 +866,11 @@ class FunctionState final { |
FunctionState* outer() { return outer_; } |
+ TailCallMode ComputeTailCallMode(TailCallMode tail_call_mode) const { |
+ if (tail_call_mode_ == TailCallMode::kDisallow) return tail_call_mode_; |
+ return tail_call_mode; |
+ } |
+ |
HEnterInlined* entry() { return entry_; } |
void set_entry(HEnterInlined* entry) { entry_ = entry; } |
@@ -896,6 +900,10 @@ class FunctionState final { |
// The kind of call which is currently being inlined. |
InliningKind inlining_kind_; |
+ // Defines whether the calls with TailCallMode::kAllow in the function body |
+ // can be generated as tail calls. |
+ TailCallMode tail_call_mode_; |
+ |
// When inlining in an effect or value context, this is the return block. |
// It is NULL otherwise. When inlining in a test context, there are a |
// pair of return blocks in the context. When not inlining, there is no |
@@ -2396,7 +2404,8 @@ class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor { |
int InliningAstSize(Handle<JSFunction> target); |
bool TryInline(Handle<JSFunction> target, int arguments_count, |
HValue* implicit_return_value, BailoutId ast_id, |
- BailoutId return_id, InliningKind inlining_kind); |
+ BailoutId return_id, InliningKind inlining_kind, |
+ TailCallMode syntactic_tail_call_mode); |
bool TryInlineCall(Call* expr); |
bool TryInlineConstruct(CallNew* expr, HValue* implicit_return_value); |
@@ -2427,16 +2436,17 @@ class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor { |
BailoutId ast_id); |
bool TryInlineApiCall(Handle<Object> function, HValue* receiver, |
SmallMapList* receiver_maps, int argc, BailoutId ast_id, |
- ApiCallType call_type); |
+ ApiCallType call_type, |
+ TailCallMode syntactic_tail_call_mode); |
static bool IsReadOnlyLengthDescriptor(Handle<Map> jsarray_map); |
static bool CanInlineArrayResizeOperation(Handle<Map> receiver_map); |
// If --trace-inlining, print a line of the inlining trace. Inlining |
// succeeded if the reason string is NULL and failed if there is a |
// non-NULL reason string. |
- void TraceInline(Handle<JSFunction> target, |
- Handle<JSFunction> caller, |
- const char* failure_reason); |
+ void TraceInline(Handle<JSFunction> target, Handle<JSFunction> caller, |
+ const char* failure_reason, |
+ TailCallMode tail_call_mode = TailCallMode::kDisallow); |
void HandleGlobalVariableAssignment(Variable* var, HValue* value, |
FeedbackVectorSlot slot, |
@@ -2819,14 +2829,17 @@ class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor { |
Handle<Map> receiver_map); |
HInstruction* NewCallFunction(HValue* function, int argument_count, |
- ConvertReceiverMode convert_mode); |
+ ConvertReceiverMode convert_mode, |
+ TailCallMode tail_call_mode); |
HInstruction* NewCallFunctionViaIC(HValue* function, int argument_count, |
ConvertReceiverMode convert_mode, |
+ TailCallMode tail_call_mode, |
FeedbackVectorSlot slot); |
HInstruction* NewCallConstantFunction(Handle<JSFunction> target, |
- int argument_count); |
+ int argument_count, |
+ TailCallMode tail_call_mode); |
bool CanBeFunctionApplyArguments(Call* expr); |