theConfig 10.0
Loading...
Searching...
No Matches
LibMkKernel_tcl.h
Go to the documentation of this file.
1
9#pragma once
10
11#include <tcl.h>
12#include <tclOO.h>
13
14#include "LibMkKernel_mk.h"
15
16#include "tmpl/mk_type_S_lng.h"
17
18#if !defined(META_FILE_NAME)
19 #define META_FILE_NAME (__builtin_strrchr(__FILE__, '/') ? __builtin_strrchr(__FILE__, '/') + 1 : __FILE__)
20#endif
21
22/*****************************************************************************/
23/* */
24/* Macro_API */
25/* */
26/*****************************************************************************/
27
28// BEGIN-HEADER - created by 'tcl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
29
30#undef HEADER
31#define HEADER
32
33// If the source of libmkkernel is direct used in an external library
34// (without dynamic linking) and this library should *not* export
35// the symbol's of libmkkernel then the flag META_IGNORE_EXTERN have
36// to be set
37#undef MK_TCL_EXTERN
38#if defined(META_IGNORE_EXTERN)
39# define MK_TCL_EXTERN
40#elif defined(PIC)
41 // does we build a DLL ?
42# if defined(DLL_EXPORT)
43 // does we build the libmkkernel library ?
44# if defined(MK_TCL_BUILD_DLL)
45# define MK_TCL_EXTERN __declspec(dllexport)
46# else
47# define MK_TCL_EXTERN __declspec(dllimport)
48# endif
49# else
50 // no DLL - architecture specific extern specifier
51# define MK_TCL_EXTERN __attribute__ ((visibility("default")))
52# endif
53#else
55# define MK_TCL_EXTERN
56#endif
57
58// external data lookup
59#undef MK_TCL_EXTERN_DATA
60#if defined(META_PRIVATE)
61# define MK_TCL_EXTERN_DATA extern
62#elif defined(META_IGNORE_EXTERN)
63# define MK_TCL_EXTERN_DATA extern
64#elif defined(PIC)
65 // does we build a DLL ?
66# if defined(DLL_EXPORT)
67 // does we build the libmkkernel library ?
68# if defined(MK_TCL_BUILD_DLL)
69# define MK_TCL_EXTERN_DATA __declspec(dllexport)
70# else
71# define MK_TCL_EXTERN_DATA __declspec(dllimport)
72# endif
73# else
74 // no DLL - architecture specific extern specifier
75# define MK_TCL_EXTERN_DATA __attribute__ ((visibility("default"))) extern
76# endif
77#else
78# define MK_TCL_EXTERN_DATA extern
79#endif
80
81#undef MK
82#define MK(n) tclmkkernel_ ## n
83#undef NS
84#define NS(n) tclmkkernel_ ## n
85
86// END-HEADER - created by 'tcl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
87
88#define META_CONTEXT_S hdl
89
90#define OT_ProcRet int
91
92#define TCL_ARGS OT_ENV_T interp, int objc, OT_OBJ_T const *objv
93#define TCL_ARGS_CALL interp, objc, objv
94
95#define OBJECT_ARGS ClientData clientData, OT_ENV_T interp, Tcl_ObjectContext objCtx, \
96 int objc, OT_OBJ_T const *objv
97#define OBJECT_ARGS_CALL hdl, interp, objCtx, objc, objv
98
99#define OBJCMD_ARGS ClientData clientData, OT_ENV_T interp, int objc, OT_OBJ_T const *objv
100#define OBJCMD_ARGS_CALL clientData, interp, objc, objv
101
102#define CONSTR_ARGS OBJECT_ARGS
103
104#define SKIP_ARGS TCL_ARGS, int __skip
105#define SKIP_ARGS_CALL TCL_ARGS_CALL, __skip
106
107#define OtClass_ARGS OBJECT_ARGS
108#define OtClass_ARGS_CALL OBJECT_ARGS_CALL
109
110// class args ******************************************************************************
111
112// BEGIN-Class-def - created by 'tcl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
113
114#define MkBufferListC_ARGS OBJECT_ARGS
115#define MkBufferListC_ARGS_CALL OBJECT_ARGS_CALL
116#define MkBufferC_ARGS OBJECT_ARGS
117#define MkBufferC_ARGS_CALL OBJECT_ARGS_CALL
118#define MkBufferStreamC_ARGS OBJECT_ARGS
119#define MkBufferStreamC_ARGS_CALL OBJECT_ARGS_CALL
120#define MkErrorC_ARGS OBJECT_ARGS
121#define MkErrorC_ARGS_CALL OBJECT_ARGS_CALL
122#define MkLogFileC_ARGS OBJECT_ARGS
123#define MkLogFileC_ARGS_CALL OBJECT_ARGS_CALL
124#define MkObjectC_ARGS OBJECT_ARGS
125#define MkObjectC_ARGS_CALL OBJECT_ARGS_CALL
126#define MkRuntimeC_ARGS OBJECT_ARGS
127#define MkRuntimeC_ARGS_CALL OBJECT_ARGS_CALL
128
129// END-Class-def - created by 'tcl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
130
131// setup ***********************************************************************************
132
133#define OT_SETUP_ARGS_ALL(d) \
134 OT_OBJ_T retObj=NULL; \
135 MK_UNUSED static const MK_STRN __doc=d; \
136 MK_UNUSED OT_OBJ_T frame=NULL; \
137
138#define OT_FRAME_CLEANUP if (frame != NULL) { Tcl_DecrRefCount(frame); frame = NULL; }
139
140#define OT_SETUP_VARARGS(min,max,d) \
141 OT_SETUP_ARGS_ALL(d); \
142 OT_CHECK_NUM_ARGS(min,max);
143
144#define OT_SETUP_CONSTRUCTOR_ARGS(...) OT_SETUP_VARARGS(__VA_ARGS__)
145
146#define OT_SETUP_ONEARG(d) \
147 OT_SETUP_ARGS_ALL(d); \
148 OT_CHECK_NUM_ARGS(1,1);
149
150#define OT_SETUP_NOARG(d) \
151 OT_SETUP_ARGS_ALL(d); \
152 OT_CHECK_NUM_ARGS(0,0);
153
154//#define OT_SETUP_self OT_OBJ_T self = Tcl_GetObjectName(interp,(OT_SELF_T)hdl->obj.self);
155#define OT_SETUP_obj MK_OBJ obj = OBJ;
156#define OT_SETUP_doc __attribute__((unused)) const MK_STRN __doc = __func__;
157
158#define SETUP_ARGS MK_RT_ARGS TCL_ARGS
159#define SETUP_ARGS_CALL MK_RT_CALL TCL_ARGS_CALL
160
161MK_TCL_EXTERN_DATA const Tcl_ObjectMetadataType MK(AtomMeta);
162
163#define OT_retObj_CONSTR(x) retObj = Tcl_GetObjectName(interp,MK(AtomInit)(MK_RT_CALL interp,selfO,MkOBJ(x)));
164#define OT_CONSTRUCTOR_POST(x)
165
166#define OT_retObj_SET(val) retObj = (val);
167#define OT_retObj_SET_None retObj = RG(noneObj);
168#define OT_retObj_SET_Error retObj = NULL; \
169 /*Tcl_AppendResult(interp,"\n -> found in: ", doc, NULL);*/
170#define OT_retObj_SET_List retObj = Tcl_NewListObj(0,NULL);
171#define OT_retObj_APPEND(var) OtErrorCheckLngGoto(Tcl_ListObjAppendElement(interp,retObj,var));
172#define OT_retObj_RETURN \
173 if (retObj != NULL) { \
174 Tcl_SetObjResult(interp,retObj); \
175 return TCL_OK; \
176 } else { \
177 return TCL_ERROR; \
178 }
179
180/*
181BUG FIX : 24 apr 2024 → the "nullObj does now become a REAL command…
182test : misc issues in RPC etc
183
184 #define OT_retObj_RETURN \
185 if (retObj != NULL) { \
186 if (retObj != RG(nullObj)) { \
187 Tcl_SetObjResult(interp,retObj); \
188 } else { \
189 Tcl_ResetResult(interp); \
190 } \
191 return TCL_OK; \
192 } else { \
193 return TCL_ERROR; \
194 }
195*/
196
197#define OT_retObj_SET_BOL(nat) retObj = BOL2VAL(nat);
198#define OT_retObj_SET_I8(nat) retObj = I82VAL(nat);
199#define OT_retObj_SET_I16(nat) retObj = I162VAL(nat);
200#define OT_retObj_SET_U16(nat) retObj = U162VAL(nat);
201#define OT_retObj_SET_I32(nat) retObj = INT2VAL(nat);
202#define OT_retObj_SET_I64(nat) retObj = I642VAL(nat);
203#define OT_retObj_SET_LLG(nat) retObj = LLG2VAL(nat);
204#define OT_retObj_SET_FLT(nat) retObj = FLT2VAL(nat);
205#define OT_retObj_SET_DBL(nat) retObj = DBL2VAL(nat);
206#define OT_retObj_SET_BIN(nat,len) retObj = BIN2VAL(nat,len);
207#define OT_retObj_SET_STR(nat) retObj = STRN2VAL(nat);
208#define OT_retObj_SET_STRN(nat) retObj = STRN2VAL(nat);
209#define OT_retObj_SET_LONG(nat) retObj = LONG2VAL(nat);
210#define OT_retObj_SET_HDL(nat) retObj = HDL2VAL(nat);
211
212// METHOD CALL **********************************************************************
213
214#if 0
215
216#define OT_MK_CALL_0_v1
217
218// calling an object TROUGH the Tcl_Eval api
219#define OT_MK_CALL_0(hdl,cls,meth,ret) \
220{
221 ret = MK(EvalObjvVR)(NULL,interp,0,MK(cls##_ObjNew)(interp,hdl),MK(cls##_##meth##_Obj),NULL);
222}
223
224#else
225
226// call an method direct.
227// !! ATTENTION !! the "selfO" is NULL -> do NOT use this call for any "internal" usage.
228#define OT_MK_CALL_0(hdl,cls,meth,ret) { \
229 OtErrorCheckLngGoto(MK(cls##_##meth)(hdl,interp, NULL, 0, NULL)); \
230 ret = Tcl_GetObjResult(interp); \
231}
232
233#endif
234
235// LNG ******************************************************************************
236
237typedef Tcl_Obj* OT_OBJ_T ;
239typedef Tcl_Class OT_CLS_T ;
240typedef Tcl_Interp* OT_ENV_T ;
241typedef Tcl_Namespace* OT_NS_T ;
242typedef Tcl_Object OT_SELF_T ;
243
244#define OT_LNG_NULL NULL
245#define OT_LNG_UNDEF NULL
246#define OT_LNG_RETURN(ret,cmd) \
247 OtErrorCheckLngGoto(cmd); \
248 ret = Tcl_GetObjResult(interp); \
249
250#define OT_LNG_FULLNAME_FROM_OBJECT(_obj) Tcl_GetString(Tcl_GetObjectName(interp,_obj))
251#define OT_LNG_NAME_FROM_OBJECT(_obj) Tcl_GetCommandName(interp,Tcl_GetObjectCommand(_obj))
252#define OT_LNG_NAME_FROM_CLASS(_cls) OT_LNG_NAME_FROM_OBJECT(Tcl_GetClassAsObject(_cls))
253#define OT_LNG_NAME_FROM_OBJ(_obj) OT_LNG_NAME_FROM_OBJECT(Tcl_GetObjectFromObj(interp,_obj))
254// silent assume a "OT_LNG_OBJECT_IS" or "OT_LNG_CLASS_IS" befor set "retP"
255#define OT_LNG_OBJ_CLASSNAME(obj) MK(ClassName)(OT_Prefix_CALL obj, false)
256#define OT_LNG_OBJ_CLASSNAME_SHORT(obj) MK(ClassName)(OT_Prefix_CALL obj, true)
257#define OT_OBJ_TYPE_STRING(obj) MK(ClassName)(OT_Prefix_CALL obj, false)
258
259// name of the declaring class of the method
260#define OT_LNG_NAME_CLASS_FROM_CONTEXT(ox) \
261 OT_LNG_NAME_FROM_CLASS(Tcl_MethodDeclarerClass(Tcl_ObjectContextMethod(ox)))
262
263#define OT_LNG_OBJV(__skip) objv[__skip]
264
265#define OT_OBJ_TO_CLASS(str) str
266#define OT_OBJ_TO_ENUM(str) #str
267
268#define OT_LNG_SET_VAR(var,val) \
269 if (Tcl_ObjSetVar2(interp, var, NULL, val, TCL_LEAVE_ERR_MSG) == NULL) goto error
270
271// REGISTRY *************************************************************************
272
273#define OT_REGISTRY_AS_TLS
274
275#define RG(_key) MK(reggv)[MK(_key)]
276#ifdef OT_REGISTRY_AS_TLS
278#else
279 MK_TCL_EXTERN_DATA OT_OBJ_T MK(reggv)[100];
280#endif
281
282#define regTclObj(str) MK_TCL_EXTERN_DATA int MK(str);
283#define regTclObj2(def,str) MK_TCL_EXTERN_DATA int MK(def);
284#include "MkRegistry_tcl.h"
285#undef regTclObj
286#undef regTclObj2
287
288#define RL(num) RL_data[num]
289#define RL_init(code) static MkThreadLocal OT_OBJ_T RL_data[10] = {0}; if (RL_data[0] == NULL) { code; }
290#define RL_NewC(num,str) { RL_data[num] = STRN2VAL(#str); Tcl_IncrRefCount(RL_data[num]); }
291#define RL_NewS(num,str) { RL_data[num] = STRN2VAL(str); Tcl_IncrRefCount(RL_data[num]); }
292#define RL_NewI(num,itg) { RL_data[num] = INT2VAL(itg); Tcl_IncrRefCount(RL_data[num]); }
293#define RL_O(num,obj) { RL_data[num] = obj; }
294#define RL_objv(num) (num),RL_data
295#define RL_Free(num) do {Tcl_DecrRefCount(RL_data[num]); RL_data[num]=NULL;} while (0);
296
297MK_TCL_EXTERN_DATA const Tcl_ObjType *MK(tcl_LONG);
298MK_TCL_EXTERN_DATA const Tcl_ObjType *MK(tcl_WIDE);
299MK_TCL_EXTERN_DATA const Tcl_ObjType *MK(tcl_DOUBLE);
300MK_TCL_EXTERN_DATA const Tcl_ObjType *MK(tcl_BOOLEAN);
301MK_TCL_EXTERN_DATA const Tcl_ObjType *MK(tcl_INDEX);
302
303// ERROR ******************************************************************************
304
305#define OT_ERROR_LNG_RETURN return TCL_ERROR
306
307#define OT_ERROR_TYPE(str) \
308 Tcl_SetObjResult(interp, Tcl_ObjPrintf("TYPE ERROR: %s", str));
309
310#define OT_ERROR_SOFT_CONSTRUCTOR(class) { \
311 Tcl_SetResult(interp, "InitSoftError: '" #class "' soft constructor return 'NULL' pointer", TCL_STATIC); \
312}
313
314#define OT_ERROR_CONSTRUCTOR(class) { \
315 Tcl_SetResult(interp, "InitError: '" #class "' constructor return 'NULL' pointer", TCL_STATIC); \
316 if (MkErrorCheckE_0E()) { \
317 Tcl_AppendResult(interp, "\nMqError: ", MkErrorGetText_0E(), NULL); \
318 MkErrorReset_0M(); \
319 } \
320}
321
322// !! attention → always jumps to error
323#define OT_ERROR_NUMARGS(...) \
324 MkErrorC_CheckD(WrongNumArgs(__VA_ARGS__))
325
326#define OT_ERROR_ABNORMAL(mng) { \
327 MkErrorSetV_4M(mng,__func__,999,"AbnormalError: %s", Tcl_GetStringResult(interp));\
328 Tcl_ResetResult(interp); \
329}
330
331//Tcl_SetResult(interp, "NatIsNullError: '" _cls "->" _nat "' is NULL", TCL_STATIC);
332#define OT_ERROR_LNG_RETURN_HDL_NAT_NULL(_hdl) { \
333 Tcl_SetResult(interp, "NatIsNullError : ", TCL_STATIC); \
334 Tcl_AppendResult(interp, MkObjectToString(_hdl)); \
335 return TCL_ERROR; \
336}
337
338#define OT_ERROR_VAR_DEFAULT(...) Tcl_SetObjResult(interp,Tcl_ObjPrintf(__VA_ARGS__));
339
340#define OT_ERROR_LNG_RETURN_VAR_ERROR(...) return ({ OT_ERROR_VAR_DEFAULT(__VA_ARGS__); TCL_ERROR; })
341
342
343// check *********************************************************************************
344
345#define OT_Prefix_ARGS OT_ENV_T interp, MK_RT_ARGS
346#define OT_Prefix_CALL interp, MK_RT_CALL
347#define OT_Check_ARGS MK_RT_ARGS MK_MNG hdl, MK_STRN const arg, TCL_ARGS, int *skipP
348#define OT_Check_CALL(arg) MK_RT_CALL hdl, arg, TCL_ARGS_CALL, &__skip
349#define OT_Check_CALL2(arg) MK_RT_CALL hdl, arg, TCL_ARGS_CALL, skipP
350
351#define OT_CHECK_OPTIONAL(val) if (__skip < objc) {val}
352#define OT_CHECK_REQUIRED(val) val
353
354#define OT_CHECK_NUM_ARGS(min,max) \
355 if ((objc-__skip) < min || (objc-__skip) > max) { \
356 OT_ERROR_NUMARGS(hdl,__skip, objc, min, max, ""); \
357 }
358// printLV("objc<%i>, __skip<%i>, min<1>, max<999>\n",objc, __skip);
359
360#define OT_CHECK_NOARGS \
361 if (__skip != objc) { \
362 OT_ERROR_NUMARGS(hdl,objc, __skip, -999, +999, ""); \
363 }
364
365#define OT_GET_CONSTR_NAME(ctor) VAL2STR(ctor)
366
367MK_TCL_EXTERN OT_SELF_T MK_DECL MK(GetClassObjectFromObj) (MK_RT_ARGS OT_ENV_T interp, OT_OBJ_T selfO);
368
369#define OT_CHECK_BNP(val,len) \
370 if (__skip >= objc) { \
371 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
372 } else { \
373 int i; \
374 val = (MK_BINN) Tcl_GetByteArrayFromObj(objv[__skip++], &i); \
375 len = (MK_SIZE)i; \
376 }
377
378#define OT_CHECK_BCP(val) \
379 if (__skip >= objc) { \
380 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
381 } else { \
382 val = (MK_BIN) Tcl_GetByteArrayFromObj(objv[__skip++], NULL); \
383 }
384
385#define OT_CHECK_BCPN(val) \
386 if (__skip >= objc) { \
387 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
388 } else { \
389 val = (MK_BINN) Tcl_GetByteArrayFromObj(objv[__skip++], NULL); \
390 }
391
392/*
393MK_TCL_EXTERN enum MkErrorE MK_DECL MK(Check__Tcl_Object) (OT_Check_ARGS, OT_SELF_T*);
394#define OT_CHECK__Tcl_Object(val) \
395 MkErrorC_CheckD(MK(Check__Tcl_Object) (OT_Check_CALL(#val), &val));
396*/
397
398// ----------------------------------------------------------------------------
399
400#define MkErrorC_Check(mng,PROC) \
401 if (unlikely(MkErrorCheckI(PROC))) { \
402 OT_ERROR_META_2_LNG(mng); goto error; \
403 }
404
405#define MkErrorC_CheckD(PROC) \
406 if (unlikely(MkErrorCheckI(PROC))) { \
407 OT_ERROR_META_2_LNG(hdl); goto error; \
408 }
409
410#define OT_ERROR_META_2_LNG(m) MK(MkExceptionC_Raise) (OT_Prefix_CALL m, __doc, __FILE__, __LINE__)
411#define OT_ERROR_LNG_2_META(m) MK(MkExceptionC_Catch) (OT_Prefix_CALL m, NULL, __func__)
412
413#define OtErrorCheckLng(cmd) if (cmd != TCL_OK) return TCL_ERROR
414#define OtErrorCheckLngGoto(cmd) if (cmd != TCL_OK) goto error
415#define OtErrorCheckLngGoto1(cmd) if (cmd != TCL_OK) goto error1
416#define OtErrorCheckLngGoto2(cmd) if (cmd != TCL_OK) goto error2
417
418#define check_LNG(code) if ((code) != TCL_OK)
419#define check_NULL(code) if ((code) == NULL)
420#define check_META(code) if (MkErrorCheckI(code))
421
422// new object ******************************************************************************
423
424#define OT_TMP_BOL_OBJ(val) BOL2VAL(val)
425#define OT_TMP_I8_OBJ(val) I82VAL(val)
426#define OT_TMP_I16_OBJ(val) I162VAL(val)
427#define OT_TMP_I32_OBJ(val) INT2VAL(val)
428#define OT_TMP_I64_OBJ(val) I642VAL(val)
429#define OT_TMP_FLT_OBJ(val) FLT2VAL(val)
430#define OT_TMP_DBL_OBJ(val) DBL2VAL(val)
431#define OT_TMP_BIN_OBJ(val,len) BIN2VAL(val,len)
432#define OT_TMP_STR_OBJ(val) STRN2VAL(val)
433#define OT_TMP_CST_OBJ(val) STRN2VAL(val)
434
435// atom ******************************************************************************
436
440mk_inline bool MK_DECL MK(AtomDeleteHard) (MK_RT_ARGS OT_ENV_T, OT_SELF_T);
441mk_inline void MK_DECL MK(AtomUnlink) (MK_RT_ARGS OT_ENV_T, OT_SELF_T);
442mk_inline void MK_DECL MK(AtomDispose) (MK_RT_ARGS OT_SELF_T);
443
444// THIS is an soft-delete called from the "<destructor>", SOFT mean that SELF is already on-DELETE
445#define OT_OBJECT_DELETE_SOFT(O) error: done in AtomMetaDelete
446
447// THIS is an hard-delete called from everywhere, HARD mean that SELF have to be deleted too
448#define OT_OBJECT_DELETE_HARD(O) MK(AtomDeleteHard) (MK_RT_CALL interp,O)
449
450// THIS is an "dispose" delte the link between LNG an MQ
451#define OT_OBJECT_DISPOSE(O) MK(AtomDispose) (MK_RT_CALL O)
452#define OT_OBJECT_DELETE(O) MK(AtomDeleteHard) (MK_RT_CALL interp, O)
453
454#define OT_REF_INCR(_obj) Tcl_IncrRefCount(_obj)
455#define OT_REF_DECR(_obj) Tcl_DecrRefCount(_obj)
456#define OT_REF_INCR_AND_RETURN(_obj) ({ Tcl_IncrRefCount(_obj); _obj;})
457#define OT_REF_DECR_AND_NULL(_obj) if (_obj) { Tcl_DecrRefCount (_obj) ; _obj = NULL; }
458
459//
460// ==================================================================================
461//
462
463#define SETUP_interp MK_UNUSED OT_ENV_T const interp = (OT_ENV_T const) MK_RT_REF.mkThreadData.ptr;
464#define SETUP_mqctx struct MqContextS * const mqctx = (struct MqContextS * const) hdl;
465#define SETUP_tclctx struct TclContextS * const tclctx = (struct TclContextS * const) hdl;
466#define SETUP_selfO OT_SELF_T selfO = OT_SELF_X(hdl);
467#define SETUP_selfX(x) OT_SELF_T selfO = OT_SELF_X(x);
468#define MQCTX (hdl)
469#define TCLCTX ((struct TclContextS * const)hdl)
470#define OT_SELF_O(o) ((OT_SELF_T)(*o).self)
471#define OT_SELF_X(x) OT_SELF_O(MkOBJ(x))
472#define OT_SELF selfO
473#define OT_SELF_NAME_O(o) Tcl_GetObjectName(interp,OT_SELF_O(o))
474#define OT_SELF_CMD_O(o) Tcl_GetObjectCommand(OT_SELF_O(o))
475
476#define SetupHdlFromMetaData_init_2(_CLS,_SHORT) \
477 int __skip; OT_SELF_T selfO; _SHORT hdl; \
478 if (objCtx) { \
479 /* call method via TCL */ \
480 __skip = Tcl_ObjectContextSkippedArgs(objCtx); \
481 selfO = Tcl_ObjectContextObject(objCtx); \
482 hdl = OBJECT2##_CLS(selfO); \
483 } else { \
484 /* call method DIRECT */ \
485 __skip = 0; \
486 selfO = NULL; \
487 hdl = (_SHORT) clientData; \
488 } \
489
490#define SetupHdlFromMetaData_2(_CLS,_SHORT) \
491 SetupHdlFromMetaData_init_2(_CLS,_SHORT) \
492 if (hdl == NULL) { \
493 MkRtSetup_NULL; \
494 OT_ERROR_LNG_RETURN_VAR_ERROR("'%s' hdl is NULL",OT_LNG_OBJ_CLASSNAME_SHORT(SELF2VAL(OT_SELF))); \
495 } \
496 SetupRtFromHdl_XN(hdl); \
497
498#define SetupHdlFromMetaData__null_allow_2(_CLS,_SHORT) \
499 SetupHdlFromMetaData_init_2(_CLS,_SHORT) \
500 SetupRtFromHdl_X(hdl); \
501
502// call ******************************************************************************
503
504#define MkCallS_SIG 0x82335642
505typedef struct MkCallS {
507 enum {
516 OT_OBJ_T my; // if "MkCallS_static" -> this is the CLASS "my"
517 OT_OBJ_T mth; // if 'proc' than NULL if 'method' than "method-name"
518 OT_OBJ_T args; // additionals arguments passed to the calling proc at beginning of the argument list
519 MK_MNG hdl; // always the 'hdl'
520 OT_ENV_T interp; // always the 'interp'
521 MK_RT mkrt; // runtime
522 bool isAlloc; // instance was alloced
523 OT_OBJ_T nsO; // namespace for command resolution
524 OT_NS_T nsPtr; // namespace for command resolution (resolved pointer)
526
527#define MkProcResolve_maxArgsLen 16
529
530mk_inline void NS(ProcResolveAppendArgs) (
531 struct MkCallS *call,
532 int *objcP,
533 OT_OBJ_T objv[]
534) {
535 assert(call != NULL);
536 assert(objcP != NULL);
537 assert(objv != NULL);
538
539 if (call->args) {
540 int myobjc;
541 OT_OBJ_T *myobjv;
542 int objc = *objcP;
543 // call->args already checked to be a valid TCL-LIST
544 Tcl_ListObjGetElements(NULL,call->args,&myobjc,&myobjv);
545 for (int i=0; i<myobjc; i++) {
546//printLLngObj(objv[i])
547 objv[objc++] = myobjv[i];
548 }
549 *objcP = objc;
550 }
551}
552
553mk_inline void MK(CallFree) ( MK_CBP *dataP )
554{
555 assert (dataP != NULL && *dataP != NULL);
556
557 MkCallS * call = *dataP;
558
559 call->signature = 0x0;
560
565 call->nsPtr = NULL;
566
567 if (call->isAlloc) MkSysFree(*dataP);
568 else *dataP = NULL;
569}
570
571mk_inline void MK(CallFreeOnce) ( MK_CBP *dataP )
572{
573 MK(CallFree) (dataP);
574}
575
576#ifdef META_HAS_THREAD
577 #define OT_OBJ_COPY(o) ({OT_OBJ_T t=(o); if (t) { t = Tcl_NewStringObj(Tcl_GetString(t),-1); OT_REF_INCR(t); }; t; })
578#else
579 #define OT_OBJ_COPY(o) ({OT_OBJ_T t=(o); if (t) { OT_REF_INCR(t); }; t; })
580#endif
581
582mk_inline void MK(CallCopy) ( MK_RT_ARGS MK_OBJ obj, MK_CBP *dataP )
583{
584 assert (dataP != NULL && *dataP != NULL);
585
586 MkCallS *call = MkSysMemDup(MK_ERROR_PANIC,*dataP,sizeof(*call));
587 call->isAlloc = true;
588
589 call->my = OT_OBJ_COPY (call->my) ;
590 call->mth = OT_OBJ_COPY (call->mth) ;
591 call->args = OT_OBJ_COPY (call->args) ;
592 call->nsO = OT_OBJ_COPY (call->nsO) ;
593 call->nsPtr = NULL;
594
595 *dataP = call;
596}
597
598// check *****************************************************************************
599
600#define NO_OtCheckEnum
601#define NO_OtCheckEnumFlag
602#define NO_TestObject
604
605#define OT_CHECK_ENUM(ename,val) \
606 if (__skip >= objc) {\
607 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
608 } else { \
609 OtErrorCheckLngGoto(Get_ ## ename ## _FromObj_path (MK_RT_CALL interp,objv[__skip++],&val)); \
610 }
611
612#define OT_CHECK_ENUM_FLAG(ename,val) \
613 if (__skip >= objc) {\
614 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
615 } else { \
616 OtErrorCheckLngGoto(Get_ ## ename ## _FromObj_path (MK_RT_CALL interp,objv[__skip++],&val)); \
617 }
618
619// object 2 native *************************************************************************
620
621
623
624#define OT_CHECK_LNGTMPL(val,func) MkErrorC_CheckD (func(OT_Check_CALL(#val),&val));
625
626#define OT_CHECK_bool(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsBOOL))
627#define OT_CHECK_NB1(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsBOL))
628#define OT_CHECK_NI1(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsI8))
629#define OT_CHECK_NI2(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsI16))
630#define OT_CHECK_U2N(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsU16))
631#define OT_CHECK_NI4(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsI32))
632#define OT_CHECK_U4N(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsU32))
633#define OT_CHECK_NI8(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsI64))
634#define OT_CHECK_IXN(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsLLG))
635#define OT_CHECK_NF4(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsFLT))
636#define OT_CHECK_NF8(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsDBL))
637#define OT_CHECK_STRN(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsSTRN))
638#define OT_CHECK_NIL(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsLONG))
639#define OT_CHECK_NIH(val) MK_HDL_REF_S3(OT_CHECK_) (val)
640
641#define OT_CHECK_STRN_NULL(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsCSTNull))
642
643MK_TCL_EXTERN enum MkErrorE MK_DECL MK(Obj_AsSTR_COPY) (OT_Check_ARGS,MK_STR,size_t);
644#define OT_CHECK_C_COPY(val,size) MkErrorC_CheckD (MK(Obj_AsSTR_COPY)(OT_Check_CALL(#val),val,size));
645
646// inspection *************************************************************************
647
648#define OT_GET_CALL_PROC MK(Get_Call_Proc)(MK_RT_CALL interp,&frame)
649#define OT_GET_CALL_FILE MK(Get_Call_File)(MK_RT_CALL interp,&frame)
650#define OT_GET_CALL_LINE MK(Get_Call_Line)(MK_RT_CALL interp,&frame)
651
656MK_TCL_EXTERN bool MK_DECL MK(Get_Call_Stack) ( MK_RT_ARGS OT_ENV_T, MK_ERR const, int );
657
658// enum ******************************************************************************
659
661 const char *key;
662 int val;
663};
664
665MK_TCL_EXTERN int MK_DECL MK(EnumFlagWorker) (MK_RT_ARGS OT_ENV_T , const struct LookupEnumE*, OT_OBJ_T , int*);
666
667// from MkBufferC_tcl.c
669MK_TCL_EXTERN int MK_DECL MK(MkBufferC_GetBFL) (MkBufferC_ARGS);
670MK_TCL_EXTERN int MK_DECL MK(MkBufferC_Temp) (MkBufferC_ARGS);
671
672// from MkBufferListC_tcl.c
674
679
680typedef int (*LookupClassF) (SKIP_ARGS);
681
683 const char *key;
685};
686
687#define WNA(min,max,txt) { \
688/* printObjV */ \
689 if (objc<(__skip+min) || objc>(__skip+max)) { \
690 Tcl_WrongNumArgs (interp, __skip, objv, txt); \
691 return TCL_ERROR; \
692 } \
693}
694
696
701
702typedef struct {
704 size_t nmemb;
705 const Tcl_MethodType* list;
708} OtUnknownS;
709
710MK_TCL_EXTERN int MK_DECL MK(UnknownSetup) (OT_ENV_T, OT_SELF_T, const Tcl_MethodType[], OtUnknownS*);
711
712//*****************************************************************************
713//*
714//* FRAME feature
715//*
716//*****************************************************************************
717
724typedef struct MkVarFrameS * OT_VARFRAME;
725
726#define OT_VARFRAME_CREATE \
727 struct MkVarFrameS otVarFrame = {50, 0}; otVarFrame.data = otVarFrame.prealloc; \
728 OT_VARFRAME varframe = &otVarFrame;
729
730#define OT_VARFRAME_DELETE { \
731 for (int i=0; i<varframe->num; i++) Tcl_DecrRefCount(varframe->data[i]); \
732 varframe = NULL; \
733}
734
735#define OT_VARFRAME_ARGS MK_RT_ARGS OT_VARFRAME varframe
736#define OT_VARFRAME_CALL MK_RT_CALL varframe
737
738static inline OT_OBJ_T MK(OT_VARFRAME_ADD)(OT_VARFRAME_ARGS, OT_OBJ_T add) {
739 if (varframe != NULL) {
740 if (varframe->num >= varframe->max) {
741 void *tmp;
742 if (varframe->data == varframe->prealloc) {
743 tmp = MkSysCalloc(MK_ERROR_PANIC,(size_t)varframe->max*2,sizeof(OT_OBJ_T));
744 memcpy(tmp,varframe->data,(size_t)varframe->max*sizeof(OT_OBJ_T));
745 } else {
746 tmp = MkSysReCalloc(MK_ERROR_PANIC,varframe->data,varframe->max,varframe->max,sizeof(OT_OBJ_T));
747 }
748 varframe->data = tmp;
749 varframe->max *= 2;
750 }
751 varframe->data[varframe->num++] = add;
752 Tcl_IncrRefCount(add);
753 }
754 return add;
755}
756
757#define OT_VARFRAME_OBJ_RESULT(itp) MK(OT_VARFRAME_ADD)(OT_VARFRAME_CALL,Tcl_GetObjResult(itp))
758
759
760/*****************************************************************************/
761/* MARK_F */
762/* functions */
763/* */
764/*****************************************************************************/
765
766MK_TCL_EXTERN MK_STR MK_DECL MK(PrintLngObj) (OT_Prefix_ARGS const char *, OT_OBJ_T );
767//MK_TCL_EXTERN int MK_DECL MK(EvalObjv) (OT_ENV_T, int, OT_OBJ_T const[], int);
768MK_TCL_EXTERN int MK_DECL MK(EvalObjvVA) (OT_ENV_T, int, ...);
769//OT_OBJ_T MK(EvalObjvVR) (OT_VARFRAME_ARGS,OT_ENV_T, int, ...);
771
774MK_TCL_EXTERN enum MkErrorE MK_DECL MK(LngListToMkBufferListS) ( OT_Prefix_ARGS OT_OBJ_T , MK_BFL* );
775
776mk_inline int NS(EvalObjv) (
777 OT_ENV_T interp,
778 int objc,
779 OT_OBJ_T const objv[],
780 int flags
781) {
782 int i,ret;
783//printAry(objc,objv)
784 for (i=0;i<objc;i++) Tcl_IncrRefCount(objv[i]);
785 ret = Tcl_EvalObjv (interp, objc, objv, flags);
786 for (i=0;i<objc;i++) Tcl_DecrRefCount(objv[i]);
787 return ret;
788}
789
790// stolen from "Tcl_MethodType"
791typedef struct {
792 int version; /* Structure version field. Always to be equal
793 * to TCL_OO_METHOD_VERSION_CURRENT in
794 * declarations. */
795 const char *name; /* Name of this type of method, mostly for
796 * debugging purposes. */
797 Tcl_ObjCmdProc *callProc;
798 /* How to invoke this method. */
799 Tcl_CmdDeleteProc *deleteProc;
800 /* How to delete this method's type-specific
801 * data, or NULL if the type-specific data
802 * does not need deleting. */
803 void *cloneProc; /* How to copy this method's type-specific
804 * data, or NULL if the type-specific data can
805 * be copied directly. */
807
808
809#if 0
810MK_TCL_EXTERN int MK_DECL MK(NewEnsemble) (OT_ENV_T , const char *, OT_NS_T , const OtObjProcDefS[],
811 ClientData);
812#endif
813
814MK_TCL_EXTERN int MK_DECL MK(FillNamespace) (OT_ENV_T , OT_NS_T , const OtObjProcDefS[], ClientData);
815// from MkExceptionC_tcl.c
816
817MK_TCL_EXTERN MK_ERR MK_DECL MK(MkExceptionC_Catch) (OT_Prefix_ARGS MK_MNG const, MK_EXP const, MK_STRN const);
818MK_TCL_EXTERN void MK_DECL MK(MkExceptionC_Raise) (OT_Prefix_ARGS MK_MNGN const, MK_STRN const, MK_STRN const, MK_I32);
819
820// from MkCall_tcl.c
821
822void MK_DECL NS(ObjectDeleteFree) ( MkObjectDeleteFreeF_ARGS );
823enum MkErrorE MK_DECL NS(ObjectDeleteCall) ( MkObjectDeleteCallF_ARGS );
824
825// enum ******************************************************************************
826
827// BEGIN-enum-tostring - created by 'tcl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
828
829#define OT_NEW_Mk_enum_OBJ(typ,val) MK(Mk ## typ ## _ToString(val))
830
832
834
836
838
839// END-enum-tostring - created by 'tcl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
840
841// BEGIN-enum - created by 'tcl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
842
843MK_TCL_EXTERN int MK_DECL MK(Get_MkErrorE_FromObj)(MK_RT_ARGS OT_ENV_T interp, OT_OBJ_T enumE, enum MkErrorE *ret);
844#define Get_MkErrorE_FromObj_path MK(Get_MkErrorE_FromObj)
845
846MK_TCL_EXTERN int MK_DECL MK(Get_MkIdSE_FromObj)(MK_RT_ARGS OT_ENV_T interp, OT_OBJ_T enumE, enum MkIdSE *ret);
847#define Get_MkIdSE_FromObj_path MK(Get_MkIdSE_FromObj)
848
849MK_TCL_EXTERN int MK_DECL MK(Get_MkTimeoutE_FromObj)(MK_RT_ARGS OT_ENV_T interp, OT_OBJ_T enumE, enum MkTimeoutE *ret);
850#define Get_MkTimeoutE_FromObj_path MK(Get_MkTimeoutE_FromObj)
851
852MK_TCL_EXTERN int MK_DECL MK(Get_MkTypeE_FromObj)(MK_RT_ARGS OT_ENV_T interp, OT_OBJ_T enumE, enum MkTypeE *ret);
853#define Get_MkTypeE_FromObj_path MK(Get_MkTypeE_FromObj)
854
855// END-enum - created by 'tcl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
856
857/*****************************************************************************/
858/* */
859/* definition's */
860/* */
861/*****************************************************************************/
862
863#define PTR2VAL(nat) (OT_OBJ_T)(nat)
864#define SELF2VAL(slf) Tcl_GetObjectName(interp,slf)
865#define META2VAL_X(x) SELF2VAL(OT_SELF_X(x))
866#define META2VAL_O(o) SELF2VAL(OT_SELF_O(o))
867
868#define I82VAL(nat) Tcl_NewIntObj(nat)
869#define BOL2VAL(nat) Tcl_NewBooleanObj(nat)
870#define I162VAL(nat) Tcl_NewIntObj(nat)
871#define U162VAL(nat) Tcl_NewIntObj((int)nat)
872#define INT2VAL(nat) Tcl_NewIntObj(nat)
873#define I642VAL(nat) Tcl_NewWideIntObj(nat)
874#define HDL2VAL(nat) Tcl_NewIntObj(nat)
875#define LLG2VAL(nat) Tcl_NewWideIntObj(nat)
876#define FLT2VAL(nat) Tcl_NewDoubleObj(nat)
877#define DBL2VAL(nat) Tcl_NewDoubleObj(nat)
878#define STRN2VAL(nat) MK(STRN2VAL)(nat)
879#define BIN2VAL(ptr,len) Tcl_NewByteArrayObj((const unsigned char*)ptr,(int)len)
880#define STR2VAL(ptr,len) Tcl_NewStringObj((const char*)ptr,(int)len)
881#define LONG2VAL(nat) Tcl_NewLongObj(nat)
882
883#define VAL2STR(obj) Tcl_GetString(obj)
884#define VAL2SELF(obj) Tcl_GetObjectFromObj(interp,obj)
885
886#define SELF2MNG(slf) Tcl_ObjectGetMetadata(slf, &MK(AtomMeta))
887
888// *********************************************************************************************
889
891 // mark=MK_NULL
892 if (val==MK_NULL) {
893 return RG(MK_NULL_OBJ);
894 } else {
895 return Tcl_NewStringObj(val,-1);
896 }
897}
898
899/*****************************************************************************/
900/* */
901/* former TclMsgque.c */
902/* */
903/*****************************************************************************/
904
905// TODO → who set OT_SHARED_IS_DLL ?
906#ifdef OT_SHARED_IS_DLL
907# define OT_TCL_EXTERN __declspec(dllexport)
908#else
909# define OT_TCL_EXTERN __attribute__ ((visibility("default")))
910#endif
911
912/*****************************************************************************/
913/* */
914/* Class_API */
915/* */
916/*****************************************************************************/
917
918#define OT_TMP_BAC_OBJ(val) MK(MkBufferListC_ObjNew) (MK_RT_CALL interp,val)
919
920// BEGIN-CLASS - created by 'tcl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
921
922// ----------------------------------------------------------------------
923// class: MkBufferListC
924
925 #define MkBufferListC_lngO MK(MkBufferListC)
928
929 int MK(pMkBufferListC_Init) (MK_RT_ARGS OT_ENV_T, OT_NS_T );
930
931 #define OT_retObj_SET_BFL(nat) retObj = MK(MkBufferListC_ObjNew) (MK_RT_CALL interp,nat)
932
933 #define OT_TMP_BFL_OBJ(val) MK(MkBufferListC_ObjNew) (MK_RT_CALL interp,val)
934
936 mk_inline OT_OBJ_T MK(MkBufferListC_ObjNew) (MK_RT_ARGS OT_ENV_T interp, MkBufferListC_type hdl) {
937 return ( hdl ? MK(AtomObjNew) (MK_RT_CALL interp, MkBufferListC_X2obj(hdl)) : MK(MkBufferListC_MK_NULL) );
938 }
939
940// ----------------------------------------------------------------------
941// class: MkBufferC
942
943 #define MkBufferC_lngO MK(MkBufferC)
946
947 int MK(pMkBufferC_Init) (MK_RT_ARGS OT_ENV_T, OT_NS_T );
948
949 #define OT_retObj_SET_BUF(nat) retObj = MK(MkBufferC_ObjNew) (MK_RT_CALL interp,nat)
950
951 #define OT_TMP_BUF_OBJ(val) MK(MkBufferC_ObjNew) (MK_RT_CALL interp,val)
952
954 mk_inline OT_OBJ_T MK(MkBufferC_ObjNew) (MK_RT_ARGS OT_ENV_T interp, MkBufferC_type hdl) {
955 return ( hdl ? MK(AtomObjNew) (MK_RT_CALL interp, MkBufferC_X2obj(hdl)) : MK(MkBufferC_MK_NULL) );
956 }
957
958// ----------------------------------------------------------------------
959// class: MkBufferStreamC
960
961 #define MkBufferStreamC_lngO MK(MkBufferStreamC)
963 MK_TCL_EXTERN_DATA MkThreadLocal OT_OBJ_T MK(MkBufferStreamC_MK_NULL);
964
965 int MK(pMkBufferStreamC_Init) (MK_RT_ARGS OT_ENV_T, OT_NS_T );
966
967 #define OT_retObj_SET_BUS(nat) retObj = MK(MkBufferStreamC_ObjNew) (MK_RT_CALL interp,nat)
968
969 #define OT_TMP_BUS_OBJ(val) MK(MkBufferStreamC_ObjNew) (MK_RT_CALL interp,val)
970
972 mk_inline OT_OBJ_T MK(MkBufferStreamC_ObjNew) (MK_RT_ARGS OT_ENV_T interp, MkBufferStreamC_type hdl) {
973 return ( hdl ? MK(AtomObjNew) (MK_RT_CALL interp, MkBufferStreamC_X2obj(hdl)) : MK(MkBufferStreamC_MK_NULL) );
974 }
975
976// ----------------------------------------------------------------------
977// class: MkErrorC
978
979 #define MkErrorC_lngO MK(MkErrorC)
982
983 int MK(pMkErrorC_Init) (MK_RT_ARGS OT_ENV_T, OT_NS_T );
984
985 #define OT_retObj_SET_ERR(nat) retObj = MK(MkErrorC_ObjNew) (MK_RT_CALL interp,nat)
986
987 #define OT_TMP_ERR_OBJ(val) MK(MkErrorC_ObjNew) (MK_RT_CALL interp,val)
988
990 mk_inline OT_OBJ_T MK(MkErrorC_ObjNew) (MK_RT_ARGS OT_ENV_T interp, MkErrorC_type hdl) {
991 return ( hdl ? MK(AtomObjNew) (MK_RT_CALL interp, MkErrorC_X2obj(hdl)) : MK(MkErrorC_MK_NULL) );
992 }
993
994// ----------------------------------------------------------------------
995// class: MkLogFileC
996
997 #define MkLogFileC_lngO MK(MkLogFileC)
1000
1001 int MK(pMkLogFileC_Init) (MK_RT_ARGS OT_ENV_T, OT_NS_T );
1002
1003 #define OT_retObj_SET_LFL(nat) retObj = MK(MkLogFileC_ObjNew) (MK_RT_CALL interp,nat)
1004
1005 #define OT_TMP_LFL_OBJ(val) MK(MkLogFileC_ObjNew) (MK_RT_CALL interp,val)
1006
1008 mk_inline OT_OBJ_T MK(MkLogFileC_ObjNew) (MK_RT_ARGS OT_ENV_T interp, MkLogFileC_type hdl) {
1009 return ( hdl ? MK(AtomObjNew) (MK_RT_CALL interp, MkLogFileC_X2obj(hdl)) : MK(MkLogFileC_MK_NULL) );
1010 }
1011
1012// ----------------------------------------------------------------------
1013// class: MkObjectC
1014
1015 #define MkObjectC_lngO MK(MkObjectC)
1018
1019 int MK(pMkObjectC_Init) (MK_RT_ARGS OT_ENV_T, OT_NS_T );
1020
1021 #define OT_retObj_SET_OBJ(nat) retObj = MK(MkObjectC_ObjNew) (MK_RT_CALL interp,nat)
1022
1023 #define OT_TMP_OBJ_OBJ(val) MK(MkObjectC_ObjNew) (MK_RT_CALL interp,val)
1024
1026 mk_inline OT_OBJ_T MK(MkObjectC_ObjNew) (MK_RT_ARGS OT_ENV_T interp, MkObjectC_type hdl) {
1027 return ( hdl ? MK(AtomObjNew) (MK_RT_CALL interp, MkObjectC_X2obj(hdl)) : MK(MkObjectC_MK_NULL) );
1028 }
1029
1030// ----------------------------------------------------------------------
1031// class: MkRuntimeC
1032
1033 #define MkRuntimeC_lngO MK(MkRuntimeC)
1036
1037 int MK(pMkRuntimeC_Init) (MK_RT_ARGS OT_ENV_T, OT_NS_T );
1038
1039 #define OT_retObj_SET_RT(nat) retObj = MK(MkRuntimeC_ObjNew) (MK_RT_CALL interp,nat)
1040
1041 #define OT_TMP_RT_OBJ(val) MK(MkRuntimeC_ObjNew) (MK_RT_CALL interp,val)
1042
1044 mk_inline OT_OBJ_T MK(MkRuntimeC_ObjNew) (MK_RT_ARGS OT_ENV_T interp, MkRuntimeC_type hdl) {
1045 return ( hdl ? MK(AtomObjNew) (MK_RT_CALL interp, MkRuntimeC_X2obj(hdl)) : MK(MkRuntimeC_MK_NULL) );
1046 }
1047
1048// END-CLASS - created by 'tcl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1049
1050/*****************************************************************************/
1051/* */
1052/* reference */
1053/* */
1054/*****************************************************************************/
1055
1056#define ME_REF_MkBinaryR MkBinaryR
1057#define OT_GET__ME_REF_MkBinaryR(b) BIN2VAL(b.data,b.size)
1058#define VAL2MkBinaryR(obj) \
1059 ({int size;unsigned char * bin =Tcl_GetByteArrayFromObj(obj,&size);MkBinaryCreate(size,bin);})
1060#define OT_CHECK__ME_REF_MkBinaryR(val) \
1061 if (__skip >= objc) { \
1062 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
1063 } else { \
1064 val = VAL2MkBinaryR(objv[__skip++]); \
1065 }
1066
1067#define ME_REF_MkStringR MkStringR
1068#define OT_GET__ME_REF_MkStringR(s) STR2VAL(s.ptr,s.len)
1069#define VAL2MkStringR(obj) \
1070 ({int len;char * str =Tcl_GetStringFromObj(obj,&len);MkStringCreate(len,str);})
1071#define OT_CHECK__ME_REF_MkStringR(val) \
1072 if (__skip >= objc) { \
1073 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
1074 } else { \
1075 val = VAL2MkStringR(objv[__skip++]); \
1076 }
1077
1079{
1080 int len = 0;
1081 char* str = Tcl_GetStringFromObj(tclO,&len);
1082 return MkStringCreate(len,str);
1083}
1084
1085/*****************************************************************************/
1086/* */
1087/* enum helpers */
1088/* */
1089/*****************************************************************************/
1090
1091// helper for xxx_ToString, the ERROR returned from Tcl_ListObjAppendElement is NOT checked
1092#define ot_fixstr(_s) _s,strlen(_s)
1093#define ot_fixstrobj(_s) Tcl_NewStringObj(_s,strlen(_s))
1094#define ot_enum_append(_o,_s) Tcl_ListObjAppendElement(NULL,_o,ot_fixstrobj(_s))
1095
1096/*****************************************************************************/
1097/* */
1098/* inline functions */
1099/* */
1100/*****************************************************************************/
1101
1102// debugging ***********************************************************************************
1103
1104#define printLng(var) printV(#var" = '%s' [ref=%i]",(var?VAL2STR(var):"NULL"),(var)?(var)->refCount:-1)
1105#define printXLng(x,var) printXV(x,#var" = '%s' [ref=%i]",(var?VAL2STR(var):"NULL"),(var)?(var)->refCount:-1)
1106#define printLngObj(var) if (var) {printTxt(MK(PrintLngObj)(OT_Prefix_CALL #var,var))} else {printTxt(#var "=NULL")}
1107#define printXLngObj(x,var) if (var) {printXC2(x,MK(PrintLngObj)(OT_Prefix_CALL #var,var))} else {printTxt(#var "=NULL")}
1108#define printLLngObj(var) if (var) {printXC2(META_CONTEXT_S,MK(PrintLngObj)(OT_Prefix_CALL #var,var))} else {printTxt(#var "=NULL")}
1109
1110#define printLngErrorCode() do { \
1111 OT_OBJ_T errorCode = Tcl_GetVar2Ex (interp, "errorCode", NULL, TCL_GLOBAL_ONLY); \
1112 printLngObj(errorCode); \
1113} while (0); \
1114
1115#define printLngErrorInfo() do { \
1116 OT_OBJ_T errorInfo = Tcl_GetVar2Ex (interp, "errorInfo", NULL, TCL_GLOBAL_ONLY); \
1117 printLngObj(errorInfo); \
1118} while (0); \
1119
1120#define printObjv printV( "__skip=%i, objc=%i",__skip,objc) ; printAry3( " ",objc,objv)
1121#define printXObjv(x) printXV(x,"__skip=%i, objc=%i",__skip,objc) ; printXAry4(x, " ",objc,objv)
1122
1123#define printAry(c,o) printAry3(#o,c,o)
1124#define printAryDetail(c,o) for(int i=0;i<c;i++) { printLngObj(o[i]) }
1125
1126#define printXAry(x,pre,c,o) printXAry4(x,"",c,o)
1127#define printXAry4(x,pre,c,o) for(int i=0;i<c;i++) { printXV(x,"%2i= %s",i,o[i]?Tcl_GetString(o[i]):"NULL"); }
1128#define printXAryDetail(x,c,o) for(int i=0;i<c;i++) { printXLngObj(x,o[i]) }
1129
1130#define printAry3(txt, c,o) do { \
1131 mk_dbg_Z_start(512,MK_COLOR_BLUE "%s : ",txt); \
1132 for(int i=0;i<c;i++) { \
1133 mk_dbg_Z_next(MK_COLOR_YELLOW "[%d:%p]" MK_COLOR_RESET "='%s' ",i,o[i],o[i]?Tcl_GetString(o[i]):"NULL"); \
1134 } \
1135 mk_dbg_Z_end(); \
1136} while (0)
1137
1138#define printAryX(x,t,c,o) \
1139 printXV(x, "%-15s = ",t); \
1140 for(int i=0;i<c;i++) { \
1141 fprintf(stderr, "'%s' ",o[i]?Tcl_GetString(o[i]):"NULL"); \
1142 } \
1143 fputc('\n', stderr);
1144
1145#define printAryL(t,c,o) printAryX(META_CONTEXT_S,t,c,o) \
1146
1147#define xstr(s) str(s)
1148#define str(s) #s
1149
1150#define printLngClass(clsC) printV(#clsC " name = %s\n", OT_LNG_NAME_FROM_CLASS(clsC))
1151#define printLngObject(objO) printV(#objO " name = %s\n", OT_LNG_NAME_FROM_OBJECT(objO))
1152
1153// MK_TCL_EXTERN void MK_DECL MK(PrintLngObjAsObject)(MK_RT_ARGS OT_ENV_T interp, MK_STRN name, OT_OBJ_T in, MK_STRN proc);
1154// #define MkPrintLngObjAsObject(inobj) MK(PrintLngObjAsObject)(MK_RT_CALL interp,#inobj,inobj,__func__);
1155
1161
1163{
1164 #define __doc "AtomObjNew"
1165 MK_PTR selfO = NULL;
1166 // force "class-NULL object → test done BEFORE "AtomObjNew" is called
1167 assert(obj != NULL);
1168 //if (obj == NULL) return RG(nullObj);
1169 MkErrorC_Check(obj, MkSelfNew(obj,&selfO,interp))
1170 OT_OBJ_T ret = Tcl_GetObjectName(interp,(OT_SELF_T)selfO);
1171 return ret;
1172 #undef __doc
1173error:
1174 return NULL;
1175}
1176
1177// update SELF if OBJECT is already available
1178// CALLED from: "<contructor>", MkAtomCreate
1181 OT_ENV_T interp,
1182 OT_SELF_T object,
1183 MK_OBJ obj
1184) {
1185 if (obj) MkRefIncrSelf (obj, (void*) object, interp);
1186 ClientData meta = Tcl_ObjectGetMetadata(object,&MK(AtomMeta));
1187 // a "reborn" object as result from a AtomMetaDelete→MkRefDecrWithoutSelf→self=NULL
1188 // BUG fix for LibLcConfig_lc_prv.c→pSettingDelete
1189 if (meta != (ClientData)obj) {
1190 if (meta) {
1191 MkDLogV_O(obj, 3, "WARNING: REBORN object[%s] REPLACE meta[%p -> %p]\n", \
1192 OT_LNG_FULLNAME_FROM_OBJECT(object), meta, obj);
1193 } else {
1194 MkDLogV_O(obj, 6, "INFO: BORN object[%s] with NEW meta[%p]\n", \
1195 OT_LNG_FULLNAME_FROM_OBJECT(object),obj);
1196 }
1197 Tcl_ObjectSetMetadata(object,&MK(AtomMeta),(ClientData)obj);
1198 } else {
1199 // This is a result of a DELETE & CREATE
1200 if (obj != NULL) {
1201 MkDLogV_O(obj, 3, "WARNING: REBORN object[%s] with SAME meta[%p]\n", \
1202 OT_LNG_FULLNAME_FROM_OBJECT(object),obj);
1203 }
1204 Tcl_ObjectSetMetadata(object,&MK(AtomMeta),(ClientData)obj);
1205 }
1206 return object;
1207}
1208
1209// create OBJECT and update SELF
1210// CALLED from: "*_SelfCreate"
1213 OT_ENV_T interp,
1214 MK_OBJ obj,
1215 OT_CLS_T class,
1216 MK_STRN name,
1217 MK_STRN ns
1218) {
1219 // create name if not set
1220 #define BUFLEN 127
1221 char nameBuf[BUFLEN+1] = {0};
1222 int retLen = 0;
1223 if (name == NULL) {
1224 if (obj) {
1225 retLen = snprintf(nameBuf,BUFLEN,"%s::<%s-%p>",ns?ns:"",obj->type->type_name,obj);
1226 } else {
1227 MkLogV_1("SUSPICIOS WARNING[%s]: 'name' and 'obj' are NULL", OT_LNG_NAME_FROM_CLASS(class));
1228 retLen = snprintf(nameBuf,BUFLEN,"%s::<UNKNOWN>",ns?ns:"");
1229 }
1230 } else {
1231 retLen = snprintf(nameBuf,BUFLEN,"%s::%s",ns?ns:"",name);
1232 }
1233 if (retLen>=BUFLEN) {
1234 MkLogV_1("SUSPICIOS WARNING[%s]: 'name' truncate to '%s'", OT_LNG_NAME_FROM_CLASS(class), nameBuf);
1235 }
1236 #undef BUFLEN
1237
1238 OT_OBJ_T nameObj = STRN2VAL(nameBuf);
1239 OT_REF_INCR(nameObj);
1240 name = nameBuf;
1241
1242 // 1. with the "noSelf" feature no "self" pointer is saved into "obj->self" and
1243 // the "atomCreate" is always called -> BUT an object COULD be already available.
1244 // 2. multiple objects using the SAME name are possible, but not allowed.
1245 OT_SELF_T object = NULL;
1246 if (obj && Tcl_GetCommandFromObj(interp, nameObj) != NULL) {
1247 object = Tcl_GetObjectFromObj(interp,nameObj);
1248 // don't trust the name -> get REAL MQ-OBJ from TCL-OBJECT
1249 MK_OBJ object_hdl = MkObj(SELF2MNG(object));
1250 if (object_hdl == obj) {
1251 // OK: "reborn" self or stalled delete or something broken
1252
1253 // SUSPICIUS -> self == NULL but command is available
1254 // PROBLEM: MkAtomInit->Tcl_ObjectSetMetadata" will DECR the refCount from object_hdl.
1255 // With refCount <= 1 the "obj" will be deleted !!
1256 // restrict to "obj->isLocal" because this was the concret problem with "ReadBUF" reference
1257 //if (obj->self == NULL && obj->isLocal) MkRefIncr(obj);
1258 if (obj->self == NULL && obj->obj_protect.isLocal)
1259 MkPanicV_2(obj,"reuse tcl-command<%s> with mq-obj<%p>", name, object_hdl);
1260 } else {
1261 // ATTENTION: MkAtomInit->Tcl_ObjectSetMetadata will DECR the refCount from object_hdl
1262 MkLogV_2(object_hdl, "MANIPULATION WARNING[%s]: found tcl-command<%s> with wrong mq-obj<%p>\n",
1263 OT_LNG_NAME_FROM_CLASS(class), name, object_hdl);
1264 }
1265 }
1266
1267 // create object WITHOUT calling the CONSTR because the MK_OBJ is already available
1268 // tclOO.c: Run constructors, except when objc < 0, which is a special flag case
1269 // used for object cloning only.
1270 if (object==NULL) {
1271 object = Tcl_NewObjectInstance(interp, class, name, name, -1, NULL, 0);
1272 }
1273
1274//printV("class=%s(%p), object=%s(%p)\n", OT_LNG_NAME_FROM_CLASS(class), class, OT_LNG_FULLNAME_FROM_OBJECT(object), object)
1275
1276 check_NULL(object) {
1278 return NULL;
1279 }
1280
1281 if (nameObj) Tcl_DecrRefCount(nameObj);
1282 return MK(AtomInit)(MK_RT_CALL interp,object,obj);
1283}
1284
1285// TCL object is still alive
1286// called by: "Delete" and "Dispose" as pseudo-DTOR
1287// META: is called when the META object is destroyed and SELF does NOT belongs to the META.
1288mk_inline bool MK(AtomDeleteHard)(MK_RT_ARGS OT_ENV_T interp, OT_SELF_T selfO) {
1289 assert(interp!=NULL || selfO!=NULL);
1290 if (Tcl_InterpDeleted(interp) || Tcl_ObjectDeleted(selfO)) return false;
1291 check_LNG(Tcl_DeleteCommandFromToken (interp, Tcl_GetObjectCommand(selfO))) {
1293 return false;
1294 }
1295 return true;
1296}
1297
1298// TCL object is still alive but can NOT be deleted
1299// META: is called when the META object is destroyed and SELF does NOT belong to the META.
1300mk_inline void MK(AtomUnlink)(MK_RT_ARGS OT_ENV_T interp, OT_SELF_T selfO) {
1301 assert(interp!=NULL || selfO!=NULL);
1302 Tcl_ObjectSetMetadata(selfO,&MK(AtomMeta),NULL);
1303}
1304
1305// SOFT: delete META if TCL is still active
1306// CALLED from: "Dispose"
1307mk_inline void MK(AtomDispose) (MK_RT_ARGS OT_SELF_T selfO)
1308{
1309 assert(selfO!=NULL);
1310 MK_MNG mng = SELF2MNG(selfO);
1311 check_NULL(mng) return;
1312 MK_OBJ obj = MkObj(mng);
1313 check_NULL(obj) return;
1314 // unlink TCL from META
1316 // unlink META from TCL → call: AtomMetaDelete, with disabled META
1317 Tcl_ObjectSetMetadata(selfO,&MK(AtomMeta),NULL);
1318}
1319
1320#undef HEADER
#define OT_ERROR_ABNORMAL(mng)
#define check_NULL(code)
#define MK(n)
Tcl_Class OT_CLS_T
Tcl_Namespace * OT_NS_T
MK_STRN OT_ENUM_T
#define OT_LNG_NAME_FROM_CLASS(_cls)
#define SKIP_ARGS
OtUnknownE
@ OT_UNKNOWN_CLASS
@ OT_UNKNOWN_INSTANCE
static MkStringR Ot_GetStringFromObj(OT_OBJ_T tclO)
#define OT_Check_ARGS
#define SELF2MNG(slf)
#define OT_LNG_FULLNAME_FROM_OBJECT(_obj)
#define TCL_ARGS
#define MkBufferC_ARGS
#define NS(n)
#define MK_TCL_EXTERN
static library
struct MkVarFrameS * OT_VARFRAME
int(* LookupClassF)(SKIP_ARGS)
#define check_LNG(code)
struct MkCallS MkCallS
Tcl_Object OT_SELF_T
#define OT_OBJ_COPY(o)
#define OT_REF_DECR_AND_NULL(_obj)
#define RG(_key)
#define str(s)
#define BUFLEN
#define OT_REF_INCR(_obj)
#define MK_TCL_EXTERN_DATA
#define MkBufferListC_ARGS
#define MkErrorC_Check(mng, PROC)
Tcl_Interp * OT_ENV_T
#define OT_Prefix_ARGS
Tcl_Obj * OT_OBJ_T
#define STRN2VAL(nat)
#define OT_VARFRAME_ARGS
OT_ProcRet NS MkBufferC_ToObject(MkBufferC_ARGS)
OT_ProcRet MK MkBufferListC_ToList(MkBufferListC_ARGS)
#define MkBufferC_type
#define MkBufferC_X2obj(x)
#define MkBufferListC_type
#define MkBufferListC_X2obj(x)
#define MkBufferStreamC_type
#define MkBufferStreamC_X2obj(x)
#define MkErrorC_X2obj(x)
#define MkErrorC_type
#define MkPanicV_2(fmtobj, printfmt,...)
#define MK_ERROR_PRINT
#define MK_ERROR_PANIC
#define MK_DECL
#define mk_inline
#define MK_ARTIFICIAL
#define MK_NULL
MK_STRN MkTimeoutE_ToString(enum MkTimeoutE value)
MkTimeoutE
MK_STRN MkIdSE_ToString(enum MkIdSE value)
MK_STRN MkTypeE_ToString(enum MkTypeE value)
MkErrorE
MkTypeE
MK_STRN MkErrorE_ToString(enum MkErrorE value)
static MkStringR MkStringCreate(MK_NUM len, MK_STRN str)
const MK_PTRB * MK_MNGN
int32_t MK_NUM
MK_PTRB * MK_PTR
const MK_STRB * MK_STRN
MK_PTRB * MK_MNG
MK_PTRB const * MK_EXP
unsigned int MK_SIG
MK_PTRB * MK_CBP
MK_STRB * MK_STR
signed int MK_I32
#define MkLogFileC_X2obj(x)
#define MkLogFileC_type
struct MkObjectS * MK_OBJ
#define MkObjectC_X2obj(x)
#define MkObjectC_type
static MK_OBJ MkObj(MK_MNG mng)
#define MkLogV_1(printfmt,...)
#define MkDLogV_O(fmtobj, _debug, printfmt,...)
#define MkLogV_2(fmtobj, printfmt,...)
#define MkSelfNew(...)
#define MkRefDecrWithoutSelf(...)
static void MkRefIncrSelf(MK_OBJ const obj, MK_PTR const self, MK_PTR const env)
MkIdSE
MK_PTR MkSysCalloc(MK_OBJN fmtobj, size_t const nmemb, size_t const size)
#define MkSysFree(pointer)
MK_PTR MkSysMemDup(MK_OBJN fmtobj, MK_PTRN const blck, size_t const size)
MK_PTR MkSysReCalloc(MK_OBJN fmtobj, MK_PTR const buf, MK_NUM const oldnum, MK_NUM const addnum, size_t const size)
#define MkObjectDeleteCallF_ARGS
#define MkObjectDeleteFreeF_ARGS
#define MkRuntimeC_type
#define MkRuntimeC_X2obj(x)
#define MkThreadLocal
#define MK_RT_CALL
#define MK_RT_ARGS
struct MkTypeS * MK_TYP
tag: nhi1-release-250425
tag: nhi1-release-250425
bool MK TestObject(OT_Prefix_ARGS OT_OBJ_T lngO, OT_CLS_T typeO, MK_OBJ *objP, MkTestClassE *flagP)
tag: nhi1-release-250425
LookupClassF keyF
const char * key
const char * key
OT_OBJ_T mth
OT_ENV_T interp
OT_OBJ_T args
enum MkCallS::@2 type
OT_NS_T nsPtr
OT_OBJ_T nsO
MK_SIG signature
OT_OBJ_T my
OT_OBJ_T prealloc[50]
OT_OBJ_T * data
Tcl_ObjCmdProc * callProc
const char * name
Tcl_CmdDeleteProc * deleteProc
OT_CLS_T classC
OT_SELF_T classO
const Tcl_MethodType * list
OtUnknownE what