Revision: 11735
Author: [email protected]
Date: Fri Jun 8 01:48:05 2012
Log: Added LoadIC stub for getters.
Removed some dead constants on the way.
Review URL: https://chromiumcodereview.appspot.com/10515008
http://code.google.com/p/v8/source/detail?r=11735
Modified:
/branches/bleeding_edge/src/arm/stub-cache-arm.cc
/branches/bleeding_edge/src/ia32/stub-cache-ia32.cc
/branches/bleeding_edge/src/ic.cc
/branches/bleeding_edge/src/mips/stub-cache-mips.cc
/branches/bleeding_edge/src/objects.h
/branches/bleeding_edge/src/stub-cache.cc
/branches/bleeding_edge/src/stub-cache.h
/branches/bleeding_edge/src/x64/stub-cache-x64.cc
=======================================
--- /branches/bleeding_edge/src/arm/stub-cache-arm.cc Fri Jun 8 00:45:11
2012
+++ /branches/bleeding_edge/src/arm/stub-cache-arm.cc Fri Jun 8 01:48:05
2012
@@ -2833,6 +2833,43 @@
// Return the generated code.
return GetCode(CALLBACKS, name);
}
+
+
+Handle<Code> LoadStubCompiler::CompileLoadViaGetter(
+ Handle<String> name,
+ Handle<JSObject> receiver,
+ Handle<JSObject> holder,
+ Handle<JSFunction> getter) {
+ // ----------- S t a t e -------------
+ // -- r0 : receiver
+ // -- r2 : name
+ // -- lr : return address
+ // -----------------------------------
+ Label miss;
+
+ // Check that the maps haven't changed.
+ __ JumpIfSmi(r0, &miss);
+ CheckPrototypes(receiver, r0, holder, r3, r4, r1, name, &miss);
+
+ {
+ FrameScope scope(masm(), StackFrame::INTERNAL);
+
+ // Call the JavaScript getter with the receiver on the stack.
+ __ push(r0);
+ __ InvokeFunction(getter, ParameterCount(0), CALL_FUNCTION,
+ NullCallWrapper(), CALL_AS_METHOD);
+
+ // Restore context register.
+ __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
+ }
+ __ Ret();
+
+ __ bind(&miss);
+ GenerateLoadMiss(masm(), Code::LOAD_IC);
+
+ // Return the generated code.
+ return GetCode(CALLBACKS, name);
+}
Handle<Code> LoadStubCompiler::CompileLoadConstant(Handle<JSObject> object,
=======================================
--- /branches/bleeding_edge/src/ia32/stub-cache-ia32.cc Fri Jun 8 00:45:11
2012
+++ /branches/bleeding_edge/src/ia32/stub-cache-ia32.cc Fri Jun 8 01:48:05
2012
@@ -2858,6 +2858,43 @@
// Return the generated code.
return GetCode(CALLBACKS, name);
}
+
+
+Handle<Code> LoadStubCompiler::CompileLoadViaGetter(
+ Handle<String> name,
+ Handle<JSObject> receiver,
+ Handle<JSObject> holder,
+ Handle<JSFunction> getter) {
+ // ----------- S t a t e -------------
+ // -- ecx : name
+ // -- edx : receiver
+ // -- esp[0] : return address
+ // -----------------------------------
+ Label miss;
+
+ // Check that the maps haven't changed.
+ __ JumpIfSmi(edx, &miss);
+ CheckPrototypes(receiver, edx, holder, ebx, eax, edi, name, &miss);
+
+ {
+ FrameScope scope(masm(), StackFrame::INTERNAL);
+
+ // Call the JavaScript getter with the receiver on the stack.
+ __ push(edx);
+ __ InvokeFunction(getter, ParameterCount(0), CALL_FUNCTION,
+ NullCallWrapper(), CALL_AS_METHOD);
+
+ // Restore context register.
+ __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset));
+ }
+ __ ret(0);
+
+ __ bind(&miss);
+ GenerateLoadMiss(masm(), Code::LOAD_IC);
+
+ // Return the generated code.
+ return GetCode(CALLBACKS, name);
+}
Handle<Code> LoadStubCompiler::CompileLoadConstant(Handle<JSObject> object,
=======================================
--- /branches/bleeding_edge/src/ic.cc Fri Jun 8 00:45:11 2012
+++ /branches/bleeding_edge/src/ic.cc Fri Jun 8 01:48:05 2012
@@ -988,14 +988,25 @@
}
break;
case CALLBACKS: {
- Handle<Object> callback_object(lookup->GetCallbackObject());
- if (!callback_object->IsAccessorInfo()) return;
- Handle<AccessorInfo> callback =
- Handle<AccessorInfo>::cast(callback_object);
- if (v8::ToCData<Address>(callback->getter()) == 0) return;
- if (!callback->IsCompatibleReceiver(*receiver)) return;
- code = isolate()->stub_cache()->ComputeLoadCallback(
- name, receiver, holder, callback);
+ Handle<Object> callback(lookup->GetCallbackObject());
+ if (callback->IsAccessorInfo()) {
+ Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(callback);
+ if (v8::ToCData<Address>(info->getter()) == 0) return;
+ if (!info->IsCompatibleReceiver(*receiver)) return;
+ code = isolate()->stub_cache()->ComputeLoadCallback(
+ name, receiver, holder, info);
+ } else if (callback->IsAccessorPair()) {
+ Handle<Object>
getter(Handle<AccessorPair>::cast(callback)->getter());
+ if (!getter->IsJSFunction()) return;
+ if (holder->IsGlobalObject()) return;
+ if (!receiver->HasFastProperties()) return;
+ code = isolate()->stub_cache()->ComputeLoadViaGetter(
+ name, receiver, holder, Handle<JSFunction>::cast(getter));
+ } else {
+ ASSERT(callback->IsForeign());
+ // No IC support for old-style native accessors.
+ return;
+ }
break;
}
case INTERCEPTOR:
=======================================
--- /branches/bleeding_edge/src/mips/stub-cache-mips.cc Fri Jun 8 00:45:11
2012
+++ /branches/bleeding_edge/src/mips/stub-cache-mips.cc Fri Jun 8 01:48:05
2012
@@ -2837,6 +2837,43 @@
// Return the generated code.
return GetCode(CALLBACKS, name);
}
+
+
+Handle<Code> LoadStubCompiler::CompileLoadViaGetter(
+ Handle<String> name,
+ Handle<JSObject> receiver,
+ Handle<JSObject> holder,
+ Handle<JSFunction> getter) {
+ // ----------- S t a t e -------------
+ // -- a0 : receiver
+ // -- a2 : name
+ // -- ra : return address
+ // -----------------------------------
+ Label miss;
+
+ // Check that the maps haven't changed.
+ __ JumpIfSmi(a0, &miss);
+ CheckPrototypes(receiver, a0, holder, a3, t0, a1, name, &miss);
+
+ {
+ FrameScope scope(masm(), StackFrame::INTERNAL);
+
+ // Call the JavaScript getter with the receiver on the stack.
+ __ push(a0);
+ __ InvokeFunction(getter, ParameterCount(0), CALL_FUNCTION,
+ NullCallWrapper(), CALL_AS_METHOD);
+
+ // Restore context register.
+ __ lw(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
+ }
+ __ Ret();
+
+ __ bind(&miss);
+ GenerateLoadMiss(masm(), Code::LOAD_IC);
+
+ // Return the generated code.
+ return GetCode(CALLBACKS, name);
+}
Handle<Code> LoadStubCompiler::CompileLoadConstant(Handle<JSObject> object,
=======================================
--- /branches/bleeding_edge/src/objects.h Fri Jun 8 00:45:11 2012
+++ /branches/bleeding_edge/src/objects.h Fri Jun 8 01:48:05 2012
@@ -5010,11 +5010,6 @@
static const int kFunctionWithPrototype = 1;
static const int kUsedForPrototype = 2;
- // Layout of the default cache. It holds alternating name and code
objects.
- static const int kCodeCacheEntrySize = 2;
- static const int kCodeCacheEntryNameOffset = 0;
- static const int kCodeCacheEntryCodeOffset = 1;
-
typedef FixedBodyDescriptor<kPointerFieldsBeginOffset,
kPointerFieldsEndOffset,
kSize> BodyDescriptor;
=======================================
--- /branches/bleeding_edge/src/stub-cache.cc Fri Jun 8 00:45:11 2012
+++ /branches/bleeding_edge/src/stub-cache.cc Fri Jun 8 01:48:05 2012
@@ -169,6 +169,25 @@
JSObject::UpdateMapCodeCache(receiver, name, code);
return code;
}
+
+
+Handle<Code> StubCache::ComputeLoadViaGetter(Handle<String> name,
+ Handle<JSObject> receiver,
+ Handle<JSObject> holder,
+ Handle<JSFunction> getter) {
+ ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP);
+ Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC,
CALLBACKS);
+ Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
+ if (probe->IsCode()) return Handle<Code>::cast(probe);
+
+ LoadStubCompiler compiler(isolate_);
+ Handle<Code> code =
+ compiler.CompileLoadViaGetter(name, receiver, holder, getter);
+ PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name));
+ GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code));
+ JSObject::UpdateMapCodeCache(receiver, name, code);
+ return code;
+}
Handle<Code> StubCache::ComputeLoadConstant(Handle<String> name,
=======================================
--- /branches/bleeding_edge/src/stub-cache.h Fri Jun 1 03:51:36 2012
+++ /branches/bleeding_edge/src/stub-cache.h Fri Jun 8 01:48:05 2012
@@ -90,6 +90,11 @@
Handle<JSObject> holder,
Handle<AccessorInfo> callback);
+ Handle<Code> ComputeLoadViaGetter(Handle<String> name,
+ Handle<JSObject> receiver,
+ Handle<JSObject> holder,
+ Handle<JSFunction> getter);
+
Handle<Code> ComputeLoadConstant(Handle<String> name,
Handle<JSObject> receiver,
Handle<JSObject> holder,
@@ -596,6 +601,11 @@
Handle<JSObject> holder,
Handle<AccessorInfo> callback);
+ Handle<Code> CompileLoadViaGetter(Handle<String> name,
+ Handle<JSObject> receiver,
+ Handle<JSObject> holder,
+ Handle<JSFunction> getter);
+
Handle<Code> CompileLoadConstant(Handle<JSObject> object,
Handle<JSObject> holder,
Handle<JSFunction> value,
=======================================
--- /branches/bleeding_edge/src/x64/stub-cache-x64.cc Fri Jun 8 00:45:11
2012
+++ /branches/bleeding_edge/src/x64/stub-cache-x64.cc Fri Jun 8 01:48:05
2012
@@ -2696,6 +2696,43 @@
// Return the generated code.
return GetCode(CALLBACKS, name);
}
+
+
+Handle<Code> LoadStubCompiler::CompileLoadViaGetter(
+ Handle<String> name,
+ Handle<JSObject> receiver,
+ Handle<JSObject> holder,
+ Handle<JSFunction> getter) {
+ // ----------- S t a t e -------------
+ // -- rax : receiver
+ // -- rcx : name
+ // -- rsp[0] : return address
+ // -----------------------------------
+ Label miss;
+
+ // Check that the maps haven't changed.
+ __ JumpIfSmi(rax, &miss);
+ CheckPrototypes(receiver, rax, holder, rbx, rdx, rdi, name, &miss);
+
+ {
+ FrameScope scope(masm(), StackFrame::INTERNAL);
+
+ // Call the JavaScript getter with the receiver on the stack.
+ __ push(rax);
+ __ InvokeFunction(getter, ParameterCount(0), CALL_FUNCTION,
+ NullCallWrapper(), CALL_AS_METHOD);
+
+ // Restore context register.
+ __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset));
+ }
+ __ ret(0);
+
+ __ bind(&miss);
+ GenerateLoadMiss(masm(), Code::LOAD_IC);
+
+ // Return the generated code.
+ return GetCode(CALLBACKS, name);
+}
Handle<Code> LoadStubCompiler::CompileLoadConstant(Handle<JSObject> object,
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev