| Index: src/stub-cache.cc
|
| diff --git a/src/stub-cache.cc b/src/stub-cache.cc
|
| index b312b1e078bceefc82a6ef8428fda5c2744f5678..709c4b2381fb4a9d90b8c163b0ebf3f1278ce7fa 100644
|
| --- a/src/stub-cache.cc
|
| +++ b/src/stub-cache.cc
|
| @@ -272,21 +272,29 @@ Handle<Code> StubCache::ComputeLoadNonexistent(Handle<Name> name,
|
| Handle<Code> StubCache::ComputeLoadField(Handle<Name> name,
|
| Handle<JSObject> receiver,
|
| Handle<JSObject> holder,
|
| + Code::Kind kind,
|
| PropertyIndex field,
|
| Representation representation) {
|
| if (receiver.is_identical_to(holder)) {
|
| - LoadFieldStub stub(field.is_inobject(holder),
|
| - field.translate(holder),
|
| - representation);
|
| - return stub.GetCode(isolate());
|
| + if (kind == Code::LOAD_IC) {
|
| + LoadFieldStub stub(field.is_inobject(holder),
|
| + field.translate(holder),
|
| + representation);
|
| + return stub.GetCode(isolate());
|
| + } else {
|
| + KeyedLoadFieldStub stub(field.is_inobject(holder),
|
| + field.translate(holder),
|
| + representation);
|
| + return stub.GetCode(isolate());
|
| + }
|
| }
|
|
|
| Handle<JSObject> stub_holder = StubHolder(receiver, holder);
|
| Handle<Code> stub = FindLoadHandler(
|
| - name, receiver, stub_holder, Code::LOAD_IC, Code::FIELD);
|
| + name, receiver, stub_holder, kind, Code::FIELD);
|
| if (!stub.is_null()) return stub;
|
|
|
| - LoadStubCompiler compiler(isolate_);
|
| + BaseLoadStubCompiler compiler(isolate_, kind);
|
| Handle<Code> handler =
|
| compiler.CompileLoadField(receiver, holder, name, field, representation);
|
| JSObject::UpdateMapCodeCache(stub_holder, name, handler);
|
| @@ -298,14 +306,15 @@ Handle<Code> StubCache::ComputeLoadCallback(
|
| Handle<Name> name,
|
| Handle<JSObject> receiver,
|
| Handle<JSObject> holder,
|
| + Code::Kind kind,
|
| Handle<ExecutableAccessorInfo> callback) {
|
| ASSERT(v8::ToCData<Address>(callback->getter()) != 0);
|
| Handle<JSObject> stub_holder = StubHolder(receiver, holder);
|
| Handle<Code> stub = FindLoadHandler(
|
| - name, receiver, stub_holder, Code::LOAD_IC, Code::CALLBACKS);
|
| + name, receiver, stub_holder, kind, Code::CALLBACKS);
|
| if (!stub.is_null()) return stub;
|
|
|
| - LoadStubCompiler compiler(isolate_);
|
| + BaseLoadStubCompiler compiler(isolate_, kind);
|
| Handle<Code> handler =
|
| compiler.CompileLoadCallback(receiver, holder, name, callback);
|
| JSObject::UpdateMapCodeCache(stub_holder, name, handler);
|
| @@ -317,13 +326,14 @@ Handle<Code> StubCache::ComputeLoadCallback(
|
| Handle<Name> name,
|
| Handle<JSObject> receiver,
|
| Handle<JSObject> holder,
|
| + Code::Kind kind,
|
| const CallOptimization& call_optimization) {
|
| Handle<JSObject> stub_holder = StubHolder(receiver, holder);
|
| Handle<Code> stub = FindLoadHandler(
|
| - name, receiver, stub_holder, Code::LOAD_IC, Code::CALLBACKS);
|
| + name, receiver, stub_holder, kind, Code::CALLBACKS);
|
| if (!stub.is_null()) return stub;
|
|
|
| - LoadStubCompiler compiler(isolate_);
|
| + BaseLoadStubCompiler compiler(isolate_, kind);
|
| Handle<Code> handler =
|
| compiler.CompileLoadCallback(receiver, holder, name, call_optimization);
|
| JSObject::UpdateMapCodeCache(stub_holder, name, handler);
|
| @@ -351,29 +361,30 @@ Handle<Code> StubCache::ComputeLoadViaGetter(Handle<Name> name,
|
| Handle<Code> StubCache::ComputeLoadConstant(Handle<Name> name,
|
| Handle<JSObject> receiver,
|
| Handle<JSObject> holder,
|
| + Code::Kind kind,
|
| Handle<Object> value) {
|
| Handle<JSObject> stub_holder = StubHolder(receiver, holder);
|
| Handle<Code> handler = FindLoadHandler(
|
| - name, receiver, stub_holder, Code::LOAD_IC, Code::CONSTANT);
|
| + name, receiver, stub_holder, kind, Code::CONSTANT);
|
| if (!handler.is_null()) return handler;
|
|
|
| - LoadStubCompiler compiler(isolate_);
|
| + BaseLoadStubCompiler compiler(isolate_, kind);
|
| handler = compiler.CompileLoadConstant(receiver, holder, name, value);
|
| JSObject::UpdateMapCodeCache(stub_holder, name, handler);
|
| -
|
| return handler;
|
| }
|
|
|
|
|
| Handle<Code> StubCache::ComputeLoadInterceptor(Handle<Name> name,
|
| Handle<JSObject> receiver,
|
| - Handle<JSObject> holder) {
|
| + Handle<JSObject> holder,
|
| + Code::Kind kind) {
|
| Handle<JSObject> stub_holder = StubHolder(receiver, holder);
|
| Handle<Code> stub = FindLoadHandler(
|
| - name, receiver, stub_holder, Code::LOAD_IC, Code::INTERCEPTOR);
|
| + name, receiver, stub_holder, kind, Code::INTERCEPTOR);
|
| if (!stub.is_null()) return stub;
|
|
|
| - LoadStubCompiler compiler(isolate_);
|
| + BaseLoadStubCompiler compiler(isolate_, kind);
|
| Handle<Code> handler =
|
| compiler.CompileLoadInterceptor(receiver, holder, name);
|
| JSObject::UpdateMapCodeCache(stub_holder, name, handler);
|
| @@ -404,101 +415,6 @@ Handle<Code> StubCache::ComputeLoadGlobal(Handle<Name> name,
|
| }
|
|
|
|
|
| -Handle<Code> StubCache::ComputeKeyedLoadField(Handle<Name> name,
|
| - Handle<JSObject> receiver,
|
| - Handle<JSObject> holder,
|
| - PropertyIndex field,
|
| - Representation representation) {
|
| - if (receiver.is_identical_to(holder)) {
|
| - // TODO(titzer): this should use an HObjectAccess
|
| - KeyedLoadFieldStub stub(field.is_inobject(holder),
|
| - field.translate(holder),
|
| - representation);
|
| - return stub.GetCode(isolate());
|
| - }
|
| -
|
| - Handle<JSObject> stub_holder = StubHolder(receiver, holder);
|
| - Handle<Code> stub = FindLoadHandler(
|
| - name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::FIELD);
|
| - if (!stub.is_null()) return stub;
|
| -
|
| - KeyedLoadStubCompiler compiler(isolate_);
|
| - Handle<Code> handler =
|
| - compiler.CompileLoadField(receiver, holder, name, field, representation);
|
| - JSObject::UpdateMapCodeCache(stub_holder, name, handler);
|
| - return handler;
|
| -}
|
| -
|
| -
|
| -Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<Name> name,
|
| - Handle<JSObject> receiver,
|
| - Handle<JSObject> holder,
|
| - Handle<Object> value) {
|
| - Handle<JSObject> stub_holder = StubHolder(receiver, holder);
|
| - Handle<Code> handler = FindLoadHandler(
|
| - name, receiver, stub_holder, Code::KEYED_LOAD_IC,
|
| - Code::CONSTANT);
|
| - if (!handler.is_null()) return handler;
|
| -
|
| - KeyedLoadStubCompiler compiler(isolate_);
|
| - handler = compiler.CompileLoadConstant(receiver, holder, name, value);
|
| - JSObject::UpdateMapCodeCache(stub_holder, name, handler);
|
| - return handler;
|
| -}
|
| -
|
| -
|
| -Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<Name> name,
|
| - Handle<JSObject> receiver,
|
| - Handle<JSObject> holder) {
|
| - Handle<JSObject> stub_holder = StubHolder(receiver, holder);
|
| - Handle<Code> stub = FindLoadHandler(
|
| - name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::INTERCEPTOR);
|
| - if (!stub.is_null()) return stub;
|
| -
|
| - KeyedLoadStubCompiler compiler(isolate_);
|
| - Handle<Code> handler =
|
| - compiler.CompileLoadInterceptor(receiver, holder, name);
|
| - JSObject::UpdateMapCodeCache(stub_holder, name, handler);
|
| - return handler;
|
| -}
|
| -
|
| -
|
| -Handle<Code> StubCache::ComputeKeyedLoadCallback(
|
| - Handle<Name> name,
|
| - Handle<JSObject> receiver,
|
| - Handle<JSObject> holder,
|
| - Handle<ExecutableAccessorInfo> callback) {
|
| - Handle<JSObject> stub_holder = StubHolder(receiver, holder);
|
| - Handle<Code> stub = FindLoadHandler(
|
| - name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::CALLBACKS);
|
| - if (!stub.is_null()) return stub;
|
| -
|
| - KeyedLoadStubCompiler compiler(isolate_);
|
| - Handle<Code> handler =
|
| - compiler.CompileLoadCallback(receiver, holder, name, callback);
|
| - JSObject::UpdateMapCodeCache(stub_holder, name, handler);
|
| - return handler;
|
| -}
|
| -
|
| -
|
| -Handle<Code> StubCache::ComputeKeyedLoadCallback(
|
| - Handle<Name> name,
|
| - Handle<JSObject> receiver,
|
| - Handle<JSObject> holder,
|
| - const CallOptimization& call_optimization) {
|
| - Handle<JSObject> stub_holder = StubHolder(receiver, holder);
|
| - Handle<Code> stub = FindLoadHandler(
|
| - name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::CALLBACKS);
|
| - if (!stub.is_null()) return stub;
|
| -
|
| - KeyedLoadStubCompiler compiler(isolate_);
|
| - Handle<Code> handler =
|
| - compiler.CompileLoadCallback(receiver, holder, name, call_optimization);
|
| - JSObject::UpdateMapCodeCache(stub_holder, name, handler);
|
| - return handler;
|
| -}
|
| -
|
| -
|
| Handle<Code> StubCache::ComputeStoreField(Handle<Name> name,
|
| Handle<JSObject> receiver,
|
| LookupResult* lookup,
|
| @@ -1939,23 +1855,15 @@ void StubCompiler::TailCallBuiltin(MacroAssembler* masm, Builtins::Name name) {
|
| }
|
|
|
|
|
| -void LoadStubCompiler::JitEvent(Handle<Name> name, Handle<Code> code) {
|
| - GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code));
|
| -}
|
| -
|
| -
|
| -void KeyedLoadStubCompiler::JitEvent(Handle<Name> name, Handle<Code> code) {
|
| - GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code));
|
| -}
|
| -
|
| -
|
| -void StoreStubCompiler::JitEvent(Handle<Name> name, Handle<Code> code) {
|
| - GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code));
|
| -}
|
| -
|
| -
|
| -void KeyedStoreStubCompiler::JitEvent(Handle<Name> name, Handle<Code> code) {
|
| - GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, *name, *code));
|
| +Register* BaseLoadStoreStubCompiler::GetRegisters(Code::Kind kind) {
|
| + switch (kind) {
|
| + case Code::LOAD_IC: return LoadStubCompiler::registers();
|
| + case Code::STORE_IC: return StoreStubCompiler::registers();
|
| + case Code::KEYED_LOAD_IC: return KeyedLoadStubCompiler::registers();
|
| + case Code::KEYED_STORE_IC: return KeyedStoreStubCompiler::registers();
|
| + default: UNREACHABLE();
|
| + }
|
| + return NULL;
|
| }
|
|
|
|
|
|
|