Allocate filler objects in the factory.

R=mstarzinger@chromium.org

Review URL: https://codereview.chromium.org/240393003

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20845 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
yangguo@chromium.org 2014-04-17 13:15:22 +00:00
parent 14010d37c6
commit c918ccd392
5 changed files with 46 additions and 27 deletions

View File

@ -32,6 +32,16 @@ Handle<T> Factory::New(Handle<Map> map,
} }
Handle<HeapObject> Factory::NewFillerObject(int size,
bool double_align,
AllocationSpace space) {
CALL_HEAP_FUNCTION(
isolate(),
isolate()->heap()->AllocateFillerObject(size, double_align, space),
HeapObject);
}
Handle<Box> Factory::NewBox(Handle<Object> value) { Handle<Box> Factory::NewBox(Handle<Object> value) {
Handle<Box> result = Handle<Box>::cast(NewStruct(BOX_TYPE)); Handle<Box> result = Handle<Box>::cast(NewStruct(BOX_TYPE));
result->set_value(*value); result->set_value(*value);

View File

@ -269,6 +269,10 @@ class Factory V8_FINAL {
int instance_size, int instance_size,
ElementsKind elements_kind = TERMINAL_FAST_ELEMENTS_KIND); ElementsKind elements_kind = TERMINAL_FAST_ELEMENTS_KIND);
Handle<HeapObject> NewFillerObject(int size,
bool double_align,
AllocationSpace space);
Handle<JSObject> NewFunctionPrototype(Handle<JSFunction> function); Handle<JSObject> NewFunctionPrototype(Handle<JSFunction> function);
Handle<FixedArray> CopyFixedArray(Handle<FixedArray> array); Handle<FixedArray> CopyFixedArray(Handle<FixedArray> array);

View File

@ -2409,6 +2409,22 @@ MaybeObject* Heap::AllocateMap(InstanceType instance_type,
} }
MaybeObject* Heap::AllocateFillerObject(int size,
bool double_align,
AllocationSpace space) {
HeapObject* allocation;
{ MaybeObject* maybe_allocation = AllocateRaw(size, space, space);
if (!maybe_allocation->To(&allocation)) return maybe_allocation;
}
#ifdef DEBUG
MemoryChunk* chunk = MemoryChunk::FromAddress(allocation->address());
ASSERT(chunk->owner()->identity() == space);
#endif
CreateFillerObjectAt(allocation->address(), size);
return allocation;
}
MaybeObject* Heap::AllocatePolymorphicCodeCache() { MaybeObject* Heap::AllocatePolymorphicCodeCache() {
return AllocateStruct(POLYMORPHIC_CODE_CACHE_TYPE); return AllocateStruct(POLYMORPHIC_CODE_CACHE_TYPE);
} }

View File

@ -754,6 +754,12 @@ class Heap {
MUST_USE_RESULT MaybeObject* AllocatePartialMap(InstanceType instance_type, MUST_USE_RESULT MaybeObject* AllocatePartialMap(InstanceType instance_type,
int instance_size); int instance_size);
// Allocate a block of memory in the given space (filled with a filler).
// Used as a fall-back for generated code when the space is full.
MUST_USE_RESULT MaybeObject* AllocateFillerObject(int size,
bool double_align,
AllocationSpace space);
// Allocates an empty PolymorphicCodeCache. // Allocates an empty PolymorphicCodeCache.
MUST_USE_RESULT MaybeObject* AllocatePolymorphicCodeCache(); MUST_USE_RESULT MaybeObject* AllocatePolymorphicCodeCache();

View File

@ -9791,45 +9791,28 @@ RUNTIME_FUNCTION(ObjectPair, RuntimeHidden_ResolvePossiblyDirectEval) {
} }
// Allocate a block of memory in the given space (filled with a filler). RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_AllocateInNewSpace) {
// Used as a fall-back for generated code when the space is full. HandleScope scope(isolate);
static MaybeObject* Allocate(Isolate* isolate, ASSERT(args.length() == 1);
int size, CONVERT_SMI_ARG_CHECKED(size, 0);
bool double_align,
AllocationSpace space) {
Heap* heap = isolate->heap();
RUNTIME_ASSERT(IsAligned(size, kPointerSize)); RUNTIME_ASSERT(IsAligned(size, kPointerSize));
RUNTIME_ASSERT(size > 0); RUNTIME_ASSERT(size > 0);
RUNTIME_ASSERT(size <= Page::kMaxRegularHeapObjectSize); RUNTIME_ASSERT(size <= Page::kMaxRegularHeapObjectSize);
HeapObject* allocation; return *isolate->factory()->NewFillerObject(size, false, NEW_SPACE);
{ MaybeObject* maybe_allocation = heap->AllocateRaw(size, space, space);
if (!maybe_allocation->To(&allocation)) return maybe_allocation;
}
#ifdef DEBUG
MemoryChunk* chunk = MemoryChunk::FromAddress(allocation->address());
ASSERT(chunk->owner()->identity() == space);
#endif
heap->CreateFillerObjectAt(allocation->address(), size);
return allocation;
}
RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_AllocateInNewSpace) {
SealHandleScope shs(isolate);
ASSERT(args.length() == 1);
CONVERT_SMI_ARG_CHECKED(size, 0);
return Allocate(isolate, size, false, NEW_SPACE);
} }
RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_AllocateInTargetSpace) { RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_AllocateInTargetSpace) {
SealHandleScope shs(isolate); HandleScope scope(isolate);
ASSERT(args.length() == 2); ASSERT(args.length() == 2);
CONVERT_SMI_ARG_CHECKED(size, 0); CONVERT_SMI_ARG_CHECKED(size, 0);
CONVERT_SMI_ARG_CHECKED(flags, 1); CONVERT_SMI_ARG_CHECKED(flags, 1);
RUNTIME_ASSERT(IsAligned(size, kPointerSize));
RUNTIME_ASSERT(size > 0);
RUNTIME_ASSERT(size <= Page::kMaxRegularHeapObjectSize);
bool double_align = AllocateDoubleAlignFlag::decode(flags); bool double_align = AllocateDoubleAlignFlag::decode(flags);
AllocationSpace space = AllocateTargetSpace::decode(flags); AllocationSpace space = AllocateTargetSpace::decode(flags);
return Allocate(isolate, size, double_align, space); return *isolate->factory()->NewFillerObject(size, double_align, space);
} }