on master help sign in
Merge pull request #615 from Ralith/args-cleanup

Argument access cleanup

commit2738ae122616c2e37d52687005ce0991931aab57 authorEdwin Brady <edwin.brady@gmail.com> dateThu 14 Nov 2013, 12:04 (13 years ago) parente4d9c85fb9339d
7 files changed+45−27
lib/System.idr+2−2 llvm/defs.c+11 rts/idris_main.c+5−2 rts/idris_rts.c+12−13 rts/idris_rts.h+8−9 src/IRTS/CodegenLLVM.hs+6 test/reg004/run+1−1
lib/System.idr+2−2
@@ -10,10 +10,10 @@ getArgs = do n <- numArgs
1010 ga' [] 0 n
1111 where
1212 numArgs : IO Int
13− numArgs = mkForeign (FFun "idris_numArgs" [FPtr] FInt) prim__vm
13+ numArgs = mkForeign (FFun "idris_numArgs" [] FInt)
1414
1515 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
1717
1818 ga' : List String -> Int -> Int -> IO (List String)
1919 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) {
169169 }
170170 return t;
171171}
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 = {
1010
1111int main(int argc, char* argv[]) {
1212 parse_shift_args(&opts, &argc, &argv);
13−
14− VM* vm = init_vm(opts.max_stack_size, opts.init_heap_size, 1, argc, argv);
13+
14+ __idris_argc = argc;
15+ __idris_argv = argv;
16+
17+ VM* vm = init_vm(opts.max_stack_size, opts.init_heap_size, 1);
1518 _idris__123_runMain0_125_(vm, NULL);
1619
1720#ifdef IDRIS_DEBUG
rts/idris_rts.c+12−13
@@ -12,8 +12,8 @@
1212
1313
1414VM* init_vm(int stack_size, size_t heap_size,
15− int max_threads, // not implemented yet
16− int argc, char* argv[]) {
15+ int max_threads // not implemented yet
16+ ) {
1717
1818 VM* vm = malloc(sizeof(VM));
1919 STATS_INIT_STATS(vm->stats)
@@ -45,9 +45,6 @@ VM* init_vm(int stack_size, size_t heap_size,
4545 vm->max_threads = max_threads;
4646 vm->processes = 0;
4747
48− vm->argv = argv;
49− vm->argc = argc;
50−
5148 STATS_LEAVE_INIT(vm->stats)
5249 return vm;
5350}
@@ -145,7 +142,7 @@ VAL MKFLOAT(VM* vm, double val) {
145142 return cl;
146143}
147144
148−VAL MKSTR(VM* vm, char* str) {
145+VAL MKSTR(VM* vm, const char* str) {
149146 int len;
150147 if (str == NULL) {
151148 len = 0;
@@ -164,7 +161,7 @@ VAL MKSTR(VM* vm, char* str) {
164161 return cl;
165162}
166163
167−VAL MKPTR(VM* vm, void* ptr) {
164+VAL MKPTR(VM* vm, const void* ptr) {
168165 Closure* cl = allocate(vm, sizeof(Closure), 0);
169166 SETTY(cl, PTR);
170167 cl -> info.ptr = ptr;
@@ -462,8 +459,7 @@ void* runThread(void* arg) {
462459
463460void* vmThread(VM* callvm, func f, VAL arg) {
464461 VM* vm = init_vm(callvm->stack_max - callvm->valstack, callvm->heap.size,
465− callvm->max_threads,
466− 0, NULL);
462+ callvm->max_threads);
467463 vm->processes=1; // since it can send and receive messages
468464 pthread_t t;
469465 pthread_attr_t attr;
@@ -626,12 +622,15 @@ VAL idris_recvMessage(VM* vm) {
626622 return msg;
627623}
628624
629−int idris_numArgs(VM* vm) {
630− return vm->argc;
625+int __idris_argc;
626+char **__idris_argv;
627+
628+int idris_numArgs() {
629+ return __idris_argc;
631630}
632631
633−VAL idris_getArg(VM* vm, int i) {
634− return MKSTR(vm, vm->argv[i]);
632+const char* idris_getArg(int i) {
633+ return __idris_argv[i];
635634}
636635
637636void stackOverflow() {
rts/idris_rts.h+8−9
@@ -66,17 +66,13 @@ typedef struct {
6666
6767 Stats stats;
6868
69− int argc;
70− char** argv; // command line arguments
71−
7269 VAL ret;
7370 VAL reg1;
7471} VM;
7572
7673// Create a new VM
7774VM* init_vm(int stack_size, size_t heap_size,
78− int max_threads,
79− int argc, char* argv[]);
75+ int max_threads);
8076// Clean up a VM once it's no longer needed
8177Stats terminate(VM* vm);
8278
@@ -146,8 +142,8 @@ typedef intptr_t i_int;
146142
147143// Creating new values (each value placed at the top of the stack)
148144VAL MKFLOAT(VM* vm, double val);
149−VAL MKSTR(VM* vm, char* str);
150−VAL MKPTR(VM* vm, void* ptr);
145+VAL MKSTR(VM* vm, const char* str);
146+VAL MKPTR(VM* vm, const void* ptr);
151147VAL MKB8(VM* vm, uint8_t b);
152148VAL MKB16(VM* vm, uint16_t b);
153149VAL MKB32(VM* vm, uint32_t b);
@@ -229,8 +225,11 @@ VAL idris_strRev(VM* vm, VAL str);
229225
230226// Command line args
231227
232−int idris_numArgs(VM* vm);
233−VAL idris_getArg(VM* vm, int i);
228+extern int __idris_argc;
229+extern char **__idris_argv;
230+
231+int idris_numArgs();
232+const char *idris_getArg(int i);
234233
235234// Handle stack overflow.
236235// Just reports an error and exits.
src/IRTS/CodegenLLVM.hs+6
@@ -124,6 +124,10 @@ mainDef =
124124 , ConstantOperand . C.GlobalReference . Name $ "__idris_gmpRealloc"
125125 , ConstantOperand . C.GlobalReference . Name $ "__idris_gmpFree"
126126 ]
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 []
127131 , UnName 1 := idrCall "{runMain0}" [] ]
128132 (Do $ Ret (Just (ConstantOperand (C.Int 32 0))) [])
129133 ]}
@@ -198,6 +202,8 @@ initDefs tgt =
198202 , exVar (stdinName tgt) ptrI8
199203 , exVar (stdoutName tgt) ptrI8
200204 , exVar (stderrName tgt) ptrI8
205+ , exVar "__idris_argc" (IntegerType 32)
206+ , exVar "__idris_argv" (PointerType ptrI8 (AddrSpace 0))
201207 , GlobalDefinition mainDef
202208 ] ++ map mpzBinFun ["add", "sub", "mul", "fdiv_q", "fdiv_r", "and", "ior", "xor"]
203209 where
test/reg004/run+1−1
@@ -1,4 +1,4 @@
11#!/bin/bash
2−idris reg004.idr -o reg004
2+idris $@ reg004.idr -o reg004
33./reg004
44rm -f reg004 *.ibc