| Index: src/stub-cache.cc
|
| diff --git a/src/stub-cache.cc b/src/stub-cache.cc
|
| index 78a217bb61a06b124ab19d511fd9657f2c27acc0..a40f7c6700bac559a94fae98a9bbad807bde271a 100644
|
| --- a/src/stub-cache.cc
|
| +++ b/src/stub-cache.cc
|
| @@ -198,8 +198,8 @@ Handle<Code> NamedLoadHandlerCompiler::ComputeLoadNonexistent(
|
| cache_name, stub_holder_map, Code::LOAD_IC, flag, Code::FAST);
|
| if (!handler.is_null()) return handler;
|
|
|
| - NamedLoadHandlerCompiler compiler(isolate, flag);
|
| - handler = compiler.CompileLoadNonexistent(type, last, cache_name);
|
| + NamedLoadHandlerCompiler compiler(isolate, type, flag);
|
| + handler = compiler.CompileLoadNonexistent(last, cache_name);
|
| Map::UpdateCodeCache(stub_holder_map, cache_name, handler);
|
| return handler;
|
| }
|
| @@ -492,25 +492,27 @@ void StubCache::CollectMatchingMaps(SmallMapList* types,
|
|
|
|
|
| RUNTIME_FUNCTION(StoreCallbackProperty) {
|
| - JSObject* receiver = JSObject::cast(args[0]);
|
| - JSObject* holder = JSObject::cast(args[1]);
|
| - ExecutableAccessorInfo* callback = ExecutableAccessorInfo::cast(args[2]);
|
| + Handle<JSObject> receiver = args.at<JSObject>(0);
|
| + Handle<JSObject> holder = args.at<JSObject>(1);
|
| + Handle<ExecutableAccessorInfo> callback = args.at<ExecutableAccessorInfo>(2);
|
| + Handle<Name> name = args.at<Name>(3);
|
| + Handle<Object> value = args.at<Object>(4);
|
| + HandleScope scope(isolate);
|
| +
|
| + ASSERT(callback->IsCompatibleReceiver(*receiver));
|
| +
|
| Address setter_address = v8::ToCData<Address>(callback->setter());
|
| v8::AccessorSetterCallback fun =
|
| FUNCTION_CAST<v8::AccessorSetterCallback>(setter_address);
|
| ASSERT(fun != NULL);
|
| - ASSERT(callback->IsCompatibleReceiver(receiver));
|
| - Handle<Name> name = args.at<Name>(3);
|
| - Handle<Object> value = args.at<Object>(4);
|
| - HandleScope scope(isolate);
|
|
|
| // TODO(rossberg): Support symbols in the API.
|
| if (name->IsSymbol()) return *value;
|
| Handle<String> str = Handle<String>::cast(name);
|
|
|
| - LOG(isolate, ApiNamedPropertyAccess("store", receiver, *name));
|
| - PropertyCallbackArguments
|
| - custom_args(isolate, callback->data(), receiver, holder);
|
| + LOG(isolate, ApiNamedPropertyAccess("store", *receiver, *name));
|
| + PropertyCallbackArguments custom_args(isolate, callback->data(), *receiver,
|
| + *holder);
|
| custom_args.Call(fun, v8::Utils::ToLocal(str), v8::Utils::ToLocal(value));
|
| RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
|
| return *value;
|
| @@ -741,20 +743,19 @@ Handle<Code> PropertyAccessCompiler::GetCodeWithFlags(Code::Flags flags,
|
| #define __ ACCESS_MASM(masm())
|
|
|
|
|
| -Register NamedLoadHandlerCompiler::FrontendHeader(Handle<HeapType> type,
|
| - Register object_reg,
|
| +Register NamedLoadHandlerCompiler::FrontendHeader(Register object_reg,
|
| Handle<JSObject> holder,
|
| Handle<Name> name,
|
| Label* miss) {
|
| PrototypeCheckType check_type = CHECK_ALL_MAPS;
|
| int function_index = -1;
|
| - if (type->Is(HeapType::String())) {
|
| + if (type()->Is(HeapType::String())) {
|
| function_index = Context::STRING_FUNCTION_INDEX;
|
| - } else if (type->Is(HeapType::Symbol())) {
|
| + } else if (type()->Is(HeapType::Symbol())) {
|
| function_index = Context::SYMBOL_FUNCTION_INDEX;
|
| - } else if (type->Is(HeapType::Number())) {
|
| + } else if (type()->Is(HeapType::Number())) {
|
| function_index = Context::NUMBER_FUNCTION_INDEX;
|
| - } else if (type->Is(HeapType::Boolean())) {
|
| + } else if (type()->Is(HeapType::Boolean())) {
|
| function_index = Context::BOOLEAN_FUNCTION_INDEX;
|
| } else {
|
| check_type = SKIP_RECEIVER;
|
| @@ -765,26 +766,24 @@ Register NamedLoadHandlerCompiler::FrontendHeader(Handle<HeapType> type,
|
| masm(), function_index, scratch1(), miss);
|
| Object* function = isolate()->native_context()->get(function_index);
|
| Object* prototype = JSFunction::cast(function)->instance_prototype();
|
| - type = IC::CurrentTypeOf(handle(prototype, isolate()), isolate());
|
| + set_type_for_object(handle(prototype, isolate()));
|
| object_reg = scratch1();
|
| }
|
|
|
| // Check that the maps starting from the prototype haven't changed.
|
| - return CheckPrototypes(
|
| - type, object_reg, holder, scratch1(), scratch2(), scratch3(),
|
| - name, miss, check_type);
|
| + return CheckPrototypes(object_reg, holder, scratch1(), scratch2(), scratch3(),
|
| + name, miss, check_type);
|
| }
|
|
|
|
|
| // Frontend for store uses the name register. It has to be restored before a
|
| // miss.
|
| -Register NamedStoreHandlerCompiler::FrontendHeader(Handle<HeapType> type,
|
| - Register object_reg,
|
| +Register NamedStoreHandlerCompiler::FrontendHeader(Register object_reg,
|
| Handle<JSObject> holder,
|
| Handle<Name> name,
|
| Label* miss) {
|
| - return CheckPrototypes(type, object_reg, holder, this->name(),
|
| - scratch1(), scratch2(), name, miss, SKIP_RECEIVER);
|
| + return CheckPrototypes(object_reg, holder, this->name(), scratch1(),
|
| + scratch2(), name, miss, SKIP_RECEIVER);
|
| }
|
|
|
|
|
| @@ -796,19 +795,17 @@ bool PropertyICCompiler::IncludesNumberType(TypeHandleList* types) {
|
| }
|
|
|
|
|
| -Register PropertyHandlerCompiler::Frontend(Handle<HeapType> type,
|
| - Register object_reg,
|
| +Register PropertyHandlerCompiler::Frontend(Register object_reg,
|
| Handle<JSObject> holder,
|
| Handle<Name> name) {
|
| Label miss;
|
| - Register reg = FrontendHeader(type, object_reg, holder, name, &miss);
|
| + Register reg = FrontendHeader(object_reg, holder, name, &miss);
|
| FrontendFooter(name, &miss);
|
| return reg;
|
| }
|
|
|
|
|
| -void NamedLoadHandlerCompiler::NonexistentFrontend(Handle<HeapType> type,
|
| - Handle<JSObject> last,
|
| +void NamedLoadHandlerCompiler::NonexistentFrontend(Handle<JSObject> last,
|
| Handle<Name> name) {
|
| Label miss;
|
|
|
| @@ -816,11 +813,11 @@ void NamedLoadHandlerCompiler::NonexistentFrontend(Handle<HeapType> type,
|
| Handle<Map> last_map;
|
| if (last.is_null()) {
|
| holder = receiver();
|
| - last_map = IC::TypeToMap(*type, isolate());
|
| + last_map = IC::TypeToMap(*type(), isolate());
|
| // If |type| has null as its prototype, |last| is Handle<JSObject>::null().
|
| ASSERT(last_map->prototype() == isolate()->heap()->null_value());
|
| } else {
|
| - holder = FrontendHeader(type, receiver(), last, name, &miss);
|
| + holder = FrontendHeader(receiver(), last, name, &miss);
|
| last_map = handle(last->map());
|
| }
|
|
|
| @@ -841,9 +838,10 @@ void NamedLoadHandlerCompiler::NonexistentFrontend(Handle<HeapType> type,
|
| // If the last object in the prototype chain is a global object,
|
| // check that the global property cell is empty.
|
| if (last_map->IsJSGlobalObjectMap()) {
|
| - Handle<JSGlobalObject> global = last.is_null()
|
| - ? Handle<JSGlobalObject>::cast(type->AsConstant()->Value())
|
| - : Handle<JSGlobalObject>::cast(last);
|
| + Handle<JSGlobalObject> global =
|
| + last.is_null()
|
| + ? Handle<JSGlobalObject>::cast(type()->AsConstant()->Value())
|
| + : Handle<JSGlobalObject>::cast(last);
|
| GenerateCheckPropertyCell(masm(), global, name, scratch2(), &miss);
|
| }
|
|
|
| @@ -852,39 +850,38 @@ void NamedLoadHandlerCompiler::NonexistentFrontend(Handle<HeapType> type,
|
|
|
|
|
| Handle<Code> NamedLoadHandlerCompiler::CompileLoadField(
|
| - Handle<HeapType> type, Handle<JSObject> holder, Handle<Name> name,
|
| - FieldIndex field, Representation representation) {
|
| - Register reg = Frontend(type, receiver(), holder, name);
|
| + Handle<JSObject> holder, Handle<Name> name, FieldIndex field,
|
| + Representation representation) {
|
| + Register reg = Frontend(receiver(), holder, name);
|
| GenerateLoadField(reg, holder, field, representation);
|
| return GetCode(kind(), Code::FAST, name);
|
| }
|
|
|
|
|
| Handle<Code> NamedLoadHandlerCompiler::CompileLoadConstant(
|
| - Handle<HeapType> type, Handle<JSObject> holder, Handle<Name> name,
|
| - Handle<Object> value) {
|
| - Frontend(type, receiver(), holder, name);
|
| + Handle<JSObject> holder, Handle<Name> name, Handle<Object> value) {
|
| + Frontend(receiver(), holder, name);
|
| GenerateLoadConstant(value);
|
| return GetCode(kind(), Code::FAST, name);
|
| }
|
|
|
|
|
| Handle<Code> NamedLoadHandlerCompiler::CompileLoadCallback(
|
| - Handle<HeapType> type, Handle<JSObject> holder, Handle<Name> name,
|
| + Handle<JSObject> holder, Handle<Name> name,
|
| Handle<ExecutableAccessorInfo> callback) {
|
| - Register reg = CallbackFrontend(type, receiver(), holder, name, callback);
|
| + Register reg = CallbackFrontend(receiver(), holder, name, callback);
|
| GenerateLoadCallback(reg, callback);
|
| return GetCode(kind(), Code::FAST, name);
|
| }
|
|
|
|
|
| Handle<Code> NamedLoadHandlerCompiler::CompileLoadCallback(
|
| - Handle<HeapType> type, Handle<JSObject> holder, Handle<Name> name,
|
| + Handle<JSObject> holder, Handle<Name> name,
|
| const CallOptimization& call_optimization) {
|
| ASSERT(call_optimization.is_simple_api_call());
|
| Handle<JSFunction> callback = call_optimization.constant_function();
|
| - CallbackFrontend(type, receiver(), holder, name, callback);
|
| - Handle<Map>receiver_map = IC::TypeToMap(*type, isolate());
|
| + CallbackFrontend(receiver(), holder, name, callback);
|
| + Handle<Map> receiver_map = IC::TypeToMap(*type(), isolate());
|
| GenerateFastApiCall(
|
| masm(), call_optimization, receiver_map,
|
| receiver(), scratch1(), false, 0, NULL);
|
| @@ -893,7 +890,7 @@ Handle<Code> NamedLoadHandlerCompiler::CompileLoadCallback(
|
|
|
|
|
| Handle<Code> NamedLoadHandlerCompiler::CompileLoadInterceptor(
|
| - Handle<HeapType> type, Handle<JSObject> holder, Handle<Name> name) {
|
| + Handle<JSObject> holder, Handle<Name> name) {
|
| // Perform a lookup after the interceptor.
|
| LookupResult lookup(isolate());
|
| holder->LookupOwnRealNamedProperty(name, &lookup);
|
| @@ -904,10 +901,10 @@ Handle<Code> NamedLoadHandlerCompiler::CompileLoadInterceptor(
|
| }
|
| }
|
|
|
| - Register reg = Frontend(type, receiver(), holder, name);
|
| + Register reg = Frontend(receiver(), holder, name);
|
| // TODO(368): Compile in the whole chain: all the interceptors in
|
| // prototypes and ultimate answer.
|
| - GenerateLoadInterceptor(reg, type, holder, &lookup, name);
|
| + GenerateLoadInterceptor(reg, holder, &lookup, name);
|
| return GetCode(kind(), Code::FAST, name);
|
| }
|
|
|
| @@ -924,8 +921,8 @@ void NamedLoadHandlerCompiler::GenerateLoadPostInterceptor(
|
| } else {
|
| // We found FIELD property in prototype chain of interceptor's holder.
|
| // Retrieve a field from field's holder.
|
| - Register reg = Frontend(IC::CurrentTypeOf(interceptor_holder, isolate()),
|
| - interceptor_reg, holder, name);
|
| + set_type_for_object(interceptor_holder);
|
| + Register reg = Frontend(interceptor_reg, holder, name);
|
| GenerateLoadField(
|
| reg, holder, field, lookup->representation());
|
| }
|
| @@ -937,9 +934,8 @@ void NamedLoadHandlerCompiler::GenerateLoadPostInterceptor(
|
| ExecutableAccessorInfo::cast(lookup->GetCallbackObject()));
|
| ASSERT(callback->getter() != NULL);
|
|
|
| - Register reg =
|
| - CallbackFrontend(IC::CurrentTypeOf(interceptor_holder, isolate()),
|
| - interceptor_reg, holder, name, callback);
|
| + set_type_for_object(interceptor_holder);
|
| + Register reg = CallbackFrontend(interceptor_reg, holder, name, callback);
|
| GenerateLoadCallback(reg, callback);
|
| }
|
| }
|
| @@ -959,10 +955,9 @@ Handle<Code> PropertyICCompiler::CompileMonomorphic(Handle<HeapType> type,
|
|
|
|
|
| Handle<Code> NamedLoadHandlerCompiler::CompileLoadViaGetter(
|
| - Handle<HeapType> type, Handle<JSObject> holder, Handle<Name> name,
|
| - Handle<JSFunction> getter) {
|
| - Frontend(type, receiver(), holder, name);
|
| - GenerateLoadViaGetter(masm(), type, receiver(), getter);
|
| + Handle<JSObject> holder, Handle<Name> name, Handle<JSFunction> getter) {
|
| + Frontend(receiver(), holder, name);
|
| + GenerateLoadViaGetter(masm(), type(), receiver(), getter);
|
| return GetCode(kind(), Code::FAST, name);
|
| }
|
|
|
| @@ -990,8 +985,7 @@ Handle<Code> NamedStoreHandlerCompiler::CompileStoreTransition(
|
| } while (!iter.IsAtEnd());
|
| }
|
|
|
| - Register holder_reg = FrontendHeader(IC::CurrentTypeOf(object, isolate()),
|
| - receiver(), holder, name, &miss);
|
| + Register holder_reg = FrontendHeader(receiver(), holder, name, &miss);
|
|
|
| // If no property was found, and the holder (the last object in the
|
| // prototype chain) is in slow mode, we need to do a negative lookup on the
|
| @@ -1025,8 +1019,7 @@ Handle<Code> NamedStoreHandlerCompiler::CompileStoreField(
|
| Handle<JSObject> object, LookupResult* lookup, Handle<Name> name) {
|
| Label miss;
|
|
|
| - FrontendHeader(IC::CurrentTypeOf(object, isolate()), receiver(), object, name,
|
| - &miss);
|
| + FrontendHeader(receiver(), object, name, &miss);
|
|
|
| // Generate store field code.
|
| GenerateStoreField(masm(),
|
| @@ -1066,9 +1059,8 @@ Handle<Code> NamedStoreHandlerCompiler::CompileStoreArrayLength(
|
| Handle<Code> NamedStoreHandlerCompiler::CompileStoreViaSetter(
|
| Handle<JSObject> object, Handle<JSObject> holder, Handle<Name> name,
|
| Handle<JSFunction> setter) {
|
| - Handle<HeapType> type = IC::CurrentTypeOf(object, isolate());
|
| - Frontend(type, receiver(), holder, name);
|
| - GenerateStoreViaSetter(masm(), type, receiver(), setter);
|
| + Frontend(receiver(), holder, name);
|
| + GenerateStoreViaSetter(masm(), type(), receiver(), setter);
|
|
|
| return GetCode(kind(), Code::FAST, name);
|
| }
|
| @@ -1077,7 +1069,7 @@ Handle<Code> NamedStoreHandlerCompiler::CompileStoreViaSetter(
|
| Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback(
|
| Handle<JSObject> object, Handle<JSObject> holder, Handle<Name> name,
|
| const CallOptimization& call_optimization) {
|
| - Frontend(IC::CurrentTypeOf(object, isolate()), receiver(), holder, name);
|
| + Frontend(receiver(), holder, name);
|
| Register values[] = { value() };
|
| GenerateFastApiCall(
|
| masm(), call_optimization, handle(object->map()),
|
|
|