void eval_current(void) { int tag; next_node(); tag = tag_of(input); switch(tag) { case TAG_CD: eval_cd(); break; case TAG_PRIMITIVE: ((primitive*)input)->block(); break; case TAG_SYMBOL: eval_symbol(); break; case TAG_INT: case TAG_ARRAY: case TAG_STRING: case TAG_NIL: case TAG_CONTEXT: execute_waiter(); break; case TAG_I_S: push(wait_stack,((inp_stub*)input)->func); break; default: printf("evaluated object of unknown tag:%i ",tag); break; } check_gc(0.5 KB); }
void crb_array_resize(CRB_Interpreter *inter, CRB_Object *obj, int new_size) { int new_alloc_size; CRB_Boolean need_realloc; int i; check_gc(inter); if (new_size > obj->u.array.alloc_size) { new_alloc_size = obj->u.array.alloc_size * 2; if (new_alloc_size < new_size) { new_alloc_size = new_size + ARRAY_ALLOC_SIZE; } else if (new_alloc_size - obj->u.array.alloc_size > ARRAY_ALLOC_SIZE) { new_alloc_size = obj->u.array.alloc_size + ARRAY_ALLOC_SIZE; } need_realloc = CRB_TRUE; } else if (obj->u.array.alloc_size - new_size > ARRAY_ALLOC_SIZE) { new_alloc_size = new_size; need_realloc = CRB_TRUE; } else { need_realloc = CRB_FALSE; } if (need_realloc) { check_gc(inter); obj->u.array.array = MEM_realloc(obj->u.array.array, new_alloc_size * sizeof(CRB_Value)); inter->heap.current_heap_size += (new_alloc_size - obj->u.array.alloc_size) * sizeof(CRB_Value); obj->u.array.alloc_size = new_alloc_size; } for (i = obj->u.array.size; i < new_size; i++) { obj->u.array.array[i].type = CRB_NULL_VALUE; } obj->u.array.size = new_size; }
static CRB_Object * alloc_object(CRB_Interpreter *inter, ObjectType type) { CRB_Object *ret; check_gc(inter); ret = MEM_malloc(sizeof(CRB_Object)); inter->heap.current_heap_size += sizeof(CRB_Object); ret->type = type; ret->marked = CRB_FALSE; ret->prev = NULL; ret->next = inter->heap.header; inter->heap.header = ret; if (ret->next) { ret->next->prev = ret; } return ret; }
static MVM_Object * alloc_object(MVM_VirtualMachine *mvm, ObjectType type) { MVM_Object *ret; check_gc(mvm); ret = MEM_malloc(sizeof(MVM_Object)); mvm->heap.current_heap_size += sizeof(MVM_Object); ret->type = type; ret->marked = MVM_FALSE; ret->prev = NULL; ret->next = mvm->heap.header; mvm->heap.header = ret; if (ret->next) { ret->next->prev = ret; } return ret; }
void crb_array_add(CRB_Interpreter *inter, CRB_Object *obj, CRB_Value v) { int new_size; DBG_assert(obj->type == ARRAY_OBJECT, ("bad type..%d\n", obj->type)); check_gc(inter); if (obj->u.array.size + 1 > obj->u.array.alloc_size) { new_size = obj->u.array.alloc_size * 2; if (new_size == 0 || new_size - obj->u.array.alloc_size > ARRAY_ALLOC_SIZE) { new_size = obj->u.array.alloc_size + ARRAY_ALLOC_SIZE; } obj->u.array.array = MEM_realloc(obj->u.array.array, new_size * sizeof(CRB_Value)); inter->heap.current_heap_size += (new_size - obj->u.array.alloc_size) * sizeof(CRB_Value); obj->u.array.alloc_size = new_size; } obj->u.array.array[obj->u.array.size] = v; obj->u.array.size++; }