comparison runtime/progfoot.inc @ 78:abc6f3d644a4

Use Boehm-GC for garbage collection. Also make no_impl print on stderr rather than standard in and return a non-zero error code.
author Mike Pavone <pavone@retrodev.com>
date Sun, 15 Jul 2012 18:11:00 -0700
parents 7b454d100dc8
children 25bc8a5ab41e
comparison
equal deleted inserted replaced
77:8a9b96888b7d 78:abc6f3d644a4
1 1
2 array * alloc_array(uint32_t num_els) 2 array * alloc_array(uint32_t num_els)
3 { 3 {
4 array * arr = malloc(sizeof(array)); 4 array * arr = GC_MALLOC(sizeof(array));
5 arr->header.meta = &array_meta; 5 arr->header.meta = &array_meta;
6 arr->header.parent = NULL; 6 arr->header.parent = NULL;
7 arr->storage = arr->size = num_els; 7 arr->storage = arr->size = num_els;
8 if (num_els < 4) { 8 if (num_els < 4) {
9 arr->storage = 4; 9 arr->storage = 4;
10 } 10 }
11 arr->data = malloc(sizeof(object *) * arr->storage); 11 arr->data = GC_MALLOC(sizeof(object *) * arr->storage);
12 return arr;
12 } 13 }
13 14
14 object * make_array(uint32_t num_els, ...) 15 object * make_array(uint32_t num_els, ...)
15 { 16 {
16 va_list els; 17 va_list els;
23 return &(arr->header); 24 return &(arr->header);
24 } 25 }
25 26
26 object * make_lambda(void * env, closure_func func) 27 object * make_lambda(void * env, closure_func func)
27 { 28 {
28 lambda * ret = malloc(sizeof(lambda)); 29 lambda * ret = GC_MALLOC(sizeof(lambda));
29 ret->header.meta = &lambda_meta; 30 ret->header.meta = &lambda_meta;
30 ret->header.parent = NULL; 31 ret->header.parent = NULL;
31 ret->env = env; 32 ret->env = env;
32 ret->func = func; 33 ret->func = func;
33 return (object *) ret; 34 return (object *) ret;
35 36
36 int main(int argc, char ** argv) 37 int main(int argc, char ** argv)
37 { 38 {
38 int i; 39 int i;
39 string * arg; 40 string * arg;
41 GC_INIT();
40 array * arr = alloc_array(argc); 42 array * arr = alloc_array(argc);
41 for (i = 0; i < argc; ++i) { 43 for (i = 0; i < argc; ++i) {
42 arg = (string *)make_object(&string_meta, NULL, 0); 44 arg = (string *)make_object(&string_meta, NULL, 0);
43 arg->data = argv[i]; 45 arg->data = argv[i];
44 arg->bytes = arg->length = strlen(argv[i]); 46 arg->bytes = arg->length = strlen(argv[i]);