17#include "LibMkKernel_mk.h"
21#if !defined(META_FILE_NAME)
22 #define META_FILE_NAME (__builtin_strrchr(__FILE__, '/') ? __builtin_strrchr(__FILE__, '/') + 1 : __FILE__)
41#if defined(META_IGNORE_EXTERN)
45# if defined(DLL_EXPORT)
47# if defined(MK_TCL_BUILD_DLL)
48# define MK_TCL_EXTERN __declspec(dllexport)
50# define MK_TCL_EXTERN __declspec(dllimport)
54# define MK_TCL_EXTERN __attribute__ ((visibility("default")))
62#undef MK_TCL_EXTERN_DATA
63#if defined(META_PRIVATE)
64# define MK_TCL_EXTERN_DATA extern
65#elif defined(META_IGNORE_EXTERN)
66# define MK_TCL_EXTERN_DATA extern
69# if defined(DLL_EXPORT)
71# if defined(MK_TCL_BUILD_DLL)
72# define MK_TCL_EXTERN_DATA __declspec(dllexport)
74# define MK_TCL_EXTERN_DATA __declspec(dllimport)
78# define MK_TCL_EXTERN_DATA __attribute__ ((visibility("default"))) extern
81# define MK_TCL_EXTERN_DATA extern
85#define MK(n) tclmkkernel_ ## n
87#define NS(n) tclmkkernel_ ## n
91#define META_CONTEXT_S hdl
95#define TCL_ARGS OT_ENV_T interp, int objc, OT_OBJ_T const *objv
96#define TCL_ARGS_CALL interp, objc, objv
98#define OBJECT_ARGS ClientData clientData, OT_ENV_T interp, Tcl_ObjectContext objCtx, \
99 int objc, OT_OBJ_T const *objv
100#define OBJECT_ARGS_CALL hdl, interp, objCtx, objc, objv
102#define OBJCMD_ARGS ClientData clientData, OT_ENV_T interp, int objc, OT_OBJ_T const *objv
103#define OBJCMD_ARGS_CALL clientData, interp, objc, objv
105#define CONSTR_ARGS OBJECT_ARGS
107#define SKIP_ARGS TCL_ARGS, int __skip
108#define SKIP_ARGS_CALL TCL_ARGS_CALL, __skip
110#define OtClass_ARGS OBJECT_ARGS
111#define OtClass_ARGS_CALL OBJECT_ARGS_CALL
117#define MkBufferListC_ARGS OBJECT_ARGS
118#define MkBufferListC_ARGS_CALL OBJECT_ARGS_CALL
119#define MkBufferC_ARGS OBJECT_ARGS
120#define MkBufferC_ARGS_CALL OBJECT_ARGS_CALL
121#define MkBufferStreamC_ARGS OBJECT_ARGS
122#define MkBufferStreamC_ARGS_CALL OBJECT_ARGS_CALL
123#define MkErrorC_ARGS OBJECT_ARGS
124#define MkErrorC_ARGS_CALL OBJECT_ARGS_CALL
125#define MkLogFileC_ARGS OBJECT_ARGS
126#define MkLogFileC_ARGS_CALL OBJECT_ARGS_CALL
127#define MkObjectC_ARGS OBJECT_ARGS
128#define MkObjectC_ARGS_CALL OBJECT_ARGS_CALL
129#define MkRuntimeC_ARGS OBJECT_ARGS
130#define MkRuntimeC_ARGS_CALL OBJECT_ARGS_CALL
136#define OT_SETUP_ARGS_ALL(d) \
137 OT_OBJ_T retObj=NULL; \
138 MK_UNUSED static const MK_STRN __doc=d; \
139 MK_UNUSED OT_OBJ_T frame=NULL; \
141#define OT_FRAME_CLEANUP if (frame != NULL) { Tcl_DecrRefCount(frame); frame = NULL; }
143#define OT_SETUP_VARARGS(min,max,d) \
144 OT_SETUP_ARGS_ALL(d); \
145 OT_CHECK_NUM_ARGS(min,max);
147#define OT_SETUP_CONSTRUCTOR_ARGS(...) OT_SETUP_VARARGS(__VA_ARGS__)
149#define OT_SETUP_ONEARG(d) \
150 OT_SETUP_ARGS_ALL(d); \
151 OT_CHECK_NUM_ARGS(1,1);
153#define OT_SETUP_NOARG(d) \
154 OT_SETUP_ARGS_ALL(d); \
155 OT_CHECK_NUM_ARGS(0,0);
158#define OT_SETUP_obj MK_OBJ obj = OBJ;
159#define OT_SETUP_doc __attribute__((unused)) const MK_STRN __doc = __func__;
161#define SETUP_ARGS MK_RT_ARGS TCL_ARGS
162#define SETUP_ARGS_CALL MK_RT_CALL TCL_ARGS_CALL
166#define OT_retObj_CONSTR(x) retObj = Tcl_GetObjectName(interp,MK(AtomInit)(MK_RT_CALL interp,selfO,MkOBJ(x)));
167#define OT_CONSTRUCTOR_POST(x)
169#define OT_retObj_SET(val) retObj = (val);
170#define OT_retObj_SET_None retObj = RG(noneObj);
171#define OT_retObj_SET_Error retObj = NULL; \
173#define OT_retObj_SET_List retObj = Tcl_NewListObj(0,NULL);
174#define OT_retObj_APPEND(var) OtErrorCheckLngGoto(Tcl_ListObjAppendElement(interp,retObj,var));
175#define OT_retObj_RETURN \
176 if (retObj != NULL) { \
177 Tcl_SetObjResult(interp,retObj); \
200#define OT_retObj_SET_BOL(nat) retObj = BOL2VAL(nat);
201#define OT_retObj_SET_I8(nat) retObj = I82VAL(nat);
202#define OT_retObj_SET_I16(nat) retObj = I162VAL(nat);
203#define OT_retObj_SET_U16(nat) retObj = U162VAL(nat);
204#define OT_retObj_SET_I32(nat) retObj = INT2VAL(nat);
205#define OT_retObj_SET_I64(nat) retObj = I642VAL(nat);
206#define OT_retObj_SET_LLG(nat) retObj = LLG2VAL(nat);
207#define OT_retObj_SET_FLT(nat) retObj = FLT2VAL(nat);
208#define OT_retObj_SET_DBL(nat) retObj = DBL2VAL(nat);
209#define OT_retObj_SET_BIN(nat,len) retObj = BIN2VAL(nat,len);
210#define OT_retObj_SET_STR(nat) retObj = STRN2VAL(nat);
211#define OT_retObj_SET_STRN(nat) retObj = STRN2VAL(nat);
212#define OT_retObj_SET_LONG(nat) retObj = LONG2VAL(nat);
213#define OT_retObj_SET_HDL(nat) retObj = HDL2VAL(nat);
219#define OT_MK_CALL_0_v1
222#define OT_MK_CALL_0(hdl,cls,meth,ret) \
224 ret =
MK(EvalObjvVR)(NULL,interp,0,
MK(cls##_ObjNew)(interp,hdl),
MK(cls##_##meth##_Obj),NULL);
231#define OT_MK_CALL_0(hdl,cls,meth,ret) { \
232 OtErrorCheckLngGoto(MK(cls##_##meth)(hdl,interp, NULL, 0, NULL)); \
233 ret = Tcl_GetObjResult(interp); \
247#define OT_LNG_NULL NULL
248#define OT_LNG_UNDEF NULL
249#define OT_LNG_RETURN(ret,cmd) \
250 OtErrorCheckLngGoto(cmd); \
251 ret = Tcl_GetObjResult(interp); \
253#define OT_LNG_FULLNAME_FROM_OBJECT(_obj) Tcl_GetString(Tcl_GetObjectName(interp,_obj))
254#define OT_LNG_NAME_FROM_OBJECT(_obj) Tcl_GetCommandName(interp,Tcl_GetObjectCommand(_obj))
255#define OT_LNG_NAME_FROM_CLASS(_cls) OT_LNG_NAME_FROM_OBJECT(Tcl_GetClassAsObject(_cls))
256#define OT_LNG_NAME_FROM_OBJ(_obj) OT_LNG_NAME_FROM_OBJECT(Tcl_GetObjectFromObj(interp,_obj))
258#define OT_LNG_OBJ_CLASSNAME(obj) MK(ClassName)(OT_Prefix_CALL obj, false)
259#define OT_LNG_OBJ_CLASSNAME_SHORT(obj) MK(ClassName)(OT_Prefix_CALL obj, true)
260#define OT_OBJ_TYPE_STRING(obj) MK(ClassName)(OT_Prefix_CALL obj, false)
263#define OT_LNG_NAME_CLASS_FROM_CONTEXT(ox) \
264 OT_LNG_NAME_FROM_CLASS(Tcl_MethodDeclarerClass(Tcl_ObjectContextMethod(ox)))
266#define OT_LNG_OBJV(__skip) objv[__skip]
268#define OT_OBJ_TO_CLASS(str) str
269#define OT_OBJ_TO_ENUM(str) #str
271#define OT_LNG_SET_VAR(var,val) \
272 if (Tcl_ObjSetVar2(interp, var, NULL, val, TCL_LEAVE_ERR_MSG) == NULL) goto error
276#define OT_REGISTRY_AS_TLS
278#define RG(_key) MK(reggv)[MK(_key)]
279#ifdef OT_REGISTRY_AS_TLS
285#define regTclObj(str) MK_TCL_EXTERN_DATA int MK(str);
286#define regTclObj2(def,str) MK_TCL_EXTERN_DATA int MK(def);
287#include "MkRegistry_tcl.h"
291#define RL(num) RL_data[num]
292#define RL_init(code) static MkThreadLocal OT_OBJ_T RL_data[10] = {0}; if (RL_data[0] == NULL) { code; }
293#define RL_NewC(num,str) { RL_data[num] = STRN2VAL(#str); Tcl_IncrRefCount(RL_data[num]); }
294#define RL_NewS(num,str) { RL_data[num] = STRN2VAL(str); Tcl_IncrRefCount(RL_data[num]); }
295#define RL_NewI(num,itg) { RL_data[num] = INT2VAL(itg); Tcl_IncrRefCount(RL_data[num]); }
296#define RL_O(num,obj) { RL_data[num] = obj; }
297#define RL_objv(num) (num),RL_data
298#define RL_Free(num) do {Tcl_DecrRefCount(RL_data[num]); RL_data[num]=NULL;} while (0);
308#define OT_ERROR_LNG_RETURN return TCL_ERROR
310#define OT_ERROR_TYPE(str) \
311 Tcl_SetObjResult(interp, Tcl_ObjPrintf("TYPE ERROR: %s", str));
313#define OT_ERROR_SOFT_CONSTRUCTOR(class) { \
314 Tcl_SetResult(interp, "InitSoftError: '" #class "' soft constructor return 'NULL' pointer", TCL_STATIC); \
317#define OT_ERROR_CONSTRUCTOR(class) { \
318 Tcl_SetResult(interp, "InitError: '" #class "' constructor return 'NULL' pointer", TCL_STATIC); \
319 if (MkErrorCheckE_0E()) { \
320 Tcl_AppendResult(interp, "\nMqError: ", MkErrorGetText_0E(), NULL); \
326#define OT_ERROR_NUMARGS(...) \
327 MkErrorC_CheckD(WrongNumArgs(__VA_ARGS__))
329#define OT_ERROR_ABNORMAL(mng) { \
330 MkErrorSetV_4M(mng,__func__,999,"AbnormalError: %s", Tcl_GetStringResult(interp));\
331 Tcl_ResetResult(interp); \
335#define OT_ERROR_LNG_RETURN_HDL_NAT_NULL(_hdl) { \
336 Tcl_SetResult(interp, "NatIsNullError : ", TCL_STATIC); \
337 Tcl_AppendResult(interp, MkObjectToString(_hdl)); \
341#define OT_ERROR_VAR_DEFAULT(...) Tcl_SetObjResult(interp,Tcl_ObjPrintf(__VA_ARGS__));
343#define OT_ERROR_LNG_RETURN_VAR_ERROR(...) return ({ OT_ERROR_VAR_DEFAULT(__VA_ARGS__); TCL_ERROR; })
348#define OT_Prefix_ARGS OT_ENV_T interp, MK_RT_ARGS
349#define OT_Prefix_CALL interp, MK_RT_CALL
350#define OT_Check_ARGS MK_RT_ARGS MK_MNG hdl, MK_STRN const arg, TCL_ARGS, int *skipP
351#define OT_Check_CALL(arg) MK_RT_CALL hdl, arg, TCL_ARGS_CALL, &__skip
352#define OT_Check_CALL2(arg) MK_RT_CALL hdl, arg, TCL_ARGS_CALL, skipP
354#define OT_CHECK_OPTIONAL(val) if (__skip < objc) {val}
355#define OT_CHECK_REQUIRED(val) val
357#define OT_CHECK_NUM_ARGS(min,max) \
358 if ((objc-__skip) < min || (objc-__skip) > max) { \
359 OT_ERROR_NUMARGS(hdl,__skip, objc, min, max, ""); \
363#define OT_CHECK_NOARGS \
364 if (__skip != objc) { \
365 OT_ERROR_NUMARGS(hdl,objc, __skip, -999, +999, ""); \
368#define OT_GET_CONSTR_NAME(ctor) VAL2STR(ctor)
372#define OT_CHECK_BNP(val,len) \
373 if (__skip >= objc) { \
374 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
377 val = (MK_BINN) Tcl_GetByteArrayFromObj(objv[__skip++], &i); \
381#define OT_CHECK_BCP(val) \
382 if (__skip >= objc) { \
383 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
385 val = (MK_BIN) Tcl_GetByteArrayFromObj(objv[__skip++], NULL); \
388#define OT_CHECK_BCPN(val) \
389 if (__skip >= objc) { \
390 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
392 val = (MK_BINN) Tcl_GetByteArrayFromObj(objv[__skip++], NULL); \
403#define MkErrorC_Check(mng,PROC) \
404 if (unlikely(MkErrorCheckI(PROC))) { \
405 OT_ERROR_META_2_LNG(mng); goto error; \
408#define MkErrorC_CheckD(PROC) \
409 if (unlikely(MkErrorCheckI(PROC))) { \
410 OT_ERROR_META_2_LNG(hdl); goto error; \
413#define OT_ERROR_META_2_LNG(m) MK(MkExceptionC_Raise) (OT_Prefix_CALL m, __doc, __FILE__, __LINE__)
414#define OT_ERROR_LNG_2_META(m) MK(MkExceptionC_Catch) (OT_Prefix_CALL m, NULL, __func__)
416#define OtErrorCheckLng(cmd) if (cmd != TCL_OK) return TCL_ERROR
417#define OtErrorCheckLngGoto(cmd) if (cmd != TCL_OK) goto error
418#define OtErrorCheckLngGoto1(cmd) if (cmd != TCL_OK) goto error1
419#define OtErrorCheckLngGoto2(cmd) if (cmd != TCL_OK) goto error2
421#define check_LNG(code) if ((code) != TCL_OK)
422#define check_NULL(code) if ((code) == NULL)
423#define check_META(code) if (MkErrorCheckI(code))
427#define OT_TMP_BOL_OBJ(val) BOL2VAL(val)
428#define OT_TMP_I8_OBJ(val) I82VAL(val)
429#define OT_TMP_I16_OBJ(val) I162VAL(val)
430#define OT_TMP_I32_OBJ(val) INT2VAL(val)
431#define OT_TMP_I64_OBJ(val) I642VAL(val)
432#define OT_TMP_FLT_OBJ(val) FLT2VAL(val)
433#define OT_TMP_DBL_OBJ(val) DBL2VAL(val)
434#define OT_TMP_BIN_OBJ(val,len) BIN2VAL(val,len)
435#define OT_TMP_STR_OBJ(val) STRN2VAL(val)
436#define OT_TMP_CST_OBJ(val) STRN2VAL(val)
448#define OT_OBJECT_DELETE_SOFT(O) error: done in AtomMetaDelete
451#define OT_OBJECT_DELETE_HARD(O) MK(AtomDeleteHard) (MK_RT_CALL interp,O)
454#define OT_OBJECT_DISPOSE(O) MK(AtomDispose) (MK_RT_CALL O)
455#define OT_OBJECT_DELETE(O) MK(AtomDeleteHard) (MK_RT_CALL interp, O)
457#define OT_REF_INCR(_obj) Tcl_IncrRefCount(_obj)
458#define OT_REF_DECR(_obj) Tcl_DecrRefCount(_obj)
459#define OT_REF_INCR_AND_RETURN(_obj) ({ Tcl_IncrRefCount(_obj); _obj;})
460#define OT_REF_DECR_AND_NULL(_obj) if (_obj) { Tcl_DecrRefCount (_obj) ; _obj = NULL; }
466#define SETUP_interp MK_UNUSED OT_ENV_T const interp = (OT_ENV_T const) MK_RT_REF.mkThreadData.ptr;
467#define SETUP_mqctx struct MqContextS * const mqctx = (struct MqContextS * const) hdl;
468#define SETUP_tclctx struct TclContextS * const tclctx = (struct TclContextS * const) hdl;
469#define SETUP_selfO OT_SELF_T selfO = OT_SELF_X(hdl);
470#define SETUP_selfX(x) OT_SELF_T selfO = OT_SELF_X(x);
472#define TCLCTX ((struct TclContextS * const)hdl)
473#define OT_SELF_O(o) ((OT_SELF_T)(*o).self)
474#define OT_SELF_X(x) OT_SELF_O(MkOBJ(x))
476#define OT_SELF_NAME_O(o) Tcl_GetObjectName(interp,OT_SELF_O(o))
477#define OT_SELF_CMD_O(o) Tcl_GetObjectCommand(OT_SELF_O(o))
479#define SetupHdlFromMetaData_init_2(_CLS,_SHORT) \
480 int __skip; OT_SELF_T selfO; _SHORT hdl; \
483 __skip = Tcl_ObjectContextSkippedArgs(objCtx); \
484 selfO = Tcl_ObjectContextObject(objCtx); \
485 hdl = OBJECT2##_CLS(selfO); \
490 hdl = (_SHORT) clientData; \
493#define SetupHdlFromMetaData_2(_CLS,_SHORT) \
494 SetupHdlFromMetaData_init_2(_CLS,_SHORT) \
497 OT_ERROR_LNG_RETURN_VAR_ERROR("'%s' hdl is NULL",OT_LNG_OBJ_CLASSNAME_SHORT(SELF2VAL(OT_SELF))); \
499 SetupRtFromHdl_XN(hdl); \
501#define SetupHdlFromMetaData__null_allow_2(_CLS,_SHORT) \
502 SetupHdlFromMetaData_init_2(_CLS,_SHORT) \
503 SetupRtFromHdl_X(hdl); \
507#define MkCallS_SIG 0x82335642
530#define MkProcResolve_maxArgsLen 16
538 assert(call != NULL);
539 assert(objcP != NULL);
540 assert(objv != NULL);
547 Tcl_ListObjGetElements(NULL,call->
args,&myobjc,&myobjv);
548 for (
int i=0; i<myobjc; i++) {
550 objv[objc++] = myobjv[i];
558 assert (dataP != NULL && *dataP != NULL);
576 MK(CallFree) (dataP);
579#ifdef META_HAS_THREAD
580 #define OT_OBJ_COPY(o) ({OT_OBJ_T t=(o); if (t) { t = Tcl_NewStringObj(Tcl_GetString(t),-1); OT_REF_INCR(t); }; t; })
582 #define OT_OBJ_COPY(o) ({OT_OBJ_T t=(o); if (t) { OT_REF_INCR(t); }; t; })
587 assert (dataP != NULL && *dataP != NULL);
603#define NO_OtCheckEnum
604#define NO_OtCheckEnumFlag
608#define OT_CHECK_ENUM(ename,val) \
609 if (__skip >= objc) {\
610 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
612 OtErrorCheckLngGoto(Get_ ## ename ## _FromObj_path (MK_RT_CALL interp,objv[__skip++],&val)); \
615#define OT_CHECK_ENUM_FLAG(ename,val) \
616 if (__skip >= objc) {\
617 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
619 OtErrorCheckLngGoto(Get_ ## ename ## _FromObj_path (MK_RT_CALL interp,objv[__skip++],&val)); \
627#define OT_CHECK_LNGTMPL(val,func) MkErrorC_CheckD (func(OT_Check_CALL(#val),&val));
629#define OT_CHECK_bool(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsBOOL))
630#define OT_CHECK_NB1(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsBOL))
631#define OT_CHECK_NI1(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsI8))
632#define OT_CHECK_NI2(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsI16))
633#define OT_CHECK_U2N(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsU16))
634#define OT_CHECK_NI4(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsI32))
635#define OT_CHECK_U4N(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsU32))
636#define OT_CHECK_NI8(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsI64))
637#define OT_CHECK_IXN(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsLLG))
638#define OT_CHECK_NF4(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsFLT))
639#define OT_CHECK_NF8(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsDBL))
640#define OT_CHECK_STRN(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsSTRN))
641#define OT_CHECK_NIL(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsLONG))
642#define OT_CHECK_NIH(val) MK_HDL_REF_S3(OT_CHECK_) (val)
644#define OT_CHECK_STRN_NULL(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsCSTNull))
647#define OT_CHECK_C_COPY(val,size) MkErrorC_CheckD (MK(Obj_AsSTR_COPY)(OT_Check_CALL(#val),val,size));
651#define OT_GET_CALL_PROC MK(Get_Call_Proc)(MK_RT_CALL interp,&frame)
652#define OT_GET_CALL_FILE MK(Get_Call_File)(MK_RT_CALL interp,&frame)
653#define OT_GET_CALL_LINE MK(Get_Call_Line)(MK_RT_CALL interp,&frame)
690#define WNA(min,max,txt) { \
692 if (objc<(__skip+min) || objc>(__skip+max)) { \
693 Tcl_WrongNumArgs (interp, __skip, objv, txt); \
729#define OT_VARFRAME_CREATE \
730 struct MkVarFrameS otVarFrame = {50, 0}; otVarFrame.data = otVarFrame.prealloc; \
731 OT_VARFRAME varframe = &otVarFrame;
733#define OT_VARFRAME_DELETE { \
734 for (int i=0; i<varframe->num; i++) Tcl_DecrRefCount(varframe->data[i]); \
738#define OT_VARFRAME_ARGS MK_RT_ARGS OT_VARFRAME varframe
739#define OT_VARFRAME_CALL MK_RT_CALL varframe
742 if (varframe != NULL) {
743 if (varframe->num >= varframe->max) {
745 if (varframe->data == varframe->prealloc) {
747 memcpy(tmp,varframe->data,(
size_t)varframe->max*
sizeof(
OT_OBJ_T));
751 varframe->data = tmp;
754 varframe->data[varframe->num++] = add;
755 Tcl_IncrRefCount(add);
760#define OT_VARFRAME_OBJ_RESULT(itp) MK(OT_VARFRAME_ADD)(OT_VARFRAME_CALL,Tcl_GetObjResult(itp))
787 for (i=0;i<objc;i++) Tcl_IncrRefCount(objv[i]);
788 ret = Tcl_EvalObjv (interp, objc, objv, flags);
789 for (i=0;i<objc;i++) Tcl_DecrRefCount(objv[i]);
832#define OT_NEW_Mk_enum_OBJ(typ,val) MK(Mk ## typ ## _ToString(val))
847#define Get_MkErrorE_FromObj_path MK(Get_MkErrorE_FromObj)
850#define Get_MkIdSE_FromObj_path MK(Get_MkIdSE_FromObj)
853#define Get_MkTimeoutE_FromObj_path MK(Get_MkTimeoutE_FromObj)
856#define Get_MkTypeE_FromObj_path MK(Get_MkTypeE_FromObj)
866#define PTR2VAL(nat) (OT_OBJ_T)(nat)
867#define SELF2VAL(slf) Tcl_GetObjectName(interp,slf)
868#define META2VAL_X(x) SELF2VAL(OT_SELF_X(x))
869#define META2VAL_O(o) SELF2VAL(OT_SELF_O(o))
871#define I82VAL(nat) Tcl_NewIntObj(nat)
872#define BOL2VAL(nat) Tcl_NewBooleanObj(nat)
873#define I162VAL(nat) Tcl_NewIntObj(nat)
874#define U162VAL(nat) Tcl_NewIntObj((int)nat)
875#define INT2VAL(nat) Tcl_NewIntObj(nat)
876#define I642VAL(nat) Tcl_NewWideIntObj(nat)
877#define HDL2VAL(nat) Tcl_NewIntObj(nat)
878#define LLG2VAL(nat) Tcl_NewWideIntObj(nat)
879#define FLT2VAL(nat) Tcl_NewDoubleObj(nat)
880#define DBL2VAL(nat) Tcl_NewDoubleObj(nat)
881#define STRN2VAL(nat) MK(STRN2VAL)(nat)
882#define BIN2VAL(ptr,len) Tcl_NewByteArrayObj((const unsigned char*)ptr,(int)len)
883#define STR2VAL(ptr,len) Tcl_NewStringObj((const char*)ptr,(int)len)
884#define LONG2VAL(nat) Tcl_NewLongObj(nat)
886#define VAL2STR(obj) Tcl_GetString(obj)
887#define VAL2SELF(obj) Tcl_GetObjectFromObj(interp,obj)
889#define SELF2MNG(slf) Tcl_ObjectGetMetadata(slf, &MK(AtomMeta))
896 return RG(MK_NULL_OBJ);
898 return Tcl_NewStringObj(val,-1);
909#ifdef OT_SHARED_IS_DLL
910# define OT_TCL_EXTERN __declspec(dllexport)
912# define OT_TCL_EXTERN __attribute__ ((visibility("default")))
921#define OT_TMP_BAC_OBJ(val) MK(MkBufferListC_ObjNew) (MK_RT_CALL interp,val)
928 #define MkBufferListC_lngO MK(MkBufferListC)
934 #define OT_retObj_SET_BFL(nat) retObj = MK(MkBufferListC_ObjNew) (MK_RT_CALL interp,nat)
936 #define OT_TMP_BFL_OBJ(val) MK(MkBufferListC_ObjNew) (MK_RT_CALL interp,val)
946 #define MkBufferC_lngO MK(MkBufferC)
952 #define OT_retObj_SET_BUF(nat) retObj = MK(MkBufferC_ObjNew) (MK_RT_CALL interp,nat)
954 #define OT_TMP_BUF_OBJ(val) MK(MkBufferC_ObjNew) (MK_RT_CALL interp,val)
964 #define MkBufferStreamC_lngO MK(MkBufferStreamC)
970 #define OT_retObj_SET_BUS(nat) retObj = MK(MkBufferStreamC_ObjNew) (MK_RT_CALL interp,nat)
972 #define OT_TMP_BUS_OBJ(val) MK(MkBufferStreamC_ObjNew) (MK_RT_CALL interp,val)
982 #define MkErrorC_lngO MK(MkErrorC)
988 #define OT_retObj_SET_ERR(nat) retObj = MK(MkErrorC_ObjNew) (MK_RT_CALL interp,nat)
990 #define OT_TMP_ERR_OBJ(val) MK(MkErrorC_ObjNew) (MK_RT_CALL interp,val)
1000 #define MkLogFileC_lngO MK(MkLogFileC)
1006 #define OT_retObj_SET_LFL(nat) retObj = MK(MkLogFileC_ObjNew) (MK_RT_CALL interp,nat)
1008 #define OT_TMP_LFL_OBJ(val) MK(MkLogFileC_ObjNew) (MK_RT_CALL interp,val)
1018 #define MkObjectC_lngO MK(MkObjectC)
1024 #define OT_retObj_SET_OBJ(nat) retObj = MK(MkObjectC_ObjNew) (MK_RT_CALL interp,nat)
1026 #define OT_TMP_OBJ_OBJ(val) MK(MkObjectC_ObjNew) (MK_RT_CALL interp,val)
1036 #define MkRuntimeC_lngO MK(MkRuntimeC)
1042 #define OT_retObj_SET_RT(nat) retObj = MK(MkRuntimeC_ObjNew) (MK_RT_CALL interp,nat)
1044 #define OT_TMP_RT_OBJ(val) MK(MkRuntimeC_ObjNew) (MK_RT_CALL interp,val)
1059#define ME_REF_MkBinaryR MkBinaryR
1060#define OT_GET__ME_REF_MkBinaryR(b) BIN2VAL(b.data,b.size)
1061#define VAL2MkBinaryR(obj) \
1062 ({int size;unsigned char * bin =Tcl_GetByteArrayFromObj(obj,&size);MkBinaryCreate(size,bin);})
1063#define OT_CHECK__ME_REF_MkBinaryR(val) \
1064 if (__skip >= objc) { \
1065 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
1067 val = VAL2MkBinaryR(objv[__skip++]); \
1070#define ME_REF_MkStringR MkStringR
1071#define OT_GET__ME_REF_MkStringR(s) STR2VAL(s.ptr,s.len)
1072#define VAL2MkStringR(obj) \
1073 ({int len;char * str =Tcl_GetStringFromObj(obj,&len);MkStringCreate(len,str);})
1074#define OT_CHECK__ME_REF_MkStringR(val) \
1075 if (__skip >= objc) { \
1076 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
1078 val = VAL2MkStringR(objv[__skip++]); \
1084 char*
str = Tcl_GetStringFromObj(tclO,&len);
1095#define ot_fixstr(_s) _s,strlen(_s)
1096#define ot_fixstrobj(_s) Tcl_NewStringObj(_s,strlen(_s))
1097#define ot_enum_append(_o,_s) Tcl_ListObjAppendElement(NULL,_o,ot_fixstrobj(_s))
1107#define printLng(var) printV(#var" = '%s' [ref=%i]",(var?VAL2STR(var):"NULL"),(var)?(var)->refCount:-1)
1108#define printXLng(x,var) printXV(x,#var" = '%s' [ref=%i]",(var?VAL2STR(var):"NULL"),(var)?(var)->refCount:-1)
1109#define printLngObj(var) if (var) {printTxt(MK(PrintLngObj)(OT_Prefix_CALL #var,var))} else {printTxt(#var "=NULL")}
1110#define printXLngObj(x,var) if (var) {printXC2(x,MK(PrintLngObj)(OT_Prefix_CALL #var,var))} else {printTxt(#var "=NULL")}
1111#define printLLngObj(var) if (var) {printXC2(META_CONTEXT_S,MK(PrintLngObj)(OT_Prefix_CALL #var,var))} else {printTxt(#var "=NULL")}
1113#define printLngErrorCode() do { \
1114 OT_OBJ_T errorCode = Tcl_GetVar2Ex (interp, "errorCode", NULL, TCL_GLOBAL_ONLY); \
1115 printLngObj(errorCode); \
1118#define printLngErrorInfo() do { \
1119 OT_OBJ_T errorInfo = Tcl_GetVar2Ex (interp, "errorInfo", NULL, TCL_GLOBAL_ONLY); \
1120 printLngObj(errorInfo); \
1123#define printObjv printV( "__skip=%i, objc=%i",__skip,objc) ; printAry3( " ",objc,objv)
1124#define printXObjv(x) printXV(x,"__skip=%i, objc=%i",__skip,objc) ; printXAry4(x, " ",objc,objv)
1126#define printAry(c,o) printAry3(#o,c,o)
1127#define printAryDetail(c,o) for(int i=0;i<c;i++) { printLngObj(o[i]) }
1129#define printXAry(x,pre,c,o) printXAry4(x,"",c,o)
1130#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"); }
1131#define printXAryDetail(x,c,o) for(int i=0;i<c;i++) { printXLngObj(x,o[i]) }
1133#define printAry3(txt, c,o) do { \
1134 mk_dbg_Z_start(512,MK_COLOR_BLUE "%s : ",txt); \
1135 for(int i=0;i<c;i++) { \
1136 mk_dbg_Z_next(MK_COLOR_YELLOW "[%d:%p]" MK_COLOR_RESET "='%s' ",i,o[i],o[i]?Tcl_GetString(o[i]):"NULL"); \
1141#define printAryX(x,t,c,o) \
1142 printXV(x, "%-15s = ",t); \
1143 for(int i=0;i<c;i++) { \
1144 fprintf(stderr, "'%s' ",o[i]?Tcl_GetString(o[i]):"NULL"); \
1146 fputc('\n', stderr);
1148#define printAryL(t,c,o) printAryX(META_CONTEXT_S,t,c,o) \
1150#define xstr(s) str(s)
1153#define printLngClass(clsC) printV(#clsC " name = %s\n", OT_LNG_NAME_FROM_CLASS(clsC))
1154#define printLngObject(objO) printV(#objO " name = %s\n", OT_LNG_NAME_FROM_OBJECT(objO))
1167 #define __doc "AtomObjNew"
1170 assert(obj != NULL);
1189 ClientData meta = Tcl_ObjectGetMetadata(
object,&
MK(AtomMeta));
1192 if (meta != (ClientData)obj) {
1194 MkDLogV_O(obj, 3,
"WARNING: REBORN object[%s] REPLACE meta[%p -> %p]\n", \
1197 MkDLogV_O(obj, 6,
"INFO: BORN object[%s] with NEW meta[%p]\n", \
1200 Tcl_ObjectSetMetadata(
object,&
MK(AtomMeta),(ClientData)obj);
1204 MkDLogV_O(obj, 3,
"WARNING: REBORN object[%s] with SAME meta[%p]\n", \
1207 Tcl_ObjectSetMetadata(
object,&
MK(AtomMeta),(ClientData)obj);
1224 char nameBuf[
BUFLEN+1] = {0};
1228 retLen = snprintf(nameBuf,
BUFLEN,
"%s::<%s-%p>",ns?ns:
"",obj->type->type_name,obj);
1231 retLen = snprintf(nameBuf,
BUFLEN,
"%s::<UNKNOWN>",ns?ns:
"");
1234 retLen = snprintf(nameBuf,
BUFLEN,
"%s::%s",ns?ns:
"",name);
1249 if (obj && Tcl_GetCommandFromObj(interp, nameObj) != NULL) {
1250 object = Tcl_GetObjectFromObj(interp,nameObj);
1253 if (object_hdl == obj) {
1261 if (obj->self == NULL && obj->obj_protect.isLocal)
1262 MkPanicV_2(obj,
"reuse tcl-command<%s> with mq-obj<%p>", name, object_hdl);
1265 MkLogV_2(object_hdl,
"MANIPULATION WARNING[%s]: found tcl-command<%s> with wrong mq-obj<%p>\n",
1274 object = Tcl_NewObjectInstance(interp,
class, name, name, -1, NULL, 0);
1284 if (nameObj) Tcl_DecrRefCount(nameObj);
1292 assert(interp!=NULL || selfO!=NULL);
1293 if (Tcl_InterpDeleted(interp) || Tcl_ObjectDeleted(selfO))
return false;
1294 check_LNG(Tcl_DeleteCommandFromToken (interp, Tcl_GetObjectCommand(selfO))) {
1304 assert(interp!=NULL || selfO!=NULL);
1305 Tcl_ObjectSetMetadata(selfO,&
MK(AtomMeta),NULL);
1312 assert(selfO!=NULL);
1320 Tcl_ObjectSetMetadata(selfO,&
MK(AtomMeta),NULL);
#define OT_ERROR_ABNORMAL(mng)
#define OT_LNG_NAME_FROM_CLASS(_cls)
static MkStringR Ot_GetStringFromObj(OT_OBJ_T tclO)
#define OT_LNG_FULLNAME_FROM_OBJECT(_obj)
#define MK_TCL_EXTERN
static library
struct MkVarFrameS * OT_VARFRAME
int(* LookupClassF)(SKIP_ARGS)
#define OT_REF_DECR_AND_NULL(_obj)
#define OT_REF_INCR(_obj)
#define MK_TCL_EXTERN_DATA
#define MkBufferListC_ARGS
#define MkErrorC_Check(mng, PROC)
OT_ProcRet NS MkBufferC_ToObject(MkBufferC_ARGS)
OT_ProcRet MK MkBufferListC_ToList(MkBufferListC_ARGS)
#define MkBufferC_X2obj(x)
#define MkBufferListC_type
#define MkBufferListC_X2obj(x)
#define MkBufferStreamC_type
#define MkBufferStreamC_X2obj(x)
#define MkErrorC_X2obj(x)
#define MkPanicV_2(fmtobj, printfmt,...)
MK_STRN MkTimeoutE_ToString(enum MkTimeoutE value)
MK_STRN MkIdSE_ToString(enum MkIdSE value)
MK_STRN MkTypeE_ToString(enum MkTypeE value)
MK_STRN MkErrorE_ToString(enum MkErrorE value)
static MkStringR MkStringCreate(MK_NUM len, MK_STRN str)
#define MkLogFileC_X2obj(x)
struct MkObjectS * MK_OBJ
#define MkObjectC_X2obj(x)
static MK_OBJ MkObj(MK_MNG mng)
#define MkLogV_1(printfmt,...)
#define MkDLogV_O(fmtobj, _debug, printfmt,...)
#define MkLogV_2(fmtobj, printfmt,...)
#define MkRefDecrWithoutSelf(...)
static void MkRefIncrSelf(MK_OBJ const obj, MK_PTR const self, MK_PTR const env)
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_X2obj(x)
mk_misc_ObjAs_lng.h - 13 Feb 2025 - aotto1968
mk_misc_check_lng.h - 21 Feb 2025 - aotto1968
bool MK TestObject(OT_Prefix_ARGS OT_OBJ_T lngO, OT_CLS_T typeO, MK_OBJ *objP, MkTestClassE *flagP)
mk_type_S_lng.h - 10 Apr 2025 - aotto1968
Tcl_ObjCmdProc * callProc
Tcl_CmdDeleteProc * deleteProc
const Tcl_MethodType * list