Revision: 17162
Author:   [email protected]
Date:     Fri Oct 11 13:54:14 2013 UTC
Log:      Unify ComputeLoad/StoreHandler and dispatch on compile.

BUG=
[email protected]

Review URL: https://chromiumcodereview.appspot.com/26831002
http://code.google.com/p/v8/source/detail?r=17162

Modified:
 /branches/bleeding_edge/src/ic.cc
 /branches/bleeding_edge/src/ic.h

=======================================
--- /branches/bleeding_edge/src/ic.cc   Fri Oct 11 13:48:14 2013 UTC
+++ /branches/bleeding_edge/src/ic.cc   Fri Oct 11 13:54:14 2013 UTC
@@ -1137,8 +1137,13 @@
     // TODO(jkummerow): It would be nice to support non-JSObjects in
     // ComputeLoadHandler, then we wouldn't need to go generic here.
     code = slow_stub();
+  } else if (!lookup->IsProperty()) {
+    code = kind() == Code::LOAD_IC
+        ? isolate()->stub_cache()->ComputeLoadNonexistent(
+              name, Handle<JSObject>::cast(receiver))
+        : slow_stub();
   } else {
- code = ComputeLoadHandler(lookup, Handle<JSObject>::cast(receiver), name);
+    code = ComputeHandler(lookup, Handle<JSObject>::cast(receiver), name);
   }

   PatchCache(receiver, name, code);
@@ -1153,20 +1158,15 @@
 }


