@@ -9,39 +9,49 @@
9#include "idris_rts.h"
9#include "idris_rts.h"
10#include "idris_gc.h"
10#include "idris_gc.h"
12−VM* init_vm(int stack_size, size_t heap_size) {
12+VM* init_vm(int stack_size, size_t heap_size, int argc, char* argv[]) {
13 VAL* valstack = malloc(stack_size*sizeof(VAL));
13 VAL* valstack = malloc(stack_size*sizeof(VAL));
14 int* intstack = malloc(stack_size*sizeof(int));
14 int* intstack = malloc(stack_size*sizeof(int));
15 double* floatstack = malloc(stack_size*sizeof(double));
15 double* floatstack = malloc(stack_size*sizeof(double));
17 VM* vm = malloc(sizeof(VM));
17 VM* vm = malloc(sizeof(VM));
18− vm -> valstack = valstack;
18+ vm->valstack = valstack;
19− vm -> valstack_top = valstack;
19+ vm->valstack_top = valstack;
20− vm -> valstack_base = valstack;
20+ vm->valstack_base = valstack;
21− vm -> intstack = intstack;
21+ vm->intstack = intstack;
22− vm -> intstack_ptr = intstack;
22+ vm->intstack_ptr = intstack;
23− vm -> floatstack = floatstack;
23+ vm->floatstack = floatstack;
24− vm -> floatstack_ptr = floatstack;
24+ vm->floatstack_ptr = floatstack;
25− vm -> stack_max = valstack + stack_size;
25+ vm->stack_max = valstack + stack_size;
26− vm -> heap = malloc(heap_size);
26+ vm->heap = malloc(heap_size);
27− vm -> oldheap = NULL;
27+ vm->oldheap = NULL;
28− vm -> heap_next = vm -> heap;
28+ vm->heap_next = vm->heap;
29− vm -> heap_end = vm -> heap + heap_size;
29+ vm->heap_end = vm->heap + heap_size;
30− vm -> heap_size = heap_size;
30+ vm->heap_size = heap_size;
31− vm -> collections = 0;
31+ vm->collections = 0;
32− vm -> allocations = 0;
32+ vm->allocations = 0;
33− vm -> heap_growth = heap_size;
33+ vm->heap_growth = heap_size;
34− vm -> ret = NULL;
34+ vm->ret = NULL;
35− vm -> reg1 = NULL;
35+ vm->reg1 = NULL;
37− vm -> inbox = malloc(1024*sizeof(VAL));
37+ vm->inbox = malloc(1024*sizeof(VAL));
38− vm -> inbox_end = vm -> inbox + 1024;
38+ vm->inbox_end = vm->inbox + 1024;
39− vm -> inbox_ptr = vm -> inbox;
39+ vm->inbox_ptr = vm->inbox;
40− vm -> inbox_write = vm -> inbox;
40+ vm->inbox_write = vm->inbox;
42− pthread_mutex_init(&(vm -> inbox_lock), NULL);
42+ pthread_mutex_init(&(vm->inbox_lock), NULL);
43− pthread_mutex_init(&(vm -> inbox_block), NULL);
43+ pthread_mutex_init(&(vm->inbox_block), NULL);
44− pthread_cond_init(&(vm -> inbox_waiting), NULL);
44+ pthread_cond_init(&(vm->inbox_waiting), NULL);
48+ // Assumption: there's enough space for this in the initial heap.
49+ vm->argv = malloc(argc*sizeof(VAL));
52+ for(i = 0; i < argc; ++i) {
53+ vm->argv[i] = MKSTR(vm, argv[i]);
46 return vm;
56 return vm;
@@ -52,6 +62,7 @@ void terminate(VM* vm) {
52 free(vm->intstack);
62 free(vm->intstack);
53 free(vm->floatstack);
63 free(vm->floatstack);
54 free(vm->heap);
64 free(vm->heap);
55 if (vm->oldheap != NULL) { free(vm->oldheap); }
66 if (vm->oldheap != NULL) { free(vm->oldheap); }
56 pthread_mutex_destroy(&(vm -> inbox_lock));
67 pthread_mutex_destroy(&(vm -> inbox_lock));
57 pthread_mutex_destroy(&(vm -> inbox_block));
68 pthread_mutex_destroy(&(vm -> inbox_block));
@@ -349,13 +360,14 @@ void* runThread(void* arg) {
349 td->fn(vm, NULL);
360 td->fn(vm, NULL);
351 free(td);
362 free(td);
354void* vmThread(VM* callvm, func f, VAL arg) {
366void* vmThread(VM* callvm, func f, VAL arg) {
355− VM* vm = init_vm(callvm->stack_max - callvm->valstack, callvm->heap_size);
367+ VM* vm = init_vm(callvm->stack_max - callvm->valstack, callvm->heap_size, 0, NULL);
356 pthread_t t;
368 pthread_t t;
357 pthread_attr_t attr;
369 pthread_attr_t attr;
358− size_t stacksize;
370+// size_t stacksize;
360 pthread_attr_init(&attr);
372 pthread_attr_init(&attr);
361// pthread_attr_getstacksize (&attr, &stacksize);
373// pthread_attr_getstacksize (&attr, &stacksize);
@@ -405,9 +417,8 @@ VAL copyTo(VM* vm, VAL x) {
405 case PTR:
417 case PTR:
406 cl = MKPTR(vm, x->info.ptr);
418 cl = MKPTR(vm, x->info.ptr);
408− case FWD:
420+ default:
409 assert(0); // We're in trouble if this happens...
421 assert(0); // We're in trouble if this happens...
412 return cl;
423 return cl;
@@ -465,6 +476,14 @@ VAL recvMessage(VM* vm) {
465 return msg;
476 return msg;
479+int idris_numArgs(VM* vm) {
483+VAL idris_getArg(VM* vm, int i) {
468void stackOverflow() {
487void stackOverflow() {
469 fprintf(stderr, "Stack overflow");
488 fprintf(stderr, "Stack overflow");
470 exit(-1);
489 exit(-1);