| Index: src/crankshaft/hydrogen.cc
|
| diff --git a/src/crankshaft/hydrogen.cc b/src/crankshaft/hydrogen.cc
|
| index 0a4b4f99a25fa368ca387677dbcc64dbbbd57032..e64b121930e58ca1513f5d172dc77f867882c339 100644
|
| --- a/src/crankshaft/hydrogen.cc
|
| +++ b/src/crankshaft/hydrogen.cc
|
| @@ -10481,19 +10481,26 @@ void HOptimizedGraphBuilder::VisitCallRuntime(CallRuntime* expr) {
|
| DCHECK(current_block() != NULL);
|
| DCHECK(current_block()->HasPredecessor());
|
| if (expr->is_jsruntime()) {
|
| + // Crankshaft always specializes to the native context, so we can just grab
|
| + // the constant function from the current native context and embed that into
|
| + // the code object.
|
| + Handle<JSFunction> known_function(
|
| + JSFunction::cast(
|
| + current_info()->native_context()->get(expr->context_index())),
|
| + isolate());
|
| +
|
| // The callee and the receiver both have to be pushed onto the operand stack
|
| // before arguments are being evaluated.
|
| - HValue* function = AddLoadJSBuiltin(expr->context_index());
|
| - HValue* receiver = graph()->GetConstantUndefined();
|
| + HConstant* function = Add<HConstant>(known_function);
|
| + HValue* receiver = ImplicitReceiverFor(function, known_function);
|
| Push(function);
|
| Push(receiver);
|
|
|
| int argument_count = expr->arguments()->length() + 1; // Count receiver.
|
| CHECK_ALIVE(VisitExpressions(expr->arguments()));
|
| PushArgumentsFromEnvironment(argument_count);
|
| - HInstruction* call = NewCallFunction(function, argument_count,
|
| - ConvertReceiverMode::kNullOrUndefined,
|
| - TailCallMode::kDisallow);
|
| + HInstruction* call = NewCallConstantFunction(known_function, argument_count,
|
| + TailCallMode::kDisallow);
|
| Drop(1); // Function
|
| return ast_context()->ReturnInstruction(call, expr->id());
|
| }
|
|
|