on master help sign in
Merge pull request #615 from Ralith/args-cleanup
2738ae1Edwin Brady
lib/System.idr+2−2
@@ -10,10 +10,10 @@ getArgs = do n <- numArgs
10 ga' [] 0 n
10 ga' [] 0 n
11 where
11 where
12 numArgs : IO Int
12 numArgs : IO Int
13− numArgs = mkForeign (FFun "idris_numArgs" [FPtr] FInt) prim__vm
13+ numArgs = mkForeign (FFun "idris_numArgs" [] FInt)
14
14
15 getArg : Int -> IO String
15 getArg : Int -> IO String
16− getArg x = mkForeign (FFun "idris_getArg" [FPtr, FInt] (FAny String)) prim__vm x
16+ getArg x = mkForeign (FFun "idris_getArg" [FInt] FString) x
17
17
18 ga' : List String -> Int -> Int -> IO (List String)
18 ga' : List String -> Int -> Int -> IO (List String)
19 ga' acc i n = if (i == n) then (return $ reverse acc) else
19 ga' acc i n = if (i == n) then (return $ reverse acc) else
llvm/defs.c+11
@@ -169,3 +169,14 @@ char *__idris_strRev(const char *s) {
169 }
169 }
170 return t;
170 return t;
171}
171}
172+
173+int __idris_argc;
174+char **__idris_argv;
175+
176+int idris_numArgs() {
177+ return __idris_argc;
178+}
179+
180+const char* idris_getArg(int i) {
181+ return __idris_argv[i];
182+}
rts/idris_main.c+5−2
@@ -10,8 +10,11 @@ RTSOpts opts = {
10
10
11int main(int argc, char* argv[]) {
11int main(int argc, char* argv[]) {
12 parse_shift_args(&opts, &argc, &argv);
12 parse_shift_args(&opts, &argc, &argv);
13−
13+
14+ __idris_argc = argc;
15+ __idris_argv = argv;
16+
14− VM* vm = init_vm(opts.max_stack_size, opts.init_heap_size, 1, argc, argv);
17+ VM* vm = init_vm(opts.max_stack_size, opts.init_heap_size, 1);
15 _idris__123_runMain0_125_(vm, NULL);
18 _idris__123_runMain0_125_(vm, NULL);
16
19
17#ifdef IDRIS_DEBUG
20#ifdef IDRIS_DEBUG
rts/idris_rts.c+12−13
@@ -12,8 +12,8 @@
12
12
13
13
14VM* init_vm(int stack_size, size_t heap_size,
14VM* init_vm(int stack_size, size_t heap_size,
15− int max_threads, // not implemented yet
15+ int max_threads // not implemented yet
16− int argc, char* argv[]) {
16+ ) {
17
17
18 VM* vm = malloc(sizeof(VM));
18 VM* vm = malloc(sizeof(VM));
19 STATS_INIT_STATS(vm->stats)
19 STATS_INIT_STATS(vm->stats)
@@ -45,9 +45,6 @@ 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− vm->argv = argv;
49− vm->argc = argc;
50−
51 STATS_LEAVE_INIT(vm->stats)
48 STATS_LEAVE_INIT(vm->stats)
52 return vm;
49 return vm;
53}
50}
@@ -145,7 +142,7 @@ VAL MKFLOAT(VM* vm, double val) {
145 return cl;
142 return cl;
146}
143}
147
144
148−VAL MKSTR(VM* vm, char* str) {
145+VAL MKSTR(VM* vm, const char* str) {
149 int len;
146 int len;
150 if (str == NULL) {
147 if (str == NULL) {
151 len = 0;
148 len = 0;
@@ -164,7 +161,7 @@ VAL MKSTR(VM* vm, char* str) {
164 return cl;
161 return cl;
165}
162}
166
163
167−VAL MKPTR(VM* vm, void* ptr) {
164+VAL MKPTR(VM* vm, const void* ptr) {
168 Closure* cl = allocate(vm, sizeof(Closure), 0);
165 Closure* cl = allocate(vm, sizeof(Closure), 0);
169 SETTY(cl, PTR);
166 SETTY(cl, PTR);
170 cl -> info.ptr = ptr;
167 cl -> info.ptr = ptr;
@@ -462,8 +459,7 @@ void* runThread(void* arg) {
462
459
463void* vmThread(VM* callvm, func f, VAL arg) {
460void* vmThread(VM* callvm, func f, VAL arg) {
464 VM* vm = init_vm(callvm->stack_max - callvm->valstack, callvm->heap.size,
461 VM* vm = init_vm(callvm->stack_max - callvm->valstack, callvm->heap.size,
465− callvm->max_threads,
462+ callvm->max_threads);
466− 0, NULL);
467 vm->processes=1; // since it can send and receive messages
463 vm->processes=1; // since it can send and receive messages
468 pthread_t t;
464 pthread_t t;
469 pthread_attr_t attr;
465 pthread_attr_t attr;
@@ -626,12 +622,15 @@ VAL idris_recvMessage(VM* vm) {
626 return msg;
622 return msg;
627}
623}
628
624
625+int __idris_argc;
626+char **__idris_argv;
627+
629−int idris_numArgs(VM* vm) {
628+int idris_numArgs() {
630− return vm->argc;
629+ return __idris_argc;
631}
630}
632
631
633−VAL idris_getArg(VM* vm, int i) {
632+const char* idris_getArg(int i) {
634− return MKSTR(vm, vm->argv[i]);
633+ return __idris_argv[i];
635}
634}
636
635
637void stackOverflow() {
636void stackOverflow() {
rts/idris_rts.h+8−9
@@ -66,17 +66,13 @@ typedef struct {
66
66
67 Stats stats;
67 Stats stats;
68
68
69− int argc;
70− char** argv; // command line arguments
71−
72 VAL ret;
69 VAL ret;
73 VAL reg1;
70 VAL reg1;
74} VM;
71} VM;
75
72
76// Create a new VM
73// Create a new VM
77VM* init_vm(int stack_size, size_t heap_size,
74VM* init_vm(int stack_size, size_t heap_size,
78− int max_threads,
75+ int max_threads);
79− int argc, char* argv[]);
80// Clean up a VM once it's no longer needed
76// Clean up a VM once it's no longer needed
81Stats terminate(VM* vm);
77Stats terminate(VM* vm);
82
78
@@ -146,8 +142,8 @@ typedef intptr_t i_int;
146
142
147// Creating new values (each value placed at the top of the stack)
143// Creating new values (each value placed at the top of the stack)
148VAL MKFLOAT(VM* vm, double val);
144VAL MKFLOAT(VM* vm, double val);
149−VAL MKSTR(VM* vm, char* str);
145+VAL MKSTR(VM* vm, const char* str);
150−VAL MKPTR(VM* vm, void* ptr);
146+VAL MKPTR(VM* vm, const void* ptr);
151VAL MKB8(VM* vm, uint8_t b);
147VAL MKB8(VM* vm, uint8_t b);
152VAL MKB16(VM* vm, uint16_t b);
148VAL MKB16(VM* vm, uint16_t b);
153VAL MKB32(VM* vm, uint32_t b);
149VAL MKB32(VM* vm, uint32_t b);
@@ -229,8 +225,11 @@ VAL idris_strRev(VM* vm, VAL str);
229
225
230// Command line args
226// Command line args
231
227
228+extern int __idris_argc;
229+extern char **__idris_argv;
230+
232−int idris_numArgs(VM* vm);
231+int idris_numArgs();
233−VAL idris_getArg(VM* vm, int i);
232+const char *idris_getArg(int i);
234
233
235// Handle stack overflow.
234// Handle stack overflow.
236// Just reports an error and exits.
235// Just reports an error and exits.
src/IRTS/CodegenLLVM.hs+6
@@ -124,6 +124,10 @@ mainDef =
124 , ConstantOperand . C.GlobalReference . Name $ "__idris_gmpRealloc"
124 , ConstantOperand . C.GlobalReference . Name $ "__idris_gmpRealloc"
125 , ConstantOperand . C.GlobalReference . Name $ "__idris_gmpFree"
125 , ConstantOperand . C.GlobalReference . Name $ "__idris_gmpFree"
126 ]
126 ]
127+ , Do $ Store False (ConstantOperand . C.GlobalReference . Name $ "__idris_argc")
128+ (LocalReference (Name "argc")) Nothing 0 []
129+ , Do $ Store False (ConstantOperand . C.GlobalReference . Name $ "__idris_argv")
130+ (LocalReference (Name "argv")) Nothing 0 []
127 , UnName 1 := idrCall "{runMain0}" [] ]
131 , UnName 1 := idrCall "{runMain0}" [] ]
128 (Do $ Ret (Just (ConstantOperand (C.Int 32 0))) [])
132 (Do $ Ret (Just (ConstantOperand (C.Int 32 0))) [])
129 ]}
133 ]}
@@ -198,6 +202,8 @@ initDefs tgt =
198 , exVar (stdinName tgt) ptrI8
202 , exVar (stdinName tgt) ptrI8
199 , exVar (stdoutName tgt) ptrI8
203 , exVar (stdoutName tgt) ptrI8
200 , exVar (stderrName tgt) ptrI8
204 , exVar (stderrName tgt) ptrI8
205+ , exVar "__idris_argc" (IntegerType 32)
206+ , exVar "__idris_argv" (PointerType ptrI8 (AddrSpace 0))
201 , GlobalDefinition mainDef
207 , GlobalDefinition mainDef
202 ] ++ map mpzBinFun ["add", "sub", "mul", "fdiv_q", "fdiv_r", "and", "ior", "xor"]
208 ] ++ map mpzBinFun ["add", "sub", "mul", "fdiv_q", "fdiv_r", "and", "ior", "xor"]
203 where
209 where
test/reg004/run+1−1
@@ -1,4 +1,4 @@
1#!/bin/bash
1#!/bin/bash
2−idris reg004.idr -o reg004
2+idris $@ reg004.idr -o reg004
3./reg004
3./reg004
4rm -f reg004 *.ibc
4rm -f reg004 *.ibc