@@ -9,39 +9,49 @@
99#include "idris_rts.h"
1010#include "idris_gc.h"
1111
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[]) {
1313 VAL* valstack = malloc(stack_size*sizeof(VAL));
1414 int* intstack = malloc(stack_size*sizeof(int));
1515 double* floatstack = malloc(stack_size*sizeof(double));
1616
1717 VM* vm = malloc(sizeof(VM));
18− vm -> valstack = valstack;
19− vm -> valstack_top = valstack;
20− vm -> valstack_base = valstack;
21− vm -> intstack = intstack;
22− vm -> intstack_ptr = intstack;
23− vm -> floatstack = floatstack;
24− vm -> floatstack_ptr = floatstack;
25− vm -> stack_max = valstack + stack_size;
26− vm -> heap = malloc(heap_size);
27− vm -> oldheap = NULL;
28− vm -> heap_next = vm -> heap;
29− vm -> heap_end = vm -> heap + heap_size;
30− vm -> heap_size = heap_size;
31− vm -> collections = 0;
32− vm -> allocations = 0;
33− vm -> heap_growth = heap_size;
34− vm -> ret = NULL;
35− vm -> reg1 = NULL;
36−
37− vm -> inbox = malloc(1024*sizeof(VAL));
38− vm -> inbox_end = vm -> inbox + 1024;
39− vm -> inbox_ptr = vm -> inbox;
40− vm -> inbox_write = vm -> inbox;
41−
42− pthread_mutex_init(&(vm -> inbox_lock), NULL);
43− pthread_mutex_init(&(vm -> inbox_block), NULL);
44− pthread_cond_init(&(vm -> inbox_waiting), NULL);
18+ vm->valstack = valstack;
19+ vm->valstack_top = valstack;
20+ vm->valstack_base = valstack;
21+ vm->intstack = intstack;
22+ vm->intstack_ptr = intstack;
23+ vm->floatstack = floatstack;
24+ vm->floatstack_ptr = floatstack;
25+ vm->stack_max = valstack + stack_size;
26+ vm->heap = malloc(heap_size);
27+ vm->oldheap = NULL;
28+ vm->heap_next = vm->heap;
29+ vm->heap_end = vm->heap + heap_size;
30+ vm->heap_size = heap_size;
31+ vm->collections = 0;
32+ vm->allocations = 0;
33+ vm->heap_growth = heap_size;
34+ vm->ret = NULL;
35+ vm->reg1 = NULL;
36+
37+ vm->inbox = malloc(1024*sizeof(VAL));
38+ vm->inbox_end = vm->inbox + 1024;
39+ vm->inbox_ptr = vm->inbox;
40+ vm->inbox_write = vm->inbox;
41+
42+ pthread_mutex_init(&(vm->inbox_lock), NULL);
43+ pthread_mutex_init(&(vm->inbox_block), NULL);
44+ pthread_cond_init(&(vm->inbox_waiting), NULL);
45+
46+ int i;
47+
48+ // Assumption: there's enough space for this in the initial heap.
49+ vm->argv = malloc(argc*sizeof(VAL));
50+ vm->argc = argc;
51+
52+ for(i = 0; i < argc; ++i) {
53+ vm->argv[i] = MKSTR(vm, argv[i]);
54+ }
4555
4656 return vm;
4757}
@@ -52,6 +62,7 @@ void terminate(VM* vm) {
5262 free(vm->intstack);
5363 free(vm->floatstack);
5464 free(vm->heap);
65+ free(vm->argv);
5566 if (vm->oldheap != NULL) { free(vm->oldheap); }
5667 pthread_mutex_destroy(&(vm -> inbox_lock));
5768 pthread_mutex_destroy(&(vm -> inbox_block));
@@ -349,13 +360,14 @@ void* runThread(void* arg) {
349360 td->fn(vm, NULL);
350361
351362 free(td);
363+ return NULL;
352364}
353365
354366void* 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);
356368 pthread_t t;
357369 pthread_attr_t attr;
358− size_t stacksize;
370+// size_t stacksize;
359371
360372 pthread_attr_init(&attr);
361373// pthread_attr_getstacksize (&attr, &stacksize);
@@ -405,9 +417,8 @@ VAL copyTo(VM* vm, VAL x) {
405417 case PTR:
406418 cl = MKPTR(vm, x->info.ptr);
407419 break;
408− case FWD:
420+ default:
409421 assert(0); // We're in trouble if this happens...
410− return x->info.ptr;
411422 }
412423 return cl;
413424}
@@ -465,6 +476,14 @@ VAL recvMessage(VM* vm) {
465476 return msg;
466477}
467478
479+int idris_numArgs(VM* vm) {
480+ return vm->argc;
481+}
482+
483+VAL idris_getArg(VM* vm, int i) {
484+ return vm->argv[i];
485+}
486+
468487void stackOverflow() {
469488 fprintf(stderr, "Stack overflow");
470489 exit(-1);