/* Sun-$Revision: 23.5 $ */
/* Copyright 1992-9 Sun Microsystems, Inc. and Stanford University.
See the LICENSE file for license information. */
# pragma interface
// lexical parent (frame pointer) of prototype block
# define BLOCK_PROTO_SCOPE as_smiOop(-1)
// initial scopeDesc value
# define BLOCK_PROTO_DESC as_smiOop(-1)
class blockMap: public Map {
friend class blockOopClass;
friend class SCodeScope;
friend SCodeScope* scopeFromBlockMap(mapOop blockMap);
private:
smiOop _desc;
stringOop valueMethodName;
slotsOop valueMethod;
public:
// testers
bool is_block() { return true; }
bool is_killable() { return true; }
private:
// hard-wired block accessors
smiOop desc() { return _desc; }
void setDesc(smiOop d) { _desc= d; }
blockMap *clone_and_set_desc(smiOop d) {
blockMap* new_map = (blockMap*) copy();
mapOop new_moop = as_mapOop(new_map);
new_moop->init_mark();
new_map->setDesc(d);
return new_map; }
public: // because map::init is public
void init(stringOop name, slotsOop method);
private:
void setSlots();
friend class SlotIterator;
public:
// programming
// nothing in block object to change
void switch_pointer(oop obj, oop* where, oop to) {
Unused(obj); Unused(where); Unused(to); }
void switch_pointer_in_map( oop* where, oop to);
fint size() { return sizeof(blockMap)/sizeof(oop); }
slotDesc* slots();
fint length_slots() { return 0; }
virtual slotDesc* find_slot(stringOop name);
slotsOop value() { return valueMethod; }
// constructor
friend blockOop create_block(slotsOop valueMethod);
// cloning operations; users aren't allowed to clone blocks -Urs
oop clone(oop obj, bool mustAllocate= true, oop genObj= NULL) {
Unused(mustAllocate); Unused(genObj);
return obj; }
bool can_inline_clone() { return false; }
// creation op
oop fill_in_slots(slotList* slist, fint slotCount) {
ShouldNotCallThis(); Unused(slist); Unused(slotCount); return badOop; }
// size operations
fint empty_object_size() { return sizeof(blockOopClass) / oopSize; }
fint object_size(oop obj) { Unused(obj); return empty_object_size(); }
// mirror operation
mirrorOop mirror_proto() { return Memory->blockMirrorObj; }
oop mirror_parent(oop obj);
// killable operations
void kill(oop p);
bool is_live(oop p);
// memory operations
virtual oop scavenge(oop obj);
bool verify(oop obj);
// enumerating
virtual bool is_enumerable(oop obj, oop* matching_cell) {
Unused(obj); Unused(matching_cell);
return false; }
// printing operations
void print(oop obj);
oop dummy_obj(oop filler);
// profiler operation
void dummy_initialize(oop obj, oop filler);
};
inline void blockMap::setSlots() {
block_slots[1].name= valueMethodName;
block_slots[1].data= valueMethod;
}
inline slotDesc* blockMap::slots() { setSlots(); return block_slots; }