Revision: 3519
Author: [email protected]
Date: Tue Dec 22 05:34:02 2009
Log: When promoting objects during a copying collection, promote all
non-large objects that cannot contain non-map-word pointers to other
heap objects into the old data space.

Review URL: http://codereview.chromium.org/502100
http://code.google.com/p/v8/source/detail?r=3519

Modified:
  /branches/bleeding_edge/src/heap-inl.h
  /branches/bleeding_edge/src/heap.cc
  /branches/bleeding_edge/src/objects-debug.cc
  /branches/bleeding_edge/src/objects-inl.h
  /branches/bleeding_edge/src/objects.h

=======================================
--- /branches/bleeding_edge/src/heap-inl.h      Thu Dec 17 00:53:18 2009
+++ /branches/bleeding_edge/src/heap-inl.h      Tue Dec 22 05:34:02 2009
@@ -196,12 +196,23 @@
    // other object types are promoted to old pointer space.  We do not use
    // object->IsHeapNumber() and object->IsSeqString() because we already
    // know that object has the heap object tag.
-  ASSERT((type != CODE_TYPE) && (type != MAP_TYPE));
-  bool has_pointers =
-      type != HEAP_NUMBER_TYPE &&
-      (type >= FIRST_NONSTRING_TYPE ||
-       (type & kStringRepresentationMask) != kSeqStringTag);
-  return has_pointers ? OLD_POINTER_SPACE : OLD_DATA_SPACE;
+
+  // These objects are never allocated in new space.
+  ASSERT(type != MAP_TYPE);
+  ASSERT(type != CODE_TYPE);
+  ASSERT(type != ODDBALL_TYPE);
+  ASSERT(type != JS_GLOBAL_PROPERTY_CELL_TYPE);
+
+  if (type < FIRST_NONSTRING_TYPE) {
+    // There are three string representations: sequential strings, cons
+    // strings, and external strings.  Only cons strings contain
+    // non-map-word pointers to heap objects.
+    return ((type & kStringRepresentationMask) == kConsStringTag)
+        ? OLD_POINTER_SPACE
+        : OLD_DATA_SPACE;
+  } else {
+    return (type <= LAST_DATA_TYPE) ? OLD_DATA_SPACE : OLD_POINTER_SPACE;
+  }
  }


=======================================
--- /branches/bleeding_edge/src/heap.cc Tue Dec 22 05:07:27 2009
+++ /branches/bleeding_edge/src/heap.cc Tue Dec 22 05:34:02 2009
@@ -2193,9 +2193,12 @@
  Object* Heap::Allocate(Map* map, AllocationSpace space) {
    ASSERT(gc_state_ == NOT_IN_GC);
    ASSERT(map->instance_type() != MAP_TYPE);
-  Object* result = AllocateRaw(map->instance_size(),
-                               space,
-                               TargetSpaceId(map->instance_type()));
+  // If allocation failures are disallowed, we may allocate in a different
+  // space when new space is full and the object is not a large object.
+  AllocationSpace retry_space =
+      (space != NEW_SPACE) ? space : TargetSpaceId(map->instance_type());
+  Object* result =
+      AllocateRaw(map->instance_size(), space, retry_space);
    if (result->IsFailure()) return result;
    HeapObject::cast(result)->set_map(map);
  #ifdef ENABLE_LOGGING_AND_PROFILING
=======================================
--- /branches/bleeding_edge/src/objects-debug.cc        Tue Dec  1 07:52:02 2009
+++ /branches/bleeding_edge/src/objects-debug.cc        Tue Dec 22 05:34:02 2009
@@ -587,7 +587,6 @@
      case JS_BUILTINS_OBJECT_TYPE: return "JS_BUILTINS_OBJECT";
      case JS_GLOBAL_PROXY_TYPE: return "JS_GLOBAL_PROXY";
      case PROXY_TYPE: return "PROXY";
-    case SMI_TYPE: return "SMI";
  #define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE: return #NAME;
    STRUCT_LIST(MAKE_STRUCT_CASE)
  #undef MAKE_STRUCT_CASE
=======================================
--- /branches/bleeding_edge/src/objects-inl.h   Thu Dec 17 00:53:18 2009
+++ /branches/bleeding_edge/src/objects-inl.h   Tue Dec 22 05:34:02 2009
@@ -336,8 +336,8 @@
      return false;
    InstanceType instance_type =
        HeapObject::cast(this)->map()->instance_type();
-  return (instance_type >= EXTERNAL_BYTE_ARRAY_TYPE &&
-          instance_type <= EXTERNAL_FLOAT_ARRAY_TYPE);
+  return (instance_type >= FIRST_EXTERNAL_ARRAY_TYPE &&
+          instance_type <= LAST_EXTERNAL_ARRAY_TYPE);
  }


