/* allocate a descriptor from a descriptor slot */ struct GGGGC_Descriptor *ggggc_allocateDescriptorSlot(struct GGGGC_DescriptorSlot *slot) { if (slot->descriptor) return slot->descriptor; if (slot->descriptor) { return slot->descriptor; } slot->descriptor = ggggc_allocateDescriptor(slot->size, slot->pointers); /* make the slot descriptor a root */ GGC_PUSH_1(slot->descriptor); GGC_GLOBALIZE(); return slot->descriptor; }
/* allocate a descriptor from a descriptor slot */ struct GGGGC_Descriptor *ggggc_allocateDescriptorSlot(struct GGGGC_DescriptorSlot *slot) { if (slot->descriptor) return slot->descriptor; ggc_mutex_lock_raw(&slot->lock); if (slot->descriptor) { ggc_mutex_unlock(&slot->lock); return slot->descriptor; } slot->descriptor = ggggc_allocateDescriptor(slot->size, slot->pointers); /* make the slot descriptor a root */ GGC_PUSH_1(slot->descriptor); GGC_GLOBALIZE(); ggc_mutex_unlock(&slot->lock); return slot->descriptor; }
void SymbolTable::setDescriptorPointer() { ggc_size_t size = 1; ggc_size_t pointers = 0; std::map<std::string, LSRValue>::iterator iter = symMap.begin(); while (iter != symMap.end()) { size++; if (!iter->second.isInt()) { // Anything but an int is a pointer in this language !!!!!!! pointers = pointers | 1<<size; } iter++; } if (pointers) { // If pointers is no longer 0 we set at least one pointer, // need to set the lowest order bit to 1 to denote that we have pointers. pointers = pointers | 1; } descriptorPointer = NULL; GGC_PUSH_1(descriptorPointer); GGC_GLOBALIZE(); descriptorPointer = (void *) ggggc_allocateDescriptor(size,pointers); }