Merge V8 5.2.361.47 DO NOT MERGE
https://chromium.googlesource.com/v8/v8/+/5.2.361.47
FPIIM-449
Change-Id: Ibec421b85a9b88cb3a432ada642e469fe7e78346
(cherry picked from commit bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8)
diff --git a/src/ic/ic.h b/src/ic/ic.h
index 8bd2f44..5dae179 100644
--- a/src/ic/ic.h
+++ b/src/ic/ic.h
@@ -35,11 +35,11 @@
// Compute the current IC state based on the target stub, receiver and name.
void UpdateState(Handle<Object> receiver, Handle<Object> name);
- bool IsNameCompatibleWithPrototypeFailure(Handle<Object> name);
- void MarkPrototypeFailure(Handle<Object> name) {
- DCHECK(IsNameCompatibleWithPrototypeFailure(name));
+ bool RecomputeHandlerForName(Handle<Object> name);
+ void MarkRecomputeHandler(Handle<Object> name) {
+ DCHECK(RecomputeHandlerForName(name));
old_state_ = state_;
- state_ = PROTOTYPE_FAILURE;
+ state_ = RECOMPUTE_HANDLER;
}
// Clear the inline cache to initial state.
@@ -47,14 +47,12 @@
#ifdef DEBUG
bool IsLoadStub() const {
- return target()->is_load_stub() || target()->is_keyed_load_stub();
+ return kind_ == Code::LOAD_IC || kind_ == Code::KEYED_LOAD_IC;
}
-
bool IsStoreStub() const {
- return target()->is_store_stub() || target()->is_keyed_store_stub();
+ return kind_ == Code::STORE_IC || kind_ == Code::KEYED_STORE_IC;
}
-
- bool IsCallStub() const { return target()->is_call_stub(); }
+ bool IsCallStub() const { return kind_ == Code::CALL_IC; }
#endif
static inline Handle<Map> GetHandlerCacheHolder(Handle<Map> receiver_map,
@@ -82,9 +80,6 @@
}
protected:
- // Get the call-site target; used for determining the state.
- Handle<Code> target() const { return target_; }
-
Address fp() const { return fp_; }
Address pc() const { return *pc_address_; }
Isolate* isolate() const { return isolate_; }
@@ -101,13 +96,12 @@
// Set the call-site target.
inline void set_target(Code* code);
- bool is_target_set() { return target_set_; }
bool is_vector_set() { return vector_set_; }
bool UseVector() const {
bool use = ICUseVector(kind());
// If we are supposed to use the nexus, verify the nexus is non-null.
- DCHECK(!use || nexus_ != NULL);
+ DCHECK(!use || nexus_ != nullptr);
return use;
}
@@ -139,9 +133,6 @@
Address constant_pool);
static inline void SetTargetAtAddress(Address address, Code* target,
Address constant_pool);
- static void OnTypeFeedbackChanged(Isolate* isolate, Address address,
- State old_state, State new_state,
- bool target_remains_ic_stub);
// As a vector-based IC, type feedback must be updated differently.
static void OnTypeFeedbackChanged(Isolate* isolate, Code* host);
static void PostPatching(Address address, Code* target, Code* old_target);
@@ -149,6 +140,10 @@
// Compute the handler either by compiling or by retrieving a cached version.
Handle<Code> ComputeHandler(LookupIterator* lookup,
Handle<Object> value = Handle<Code>::null());
+ virtual Handle<Code> GetMapIndependentHandler(LookupIterator* lookup) {
+ UNREACHABLE();
+ return Handle<Code>::null();
+ }
virtual Handle<Code> CompileHandler(LookupIterator* lookup,
Handle<Object> value,
CacheHolderFlag cache_holder) {
@@ -164,22 +159,18 @@
bool IsTransitionOfMonomorphicTarget(Map* source_map, Map* target_map);
void PatchCache(Handle<Name> name, Handle<Code> code);
Code::Kind kind() const { return kind_; }
+ bool is_keyed() const {
+ return kind_ == Code::KEYED_LOAD_IC || kind_ == Code::KEYED_STORE_IC;
+ }
Code::Kind handler_kind() const {
if (kind_ == Code::KEYED_LOAD_IC) return Code::LOAD_IC;
DCHECK(kind_ == Code::LOAD_IC || kind_ == Code::STORE_IC ||
kind_ == Code::KEYED_STORE_IC);
return kind_;
}
- virtual Handle<Code> megamorphic_stub() {
- UNREACHABLE();
- return Handle<Code>::null();
- }
-
- bool TryRemoveInvalidPrototypeDependentStub(Handle<Object> receiver,
- Handle<String> name);
+ bool ShouldRecomputeHandler(Handle<Object> receiver, Handle<String> name);
ExtraICState extra_ic_state() const { return extra_ic_state_; }
- void set_extra_ic_state(ExtraICState state) { extra_ic_state_ = state; }
Handle<Map> receiver_map() { return receiver_map_; }
void update_receiver_map(Handle<Object> receiver) {
@@ -202,12 +193,10 @@
return target_maps_.length() > 0 ? *target_maps_.at(0) : NULL;
}
- inline void UpdateTarget();
-
Handle<TypeFeedbackVector> vector() const { return nexus()->vector_handle(); }
FeedbackVectorSlot slot() const { return nexus()->slot(); }
State saved_state() const {
- return state() == PROTOTYPE_FAILURE ? old_state_ : state();
+ return state() == RECOMPUTE_HANDLER ? old_state_ : state();
}
template <class NexusClass>
@@ -217,25 +206,17 @@
FeedbackNexus* nexus() const { return nexus_; }
inline Code* get_host();
+ inline Code* target() const;
private:
- inline Code* raw_target() const;
inline Address constant_pool() const;
inline Address raw_constant_pool() const;
void FindTargetMaps() {
if (target_maps_set_) return;
target_maps_set_ = true;
- if (UseVector()) {
- nexus()->ExtractMaps(&target_maps_);
- } else {
- if (state_ == MONOMORPHIC) {
- Map* map = target_->FindFirstMap();
- if (map != NULL) target_maps_.Add(handle(map));
- } else if (state_ != UNINITIALIZED && state_ != PREMONOMORPHIC) {
- target_->FindAllMaps(&target_maps_);
- }
- }
+ DCHECK(UseVector());
+ nexus()->ExtractMaps(&target_maps_);
}
// Frame pointer for the frame that uses (calls) the IC.
@@ -253,9 +234,6 @@
Isolate* isolate_;
- // The original code target that missed.
- Handle<Code> target_;
- bool target_set_;
bool vector_set_;
State old_state_; // For saving if we marked as prototype failure.
State state_;
@@ -283,9 +261,6 @@
void HandleMiss(Handle<Object> function);
// Code generator routines.
- static Handle<Code> initialize_stub(Isolate* isolate, int argc,
- ConvertReceiverMode mode,
- TailCallMode tail_call_mode);
static Handle<Code> initialize_stub_in_optimized_code(
Isolate* isolate, int argc, ConvertReceiverMode mode,
TailCallMode tail_call_mode);
@@ -312,13 +287,10 @@
// Code generator routines.
- static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); }
static void GenerateMiss(MacroAssembler* masm);
static void GenerateRuntimeGetProperty(MacroAssembler* masm);
static void GenerateNormal(MacroAssembler* masm);
- static Handle<Code> initialize_stub(Isolate* isolate,
- ExtraICState extra_state);
static Handle<Code> initialize_stub_in_optimized_code(
Isolate* isolate, ExtraICState extra_state, State initialization_state);
@@ -328,32 +300,22 @@
static void Clear(Isolate* isolate, Code* host, LoadICNexus* nexus);
protected:
- inline void set_target(Code* code);
-
Handle<Code> slow_stub() const {
- if (kind() == Code::LOAD_IC) {
- return isolate()->builtins()->LoadIC_Slow();
- } else {
- DCHECK_EQ(Code::KEYED_LOAD_IC, kind());
- return isolate()->builtins()->KeyedLoadIC_Slow();
- }
+ return isolate()->builtins()->LoadIC_Slow();
}
- Handle<Code> megamorphic_stub() override;
-
// Update the inline cache and the global stub cache based on the
// lookup result.
void UpdateCaches(LookupIterator* lookup);
+ Handle<Code> GetMapIndependentHandler(LookupIterator* lookup) override;
+
Handle<Code> CompileHandler(LookupIterator* lookup, Handle<Object> unused,
CacheHolderFlag cache_holder) override;
private:
Handle<Code> SimpleFieldLoad(FieldIndex index);
- static void Clear(Isolate* isolate, Address address, Code* target,
- Address constant_pool);
-
friend class IC;
};
@@ -364,7 +326,6 @@
KeyedLoadICNexus* nexus = NULL)
: LoadIC(depth, isolate, nexus) {
DCHECK(nexus != NULL);
- DCHECK(target()->is_keyed_load_stub());
}
MUST_USE_RESULT MaybeHandle<Object> Load(Handle<Object> object,
@@ -373,18 +334,8 @@
// Code generator routines.
static void GenerateMiss(MacroAssembler* masm);
static void GenerateRuntimeGetProperty(MacroAssembler* masm);
- static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); }
static void GenerateMegamorphic(MacroAssembler* masm);
- // Bit mask to be tested against bit field for the cases when
- // generic stub should go into slow case.
- // Access check is necessary explicitly since generic stub does not perform
- // map checks.
- static const int kSlowCaseBitFieldMask =
- (1 << Map::kIsAccessCheckNeeded) | (1 << Map::kHasIndexedInterceptor);
-
- static Handle<Code> initialize_stub(Isolate* isolate,
- ExtraICState extra_state);
static Handle<Code> initialize_stub_in_optimized_code(
Isolate* isolate, State initialization_state, ExtraICState extra_state);
static Handle<Code> ChooseMegamorphicStub(Isolate* isolate,
@@ -394,22 +345,15 @@
protected:
// receiver is HeapObject because it could be a String or a JSObject
- Handle<Code> LoadElementStub(Handle<HeapObject> receiver);
+ void UpdateLoadElement(Handle<HeapObject> receiver);
private:
- static void Clear(Isolate* isolate, Address address, Code* target,
- Address constant_pool);
-
friend class IC;
};
class StoreIC : public IC {
public:
- static ExtraICState ComputeExtraICState(LanguageMode flag) {
- return StoreICState(flag).GetExtraICState();
- }
-
StoreIC(FrameDepth depth, Isolate* isolate, FeedbackNexus* nexus = NULL)
: IC(depth, isolate, nexus) {
DCHECK(IsStoreStub());
@@ -421,19 +365,12 @@
// Code generators for stub routines. Only called once at startup.
static void GenerateSlow(MacroAssembler* masm);
- static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); }
- static void GeneratePreMonomorphic(MacroAssembler* masm) {
- GenerateMiss(masm);
- }
static void GenerateMiss(MacroAssembler* masm);
static void GenerateMegamorphic(MacroAssembler* masm);
static void GenerateNormal(MacroAssembler* masm);
static void GenerateRuntimeSetProperty(MacroAssembler* masm,
LanguageMode language_mode);
- static Handle<Code> initialize_stub(Isolate* isolate,
- LanguageMode language_mode,
- State initialization_state);
static Handle<Code> initialize_stub_in_optimized_code(
Isolate* isolate, LanguageMode language_mode, State initialization_state);
@@ -449,29 +386,17 @@
protected:
// Stub accessors.
- Handle<Code> megamorphic_stub() override;
Handle<Code> slow_stub() const;
- virtual Handle<Code> pre_monomorphic_stub() const {
- return pre_monomorphic_stub(isolate(), language_mode());
- }
-
- static Handle<Code> pre_monomorphic_stub(Isolate* isolate,
- LanguageMode language_mode);
-
// Update the inline cache and the global stub cache based on the
// lookup result.
void UpdateCaches(LookupIterator* lookup, Handle<Object> value,
JSReceiver::StoreFromKeyed store_mode);
+ Handle<Code> GetMapIndependentHandler(LookupIterator* lookup) override;
Handle<Code> CompileHandler(LookupIterator* lookup, Handle<Object> value,
CacheHolderFlag cache_holder) override;
private:
- inline void set_target(Code* code);
-
- static void Clear(Isolate* isolate, Address address, Code* target,
- Address constant_pool);
-
friend class IC;
};
@@ -484,50 +409,24 @@
class KeyedStoreIC : public StoreIC {
public:
- // ExtraICState bits (building on IC)
- // ExtraICState bits
- // When more language modes are added, these BitFields need to move too.
- STATIC_ASSERT(i::LANGUAGE_END == 3);
- class ExtraICStateKeyedAccessStoreMode
- : public BitField<KeyedAccessStoreMode, 3, 3> {}; // NOLINT
-
- class IcCheckTypeField : public BitField<IcCheckType, 6, 1> {};
-
- static ExtraICState ComputeExtraICState(LanguageMode flag,
- KeyedAccessStoreMode mode) {
- return StoreICState(flag).GetExtraICState() |
- ExtraICStateKeyedAccessStoreMode::encode(mode) |
- IcCheckTypeField::encode(ELEMENT);
- }
-
KeyedAccessStoreMode GetKeyedAccessStoreMode() {
return casted_nexus<KeyedStoreICNexus>()->GetKeyedAccessStoreMode();
}
KeyedStoreIC(FrameDepth depth, Isolate* isolate,
KeyedStoreICNexus* nexus = NULL)
- : StoreIC(depth, isolate, nexus) {
- DCHECK(target()->is_keyed_store_stub());
- }
+ : StoreIC(depth, isolate, nexus) {}
MUST_USE_RESULT MaybeHandle<Object> Store(Handle<Object> object,
Handle<Object> name,
Handle<Object> value);
// Code generators for stub routines. Only called once at startup.
- static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); }
- static void GeneratePreMonomorphic(MacroAssembler* masm) {
- GenerateMiss(masm);
- }
static void GenerateMiss(MacroAssembler* masm);
static void GenerateSlow(MacroAssembler* masm);
static void GenerateMegamorphic(MacroAssembler* masm,
LanguageMode language_mode);
- static Handle<Code> initialize_stub(Isolate* isolate,
- LanguageMode language_mode,
- State initialization_state);
-
static Handle<Code> initialize_stub_in_optimized_code(
Isolate* isolate, LanguageMode language_mode, State initialization_state);
static Handle<Code> ChooseMegamorphicStub(Isolate* isolate,
@@ -536,27 +435,10 @@
static void Clear(Isolate* isolate, Code* host, KeyedStoreICNexus* nexus);
protected:
- virtual Handle<Code> pre_monomorphic_stub() const {
- return pre_monomorphic_stub(isolate(), language_mode());
- }
- static Handle<Code> pre_monomorphic_stub(Isolate* isolate,
- LanguageMode language_mode) {
- if (is_strict(language_mode)) {
- return isolate->builtins()->KeyedStoreIC_PreMonomorphic_Strict();
- } else {
- return isolate->builtins()->KeyedStoreIC_PreMonomorphic();
- }
- }
-
- Handle<Code> StoreElementStub(Handle<Map> receiver_map,
- KeyedAccessStoreMode store_mode);
+ void UpdateStoreElement(Handle<Map> receiver_map,
+ KeyedAccessStoreMode store_mode);
private:
- inline void set_target(Code* code);
-
- static void Clear(Isolate* isolate, Address address, Code* target,
- Address constant_pool);
-
Handle<Map> ComputeTransitionedMap(Handle<Map> map,
KeyedAccessStoreMode store_mode);