| Index: src/ic.h
|
| diff --git a/src/ic.h b/src/ic.h
|
| index 98771685d33f2c4111f2382a3f40dad5a1c5b120..4cd49f88006e42fedc7521de0ff0be6929875fe6 100644
|
| --- a/src/ic.h
|
| +++ b/src/ic.h
|
| @@ -184,11 +184,11 @@ class IC {
|
|
|
| // Compute the handler either by compiling or by retrieving a cached version.
|
| Handle<Code> ComputeHandler(LookupIterator* lookup, Handle<Object> object,
|
| - Handle<String> name,
|
| + Handle<Name> name,
|
| Handle<Object> value = Handle<Code>::null());
|
| virtual Handle<Code> CompileHandler(LookupIterator* lookup,
|
| Handle<Object> object,
|
| - Handle<String> name, Handle<Object> value,
|
| + Handle<Name> name, Handle<Object> value,
|
| CacheHolderFlag cache_holder) {
|
| UNREACHABLE();
|
| return Handle<Code>::null();
|
| @@ -207,13 +207,13 @@ class IC {
|
| return Handle<Code>::null();
|
| }
|
|
|
| - void UpdateMonomorphicIC(Handle<Code> handler, Handle<String> name);
|
| - bool UpdatePolymorphicIC(Handle<String> name, Handle<Code> code);
|
| + void UpdateMonomorphicIC(Handle<Code> handler, Handle<Name> name);
|
| + bool UpdatePolymorphicIC(Handle<Name> name, Handle<Code> code);
|
| void UpdateMegamorphicCache(HeapType* type, Name* name, Code* code);
|
|
|
| - void CopyICToMegamorphicCache(Handle<String> name);
|
| + void CopyICToMegamorphicCache(Handle<Name> name);
|
| bool IsTransitionOfMonomorphicTarget(Map* source_map, Map* target_map);
|
| - void PatchCache(Handle<String> name, Handle<Code> code);
|
| + void PatchCache(Handle<Name> name, Handle<Code> code);
|
| Code::Kind kind() const { return kind_; }
|
| Code::Kind handler_kind() const {
|
| if (kind_ == Code::KEYED_LOAD_IC) return Code::LOAD_IC;
|
| @@ -398,6 +398,10 @@ class LoadIC: public IC {
|
| kNameIndex,
|
| kParameterCount
|
| };
|
| + enum PropertyLookupMode {
|
| + NORMAL_LOOKUP,
|
| + OWN_PROPERTY_LOOKUP
|
| + };
|
| static const Register ReceiverRegister();
|
| static const Register NameRegister();
|
|
|
| @@ -411,8 +415,11 @@ class LoadIC: public IC {
|
| explicit State(ExtraICState extra_ic_state)
|
| : state_(extra_ic_state) {}
|
|
|
| - explicit State(ContextualMode mode)
|
| - : state_(ContextualModeBits::encode(mode)) {}
|
| + explicit State(
|
| + ContextualMode contextual_mode,
|
| + PropertyLookupMode property_lookup_mode)
|
| + : state_(ContextualModeBits::encode(contextual_mode) |
|
| + PropertyLookupModeBits::encode(property_lookup_mode)) {}
|
|
|
| ExtraICState GetExtraICState() const { return state_; }
|
|
|
| @@ -420,25 +427,41 @@ class LoadIC: public IC {
|
| return ContextualModeBits::decode(state_);
|
| }
|
|
|
| + PropertyLookupMode property_lookup_mode() const {
|
| + return PropertyLookupModeBits::decode(state_);
|
| + }
|
| +
|
| private:
|
| class ContextualModeBits: public BitField<ContextualMode, 0, 1> {};
|
| + class PropertyLookupModeBits: public BitField<PropertyLookupMode, 1, 1>{};
|
| STATIC_ASSERT(static_cast<int>(NOT_CONTEXTUAL) == 0);
|
| + STATIC_ASSERT(static_cast<int>(NORMAL_LOOKUP) == 0);
|
|
|
| const ExtraICState state_;
|
| };
|
|
|
| - static ExtraICState ComputeExtraICState(ContextualMode contextual_mode) {
|
| - return State(contextual_mode).GetExtraICState();
|
| + static ExtraICState ComputeExtraICState(
|
| + ContextualMode contextual_mode,
|
| + PropertyLookupMode property_lookup_mode) {
|
| + return State(contextual_mode, property_lookup_mode).GetExtraICState();
|
| }
|
|
|
| static ContextualMode GetContextualMode(ExtraICState state) {
|
| return State(state).contextual_mode();
|
| }
|
|
|
| + static PropertyLookupMode GetPropertyLookupMode(ExtraICState state) {
|
| + return State(state).property_lookup_mode();
|
| + }
|
| +
|
| ContextualMode contextual_mode() const {
|
| return GetContextualMode(extra_ic_state());
|
| }
|
|
|
| + PropertyLookupMode property_lookup_mode() const {
|
| + return GetPropertyLookupMode(extra_ic_state());
|
| + }
|
| +
|
| explicit LoadIC(FrameDepth depth, Isolate* isolate)
|
| : IC(depth, isolate) {
|
| DCHECK(IsLoadStub());
|
| @@ -461,49 +484,61 @@ class LoadIC: public IC {
|
| GenerateMiss(masm);
|
| }
|
| static void GenerateMiss(MacroAssembler* masm);
|
| - static void GenerateMegamorphic(MacroAssembler* masm);
|
| + static void GenerateMegamorphic(MacroAssembler* masm, ExtraICState extra_ic_state);
|
| static void GenerateNormal(MacroAssembler* masm);
|
| static void GenerateRuntimeGetProperty(MacroAssembler* masm);
|
| + static void GenerateRuntimeGetOwnProperty(MacroAssembler* masm);
|
|
|
| static Handle<Code> initialize_stub(Isolate* isolate,
|
| ExtraICState extra_state);
|
|
|
| MUST_USE_RESULT MaybeHandle<Object> Load(Handle<Object> object,
|
| - Handle<String> name);
|
| + Handle<Name> name);
|
|
|
| protected:
|
| void set_target(Code* code) {
|
| - // The contextual mode must be preserved across IC patching.
|
| + // The contextual mode and the property lookup mode
|
| + // must be preserved across IC patching.
|
| DCHECK(GetContextualMode(code->extra_ic_state()) ==
|
| GetContextualMode(target()->extra_ic_state()));
|
| + DCHECK(GetPropertyLookupMode(code->extra_ic_state()) ==
|
| + GetPropertyLookupMode(target()->extra_ic_state()));
|
|
|
| IC::set_target(code);
|
| }
|
|
|
| Handle<Code> slow_stub() const {
|
| if (kind() == Code::LOAD_IC) {
|
| - return isolate()->builtins()->LoadIC_Slow();
|
| + if (property_lookup_mode() == OWN_PROPERTY_LOOKUP) {
|
| + return isolate()->builtins()->LoadICOwn_Slow();
|
| + } else {
|
| + return isolate()->builtins()->LoadIC_Slow();
|
| + }
|
| } else {
|
| DCHECK_EQ(Code::KEYED_LOAD_IC, kind());
|
| - return isolate()->builtins()->KeyedLoadIC_Slow();
|
| + if (property_lookup_mode() == OWN_PROPERTY_LOOKUP) {
|
| + return isolate()->builtins()->KeyedLoadICOwn_Slow();
|
| + } else {
|
| + return isolate()->builtins()->KeyedLoadIC_Slow();
|
| + }
|
| }
|
| }
|
|
|
| - virtual Handle<Code> megamorphic_stub();
|
| + virtual Handle<Code> megamorphic_stub() V8_OVERRIDE;
|
|
|
| // Update the inline cache and the global stub cache based on the
|
| // lookup result.
|
| void UpdateCaches(LookupIterator* lookup, Handle<Object> object,
|
| - Handle<String> name);
|
| + Handle<Name> name);
|
|
|
| virtual Handle<Code> CompileHandler(LookupIterator* lookup,
|
| Handle<Object> object,
|
| - Handle<String> name,
|
| + Handle<Name> name,
|
| Handle<Object> unused,
|
| CacheHolderFlag cache_holder);
|
|
|
| private:
|
| - virtual Handle<Code> pre_monomorphic_stub() const;
|
| + virtual Handle<Code> pre_monomorphic_stub() V8_OVERRIDE const;
|
| static Handle<Code> pre_monomorphic_stub(Isolate* isolate,
|
| ExtraICState extra_state);
|
|
|
| @@ -531,11 +566,12 @@ class KeyedLoadIC: public LoadIC {
|
| // Code generator routines.
|
| static void GenerateMiss(MacroAssembler* masm);
|
| static void GenerateRuntimeGetProperty(MacroAssembler* masm);
|
| + static void GenerateRuntimeGetOwnProperty(MacroAssembler* masm);
|
| static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); }
|
| static void GeneratePreMonomorphic(MacroAssembler* masm) {
|
| GenerateMiss(masm);
|
| }
|
| - static void GenerateGeneric(MacroAssembler* masm);
|
| + static void GenerateGeneric(MacroAssembler* masm, ExtraICState extra_state);
|
| static void GenerateString(MacroAssembler* masm);
|
| static void GenerateIndexedInterceptor(MacroAssembler* masm);
|
| static void GenerateSloppyArguments(MacroAssembler* masm);
|
| @@ -547,24 +583,31 @@ class KeyedLoadIC: public LoadIC {
|
| static const int kSlowCaseBitFieldMask =
|
| (1 << Map::kIsAccessCheckNeeded) | (1 << Map::kHasIndexedInterceptor);
|
|
|
| - static Handle<Code> generic_stub(Isolate* isolate);
|
| - static Handle<Code> pre_monomorphic_stub(Isolate* isolate);
|
| + static Handle<Code> initialize_stub(Isolate* isolate,
|
| + ExtraICState extra_state);
|
| + static Handle<Code> generic_stub(Isolate* isolate,
|
| + ExtraICState extra_state);
|
| + static Handle<Code> pre_monomorphic_stub(Isolate* isolate,
|
| + ExtraICState extra_state);
|
|
|
| protected:
|
| Handle<Code> LoadElementStub(Handle<JSObject> receiver);
|
| virtual Handle<Code> pre_monomorphic_stub() const {
|
| - return pre_monomorphic_stub(isolate());
|
| + return pre_monomorphic_stub(isolate(), extra_ic_state());
|
| }
|
|
|
| private:
|
| - Handle<Code> generic_stub() const { return generic_stub(isolate()); }
|
| + Handle<Code> generic_stub() const { return generic_stub(isolate(), extra_ic_state()); }
|
| Handle<Code> indexed_interceptor_stub() {
|
| + DCHECK(GetPropertyLookupMode(extra_ic_state()) == NORMAL_LOOKUP);
|
| return isolate()->builtins()->KeyedLoadIC_IndexedInterceptor();
|
| }
|
| Handle<Code> sloppy_arguments_stub() {
|
| + DCHECK(GetPropertyLookupMode(extra_ic_state()) == NORMAL_LOOKUP);
|
| return isolate()->builtins()->KeyedLoadIC_SloppyArguments();
|
| }
|
| Handle<Code> string_stub() {
|
| + DCHECK(GetPropertyLookupMode(extra_ic_state()) == NORMAL_LOOKUP);
|
| return isolate()->builtins()->KeyedLoadIC_String();
|
| }
|
|
|
|
|