| Index: src/ic/handler-compiler.cc
|
| diff --git a/src/ic/handler-compiler.cc b/src/ic/handler-compiler.cc
|
| index 4b253af197842a7cbd549ca5692fa5170a6cfff8..acf380fbee93f8c162e2463b76141d1d17e40fd3 100644
|
| --- a/src/ic/handler-compiler.cc
|
| +++ b/src/ic/handler-compiler.cc
|
| @@ -26,9 +26,8 @@ Handle<Code> PropertyHandlerCompiler::Find(Handle<Name> name,
|
|
|
|
|
| Handle<Code> NamedLoadHandlerCompiler::ComputeLoadNonexistent(
|
| - Handle<Name> name, Handle<HeapType> type) {
|
| + Handle<Name> name, Handle<Map> receiver_map) {
|
| Isolate* isolate = name->GetIsolate();
|
| - Handle<Map> receiver_map = IC::TypeToMap(*type, isolate);
|
| if (receiver_map->prototype()->IsNull()) {
|
| // TODO(jkummerow/verwaest): If there is no prototype and the property
|
| // is nonexistent, introduce a builtin to handle this (fast properties
|
| @@ -37,7 +36,7 @@ Handle<Code> NamedLoadHandlerCompiler::ComputeLoadNonexistent(
|
| }
|
| CacheHolderFlag flag;
|
| Handle<Map> stub_holder_map =
|
| - IC::GetHandlerCacheHolder(*type, false, isolate, &flag);
|
| + IC::GetHandlerCacheHolder(receiver_map, false, isolate, &flag);
|
|
|
| // If no dictionary mode objects are present in the prototype chain, the load
|
| // nonexistent IC stub can be shared for all names for a given map and we use
|
| @@ -62,7 +61,7 @@ Handle<Code> NamedLoadHandlerCompiler::ComputeLoadNonexistent(
|
| cache_name, stub_holder_map, Code::LOAD_IC, flag, Code::FAST);
|
| if (!handler.is_null()) return handler;
|
|
|
| - NamedLoadHandlerCompiler compiler(isolate, type, last, flag);
|
| + NamedLoadHandlerCompiler compiler(isolate, receiver_map, last, flag);
|
| handler = compiler.CompileLoadNonexistent(cache_name);
|
| Map::UpdateCodeCache(stub_holder_map, cache_name, handler);
|
| return handler;
|
| @@ -82,11 +81,6 @@ Handle<Code> PropertyHandlerCompiler::GetCode(Code::Kind kind,
|
| }
|
|
|
|
|
| -void PropertyHandlerCompiler::set_type_for_object(Handle<Object> object) {
|
| - type_ = IC::CurrentTypeOf(object, isolate());
|
| -}
|
| -
|
| -
|
| #define __ ACCESS_MASM(masm())
|
|
|
|
|
| @@ -95,13 +89,13 @@ Register NamedLoadHandlerCompiler::FrontendHeader(Register object_reg,
|
| Label* miss) {
|
| PrototypeCheckType check_type = CHECK_ALL_MAPS;
|
| int function_index = -1;
|
| - if (type()->Is(HeapType::String())) {
|
| + if (map()->instance_type() < FIRST_NONSTRING_TYPE) {
|
| function_index = Context::STRING_FUNCTION_INDEX;
|
| - } else if (type()->Is(HeapType::Symbol())) {
|
| + } else if (map()->instance_type() == SYMBOL_TYPE) {
|
| function_index = Context::SYMBOL_FUNCTION_INDEX;
|
| - } else if (type()->Is(HeapType::Number())) {
|
| + } else if (map()->instance_type() == HEAP_NUMBER_TYPE) {
|
| function_index = Context::NUMBER_FUNCTION_INDEX;
|
| - } else if (type()->Is(HeapType::Boolean())) {
|
| + } else if (*map() == isolate()->heap()->boolean_map()) {
|
| function_index = Context::BOOLEAN_FUNCTION_INDEX;
|
| } else {
|
| check_type = SKIP_RECEIVER;
|
| @@ -112,7 +106,8 @@ Register NamedLoadHandlerCompiler::FrontendHeader(Register object_reg,
|
| scratch1(), miss);
|
| Object* function = isolate()->native_context()->get(function_index);
|
| Object* prototype = JSFunction::cast(function)->instance_prototype();
|
| - set_type_for_object(handle(prototype, isolate()));
|
| + Handle<Map> map(JSObject::cast(prototype)->map());
|
| + set_map(map);
|
| object_reg = scratch1();
|
| }
|
|
|
| @@ -155,7 +150,7 @@ void PropertyHandlerCompiler::NonexistentFrontendHeader(Handle<Name> name,
|
| Handle<Map> last_map;
|
| if (holder().is_null()) {
|
| holder_reg = receiver();
|
| - last_map = IC::TypeToMap(*type(), isolate());
|
| + last_map = map();
|
| // If |type| has null as its prototype, |holder()| is
|
| // Handle<JSObject>::null().
|
| DCHECK(last_map->prototype() == isolate()->heap()->null_value());
|
| @@ -168,7 +163,7 @@ void PropertyHandlerCompiler::NonexistentFrontendHeader(Handle<Name> name,
|
| if (last_map->IsJSGlobalObjectMap()) {
|
| Handle<JSGlobalObject> global =
|
| holder().is_null()
|
| - ? Handle<JSGlobalObject>::cast(type()->AsConstant()->Value())
|
| + ? Handle<JSGlobalObject>::cast(isolate()->global_object())
|
| : Handle<JSGlobalObject>::cast(holder());
|
| GenerateCheckPropertyCell(masm(), global, name, scratch1, miss);
|
| } else {
|
| @@ -236,8 +231,7 @@ Handle<Code> NamedLoadHandlerCompiler::CompileLoadCallback(
|
| int accessor_index) {
|
| DCHECK(call_optimization.is_simple_api_call());
|
| Register holder = Frontend(name);
|
| - Handle<Map> receiver_map = IC::TypeToMap(*type(), isolate());
|
| - GenerateApiAccessorCall(masm(), call_optimization, receiver_map, receiver(),
|
| + GenerateApiAccessorCall(masm(), call_optimization, map(), receiver(),
|
| scratch2(), false, no_reg, holder, accessor_index);
|
| return GetCode(kind(), Code::FAST, name);
|
| }
|
| @@ -296,8 +290,8 @@ Handle<Code> NamedLoadHandlerCompiler::CompileLoadInterceptor(
|
| Handle<ExecutableAccessorInfo> info =
|
| Handle<ExecutableAccessorInfo>::cast(accessors);
|
| inline_followup = info->getter() != NULL &&
|
| - ExecutableAccessorInfo::IsCompatibleReceiverType(
|
| - isolate(), info, type());
|
| + ExecutableAccessorInfo::IsCompatibleReceiverMap(
|
| + isolate(), info, map());
|
| } else if (accessors->IsAccessorPair()) {
|
| Handle<JSObject> property_holder(it->GetHolder<JSObject>());
|
| Handle<Object> getter(Handle<AccessorPair>::cast(accessors)->getter(),
|
| @@ -306,9 +300,9 @@ Handle<Code> NamedLoadHandlerCompiler::CompileLoadInterceptor(
|
| if (!property_holder->HasFastProperties()) break;
|
| auto function = Handle<JSFunction>::cast(getter);
|
| CallOptimization call_optimization(function);
|
| - Handle<Map> receiver_map = IC::TypeToMap(*type(), isolate());
|
| + Handle<Map> receiver_map = map();
|
| inline_followup = call_optimization.is_simple_api_call() &&
|
| - call_optimization.IsCompatibleReceiverType(
|
| + call_optimization.IsCompatibleReceiverMap(
|
| receiver_map, property_holder);
|
| }
|
| }
|
| @@ -335,7 +329,8 @@ void NamedLoadHandlerCompiler::GenerateLoadPostInterceptor(
|
| LookupIterator* it, Register interceptor_reg) {
|
| Handle<JSObject> real_named_property_holder(it->GetHolder<JSObject>());
|
|
|
| - set_type_for_object(holder());
|
| + Handle<Map> holder_map(holder()->map());
|
| + set_map(holder_map);
|
| set_holder(real_named_property_holder);
|
|
|
| Label miss;
|
| @@ -369,8 +364,7 @@ void NamedLoadHandlerCompiler::GenerateLoadPostInterceptor(
|
| auto function = handle(JSFunction::cast(
|
| AccessorPair::cast(*it->GetAccessors())->getter()));
|
| CallOptimization call_optimization(function);
|
| - Handle<Map> receiver_map = IC::TypeToMap(*type(), isolate());
|
| - GenerateApiAccessorCall(masm(), call_optimization, receiver_map,
|
| + GenerateApiAccessorCall(masm(), call_optimization, holder_map,
|
| receiver(), scratch2(), false, no_reg, reg,
|
| it->GetAccessorIndex());
|
| }
|
| @@ -381,7 +375,7 @@ void NamedLoadHandlerCompiler::GenerateLoadPostInterceptor(
|
| Handle<Code> NamedLoadHandlerCompiler::CompileLoadViaGetter(
|
| Handle<Name> name, int accessor_index, int expected_arguments) {
|
| Register holder = Frontend(name);
|
| - GenerateLoadViaGetter(masm(), type(), receiver(), holder, accessor_index,
|
| + GenerateLoadViaGetter(masm(), map(), receiver(), holder, accessor_index,
|
| expected_arguments, scratch2());
|
| return GetCode(kind(), Code::FAST, name);
|
| }
|
| @@ -471,7 +465,7 @@ Handle<Code> NamedStoreHandlerCompiler::CompileStoreViaSetter(
|
| Handle<JSObject> object, Handle<Name> name, int accessor_index,
|
| int expected_arguments) {
|
| Register holder = Frontend(name);
|
| - GenerateStoreViaSetter(masm(), type(), receiver(), holder, accessor_index,
|
| + GenerateStoreViaSetter(masm(), map(), receiver(), holder, accessor_index,
|
| expected_arguments, scratch2());
|
|
|
| return GetCode(kind(), Code::FAST, name);
|
|
|