Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index b2635f5836a7bc5d1faade15ac684e87f0b47841..afb963b8ab9b5b31be3f46381d1ece8fe3a8f7a8 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -7661,6 +7661,38 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinMethodCall( |
ast_context()->ReturnValue(result); |
return true; |
} |
+ case kArrayPush: { |
+ if (!expr->IsMonomorphic() || expr->check_type() != RECEIVER_MAP_CHECK) { |
+ return false; |
+ } |
+ if (receiver_map->instance_type() != JS_ARRAY_TYPE) return false; |
+ ElementsKind elements_kind = receiver_map->elements_kind(); |
+ if (!IsFastElementsKind(elements_kind)) return false; |
+ AddCheckConstantFunction(expr->holder(), receiver, receiver_map); |
+ |
+ HValue* op_vals[] = { |
+ context(), |
+ // Receiver. |
+ environment()->ExpressionStackAt(expr->arguments()->length()) |
+ }; |
+ |
+ const int argc = expr->arguments()->length(); |
+ // Includes receiver. |
+ PushArgumentsFromEnvironment(argc + 1); |
+ |
+ CallInterfaceDescriptor* descriptor = |
+ isolate()->call_descriptor(Isolate::CallHandler); |
+ |
+ ArrayPushStub stub(receiver_map->elements_kind(), argc); |
+ Handle<Code> code = stub.GetCode(isolate()); |
+ HConstant* code_value = Add<HConstant>(code); |
+ |
+ HInstruction* call = New<HCallWithDescriptor>( |
+ code_value, argc + 1, descriptor, |
+ Vector<HValue*>(op_vals, descriptor->environment_length())); |
mvstanton
2014/01/23 09:17:03
ASSERT that op_vals[] length and descriptor->envir
|
+ ast_context()->ReturnInstruction(call, expr->id()); |
+ return true; |
+ } |
default: |
// Not yet supported for inlining. |
break; |