diff --git a/vm/allot.hpp b/vm/allot.hpp index e7e11e46ef..59c362a0b5 100644 --- a/vm/allot.hpp +++ b/vm/allot.hpp @@ -1,7 +1,31 @@ namespace factor { -// It is up to the caller to fill in the object's fields in a meaningful -// fashion! +// It is up to the caller to fill in the object's fields in a +// meaningful fashion! + +// Allocates memory +inline object* factor_vm::allot_large_object(cell type, cell size) { + // If tenured space does not have enough room, collect and compact + cell requested_size = size + data->high_water_mark(); + if (!data->tenured->can_allot_p(requested_size)) { + primitive_compact_gc(); + + // If it still won't fit, grow the heap + if (!data->tenured->can_allot_p(requested_size)) { + gc(collect_growing_heap_op, size); + } + } + + object* obj = data->tenured->allot(size); + + // Allows initialization code to store old->new pointers + // without hitting the write barrier in the common case of + // a nursery allocation + write_barrier(obj, size); + + obj->initialize(type); + return obj; +} // Allocates memory inline object* factor_vm::allot_object(cell type, cell size) { @@ -20,6 +44,7 @@ inline object* factor_vm::allot_object(cell type, cell size) { object* obj = nursery->allot(size); obj->initialize(type); + return obj; } diff --git a/vm/gc.cpp b/vm/gc.cpp index 13b89ad890..ab8a48d9d3 100644 --- a/vm/gc.cpp +++ b/vm/gc.cpp @@ -189,33 +189,6 @@ void factor_vm::primitive_compact_gc() { gc(collect_compact_op, 0); } -// It is up to the caller to fill in the object's fields in a meaningful -// fashion! - -// Allocates memory -object* factor_vm::allot_large_object(cell type, cell size) { - // If tenured space does not have enough room, collect and compact - cell requested_size = size + data->high_water_mark(); - if (!data->tenured->can_allot_p(requested_size)) { - primitive_compact_gc(); - - // If it still won't fit, grow the heap - if (!data->tenured->can_allot_p(requested_size)) { - gc(collect_growing_heap_op, size); - } - } - - object* obj = data->tenured->allot(size); - - // Allows initialization code to store old->new pointers - // without hitting the write barrier in the common case of - // a nursery allocation - write_barrier(obj, size); - - obj->initialize(type); - return obj; -} - void factor_vm::primitive_enable_gc_events() { gc_events = new std::vector(); }