Chromium Code Reviews| 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; |