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