theSq3Lite 10.0
Loading...
Searching...
No Matches
Sq3Call_rb.c
Go to the documentation of this file.
1
9/* LABEL-NO */
10
11#define META_FILE_NAME "Sq3Call_rb.c"
12
14//#include "tmpl/lc_type_S_lng.h"
15//#include "misc_check_rb.h"
16
17/* LABEL-END */
18
19mk_inline VALUE NS(sRescue) (
21 MK_MNG const mng,
22 VALUE(*proc)(ANYARGS),
23 VALUE data
24) {
25 VALUE ret;
26 int state;
27 ret = rb_protect(proc, data, &state);
28 if (state) {
30 }
31 return ret;
32}
33
34// ==========================================================================
35
36// method callback without self
37MK_UNUSED static VALUE NS(sCallMethod) (VALUE array) {
38 const VALUE *valP = rb_array_const_ptr(array);
39 return rb_method_call((int)RARRAY_LEN(array)-1, &valP[1], valP[0]);
40}
41
42// ==========================================================================
43
44/*
45[LiteExecCall signature]
46 callback-args := vals:List[in] , cols:List[in]
47 [static] def callback ( callback-args )
48 [instance] class YYY:
49 def callback ( self, callback-args )
50 [class] class ZZZ:
51 @staticmethod
52 def callback ( callback-args )
53[LiteExecCall signature]
54*/
55
56// #define Sq3Fupu_Sq3LiteExec_callback_call_args MK_CBP callV1, MK_I32 num, MK_STR *vals, MK_STR *cols
57
59{
61
62 // ?? if (_Py_IsFinalizing()) return 1;
63
64 struct MkCallS *call = callV1;
65 MkRtSetup_RT(call->mkrt);
66
67 int argNum = 2;
68
69 // 1. check environment
70 if (OT_LNG_NULL_IS(call->procCallback)) return 1;
71
72//printLngObj(call->procCallback)
73
74MkDbgDeepX_3(call->hdl, "AAA", "cmd=%s", VAL2STRN(rb_inspect(call->procCallback)));
75
76 // 2. if not already done initialize
77 if (call->procCall == NULL) {
78 switch (call->procType) {
79 case MkCallS_own_method: {
80 if (call->procArity != argNum) goto methode_arg_error;
81 call->procCall = NS(sCallMethod);
82 }
83 break;
84 default:
85 MkErrorSetV_3M(call->hdl, "WrongInitError", "found invalid procType for callback '%s'", VAL2STRN(call->procCallback));
86 goto error;
87 break;
88 }
89 }
90
91 OT_OBJ_T valsO = rb_ary_new2(num);
92 OT_OBJ_T colsO = rb_ary_new2(num);
93 for (long i=0; i<num; i++) {
94 rb_ary_store(valsO,i,STRN2VAL(vals[i]));
95 }
96 for (long i=0; i<num; i++) {
97 rb_ary_store(colsO,i,STRN2VAL(cols[i]));
98 }
99
100 VALUE ary = rb_ary_resize(call->procArgs,3);
101 rb_ary_store(ary,0,call->procCallback);
102 rb_ary_store(ary,1,valsO);
103 rb_ary_store(ary,2,colsO);
104 NS(sRescue)(MK_RT_CALL call->hdl,call->procCall,ary);
105
106 MkErrorCheck_0E();
107
108MkDbgDeepX_3(mqctx, "BBB", "cmd=%s", VAL2STRN(rb_inspect(call->procCallback)));
109 return 0;
110
111methode_arg_error:
112 MkErrorSetV_3M(call->hdl, "WrongNumberOfArgError", "for callback '%s' exactly '%d' argument is required, but '%d' was received",
113 VAL2STRN(call->procCallback), argNum, call->procArity);
114 goto error;
115
116error:
117MkDbgDeepX_3(call->hdl, "EEE", "cmd=%s", VAL2STRN(rb_inspect(call->procCallback)));
119//printSTACK_1(mqctx)
120 return 1;
121}
122
123// ---------------------------------------------------------------------
124
125/*
126[LiteExecV2Call signature]
127 callback-args := vals:MkBufferList[in] , cols:MkBufferList[in]
128 [static] def callback ( callback-args )
129 [instance] class YYY:
130 def callback ( self, callback-args )
131 [class] class ZZZ:
132 @staticmethod
133 def callback ( callback-args )
134[LiteExecV2Call signature]
135*/
136
137// #define Sq3LiteExecV2CB_ret enum MkErrorE
138// #define Sq3LiteExecV2CB_args MK_RT_ARGS MK_CBP callback, MK_BFL vals, MK_BFL cols
139
141{
143
144 struct MkCallS *call = callV2;
145
146 int argNum = 2;
147
148 // 1. check environment
149 if (OT_LNG_NULL_IS(call->procCallback)) return MK_ERROR;
150
151//printLngObj(call->procCallback)
152
153MkDbgDeepX_3(call->hdl, "AAA", "cmd=%s", VAL2STRN(rb_inspect(call->procCallback)));
154
155 // 2. if not already done initialize
156 if (call->procCall == NULL) {
157 switch (call->procType) {
158 case MkCallS_own_method: {
159 if (call->procArity != argNum) goto methode_arg_error;
160 call->procCall = NS(sCallMethod);
161 }
162 break;
163 default:
164 MkErrorSetV_3M(call->hdl, "WrongInitError", "found invalid procType for callback '%s'", VAL2STRN(call->procCallback));
165 goto error;
166 break;
167 }
168 }
169
170 OT_OBJ_T valsO = OT_TMP_BFL_OBJ(vals);
171 OT_OBJ_T colsO = OT_TMP_BFL_OBJ(cols);
172
173 VALUE ary = rb_ary_resize(call->procArgs,3);
174 rb_ary_store(ary,0,call->procCallback);
175 rb_ary_store(ary,1,valsO);
176 rb_ary_store(ary,2,colsO);
177 NS(sRescue)(MK_RT_CALL call->hdl,call->procCall,ary);
178
179 MkErrorCheck_0E();
180
181MkDbgDeepX_3(mqctx, "BBB", "cmd=%s", VAL2STRN(rb_inspect(call->procCallback)));
182 return MkErrorGetCode_0E();
183
184methode_arg_error:
185 MkErrorSetV_3M(call->hdl, "WrongNumberOfArgError", "for callback '%s' exactly '%d' argument is required, but '%d' was received",
186 VAL2STRN(call->procCallback), argNum, call->procArity);
187 goto error;
188
189error:
190MkDbgDeepX_3(call->hdl, "EEE", "cmd=%s", VAL2STRN(rb_inspect(call->procCallback)));
191 return MkErrorStack_0E();
192}
193
#define OT_OBJ_T
#define OT_LNG_NULL_IS(obj)
#define VAL2STRN(val)
#define OT_ERROR_LNG_2_META(m)
#define OT_TMP_BFL_OBJ(val)
#define STRN2VAL(nat)
tag: nhi1-release-250425
#define NS(n)
#define MkErrorGetCode_0E()
#define MkErrorStack_0E()
#define MkErrorSetV_3M(err, callfunc, printfmt,...)
#define mk_inline
#define MK_UNUSED
MK_ERROR
MK_PTRB * MK_MNG
#define MkDbgDeepX_3(m, ident, fmt,...)
#define MK_RT_CALL
#define MK_RT_ARGS
#define MkRtSetup_RT(r)
#define Sq3Fupu_Sq3LiteExecV2CB_callback_call_check
#define Sq3LiteExecV2CB_ret
#define Sq3Fupu_Sq3LiteExec_callback_call_check
#define Sq3Fupu_Sq3LiteExec_callback_call_args
#define Sq3Fupu_Sq3LiteExec_callback_call_ret
#define Sq3LiteExecV2CB_args
VALUE procCallback
VALUE procArgs
MK_I32 procArity
enum MkCallS::@0 procType
rbmkkernel_procCallF procCall