11#define SetupRtFromHdl_X(hd) MkRtSetup_O(hd)
12#define SetupRtFromHdl_XN(hd) MkRtSetup_ON(hd)
16#define META_FILE_NAME "MkObjectC_tcl.c"
20#define OT_CLASS NS(MkObjectC)
21#define OT_CLASS_NAME "MkObjectC"
23#define OBJECT2OBJ(O) MkAssertCastM(MkObjectC,(Tcl_ObjectGetMetadata(O, &MK(AtomMeta))))
53#define OT_SETUP_hdl_static_constr_pre
54#define OT_SETUP_hdl_static_constr \
55 OT_SETUP_hdl_static_constr_pre; \
58#define OT_SETUP_hdl_static \
59 int __skip=Tcl_ObjectContextSkippedArgs(objCtx); \
61 __attribute__((unused)) OT_SELF_T selfO = Tcl_ObjectContextObject(objCtx); \
62 __attribute__((unused)) MK_TYP hdl = MkObjectC##_TT;
64#define OT_SETUP_hdl SetupHdlFromMetaData_2(OBJ,MK_OBJ);
65#define OT_SETUP_hdl__null_allow SetupHdlFromMetaData__null_allow_2(OBJ,MK_OBJ);
66#define OT_SETUP_hdl_destr SetupHdlFromMetaData__null_allow_2(OBJ,MK_OBJ);
68#define OT_SETUP_hdl_constr_pre
69#define OT_SETUP_hdl_constr \
70 OT_SETUP_hdl_constr_pre; \
71 int __skip=Tcl_ObjectContextSkippedArgs(objCtx); \
73 MK_RT_UNUSED OT_SELF_T selfO = Tcl_ObjectContextObject(objCtx); \
74 MK_OBJ hdl = (MK_OBJ) &MkERROR;
76#if !defined(SetupRtFromHdl_XN)
77 #define SetupRtFromHdl_XN(hdl) AllRtSetup_XN(hdl)
78 #define SetupRtFromHdl_X(hdl) AllRtSetup_X(hdl)
84 if (MkObjectCTT == NULL) MkObjectCTT = MkObjectSTT; \
87 if (MkObjectCTT->selfCreate == NS(MkObjectC_selfCreate)) return MK_OK; \
90 MkObjectCTT->selfCreate = NS(MkObjectC_selfCreate); \
91 MkObjectCTT->selfDelete = NS(MkObjectC_selfDelete); \
92 MkObjectCTT->selfUnlink = NS(MkObjectC_selfUnlink); \
95 OT_SELF_T classO = MK(ClassDef)(interp,ns,MkObjectCTT); \
96 check_NULL(classO) goto error; \
97 OT_CLASS = Tcl_GetObjectAsClass(classO); \
100 static MkThreadLocal OtUnknownS NS(sClassUnknown) = {OT_UNKNOWN_CLASS}; \
101 check_LNG(MK(UnknownSetup) (interp,classO,NS(sOtClassDef),&NS(sClassUnknown))) goto error; \
104 static MkThreadLocal OtUnknownS NS(sInstanceUnknown) = {OT_UNKNOWN_INSTANCE}; \
105 check_LNG(MK(UnknownSetup) (interp,classO,NS(sInstanceDef),&NS(sInstanceUnknown))) goto error; \
108 MK(MkObjectC_MK_NULL) = Tcl_GetObjectName(interp, \
109 MK(AtomCreate) (MK_RT_CALL interp, NULL , OT_CLASS, "MK_NULL" , "::tclmkkernel::MkObjectC" ) \
111 Tcl_IncrRefCount(MK(MkObjectC_MK_NULL));
113#define VER TCL_OO_METHOD_VERSION_CURRENT
120#define DbgM_doc "MkObjectC DbgM message:string ?debug:int32=0? ?callfunc:string=\"MK_NULL\"? ?lvl:int32=0?"
123#define DbgDump_doc "$obj DbgDump ?message:string=\"var\"? ?callfunc:string=\"MK_NULL\"? (const)"
124#define DbgL_doc "$fmtobj DbgL message:string ?debug:int32=0? ?callfunc:string=\"MK_NULL\"? ?lvl:int32=0? (const)"
125#define DbgLogC_doc "$obj DbgLogC ?callfunc:string=\"MK_NULL\"? (const)"
126#define DbgO_doc "$obj DbgO ?callfunc:string=\"MK_NULL\"? (const)"
127#define DbgSTACK_doc "$fmtobj DbgSTACK ?skip:int32=0? ?num:int32=-1? ?callfunc:string=\"MK_NULL\"? (const)"
130#define LogC_doc "$fmtobj LogC message:string ?debug:int32=0? ?callfunc:string=\"MK_NULL\"? (const)"
131#define LogHEX_doc "$fmtobj LogHEX callfunc:string data:binary (const)"
134#define RefGet_doc "int32 [$obj RefGet]"
137#define GetNull_doc "MkObjectC [MkObjectC GetNull]"
138#define HandleResolve_doc "MkObjectC [MkObjectC HandleResolve netHdl:MK_HDL]"
139#define Instances_doc "MkObjectC [MkObjectC Instances]"
142#define DeleteCallbackCleanup_doc "MkObjectC DeleteCallbackCleanup ident:string"
143#define DeleteCallbackSetup_doc "MkObjectC DeleteCallbackSetup ident:string ?callback:callable=\"MK_NULL\"? ?filter:string=\"MK_NULL\"?"
144#define HandleDeleteByNetHdl_doc "MkObjectC HandleDeleteByNetHdl netHdl:MK_HDL"
147#define Delete_doc "$obj Delete"
150#define Dispose_doc "$obj Dispose"
153#define ErrorCatch_doc "MkErrorC [$obj ErrorCatch ?exception:errorCode=\"MK_NULL\"? ?callfunc:string=\"MK_NULL\"?] (const)"
154#define Next_doc "MkObjectC [$obj Next]"
155#define Prev_doc "MkObjectC [$obj Prev]"
156#define ToError_doc "MkErrorC [$obj ToError]"
159#define HandleDelete_doc "$netObj HandleDelete"
160#define HandleExists_doc "bool [$obj HandleExists]"
161#define HandleGet_doc "MK_HDL [$obj HandleGet]"
162#define HandleGetOfType_doc "MK_HDL [$obj HandleGetOfType]"
163#define HandleGetOr0_doc "MK_HDL [$obj HandleGetOr0]"
164#define IsNull_doc "bool [$obj IsNull]"
165#define Log_doc "$obj Log ?fmtobj:MkObjectC=\"MK_NULL\"? ?debug:int32=0? ?callfunc:string=\"MK_NULL\"? ?lvl:int32=0? (const)"
166#define LogLong_doc "$obj LogLong ?fmtobj:MkObjectC=\"MK_NULL\"? ?debug:int32=0? ?callfunc:string=\"MK_NULL\"? ?lvl:int32=0? (const)"
167#define LogShort_doc "$obj LogShort ?fmtobj:MkObjectC=\"MK_NULL\"? ?debug:int32=0? ?callfunc:string=\"MK_NULL\"? ?lvl:int32=0? (const)"
168#define LogType_doc "$obj LogType ?fmtobj:MkObjectC=\"MK_NULL\"? ?debug:int32=0? ?callfunc:string=\"MK_NULL\"? ?lvl:int32=0? (const)"
169#define ToName_doc "string [$obj ToName] (const)"
170#define ToNameOfClass_doc "string [$obj ToNameOfClass]"
171#define ToNameOfType_doc "string [$obj ToNameOfType] (const)"
172#define ToString_doc "string [$inst ToString] (const)"
175#define SysHashI32_doc "int32 [MkObjectC SysHashI32 key:string ?length:int32=-1?]"
176#define SysHashSTR_doc "string [MkObjectC SysHashSTR key:string ?length:int32=-1?]"
179#define SysKill_doc "$fmtobj SysKill pid:int32 signal:int32 (const)"
182#define SysGetPid_doc "int32 [$fmtobj SysGetPid] (const)"
193#define MkDbgO_O(hdl,call) MkLogV(hdl,call,0,"%s\n",MK(PrintLngObj)(OT_Prefix_CALL NULL,META2VAL_O(hdl)))
194#define MkDbgDumpTmpl(...) TclDbgDump(OT_Prefix_CALL __VA_ARGS__)
195#define MkObjectToNameOfClassTmpl(hdl) OT_LNG_OBJ_CLASSNAME(META2VAL_O(hdl))
196#define MkObjectErrorCatchTmpl(...) MK(MkExceptionC_Catch)(OT_Prefix_CALL __VA_ARGS__)
203 MkLogV(obj,callfunc,0,MK_COLOR_CYAN
" >>> "MK_COLOR_RESET
"\n");
205 fprintf(
MK_RT_REF.log.logFILE,
" > " MK_COLOR_YELLOW
"%s"MK_COLOR_RESET
"\n",
MK(PrintLngObj)(
OT_Prefix_CALL message,self));
209 MkLogV(obj,callfunc,0,MK_COLOR_CYAN
" <<< "MK_COLOR_RESET
"\n");
454 MkDbgL (hdl, message, debug, callfunc, lvl);
542 MkDbgM (message, debug, callfunc, lvl);
577 MkLogC (hdl, message, debug, callfunc);
1017const static Tcl_MethodType
NS(sOtClassDef)[] = {
1022 {
VER,
"DbgM" ,
NS(MkObjectC_DbgM) , NULL, NULL},
1025 {
VER,
"GetNull" ,
NS(MkObjectC_GetNull) , NULL, NULL},
1026 {
VER,
"HandleResolve" ,
NS(MkObjectC_HandleResolve) , NULL, NULL},
1027 {
VER,
"Instances" ,
NS(MkObjectC_Instances) , NULL, NULL},
1030 {
VER,
"DeleteCallbackCleanup",
NS(MkObjectC_DeleteCallbackCleanup) , NULL, NULL},
1031 {
VER,
"DeleteCallbackSetup" ,
NS(MkObjectC_DeleteCallbackSetup) , NULL, NULL},
1032 {
VER,
"HandleDeleteByNetHdl",
NS(MkObjectC_HandleDeleteByNetHdl) , NULL, NULL},
1035 {
VER,
"SysHashI32" ,
NS(MkObjectC_SysHashI32) , NULL, NULL},
1036 {
VER,
"SysHashSTR" ,
NS(MkObjectC_SysHashSTR) , NULL, NULL},
1039 {0, NULL, NULL, NULL}
1049#define ALL_INIT_AT_STARTUP
1051static void NS(sUnknownAllMethods) (
1055 const Tcl_MethodType *type = ukn->list;
1056 const size_t nmemb = ukn->nmemb;
1057 const OT_CLS_T classC = ukn->classC;
1060 for (
int i=0; i<nmemb; i++) {
1064 if (type[i].name[0] ==
'<') {
1065 if (type[i].name[1] ==
'c') {
1066 if (strcmp(type[i].name,
"<constructor>") == 0) {
1067#ifdef ALL_INIT_AT_STARTUP
1068 Tcl_Method mth = Tcl_NewMethod(interp, classC, NULL, 1, &type[i], NULL);
1069 Tcl_ClassSetConstructor(interp,classC,mth);
1074 }
else if (type[i].name[1] ==
'd') {
1075 if (strcmp(type[i].name,
"<destructor>") == 0) {
1076#ifdef ALL_INIT_AT_STARTUP
1092 Tcl_NewMethod(interp, classC, Tcl_NewStringObj(type[i].name,-1), 1, &type[i], NULL);
1096 Tcl_NewInstanceMethod(interp, classO, Tcl_NewStringObj(type[i].name,-1), 1, &type[i], NULL);
1103#ifndef ALL_INIT_AT_STARTUP
1104static int NS(sUnknownSort) (
const void *one,
const void *two) {
1105 return strcmp(((Tcl_MethodType*)one)->name, ((Tcl_MethodType*)two)->name);
1108static int NS(sUnknownSort2) (
const void *one,
const void *two) {
1110 return strcmp(((
MK_STRN)one), ((Tcl_MethodType*)two)->name);
1113 Tcl_MethodType* item = NULL;
1121 MK_STRN key = Tcl_GetString(objv[skip]);
1122 item = bsearch (key, ukn->list, ukn->nmemb,
sizeof(Tcl_MethodType),
NS(sUnknownSort2));
1126 switch (ukn->what) {
1128 Tcl_NewMethod(interp, ukn->classC, Tcl_NewStringObj(item->name,-1), 1, item, NULL);
1131 Tcl_NewInstanceMethod(interp, ukn->classO, Tcl_NewStringObj(item->name,-1), 1, item, NULL);
1134 return Tcl_EvalObjv(interp,objc,objv,0);
1137 NS(sUnknownAllMethods)(interp,ukn);
1139 return Tcl_ObjectContextInvokeNext(interp,objCtx,objc,objv,skip);
1150 const Tcl_MethodType methodsDefs[],
1153 OT_CLS_T classC = Tcl_GetObjectAsClass(classO);
1158 if (uknPtr->list != NULL)
return TCL_OK;
1162 for (num=0; methodsDefs[num].version != 0; num++) { };
1163 *uknPtr = (
OtUnknownS) {uknPtr->what, num, methodsDefs, classO, classC};
1165#ifdef ALL_INIT_AT_STARTUP
1166 NS(sUnknownAllMethods)(interp,uknPtr);
1168 qsort(methodsDefs, num,
sizeof(Tcl_MethodType),
NS(sUnknownSort));
1172 const static Tcl_MethodType
NS(sUnknownDef) = {
VER,
"unknown",
NS(sUnknownObjCmd), NULL, NULL };
1174 switch (uknPtr->what) {
1179 Tcl_NewInstanceMethod(interp, classO, Tcl_NewStringObj(
"unknown",-1), 1, &
NS(sUnknownDef), uknPtr);
1185 Tcl_MethodType* item;
1188 item = bsearch(
"<constructor>", uknPtr->list, uknPtr->nmemb,
sizeof(Tcl_MethodType),
NS(sUnknownSort2));
1190 Tcl_Method mth = Tcl_NewMethod(interp, classC, NULL, 1, item, NULL);
1191 Tcl_ClassSetConstructor(interp,classC,mth);
1206 Tcl_NewMethod(interp, classC, Tcl_NewStringObj(
"unknown",-1), 1, &
NS(sUnknownDef), uknPtr);
1217#undef ALL_INIT_AT_STARTUP
1221const static Tcl_MethodType
NS(sInstanceDef)[] = {
1226 {
VER,
"DbgDump" ,
NS(MkObjectC_DbgDump) , NULL, NULL},
1227 {
VER,
"DbgL" ,
NS(MkObjectC_DbgL) , NULL, NULL},
1228 {
VER,
"DbgLogC" ,
NS(MkObjectC_DbgLogC) , NULL, NULL},
1229 {
VER,
"DbgO" ,
NS(MkObjectC_DbgO) , NULL, NULL},
1230 {
VER,
"DbgSTACK" ,
NS(MkObjectC_DbgSTACK) , NULL, NULL},
1233 {
VER,
"LogC" ,
NS(MkObjectC_LogC) , NULL, NULL},
1234 {
VER,
"LogHEX" ,
NS(MkObjectC_LogHEX) , NULL, NULL},
1237 {
VER,
"RefGet" ,
NS(MkObjectC_RefGet) , NULL, NULL},
1240 {
VER,
"Delete" ,
NS(MkObjectC_Delete) , NULL, NULL},
1243 {
VER,
"Dispose" ,
NS(MkObjectC_Dispose) , NULL, NULL},
1246 {
VER,
"ErrorCatch" ,
NS(MkObjectC_ErrorCatch) , NULL, NULL},
1247 {
VER,
"Next" ,
NS(MkObjectC_Next) , NULL, NULL},
1248 {
VER,
"Prev" ,
NS(MkObjectC_Prev) , NULL, NULL},
1249 {
VER,
"ToError" ,
NS(MkObjectC_ToError) , NULL, NULL},
1252 {
VER,
"HandleDelete" ,
NS(MkObjectC_HandleDelete) , NULL, NULL},
1253 {
VER,
"HandleExists" ,
NS(MkObjectC_HandleExists) , NULL, NULL},
1254 {
VER,
"HandleGet" ,
NS(MkObjectC_HandleGet) , NULL, NULL},
1255 {
VER,
"HandleGetOfType" ,
NS(MkObjectC_HandleGetOfType) , NULL, NULL},
1256 {
VER,
"HandleGetOr0" ,
NS(MkObjectC_HandleGetOr0) , NULL, NULL},
1257 {
VER,
"IsNull" ,
NS(MkObjectC_IsNull) , NULL, NULL},
1258 {
VER,
"Log" ,
NS(MkObjectC_Log) , NULL, NULL},
1259 {
VER,
"LogLong" ,
NS(MkObjectC_LogLong) , NULL, NULL},
1260 {
VER,
"LogShort" ,
NS(MkObjectC_LogShort) , NULL, NULL},
1261 {
VER,
"LogType" ,
NS(MkObjectC_LogType) , NULL, NULL},
1262 {
VER,
"ToName" ,
NS(MkObjectC_ToName) , NULL, NULL},
1263 {
VER,
"ToNameOfClass" ,
NS(MkObjectC_ToNameOfClass) , NULL, NULL},
1264 {
VER,
"ToNameOfType" ,
NS(MkObjectC_ToNameOfType) , NULL, NULL},
1265 {
VER,
"ToString" ,
NS(MkObjectC_ToString) , NULL, NULL},
1268 {
VER,
"SysKill" ,
NS(MkObjectC_SysKill) , NULL, NULL},
1271 {
VER,
"SysGetPid" ,
NS(MkObjectC_SysGetPid) , NULL, NULL},
1274 {0, NULL, NULL, NULL, NULL}
#define OT_SETUP_VARARGS(min, max, d)
#define OT_CHECK_NIH(val)
#define OT_retObj_SET_BOL(nat)
#define OT_SETUP_NOARG(d)
#define OT_SETUP_ONEARG(d)
#define OT_CHECK_NI4(val)
#define OT_retObj_SET_Error
#define OT_retObj_SET_HDL(nat)
#define OT_OBJECT_DELETE(O)
#define OT_CHECK_REQUIRED(val)
#define OT_retObj_SET_None
#define OT_retObj_SET_I32(nat)
#define OT_retObj_SET_OBJ(nat)
#define OT_CHECK__ME_REF_MkBinaryR(val)
#define OT_retObj_SET_STR(nat)
#define OT_CHECK_OPTIONAL(val)
#define OT_retObj_SET_ERR(nat)
#define OT_OBJECT_DISPOSE(O)
#define MkErrorC_Check(mng, PROC)
#define OT_CHECK_STRN(val)
#define HandleDeleteByNetHdl_doc
#define OT_SETUP_hdl_destr
#define HandleResolve_doc
#define MkDbgDumpTmpl(...)
#define OT_SETUP_hdl_static
#define DeleteCallbackCleanup_doc
static enum MkErrorE TclDbgDump(OT_Prefix_ARGS MK_OBJ const obj, MK_STRN const message, MK_STRN const callfunc)
#define OT_SETUP_hdl__null_allow
#define MkObjectToNameOfClassTmpl(hdl)
static __thread MK_TYP MkObjectCTT
#define MkObjectErrorCatchTmpl(...)
#define DeleteCallbackSetup_doc
#define HandleGetOfType_doc
#define ToNameOfClass_doc
#define MK_NULL_YES
flag, allow NULL
MkErrorE
collection for the different error-codes …
@ MK_OK
(persistent) everything is OK.
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 const * MK_EXP
exception object pointer
int32_t MK_HDL
4 byte int handle data-type
signed int MK_I32
4 byte integer data-type
int MK_DBG
debug-level data-type …
#define MkObjectHandleResolve(...)
#define MkObjectHandleGet(...)
static MK_HDL MkObjectHandleGetOfType(MK_OBJ const obj)
Export-Slot - returns typeHdl of the obj .
static MK_OBJ MkObjectGetNull(void)
Null-Slot - return a MkObjectC typed NULL instance …
#define MkObjectHandleDelete(...)
static MK_OBJ MkObjectPrev(MK_OBJ const obj)
get previous instance from linked-list of MkObjectS type
static MK_OBJ MkObjectNext(MK_OBJ const obj)
get next instance from linked-list of MkObjectS type
#define MkObjectInstances()
MK_HDL MkObjectHandleGetOr0(MK_OBJ const obj)
return export-hdl or 0 in not created…
bool MkObjectHandleExists(MK_OBJ const obj)
check if obj has already a handle defined…
#define MkObjectHandleDeleteByNetHdl(...)
#define MkObjectLogLong(...)
#define MkObjectLogShort(...)
#define MkObjectLogType(...)
static bool MkObjectIsNull(MK_OBJ const obj)
ckeck if the object is "MK_NULL"
#define MkObjectToName(...)
#define MkObjectToString(...)
#define MkObjectToError(...)
#define MkObjectToNameOfType(...)
static MK_I32 MkRefGet(MK_OBJ const obj)
get the reference-count
enum MkErrorE MkSysKill(MK_OBJN fmtobj, MK_I32 pid, MK_I32 signal)
kill syscall with tclmkkernel error plugin
enum MkErrorE MkSysGetPid(MK_OBJN fmtobj, MK_I32 *pid_out)
getpid syscall with tclmkkernel error plugin
MK_STRN MkSysHashSTR(MK_STRN key, MK_NUM length)
compute the HASH from a string …
static bool MkSysStringIsNULL(MK_STRN str)
test if string is NULL or EMPTY …
MK_I32 MkSysHashI32(MK_STRN key, MK_NUM length)
same as MkSysHashSTR but return MK_I32 …
#define MkObjectDeleteCallbackCleanup(...)
#define MkObjectDeleteCallbackSetup(...)
enum MkErrorE(* MkObjectDeleteCallF)(MK_RT mkrt, MK_OBJN const obj, MK_STRN const typeName, MK_HDL const typeHdl, MK_HDL const objHdl, MK_CBP const __data__)
static callback to delete an obj …
static MK_I32 MkRuntimeDebugGet(void)
get the MkRuntimeS::debug value …
#define MkRuntimeLogBufferPush()
#define MkRuntimeLogBufferPop()
#define OT_CHECK_CALLABLE(val)
#define OT_CLEANUP_CALLABLE(val)
#define OT_SETUP_CALLABLE(val)
#define OT_CHECK_OBJN(val, nullB)
#define OT_CHECK_EXP(val)
binary data default format …
The data-type to store and handle the error-condition …
MkTypeS - class known as typ or type is used as class-base for a Managed-Object-Technology (MOT) type...