| Index: src/ic.h
|
| diff --git a/src/ic.h b/src/ic.h
|
| index bfb73ac6a530772ad7bc02e9ee88a9a07c726b38..3db352acfd6d9449b47ea0416ea45e357b699738 100644
|
| --- a/src/ic.h
|
| +++ b/src/ic.h
|
| @@ -250,11 +250,13 @@ class IC {
|
| UNREACHABLE();
|
| return Handle<Code>::null();
|
| }
|
| - virtual StrictModeFlag strict_mode() const { return kNonStrictMode; }
|
| +
|
| bool TryRemoveInvalidPrototypeDependentStub(Handle<Object> receiver,
|
| Handle<String> name);
|
| void TryRemoveInvalidHandlers(Handle<Map> map, Handle<String> name);
|
|
|
| + virtual ExtraICState extra_ic_state() { return kNoExtraICState; }
|
| +
|
| private:
|
| Code* raw_target() const { return GetTargetAtAddress(address()); }
|
|
|
| @@ -296,8 +298,13 @@ class IC_Utility {
|
|
|
| class CallICBase: public IC {
|
| public:
|
| - class Contextual: public BitField<bool, 0, 1> {};
|
| + // ExtraICState bits
|
| + class Contextual: public BitField<ContextualMode, 0, 1> {};
|
| class StringStubState: public BitField<StringStubFeedback, 1, 1> {};
|
| + static ExtraICState ComputeExtraICState(ContextualMode mode,
|
| + StringStubFeedback feedback) {
|
| + return Contextual::encode(mode) | StringStubState::encode(feedback);
|
| + }
|
|
|
| // Returns a JSFunction or a Failure.
|
| MUST_USE_RESULT MaybeObject* LoadFunction(Handle<Object> object,
|
| @@ -307,8 +314,6 @@ class CallICBase: public IC {
|
| CallICBase(Code::Kind kind, Isolate* isolate)
|
| : IC(EXTRA_CALL_FRAME, isolate), kind_(kind) {}
|
|
|
| - virtual Code::ExtraICState extra_ic_state() { return Code::kNoExtraICState; }
|
| -
|
| // Compute a monomorphic stub if possible, otherwise return a null handle.
|
| Handle<Code> ComputeMonomorphicStub(LookupResult* lookup,
|
| Handle<Object> object,
|
| @@ -334,14 +339,14 @@ class CallICBase: public IC {
|
| static void GenerateMiss(MacroAssembler* masm,
|
| int argc,
|
| IC::UtilityId id,
|
| - Code::ExtraICState extra_state);
|
| + ExtraICState extra_state);
|
|
|
| static void GenerateNormal(MacroAssembler* masm, int argc);
|
|
|
| static void GenerateMonomorphicCacheProbe(MacroAssembler* masm,
|
| int argc,
|
| Code::Kind kind,
|
| - Code::ExtraICState extra_state);
|
| + ExtraICState extra_state);
|
|
|
| virtual Handle<Code> megamorphic_stub();
|
| virtual Handle<Code> pre_monomorphic_stub();
|
| @@ -363,31 +368,31 @@ class CallIC: public CallICBase {
|
| // Code generator routines.
|
| static void GenerateInitialize(MacroAssembler* masm,
|
| int argc,
|
| - Code::ExtraICState extra_state) {
|
| + ExtraICState extra_state) {
|
| GenerateMiss(masm, argc, extra_state);
|
| }
|
|
|
| static void GenerateMiss(MacroAssembler* masm,
|
| int argc,
|
| - Code::ExtraICState extra_state) {
|
| + ExtraICState extra_state) {
|
| CallICBase::GenerateMiss(masm, argc, IC::kCallIC_Miss, extra_state);
|
| }
|
|
|
| static void GenerateMegamorphic(MacroAssembler* masm,
|
| int argc,
|
| - Code::ExtraICState extra_ic_state);
|
| + ExtraICState extra_ic_state);
|
|
|
| static void GenerateNormal(MacroAssembler* masm, int argc) {
|
| CallICBase::GenerateNormal(masm, argc);
|
| - GenerateMiss(masm, argc, Code::kNoExtraICState);
|
| + GenerateMiss(masm, argc, kNoExtraICState);
|
| }
|
| bool TryUpdateExtraICState(LookupResult* lookup, Handle<Object> object);
|
|
|
| protected:
|
| - virtual Code::ExtraICState extra_ic_state() { return extra_ic_state_; }
|
| + virtual ExtraICState extra_ic_state() { return extra_ic_state_; }
|
|
|
| private:
|
| - Code::ExtraICState extra_ic_state_;
|
| + ExtraICState extra_ic_state_;
|
| };
|
|
|
|
|
| @@ -408,7 +413,7 @@ class KeyedCallIC: public CallICBase {
|
|
|
| static void GenerateMiss(MacroAssembler* masm, int argc) {
|
| CallICBase::GenerateMiss(masm, argc, IC::kKeyedCallIC_Miss,
|
| - Code::kNoExtraICState);
|
| + kNoExtraICState);
|
| }
|
|
|
| static void GenerateMegamorphic(MacroAssembler* masm, int argc);
|
| @@ -559,13 +564,28 @@ class KeyedLoadIC: public LoadIC {
|
|
|
| class StoreIC: public IC {
|
| public:
|
| + // ExtraICState bits
|
| + class StrictModeState: public BitField<StrictModeFlag, 0, 1> {};
|
| + static ExtraICState ComputeExtraICState(StrictModeFlag flag) {
|
| + return StrictModeState::encode(flag);
|
| + }
|
| +
|
| + static StrictModeFlag GetStrictMode(ExtraICState state) {
|
| + return StrictModeState::decode(state);
|
| + }
|
| +
|
| + // For convenience, a statically declared encoding of strict mode extra
|
| + // IC state.
|
| + static const ExtraICState kStrictModeState =
|
| + 1 << StrictModeState::kShift;
|
| +
|
| StoreIC(FrameDepth depth, Isolate* isolate)
|
| : IC(depth, isolate),
|
| - strict_mode_(Code::GetStrictMode(target()->extra_ic_state())) {
|
| + strict_mode_(GetStrictMode(target()->extra_ic_state())) {
|
| ASSERT(IsStoreStub());
|
| }
|
|
|
| - virtual StrictModeFlag strict_mode() const { return strict_mode_; }
|
| + StrictModeFlag strict_mode() const { return strict_mode_; }
|
|
|
| // Code generators for stub routines. Only called once at startup.
|
| static void GenerateSlow(MacroAssembler* masm);
|
| @@ -642,11 +662,15 @@ class StoreIC: public IC {
|
| Handle<Object> value,
|
| InlineCacheHolderFlag cache_holder);
|
|
|
| + virtual ExtraICState extra_ic_state() {
|
| + return ComputeExtraICState(strict_mode());
|
| + }
|
| +
|
| private:
|
| void set_target(Code* code) {
|
| // Strict mode must be preserved across IC patching.
|
| - ASSERT(Code::GetStrictMode(code->extra_ic_state()) ==
|
| - Code::GetStrictMode(target()->extra_ic_state()));
|
| + ASSERT(GetStrictMode(code->extra_ic_state()) ==
|
| + GetStrictMode(target()->extra_ic_state()));
|
| IC::set_target(code);
|
| }
|
|
|
| @@ -681,6 +705,22 @@ enum KeyedStoreIncrementLength {
|
|
|
| class KeyedStoreIC: public StoreIC {
|
| public:
|
| + // ExtraICState bits (building on IC)
|
| + // ExtraICState bits
|
| + class ExtraICStateKeyedAccessStoreMode:
|
| + public BitField<KeyedAccessStoreMode, 1, 4> {}; // NOLINT
|
| +
|
| + static ExtraICState ComputeExtraICState(StrictModeFlag flag,
|
| + KeyedAccessStoreMode mode) {
|
| + return StrictModeState::encode(flag) |
|
| + ExtraICStateKeyedAccessStoreMode::encode(mode);
|
| + }
|
| +
|
| + static KeyedAccessStoreMode GetKeyedAccessStoreMode(
|
| + ExtraICState extra_state) {
|
| + return ExtraICStateKeyedAccessStoreMode::decode(extra_state);
|
| + }
|
| +
|
| KeyedStoreIC(FrameDepth depth, Isolate* isolate)
|
| : StoreIC(depth, isolate) {
|
| ASSERT(target()->is_keyed_store_stub());
|
| @@ -707,6 +747,10 @@ class KeyedStoreIC: public StoreIC {
|
|
|
| virtual void UpdateMegamorphicCache(Type* type, Name* name, Code* code) { }
|
|
|
| + virtual ExtraICState extra_ic_state() {
|
| + return ComputeExtraICState(strict_mode(), STANDARD_STORE);
|
| + }
|
| +
|
| virtual Handle<Code> pre_monomorphic_stub() {
|
| return pre_monomorphic_stub(isolate(), strict_mode());
|
| }
|
| @@ -735,7 +779,7 @@ class KeyedStoreIC: public StoreIC {
|
| private:
|
| void set_target(Code* code) {
|
| // Strict mode must be preserved across IC patching.
|
| - ASSERT(Code::GetStrictMode(code->extra_ic_state()) == strict_mode());
|
| + ASSERT(GetStrictMode(code->extra_ic_state()) == strict_mode());
|
| IC::set_target(code);
|
| }
|
|
|
|
|