Index: src/stub-cache.h |
diff --git a/src/stub-cache.h b/src/stub-cache.h |
index f3a330b8a36f81236c86567beb1786395c436a1a..1a38361be37c421f8c0f6a6a84624391d7686739 100644 |
--- a/src/stub-cache.h |
+++ b/src/stub-cache.h |
@@ -374,21 +374,23 @@ class PropertyHandlerCompiler : public PropertyAccessCompiler { |
protected: |
PropertyHandlerCompiler(Isolate* isolate, Code::Kind kind, |
- Handle<HeapType> type, CacheHolderFlag cache_holder) |
- : PropertyAccessCompiler(isolate, kind, cache_holder), type_(type) {} |
+ Handle<HeapType> type, Handle<JSObject> holder, |
+ CacheHolderFlag cache_holder) |
+ : PropertyAccessCompiler(isolate, kind, cache_holder), |
+ type_(type), |
+ holder_(holder) {} |
virtual ~PropertyHandlerCompiler() {} |
- virtual Register FrontendHeader(Register object_reg, Handle<JSObject> holder, |
- Handle<Name> name, Label* miss) { |
+ virtual Register FrontendHeader(Register object_reg, Handle<Name> name, |
+ Label* miss) { |
UNREACHABLE(); |
return receiver(); |
} |
virtual void FrontendFooter(Handle<Name> name, Label* miss) { UNREACHABLE(); } |
- Register Frontend(Register object_reg, Handle<JSObject> holder, |
- Handle<Name> name); |
+ Register Frontend(Register object_reg, Handle<Name> name); |
// TODO(verwaest): Make non-static. |
static void GenerateFastApiCall(MacroAssembler* masm, |
@@ -430,53 +432,55 @@ class PropertyHandlerCompiler : public PropertyAccessCompiler { |
// register is only clobbered if it the same as the holder register. The |
// function returns a register containing the holder - either object_reg or |
// holder_reg. |
- Register CheckPrototypes(Register object_reg, Handle<JSObject> holder, |
- Register holder_reg, Register scratch1, |
- Register scratch2, Handle<Name> name, Label* miss, |
+ Register CheckPrototypes(Register object_reg, Register holder_reg, |
+ Register scratch1, Register scratch2, |
+ Handle<Name> name, Label* miss, |
PrototypeCheckType check = CHECK_ALL_MAPS); |
Handle<Code> GetCode(Code::Kind kind, Code::StubType type, Handle<Name> name); |
void set_type_for_object(Handle<Object> object) { |
type_ = IC::CurrentTypeOf(object, isolate()); |
} |
+ void set_holder(Handle<JSObject> holder) { holder_ = holder; } |
Handle<HeapType> type() const { return type_; } |
+ Handle<JSObject> holder() const { return holder_; } |
private: |
Handle<HeapType> type_; |
+ Handle<JSObject> holder_; |
}; |
class NamedLoadHandlerCompiler : public PropertyHandlerCompiler { |
public: |
NamedLoadHandlerCompiler(Isolate* isolate, Handle<HeapType> type, |
+ Handle<JSObject> holder, |
CacheHolderFlag cache_holder) |
- : PropertyHandlerCompiler(isolate, Code::LOAD_IC, type, cache_holder) {} |
+ : PropertyHandlerCompiler(isolate, Code::LOAD_IC, type, holder, |
+ cache_holder) {} |
virtual ~NamedLoadHandlerCompiler() {} |
- Handle<Code> CompileLoadField(Handle<JSObject> holder, Handle<Name> name, |
- FieldIndex index, |
+ Handle<Code> CompileLoadField(Handle<Name> name, FieldIndex index, |
Representation representation); |
- Handle<Code> CompileLoadCallback(Handle<JSObject> holder, Handle<Name> name, |
+ Handle<Code> CompileLoadCallback(Handle<Name> name, |
Handle<ExecutableAccessorInfo> callback); |
- Handle<Code> CompileLoadCallback(Handle<JSObject> holder, Handle<Name> name, |
+ Handle<Code> CompileLoadCallback(Handle<Name> name, |
const CallOptimization& call_optimization); |
- Handle<Code> CompileLoadConstant(Handle<JSObject> holder, Handle<Name> name, |
- Handle<Object> value); |
+ Handle<Code> CompileLoadConstant(Handle<Name> name, Handle<Object> value); |
- Handle<Code> CompileLoadInterceptor(Handle<JSObject> holder, |
- Handle<Name> name); |
+ Handle<Code> CompileLoadInterceptor(Handle<Name> name); |
- Handle<Code> CompileLoadViaGetter(Handle<JSObject> holder, Handle<Name> name, |
+ Handle<Code> CompileLoadViaGetter(Handle<Name> name, |
Handle<JSFunction> getter); |
- Handle<Code> CompileLoadGlobal(Handle<GlobalObject> holder, |
- Handle<PropertyCell> cell, Handle<Name> name, |
+ Handle<Code> CompileLoadGlobal(Handle<PropertyCell> cell, Handle<Name> name, |
bool is_dont_delete); |
+ // Static interface |
static Handle<Code> ComputeLoadNonexistent(Handle<Name> name, |
Handle<HeapType> type); |
@@ -506,19 +510,18 @@ class NamedLoadHandlerCompiler : public PropertyHandlerCompiler { |
static const int kInterceptorArgsLength = 4; |
protected: |
- virtual Register FrontendHeader(Register object_reg, Handle<JSObject> holder, |
- Handle<Name> name, Label* miss); |
+ virtual Register FrontendHeader(Register object_reg, Handle<Name> name, |
+ Label* miss); |
virtual void FrontendFooter(Handle<Name> name, Label* miss); |
private: |
- Register CallbackFrontend(Register object_reg, Handle<JSObject> holder, |
- Handle<Name> name, Handle<Object> callback); |
- Handle<Code> CompileLoadNonexistent(Handle<JSObject> last, Handle<Name> name); |
- void NonexistentFrontend(Handle<JSObject> last, Handle<Name> name); |
+ Register CallbackFrontend(Register object_reg, Handle<Name> name, |
+ Handle<Object> callback); |
+ Handle<Code> CompileLoadNonexistent(Handle<Name> name); |
+ void NonexistentFrontend(Handle<Name> name); |
void GenerateLoadField(Register reg, |
- Handle<JSObject> holder, |
FieldIndex field, |
Representation representation); |
void GenerateLoadConstant(Handle<Object> value); |
@@ -527,11 +530,9 @@ class NamedLoadHandlerCompiler : public PropertyHandlerCompiler { |
void GenerateLoadCallback(const CallOptimization& call_optimization, |
Handle<Map> receiver_map); |
void GenerateLoadInterceptor(Register holder_reg, |
- Handle<JSObject> holder, |
LookupResult* lookup, |
Handle<Name> name); |
void GenerateLoadPostInterceptor(Register reg, |
- Handle<JSObject> interceptor_holder, |
Handle<Name> name, |
LookupResult* lookup); |
@@ -553,39 +554,31 @@ class NamedLoadHandlerCompiler : public PropertyHandlerCompiler { |
class NamedStoreHandlerCompiler : public PropertyHandlerCompiler { |
public: |
- explicit NamedStoreHandlerCompiler(Isolate* isolate, Handle<HeapType> type) |
- : PropertyHandlerCompiler(isolate, Code::STORE_IC, type, |
+ explicit NamedStoreHandlerCompiler(Isolate* isolate, Handle<HeapType> type, |
+ Handle<JSObject> holder) |
+ : PropertyHandlerCompiler(isolate, Code::STORE_IC, type, holder, |
kCacheOnReceiver) {} |
virtual ~NamedStoreHandlerCompiler() {} |
- Handle<Code> CompileStoreTransition(Handle<JSObject> object, |
- LookupResult* lookup, |
+ Handle<Code> CompileStoreTransition(LookupResult* lookup, |
Handle<Map> transition, |
Handle<Name> name); |
- Handle<Code> CompileStoreField(Handle<JSObject> object, |
- LookupResult* lookup, |
- Handle<Name> name); |
+ Handle<Code> CompileStoreField(LookupResult* lookup, Handle<Name> name); |
- Handle<Code> CompileStoreArrayLength(Handle<JSObject> object, |
- LookupResult* lookup, |
- Handle<Name> name); |
+ Handle<Code> CompileStoreArrayLength(LookupResult* lookup, Handle<Name> name); |
- Handle<Code> CompileStoreCallback(Handle<JSObject> object, |
- Handle<JSObject> holder, Handle<Name> name, |
+ Handle<Code> CompileStoreCallback(Handle<JSObject> object, Handle<Name> name, |
Handle<ExecutableAccessorInfo> callback); |
- Handle<Code> CompileStoreCallback(Handle<JSObject> object, |
- Handle<JSObject> holder, Handle<Name> name, |
+ Handle<Code> CompileStoreCallback(Handle<JSObject> object, Handle<Name> name, |
const CallOptimization& call_optimization); |
- Handle<Code> CompileStoreViaSetter(Handle<JSObject> object, |
- Handle<JSObject> holder, Handle<Name> name, |
+ Handle<Code> CompileStoreViaSetter(Handle<JSObject> object, Handle<Name> name, |
Handle<JSFunction> setter); |
- Handle<Code> CompileStoreInterceptor(Handle<JSObject> object, |
- Handle<Name> name); |
+ Handle<Code> CompileStoreInterceptor(Handle<Name> name); |
static void GenerateStoreViaSetter(MacroAssembler* masm, |
@@ -598,8 +591,8 @@ class NamedStoreHandlerCompiler : public PropertyHandlerCompiler { |
} |
protected: |
- virtual Register FrontendHeader(Register object_reg, Handle<JSObject> holder, |
- Handle<Name> name, Label* miss); |
+ virtual Register FrontendHeader(Register object_reg, Handle<Name> name, |
+ Label* miss); |
virtual void FrontendFooter(Handle<Name> name, Label* miss); |
void GenerateRestoreName(MacroAssembler* masm, Label* label, |
@@ -615,7 +608,6 @@ class NamedStoreHandlerCompiler : public PropertyHandlerCompiler { |
Label* miss); |
void GenerateStoreTransition(MacroAssembler* masm, |
- Handle<JSObject> object, |
LookupResult* lookup, |
Handle<Map> transition, |
Handle<Name> name, |
@@ -655,7 +647,8 @@ class ElementHandlerCompiler : public PropertyHandlerCompiler { |
public: |
explicit ElementHandlerCompiler(Isolate* isolate) |
: PropertyHandlerCompiler(isolate, Code::KEYED_LOAD_IC, |
- Handle<HeapType>::null(), kCacheOnReceiver) {} |
+ Handle<HeapType>::null(), |
+ Handle<JSObject>::null(), kCacheOnReceiver) {} |
virtual ~ElementHandlerCompiler() {} |