Commit 2c070e23 authored by verwaest@chromium.org's avatar verwaest@chromium.org

Merge Store from Keyed and Named store.

Review URL: https://chromiumcodereview.appspot.com/12036017

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13461 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 3ffcbe33
This diff is collapsed.
...@@ -136,6 +136,15 @@ class IC { ...@@ -136,6 +136,15 @@ class IC {
Handle<Object> object, Handle<Object> object,
Handle<String> name); Handle<String> name);
MUST_USE_RESULT MaybeObject* Store(
State state,
StrictModeFlag strict_mode,
Handle<Object> object,
Handle<String> name,
Handle<Object> value,
JSReceiver::StoreFromKeyed store_mode =
JSReceiver::CERTAINLY_NOT_STORE_FROM_KEYED);
protected: protected:
virtual Handle<Code> pre_monomorphic_stub() { virtual Handle<Code> pre_monomorphic_stub() {
UNREACHABLE(); UNREACHABLE();
...@@ -145,6 +154,10 @@ class IC { ...@@ -145,6 +154,10 @@ class IC {
UNREACHABLE(); UNREACHABLE();
return Handle<Code>::null(); return Handle<Code>::null();
} }
virtual Handle<Code> megamorphic_stub_strict() {
UNREACHABLE();
return Handle<Code>::null();
}
virtual Handle<Code> generic_stub() const { virtual Handle<Code> generic_stub() const {
UNREACHABLE(); UNREACHABLE();
return Handle<Code>::null(); return Handle<Code>::null();
...@@ -153,12 +166,29 @@ class IC { ...@@ -153,12 +166,29 @@ class IC {
UNREACHABLE(); UNREACHABLE();
return Code::STUB; return Code::STUB;
} }
virtual Handle<Code> global_proxy_stub() {
UNREACHABLE();
return Handle<Code>::null();
}
virtual Handle<Code> global_proxy_stub_strict() {
UNREACHABLE();
return Handle<Code>::null();
}
virtual void UpdateLoadCaches(LookupResult* lookup, virtual void UpdateLoadCaches(LookupResult* lookup,
State state, State state,
Handle<Object> object, Handle<Object> object,
Handle<String> name) { Handle<String> name) {
UNREACHABLE(); UNREACHABLE();
} }
virtual void UpdateStoreCaches(LookupResult* lookup,
State state,
StrictModeFlag strict_mode,
Handle<JSObject> receiver,
Handle<String> name,
Handle<Object> value) {
UNREACHABLE();
}
Address fp() const { return fp_; } Address fp() const { return fp_; }
Address pc() const { return *pc_address_; } Address pc() const { return *pc_address_; }
Isolate* isolate() const { return isolate_; } Isolate* isolate() const { return isolate_; }
...@@ -378,9 +408,8 @@ class LoadIC: public IC { ...@@ -378,9 +408,8 @@ class LoadIC: public IC {
private: private:
// Stub accessors. // Stub accessors.
static Code* initialize_stub() { static Handle<Code> initialize_stub() {
return Isolate::Current()->builtins()->builtin( return Isolate::Current()->builtins()->LoadIC_Initialize();
Builtins::kLoadIC_Initialize);
} }
virtual Handle<Code> pre_monomorphic_stub() { virtual Handle<Code> pre_monomorphic_stub() {
return isolate()->builtins()->LoadIC_PreMonomorphic(); return isolate()->builtins()->LoadIC_PreMonomorphic();
...@@ -565,9 +594,8 @@ class KeyedLoadIC: public KeyedIC { ...@@ -565,9 +594,8 @@ class KeyedLoadIC: public KeyedIC {
private: private:
// Stub accessors. // Stub accessors.
static Code* initialize_stub() { static Handle<Code> initialize_stub() {
return Isolate::Current()->builtins()->builtin( return Isolate::Current()->builtins()->KeyedLoadIC_Initialize();
Builtins::kKeyedLoadIC_Initialize);
} }
virtual Handle<Code> pre_monomorphic_stub() { virtual Handle<Code> pre_monomorphic_stub() {
return isolate()->builtins()->KeyedLoadIC_PreMonomorphic(); return isolate()->builtins()->KeyedLoadIC_PreMonomorphic();
...@@ -591,12 +619,6 @@ class StoreIC: public IC { ...@@ -591,12 +619,6 @@ class StoreIC: public IC {
ASSERT(target()->is_store_stub()); ASSERT(target()->is_store_stub());
} }
MUST_USE_RESULT MaybeObject* Store(State state,
StrictModeFlag strict_mode,
Handle<Object> object,
Handle<String> name,
Handle<Object> value);
// Code generators for stub routines. Only called once at startup. // Code generators for stub routines. Only called once at startup.
static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); }
static void GenerateMiss(MacroAssembler* masm); static void GenerateMiss(MacroAssembler* masm);
...@@ -612,17 +634,28 @@ class StoreIC: public IC { ...@@ -612,17 +634,28 @@ class StoreIC: public IC {
virtual Handle<Code> megamorphic_stub() { virtual Handle<Code> megamorphic_stub() {
return isolate()->builtins()->StoreIC_Megamorphic(); return isolate()->builtins()->StoreIC_Megamorphic();
} }
// Stub accessors.
virtual Handle<Code> megamorphic_stub_strict() {
return isolate()->builtins()->StoreIC_Megamorphic_Strict();
}
virtual Handle<Code> global_proxy_stub() {
return isolate()->builtins()->StoreIC_GlobalProxy();
}
virtual Handle<Code> global_proxy_stub_strict() {
return isolate()->builtins()->StoreIC_GlobalProxy_Strict();
}
private:
// Update the inline cache and the global stub cache based on the // Update the inline cache and the global stub cache based on the
// lookup result. // lookup result.
void UpdateCaches(LookupResult* lookup, virtual void UpdateStoreCaches(LookupResult* lookup,
State state, State state,
StrictModeFlag strict_mode, StrictModeFlag strict_mode,
Handle<JSObject> receiver, Handle<JSObject> receiver,
Handle<String> name, Handle<String> name,
Handle<Object> value); Handle<Object> value);
private:
void set_target(Code* code) { void set_target(Code* code) {
// Strict mode must be preserved across IC patching. // Strict mode must be preserved across IC patching.
ASSERT(Code::GetStrictMode(code->extra_ic_state()) == ASSERT(Code::GetStrictMode(code->extra_ic_state()) ==
...@@ -630,26 +663,12 @@ class StoreIC: public IC { ...@@ -630,26 +663,12 @@ class StoreIC: public IC {
IC::set_target(code); IC::set_target(code);
} }
// Stub accessors. static Handle<Code> initialize_stub() {
Code* megamorphic_stub_strict() { return Isolate::Current()->builtins()->StoreIC_Initialize();
return isolate()->builtins()->builtin(
Builtins::kStoreIC_Megamorphic_Strict);
}
static Code* initialize_stub() {
return Isolate::Current()->builtins()->builtin(
Builtins::kStoreIC_Initialize);
} }
static Code* initialize_stub_strict() { static Handle<Code> initialize_stub_strict() {
return Isolate::Current()->builtins()->builtin( return Isolate::Current()->builtins()->StoreIC_Initialize_Strict();
Builtins::kStoreIC_Initialize_Strict);
} }
Handle<Code> global_proxy_stub() {
return isolate()->builtins()->StoreIC_GlobalProxy();
}
Handle<Code> global_proxy_stub_strict() {
return isolate()->builtins()->StoreIC_GlobalProxy_Strict();
}
static void Clear(Address address, Code* target); static void Clear(Address address, Code* target);
friend class IC; friend class IC;
...@@ -706,15 +725,22 @@ class KeyedStoreIC: public KeyedIC { ...@@ -706,15 +725,22 @@ class KeyedStoreIC: public KeyedIC {
StrictModeFlag strict_mode, StrictModeFlag strict_mode,
KeyedAccessGrowMode grow_mode); KeyedAccessGrowMode grow_mode);
private:
// Update the inline cache. // Update the inline cache.
void UpdateCaches(LookupResult* lookup, virtual void UpdateStoreCaches(LookupResult* lookup,
State state, State state,
StrictModeFlag strict_mode, StrictModeFlag strict_mode,
Handle<JSObject> receiver, Handle<JSObject> receiver,
Handle<String> name, Handle<String> name,
Handle<Object> value); Handle<Object> value);
virtual Handle<Code> megamorphic_stub() {
return isolate()->builtins()->KeyedStoreIC_Generic();
}
virtual Handle<Code> megamorphic_stub_strict() {
return isolate()->builtins()->KeyedStoreIC_Generic_Strict();
}
private:
void set_target(Code* code) { void set_target(Code* code) {
// Strict mode must be preserved across IC patching. // Strict mode must be preserved across IC patching.
ASSERT(Code::GetStrictMode(code->extra_ic_state()) == ASSERT(Code::GetStrictMode(code->extra_ic_state()) ==
...@@ -723,19 +749,11 @@ class KeyedStoreIC: public KeyedIC { ...@@ -723,19 +749,11 @@ class KeyedStoreIC: public KeyedIC {
} }
// Stub accessors. // Stub accessors.
static Code* initialize_stub() { static Handle<Code> initialize_stub() {
return Isolate::Current()->builtins()->builtin( return Isolate::Current()->builtins()->KeyedStoreIC_Initialize();
Builtins::kKeyedStoreIC_Initialize);
}
static Code* initialize_stub_strict() {
return Isolate::Current()->builtins()->builtin(
Builtins::kKeyedStoreIC_Initialize_Strict);
} }
Handle<Code> megamorphic_stub() { static Handle<Code> initialize_stub_strict() {
return isolate()->builtins()->KeyedStoreIC_Generic(); return Isolate::Current()->builtins()->KeyedStoreIC_Initialize_Strict();
}
Handle<Code> megamorphic_stub_strict() {
return isolate()->builtins()->KeyedStoreIC_Generic_Strict();
} }
Handle<Code> generic_stub() const { Handle<Code> generic_stub() const {
return isolate()->builtins()->KeyedStoreIC_Generic(); return isolate()->builtins()->KeyedStoreIC_Generic();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment