Mercurial > repos > rhope
comparison runtime/func.h @ 66:d4b44ae2e34a
New variant of C backend works now
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 06 Jun 2010 20:29:10 -0400 |
parents | 1db811fa4744 |
children | c40c3d399133 |
comparison
equal
deleted
inserted
replaced
65:1db811fa4744 | 66:d4b44ae2e34a |
---|---|
20 | 20 |
21 | 21 |
22 #define Func(name,numparams) \ | 22 #define Func(name,numparams) \ |
23 f_ ## name:\ | 23 f_ ## name:\ |
24 for(idx = numparams; idx < cdata->num_params; ++idx)\ | 24 for(idx = numparams; idx < cdata->num_params; ++idx)\ |
25 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\ | 25 release_ref(cdata->params[idx]); cdata->num_params = numparams;\ |
26 sf_ ## name:\ | 26 sf_ ## name:\ |
27 lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name)); | 27 lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));\ |
28 my_cdata = cdata; | |
28 | 29 |
29 | 30 |
30 #define FuncNoLocals(name,numparams) \ | 31 #define FuncNoLocals(name,numparams) \ |
31 f_ ## name:\ | 32 f_ ## name:\ |
32 for(idx = numparams; idx < cdata->num_params; ++idx)\ | 33 for(idx = numparams; idx < cdata->num_params; ++idx)\ |
33 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\ | 34 release_ref(cdata->params[idx]); cdata->num_params = numparams;\ |
34 sf_ ## name: | 35 sf_ ## name:\ |
36 my_cdata = cdata; | |
35 | 37 |
36 #define EndFunc(name) \ | 38 #define EndFunc(name) \ |
37 free_stack(ct, lv_ ## name);\ | 39 free_stack(ct, lv_ ## name);\ |
38 func = cdata->func; | 40 func = cdata->func; |
39 | 41 |
44 f_ ## name:\ | 46 f_ ## name:\ |
45 sf_ ## name:\ | 47 sf_ ## name:\ |
46 switch(get_blueprint(cdata->params[0])->type_id)\ | 48 switch(get_blueprint(cdata->params[0])->type_id)\ |
47 { | 49 { |
48 | 50 |
49 #define EndMethod \ | 51 #define EndMethod(name) \ |
50 default:\ | 52 default:\ |
53 printf("Type %d does not implement method %s\n", get_blueprint(cdata->params[0])->type_id, #name);\ | |
54 cdata = alloc_cdata(ct, cdata, 0);\ | |
55 cdata->func = FUNC_ ## name;\ | |
51 goto _exception;\ | 56 goto _exception;\ |
52 } | 57 } |
53 | 58 |
54 | 59 |
55 #define MethodDispatch(type_id,name,type_name) \ | 60 #define MethodDispatch(type_id,name,type_name) \ |
58 | 63 |
59 #define MethodImpl(name,type_name,mytype_id,numparams) \ | 64 #define MethodImpl(name,type_name,mytype_id,numparams) \ |
60 f_ ## name ## AT_ ## type_name:\ | 65 f_ ## name ## AT_ ## type_name:\ |
61 sf_ ## name ## AT_ ## type_name:\ | 66 sf_ ## name ## AT_ ## type_name:\ |
62 if (cdata->num_params < 1)\ | 67 if (cdata->num_params < 1)\ |
68 {\ | |
69 cdata = alloc_cdata(ct, cdata, 0);\ | |
70 cdata->func = FUNC_ ## name ## AT_ ## type_name;\ | |
71 goto _exception;\ | |
72 }\ | |
73 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\ | |
74 {\ | |
75 puts("uh oh, need conversion and that's not implemented yet!");\ | |
76 exit(1);\ | |
77 }\ | |
78 m_ ## name ## AT_ ## type_name:\ | |
79 for(idx = numparams; idx < cdata->num_params; ++idx)\ | |
80 release_ref(cdata->params[idx]); cdata->num_params = numparams;\ | |
81 lv_ ## name ## AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## name ## AT_ ## type_name));\ | |
82 my_cdata = cdata; | |
83 | |
84 | |
85 #define MethodImplNoLocals(name,type_name,mytype_id,numparams) \ | |
86 f_ ## name ## AT_ ## type_name:\ | |
87 sf_ ## name ## AT_ ## type_name:\ | |
88 if (cdata->num_params < 1)\ | |
89 cdata = alloc_cdata(ct, cdata, 0);\ | |
90 cdata->func = FUNC_ ## name ## AT_ ## type_name;\ | |
63 goto _exception;\ | 91 goto _exception;\ |
64 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\ | 92 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\ |
65 {\ | 93 {\ |
66 puts("uh oh, need conversion and that's not implemented yet!");\ | 94 puts("uh oh, need conversion and that's not implemented yet!");\ |
67 exit(1);\ | 95 exit(1);\ |
68 }\ | 96 }\ |
69 m_ ## name ## AT_ ## type_name:\ | 97 m_ ## name ## AT_ ## type_name:\ |
70 for(idx = numparams; idx < cdata->num_params; ++idx)\ | 98 for(idx = numparams; idx < cdata->num_params; ++idx)\ |
71 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\ | 99 release_ref(cdata->params[idx]); cdata->num_params = numparams;\ |
72 lv_ ## name ## AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## name ## AT_ ## type_name)); | 100 my_cdata = cdata; |
73 | |
74 | |
75 #define MethodImplNoLocals(name,type_name,mytype_id,numparams) \ | |
76 f_ ## name ## AT_ ## type_name:\ | |
77 sf_ ## name ## AT_ ## type_name:\ | |
78 if (cdata->num_params < 1)\ | |
79 goto _exception;\ | |
80 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\ | |
81 {\ | |
82 puts("uh oh, need conversion and that's not implemented yet!");\ | |
83 exit(1);\ | |
84 }\ | |
85 m_ ## name ## AT_ ## type_name:\ | |
86 for(idx = numparams; idx < cdata->num_params; ++idx)\ | |
87 release_ref(cdata->params[0-idx]); cdata->num_params = numparams; | |
88 | 101 |
89 #define NumParams | 102 #define NumParams |
90 #define CallSpace | 103 #define CallSpace |
91 | 104 |
92 #define Param(num,convtypeid) \ | 105 #define Param(num,convtypeid) \ |
93 if(get_blueprint(cdata->params[0-num])->type_id != convtypeid)\ | 106 if(get_blueprint(cdata->params[num])->type_id != convtypeid)\ |
94 {\ | 107 {\ |
95 puts("uh oh, need conversion and that's not implemented yet!");\ | 108 puts("uh oh, need conversion and that's not implemented yet!");\ |
96 exit(1);\ | 109 exit(1);\ |
97 } | 110 } |
98 | 111 |
99 #define CopiedParam(num,convtypeid) Param(num,convtypeid) cdata->params[num] = copy_object(cdata->params[num]); | 112 #define CopiedParam(num,convtypeid) Param(num,convtypeid) cdata->params[num] = copy_object(cdata->params[num]); |
100 #define Ret(num,val) cdata->params[0-num] = (object *)(val); | 113 #define Ret(num,val) cdata->params[num] = (object *)(val); |
114 #define NumRet(num) cdata->num_params = num; | |
101 #define Exception | 115 #define Exception |
102 #define FuncDef(name) lt_ ## name * lv_ ## name; | 116 #define FuncDef(name) lt_ ## name * lv_ ## name; |
103 #define MethodDef(name) lt_ ## name ## AT_ ## type_name * lv_ ## name ## AT_ ## type_name; | 117 #define MethodDef(name) lt_ ## name ## AT_ ## type_name * lv_ ## name ## AT_ ## type_name; |
104 | 118 |
105 | 119 |
106 #define PrepCall(callspace) cdata = alloc_cdata(ct, cdata, callspace); | 120 #define PrepCall(callspace) cdata = alloc_cdata(ct, cdata, callspace); |
107 | 121 |
108 #define SetParam(num,value) cdata->params[0-num] = value; | 122 #define SetParam(num,value) cdata->params[num] = value; |
109 | 123 |
110 #define Call(tocall, numparams, resumeto, myname)\ | 124 #define Call(tocall, numparams, resumeto, myname)\ |
111 cdata->func = FUNC_ ## myname ## _ ## resumeto;\ | 125 cdata->func = RES_ ## resumeto ## _ ## myname;\ |
112 cdata->num_params = numparams;\ | 126 cdata->num_params = numparams;\ |
113 goto sf_ ## tocall;\ | 127 goto sf_ ## tocall;\ |
114 r ## resumeto ## _ ## myname:\ | 128 r ## resumeto ## _ ## myname:\ |
115 lv_ ## myname = (lt_ ## myname *)(cdata->lastframe+1); | 129 my_cdata = cdata->lastframe;\ |
130 lv_ ## myname = (lt_ ## myname *)(my_cdata->params+my_cdata->callspace); | |
131 | |
116 | 132 |
117 #define FreeCall\ | 133 #define FreeCall\ |
118 temp_cdata = cdata->lastframe;\ | 134 temp_cdata = cdata->lastframe;\ |
119 free_stack(ct, cdata);\ | 135 free_stack(ct, cdata);\ |
120 cdata = temp_cdata; | 136 cdata = temp_cdata; |