Mercurial > repos > rhope
comparison runtime/func.h @ 59:4f1ae6eb71d8
Use replicated switch statement for returns and late-bound calls
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 08 Oct 2009 22:54:30 -0400 |
parents | 4c22fe798779 |
children | fa24ef3b026f |
comparison
equal
deleted
inserted
replaced
58:4c22fe798779 | 59:4f1ae6eb71d8 |
---|---|
15 | 15 |
16 #define MethodName(name,type) f_ ## name ## _AT_ ## type | 16 #define MethodName(name,type) f_ ## name ## _AT_ ## type |
17 | 17 |
18 | 18 |
19 #define Func(name,numparams) \ | 19 #define Func(name,numparams) \ |
20 case FUNC_ ## name:\ | 20 f_ ## name:\ |
21 for(idx = numparams; idx < cdata->num_params; ++idx)\ | 21 for(idx = numparams; idx < cdata->num_params; ++idx)\ |
22 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\ | 22 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\ |
23 f_ ## name:\ | 23 sf_ ## name:\ |
24 lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name)); | 24 lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name)); |
25 | 25 |
26 | 26 |
27 #define FuncNoLocals(name,numparams) \ | 27 #define FuncNoLocals(name,numparams) \ |
28 case FUNC_ ## name:\ | 28 f_ ## name:\ |
29 for(idx = numparams; idx < cdata->num_params; ++idx)\ | 29 for(idx = numparams; idx < cdata->num_params; ++idx)\ |
30 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\ | 30 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\ |
31 f_ ## name: | 31 sf_ ## name: |
32 | 32 |
33 #define EndFunc(name) \ | 33 #define EndFunc(name) \ |
34 free_stack(ct, lv_ ## name);\ | 34 free_stack(ct, lv_ ## name);\ |
35 func = cdata->func;\ | 35 func = cdata->func; |
36 goto _dispatch;\ | |
37 | 36 |
38 #define EndFuncNoLocals \ | 37 #define EndFuncNoLocals \ |
39 func = cdata->func;\ | 38 func = cdata->func; |
40 resume = cdata->resume;\ | |
41 goto _dispatch;\ | |
42 | 39 |
43 #define Method(name) \ | 40 #define Method(name) \ |
44 case FUNC_ ## name:\ | |
45 f_ ## name:\ | 41 f_ ## name:\ |
42 sf_ ## name:\ | |
46 switch(get_blueprint(cdata->params[0])->type_id)\ | 43 switch(get_blueprint(cdata->params[0])->type_id)\ |
47 { | 44 { |
48 | 45 |
49 #define EndMethod \ | 46 #define EndMethod \ |
50 default:\ | 47 default:\ |
55 #define MethodDispatch(type_id,name,type_name) \ | 52 #define MethodDispatch(type_id,name,type_name) \ |
56 case type_id:\ | 53 case type_id:\ |
57 goto m_ ## name ## _AT_ ## type_name; | 54 goto m_ ## name ## _AT_ ## type_name; |
58 | 55 |
59 #define MethodImpl(name,type_name,mytype_id,numparams) \ | 56 #define MethodImpl(name,type_name,mytype_id,numparams) \ |
60 case FUNC_ ## name ## _AT_ ## type_name:\ | |
61 f_ ## name ## _AT_ ## type_name:\ | 57 f_ ## name ## _AT_ ## type_name:\ |
58 sf_ ## name ## _AT_ ## type_name:\ | |
62 if (cdata->num_params < 1)\ | 59 if (cdata->num_params < 1)\ |
63 goto _exception;\ | 60 goto _exception;\ |
64 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\ | 61 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\ |
65 {\ | 62 {\ |
66 puts("uh oh, need conversion and that's not implemented yet!");\ | 63 puts("uh oh, need conversion and that's not implemented yet!");\ |
71 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\ | 68 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)); | 69 lv_ ## name ## _AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## name ## _AT_ ## type_name)); |
73 | 70 |
74 | 71 |
75 #define MethodImplNoLocals(name,type_name,mytype_id,numparams) \ | 72 #define MethodImplNoLocals(name,type_name,mytype_id,numparams) \ |
76 case FUNC_ ## name ## _AT_ ## type_name:\ | |
77 f_ ## name ## _AT_ ## type_name:\ | 73 f_ ## name ## _AT_ ## type_name:\ |
74 sf_ ## name ## _AT_ ## type_name:\ | |
78 if (cdata->num_params < 1)\ | 75 if (cdata->num_params < 1)\ |
79 goto _exception;\ | 76 goto _exception;\ |
80 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\ | 77 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\ |
81 {\ | 78 {\ |
82 puts("uh oh, need conversion and that's not implemented yet!");\ | 79 puts("uh oh, need conversion and that's not implemented yet!");\ |
108 #define SetParam(num,value) cdata->params[0-num] = value; | 105 #define SetParam(num,value) cdata->params[0-num] = value; |
109 | 106 |
110 #define Call(tocall, numparams, resumeto, myname)\ | 107 #define Call(tocall, numparams, resumeto, myname)\ |
111 cdata->func = FUNC_ ## myname ## _ ## resumeto;\ | 108 cdata->func = FUNC_ ## myname ## _ ## resumeto;\ |
112 cdata->num_params = numparams;\ | 109 cdata->num_params = numparams;\ |
113 goto f_ ## tocall;\ | 110 goto sf_ ## tocall;\ |
114 case FUNC_ ## myname ## _ ## resumeto:\ | 111 r ## resumeto ## _ ## myname:\ |
115 lv_ ## myname = (lt_ ## myname *)(cdata->lastframe+1); | 112 lv_ ## myname = (lt_ ## myname *)(cdata->lastframe+1); |
116 | 113 |
117 #define FreeCall\ | 114 #define FreeCall\ |
118 temp_cdata = cdata->lastframe;\ | 115 temp_cdata = cdata->lastframe;\ |
119 free_stack(ct, cdata);\ | 116 free_stack(ct, cdata);\ |