Mercurial > repos > rhope
comparison runtime/func.h @ 65:1db811fa4744
Handle native Rhope functions and plain C functions separately as part of move to new C strategy
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 01 Jun 2010 01:13:54 -0400 |
parents | 04baa003de5a |
children | d4b44ae2e34a |
comparison
equal
deleted
inserted
replaced
64:e1fd6d244f14 | 65:1db811fa4744 |
---|---|
52 } | 52 } |
53 | 53 |
54 | 54 |
55 #define MethodDispatch(type_id,name,type_name) \ | 55 #define MethodDispatch(type_id,name,type_name) \ |
56 case type_id:\ | 56 case type_id:\ |
57 goto m_ ## name ## _AT_ ## type_name; | 57 goto m_ ## name ## AT_ ## type_name; |
58 | 58 |
59 #define MethodImpl(name,type_name,mytype_id,numparams) \ | 59 #define MethodImpl(name,type_name,mytype_id,numparams) \ |
60 f_ ## name ## _AT_ ## type_name:\ | 60 f_ ## name ## AT_ ## type_name:\ |
61 sf_ ## name ## _AT_ ## type_name:\ | 61 sf_ ## name ## AT_ ## type_name:\ |
62 if (cdata->num_params < 1)\ | 62 if (cdata->num_params < 1)\ |
63 goto _exception;\ | 63 goto _exception;\ |
64 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\ | 64 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\ |
65 {\ | 65 {\ |
66 puts("uh oh, need conversion and that's not implemented yet!");\ | 66 puts("uh oh, need conversion and that's not implemented yet!");\ |
67 exit(1);\ | 67 exit(1);\ |
68 }\ | 68 }\ |
69 m_ ## name ## _AT_ ## type_name:\ | 69 m_ ## name ## AT_ ## type_name:\ |
70 for(idx = numparams; idx < cdata->num_params; ++idx)\ | 70 for(idx = numparams; idx < cdata->num_params; ++idx)\ |
71 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\ | 71 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\ |
72 lv_ ## name ## _AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## name ## _AT_ ## type_name)); | 72 lv_ ## name ## AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## name ## AT_ ## type_name)); |
73 | 73 |
74 | 74 |
75 #define MethodImplNoLocals(name,type_name,mytype_id,numparams) \ | 75 #define MethodImplNoLocals(name,type_name,mytype_id,numparams) \ |
76 f_ ## name ## _AT_ ## type_name:\ | 76 f_ ## name ## AT_ ## type_name:\ |
77 sf_ ## name ## _AT_ ## type_name:\ | 77 sf_ ## name ## AT_ ## type_name:\ |
78 if (cdata->num_params < 1)\ | 78 if (cdata->num_params < 1)\ |
79 goto _exception;\ | 79 goto _exception;\ |
80 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\ | 80 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\ |
81 {\ | 81 {\ |
82 puts("uh oh, need conversion and that's not implemented yet!");\ | 82 puts("uh oh, need conversion and that's not implemented yet!");\ |
83 exit(1);\ | 83 exit(1);\ |
84 }\ | 84 }\ |
85 m_ ## name ## _AT_ ## type_name:\ | 85 m_ ## name ## AT_ ## type_name:\ |
86 for(idx = numparams; idx < cdata->num_params; ++idx)\ | 86 for(idx = numparams; idx < cdata->num_params; ++idx)\ |
87 release_ref(cdata->params[0-idx]); cdata->num_params = numparams; | 87 release_ref(cdata->params[0-idx]); cdata->num_params = numparams; |
88 | 88 |
89 #define NumParams | 89 #define NumParams |
90 #define CallSpace | 90 #define CallSpace |
98 | 98 |
99 #define CopiedParam(num,convtypeid) Param(num,convtypeid) cdata->params[num] = copy_object(cdata->params[num]); | 99 #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); | 100 #define Ret(num,val) cdata->params[0-num] = (object *)(val); |
101 #define Exception | 101 #define Exception |
102 #define FuncDef(name) lt_ ## name * lv_ ## name; | 102 #define FuncDef(name) lt_ ## name * lv_ ## name; |
103 #define MethodDef(name) lt_ ## name ## _AT_ ## type_name * lv_ ## name ## _AT_ ## type_name; | 103 #define MethodDef(name) lt_ ## name ## AT_ ## type_name * lv_ ## name ## AT_ ## type_name; |
104 | 104 |
105 | 105 |
106 #define PrepCall(callspace) cdata = alloc_cdata(ct, cdata, callspace); | 106 #define PrepCall(callspace) cdata = alloc_cdata(ct, cdata, callspace); |
107 | 107 |
108 #define SetParam(num,value) cdata->params[0-num] = value; | 108 #define SetParam(num,value) cdata->params[0-num] = value; |
121 | 121 |
122 #define FreeCallMethod(myname,mytype)\ | 122 #define FreeCallMethod(myname,mytype)\ |
123 temp_cdata = cdata->lastframe;\ | 123 temp_cdata = cdata->lastframe;\ |
124 free_stack(ct, cdata);\ | 124 free_stack(ct, cdata);\ |
125 cdata = temp_cdata;\ | 125 cdata = temp_cdata;\ |
126 lv_ ## myname ## _AT_ ## type_name = (lt_ ## myname ## _AT_ ## type_name *)(cdata+1); | 126 lv_ ## myname ## AT_ ## type_name = (lt_ ## myname ## AT_ ## type_name *)(cdata+1); |
127 | 127 |
128 #define TPrepCall(callspace) \ | 128 #define TPrepCall(callspace) \ |
129 func = cdata->lastframe->func;\ | 129 func = cdata->lastframe->func;\ |
130 temp_cdata = cdata->lastframe->lastframe;\ | 130 temp_cdata = cdata->lastframe->lastframe;\ |
131 free_stack(ct, cdata->lastframe);\ | 131 free_stack(ct, cdata->lastframe);\ |