11#include "libmyoox_mox.h"
16#if !defined(META_FILE_NAME)
17 #define META_FILE_NAME (__builtin_strrchr(__FILE__, '/') ? __builtin_strrchr(__FILE__, '/') + 1 : __FILE__)
21 #define OT_DEBUG_NAMESPACE_DELETE(c,...) do { \
22 mk_dbg_color_ln(c, "delete namespace %-3s : " __VA_ARGS__); \
26 #define OT_DEBUG_NAMESPACE_DELETE(...)
45#if defined(META_IGNORE_EXTERN)
49# if defined(DLL_EXPORT)
51# if defined(MK_ATL_BUILD_DLL)
52# define MK_ATL_EXTERN __declspec(dllexport)
54# define MK_ATL_EXTERN __declspec(dllimport)
58# define MK_ATL_EXTERN __attribute__ ((visibility("default")))
66#undef MK_ATL_EXTERN_DATA
67#if defined(META_PRIVATE)
68# define MK_ATL_EXTERN_DATA extern
69#elif defined(META_IGNORE_EXTERN)
70# define MK_ATL_EXTERN_DATA extern
73# if defined(DLL_EXPORT)
75# if defined(MK_ATL_BUILD_DLL)
76# define MK_ATL_EXTERN_DATA __declspec(dllexport)
78# define MK_ATL_EXTERN_DATA __declspec(dllimport)
82# define MK_ATL_EXTERN_DATA __attribute__ ((visibility("default"))) extern
85# define MK_ATL_EXTERN_DATA extern
89#define MK(n) atlmkkernel_ ## n
91#define NS(n) atlmkkernel_ ## n
95#define META_CONTEXT_S hdl
99#define ATL_OBJV_ARGS int objc, OT_OBJ_T const objv[]
100#define ATL_OBJV_ARGS_CALL objc, objv
102#define ATL_ARGS OT_ENV_T interp, int objc, OT_OBJ_T const objv[]
103#define ATL_ARGS_CALL interp, objc, objv
105#define OBJECT_ARGS ClientData clientData, ATL_ARGS
106#define OBJECT_ARGS_CALL hdl, ATL_ARGS_CALL
108#define OBJCMD_ARGS ClientData clientData, ATL_ARGS
109#define OBJCMD_ARGS_CALL clientData, ATL_ARGS_CALL
111#define CONSTR_ARGS OBJECT_ARGS
113#define SKIP_ARGS ATL_ARGS, int __skip
114#define SKIP_ARGS_CALL ATL_ARGS_CALL, __skip
116#define OtClass_ARGS OBJECT_ARGS
117#define OtClass_ARGS_CALL OBJECT_ARGS_CALL
123#define MkBufferListC_ARGS OBJECT_ARGS
124#define MkBufferListC_ARGS_CALL OBJECT_ARGS_CALL
125#define MkBufferC_ARGS OBJECT_ARGS
126#define MkBufferC_ARGS_CALL OBJECT_ARGS_CALL
127#define MkBufferStreamC_ARGS OBJECT_ARGS
128#define MkBufferStreamC_ARGS_CALL OBJECT_ARGS_CALL
129#define MkErrorC_ARGS OBJECT_ARGS
130#define MkErrorC_ARGS_CALL OBJECT_ARGS_CALL
131#define MkLogFileC_ARGS OBJECT_ARGS
132#define MkLogFileC_ARGS_CALL OBJECT_ARGS_CALL
133#define MkObjectC_ARGS OBJECT_ARGS
134#define MkObjectC_ARGS_CALL OBJECT_ARGS_CALL
135#define MkRuntimeC_ARGS OBJECT_ARGS
136#define MkRuntimeC_ARGS_CALL OBJECT_ARGS_CALL
142#define OT_SETUP_ARGS_ALL(d) \
143 OT_OBJ_T retObj=NULL; \
144 MK_UNUSED static const MK_STRN __doc=d; \
145 MK_UNUSED OT_OBJ_T frame=NULL; \
147#define OT_FRAME_CLEANUP if (frame != NULL) { Tcl_DecrRefCount(frame); frame = NULL; }
149#define OT_SETUP_VARARGS(min,max,d) \
150 OT_SETUP_ARGS_ALL(d) \
151 OT_CHECK_NUM_ARGS(min,max)
153#define OT_SETUP_CONSTRUCTOR_ARGS(...) OT_SETUP_VARARGS(__VA_ARGS__)
155#define OT_SETUP_ONEARG(d) \
156 OT_SETUP_ARGS_ALL(d) \
157 OT_CHECK_NUM_ARGS(1,1)
159#define OT_SETUP_NOARG(d) \
160 OT_SETUP_ARGS_ALL(d) \
161 OT_CHECK_NUM_ARGS(0,0)
163#define OT_SETUP_obj MK_OBJ obj = OBJ
164#define OT_SETUP_doc __attribute__((unused)) const MK_STRN __doc = __func__;
166#define SETUP_ARGS MK_RT_ARGS ATL_ARGS
167#define SETUP_ARGS_CALL MK_RT_CALL ATL_ARGS_CALL
170#define OT_CONSTRUCTOR_POST(x)
172#define OT_retObj_SET(val) retObj = (val)
173#define OT_retObj_SET_isPtr ((long)retObj) > 0x1
174#define OT_retObj_SET_None retObj = ((OT_OBJ_T)0x1)
175#define OT_retObj_SET_isNone ((long)retObj) == 0x1
176#define OT_retObj_SET_Error retObj = NULL
178#define OT_retObj_SET_List retObj = Tcl_NewListObj(0,NULL)
179#define OT_retObj_APPEND(var) check_LNG(Tcl_ListObjAppendElement(interp,retObj,var)) goto error
180#define OT_retObj_RETURN do { \
181 if (OT_retObj_SET_isPtr) { \
182 Tcl_SetObjResult(interp,retObj); \
184 } else if (OT_retObj_SET_isNone) { \
185 Tcl_ResetResult(interp); \
192#define OT_retObj_SET_BOL(nat) retObj = BOL2VAL(nat);
193#define OT_retObj_SET_I8(nat) retObj = I82VAL(nat);
194#define OT_retObj_SET_I16(nat) retObj = I162VAL(nat);
195#define OT_retObj_SET_U16(nat) retObj = U162VAL(nat);
196#define OT_retObj_SET_I32(nat) retObj = INT2VAL(nat);
197#define OT_retObj_SET_I64(nat) retObj = I642VAL(nat);
198#define OT_retObj_SET_LLG(nat) retObj = LLG2VAL(nat);
199#define OT_retObj_SET_FLT(nat) retObj = FLT2VAL(nat);
200#define OT_retObj_SET_DBL(nat) retObj = DBL2VAL(nat);
201#define OT_retObj_SET_BIN(nat,len) retObj = BIN2VAL(nat,len);
202#define OT_retObj_SET_STR(nat) retObj = STRN2VAL(nat);
203#define OT_retObj_SET_STRN(nat) retObj = STRN2VAL(nat);
204#define OT_retObj_SET_LONG(nat) retObj = LONG2VAL(nat);
205#define OT_retObj_SET_HDL(nat) retObj = HDL2VAL(nat);
211#define OT_MK_CALL_0_v1
214#define OT_MK_CALL_0(hdl,cls,meth,ret) \
216 ret =
MK(EvalObjvVR)(NULL,interp,0,
MK(cls##_ObjNew)(interp,hdl),
MK(cls##_##meth##_Obj),NULL);
223#define OT_MK_CALL_0(hdl,cls,meth,ret) { \
224 OT_SELF_T selfO = cls##_ObjNew(hdl); \
225 assert(selfO != NULL); \
226 RL_init(2,cls##_##meth,RL_NewS(0,MK_CPPXSTR(::cls::meth))) ; RL_O(1,SELF2VAL(selfO)) ; \
227 check_LNG(RL_EvalEx(TCL_EVAL_GLOBAL)) goto error; \
228 ret = Tcl_GetObjResult(interp); \
251#define OT_MK_RT_SIG 0x62384526
261 #define AtlClassName_buf_size 64
264 #define regTclObj(t) OT_OBJ_T t;
265 #define regTclObj2(t,v) OT_OBJ_T t;
266 #define regTclCmd(t) OT_OBJ_T t;
267 #define regTclArray(m,t) OT_OBJ_T t[m];
279 const Tcl_ObjType *
NS;
321#define OT_MK_ARGS OT_MK_RT_T amkrt, OT_ENV_T interp, MK_RT_ARGS
322#define OT_MK_CALL amkrt, interp, MK_RT_CALL
324#define OT_LNG_NULL NULL
325#define OT_LNG_UNDEF NULL
326#define OT_LNG_RETURN(ret,cmd) \
327 check_LNG(cmd) goto error; \
328 ret = Tcl_GetObjResult(interp); \
330#define OT_LNG_NAME_FROM_OBJECT(_obj) VAL2STR(_obj)
331#define OT_LNG_NAME_FROM_CLASS(_cls) OT_LNG_NAME_FROM_OBJECT(_cls)
332#define OT_LNG_NAME_FROM_OBJ(_obj) OT_LNG_NAME_FROM_OBJECT(_obj)
334#define OT_LNG_OBJ_CLASSNAME(val) MK(ClassName)(OT_Prefix_CALL val, false)
335#define OT_LNG_OBJ_CLASSNAME_SHORT(val) MK(ClassName)(OT_Prefix_CALL val, true)
336#define OT_OBJ_TYPE_STRING(val) MK(ClassName)(OT_Prefix_CALL val, false)
339#define OT_LNG_SELF_2_LNG(selfT) ((OT_OBJ_T)(selfT))
341#define OT_LNG_OBJV(__skip) objv[__skip]
343#define OT_OBJ_TO_CLASS(obj) obj
344#define OT_OBJ_TO_ENUM(str) #str
346#define OT_LNG_SET_VAR(var,val) \
347 if (Tcl_ObjSetVar2(interp, var, NULL, val, TCL_LEAVE_ERR_MSG) == NULL) goto error
349#define OT_LNG_EMBEDDED(type,call,...) ({ \
350 type ret = (type) 0; \
351 check_LNG(call (__VA_ARGS__,&ret)) { \
352 OT_ERROR_APPEND_LNG_STACK(); \
360#define OT_ERROR_LNG_RETURN return TCL_ERROR
362#define OT_ERROR_VAR_DEFAULT(...) Tcl_SetObjResult(interp,Tcl_ObjPrintf(__VA_ARGS__))
363#define OT_ERROR_STR_DEFAULT(...) Tcl_SetObjResult(interp,Tcl_NewStringObj(__VA_ARGS__,-1))
365#define OT_ERROR_TYPE(str) Tcl_SetObjResult(interp, Tcl_ObjPrintf("TYPE ERROR: %s", str))
367#define OT_ERROR_SOFT_CONSTRUCTOR(class) do { \
368 Tcl_SetResult(interp, "InitSoftError: '" #class "' soft constructor return 'NULL' pointer", TCL_STATIC); \
371#define OT_ERROR_CONSTRUCTOR(class) do { \
372 Tcl_SetResult(interp, "InitError: '" #class "' constructor return 'NULL' pointer", TCL_STATIC); \
373 if (MkErrorCheckE_0E()) { \
374 Tcl_AppendResult(interp, "\nMqError: ", MkErrorGetText_0E(), NULL); \
380#define OT_ERROR_NUMARGS(...) \
381 MkErrorC_CheckD(WrongNumArgs(__VA_ARGS__))
383#define OT_ERROR_ABNORMAL(mng) do { \
384 MkErrorSetV_4M(mng,__func__,999,"AbnormalError: %s", Tcl_GetStringResult(interp));\
385 Tcl_ResetResult(interp); \
388#define OT_ERROR_APPEND_LNG_STACK() \
389 Tcl_AppendResult(interp,"\nERROR-STACK: func=",__func__,", file=",__FILE__,", line=",MK_CPPXSTR(__LINE__),NULL)
394#define OT_ERROR_LNG_RETURN_VAR_ERROR(...) return ({ OT_ERROR_VAR_DEFAULT(__VA_ARGS__); TCL_ERROR; })
395#define OT_ERROR_LNG_RETURN_STR_ERROR(...) return ({ OT_ERROR_STR_DEFAULT(__VA_ARGS__); TCL_ERROR; })
397#define OT_ERROR_LNG_RETURN_HDL_NAT_NULL(_hdl) do { \
398 OT_ERROR_VAR_DEFAULT("[HdlIsNullError] : %s", MkObjectToString(_hdl)); \
402#define OT_ERROR_LNG_RETURN_INVALID_CLASS(_clsHasS,_clsExpS) do { \
403 OT_ERROR_VAR_DEFAULT("[InvalidClassError] : Expect class '%s' but get class '%s'", _clsExpS, _clsHasS ); \
407#define OT_ERROR_LNG_RETURN_HDL_IS_NULL() return MK(OT_ERROR_LNG_RETURN_HDL_IS_NULL)(OT_MK_CALL OT_CLASS, OT_SELF)
412#define OT_Prefix_ARGS OT_MK_ARGS
413#define OT_Prefix_CALL OT_MK_CALL
414#define OT_Check_ARGS OT_MK_ARGS MK_MNG hdl, MK_STRN const arg, ATL_OBJV_ARGS, int *skipP
415#define OT_Check_CALL(arg) OT_MK_CALL hdl, arg, ATL_OBJV_ARGS_CALL, &__skip
416#define OT_Check_CALL2(arg) OT_MK_CALL hdl, arg, ATL_OBJV_ARGS_CALL, skipP
418#define OT_CHECK_OPTIONAL(val) if (__skip < objc) {val}
419#define OT_CHECK_REQUIRED(val) val
421#define OT_CHECK_NUM_ARGS(min,max) \
422 if ((objc-__skip) < min || (objc-__skip) > max) { \
423 OT_ERROR_NUMARGS(hdl,__skip, objc, min, max, ""); \
427#define OT_CHECK_NOARGS \
428 if (__skip != objc) { \
429 OT_ERROR_NUMARGS(hdl,objc, __skip, -999, +999, ""); \
432#define OT_GET_CONSTR_NAME(ctor) VAL2STR(MoxCls__NAME__N(ctor))
434#define OT_CHECK_BNP(val,len) \
435 if (__skip >= objc) {\
436 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
439 val = (MK_BINN) Tcl_GetByteArrayFromObj(objv[__skip++], &i); \
443#define OT_CHECK_BCP(val) \
444 if (__skip >= objc) {\
445 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
447 val = (MK_BIN) Tcl_GetByteArrayFromObj(objv[__skip++], NULL); \
450#define OT_CHECK_BCPN(val) \
451 if (__skip >= objc) {\
452 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
454 val = (MK_BINN) Tcl_GetByteArrayFromObj(objv[__skip++], NULL); \
459#define MkErrorC_Check(mng,PROC) \
460 if (unlikely(MkErrorCheckI(PROC))) { \
461 OT_ERROR_META_2_LNG(mng); goto error; \
464#define MkErrorC_CheckD(PROC) \
465 if (unlikely(MkErrorCheckI(PROC))) { \
466 OT_ERROR_META_2_LNG(hdl); goto error; \
469#define OT_ERROR_META_2_LNG(m) MK(MkExceptionC_Raise) (OT_Prefix_CALL m, __doc, __FILE__, __LINE__)
470#define OT_ERROR_LNG_2_META(m) MK(MkExceptionC_Catch) (OT_Prefix_CALL m, NULL, __func__)
472#define check_LNG(code) if ((code) != TCL_OK)
473#define check_NULL(code) if ((code) == NULL)
474#define check_META(code) if (MkErrorCheckI(code))
478#define OT_TMP_BOL_OBJ(val) BOL2VAL(val)
479#define OT_TMP_I8_OBJ(val) I82VAL(val)
480#define OT_TMP_I16_OBJ(val) I162VAL(val)
481#define OT_TMP_I32_OBJ(val) INT2VAL(val)
482#define OT_TMP_I64_OBJ(val) I642VAL(val)
483#define OT_TMP_FLT_OBJ(val) FLT2VAL(val)
484#define OT_TMP_DBL_OBJ(val) DBL2VAL(val)
485#define OT_TMP_BIN_OBJ(val,len) BIN2VAL(val,len)
486#define OT_TMP_STR_OBJ(val) STRN2VAL(val)
487#define OT_TMP_CST_OBJ(val) STRN2VAL(val)
496#define OT_OBJECT_DELETE_SOFT(O) error: done in Atom_ns_delete
499#define OT_OBJECT_DELETE_HARD(O) MK(AtomDeleteHard) (OT_MK_CALL O)
502#define OT_OBJECT_DISPOSE(O) MK(AtomDispose) (OT_MK_CALL O)
504#define OT_OBJECT_DELETE(O) MK(AtomDispose) (OT_MK_CALL O)
506#define OT_REF_INCR(_obj) Tcl_IncrRefCount(_obj)
507#define OT_REF_DECR(_obj) Tcl_DecrRefCount(_obj)
508#define OT_REF_INCR_AND_RETURN(_obj) ({ Tcl_IncrRefCount(_obj); _obj;})
509#define OT_REF_DECR_AND_NULL(_obj) if (_obj) { Tcl_DecrRefCount (_obj) ; _obj = NULL; }
513#define MkCallS_SIG 0x30364351
539#define MkCallLog(c) MK(CallLog) ( MK_RT_CALL_NULL (c), __func__ )
541#define MkProcResolve_maxArgsLen 16
549 assert(call != NULL);
550 assert(objcP != NULL);
551 assert(objv != NULL);
553 if (call->
args == NULL)
return;
558 Tcl_ListObjGetElements(NULL,call->
args,&myobjc,&myobjv);
559 for (
int i=0; i<myobjc; i++) {
561 objv[objc++] = myobjv[i];
587 MK(CallFree) (callP);
590#ifdef META_HAS_THREAD
591 #define OT_OBJ_COPY(o) ({OT_OBJ_T t=(o); if (t) { t = Tcl_NewStringObj(Tcl_GetString(t),-1); OT_REF_INCR(t); }; t; })
593 #define OT_OBJ_COPY(o) ({OT_OBJ_T t=(o); if (t) { OT_REF_INCR(t); }; t; })
598 assert (dataP != NULL && *dataP != NULL);
628#define CallProlog(m) \
630 OT_MK_RT_T const amkrt = call->amkrt; \
631 assert (amkrt->signature == OT_MK_RT_SIG); \
632 OT_ENV_T const interp = amkrt->interp; \
633 assert (!Tcl_InterpDeleted(interp)); \
636 Tcl_Obj *objv[5+MkProcResolve_maxArgsLen]; \
642 objv[0] = call->mth; \
645 switch (call->type) { \
646 case MkCallS_own_method: \
647 dbgMsg("%s","MkCallS_own_method"); \
649 case MkCallS_static: \
650 dbgMsg("%s","MkCallS_static"); \
653 dbgMsg("%s","MkCallS_proc"); \
655 case MkCallS_other_method: \
656 dbgMsg("%s","MkCallS_other_method"); \
657 objv[objc++] = call->my; \
659 case MkCallS_init: { \
660 dbgMsg("%s","MkCallS_init"); \
661 check_META(MK(ProcResolve)(OT_MK_CALL (m), call)) goto error_mq; \
665 dbgMsg("%s","MkCallS_null"); \
667 case MkCallS_error: \
668 dbgMsg("%s","MkCallS_error"); \
674#define NO_OtCheckEnum
675#define NO_OtCheckEnumFlag
679#define OT_CHECK_ENUM(ename,val) \
680 if (__skip >= objc) {\
681 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
683 check_LNG(Get_ ## ename ## _FromObj_path (MK_RT_CALL interp,objv[__skip++],&val)) goto error; \
686#define OT_CHECK_ENUM_FLAG(ename,val) \
687 if (__skip >= objc) {\
688 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
690 check_LNG(Get_ ## ename ## _FromObj_path (MK_RT_CALL interp,objv[__skip++],&val)) goto error; \
697#define OT_CHECK_LNGTMPL(val,func) MkErrorC_CheckD (func(OT_Check_CALL(#val),&val));
699#define OT_CHECK_bool(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsBOOL))
700#define OT_CHECK_NB1(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsBOL))
701#define OT_CHECK_NI1(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsI8))
702#define OT_CHECK_NI2(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsI16))
703#define OT_CHECK_U2N(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsU16))
704#define OT_CHECK_NI4(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsI32))
705#define OT_CHECK_U4N(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsU32))
706#define OT_CHECK_NI8(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsI64))
707#define OT_CHECK_IXN(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsLLG))
708#define OT_CHECK_NF4(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsFLT))
709#define OT_CHECK_NF8(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsDBL))
710#define OT_CHECK_STRN(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsSTRN))
711#define OT_CHECK_NIL(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsLONG))
712#define OT_CHECK_NIH(val) MK_HDL_REF_S3(OT_CHECK_) (val)
714#define OT_CHECK_STRN_NULL(val) OT_CHECK_LNGTMPL(val,MK(Obj_AsCSTNull))
717#define OT_CHECK_C_COPY(val,size) MkErrorC_CheckD (MK(Obj_AsSTR_COPY)(OT_Check_CALL(#val),val,size));
721#define OT_GET_CALL_PROC MK(Get_Call_Proc)(OT_MK_CALL &frame)
722#define OT_GET_CALL_FILE MK(Get_Call_File)(OT_MK_CALL &frame)
723#define OT_GET_CALL_LINE MK(Get_Call_Line)(OT_MK_CALL &frame)
725#define FRAME_ARGS OT_MK_ARGS OT_OBJ_T * frameP
726#define FRAME_CALL OT_MK_CALL &frame
761#define WNA(min,max,txt) { \
763 if (objc<(__skip+min) || objc>(__skip+max)) { \
764 Tcl_WrongNumArgs (interp, __skip, objv, txt); \
769#define AltClassDef(...) MK(ClassDef)(OT_MK_CALL __VA_ARGS__)
778#define AtlUnknownSetup(...) MK(UnknownSetup) (interp, __VA_ARGS__)
799#define OT_VARFRAME_CREATE \
800 struct MkVarFrameS otVarFrame = {50, 0}; otVarFrame.data = otVarFrame.prealloc; \
801 OT_VARFRAME varframe = &otVarFrame;
803#define OT_VARFRAME_DELETE { \
804 for (int i=0; i<varframe->num; i++) Tcl_DecrRefCount(varframe->data[i]); \
808#define OT_VARFRAME_ARGS MK_RT_ARGS OT_VARFRAME varframe
809#define OT_VARFRAME_CALL MK_RT_CALL varframe
812 if (varframe != NULL) {
813 if (varframe->num >= varframe->max) {
815 if (varframe->data == varframe->prealloc) {
817 memcpy(tmp,varframe->data,(
size_t)varframe->max*
sizeof(
OT_OBJ_T));
821 varframe->data = tmp;
824 varframe->data[varframe->num++] = add;
825 Tcl_IncrRefCount(add);
830#define OT_VARFRAME_OBJ_RESULT(itp) MK(OT_VARFRAME_ADD)(OT_VARFRAME_CALL,Tcl_GetObjResult(itp))
846#define OT_EVAL_ARGS OT_ENV_T interp, int objc, OT_OBJ_T const objv[], int flags
847#define OT_EVAL_CALL interp, objc, objv , flags
851 check_LNG(Tcl_EvalObjv (interp, objc, objv, flags))
return NULL;
852 return Tcl_GetObjResult(interp);
858 check_LNG(Tcl_EvalObjv (interp, objc, objv, flags))
return NULL;
868 for (i=0;i<objc;i++) Tcl_IncrRefCount(objv[i]);
869 ret = Tcl_EvalObjv (interp, objc, objv, flags);
870 for (i=0;i<objc;i++) Tcl_DecrRefCount(objv[i]);
887#define OT_NEW_Mk_enum_OBJ(typ,val) MK(Mk ## typ ## _ToString(val))
902#define Get_MkErrorE_FromObj_path MK(Get_MkErrorE_FromObj)
905#define Get_MkIdSE_FromObj_path MK(Get_MkIdSE_FromObj)
908#define Get_MkTimeoutE_FromObj_path MK(Get_MkTimeoutE_FromObj)
911#define Get_MkTypeE_FromObj_path MK(Get_MkTypeE_FromObj)
919#define SETUP_interp MK_UNUSED OT_ENV_T interp = amkrt->interp
920#define SETUP_moxrt MK_UNUSED MOX_RT_T moxrt = amkrt->moxrt; \
921 assert(moxrt && moxrt->signature == MOX_RT_SIG);
922#define SETUP_amkrt(r) MK_UNUSED OT_MK_RT_T const amkrt = (r) ? (r) : &amkrtR; \
923 assert(amkrt && amkrt->signature == OT_MK_RT_SIG); \
927#define OT_SELF_O(o) ((OT_SELF_T)(*o).self)
928#define OT_SELF_X(x) OT_SELF_O(MkOBJ(x))
929#define OT_SELF_M(m) OT_SELF_O((MK_OBJ)(m))
932#define SetupHdlFromMetaData_init_2(_SHORT) \
933 MK_RT_SETUP_METHOD; \
934 int __skip; OT_SELF_T selfO; _SHORT hdl;
936#define SetupHdlFromMetaData_2(_SHORT) \
937 SetupHdlFromMetaData_init_2(_SHORT) \
938 if (objc < 2) OT_ERROR_LNG_RETURN_STR_ERROR("error: missing hdl argument"); \
941 hdl = SELF2HDL(selfO); \
942 if (hdl == NULL) OT_ERROR_LNG_RETURN_HDL_IS_NULL();
944#define SetupHdlFromMetaData__null_allow_2(_SHORT) \
945 SetupHdlFromMetaData_init_2(_SHORT) \
953 hdl = SELF2HDL(selfO); \
956#define SetupHdlConstr(_ClassC) \
957 MK_RT_SETUP_METHOD; \
960 MK_UNUSED OT_SELF_T selfO = objv[1]; \
961 if (!AtlClassIsN(selfO,_ClassC##_lngO)) \
962 OT_ERROR_LNG_RETURN_INVALID_CLASS(VAL2STR(MoxMy__CLASS__N(selfO)),OT_CLASS_NAME); \
963 MK_UNUSED MK_TYP hdl = _ClassC##_TT; \
965#define SetupHdlStatic(_ClassC) \
966 MK_RT_SETUP_METHOD; \
968 MK_UNUSED OT_SELF_T selfO = OT_CLASS; \
969 MK_UNUSED MK_TYP hdl = _ClassC##_TT; \
977#define PTR2VAL(nat) (OT_OBJ_T)(nat)
978#define SELF2VAL(slf) (slf)
979#define CLS2VAL(cls) (cls)
980#define META2VAL_X(x) SELF2VAL(OT_SELF_X(x))
981#define META2VAL_O(o) SELF2VAL(OT_SELF_O(o))
983#define I82VAL(nat) Tcl_NewIntObj(nat)
984#define BOL2VAL(nat) Tcl_NewBooleanObj(nat)
985#define I162VAL(nat) Tcl_NewIntObj(nat)
986#define U162VAL(nat) Tcl_NewIntObj((int)nat)
987#define INT2VAL(nat) Tcl_NewIntObj(nat)
988#define I642VAL(nat) Tcl_NewWideIntObj(nat)
989#define HDL2VAL(nat) Tcl_NewIntObj(nat)
990#define LLG2VAL(nat) Tcl_NewWideIntObj(nat)
991#define FLT2VAL(nat) Tcl_NewDoubleObj(nat)
992#define DBL2VAL(nat) Tcl_NewDoubleObj(nat)
993#define STRN2VAL(nat) MK(STRN2VAL)(nat)
994#define BIN2VAL(ptr,len) Tcl_NewByteArrayObj((const unsigned char*)ptr,(int)len)
995#define STR2VAL(ptr) Tcl_NewStringObj((const char*)ptr,-1)
996#define STR2VAL_2(ptr,len) Tcl_NewStringObj((const char*)ptr,(int)len)
997#define LONG2VAL(nat) Tcl_NewLongObj(nat)
999#define VAL2STR(val) Tcl_GetString(val)
1000#define VAL2STR_NULL(val) (val?Tcl_GetString(val):"NULL")
1001#define VAL2SELF(val) (val)
1003#define VAL2OBJ(val) ((MK_OBJ)Self2PtrN(val))
1004#define VAL2BFL(val) ((MK_BFL)Self2PtrN(val))
1005#define VAL2MNG(val) ((MK_MNG)Self2PtrN(val))
1011 if (T_MK_NULL == NULL) {
1013 Tcl_IncrRefCount(T_MK_NULL);
1019 return Tcl_NewStringObj(val,-1);
1029#define AtlInfoScript(s) MK(AtlInfoScript)(OT_MK_CALL s)
1032#define AtlInfoExists(l) MK(AtlInfoExists)(OT_MK_CALL l)
1035#define AtlArrayExists(l) MK(AtlArrayExists)(OT_MK_CALL l)
1038#define AtlClassIsN(...) OT_LNG_EMBEDDED(bool,MK(AtlClassIsN),OT_MK_CALL __VA_ARGS__)
1048#ifdef OT_SHARED_IS_DLL
1049# define OT_ATL_EXTERN __declspec(dllexport)
1051# define OT_ATL_EXTERN __attribute__ ((visibility("default")))
1071#define AtlClassDefGetNN(...) NS(AtlClassDefGetNN)(OT_MK_CALL __VA_ARGS__)
1074#define AtlGetClassFrmNsPtr(nsP,flg) MK(GetClassFrmNsPtr)(OT_MK_CALL nsP, flg)
1077 if (clsDef != NULL)
return clsDef->
classO;
1087#define AtlGetClassFromProc(cmdT) MK(GetClassFromProc)(OT_MK_CALL cmdT)
1089 Tcl_CmdInfo cmdInfo;
1090 Tcl_GetCommandInfoFromToken(cmdT,&cmdInfo);
1092 return MoxCls__NS__NN(cmdInfo.namespacePtr,0);
1095#define OT_TMP_BAC_OBJ(val) MK(MkBufferListC_ObjNew) (OT_MK_CALL val)
1102 #define MkBufferListC_rt (*amkrt)
1103 #define MkBufferListC_lngO (MkBufferListC_rt.AtlMkBufferListC)
1104 #undef MkBufferListCTT
1105 #define MkBufferListCTT (MkBufferListC_rt.AtlMkBufferListCTT)
1109 #define MkBufferListC_ObjNew(nat) MK(MkBufferListC_ObjNew) (OT_MK_CALL nat)
1110 #define OT_TMP_BFL_OBJ(nat) MkBufferListC_ObjNew (nat)
1111 #define OT_retObj_SET_BFL(nat) retObj = MkBufferListC_ObjNew (nat)
1121 #define MkBufferC_rt (*amkrt)
1122 #define MkBufferC_lngO (MkBufferC_rt.AtlMkBufferC)
1124 #define MkBufferCTT (MkBufferC_rt.AtlMkBufferCTT)
1128 #define MkBufferC_ObjNew(nat) MK(MkBufferC_ObjNew) (OT_MK_CALL nat)
1129 #define OT_TMP_BUF_OBJ(nat) MkBufferC_ObjNew (nat)
1130 #define OT_retObj_SET_BUF(nat) retObj = MkBufferC_ObjNew (nat)
1140 #define MkBufferStreamC_rt (*amkrt)
1141 #define MkBufferStreamC_lngO (MkBufferStreamC_rt.AtlMkBufferStreamC)
1142 #undef MkBufferStreamCTT
1143 #define MkBufferStreamCTT (MkBufferStreamC_rt.AtlMkBufferStreamCTT)
1147 #define MkBufferStreamC_ObjNew(nat) MK(MkBufferStreamC_ObjNew) (OT_MK_CALL nat)
1148 #define OT_TMP_BUS_OBJ(nat) MkBufferStreamC_ObjNew (nat)
1149 #define OT_retObj_SET_BUS(nat) retObj = MkBufferStreamC_ObjNew (nat)
1159 #define MkErrorC_rt (*amkrt)
1160 #define MkErrorC_lngO (MkErrorC_rt.AtlMkErrorC)
1162 #define MkErrorCTT (MkErrorC_rt.AtlMkErrorCTT)
1166 #define MkErrorC_ObjNew(nat) MK(MkErrorC_ObjNew) (OT_MK_CALL nat)
1167 #define OT_TMP_ERR_OBJ(nat) MkErrorC_ObjNew (nat)
1168 #define OT_retObj_SET_ERR(nat) retObj = MkErrorC_ObjNew (nat)
1178 #define MkLogFileC_rt (*amkrt)
1179 #define MkLogFileC_lngO (MkLogFileC_rt.AtlMkLogFileC)
1181 #define MkLogFileCTT (MkLogFileC_rt.AtlMkLogFileCTT)
1185 #define MkLogFileC_ObjNew(nat) MK(MkLogFileC_ObjNew) (OT_MK_CALL nat)
1186 #define OT_TMP_LFL_OBJ(nat) MkLogFileC_ObjNew (nat)
1187 #define OT_retObj_SET_LFL(nat) retObj = MkLogFileC_ObjNew (nat)
1197 #define MkObjectC_rt (*amkrt)
1198 #define MkObjectC_lngO (MkObjectC_rt.AtlMkObjectC)
1200 #define MkObjectCTT (MkObjectC_rt.AtlMkObjectCTT)
1204 #define MkObjectC_ObjNew(nat) MK(MkObjectC_ObjNew) (OT_MK_CALL nat)
1205 #define OT_TMP_OBJ_OBJ(nat) MkObjectC_ObjNew (nat)
1206 #define OT_retObj_SET_OBJ(nat) retObj = MkObjectC_ObjNew (nat)
1216 #define MkRuntimeC_rt (*amkrt)
1217 #define MkRuntimeC_lngO (MkRuntimeC_rt.AtlMkRuntimeC)
1219 #define MkRuntimeCTT (MkRuntimeC_rt.AtlMkRuntimeCTT)
1223 #define MkRuntimeC_ObjNew(nat) MK(MkRuntimeC_ObjNew) (OT_MK_CALL nat)
1224 #define OT_TMP_RT_OBJ(nat) MkRuntimeC_ObjNew (nat)
1225 #define OT_retObj_SET_RT(nat) retObj = MkRuntimeC_ObjNew (nat)
1240#define ME_REF_MkBinaryR MkBinaryR
1241#define OT_GET__ME_REF_MkBinaryR(b) BIN2VAL(b.data,b.size)
1242#define VAL2MkBinaryR(obj) \
1243 ({int size;unsigned char * bin =Tcl_GetByteArrayFromObj(obj,&size);MkBinaryCreate(size,bin);})
1244#define OT_CHECK__ME_REF_MkBinaryR(val) \
1245 if (__skip >= objc) { \
1246 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
1248 val = VAL2MkBinaryR(objv[__skip++]); \
1251#define ME_REF_MkStringR MkStringR
1252#define OT_GET__ME_REF_MkStringR(s) STR2VAL_2(s.ptr,s.len)
1253#define VAL2MkStringR(obj) \
1254 ({int len;char * str =Tcl_GetStringFromObj(obj,&len);MkStringCreate(len,str);})
1255#define OT_CHECK__ME_REF_MkStringR(val) \
1256 if (__skip >= objc) { \
1257 OT_ERROR_NUMARGS(hdl,__skip, objc, -999, +999, #val); \
1259 val = VAL2MkStringR(objv[__skip++]); \
1264 char*
str = Tcl_GetStringFromObj(tclO,&len);
1269 if (tclO) Tcl_DecrRefCount(tclO);
1272#define Ot_GetBooleanFromObj(val) ({int bol; if (Tcl_GetBooleanFromObj(interp,val,&bol)==TCL_ERROR) goto error; bol;})
1281#define ot_fixstr(_s,_l) Tcl_NewStringObj(_s,_l)
1282#define ot_fixstrobj(_s) ot_fixstr(_s,strlen(_s))
1283#define ot_enum_append(_o,_s) Tcl_ListObjAppendElement(NULL,_o,ot_fixstrobj(_s))
1293#define printLng(var) printV(#var" = '%s' [ref=%i]",(var?VAL2STR(var):"NULL"),(var)?(var)->refCount:-1)
1294#define printXLng(x,var) printXV(x,#var" = '%s' [ref=%i]",(var?VAL2STR(var):"NULL"),(var)?(var)->refCount:-1)
1295#define printXLngObj(x,var) printXC2(x,MK(PrintObj)(OT_Prefix_CALL #var,var))
1296#define printLLngObj(var) printLC2( MK(PrintObj)(OT_Prefix_CALL #var,var))
1297#define printLngObj(var) printTxt(MK(PrintObj)(OT_Prefix_CALL #var,var))
1298#define printLngObj2(var) MK(PrintObj2)(OT_Prefix_CALL #var,var,__func__)
1300#define printLngErrorCode() do { \
1301 OT_OBJ_T errorCode = Tcl_GetVar2Ex (interp, "errorCode", NULL, TCL_GLOBAL_ONLY); \
1302 printLngObj(errorCode); \
1305#define printLngErrorInfo() do { \
1306 OT_OBJ_T errorInfo = Tcl_GetVar2Ex (interp, "errorInfo", NULL, TCL_GLOBAL_ONLY); \
1307 printLngObj(errorInfo); \
1311 printV("printObjv: __skip=%i, objc=%i",__skip,objc);\
1314#define printXObjv(x) \
1315 printXV(x,"__skip=%i, objc=%i",__skip,objc);\
1316 printXAry(x,objc,objv)
1318#define printAry(c,o) \
1321#define printAryDetail(c,o) \
1322 for(int i=0;i<c;i++) { printLngObj(o[i]) }
1324#define printXAry(x,c,o) \
1325 for(int i=0;i<c;i++) { printXV(x,"%2i= %s",i,o[i]?Tcl_GetString(o[i]):"NULL"); }
1327#define printXAryDetail(x,c,o) \
1328 for(int i=0;i<c;i++) { printXLngObj(x,o[i]) }
1330#define printAry3(txt, c,o) do { \
1331 mk_dbg_Z_start(512,MK_COLOR_BLUE "%s : ",txt); \
1332 for(int i=0;i<c;i++) { \
1333 mk_dbg_Z_next(MK_COLOR_YELLOW "[%d:%p]" MK_COLOR_RESET "='%s' ",i,o[i],o[i]?Tcl_GetString(o[i]):"NULL"); \
1338#define printAryX(x,t,c,o) \
1339 printXV(x, "%-15s = ",t); \
1340 for(int i=0;i<c;i++) { \
1341 fprintf(stderr, "'%s' ",o[i]?Tcl_GetString(o[i]):"NULL"); \
1343 fputc('\n', stderr);
1345#define printAryL(t,c,o) printAryX(META_CONTEXT_S,t,c,o) \
1347#define xstr(s) str(s)
1350#define printLngClass(clsC) printV(#clsC " name = %s", OT_LNG_NAME_FROM_CLASS(clsC))
1351#define printLngObject(objO) printV(#objO " name = %s", OT_LNG_NAME_FROM_OBJECT(objO))
1356#define Self2PtrNN(myP) MK(Self2PtrNN)(myP)
1357#define Self2PtrN(myO) MK(Self2PtrN)(interp,myO)
1360 return nsP->clientData;
1364 OT_NS_T myP = MoxResolveN(myO);
1365 if (myP == NULL)
return NULL;
1390 #define __doc "AtomObjNew"
1393 assert(obj != NULL);
1411#define AtomInit(...) MK(AtomInit)(OT_MK_CALL __VA_ARGS__)
1426#define AtomCreate(...) MK(AtomCreate)(OT_MK_CALL __VA_ARGS__)
1437#define AtomMake(...) MK(AtomMake)(OT_MK_CALL __VA_ARGS__)
1448#define AtomCreateNULL(...) MK(AtomCreateNULL)(OT_MK_CALL __VA_ARGS__)
1458#define AtomCreateCONSTR(...) MK(AtomCreateCONSTR)(OT_MK_CALL __VA_ARGS__)
1466 assert(selfO != NULL);
1468 OT_NS_T ns = MoxResolveN(selfO);
1470 Tcl_DeleteNamespace(ns);
1482 assert(selfO != NULL);
1507 assert(selfO != NULL);
1511 OT_NS_T myNs = MoxResolveN(myO);
1512 myNs->clientData = NULL;
1513 myNs->deleteProc = NULL;
1522 #define Atl_EvalObjv(...) Tcl_EvalObjv(__VA_ARGS__)
__thread OT_MK_RT_S amkrtR
AtlClassDefS * AtlClassDefT
#define MkErrorC_ObjNew(nat)
@ OT_MK_RT_STATUS_DELETED
#define MkBufferStreamC_ObjNew(nat)
#define AtomCreateNULL(...)
#define AtomCreateCONSTR(...)
#define MkLogFileC_ObjNew(nat)
#define MkBufferC_ObjNew(nat)
#define MkObjectC_ObjNew(nat)
static MkStringR Ot_GetStringFromObj(OT_OBJ_T tclO)
static void Ot_DecrRefCount(OT_OBJ_T tclO)
#define MkBufferListC_ObjNew(nat)
#define OT_ERROR_LNG_RETURN_HDL_IS_NULL()
#define AtlClassDefGetNN(...)
#define OT_LNG_SELF_2_LNG(selfT)
struct MkVarFrameS * OT_VARFRAME
int(* LookupClassF)(SKIP_ARGS)
#define OT_VARFRAME_OBJ_RESULT(itp)
struct AtlClassDefS AtlClassDefS
#define OT_REF_DECR_AND_NULL(_obj)
#define MK_ATL_EXTERN
static library
#define MkRuntimeC_ObjNew(nat)
#define OT_REF_DECR(_obj)
#define AtlArrayExists(l)
#define MkBufferListC_ARGS
#define MkErrorC_Check(mng, PROC)
#define MkBufferStreamC_rt
#define Atl_EvalObjv(...)
#define AtlClassName_buf_size
OT_ProcRet NS MkBufferC_ToObject(MkBufferC_ARGS)
OT_ProcRet MK MkBufferListC_ToList(MkBufferListC_ARGS)
#define MkBufferC_type
same as MkBufferS but useable in a class-macro as: class##_type …
#define MkBufferC_X2obj(x)
#define MkBufferListC_type
same as MkBufferListS but useable in a class-macro as: class##_type …
#define MkBufferListC_X2obj(x)
#define MkBufferStreamC_type
same as MkBufferStreamS but useable in a class-macro as: class##_type …
#define MkBufferStreamC_X2obj(x)
#define MkErrorC_X2obj(x)
#define MkErrorC_type
same as MkErrorS but useable in a class-macro as: class##_type …
#define MK_NULL_STR
the string "MK_NULL" value as MK_NULL_STR …
#define MK_EXTERN
static library
#define MK_NULL
The Programming-Language-Micro-Kernel (PLMK) NULL value as "MK_NULL" in Atl …
MK_STRN MkTimeoutE_ToString(enum MkTimeoutE value)
return the MkTimeoutE as string …
MkTimeoutE
Predefined Timeout values …
MK_STRN MkIdSE_ToString(enum MkIdSE value)
return the MkIdSE as string …
MK_STRN MkTypeE_ToString(enum MkTypeE value)
return the MkTypeE as string …
MkErrorE
collection for the different error-codes …
MkTypeE
basic data-types supported by Programming-Language-Micro-Kernel (PLMK) …
MK_STRN MkErrorE_ToString(enum MkErrorE value)
return the MkErrorE as string …
static MkStringR MkStringCreate(MK_NUM len, MK_STRN str)
create a str from ptr and len ...
const MK_PTRB * MK_MNGN
const - a managed object pointer, datatype will be checked at runtime
int32_t MK_NUM
array size data-type ('num' items in array …
MK_PTRB * MK_PTR
generic pointer data-type
const MK_STRB * MK_STRN
constant string pointer data-type
MK_PTRB * MK_MNG
managed object pointer, datatype will be checked at runtime
MK_PTRB const * MK_EXP
exception object pointer
unsigned int MK_SIG
signature datatype
MK_PTRB * MK_CBP
generic pointer to call-back data
MK_STRB * MK_STR
string pointer data-type with UTF8 ecoding (string)
signed int MK_I32
4 byte integer data-type
#define MkLogFileC_X2obj(x)
#define MkLogFileC_type
same as MkLogFileS but useable in a class-macro as: class##_type …
struct MkObjectS * MK_OBJ
class-shortcut for struct MkObjectS *, all shortcut using the XX_YYY syntax (only for public API) …
#define MkObjectC_X2obj(x)
#define MkObjectC_type
same as MkObjectS but useable in a class-macro as: class##_type …
static MK_OBJ MkObj(MK_MNG mng)
cast a unknown-object into an MkObjectS pointer or NULL if not possible
#define MkRefDecrWithUnlinkSelf(...)
MkIdSE
signal type of the MkIdS data val …
MK_PTR MkSysCalloc(MK_OBJN fmtobj, size_t const nmemb, size_t const size)
calloc syscall with atlmkkernel error plugin
#define MkSysFree(pointer)
MK_PTR MkSysMemDup(MK_OBJN fmtobj, MK_PTRN const blck, size_t const size)
memdup syscall with atlmkkernel error plugin
MK_PTR MkSysReCalloc(MK_OBJN fmtobj, MK_PTR const buf, MK_NUM const oldnum, MK_NUM const addnum, size_t const size)
realloc syscall with atlmkkernel error plugin
#define MkObjectDeleteCallF_ARGS
the MkObjectDeleteCallF arguments with default names
#define MkObjectDeleteFreeF_ARGS
the MkObjectDeleteFreeF arguments with default names
#define MkRuntimeC_type
same as MkRuntimeS but useable in a class-macro as: class##_type …
#define MkRuntimeC_X2obj(x)
struct MkTypeS * MK_TYP
class-shortcut for struct MkTypeS *, all shortcut using the XX_YYY syntax (only for public API) …
bool MK TestObject(OT_Prefix_ARGS OT_OBJ_T lngO, OT_CLS_T typeO, MK_OBJ *objP, MkTestClassE *flagP)
struct AtlClassDefS * next
struct AtlClassDefS * prev
The CLASS used to store a list of MkBufferS items into a flat array…
The data-type to store and handle the error-condition …
The MkRuntimeS provide a per-thread environment for atlmkkernel …
string data default format …
MkTypeS - class known as typ or type is used as class-base for a Managed-Object-Technology (MOT) type...
MK_TYP AtlMkBufferStreamCTT
const Tcl_ObjType * BOOLEAN
OT_OBJ_T AtlMkBufferC_MK_NULL
OT_OBJ_T AtlMkErrorC_MK_NULL
OT_OBJ_T AtlMkBufferStreamC_MK_NULL
struct AtlClassDefS * atlClassDefL
OT_OBJ_T AtlMkObjectC_MK_NULL
OT_NS_T AtlMkBufferListC_NS
OT_CLS_T AtlMkBufferListC
const Tcl_ObjType * DOUBLE
OT_CLS_T AtlMkBufferStreamC
OT_NS_T AtlMkBufferStreamC_NS
MK_TYP AtlMkBufferListCTT
OT_OBJ_T AtlMkLogFileC_MK_NULL
const Tcl_ObjType * INDEX
OT_OBJ_T AtlMkRuntimeC_MK_NULL
OT_OBJ_T AtlMkBufferListC_MK_NULL
Tcl_ObjCmdProc * callProc