on master help sign in
Copy on demand cmd line args.
acf39f8Sam T
rts/idris_gc.c+1−3
@@ -101,9 +101,7 @@ void idris_gc(VM* vm) {
101 for(root = vm->inbox_ptr; root < vm->inbox_write; ++root) {
101 for(root = vm->inbox_ptr; root < vm->inbox_write; ++root) {
102 *root = copy(vm, *root);
102 *root = copy(vm, *root);
103 }
103 }
104− for(root = vm->argv; root < vm->argv + vm->argc; ++root) {
104+
105− *root = copy(vm, *root);
106− }
107 vm->ret = copy(vm, vm->ret);
105 vm->ret = copy(vm, vm->ret);
108 vm->reg1 = copy(vm, vm->reg1);
106 vm->reg1 = copy(vm, vm->reg1);
109
107
rts/idris_rts.c+2−10
@@ -45,15 +45,9 @@ VM* init_vm(int stack_size, size_t heap_size,
45 vm->max_threads = max_threads;
45 vm->max_threads = max_threads;
46 vm->processes = 0;
46 vm->processes = 0;
47
47
48− int i;
48+ vm->argv = argv;
49− // Assumption: there's enough space for this in the initial heap.
50− vm->argv = malloc(argc*sizeof(VAL));
51 vm->argc = argc;
49 vm->argc = argc;
52
50
53− for(i = 0; i < argc; ++i) {
54− vm->argv[i] = MKSTR(vm, argv[i]);
55− }
56−
57 STATS_LEAVE_INIT(vm->stats)
51 STATS_LEAVE_INIT(vm->stats)
58 return vm;
52 return vm;
59}
53}
@@ -65,7 +59,6 @@ Stats terminate(VM* vm) {
65 free(vm->inbox);
59 free(vm->inbox);
66 free(vm->valstack);
60 free(vm->valstack);
67 free_heap(&(vm->heap));
61 free_heap(&(vm->heap));
68− free(vm->argv);
69
62
70 pthread_mutex_destroy(&(vm -> inbox_lock));
63 pthread_mutex_destroy(&(vm -> inbox_lock));
71 pthread_mutex_destroy(&(vm -> inbox_block));
64 pthread_mutex_destroy(&(vm -> inbox_block));
@@ -584,11 +577,10 @@ int idris_numArgs(VM* vm) {
584}
577}
585
578
586VAL idris_getArg(VM* vm, int i) {
579VAL idris_getArg(VM* vm, int i) {
587− return vm->argv[i];
580+ return MKSTR(vm, vm->argv[i]);
588}
581}
589
582
590void stackOverflow() {
583void stackOverflow() {
591 fprintf(stderr, "Stack overflow");
584 fprintf(stderr, "Stack overflow");
592 exit(-1);
585 exit(-1);
593}
586}
594−
rts/idris_rts.h+1−1
@@ -67,7 +67,7 @@ typedef struct {
67 Stats stats;
67 Stats stats;
68
68
69 int argc;
69 int argc;
70− VAL* argv; // command line arguments
70+ char** argv; // command line arguments
71
71
72 VAL ret;
72 VAL ret;
73 VAL reg1;
73 VAL reg1;