| Index: src/crankshaft/hydrogen.cc
|
| diff --git a/src/crankshaft/hydrogen.cc b/src/crankshaft/hydrogen.cc
|
| index 0e9ac8ad45fff2e9e905300a49c5b75902de693d..37417db171e64278de8c0deb033025c93ae2c13a 100644
|
| --- a/src/crankshaft/hydrogen.cc
|
| +++ b/src/crankshaft/hydrogen.cc
|
| @@ -6371,15 +6371,15 @@ bool HOptimizedGraphBuilder::PropertyAccessInfo::LoadResult(Handle<Map> map) {
|
| Object* raw_accessor =
|
| IsLoad() ? Handle<AccessorPair>::cast(accessors)->getter()
|
| : Handle<AccessorPair>::cast(accessors)->setter();
|
| - if (!raw_accessor->IsJSFunction()) return false;
|
| - Handle<JSFunction> accessor = handle(JSFunction::cast(raw_accessor));
|
| - if (accessor->shared()->IsApiFunction()) {
|
| - CallOptimization call_optimization(accessor);
|
| - if (call_optimization.is_simple_api_call()) {
|
| - CallOptimization::HolderLookup holder_lookup;
|
| - api_holder_ =
|
| - call_optimization.LookupHolderOfExpectedType(map_, &holder_lookup);
|
| - }
|
| + if (!raw_accessor->IsJSFunction() &&
|
| + !raw_accessor->IsFunctionTemplateInfo())
|
| + return false;
|
| + Handle<Object> accessor = handle(HeapObject::cast(raw_accessor));
|
| + CallOptimization call_optimization(accessor);
|
| + if (call_optimization.is_simple_api_call()) {
|
| + CallOptimization::HolderLookup holder_lookup;
|
| + api_holder_ =
|
| + call_optimization.LookupHolderOfExpectedType(map_, &holder_lookup);
|
| }
|
| accessor_ = accessor;
|
| } else if (IsDataConstant()) {
|
| @@ -6617,7 +6617,8 @@ HValue* HOptimizedGraphBuilder::BuildMonomorphicAccess(
|
| Push(value);
|
| }
|
|
|
| - if (info->NeedsWrappingFor(info->accessor())) {
|
| + if (info->accessor()->IsJSFunction() &&
|
| + info->NeedsWrappingFor(Handle<JSFunction>::cast(info->accessor()))) {
|
| HValue* function = Add<HConstant>(info->accessor());
|
| PushArgumentsFromEnvironment(argument_count);
|
| return New<HCallFunction>(function, argument_count,
|
| @@ -6632,7 +6633,12 @@ HValue* HOptimizedGraphBuilder::BuildMonomorphicAccess(
|
| }
|
|
|
| PushArgumentsFromEnvironment(argument_count);
|
| - return BuildCallConstantFunction(info->accessor(), argument_count);
|
| + if (!info->accessor()->IsJSFunction()) {
|
| + Bailout(kInliningBailedOut);
|
| + return nullptr;
|
| + }
|
| + return BuildCallConstantFunction(Handle<JSFunction>::cast(info->accessor()),
|
| + argument_count);
|
| }
|
|
|
| DCHECK(info->IsDataConstant());
|
| @@ -8666,24 +8672,25 @@ bool HOptimizedGraphBuilder::TryInlineConstruct(CallNew* expr,
|
| CONSTRUCT_CALL_RETURN);
|
| }
|
|
|
| -
|
| -bool HOptimizedGraphBuilder::TryInlineGetter(Handle<JSFunction> getter,
|
| +bool HOptimizedGraphBuilder::TryInlineGetter(Handle<Object> getter,
|
| Handle<Map> receiver_map,
|
| BailoutId ast_id,
|
| BailoutId return_id) {
|
| if (TryInlineApiGetter(getter, receiver_map, ast_id)) return true;
|
| - return TryInline(getter, 0, NULL, ast_id, return_id, GETTER_CALL_RETURN);
|
| + return getter->IsJSFunction() &&
|
| + TryInline(Handle<JSFunction>::cast(getter), 0, NULL, ast_id, return_id,
|
| + GETTER_CALL_RETURN);
|
| }
|
|
|
| -
|
| -bool HOptimizedGraphBuilder::TryInlineSetter(Handle<JSFunction> setter,
|
| +bool HOptimizedGraphBuilder::TryInlineSetter(Handle<Object> setter,
|
| Handle<Map> receiver_map,
|
| BailoutId id,
|
| BailoutId assignment_id,
|
| HValue* implicit_return_value) {
|
| if (TryInlineApiSetter(setter, receiver_map, id)) return true;
|
| - return TryInline(setter, 1, implicit_return_value, id, assignment_id,
|
| - SETTER_CALL_RETURN);
|
| + return setter->IsJSFunction() &&
|
| + TryInline(Handle<JSFunction>::cast(setter), 1, implicit_return_value,
|
| + id, assignment_id, SETTER_CALL_RETURN);
|
| }
|
|
|
|
|
| @@ -9177,8 +9184,7 @@ bool HOptimizedGraphBuilder::TryInlineApiMethodCall(
|
| kCallApiMethod);
|
| }
|
|
|
| -
|
| -bool HOptimizedGraphBuilder::TryInlineApiGetter(Handle<JSFunction> function,
|
| +bool HOptimizedGraphBuilder::TryInlineApiGetter(Handle<Object> function,
|
| Handle<Map> receiver_map,
|
| BailoutId ast_id) {
|
| SmallMapList receiver_maps(1, zone());
|
| @@ -9191,8 +9197,7 @@ bool HOptimizedGraphBuilder::TryInlineApiGetter(Handle<JSFunction> function,
|
| kCallApiGetter);
|
| }
|
|
|
| -
|
| -bool HOptimizedGraphBuilder::TryInlineApiSetter(Handle<JSFunction> function,
|
| +bool HOptimizedGraphBuilder::TryInlineApiSetter(Handle<Object> function,
|
| Handle<Map> receiver_map,
|
| BailoutId ast_id) {
|
| SmallMapList receiver_maps(1, zone());
|
| @@ -9205,15 +9210,14 @@ bool HOptimizedGraphBuilder::TryInlineApiSetter(Handle<JSFunction> function,
|
| kCallApiSetter);
|
| }
|
|
|
| -
|
| -bool HOptimizedGraphBuilder::TryInlineApiCall(Handle<JSFunction> function,
|
| - HValue* receiver,
|
| - SmallMapList* receiver_maps,
|
| - int argc,
|
| - BailoutId ast_id,
|
| - ApiCallType call_type) {
|
| - if (function->context()->native_context() !=
|
| - top_info()->closure()->context()->native_context()) {
|
| +bool HOptimizedGraphBuilder::TryInlineApiCall(Handle<Object> function,
|
| + HValue* receiver,
|
| + SmallMapList* receiver_maps,
|
| + int argc, BailoutId ast_id,
|
| + ApiCallType call_type) {
|
| + if (function->IsJSFunction() &&
|
| + Handle<JSFunction>::cast(function)->context()->native_context() !=
|
| + top_info()->closure()->context()->native_context()) {
|
| return false;
|
| }
|
| CallOptimization optimization(function);
|
| @@ -9228,8 +9232,11 @@ bool HOptimizedGraphBuilder::TryInlineApiCall(Handle<JSFunction> function,
|
| // Cannot embed a direct reference to the global proxy map
|
| // as it maybe dropped on deserialization.
|
| CHECK(!isolate()->serializer_enabled());
|
| + DCHECK(function->IsJSFunction());
|
| DCHECK_EQ(0, receiver_maps->length());
|
| - receiver_maps->Add(handle(function->global_proxy()->map()), zone());
|
| + receiver_maps->Add(
|
| + handle(Handle<JSFunction>::cast(function)->global_proxy()->map()),
|
| + zone());
|
| }
|
| CallOptimization::HolderLookup holder_lookup =
|
| CallOptimization::kHolderNotFound;
|
| @@ -9309,7 +9316,8 @@ bool HOptimizedGraphBuilder::TryInlineApiCall(Handle<JSFunction> function,
|
|
|
| HInstruction* call = nullptr;
|
| if (!is_function) {
|
| - CallApiAccessorStub stub(isolate(), is_store, call_data_undefined);
|
| + CallApiAccessorStub stub(isolate(), is_store, call_data_undefined,
|
| + !optimization.is_constant_call());
|
| Handle<Code> code = stub.GetCode();
|
| HConstant* code_value = Add<HConstant>(code);
|
| ApiAccessorDescriptor descriptor(isolate());
|
|
|