=======================================
--- /branches/bleeding_edge/src/objects.h       Thu Dec 17 00:53:18 2009
+++ /branches/bleeding_edge/src/objects.h       Tue Dec 22 05:34:02 2009
@@ -204,14 +204,13 @@
  // instance_type is JS_OBJECT_TYPE.
  //
  // The names of the string instance types are intended to systematically
-// mirror their encoding in the instance_type field of the map.  The length
-// (SHORT, MEDIUM, or LONG) is always mentioned.  The default encoding is
-// considered TWO_BYTE.  It is not mentioned in the name.  ASCII encoding  
is
-// mentioned explicitly in the name.  Likewise, the default representation  
is
-// considered sequential.  It is not mentioned in the name.  The other
-// representations (eg, CONS, EXTERNAL) are explicitly mentioned.
-// Finally, the string is either a SYMBOL_TYPE (if it is a symbol) or a
-// STRING_TYPE (if it is not a symbol).
+// mirror their encoding in the instance_type field of the map.  The  
default
+// encoding is considered TWO_BYTE.  It is not mentioned in the name.   
ASCII
+// encoding is mentioned explicitly in the name.  Likewise, the default
+// representation is considered sequential.  It is not mentioned in the
+// name.  The other representations (eg, CONS, EXTERNAL) are explicitly
+// mentioned.  Finally, the string is either a SYMBOL_TYPE (if it is a
+// symbol) or a STRING_TYPE (if it is not a symbol).
  //
  // NOTE: The following things are some that depend on the string types  
having
  // instance_types that are less than those of all other types:
@@ -237,11 +236,11 @@
     
V(PRIVATE_EXTERNAL_ASCII_STRING_TYPE)                                         
\
                                                                                
  
\
     
V(MAP_TYPE)                                                                   
\
-   
V(HEAP_NUMBER_TYPE)                                                           
\
-   
V(FIXED_ARRAY_TYPE)                                                           
\
     
V(CODE_TYPE)                                                                  
\
     
V(JS_GLOBAL_PROPERTY_CELL_TYPE)                                               
\
     
V(ODDBALL_TYPE)                                                               
\
+                                                                               
 
\
+   
V(HEAP_NUMBER_TYPE)                                                           
\
     
V(PROXY_TYPE)                                                                 
\
     
V(BYTE_ARRAY_TYPE)                                                            
\
     
V(PIXEL_ARRAY_TYPE)                                                           
\
@@ -257,6 +256,7 @@
     
V(EXTERNAL_FLOAT_ARRAY_TYPE)                                                  
\
     
V(FILLER_TYPE)                                                                
\
                                                                                
  
\
+   
V(FIXED_ARRAY_TYPE)                                                           
\
     
V(ACCESSOR_INFO_TYPE)                                                         
\
     
V(ACCESS_CHECK_INFO_TYPE)                                                     
\
     
