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:
parent
afabb5a9bc
commit
c114f17efa
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
Loading…
Reference in New Issue
Block a user