object make_table(long capacity) { object bindings = make_vector(capacity*2, false_object); long size = sizeof(struct table_heap_structure); object *ve, v; PUSH_GC_PROTECT(bindings); v = make_heap_object(TABLE_TYPE,size); TABLE_COUNT(v) = 0; VECTOR_TAG(bindings) = false_object; /* FIX ME */ TABLE_BINDINGS(v) = bindings; POP_GC_PROTECT(1); return v; }
static void primop_string_to_list(long argc) { long i; object result = null_object; PUSH_GC_PROTECT(result); TYPE_CHECK(STRING_P(sp[0]),1,"string", sp[0]); i = STRING_LENGTH(sp[0]); while (i--) { char c = STRING_VALUE(sp[0])[i]; result = cons(make_character(c),result); } POP_GC_PROTECT(1); *sp = result; }
void init_heap(long heap_kbytes, long stack_kbytes, long code_kbytes) { long i, code_size; long hemiCount = 2; will_gc_hook = did_gc_hook = NULL; heap_size = heap_kbytes * 1024; stack_size = stack_kbytes * 1024; code_size = code_kbytes * 1024; i = (hemiCount * heap_size) + stack_size + code_size; heap = allocate_memory(i + sizeof(long)); if (!heap) fatal_error("Cannot allocate %ld bytes for the heap!", i); /* printf("INIT: heap = %x\n",heap); */ min_memory = heap = (void *)ALIGN_BYTE_POINTER((long)heap); max_memory = heap + i; heap_pointer = heap; heap_end = heap + heap_size; max_heap = heap + (hemiCount * heap_size); code_pointer = max_heap; stack_bottom = (object *)(code_pointer + code_size); stack_top = (object *)((long)stack_bottom + stack_size); sp = stack_top; i = (long)GC_ROOT_STACK_MAX * (long)sizeof(object *); gc_root_stack_buffer = make_buffer(i); gc_root_stack_begin = (object **)BUFFER_DATA(gc_root_stack_buffer); gc_root_stack_end = gc_root_stack_begin + i; gc_root_stack_pointer = gc_root_stack_begin; gc_tmp1 = null_object; gc_tmp2 = null_object; gc_tmp3 = null_object; gc_tmp4 = null_object; gc_tmp5 = null_object; PUSH_GC_PROTECT(gc_tmp1); PUSH_GC_PROTECT(gc_tmp2); PUSH_GC_PROTECT(gc_tmp3); PUSH_GC_PROTECT(gc_tmp4); PUSH_GC_PROTECT(gc_tmp5); }