Reland "Allow inlining of functions containing %_ArgumentsLength."
The layout test failures were unrelated to this change. R=svenpanne@chromium.org TBR=svenpanne@chromium.org Review URL: https://codereview.chromium.org/355993002 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22038 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
7f5c66b26b
commit
1824edd6bc
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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<HArgumentsElements>(false);
|
||||
HArgumentsLength* result = New<HArgumentsLength>(elements);
|
||||
HInstruction* result = NULL;
|
||||
if (function_state()->outer() == NULL) {
|
||||
HInstruction* elements = Add<HArgumentsElements>(false);
|
||||
result = New<HArgumentsLength>(elements);
|
||||
} else {
|
||||
// Number of arguments without receiver.
|
||||
int argument_count = environment()->
|
||||
arguments_environment()->parameter_count() - 1;
|
||||
result = New<HConstant>(argument_count);
|
||||
}
|
||||
return ast_context()->ReturnInstruction(result, call->id());
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user