V(INTERCEPTOR_INFO_TYPE)                                                      
\
@@ -418,6 +418,7 @@


  enum InstanceType {
+  // String types.
    SYMBOL_TYPE = kSymbolTag | kSeqStringTag,
    ASCII_SYMBOL_TYPE = kAsciiStringTag | kSymbolTag | kSeqStringTag,
    CONS_SYMBOL_TYPE = kSymbolTag | kConsStringTag,
@@ -433,56 +434,66 @@
    EXTERNAL_ASCII_STRING_TYPE = kAsciiStringTag | kExternalStringTag,
    PRIVATE_EXTERNAL_ASCII_STRING_TYPE = EXTERNAL_ASCII_STRING_TYPE,

-  MAP_TYPE = kNotStringTag,
-  HEAP_NUMBER_TYPE,
-  FIXED_ARRAY_TYPE,
+  // Objects allocated in their own spaces (never in new space).
+  MAP_TYPE = kNotStringTag,  // FIRST_NONSTRING_TYPE
    CODE_TYPE,
    ODDBALL_TYPE,
    JS_GLOBAL_PROPERTY_CELL_TYPE,
+
+  // "Data", objects that cannot contain non-map-word pointers to heap
+  // objects.
+  HEAP_NUMBER_TYPE,
    PROXY_TYPE,
    BYTE_ARRAY_TYPE,
    PIXEL_ARRAY_TYPE,
-  EXTERNAL_BYTE_ARRAY_TYPE,
+  EXTERNAL_BYTE_ARRAY_TYPE,  // FIRST_EXTERNAL_ARRAY_TYPE
    EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE,
    EXTERNAL_SHORT_ARRAY_TYPE,
    EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE,
    EXTERNAL_INT_ARRAY_TYPE,
    EXTERNAL_UNSIGNED_INT_ARRAY_TYPE,
-  EXTERNAL_FLOAT_ARRAY_TYPE,
-  FILLER_TYPE,
-  SMI_TYPE,
-
+  EXTERNAL_FLOAT_ARRAY_TYPE,  // LAST_EXTERNAL_ARRAY_TYPE
+  FILLER_TYPE,  // LAST_DATA_TYPE
+
+  // Structs.
    ACCESSOR_INFO_TYPE,
    ACCESS_CHECK_INFO_TYPE,
    INTERCEPTOR_INFO_TYPE,
-  SHARED_FUNCTION_INFO_TYPE,
    CALL_HANDLER_INFO_TYPE,
    FUNCTION_TEMPLATE_INFO_TYPE,
    OBJECT_TEMPLATE_INFO_TYPE,
    SIGNATURE_INFO_TYPE,
    TYPE_SWITCH_INFO_TYPE,
+  SCRIPT_TYPE,
  #ifdef ENABLE_DEBUGGER_SUPPORT
    DEBUG_INFO_TYPE,
    BREAK_POINT_INFO_TYPE,
  #endif
-  SCRIPT_TYPE,
-
-  JS_VALUE_TYPE,
+
+  FIXED_ARRAY_TYPE,
+  SHARED_FUNCTION_INFO_TYPE,
+
+  JS_VALUE_TYPE,  // FIRST_JS_OBJECT_TYPE
    JS_OBJECT_TYPE,
    JS_CONTEXT_EXTENSION_OBJECT_TYPE,
    JS_GLOBAL_OBJECT_TYPE,
    JS_BUILTINS_OBJECT_TYPE,
    JS_GLOBAL_PROXY_TYPE,
    JS_ARRAY_TYPE,
-  JS_REGEXP_TYPE,
+  JS_REGEXP_TYPE,  // LAST_JS_OBJECT_TYPE

    JS_FUNCTION_TYPE,

    // Pseudo-types
-  FIRST_NONSTRING_TYPE = MAP_TYPE,
    FIRST_TYPE = 0x0,
-  INVALID_TYPE = FIRST_TYPE - 1,
    LAST_TYPE = JS_FUNCTION_TYPE,
+  INVALID_TYPE = FIRST_TYPE - 1,
+  FIRST_NONSTRING_TYPE = MAP_TYPE,
+  // Boundaries for testing for an external array.
+  FIRST_EXTERNAL_ARRAY_TYPE = EXTERNAL_BYTE_ARRAY_TYPE,
+  LAST_EXTERNAL_ARRAY_TYPE = EXTERNAL_FLOAT_ARRAY_TYPE,
+  // Boundary for promotion to old data space/old pointer space.
+  LAST_DATA_TYPE = FILLER_TYPE,
    // Boundaries for testing the type is a JavaScript "object".  Note that
    // function objects are not counted as objects, even though they are
    // implemented as such; only values whose typeof is "object" are  
included.

-- 
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to