| Index: src/hydrogen.cc
|
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc
|
| index 6f349b79c4a1eac2e3b9ec332f49d63bd93071e7..79c8e03d664142b209171f0a59d756909e0d71f5 100644
|
| --- a/src/hydrogen.cc
|
| +++ b/src/hydrogen.cc
|
| @@ -9105,10 +9105,10 @@ bool HOptimizedGraphBuilder::TryHandleArrayCallNew(CallNew* expr,
|
| return false;
|
| }
|
|
|
| - BuildArrayCall(expr,
|
| - expr->arguments()->length(),
|
| - function,
|
| - expr->allocation_site());
|
| + Handle<AllocationSite> site = expr->allocation_site();
|
| + if (site.is_null()) return false;
|
| +
|
| + BuildArrayCall(expr, expr->arguments()->length(), function, site);
|
| return true;
|
| }
|
|
|
| @@ -9230,58 +9230,21 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) {
|
| // evaluation of the arguments.
|
| CHECK_ALIVE(VisitForValue(expr->expression()));
|
| HValue* function = Top();
|
| - if (expr->global_call()) {
|
| - Variable* var = proxy->var();
|
| - bool known_global_function = false;
|
| - // If there is a global property cell for the name at compile time and
|
| - // access check is not enabled we assume that the function will not change
|
| - // and generate optimized code for calling the function.
|
| - Handle<GlobalObject> global(current_info()->global_object());
|
| - LookupIterator it(global, var->name(),
|
| - LookupIterator::OWN_SKIP_INTERCEPTOR);
|
| - GlobalPropertyAccess type = LookupGlobalProperty(var, &it, LOAD);
|
| - if (type == kUseCell) {
|
| - known_global_function = expr->ComputeGlobalTarget(global, &it);
|
| - }
|
| - if (known_global_function) {
|
| - Add<HCheckValue>(function, expr->target());
|
| -
|
| - // Placeholder for the receiver.
|
| - Push(graph()->GetConstantUndefined());
|
| - CHECK_ALIVE(VisitExpressions(expr->arguments()));
|
| -
|
| - // Patch the global object on the stack by the expected receiver.
|
| - HValue* receiver = ImplicitReceiverFor(function, expr->target());
|
| - const int receiver_index = argument_count - 1;
|
| - environment()->SetExpressionStackAt(receiver_index, receiver);
|
| -
|
| - if (TryInlineBuiltinFunctionCall(expr)) {
|
| - if (FLAG_trace_inlining) {
|
| - PrintF("Inlining builtin ");
|
| - expr->target()->ShortPrint();
|
| - PrintF("\n");
|
| - }
|
| - return;
|
| - }
|
| - if (TryInlineApiFunctionCall(expr, receiver)) return;
|
| - if (TryHandleArrayCall(expr, function)) return;
|
| - if (TryInlineCall(expr)) return;
|
| + if (function->IsConstant() &&
|
| + HConstant::cast(function)->handle(isolate())->IsJSFunction()) {
|
| + Handle<Object> constant = HConstant::cast(function)->handle(isolate());
|
| + Handle<JSFunction> target = Handle<JSFunction>::cast(constant);
|
| + expr->SetKnownGlobalTarget(target);
|
| + }
|
|
|
| - PushArgumentsFromEnvironment(argument_count);
|
| - call = BuildCallConstantFunction(expr->target(), argument_count);
|
| - } else {
|
| - Push(graph()->GetConstantUndefined());
|
| - CHECK_ALIVE(VisitExpressions(expr->arguments()));
|
| - PushArgumentsFromEnvironment(argument_count);
|
| - call = New<HCallFunction>(function, argument_count);
|
| - }
|
| + // Placeholder for the receiver.
|
| + Push(graph()->GetConstantUndefined());
|
| + CHECK_ALIVE(VisitExpressions(expr->arguments()));
|
|
|
| - } else if (expr->IsMonomorphic()) {
|
| + if (expr->IsMonomorphic()) {
|
| Add<HCheckValue>(function, expr->target());
|
|
|
| - Push(graph()->GetConstantUndefined());
|
| - CHECK_ALIVE(VisitExpressions(expr->arguments()));
|
| -
|
| + // Patch the global object on the stack by the expected receiver.
|
| HValue* receiver = ImplicitReceiverFor(function, expr->target());
|
| const int receiver_index = argument_count - 1;
|
| environment()->SetExpressionStackAt(receiver_index, receiver);
|
| @@ -9295,15 +9258,12 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) {
|
| return;
|
| }
|
| if (TryInlineApiFunctionCall(expr, receiver)) return;
|
| -
|
| + if (TryHandleArrayCall(expr, function)) return;
|
| if (TryInlineCall(expr)) return;
|
|
|
| - call = PreProcessCall(New<HInvokeFunction>(
|
| - function, expr->target(), argument_count));
|
| -
|
| + PushArgumentsFromEnvironment(argument_count);
|
| + call = BuildCallConstantFunction(expr->target(), argument_count);
|
| } else {
|
| - Push(graph()->GetConstantUndefined());
|
| - CHECK_ALIVE(VisitExpressions(expr->arguments()));
|
| PushArgumentsFromEnvironment(argument_count);
|
| HCallFunction* call_function =
|
| New<HCallFunction>(function, argument_count);
|
| @@ -9442,6 +9402,12 @@ void HOptimizedGraphBuilder::VisitCallNew(CallNew* expr) {
|
| HValue* function = Top();
|
| CHECK_ALIVE(VisitExpressions(expr->arguments()));
|
|
|
| + if (function->IsConstant() &&
|
| + HConstant::cast(function)->handle(isolate())->IsJSFunction()) {
|
| + Handle<Object> constant = HConstant::cast(function)->handle(isolate());
|
| + expr->SetKnownGlobalTarget(Handle<JSFunction>::cast(constant));
|
| + }
|
| +
|
| if (FLAG_inline_construct &&
|
| expr->IsMonomorphic() &&
|
| IsAllocationInlineable(expr->target())) {
|
|
|