Mercurial > repos > rhope
comparison test/fib.c @ 12:31f8182f3433
Finished fib test and did some small work on the c backend
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 25 May 2009 23:34:36 -0400 |
parents | 3021dac0d8f5 |
children | b71bab34ec65 |
comparison
equal
deleted
inserted
replaced
11:3021dac0d8f5 | 12:31f8182f3433 |
---|---|
1 #include <stdio.h> | 1 #include <stdio.h> |
2 #include "builtin.h" | 2 #include "builtin.h" |
3 #include "object.h" | 3 #include "object.h" |
4 #include "integer.h" | |
5 #include "context.h" | 4 #include "context.h" |
6 #include "func.h" | 5 #include "func.h" |
6 #include "integer.h" | |
7 | 7 |
8 typedef struct | 8 typedef struct |
9 { | 9 { |
10 object * work1; | 10 object * work1; |
11 object * work2; | 11 object * work2; |
12 object * out; | |
12 } fib_t; | 13 } fib_t; |
13 | 14 |
14 object * const_1; | 15 object * const_1; |
15 object * const_2; | 16 object * const_2; |
16 | 17 |
17 Func(Fib, | 18 Func(Fib, |
18 NumParams 1, | 19 NumParams 1, |
19 CallSpace 2, | 20 CallSpace 2, |
20 fib_t); | 21 fib_t); |
21 | 22 |
22 MCall(METHOD_SUB, | 23 locals->out = NULL; |
24 | |
25 | |
26 call->params[0] = add_ref(cdata->params[0]); | |
27 call->params[1] = add_ref(const_2); | |
28 MCall(METHOD_LESS, 2) | |
29 | |
30 MCall(METHOD_IF, 1) | |
31 | |
32 if(call->params[0]) | |
33 locals->out = add_ref(const_1); | |
34 | |
35 if(call->params[1]) | |
36 { | |
37 call->params[0] = add_ref(cdata->params[0]); | |
38 call->params[1] = add_ref(const_1); | |
39 MCall(METHOD_SUB, 2) | |
40 locals->work1 = call->params[0]; | |
41 | |
42 call->params[0] = add_ref(cdata->params[0]); | |
43 call->params[1] = add_ref(const_2); | |
44 MCall(METHOD_SUB, 2) | |
45 locals->work2 = call->params[0]; | |
46 | |
47 call->params[0] = locals->work1; | |
48 Call(Fib, 1) | |
49 locals->work1 = call->params[0]; | |
50 | |
51 call->params[0] = locals->work2; | |
52 Call(Fib, 1) | |
53 locals->work2 = call->params[0]; | |
54 | |
55 if(!locals->out) | |
56 { | |
57 release_ref(cdata->params[0]); | |
58 cdata->params[0] = locals->work1; | |
59 cdata->params[1] = locals->work2; | |
60 TMCall(METHOD_ADD, 2) | |
61 } | |
62 } | |
63 release_ref(cdata->params[0]); | |
64 Ret(0, locals->out) | |
65 | |
23 EndFunc | 66 EndFunc |
24 | 67 |
25 FuncNoLocals(Main, | 68 FuncNoLocals(Main, |
26 NumParams 0, | 69 NumParams 1, |
27 CallSpace 2) | 70 CallSpace 2) |
28 | 71 |
29 call->params[0] = make_Int32(2); | 72 TCall(Fib, 1) |
30 call->params[1] = make_Int32(3); | |
31 call->num_params = 2; | |
32 call->resume = 0; | |
33 ret = call_method(METHOD_ADD, call); | |
34 while(ret == TAIL_RETURN) | |
35 ret = call->tail_func(call); | |
36 if(ret == EXCEPTION_RETURN) { | |
37 Ret(0,call->params[0]); | |
38 return ret; | |
39 } | |
40 call->params[1] = make_Int32(1); | |
41 call->resume = 0; | |
42 ret = call_method(METHOD_SUB, call); | |
43 while(ret == TAIL_RETURN) | |
44 ret = call->tail_func(call); | |
45 if(ret == EXCEPTION_RETURN) { | |
46 Ret(0,call->params[0]); | |
47 return ret; | |
48 } | |
49 Ret(0,call->params[0]) | |
50 EndFunc | 73 EndFunc |
51 | 74 |
75 #ifdef _WIN32 | |
76 #include "windows.h" | |
77 #endif | |
52 | 78 |
53 int main(int argc, char ** argv) | 79 int main(int argc, char ** argv) |
54 { | 80 { |
55 returntype ret; | 81 returntype ret; |
56 calldata *cdata; | 82 calldata *cdata; |
57 context * ct; | 83 context * ct; |
84 #ifdef _WIN32 | |
85 DWORD dur; | |
86 dur = timeGetTime(); | |
87 #endif | |
88 if(argc < 2) | |
89 { | |
90 puts("not enought arguments"); | |
91 return -1; | |
92 } | |
58 register_builtin_types(); | 93 register_builtin_types(); |
59 ct = new_context(); | 94 ct = new_context(); |
60 cdata = alloc_cdata(ct, 1); | 95 cdata = alloc_cdata(ct, 1); |
61 cdata->num_params = 0; | 96 cdata->num_params = 1; |
62 cdata->resume = 0; | 97 cdata->resume = 0; |
63 | 98 |
64 const_1 = make_Int32(1); | 99 const_1 = make_Int32(1); |
65 const_2 = make_Int32(2); | 100 const_2 = make_Int32(2); |
66 ret = _f_Main(cdata); | 101 cdata->params[0] = make_Int32(atoi(argv[1])); |
102 ret = f_Main(cdata); | |
67 while(ret == TAIL_RETURN) | 103 while(ret == TAIL_RETURN) |
68 ret = cdata->tail_func(cdata); | 104 ret = cdata->tail_func(cdata); |
69 if(ret == EXCEPTION_RETURN) { | 105 if(ret == EXCEPTION_RETURN) { |
70 puts("Exception!"); | 106 puts("Exception!"); |
71 return -1; | 107 return -1; |
72 } | 108 } |
73 printf("Result: %d\n", ((_t_Int32 *)cdata->params[0])->num); | 109 printf("Result: %d\n", ((t_Int32 *)cdata->params[0])->num); |
110 #ifdef _WIN32 | |
111 dur = timeGetTime()-dur; | |
112 printf("Took %d milliseconds\n", dur); | |
113 #endif | |
74 return 0; | 114 return 0; |
75 } | 115 } |
76 | 116 |