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);\