14#include "LibMkKernel_mk.h"
18#if !defined(META_FILE_NAME)
19 #define META_FILE_NAME (__builtin_strrchr(__FILE__, '/') ? __builtin_strrchr(__FILE__, '/') + 1 : __FILE__)
38#if defined(META_IGNORE_EXTERN)
42# if defined(DLL_EXPORT)
44# if defined(MK_TCL_BUILD_DLL)
45# define MK_TCL_EXTERN __declspec(dllexport)
47# define MK_TCL_EXTERN __declspec(dllimport)
51# define MK_TCL_EXTERN __attribute__ ((visibility("default")))
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
66# if defined(DLL_EXPORT)
68# if defined(MK_TCL_BUILD_DLL)
69# define MK_TCL_EXTERN_DATA __declspec(dllexport)
71# define MK_TCL_EXTERN_DATA __declspec(dllimport)
75# define MK_TCL_EXTERN_DATA __attribute__ ((visibility("default"))) extern
78# define MK_TCL_EXTERN_DATA extern
82#define MK(n) tclmkkernel_ ## n
84#define NS(n) tclmkkernel_ ## n
88#define META_CONTEXT_S hdl
92#define TCL_ARGS OT_ENV_T interp, int objc, OT_OBJ_T const *objv
93#define TCL_ARGS_CALL interp, objc, objv
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
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
102#define CONSTR_ARGS OBJECT_ARGS
104#define SKIP_ARGS TCL_ARGS, int __skip
105#define SKIP_ARGS_CALL TCL_ARGS_CALL, __skip
107#define OtClass_ARGS OBJECT_ARGS
108#define OtClass_ARGS_CALL OBJECT_ARGS_CALL
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
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; \
138#define OT_FRAME_CLEANUP if (frame != NULL) { Tcl_DecrRefCount(frame); frame = NULL; }
140#define OT_SETUP_VARARGS(min,max,d) \
141 OT_SETUP_ARGS_ALL(d); \
142 OT_CHECK_NUM_ARGS(min,max);
144#define OT_SETUP_CONSTRUCTOR_ARGS(...) OT_SETUP_VARARGS(__VA_ARGS__)
146#define OT_SETUP_ONEARG(d) \
147 OT_SETUP_ARGS_ALL(d); \
148 OT_CHECK_NUM_ARGS(1,1);
150#define OT_SETUP_NOARG(d) \
151 OT_SETUP_ARGS_ALL(d); \
152 OT_CHECK_NUM_ARGS(0,0);
155#define OT_SETUP_obj MK_OBJ obj = OBJ;
156#define OT_SETUP_doc __attribute__((unused)) const MK_STRN __doc = __func__;
158#define SETUP_ARGS MK_RT_ARGS TCL_ARGS
159#define SETUP_ARGS_CALL MK_RT_CALL TCL_ARGS_CALL
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)
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; \
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); \
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);
216#define OT_MK_CALL_0_v1
219#define OT_MK_CALL_0(hdl,cls,meth,ret) \
221 ret =
MK(EvalObjvVR)(NULL,interp,0,
MK(cls##_ObjNew)(interp,hdl),
MK(cls##_##meth##_Obj),NULL);
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); \
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); \
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))
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)
260#define OT_LNG_NAME_CLASS_FROM_CONTEXT(ox) \
261 OT_LNG_NAME_FROM_CLASS(Tcl_MethodDeclarerClass(Tcl_ObjectContextMethod(ox)))
263#define OT_LNG_OBJV(__skip) objv[__skip]
265#define OT_OBJ_TO_CLASS(str) str
266#define OT_OBJ_TO_ENUM(str) #str
268#define OT_LNG_SET_VAR(var,val) \
269 if (Tcl_ObjSetVar2(interp, var, NULL, val, TCL_LEAVE_ERR_MSG) == NULL) goto error
273#define OT_REGISTRY_AS_TLS
275#define RG(_key) MK(reggv)[MK(_key)]
276#ifdef OT_REGISTRY_AS_TLS
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"
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);
305#define OT_ERROR_LNG_RETURN return TCL_ERROR
307#define OT_ERROR_TYPE(str) \
308 Tcl_SetObjResult(interp, Tcl_ObjPrintf("TYPE ERROR: %s", str));
310#define OT_ERROR_SOFT_CONSTRUCTOR(class) { \
311 Tcl_SetResult(interp, "InitSoftError: '" #class "' soft constructor return 'NULL' pointer", TCL_STATIC); \
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); \
323#define OT_ERROR_NUMARGS(...) \
324 MkErrorC_CheckD(WrongNumArgs(__VA_ARGS__))
326#define OT_ERROR_ABNORMAL(mng) { \
327 MkErrorSetV_4M(mng,__func__,999,"AbnormalError: %s", Tcl_GetStringResult(interp));\
328 Tcl_ResetResult(interp); \
332#define OT_ERROR_LNG_RETURN_HDL_NAT_NULL(_hdl) { \
333 Tcl_SetResult(interp, "NatIsNullError : ", TCL_STATIC); \
334 Tcl_AppendResult(interp, MkObjectToString(_hdl)); \
338#define OT_ERROR_VAR_DEFAULT(...) Tcl_SetObjResult(interp,Tcl_ObjPrintf(__VA_ARGS__));
340#define OT_ERROR_LNG_RETURN_VAR_ERROR(...) return ({ OT_ERROR_VAR_DEFAULT(__VA_ARGS__); TCL_ERROR; })
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
351#define OT_CHECK_OPTIONAL(val) if (__skip < objc) {val}
352#define OT_CHECK_REQUIRED(val) val
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, ""); \
360#define OT_CHECK_NOARGS \
361 if (__skip != objc) { \
362 OT_ERROR_NUMARGS(hdl,objc, __skip, -999, +999, ""); \
365#define OT_GET_CONSTR_NAME(ctor) VAL2STR(ctor)
369#define OT_CHECK_BNP(val,len) \
370 if (__skip >= objc) { \
371 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
374 val = (MK_BINN) Tcl_GetByteArrayFromObj(objv[__skip++], &i); \
378#define OT_CHECK_BCP(val) \
379 if (__skip >= objc) { \
380 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
382 val = (MK_BIN) Tcl_GetByteArrayFromObj(objv[__skip++], NULL); \
385#define OT_CHECK_BCPN(val) \
386 if (__skip >= objc) { \
387 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
389 val = (MK_BINN) Tcl_GetByteArrayFromObj(objv[__skip++], NULL); \
400#define MkErrorC_Check(mng,PROC) \
401 if (unlikely(MkErrorCheckI(PROC))) { \
402 OT_ERROR_META_2_LNG(mng); goto error; \
405#define MkErrorC_CheckD(PROC) \
406 if (unlikely(MkErrorCheckI(PROC))) { \
407 OT_ERROR_META_2_LNG(hdl); goto error; \
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__)
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
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))
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)
445#define OT_OBJECT_DELETE_SOFT(O) error: done in AtomMetaDelete
448#define OT_OBJECT_DELETE_HARD(O) MK(AtomDeleteHard) (MK_RT_CALL interp,O)
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)
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; }
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);
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))
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))
476#define SetupHdlFromMetaData_init_2(_CLS,_SHORT) \
477 int __skip; OT_SELF_T selfO; _SHORT hdl; \
480 __skip = Tcl_ObjectContextSkippedArgs(objCtx); \
481 selfO = Tcl_ObjectContextObject(objCtx); \
482 hdl = OBJECT2##_CLS(selfO); \
487 hdl = (_SHORT) clientData; \
490#define SetupHdlFromMetaData_2(_CLS,_SHORT) \
491 SetupHdlFromMetaData_init_2(_CLS,_SHORT) \
494 OT_ERROR_LNG_RETURN_VAR_ERROR("'%s' hdl is NULL",OT_LNG_OBJ_CLASSNAME_SHORT(SELF2VAL(OT_SELF))); \
496 SetupRtFromHdl_XN(hdl); \
498#define SetupHdlFromMetaData__null_allow_2(_CLS,_SHORT) \
499 SetupHdlFromMetaData_init_2(_CLS,_SHORT) \
500 SetupRtFromHdl_X(hdl); \
504#define MkCallS_SIG 0x82335642
527#define MkProcResolve_maxArgsLen 16
535 assert(call != NULL);
536 assert(objcP != NULL);
537 assert(objv != NULL);
544 Tcl_ListObjGetElements(NULL,call->
args,&myobjc,&myobjv);
545 for (
int i=0; i<myobjc; i++) {
547 objv[objc++] = myobjv[i];
555 assert (dataP != NULL && *dataP != NULL);
573 MK(CallFree) (dataP);
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; })
579 #define OT_OBJ_COPY(o) ({OT_OBJ_T t=(o); if (t) { OT_REF_INCR(t); }; t; })
584 assert (dataP != NULL && *dataP != NULL);
600#define NO_OtCheckEnum
601#define NO_OtCheckEnumFlag
605#define OT_CHECK_ENUM(ename,val) \
606 if (__skip >= objc) {\
607 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
609 OtErrorCheckLngGoto(Get_ ## ename ## _FromObj_path (MK_RT_CALL interp,objv[__skip++],&val)); \
612#define OT_CHECK_ENUM_FLAG(ename,val) \
613 if (__skip >= objc) {\
614 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
616 OtErrorCheckLngGoto(Get_ ## ename ## _FromObj_path (MK_RT_CALL interp,objv[__skip++],&val)); \
624#define OT_CHECK_LNGTMPL(val,func) MkErrorC_CheckD (func(OT_Check_CALL(#val),&val));
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)
641#define OT_CHECK_STRN_NULL(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsCSTNull))
644#define OT_CHECK_C_COPY(val,size) MkErrorC_CheckD (MK(Obj_AsSTR_COPY)(OT_Check_CALL(#val),val,size));
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)
687#define WNA(min,max,txt) { \
689 if (objc<(__skip+min) || objc>(__skip+max)) { \
690 Tcl_WrongNumArgs (interp, __skip, objv, txt); \
726#define OT_VARFRAME_CREATE \
727 struct MkVarFrameS otVarFrame = {50, 0}; otVarFrame.data = otVarFrame.prealloc; \
728 OT_VARFRAME varframe = &otVarFrame;
730#define OT_VARFRAME_DELETE { \
731 for (int i=0; i<varframe->num; i++) Tcl_DecrRefCount(varframe->data[i]); \
735#define OT_VARFRAME_ARGS MK_RT_ARGS OT_VARFRAME varframe
736#define OT_VARFRAME_CALL MK_RT_CALL varframe
739 if (varframe != NULL) {
740 if (varframe->num >= varframe->max) {
742 if (varframe->data == varframe->prealloc) {
744 memcpy(tmp,varframe->data,(
size_t)varframe->max*
sizeof(
OT_OBJ_T));
748 varframe->data = tmp;
751 varframe->data[varframe->num++] = add;
752 Tcl_IncrRefCount(add);
757#define OT_VARFRAME_OBJ_RESULT(itp) MK(OT_VARFRAME_ADD)(OT_VARFRAME_CALL,Tcl_GetObjResult(itp))
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]);
829#define OT_NEW_Mk_enum_OBJ(typ,val) MK(Mk ## typ ## _ToString(val))
844#define Get_MkErrorE_FromObj_path MK(Get_MkErrorE_FromObj)
847#define Get_MkIdSE_FromObj_path MK(Get_MkIdSE_FromObj)
850#define Get_MkTimeoutE_FromObj_path MK(Get_MkTimeoutE_FromObj)
853#define Get_MkTypeE_FromObj_path MK(Get_MkTypeE_FromObj)
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))
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)
883#define VAL2STR(obj) Tcl_GetString(obj)
884#define VAL2SELF(obj) Tcl_GetObjectFromObj(interp,obj)
886#define SELF2MNG(slf) Tcl_ObjectGetMetadata(slf, &MK(AtomMeta))
893 return RG(MK_NULL_OBJ);
895 return Tcl_NewStringObj(val,-1);
906#ifdef OT_SHARED_IS_DLL
907# define OT_TCL_EXTERN __declspec(dllexport)
909# define OT_TCL_EXTERN __attribute__ ((visibility("default")))
918#define OT_TMP_BAC_OBJ(val) MK(MkBufferListC_ObjNew) (MK_RT_CALL interp,val)
925 #define MkBufferListC_lngO MK(MkBufferListC)
931 #define OT_retObj_SET_BFL(nat) retObj = MK(MkBufferListC_ObjNew) (MK_RT_CALL interp,nat)
933 #define OT_TMP_BFL_OBJ(val) MK(MkBufferListC_ObjNew) (MK_RT_CALL interp,val)
943 #define MkBufferC_lngO MK(MkBufferC)
949 #define OT_retObj_SET_BUF(nat) retObj = MK(MkBufferC_ObjNew) (MK_RT_CALL interp,nat)
951 #define OT_TMP_BUF_OBJ(val) MK(MkBufferC_ObjNew) (MK_RT_CALL interp,val)
961 #define MkBufferStreamC_lngO MK(MkBufferStreamC)
967 #define OT_retObj_SET_BUS(nat) retObj = MK(MkBufferStreamC_ObjNew) (MK_RT_CALL interp,nat)
969 #define OT_TMP_BUS_OBJ(val) MK(MkBufferStreamC_ObjNew) (MK_RT_CALL interp,val)
979 #define MkErrorC_lngO MK(MkErrorC)
985 #define OT_retObj_SET_ERR(nat) retObj = MK(MkErrorC_ObjNew) (MK_RT_CALL interp,nat)
987 #define OT_TMP_ERR_OBJ(val) MK(MkErrorC_ObjNew) (MK_RT_CALL interp,val)
997 #define MkLogFileC_lngO MK(MkLogFileC)
1003 #define OT_retObj_SET_LFL(nat) retObj = MK(MkLogFileC_ObjNew) (MK_RT_CALL interp,nat)
1005 #define OT_TMP_LFL_OBJ(val) MK(MkLogFileC_ObjNew) (MK_RT_CALL interp,val)
1015 #define MkObjectC_lngO MK(MkObjectC)
1021 #define OT_retObj_SET_OBJ(nat) retObj = MK(MkObjectC_ObjNew) (MK_RT_CALL interp,nat)
1023 #define OT_TMP_OBJ_OBJ(val) MK(MkObjectC_ObjNew) (MK_RT_CALL interp,val)
1033 #define MkRuntimeC_lngO MK(MkRuntimeC)
1039 #define OT_retObj_SET_RT(nat) retObj = MK(MkRuntimeC_ObjNew) (MK_RT_CALL interp,nat)
1041 #define OT_TMP_RT_OBJ(val) MK(MkRuntimeC_ObjNew) (MK_RT_CALL interp,val)
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); \
1064 val = VAL2MkBinaryR(objv[__skip++]); \
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); \
1075 val = VAL2MkStringR(objv[__skip++]); \
1081 char*
str = Tcl_GetStringFromObj(tclO,&len);
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))
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")}
1110#define printLngErrorCode() do { \
1111 OT_OBJ_T errorCode = Tcl_GetVar2Ex (interp, "errorCode", NULL, TCL_GLOBAL_ONLY); \
1112 printLngObj(errorCode); \
1115#define printLngErrorInfo() do { \
1116 OT_OBJ_T errorInfo = Tcl_GetVar2Ex (interp, "errorInfo", NULL, TCL_GLOBAL_ONLY); \
1117 printLngObj(errorInfo); \
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)
1123#define printAry(c,o) printAry3(#o,c,o)
1124#define printAryDetail(c,o) for(int i=0;i<c;i++) { printLngObj(o[i]) }
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]) }
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"); \
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"); \
1143 fputc('\n', stderr);
1145#define printAryL(t,c,o) printAryX(META_CONTEXT_S,t,c,o) \
1147#define xstr(s) str(s)
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))
1164 #define __doc "AtomObjNew"
1167 assert(obj != NULL);
1186 ClientData meta = Tcl_ObjectGetMetadata(
object,&
MK(AtomMeta));
1189 if (meta != (ClientData)obj) {
1191 MkDLogV_O(obj, 3,
"WARNING: REBORN object[%s] REPLACE meta[%p -> %p]\n", \
1194 MkDLogV_O(obj, 6,
"INFO: BORN object[%s] with NEW meta[%p]\n", \
1197 Tcl_ObjectSetMetadata(
object,&
MK(AtomMeta),(ClientData)obj);
1201 MkDLogV_O(obj, 3,
"WARNING: REBORN object[%s] with SAME meta[%p]\n", \
1204 Tcl_ObjectSetMetadata(
object,&
MK(AtomMeta),(ClientData)obj);
1221 char nameBuf[
BUFLEN+1] = {0};
1225 retLen = snprintf(nameBuf,
BUFLEN,
"%s::<%s-%p>",ns?ns:
"",obj->type->type_name,obj);
1228 retLen = snprintf(nameBuf,
BUFLEN,
"%s::<UNKNOWN>",ns?ns:
"");
1231 retLen = snprintf(nameBuf,
BUFLEN,
"%s::%s",ns?ns:
"",name);
1246 if (obj && Tcl_GetCommandFromObj(interp, nameObj) != NULL) {
1247 object = Tcl_GetObjectFromObj(interp,nameObj);
1250 if (object_hdl == 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);
1262 MkLogV_2(object_hdl,
"MANIPULATION WARNING[%s]: found tcl-command<%s> with wrong mq-obj<%p>\n",
1271 object = Tcl_NewObjectInstance(interp,
class, name, name, -1, NULL, 0);
1281 if (nameObj) Tcl_DecrRefCount(nameObj);
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))) {
1301 assert(interp!=NULL || selfO!=NULL);
1302 Tcl_ObjectSetMetadata(selfO,&
MK(AtomMeta),NULL);
1309 assert(selfO!=NULL);
1317 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)
bool MK TestObject(OT_Prefix_ARGS OT_OBJ_T lngO, OT_CLS_T typeO, MK_OBJ *objP, MkTestClassE *flagP)
Tcl_ObjCmdProc * callProc
Tcl_CmdDeleteProc * deleteProc
const Tcl_MethodType * list