| Index: src/stub-cache.h
|
| diff --git a/src/stub-cache.h b/src/stub-cache.h
|
| index ae0c65d57748f12a97b22f91085e268f11bb3e25..38bc7a3c3a6fff69ccaddde91bdca75cf019bb49 100644
|
| --- a/src/stub-cache.h
|
| +++ b/src/stub-cache.h
|
| @@ -105,39 +105,6 @@ class StubCache {
|
| Handle<Code> ComputeLoadNonexistent(Handle<Name> name,
|
| Handle<JSObject> object);
|
|
|
| - Handle<Code> ComputeLoadField(Handle<Name> name,
|
| - Handle<JSObject> object,
|
| - Handle<JSObject> holder,
|
| - PropertyIndex field_index,
|
| - Representation representation);
|
| -
|
| - Handle<Code> ComputeLoadCallback(Handle<Name> name,
|
| - Handle<JSObject> object,
|
| - Handle<JSObject> holder,
|
| - Handle<ExecutableAccessorInfo> callback);
|
| -
|
| - Handle<Code> ComputeLoadCallback(Handle<Name> name,
|
| - Handle<JSObject> object,
|
| - Handle<JSObject> holder,
|
| - const CallOptimization& call_optimization);
|
| -
|
| - Handle<Code> ComputeLoadViaGetter(Handle<Name> name,
|
| - Handle<JSObject> object,
|
| - Handle<JSObject> holder,
|
| - Handle<JSFunction> getter);
|
| -
|
| - Handle<Code> ComputeLoadConstant(Handle<Name> name,
|
| - Handle<JSObject> object,
|
| - Handle<JSObject> holder,
|
| - Handle<Object> value);
|
| -
|
| - Handle<Code> ComputeLoadInterceptor(Handle<Name> name,
|
| - Handle<JSObject> object,
|
| - Handle<JSObject> holder);
|
| -
|
| - Handle<Code> ComputeLoadNormal(Handle<Name> name,
|
| - Handle<JSObject> object);
|
| -
|
| Handle<Code> ComputeLoadGlobal(Handle<Name> name,
|
| Handle<JSObject> object,
|
| Handle<GlobalObject> holder,
|
| @@ -173,69 +140,18 @@ class StubCache {
|
| Handle<JSObject> object,
|
| Handle<JSObject> holder);
|
|
|
| - // ---
|
| -
|
| - Handle<Code> ComputeStoreField(Handle<Name> name,
|
| - Handle<JSObject> object,
|
| - LookupResult* lookup,
|
| - StrictModeFlag strict_mode);
|
| -
|
| - Handle<Code> ComputeStoreTransition(Handle<Name> name,
|
| - Handle<JSObject> object,
|
| - LookupResult* lookup,
|
| - Handle<Map> transition,
|
| - StrictModeFlag strict_mode);
|
| -
|
| - Handle<Code> ComputeStoreNormal(StrictModeFlag strict_mode);
|
| -
|
| Handle<Code> ComputeStoreGlobal(Handle<Name> name,
|
| Handle<GlobalObject> object,
|
| Handle<PropertyCell> cell,
|
| Handle<Object> value,
|
| StrictModeFlag strict_mode);
|
|
|
| - Handle<Code> ComputeStoreCallback(Handle<Name> name,
|
| - Handle<JSObject> object,
|
| - Handle<JSObject> holder,
|
| - Handle<ExecutableAccessorInfo> callback,
|
| - StrictModeFlag strict_mode);
|
| -
|
| - Handle<Code> ComputeStoreCallback(Handle<Name> name,
|
| - Handle<JSObject> object,
|
| - Handle<JSObject> holder,
|
| - const CallOptimization& call_optimation,
|
| - StrictModeFlag strict_mode);
|
| -
|
| - Handle<Code> ComputeStoreViaSetter(Handle<Name> name,
|
| - Handle<JSObject> object,
|
| - Handle<JSObject> holder,
|
| - Handle<JSFunction> setter,
|
| - StrictModeFlag strict_mode);
|
| -
|
| - Handle<Code> ComputeStoreInterceptor(Handle<Name> name,
|
| - Handle<JSObject> object,
|
| - StrictModeFlag strict_mode);
|
| -
|
| - // ---
|
| -
|
| - Handle<Code> ComputeKeyedStoreField(Handle<Name> name,
|
| - Handle<JSObject> object,
|
| - LookupResult* lookup,
|
| - StrictModeFlag strict_mode);
|
| - Handle<Code> ComputeKeyedStoreTransition(Handle<Name> name,
|
| - Handle<JSObject> object,
|
| - LookupResult* lookup,
|
| - Handle<Map> transition,
|
| - StrictModeFlag strict_mode);
|
| -
|
| Handle<Code> ComputeKeyedLoadElement(Handle<Map> receiver_map);
|
|
|
| Handle<Code> ComputeKeyedStoreElement(Handle<Map> receiver_map,
|
| StrictModeFlag strict_mode,
|
| KeyedAccessStoreMode store_mode);
|
|
|
| - // ---
|
| -
|
| Handle<Code> ComputeCallField(int argc,
|
| Code::Kind,
|
| Code::ExtraICState extra_state,
|
| @@ -624,8 +540,10 @@ enum FrontendCheckType { PERFORM_INITIAL_CHECKS, SKIP_INITIAL_CHECKS };
|
|
|
| class BaseLoadStoreStubCompiler: public StubCompiler {
|
| public:
|
| - BaseLoadStoreStubCompiler(Isolate* isolate, Register* registers)
|
| - : StubCompiler(isolate), registers_(registers) { }
|
| + BaseLoadStoreStubCompiler(Isolate* isolate, Code::Kind kind)
|
| + : StubCompiler(isolate), kind_(kind) {
|
| + InitializeRegisters();
|
| + }
|
| virtual ~BaseLoadStoreStubCompiler() { }
|
|
|
| Handle<Code> CompileMonomorphicIC(Handle<Map> receiver_map,
|
| @@ -678,26 +596,45 @@ class BaseLoadStoreStubCompiler: public StubCompiler {
|
| Code::StubType type,
|
| Handle<Name> name,
|
| InlineCacheState state = MONOMORPHIC);
|
| + Code::Kind kind() { return kind_; }
|
| +
|
| + Logger::LogEventsAndTags log_kind(Handle<Code> code) {
|
| + if (!code->is_inline_cache_stub()) return Logger::STUB_TAG;
|
| + if (kind_ == Code::LOAD_IC) {
|
| + return code->ic_state() == MONOMORPHIC
|
| + ? Logger::LOAD_IC_TAG : Logger::LOAD_POLYMORPHIC_IC_TAG;
|
| + } else if (kind_ == Code::KEYED_LOAD_IC) {
|
| + return code->ic_state() == MONOMORPHIC
|
| + ? Logger::KEYED_LOAD_IC_TAG : Logger::KEYED_LOAD_POLYMORPHIC_IC_TAG;
|
| + } else if (kind_ == Code::STORE_IC) {
|
| + return code->ic_state() == MONOMORPHIC
|
| + ? Logger::STORE_IC_TAG : Logger::STORE_POLYMORPHIC_IC_TAG;
|
| + } else {
|
| + return code->ic_state() == MONOMORPHIC
|
| + ? Logger::KEYED_STORE_IC_TAG : Logger::KEYED_STORE_POLYMORPHIC_IC_TAG;
|
| + }
|
| + }
|
| + void JitEvent(Handle<Name> name, Handle<Code> code);
|
|
|
| virtual Code::ExtraICState extra_state() { return Code::kNoExtraICState; }
|
| - virtual Logger::LogEventsAndTags log_kind(Handle<Code> code) = 0;
|
| - virtual void JitEvent(Handle<Name> name, Handle<Code> code) = 0;
|
| - virtual Code::Kind kind() = 0;
|
| virtual Register receiver() = 0;
|
| virtual Register name() = 0;
|
| virtual Register scratch1() = 0;
|
| virtual Register scratch2() = 0;
|
| virtual Register scratch3() = 0;
|
|
|
| + void InitializeRegisters();
|
| +
|
| + Code::Kind kind_;
|
| Register* registers_;
|
| };
|
|
|
|
|
| -class BaseLoadStubCompiler: public BaseLoadStoreStubCompiler {
|
| +class LoadStubCompiler: public BaseLoadStoreStubCompiler {
|
| public:
|
| - BaseLoadStubCompiler(Isolate* isolate, Register* registers)
|
| - : BaseLoadStoreStubCompiler(isolate, registers) { }
|
| - virtual ~BaseLoadStubCompiler() { }
|
| + LoadStubCompiler(Isolate* isolate, Code::Kind kind = Code::LOAD_IC)
|
| + : BaseLoadStoreStubCompiler(isolate, kind) { }
|
| + virtual ~LoadStubCompiler() { }
|
|
|
| Handle<Code> CompileLoadField(Handle<JSObject> object,
|
| Handle<JSObject> holder,
|
| @@ -724,6 +661,28 @@ class BaseLoadStubCompiler: public BaseLoadStoreStubCompiler {
|
| Handle<JSObject> holder,
|
| Handle<Name> name);
|
|
|
| + Handle<Code> CompileLoadViaGetter(Handle<JSObject> object,
|
| + Handle<JSObject> holder,
|
| + Handle<Name> name,
|
| + Handle<JSFunction> getter);
|
| +
|
| + static void GenerateLoadViaGetter(MacroAssembler* masm,
|
| + Register receiver,
|
| + Handle<JSFunction> getter);
|
| +
|
| + Handle<Code> CompileLoadNonexistent(Handle<JSObject> object,
|
| + Handle<JSObject> last,
|
| + Handle<Name> name,
|
| + Handle<GlobalObject> global);
|
| +
|
| + Handle<Code> CompileLoadGlobal(Handle<JSObject> object,
|
| + Handle<GlobalObject> holder,
|
| + Handle<PropertyCell> cell,
|
| + Handle<Name> name,
|
| + bool is_dont_delete);
|
| +
|
| + static Register* registers();
|
| +
|
| protected:
|
| virtual Register HandlerFrontendHeader(Handle<JSObject> object,
|
| Register object_reg,
|
| @@ -774,46 +733,10 @@ class BaseLoadStubCompiler: public BaseLoadStoreStubCompiler {
|
| };
|
|
|
|
|
| -class LoadStubCompiler: public BaseLoadStubCompiler {
|
| - public:
|
| - explicit LoadStubCompiler(Isolate* isolate)
|
| - : BaseLoadStubCompiler(isolate, registers()) { }
|
| -
|
| - Handle<Code> CompileLoadNonexistent(Handle<JSObject> object,
|
| - Handle<JSObject> last,
|
| - Handle<Name> name,
|
| - Handle<GlobalObject> global);
|
| -
|
| - static void GenerateLoadViaGetter(MacroAssembler* masm,
|
| - Handle<JSFunction> getter);
|
| -
|
| - Handle<Code> CompileLoadViaGetter(Handle<JSObject> object,
|
| - Handle<JSObject> holder,
|
| - Handle<Name> name,
|
| - Handle<JSFunction> getter);
|
| -
|
| - Handle<Code> CompileLoadGlobal(Handle<JSObject> object,
|
| - Handle<GlobalObject> holder,
|
| - Handle<PropertyCell> cell,
|
| - Handle<Name> name,
|
| - bool is_dont_delete);
|
| -
|
| - private:
|
| - static Register* registers();
|
| - virtual Code::Kind kind() { return Code::LOAD_IC; }
|
| - virtual Logger::LogEventsAndTags log_kind(Handle<Code> code) {
|
| - if (!code->is_inline_cache_stub()) return Logger::STUB_TAG;
|
| - return code->ic_state() == MONOMORPHIC
|
| - ? Logger::LOAD_IC_TAG : Logger::LOAD_POLYMORPHIC_IC_TAG;
|
| - }
|
| - virtual void JitEvent(Handle<Name> name, Handle<Code> code);
|
| -};
|
| -
|
| -
|
| -class KeyedLoadStubCompiler: public BaseLoadStubCompiler {
|
| +class KeyedLoadStubCompiler: public LoadStubCompiler {
|
| public:
|
| explicit KeyedLoadStubCompiler(Isolate* isolate)
|
| - : BaseLoadStubCompiler(isolate, registers()) { }
|
| + : LoadStubCompiler(isolate, Code::KEYED_LOAD_IC) { }
|
|
|
| Handle<Code> CompileLoadElement(Handle<Map> receiver_map);
|
|
|
| @@ -822,30 +745,26 @@ class KeyedLoadStubCompiler: public BaseLoadStubCompiler {
|
|
|
| static void GenerateLoadDictionaryElement(MacroAssembler* masm);
|
|
|
| - private:
|
| + protected:
|
| static Register* registers();
|
| - virtual Code::Kind kind() { return Code::KEYED_LOAD_IC; }
|
| - virtual Logger::LogEventsAndTags log_kind(Handle<Code> code) {
|
| - if (!code->is_inline_cache_stub()) return Logger::STUB_TAG;
|
| - return code->ic_state() == MONOMORPHIC
|
| - ? Logger::KEYED_LOAD_IC_TAG : Logger::KEYED_LOAD_POLYMORPHIC_IC_TAG;
|
| - }
|
| - virtual void JitEvent(Handle<Name> name, Handle<Code> code);
|
| +
|
| + private:
|
| virtual void GenerateNameCheck(Handle<Name> name,
|
| Register name_reg,
|
| Label* miss);
|
| + friend class BaseLoadStoreStubCompiler;
|
| };
|
|
|
|
|
| -class BaseStoreStubCompiler: public BaseLoadStoreStubCompiler {
|
| +class StoreStubCompiler: public BaseLoadStoreStubCompiler {
|
| public:
|
| - BaseStoreStubCompiler(Isolate* isolate,
|
| - StrictModeFlag strict_mode,
|
| - Register* registers)
|
| - : BaseLoadStoreStubCompiler(isolate, registers),
|
| + StoreStubCompiler(Isolate* isolate,
|
| + StrictModeFlag strict_mode,
|
| + Code::Kind kind = Code::STORE_IC)
|
| + : BaseLoadStoreStubCompiler(isolate, kind),
|
| strict_mode_(strict_mode) { }
|
|
|
| - virtual ~BaseStoreStubCompiler() { }
|
| + virtual ~StoreStubCompiler() { }
|
|
|
| Handle<Code> CompileStoreTransition(Handle<JSObject> object,
|
| LookupResult* lookup,
|
| @@ -886,16 +805,27 @@ class BaseStoreStubCompiler: public BaseLoadStoreStubCompiler {
|
| Register scratch2,
|
| Label* miss_label);
|
|
|
| - static Builtins::Name MissBuiltin(Code::Kind kind) {
|
| - switch (kind) {
|
| - case Code::LOAD_IC: return Builtins::kLoadIC_Miss;
|
| - case Code::STORE_IC: return Builtins::kStoreIC_Miss;
|
| - case Code::KEYED_LOAD_IC: return Builtins::kKeyedLoadIC_Miss;
|
| - case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Miss;
|
| - default: UNREACHABLE();
|
| - }
|
| - return Builtins::kLoadIC_Miss;
|
| - }
|
| + Handle<Code> CompileStoreCallback(Handle<JSObject> object,
|
| + Handle<JSObject> holder,
|
| + Handle<Name> name,
|
| + Handle<ExecutableAccessorInfo> callback);
|
| +
|
| + Handle<Code> CompileStoreCallback(Handle<JSObject> object,
|
| + Handle<JSObject> holder,
|
| + Handle<Name> name,
|
| + const CallOptimization& call_optimization);
|
| +
|
| + static void GenerateStoreViaSetter(MacroAssembler* masm,
|
| + Handle<JSFunction> setter);
|
| +
|
| + Handle<Code> CompileStoreViaSetter(Handle<JSObject> object,
|
| + Handle<JSObject> holder,
|
| + Handle<Name> name,
|
| + Handle<JSFunction> setter);
|
| +
|
| + Handle<Code> CompileStoreInterceptor(Handle<JSObject> object,
|
| + Handle<Name> name);
|
| +
|
| static Builtins::Name SlowBuiltin(Code::Kind kind) {
|
| switch (kind) {
|
| case Code::STORE_IC: return Builtins::kStoreIC_Slow;
|
| @@ -928,56 +858,21 @@ class BaseStoreStubCompiler: public BaseLoadStoreStubCompiler {
|
| StrictModeFlag strict_mode() { return strict_mode_; }
|
| virtual Code::ExtraICState extra_state() { return strict_mode_; }
|
|
|
| - private:
|
| - StrictModeFlag strict_mode_;
|
| -};
|
| -
|
| -
|
| -class StoreStubCompiler: public BaseStoreStubCompiler {
|
| - public:
|
| - StoreStubCompiler(Isolate* isolate, StrictModeFlag strict_mode)
|
| - : BaseStoreStubCompiler(isolate, strict_mode, registers()) { }
|
| -
|
| -
|
| - Handle<Code> CompileStoreCallback(Handle<JSObject> object,
|
| - Handle<JSObject> holder,
|
| - Handle<Name> name,
|
| - Handle<ExecutableAccessorInfo> callback);
|
| -
|
| - Handle<Code> CompileStoreCallback(Handle<JSObject> object,
|
| - Handle<JSObject> holder,
|
| - Handle<Name> name,
|
| - const CallOptimization& call_optimization);
|
| -
|
| - static void GenerateStoreViaSetter(MacroAssembler* masm,
|
| - Handle<JSFunction> setter);
|
| -
|
| - Handle<Code> CompileStoreViaSetter(Handle<JSObject> object,
|
| - Handle<JSObject> holder,
|
| - Handle<Name> name,
|
| - Handle<JSFunction> setter);
|
| -
|
| - Handle<Code> CompileStoreInterceptor(Handle<JSObject> object,
|
| - Handle<Name> name);
|
| + protected:
|
| + static Register* registers();
|
|
|
| private:
|
| - static Register* registers();
|
| - virtual Code::Kind kind() { return Code::STORE_IC; }
|
| - virtual Logger::LogEventsAndTags log_kind(Handle<Code> code) {
|
| - if (!code->is_inline_cache_stub()) return Logger::STUB_TAG;
|
| - return code->ic_state() == MONOMORPHIC
|
| - ? Logger::STORE_IC_TAG : Logger::STORE_POLYMORPHIC_IC_TAG;
|
| - }
|
| - virtual void JitEvent(Handle<Name> name, Handle<Code> code);
|
| + StrictModeFlag strict_mode_;
|
| + friend class BaseLoadStoreStubCompiler;
|
| };
|
|
|
|
|
| -class KeyedStoreStubCompiler: public BaseStoreStubCompiler {
|
| +class KeyedStoreStubCompiler: public StoreStubCompiler {
|
| public:
|
| KeyedStoreStubCompiler(Isolate* isolate,
|
| StrictModeFlag strict_mode,
|
| KeyedAccessStoreMode store_mode)
|
| - : BaseStoreStubCompiler(isolate, strict_mode, registers()),
|
| + : StoreStubCompiler(isolate, strict_mode, Code::KEYED_STORE_IC),
|
| store_mode_(store_mode) { }
|
|
|
| Handle<Code> CompileStoreElement(Handle<Map> receiver_map);
|
| @@ -994,24 +889,18 @@ class KeyedStoreStubCompiler: public BaseStoreStubCompiler {
|
| virtual Code::ExtraICState extra_state() {
|
| return Code::ComputeExtraICState(store_mode_, strict_mode());
|
| }
|
| + static Register* registers();
|
|
|
| private:
|
| Register transition_map() {
|
| return registers()[3];
|
| }
|
|
|
| - static Register* registers();
|
| - virtual Code::Kind kind() { return Code::KEYED_STORE_IC; }
|
| - virtual Logger::LogEventsAndTags log_kind(Handle<Code> code) {
|
| - if (!code->is_inline_cache_stub()) return Logger::STUB_TAG;
|
| - return code->ic_state() == MONOMORPHIC
|
| - ? Logger::KEYED_STORE_IC_TAG : Logger::KEYED_STORE_POLYMORPHIC_IC_TAG;
|
| - }
|
| - virtual void JitEvent(Handle<Name> name, Handle<Code> code);
|
| virtual void GenerateNameCheck(Handle<Name> name,
|
| Register name_reg,
|
| Label* miss);
|
| KeyedAccessStoreMode store_mode_;
|
| + friend class BaseLoadStoreStubCompiler;
|
| };
|
|
|
|
|
|
|