| Index: src/stub-cache.cc
|
| diff --git a/src/stub-cache.cc b/src/stub-cache.cc
|
| index 06b4782b767f4875a7fd271f3535a539c923715d..bf51f34021cd1f7a55c736f9447ff11a975ef301 100644
|
| --- a/src/stub-cache.cc
|
| +++ b/src/stub-cache.cc
|
| @@ -1000,32 +1000,6 @@ void StubCache::CollectMatchingMaps(SmallMapList* types,
|
| // StubCompiler implementation.
|
|
|
|
|
| -RUNTIME_FUNCTION(MaybeObject*, LoadCallbackProperty) {
|
| - ASSERT(args[0]->IsJSObject());
|
| - ASSERT(args[1]->IsJSObject());
|
| - ASSERT(args[3]->IsSmi());
|
| - AccessorInfo* callback = AccessorInfo::cast(args[4]);
|
| - Address getter_address = v8::ToCData<Address>(callback->getter());
|
| - v8::AccessorGetter fun = FUNCTION_CAST<v8::AccessorGetter>(getter_address);
|
| - ASSERT(fun != NULL);
|
| - ASSERT(callback->IsCompatibleReceiver(args[0]));
|
| - v8::AccessorInfo info(&args[0]);
|
| - HandleScope scope(isolate);
|
| - v8::Handle<v8::Value> result;
|
| - {
|
| - // Leaving JavaScript.
|
| - VMState state(isolate, EXTERNAL);
|
| - ExternalCallbackScope call_scope(isolate, getter_address);
|
| - result = fun(v8::Utils::ToLocal(args.at<String>(5)), info);
|
| - }
|
| - RETURN_IF_SCHEDULED_EXCEPTION(isolate);
|
| - if (result.IsEmpty()) return HEAP->undefined_value();
|
| - Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
|
| - result_internal->VerifyApiCallResultType();
|
| - return *result_internal;
|
| -}
|
| -
|
| -
|
| RUNTIME_FUNCTION(MaybeObject*, StoreCallbackProperty) {
|
| JSObject* recv = JSObject::cast(args[0]);
|
| AccessorInfo* callback = AccessorInfo::cast(args[1]);
|
| @@ -1397,55 +1371,48 @@ Handle<Code> BaseLoadStubCompiler::CompileLoadField(Handle<JSObject> object,
|
| Handle<JSObject> holder,
|
| Handle<String> name,
|
| PropertyIndex index) {
|
| - Label miss;
|
| -
|
| - GenerateNameCheck(name, this->name(), &miss);
|
| - GenerateLoadField(object, holder, receiver(),
|
| - scratch1(), scratch2(), scratch3(),
|
| - index, name, &miss);
|
| - __ bind(&miss);
|
| - GenerateLoadMiss(masm(), kind());
|
| + Label success;
|
| + Register reg = GenerateHandlerFrontend(
|
| + object, receiver(), holder, name,
|
| + &success, Handle<AccessorInfo>::null(), true);
|
| + __ bind(&success);
|
| + GenerateLoadField(reg, holder, index);
|
|
|
| // Return the generated code.
|
| return GetCode(Code::FIELD, name);
|
| }
|
|
|
|
|
| -Handle<Code> BaseLoadStubCompiler::CompileLoadCallback(
|
| +Handle<Code> BaseLoadStubCompiler::CompileLoadConstant(
|
| Handle<JSObject> object,
|
| Handle<JSObject> holder,
|
| Handle<String> name,
|
| - Handle<AccessorInfo> callback) {
|
| - Label miss;
|
| -
|
| - GenerateNameCheck(name, this->name(), &miss);
|
| - GenerateLoadCallback(object, holder, receiver(), this->name(),
|
| - scratch1(), scratch2(), scratch3(), scratch4(),
|
| - callback, name, &miss);
|
| - __ bind(&miss);
|
| - GenerateLoadMiss(masm(), kind());
|
| + Handle<JSFunction> value) {
|
| + Label success;
|
| + GenerateHandlerFrontend(object, receiver(), holder, name,
|
| + &success, Handle<AccessorInfo>::null(), true);
|
| + __ bind(&success);
|
| + GenerateLoadConstant(value);
|
|
|
| // Return the generated code.
|
| - return GetCode(Code::CALLBACKS, name);
|
| + return GetCode(Code::CONSTANT_FUNCTION, name);
|
| }
|
|
|
|
|
| -Handle<Code> BaseLoadStubCompiler::CompileLoadConstant(
|
| +Handle<Code> BaseLoadStubCompiler::CompileLoadCallback(
|
| Handle<JSObject> object,
|
| Handle<JSObject> holder,
|
| Handle<String> name,
|
| - Handle<JSFunction> value) {
|
| - Label miss;
|
| + Handle<AccessorInfo> callback) {
|
| + Label success;
|
|
|
| - GenerateNameCheck(name, this->name(), &miss);
|
| - GenerateLoadConstant(object, holder, receiver(),
|
| - scratch1(), scratch2(), scratch3(),
|
| - value, name, &miss);
|
| - __ bind(&miss);
|
| - GenerateLoadMiss(masm(), kind());
|
| + Register reg = GenerateHandlerFrontend(object, receiver(), holder, name,
|
| + &success, callback, true);
|
| + __ bind(&success);
|
| + GenerateLoadCallback(reg, callback);
|
|
|
| // Return the generated code.
|
| - return GetCode(Code::CONSTANT_FUNCTION, name);
|
| + return GetCode(Code::CALLBACKS, name);
|
| }
|
|
|
|
|
| @@ -1453,20 +1420,18 @@ Handle<Code> BaseLoadStubCompiler::CompileLoadInterceptor(
|
| Handle<JSObject> object,
|
| Handle<JSObject> holder,
|
| Handle<String> name) {
|
| - Label miss;
|
| + Label success;
|
|
|
| LookupResult lookup(isolate());
|
| LookupPostInterceptor(holder, name, &lookup);
|
|
|
| - GenerateNameCheck(name, this->name(), &miss);
|
| + Register reg = GenerateHandlerFrontend(
|
| + object, receiver(), holder, name,
|
| + &success, Handle<AccessorInfo>::null(), true);
|
| + __ bind(&success);
|
| // TODO(368): Compile in the whole chain: all the interceptors in
|
| // prototypes and ultimate answer.
|
| - GenerateLoadInterceptor(object, holder, &lookup, receiver(), this->name(),
|
| - scratch1(), scratch2(), scratch3(),
|
| - name, &miss);
|
| -
|
| - __ bind(&miss);
|
| - GenerateLoadMiss(masm(), kind());
|
| + GenerateLoadInterceptor(reg, object, holder, &lookup, name);
|
|
|
| // Return the generated code.
|
| return GetCode(Code::INTERCEPTOR, name);
|
|
|