示例#1
0
文件: table.c 项目: Archs/scheme
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;
}
示例#2
0
文件: string.c 项目: Archs/scheme
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;
}
示例#3
0
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);
}