Index: src/stub-cache.h |
diff --git a/src/stub-cache.h b/src/stub-cache.h |
index 263331a7a0bd85dcd010386a08b50bee7f0e826c..f3a330b8a36f81236c86567beb1786395c436a1a 100644 |
--- a/src/stub-cache.h |
+++ b/src/stub-cache.h |
@@ -374,22 +374,21 @@ class PropertyHandlerCompiler : public PropertyAccessCompiler { |
protected: |
PropertyHandlerCompiler(Isolate* isolate, Code::Kind kind, |
- CacheHolderFlag cache_holder) |
- : PropertyAccessCompiler(isolate, kind, cache_holder) {} |
+ Handle<HeapType> type, CacheHolderFlag cache_holder) |
+ : PropertyAccessCompiler(isolate, kind, cache_holder), type_(type) {} |
virtual ~PropertyHandlerCompiler() {} |
- virtual Register FrontendHeader(Handle<HeapType> type, Register object_reg, |
- Handle<JSObject> holder, Handle<Name> name, |
- Label* miss) { |
+ virtual Register FrontendHeader(Register object_reg, Handle<JSObject> holder, |
+ Handle<Name> name, Label* miss) { |
UNREACHABLE(); |
return receiver(); |
} |
virtual void FrontendFooter(Handle<Name> name, Label* miss) { UNREACHABLE(); } |
- Register Frontend(Handle<HeapType> type, Register object_reg, |
- Handle<JSObject> holder, Handle<Name> name); |
+ Register Frontend(Register object_reg, Handle<JSObject> holder, |
+ Handle<Name> name); |
// TODO(verwaest): Make non-static. |
static void GenerateFastApiCall(MacroAssembler* masm, |
@@ -431,67 +430,56 @@ 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(Handle<HeapType> type, |
- Register object_reg, |
- Handle<JSObject> holder, |
- Register holder_reg, |
- Register scratch1, |
- Register scratch2, |
- Handle<Name> name, |
- Label* miss, |
+ Register CheckPrototypes(Register object_reg, Handle<JSObject> holder, |
+ 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()); |
+ } |
+ Handle<HeapType> type() const { return type_; } |
+ |
+ private: |
+ Handle<HeapType> type_; |
}; |
class NamedLoadHandlerCompiler : public PropertyHandlerCompiler { |
public: |
- NamedLoadHandlerCompiler(Isolate* isolate, |
- CacheHolderFlag cache_holder = kCacheOnReceiver) |
- : PropertyHandlerCompiler(isolate, Code::LOAD_IC, cache_holder) {} |
+ NamedLoadHandlerCompiler(Isolate* isolate, Handle<HeapType> type, |
+ CacheHolderFlag cache_holder) |
+ : PropertyHandlerCompiler(isolate, Code::LOAD_IC, type, cache_holder) {} |
virtual ~NamedLoadHandlerCompiler() {} |
- Handle<Code> CompileLoadField(Handle<HeapType> type, |
- Handle<JSObject> holder, |
- Handle<Name> name, |
+ Handle<Code> CompileLoadField(Handle<JSObject> holder, Handle<Name> name, |
FieldIndex index, |
Representation representation); |
- Handle<Code> CompileLoadCallback(Handle<HeapType> type, |
- Handle<JSObject> holder, |
- Handle<Name> name, |
+ Handle<Code> CompileLoadCallback(Handle<JSObject> holder, Handle<Name> name, |
Handle<ExecutableAccessorInfo> callback); |
- Handle<Code> CompileLoadCallback(Handle<HeapType> type, |
- Handle<JSObject> holder, |
- Handle<Name> name, |
+ Handle<Code> CompileLoadCallback(Handle<JSObject> holder, Handle<Name> name, |
const CallOptimization& call_optimization); |
- Handle<Code> CompileLoadConstant(Handle<HeapType> type, |
- Handle<JSObject> holder, |
- Handle<Name> name, |
+ Handle<Code> CompileLoadConstant(Handle<JSObject> holder, Handle<Name> name, |
Handle<Object> value); |
- Handle<Code> CompileLoadInterceptor(Handle<HeapType> type, |
- Handle<JSObject> holder, |
+ Handle<Code> CompileLoadInterceptor(Handle<JSObject> holder, |
Handle<Name> name); |
- Handle<Code> CompileLoadViaGetter(Handle<HeapType> type, |
- Handle<JSObject> holder, |
- Handle<Name> name, |
+ Handle<Code> CompileLoadViaGetter(Handle<JSObject> holder, Handle<Name> name, |
Handle<JSFunction> getter); |
+ Handle<Code> CompileLoadGlobal(Handle<GlobalObject> holder, |
+ Handle<PropertyCell> cell, Handle<Name> name, |
+ bool is_dont_delete); |
+ |
static Handle<Code> ComputeLoadNonexistent(Handle<Name> name, |
Handle<HeapType> type); |
- Handle<Code> CompileLoadGlobal(Handle<HeapType> type, |
- Handle<GlobalObject> holder, |
- Handle<PropertyCell> cell, |
- Handle<Name> name, |
- bool is_dont_delete); |
- |
static void GenerateLoadViaGetter(MacroAssembler* masm, Handle<HeapType> type, |
Register receiver, |
Handle<JSFunction> getter); |
@@ -518,20 +506,16 @@ class NamedLoadHandlerCompiler : public PropertyHandlerCompiler { |
static const int kInterceptorArgsLength = 4; |
protected: |
- virtual Register FrontendHeader(Handle<HeapType> type, Register object_reg, |
- Handle<JSObject> holder, Handle<Name> name, |
- Label* miss); |
+ virtual Register FrontendHeader(Register object_reg, Handle<JSObject> holder, |
+ Handle<Name> name, Label* miss); |
virtual void FrontendFooter(Handle<Name> name, Label* miss); |
private: |
- Register CallbackFrontend(Handle<HeapType> type, Register object_reg, |
- Handle<JSObject> holder, Handle<Name> name, |
- Handle<Object> callback); |
- Handle<Code> CompileLoadNonexistent(Handle<HeapType> type, |
- Handle<JSObject> last, Handle<Name> name); |
- void NonexistentFrontend(Handle<HeapType> type, Handle<JSObject> last, |
- Handle<Name> name); |
+ 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); |
void GenerateLoadField(Register reg, |
Handle<JSObject> holder, |
@@ -543,7 +527,6 @@ class NamedLoadHandlerCompiler : public PropertyHandlerCompiler { |
void GenerateLoadCallback(const CallOptimization& call_optimization, |
Handle<Map> receiver_map); |
void GenerateLoadInterceptor(Register holder_reg, |
- Handle<Object> object, |
Handle<JSObject> holder, |
LookupResult* lookup, |
Handle<Name> name); |
@@ -570,8 +553,9 @@ class NamedLoadHandlerCompiler : public PropertyHandlerCompiler { |
class NamedStoreHandlerCompiler : public PropertyHandlerCompiler { |
public: |
- explicit NamedStoreHandlerCompiler(Isolate* isolate) |
- : PropertyHandlerCompiler(isolate, Code::STORE_IC, kCacheOnReceiver) {} |
+ explicit NamedStoreHandlerCompiler(Isolate* isolate, Handle<HeapType> type) |
+ : PropertyHandlerCompiler(isolate, Code::STORE_IC, type, |
+ kCacheOnReceiver) {} |
virtual ~NamedStoreHandlerCompiler() {} |
@@ -614,9 +598,8 @@ class NamedStoreHandlerCompiler : public PropertyHandlerCompiler { |
} |
protected: |
- virtual Register FrontendHeader(Handle<HeapType> type, Register object_reg, |
- Handle<JSObject> holder, Handle<Name> name, |
- Label* miss); |
+ virtual Register FrontendHeader(Register object_reg, Handle<JSObject> holder, |
+ Handle<Name> name, Label* miss); |
virtual void FrontendFooter(Handle<Name> name, Label* miss); |
void GenerateRestoreName(MacroAssembler* masm, Label* label, |
@@ -672,7 +655,7 @@ class ElementHandlerCompiler : public PropertyHandlerCompiler { |
public: |
explicit ElementHandlerCompiler(Isolate* isolate) |
: PropertyHandlerCompiler(isolate, Code::KEYED_LOAD_IC, |
- kCacheOnReceiver) {} |
+ Handle<HeapType>::null(), kCacheOnReceiver) {} |
virtual ~ElementHandlerCompiler() {} |