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