| Index: src/ic.h
|
| diff --git a/src/ic.h b/src/ic.h
|
| index 4647c9c6d1853acabd46b073cc8f7636f6e74b2b..4e7542341af51ae536facebe9e193c69e881b752 100644
|
| --- a/src/ic.h
|
| +++ b/src/ic.h
|
| @@ -75,13 +75,10 @@ class IC {
|
| // Compute the current IC state based on the target stub, receiver and name.
|
| void UpdateState(Handle<Object> receiver, Handle<Object> name);
|
|
|
| - bool IsNameCompatibleWithMonomorphicPrototypeFailure(Handle<Object> name);
|
| - bool TryMarkMonomorphicPrototypeFailure(Handle<Object> name) {
|
| - if (IsNameCompatibleWithMonomorphicPrototypeFailure(name)) {
|
| - state_ = MONOMORPHIC_PROTOTYPE_FAILURE;
|
| - return true;
|
| - }
|
| - return false;
|
| + bool IsNameCompatibleWithPrototypeFailure(Handle<Object> name);
|
| + void MarkPrototypeFailure(Handle<Object> name) {
|
| + ASSERT(IsNameCompatibleWithPrototypeFailure(name));
|
| + state_ = PROTOTYPE_FAILURE;
|
| }
|
|
|
| // If the stub contains weak maps then this function adds the stub to
|
| @@ -111,20 +108,15 @@ class IC {
|
| }
|
| #endif
|
|
|
| - // Determines which map must be used for keeping the code stub.
|
| - // These methods should not be called with undefined or null.
|
| - static inline InlineCacheHolderFlag GetCodeCacheForObject(Object* object);
|
| - // TODO(verwaest): This currently returns a HeapObject rather than JSObject*
|
| - // since loading the IC for loading the length from strings are stored on
|
| - // the string map directly, rather than on the JSObject-typed prototype.
|
| - static inline HeapObject* GetCodeCacheHolder(Isolate* isolate,
|
| - Object* object,
|
| - InlineCacheHolderFlag holder);
|
| -
|
| - static inline InlineCacheHolderFlag GetCodeCacheFlag(HeapType* type);
|
| - static inline Handle<Map> GetCodeCacheHolder(InlineCacheHolderFlag flag,
|
| - HeapType* type,
|
| - Isolate* isolate);
|
| + template <class TypeClass>
|
| + static JSFunction* GetRootConstructor(TypeClass* type,
|
| + Context* native_context);
|
| + static inline Handle<Map> GetHandlerCacheHolder(HeapType* type,
|
| + bool receiver_is_holder,
|
| + Isolate* isolate,
|
| + CacheHolderFlag* flag);
|
| + static inline Handle<Map> GetICCacheHolder(HeapType* type, Isolate* isolate,
|
| + CacheHolderFlag* flag);
|
|
|
| static bool IsCleared(Code* code) {
|
| InlineCacheState state = code->ic_state();
|
| @@ -193,28 +185,21 @@ class IC {
|
| Handle<Object> value = Handle<Code>::null());
|
| virtual Handle<Code> CompileHandler(LookupResult* lookup,
|
| Handle<Object> object,
|
| - Handle<String> name,
|
| - Handle<Object> value,
|
| - InlineCacheHolderFlag cache_holder) {
|
| + Handle<String> name, Handle<Object> value,
|
| + CacheHolderFlag cache_holder) {
|
| UNREACHABLE();
|
| return Handle<Code>::null();
|
| }
|
|
|
| - void UpdateMonomorphicIC(Handle<HeapType> type,
|
| - Handle<Code> handler,
|
| - Handle<String> name);
|
| + void UpdateMonomorphicIC(Handle<Code> handler, Handle<String> name);
|
|
|
| - bool UpdatePolymorphicIC(Handle<HeapType> type,
|
| - Handle<String> name,
|
| - Handle<Code> code);
|
| + bool UpdatePolymorphicIC(Handle<String> name, Handle<Code> code);
|
|
|
| virtual void UpdateMegamorphicCache(HeapType* type, Name* name, Code* code);
|
|
|
| void CopyICToMegamorphicCache(Handle<String> name);
|
| bool IsTransitionOfMonomorphicTarget(Map* source_map, Map* target_map);
|
| - void PatchCache(Handle<HeapType> type,
|
| - Handle<String> name,
|
| - Handle<Code> code);
|
| + void PatchCache(Handle<String> name, Handle<Code> code);
|
| virtual Code::Kind kind() const {
|
| UNREACHABLE();
|
| return Code::STUB;
|
| @@ -234,13 +219,14 @@ class IC {
|
|
|
| bool TryRemoveInvalidPrototypeDependentStub(Handle<Object> receiver,
|
| Handle<String> name);
|
| - void TryRemoveInvalidHandlers(Handle<Map> map, Handle<String> name);
|
|
|
| ExtraICState extra_ic_state() const { return extra_ic_state_; }
|
| void set_extra_ic_state(ExtraICState state) {
|
| extra_ic_state_ = state;
|
| }
|
|
|
| + Handle<HeapType> receiver_type() { return receiver_type_; }
|
| +
|
| void TargetMaps(MapHandleList* list) {
|
| FindTargetMaps();
|
| for (int i = 0; i < target_maps_.length(); i++) {
|
| @@ -300,8 +286,10 @@ class IC {
|
|
|
| // The original code target that missed.
|
| Handle<Code> target_;
|
| - State state_;
|
| bool target_set_;
|
| + State state_;
|
| + Handle<HeapType> receiver_type_;
|
| + MaybeHandle<Code> maybe_handler_;
|
|
|
| ExtraICState extra_ic_state_;
|
| MapHandleList target_maps_;
|
| @@ -476,7 +464,7 @@ class LoadIC: public IC {
|
| Handle<Object> object,
|
| Handle<String> name,
|
| Handle<Object> unused,
|
| - InlineCacheHolderFlag cache_holder);
|
| + CacheHolderFlag cache_holder);
|
|
|
| private:
|
| // Stub accessors.
|
| @@ -650,9 +638,8 @@ class StoreIC: public IC {
|
| Handle<Object> value);
|
| virtual Handle<Code> CompileHandler(LookupResult* lookup,
|
| Handle<Object> object,
|
| - Handle<String> name,
|
| - Handle<Object> value,
|
| - InlineCacheHolderFlag cache_holder);
|
| + Handle<String> name, Handle<Object> value,
|
| + CacheHolderFlag cache_holder);
|
|
|
| private:
|
| void set_target(Code* code) {
|
|
|