From ace975935938aaa9d029cb9baaee37a15a94d56d Mon Sep 17 00:00:00 2001 From: "mstarzinger@chromium.org" Date: Wed, 25 Jun 2014 16:02:49 +0000 Subject: [PATCH] Allow inlining of functions containing %_ArgumentsLength. R=svenpanne@chromium.org Review URL: https://codereview.chromium.org/355833002 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22020 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/ast.cc | 8 +++----- src/hydrogen.cc | 16 ++++++++++------ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/ast.cc b/src/ast.cc index 53d2799..bf16b9c 100644 --- a/src/ast.cc +++ b/src/ast.cc @@ -1117,11 +1117,9 @@ void AstConstructionVisitor::VisitCallRuntime(CallRuntime* node) { // optimize them. add_flag(kDontInline); } else if (node->function()->intrinsic_type == Runtime::INLINE && - (node->raw_name()->IsOneByteEqualTo("_ArgumentsLength") || - node->raw_name()->IsOneByteEqualTo("_Arguments"))) { - // Don't inline the %_ArgumentsLength or %_Arguments because their - // implementation will not work. There is no stack frame to get them - // from. + node->raw_name()->IsOneByteEqualTo("_Arguments")) { + // Don't inline the %_Arguments because it's implementation will not work. + // There is no stack frame to get them from. add_flag(kDontInline); } } diff --git a/src/hydrogen.cc b/src/hydrogen.cc index 6ae1466..d447bbc 100644 --- a/src/hydrogen.cc +++ b/src/hydrogen.cc @@ -11310,13 +11310,17 @@ void HOptimizedGraphBuilder::GenerateIsConstructCall(CallRuntime* call) { // Support for arguments.length and arguments[?]. void HOptimizedGraphBuilder::GenerateArgumentsLength(CallRuntime* call) { - // Our implementation of arguments (based on this stack frame or an - // adapter below it) does not work for inlined functions. This runtime - // function is blacklisted by AstNode::IsInlineable. - ASSERT(function_state()->outer() == NULL); ASSERT(call->arguments()->length() == 0); - HInstruction* elements = Add(false); - HArgumentsLength* result = New(elements); + HInstruction* result = NULL; + if (function_state()->outer() == NULL) { + HInstruction* elements = Add(false); + result = New(elements); + } else { + // Number of arguments without receiver. + int argument_count = environment()-> + arguments_environment()->parameter_count() - 1; + result = New(argument_count); + } return ast_context()->ReturnInstruction(result, call->id()); } -- 2.7.4