/* Sun-$Revision: 23.3 $ */
/* Copyright 1992-9 Sun Microsystems, Inc. and Stanford University.
See the LICENSE file for license information. */
# pragma interface
struct oopsOopClass: memOopClass {
// constructor
friend oopsOop as_oopsOop(void* p) { return (oopsOop) as_memOop(p); }
// accessors
oop* oops(fint which = 0) { return &((oop*) addr())[which]; }
oop at(fint which) { return *oops(which); }
inline void at_put(fint which, oop contents, bool cs = true);
void record_promotion(fint size);
void fix_generation(fint size) { if (is_old()) record_promotion(size); }
// allocators
oopsOop copy(fint size, bool mustAllocate= true, oop genObj= NULL,
bool cs= true) {
oop* x= genObj
? genObj->my_generation()->alloc_objs(size, mustAllocate)
: Memory->alloc_objs(size, mustAllocate);
if (x == NULL)
return oopsOop(failedAllocationOop);
copy_oops(oops(), x, size);
oopsOop r= as_oopsOop(x);
if (cs) r->fix_generation(size);
return r; }
oopsOop grow(fint size, fint delta, bool mustAllocate= true) {
oop* x= Memory->alloc_objs(size + delta, mustAllocate);
if (x == NULL)
return oopsOop(failedAllocationOop);
copy_oops(oops(), x, size);
oopsOop r = as_oopsOop(x);
// can't do fix_generation(), since grown space isn't initialized yet
return r; }
oopsOop shrink(fint size, fint delta, bool mustAllocate= true) {
oop* x= Memory->alloc_objs(size - delta, mustAllocate);
if (x == NULL)
return oopsOop(failedAllocationOop);
copy_oops(oops(), x, size - delta);
oopsOop r = as_oopsOop(x);
r->fix_generation(size - delta);
return r; }
oopsOop insert(fint size, fint change_point, fint delta,
bool mustAllocate= true, bool sameGen= false) {
oop* x= sameGen
? my_generation()->alloc_objs(size + delta, mustAllocate)
: Memory->alloc_objs(size + delta, mustAllocate);
if (x == NULL)
return oopsOop(failedAllocationOop);
oop* p = oops();
copy_oops(p, x, change_point);
copy_oops(p + change_point, x + change_point + delta, size - change_point);
oopsOop r = as_oopsOop(x);
// can't do fix_generation(), since inserted space isn't initialized yet
return r; }
oopsOop remove(fint size, fint change_point, fint delta,
bool mustAllocate= true, bool sameGen= false) {
oop* x= sameGen
? my_generation()->alloc_objs(size - delta, mustAllocate)
: Memory->alloc_objs(size - delta, mustAllocate);
if (x == NULL)
return oopsOop(failedAllocationOop);
oop* p = oops();
copy_oops(p, x, change_point);
copy_oops(p + change_point + delta, x + change_point,
size - change_point - delta);
oopsOop r = as_oopsOop(x);
r->fix_generation(size - delta);
return r; }
// memory operations
oopsOop scavenge(fint size);
void gc_mark_referents();
bool verify();
};