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
