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

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3519 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
kmillikin@chromium.org 2009-12-22 13:34:02 +00:00
parent afabb5a9bc
commit c114f17efa
5 changed files with 59 additions and 35 deletions

View File

@ -196,12 +196,23 @@ AllocationSpace Heap::TargetSpaceId(InstanceType type) {
// other object types are promoted to old pointer space. We do not use // other object types are promoted to old pointer space. We do not use
// object->IsHeapNumber() and object->IsSeqString() because we already // object->IsHeapNumber() and object->IsSeqString() because we already
// know that object has the heap object tag. // know that object has the heap object tag.
ASSERT((type != CODE_TYPE) && (type != MAP_TYPE));
bool has_pointers = // These objects are never allocated in new space.
type != HEAP_NUMBER_TYPE && ASSERT(type != MAP_TYPE);
(type >= FIRST_NONSTRING_TYPE || ASSERT(type != CODE_TYPE);
(type & kStringRepresentationMask) != kSeqStringTag); ASSERT(type != ODDBALL_TYPE);
return has_pointers ? OLD_POINTER_SPACE : OLD_DATA_SPACE; 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;
}
} }

View File

@ -2193,9 +2193,12 @@ Object* Heap::CopyCode(Code* code) {
Object* Heap::Allocate(Map* map, AllocationSpace space) { Object* Heap::Allocate(Map* map, AllocationSpace space) {
ASSERT(gc_state_ == NOT_IN_GC); ASSERT(gc_state_ == NOT_IN_GC);
ASSERT(map->instance_type() != MAP_TYPE); ASSERT(map->instance_type() != MAP_TYPE);
Object* result = AllocateRaw(map->instance_size(), // If allocation failures are disallowed, we may allocate in a different
space, // space when new space is full and the object is not a large object.
TargetSpaceId(map->instance_type())); 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; if (result->IsFailure()) return result;
HeapObject::cast(result)->set_map(map); HeapObject::cast(result)->set_map(map);
#ifdef ENABLE_LOGGING_AND_PROFILING #ifdef ENABLE_LOGGING_AND_PROFILING

View File

@ -587,7 +587,6 @@ static const char* TypeToString(InstanceType type) {
case JS_BUILTINS_OBJECT_TYPE: return "JS_BUILTINS_OBJECT"; case JS_BUILTINS_OBJECT_TYPE: return "JS_BUILTINS_OBJECT";
case JS_GLOBAL_PROXY_TYPE: return "JS_GLOBAL_PROXY"; case JS_GLOBAL_PROXY_TYPE: return "JS_GLOBAL_PROXY";
case PROXY_TYPE: return "PROXY"; case PROXY_TYPE: return "PROXY";
case SMI_TYPE: return "SMI";
#define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE: return #NAME; #define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE: return #NAME;
STRUCT_LIST(MAKE_STRUCT_CASE) STRUCT_LIST(MAKE_STRUCT_CASE)
#undef MAKE_STRUCT_CASE #undef MAKE_STRUCT_CASE

View File

@ -336,8 +336,8 @@ bool Object::IsExternalArray() {
return false; return false;
InstanceType instance_type = InstanceType instance_type =
HeapObject::cast(this)->map()->instance_type(); HeapObject::cast(this)->map()->instance_type();
return (instance_type >= EXTERNAL_BYTE_ARRAY_TYPE && return (instance_type >= FIRST_EXTERNAL_ARRAY_TYPE &&
instance_type <= EXTERNAL_FLOAT_ARRAY_TYPE); instance_type <= LAST_EXTERNAL_ARRAY_TYPE);
} }

View File

@ -204,14 +204,13 @@ enum PropertyNormalizationMode {
// instance_type is JS_OBJECT_TYPE. // instance_type is JS_OBJECT_TYPE.
// //
// The names of the string instance types are intended to systematically // The names of the string instance types are intended to systematically
// mirror their encoding in the instance_type field of the map. The length // mirror their encoding in the instance_type field of the map. The default
// (SHORT, MEDIUM, or LONG) is always mentioned. The default encoding is // encoding is considered TWO_BYTE. It is not mentioned in the name. ASCII
// considered TWO_BYTE. It is not mentioned in the name. ASCII encoding is // encoding is mentioned explicitly in the name. Likewise, the default
// mentioned explicitly in the name. Likewise, the default representation is // representation is considered sequential. It is not mentioned in the
// considered sequential. It is not mentioned in the name. The other // name. The other representations (eg, CONS, EXTERNAL) are explicitly
// representations (eg, CONS, EXTERNAL) are explicitly mentioned. // mentioned. Finally, the string is either a SYMBOL_TYPE (if it is a
// Finally, the string is either a SYMBOL_TYPE (if it is a symbol) or a // symbol) or a STRING_TYPE (if it is not a symbol).
// STRING_TYPE (if it is not a symbol).
// //
// NOTE: The following things are some that depend on the string types having // NOTE: The following things are some that depend on the string types having
// instance_types that are less than those of all other types: // instance_types that are less than those of all other types:
@ -237,11 +236,11 @@ enum PropertyNormalizationMode {
V(PRIVATE_EXTERNAL_ASCII_STRING_TYPE) \ V(PRIVATE_EXTERNAL_ASCII_STRING_TYPE) \
\ \
V(MAP_TYPE) \ V(MAP_TYPE) \
V(HEAP_NUMBER_TYPE) \
V(FIXED_ARRAY_TYPE) \
V(CODE_TYPE) \ V(CODE_TYPE) \
V(JS_GLOBAL_PROPERTY_CELL_TYPE) \ V(JS_GLOBAL_PROPERTY_CELL_TYPE) \
V(ODDBALL_TYPE) \ V(ODDBALL_TYPE) \
\
V(HEAP_NUMBER_TYPE) \
V(PROXY_TYPE) \ V(PROXY_TYPE) \
V(BYTE_ARRAY_TYPE) \ V(BYTE_ARRAY_TYPE) \
V(PIXEL_ARRAY_TYPE) \ V(PIXEL_ARRAY_TYPE) \
@ -257,6 +256,7 @@ enum PropertyNormalizationMode {
V(EXTERNAL_FLOAT_ARRAY_TYPE) \ V(EXTERNAL_FLOAT_ARRAY_TYPE) \
V(FILLER_TYPE) \ V(FILLER_TYPE) \
\ \
V(FIXED_ARRAY_TYPE) \
V(ACCESSOR_INFO_TYPE) \ V(ACCESSOR_INFO_TYPE) \
V(ACCESS_CHECK_INFO_TYPE) \ V(ACCESS_CHECK_INFO_TYPE) \
V(INTERCEPTOR_INFO_TYPE) \ V(INTERCEPTOR_INFO_TYPE) \
@ -418,6 +418,7 @@ const uint32_t kShortcutTypeTag = kConsStringTag;
enum InstanceType { enum InstanceType {
// String types.
SYMBOL_TYPE = kSymbolTag | kSeqStringTag, SYMBOL_TYPE = kSymbolTag | kSeqStringTag,
ASCII_SYMBOL_TYPE = kAsciiStringTag | kSymbolTag | kSeqStringTag, ASCII_SYMBOL_TYPE = kAsciiStringTag | kSymbolTag | kSeqStringTag,
CONS_SYMBOL_TYPE = kSymbolTag | kConsStringTag, CONS_SYMBOL_TYPE = kSymbolTag | kConsStringTag,
@ -433,56 +434,66 @@ enum InstanceType {
EXTERNAL_ASCII_STRING_TYPE = kAsciiStringTag | kExternalStringTag, EXTERNAL_ASCII_STRING_TYPE = kAsciiStringTag | kExternalStringTag,
PRIVATE_EXTERNAL_ASCII_STRING_TYPE = EXTERNAL_ASCII_STRING_TYPE, PRIVATE_EXTERNAL_ASCII_STRING_TYPE = EXTERNAL_ASCII_STRING_TYPE,
MAP_TYPE = kNotStringTag, // Objects allocated in their own spaces (never in new space).
HEAP_NUMBER_TYPE, MAP_TYPE = kNotStringTag, // FIRST_NONSTRING_TYPE
FIXED_ARRAY_TYPE,
CODE_TYPE, CODE_TYPE,
ODDBALL_TYPE, ODDBALL_TYPE,
JS_GLOBAL_PROPERTY_CELL_TYPE, JS_GLOBAL_PROPERTY_CELL_TYPE,
// "Data", objects that cannot contain non-map-word pointers to heap
// objects.
HEAP_NUMBER_TYPE,
PROXY_TYPE, PROXY_TYPE,
BYTE_ARRAY_TYPE, BYTE_ARRAY_TYPE,
PIXEL_ARRAY_TYPE, PIXEL_ARRAY_TYPE,
EXTERNAL_BYTE_ARRAY_TYPE, EXTERNAL_BYTE_ARRAY_TYPE, // FIRST_EXTERNAL_ARRAY_TYPE
EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE, EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE,
EXTERNAL_SHORT_ARRAY_TYPE, EXTERNAL_SHORT_ARRAY_TYPE,
EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE, EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE,
EXTERNAL_INT_ARRAY_TYPE, EXTERNAL_INT_ARRAY_TYPE,
EXTERNAL_UNSIGNED_INT_ARRAY_TYPE, EXTERNAL_UNSIGNED_INT_ARRAY_TYPE,
EXTERNAL_FLOAT_ARRAY_TYPE, EXTERNAL_FLOAT_ARRAY_TYPE, // LAST_EXTERNAL_ARRAY_TYPE
FILLER_TYPE, FILLER_TYPE, // LAST_DATA_TYPE
SMI_TYPE,
// Structs.
ACCESSOR_INFO_TYPE, ACCESSOR_INFO_TYPE,
ACCESS_CHECK_INFO_TYPE, ACCESS_CHECK_INFO_TYPE,
INTERCEPTOR_INFO_TYPE, INTERCEPTOR_INFO_TYPE,
SHARED_FUNCTION_INFO_TYPE,
CALL_HANDLER_INFO_TYPE, CALL_HANDLER_INFO_TYPE,
FUNCTION_TEMPLATE_INFO_TYPE, FUNCTION_TEMPLATE_INFO_TYPE,
OBJECT_TEMPLATE_INFO_TYPE, OBJECT_TEMPLATE_INFO_TYPE,
SIGNATURE_INFO_TYPE, SIGNATURE_INFO_TYPE,
TYPE_SWITCH_INFO_TYPE, TYPE_SWITCH_INFO_TYPE,
SCRIPT_TYPE,
#ifdef ENABLE_DEBUGGER_SUPPORT #ifdef ENABLE_DEBUGGER_SUPPORT
DEBUG_INFO_TYPE, DEBUG_INFO_TYPE,
BREAK_POINT_INFO_TYPE, BREAK_POINT_INFO_TYPE,
#endif #endif
SCRIPT_TYPE,
JS_VALUE_TYPE, FIXED_ARRAY_TYPE,
SHARED_FUNCTION_INFO_TYPE,
JS_VALUE_TYPE, // FIRST_JS_OBJECT_TYPE
JS_OBJECT_TYPE, JS_OBJECT_TYPE,
JS_CONTEXT_EXTENSION_OBJECT_TYPE, JS_CONTEXT_EXTENSION_OBJECT_TYPE,
JS_GLOBAL_OBJECT_TYPE, JS_GLOBAL_OBJECT_TYPE,
JS_BUILTINS_OBJECT_TYPE, JS_BUILTINS_OBJECT_TYPE,
JS_GLOBAL_PROXY_TYPE, JS_GLOBAL_PROXY_TYPE,
JS_ARRAY_TYPE, JS_ARRAY_TYPE,
JS_REGEXP_TYPE, JS_REGEXP_TYPE, // LAST_JS_OBJECT_TYPE
JS_FUNCTION_TYPE, JS_FUNCTION_TYPE,
// Pseudo-types // Pseudo-types
FIRST_NONSTRING_TYPE = MAP_TYPE,
FIRST_TYPE = 0x0, FIRST_TYPE = 0x0,
INVALID_TYPE = FIRST_TYPE - 1,
LAST_TYPE = JS_FUNCTION_TYPE, 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 // Boundaries for testing the type is a JavaScript "object". Note that
// function objects are not counted as objects, even though they are // function objects are not counted as objects, even though they are
// implemented as such; only values whose typeof is "object" are included. // implemented as such; only values whose typeof is "object" are included.