-Handle<Code> LoadIC::ComputeLoadHandler(LookupResult* lookup,
-                                        Handle<JSObject> receiver,
-                                        Handle<String> name) {
-  if (!lookup->IsProperty()) {
-    return kind() == Code::LOAD_IC
-        ? isolate()->stub_cache()->ComputeLoadNonexistent(name, receiver)
-        : generic_stub();
-  }
-
+Handle<Code> IC::ComputeHandler(LookupResult* lookup,
+                                Handle<JSObject> receiver,
+                                Handle<String> name,
+                                Handle<Object> value) {
   Handle<Code> code = isolate()->stub_cache()->FindHandler(
       name, receiver, kind());
   if (!code.is_null()) return code;

-  code = CompileLoadHandler(lookup, receiver, name);
+  code = CompileHandler(lookup, receiver, name, value);
   if (code.is_null()) return slow_stub();

   if (code->is_handler() && code->type() != Code::NORMAL) {
@@ -1177,9 +1177,10 @@
 }


-Handle<Code> LoadIC::CompileLoadHandler(LookupResult* lookup,
-                                        Handle<JSObject> receiver,
-                                        Handle<String> name) {
+Handle<Code> LoadIC::CompileHandler(LookupResult* lookup,
+                                    Handle<JSObject> receiver,
+                                    Handle<String> name,
+                                    Handle<Object> unused) {
   Handle<JSObject> holder(lookup->holder());
   switch (lookup->type()) {
     case FIELD:
@@ -1390,9 +1391,10 @@
 }


-Handle<Code> KeyedLoadIC::CompileLoadHandler(LookupResult* lookup,
-                                             Handle<JSObject> receiver,
-                                             Handle<String> name) {
+Handle<Code> KeyedLoadIC::CompileHandler(LookupResult* lookup,
+                                         Handle<JSObject> receiver,
+                                         Handle<String> name,
+                                         Handle<Object> value) {
   // Compute a monomorphic stub.
   Handle<JSObject> holder(lookup->holder(), isolate());
   switch (lookup->type()) {
@@ -1633,37 +1635,17 @@
   // These are not cacheable, so we never see such LookupResults here.
   ASSERT(!lookup->IsHandler());

-  Handle<Code> code = ComputeStoreHandler(lookup, receiver, name, value);
-  if (code.is_null()) code = slow_stub();
+  Handle<Code> code = ComputeHandler(lookup, receiver, name, value);

   PatchCache(receiver, name, code);
   TRACE_IC("StoreIC", name);
 }


-Handle<Code> StoreIC::ComputeStoreHandler(LookupResult* lookup,
-                                          Handle<JSObject> receiver,
-                                          Handle<String> name,
-                                          Handle<Object> value) {
-  Handle<Code> code = isolate()->stub_cache()->FindHandler(
-      name, receiver, kind(), strict_mode());
-  if (!code.is_null()) return code;
-
-  code = CompileStoreHandler(lookup, receiver, name, value);
-  if (code.is_null()) return generic_stub();
-
-  if (code->is_handler() && code->type() != Code::NORMAL) {
-    HeapObject::UpdateMapCodeCache(receiver, name, code);
-  }
-
-  return code;
-}
-
-
-Handle<Code> StoreIC::CompileStoreHandler(LookupResult* lookup,
-                                          Handle<JSObject> receiver,
-                                          Handle<String> name,
-                                          Handle<Object> value) {
+Handle<Code> StoreIC::CompileHandler(LookupResult* lookup,
+                                     Handle<JSObject> receiver,
+                                     Handle<String> name,
+                                     Handle<Object> value) {
   Handle<JSObject> holder(lookup->holder());
   switch (lookup->type()) {
     case FIELD:
@@ -2052,10 +2034,10 @@
 }


-Handle<Code> KeyedStoreIC::CompileStoreHandler(LookupResult* lookup,
-                                               Handle<JSObject> receiver,
-                                               Handle<String> name,
-                                               Handle<Object> value) {
+Handle<Code> KeyedStoreIC::CompileHandler(LookupResult* lookup,
+                                          Handle<JSObject> receiver,
+                                          Handle<String> name,
+                                          Handle<Object> value) {
   // If the property has a non-field type allowing map transitions
   // where there is extra room in the object, we leave the IC in its
   // current state.
=======================================
--- /branches/bleeding_edge/src/ic.h    Fri Oct 11 13:48:14 2013 UTC
+++ /branches/bleeding_edge/src/ic.h    Fri Oct 11 13:54:14 2013 UTC
@@ -173,6 +173,18 @@
   static inline void SetTargetAtAddress(Address address, Code* target);
static void PostPatching(Address address, Code* target, Code* old_target);

+ // Compute the handler either by compiling or by retrieving a cached version.
+  Handle<Code> ComputeHandler(LookupResult* lookup,
+                              Handle<JSObject> receiver,
+                              Handle<String> name,
+                              Handle<Object> value = Handle<Code>::null());
+  virtual Handle<Code> CompileHandler(LookupResult* lookup,
+                                      Handle<JSObject> receiver,
+                                      Handle<String> name,
+                                      Handle<Object> value) {
+    UNREACHABLE();
+    return Handle<Code>::null();
+  }
   void UpdateMonomorphicIC(Handle<HeapObject> receiver,
                            Handle<Code> handler,
                            Handle<String> name);
@@ -187,6 +199,14 @@
                   Handle<String> name,
                   Handle<Code> code);
   virtual void UpdateMegamorphicCache(Map* map, Name* name, Code* code);
+  virtual Code::Kind kind() const {
+    UNREACHABLE();
+    return Code::STUB;
+  }
+  virtual Handle<Code> slow_stub() const {
+    UNREACHABLE();
+    return Handle<Code>::null();
+  }
   virtual Handle<Code> megamorphic_stub() {
     UNREACHABLE();
     return Handle<Code>::null();
@@ -395,12 +415,10 @@
                     Handle<Object> object,
                     Handle<String> name);

-  Handle<Code> ComputeLoadHandler(LookupResult* lookup,
-                                  Handle<JSObject> receiver,
-                                  Handle<String> name);
-  virtual Handle<Code> CompileLoadHandler(LookupResult* lookup,
-                                          Handle<JSObject> receiver,
-                                          Handle<String> name);
+  virtual Handle<Code> CompileHandler(LookupResult* lookup,
+                                      Handle<JSObject> receiver,
+                                      Handle<String> name,
+                                      Handle<Object> unused);

  private:
   // Stub accessors.
@@ -475,9 +493,10 @@
     return isolate()->builtins()->KeyedLoadIC_Slow();
   }

-  virtual Handle<Code> CompileLoadHandler(LookupResult* lookup,
-                                          Handle<JSObject> receiver,
-                                          Handle<String> name);
+  virtual Handle<Code> CompileHandler(LookupResult* lookup,
+                                      Handle<JSObject> receiver,
+                                      Handle<String> name,
+                                      Handle<Object> unused);
   virtual void UpdateMegamorphicCache(Map* map, Name* name, Code* code) { }

  private:
@@ -590,17 +609,10 @@
                     Handle<JSObject> receiver,
                     Handle<String> name,
                     Handle<Object> value);
-  // Compute the code stub for this store; used for rewriting to
-  // monomorphic state and making sure that the code stub is in the
-  // stub cache.
-  Handle<Code> ComputeStoreHandler(LookupResult* lookup,
-                                   Handle<JSObject> receiver,
-                                   Handle<String> name,
-                                   Handle<Object> value);
-  virtual Handle<Code> CompileStoreHandler(LookupResult* lookup,
-                                           Handle<JSObject> receiver,
-                                           Handle<String> name,
-                                           Handle<Object> value);
+  virtual Handle<Code> CompileHandler(LookupResult* lookup,
+                                      Handle<JSObject> receiver,
+                                      Handle<String> name,
+                                      Handle<Object> value);

  private:
   void set_target(Code* code) {
@@ -668,10 +680,10 @@
  protected:
   virtual Code::Kind kind() const { return Code::KEYED_STORE_IC; }

-  virtual Handle<Code> CompileStoreHandler(LookupResult* lookup,
-                                           Handle<JSObject> receiver,
-                                           Handle<String> name,
-                                           Handle<Object> value);
+  virtual Handle<Code> CompileHandler(LookupResult* lookup,
+                                      Handle<JSObject> receiver,
+                                      Handle<String> name,
+                                      Handle<Object> value);
   virtual void UpdateMegamorphicCache(Map* map, Name* name, Code* code) { }

   virtual Handle<Code> pre_monomorphic_stub() {

--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to