12#include "misc_check_py.h"
14#define OT_SETUP_hdl MkRtSetup_NULL; \
15 MK_OBJ hdl = MK_ERROR_PRINT;
16#define OT_SETUP_hdl_static __attribute__((unused)) MK_RT mkrt = MkRT; \
17 __attribute__((unused)) MK_ERR hdl = &MkERROR;
26#define MkCleanupTmpl()
144#define ErrorE_FromInt_doc "MkErrorE ErrorE_FromInt(value:int32)"
145#define IdSE_FromInt_doc "MkIdSE IdSE_FromInt(value:int32)"
146#define TimeoutE_FromInt_doc "MkTimeoutE TimeoutE_FromInt(value:int32)"
147#define TypeE_FromInt_doc "MkTypeE TypeE_FromInt(value:int32)"
150#define ErrorE_ToInt_doc "int32 ErrorE_ToInt(value:MkErrorE)"
151#define ErrorE_ToString_doc "string ErrorE_ToString(value:MkErrorE)"
152#define IdSE_ToInt_doc "int32 IdSE_ToInt(value:MkIdSE)"
153#define IdSE_ToString_doc "string IdSE_ToString(value:MkIdSE)"
154#define TimeoutE_ToInt_doc "int32 TimeoutE_ToInt(value:MkTimeoutE)"
155#define TimeoutE_ToString_doc "string TimeoutE_ToString(value:MkTimeoutE)"
156#define TypeE_ToInt_doc "int32 TypeE_ToInt(value:MkTypeE)"
157#define TypeE_ToString_doc "string TypeE_ToString(value:MkTypeE)"
160#define Cleanup_doc "Cleanup()"
161#define Setup_doc "Setup()"
165#define Debug_doc "Debug(prefix:str, ?obj:object?)"
179 PyObject *item=NULL, *strO=NULL, *iterator=NULL;
189 iterator = PyObject_GetIter(argsO);
190 while ((item = PyIter_Next(iterator))) {
215 Py_ssize_t *origskip,
223 if (origskip==NULL) {
225 objc = PyTuple_GET_SIZE(objv);
235 for (; __skip < objc; __skip++) {
236 LngErrorCheckN (strO = PyObject_Str(PyTuple_GET_ITEM(objv,__skip)))
245 if (args && args != orig) {
279 OT_OBJ_T stack = 0; \
280 if (frameP == NULL || *frameP == 0) { \
281 LngErrorCheckN(stack = PyObject_CallNoArgs(NS(MkKernelThreadState).inspect_stack)); \
282 if (frameP != NULL) *frameP = stack; \
287MK_STRN NS(Get_Call_Proc) (Py_ssize_t idx, PyObject ** frameP) {
288 PyObject *frameO=NULL, *valO = NULL;
290 if (!PyList_Check(stack))
goto error;
292 if (!PyObject_HasAttrString(frameO,
"function"))
goto error;
297 static __thread
char buffer[256];
298 NS(LngUnicodeObjToBuffer)(valO,buffer,256,
"none");
300 char *bufP = buffer, *endP=buffer+strlen(buffer)-1;
301 while (isspace(*bufP) && *bufP !=
'\0') bufP++;
302 while (isspace(*endP) && endP > bufP) endP--;
310MK_STRN NS(Get_Call_Code) (Py_ssize_t idx, PyObject ** frameP) {
311 PyObject *frameO=NULL, *valO = NULL, *lstO=NULL;
313 if (!PyList_Check(stack))
goto error;
315 if (!PyObject_HasAttrString(frameO,
"code_context"))
goto error;
316 LngErrorCheckN(lstO = PyObject_GetAttrString(frameO,
"code_context"));
317 if (!PyList_Check(lstO))
goto error;
322 static __thread
char buffer[256];
323 NS(LngUnicodeObjToBuffer)(valO,buffer,256,
"none");
325 char *bufP = buffer, *endP=buffer+strlen(buffer)-1;
326 while (isspace(*bufP) && *bufP !=
'\0') bufP++;
327 while (isspace(*endP) && endP > bufP) endP--;
335MK_STRN NS(Get_Call_Script) (Py_ssize_t idx, PyObject ** frameP) {
336 PyObject *frameO=NULL, *valO = NULL;
338 if (!PyList_Check(stack))
goto error;
340 if (!PyObject_HasAttrString(frameO,
"filename"))
goto error;
344 static __thread
char buffer[256];
345 NS(LngUnicodeObjToBuffer)(valO,buffer,256,
"none");
353MK_I32 NS(Get_Call_Line) (Py_ssize_t idx, PyObject ** frameP) {
354 PyObject *frameO=NULL, *valO = NULL;
359 if (valO != NULL && CHECK_LONG(valO)) {
360 MK_I32 ret = (int) PyLong_AsLong(valO);
371 if (idx >= PyList_GET_SIZE(stack))
return false;
373 NS(Get_Call_Code)(idx,&stack),
374 NS(Get_Call_Script)(idx,&stack),
375 NS(Get_Call_Line)(idx,&stack)
389char*
NS(LngErrorToString)(void) {
390 static __thread
char buffer[1000];
392 PyObject *expO = PyErr_GetRaisedException();
393 if (expO == NULL)
return "";
395 PyObject *typeO = Py_NewRef(Py_TYPE(expO));
396 PyObject *tbO = PyException_GetTraceback(expO);
398 PyObject *tmod = NULL, *strO = NULL, *lstO = NULL, *valO = NULL;
402 LngErrorCheckNT(end1, lstO = PyObject_CallMethod(tmod,
"format_exception",
"OOO", typeO, expO, tbO));
404 LngErrorCheckNT(end1, lstO = PyObject_CallMethod(tmod,
"format_exception_only",
"OO", typeO, expO));
407 LngErrorCheckNT(end1, valO = PyObject_CallMethod(strO,
"join",
"O", lstO));
412 if (valO != NULL && PyUnicode_Check(valO)) {
415 strncpy(buffer,PyUnicode_AsUTF8(strO),1000);
416 buffer[1000-1] =
'\0';
420 strncpy(buffer,
"unknown error",1000);
431const char*
NS(LngObjToString) (PyObject *
obj) {
434 }
else if (
obj == Py_None) {
436 }
else if (PyUnicode_Check(
obj)) {
437 return PyUnicode_AsUTF8(
obj);
440 static __thread
char buffer[1000];
441 PyObject *strO=PyObject_Str(
obj);
443 MK_STRN str = PyUnicode_AsUTF8(strO);
445 strncpy(buffer,str,1000);
446 buffer[1000-1] =
'\0';
449 strncpy(buffer,
"*ERROR*",1000);
466 MK_STRN str=PyUnicode_Check(
obj) ? PyUnicode_AsUTF8(
obj) : def;
467 strncpy(buffer,str,(
size_t)sz-1);
480 PyObject *strO=NULL, *utf8=NULL;
490 MkLogV_4M(hdl,prefix,0,
"%s, type=%s, refCnt=%-3zi\n",
491 PyBytes_AsString(utf8), Py_TYPE(
obj)->tp_name, Py_REFCNT(
obj)-1);
749static PyMethodDef
NS(sMkKernelMethods)[] = {
756 {
"IdSE_FromInt" , (PyCFunction)
NS(MkKernel_IdSE_FromInt) , METH_O ,
IdSE_FromInt_doc },
758 {
"TypeE_FromInt" , (PyCFunction)
NS(MkKernel_TypeE_FromInt) , METH_O ,
TypeE_FromInt_doc },
761 {
"ErrorE_ToInt" , (PyCFunction)
NS(MkKernel_ErrorE_ToInt) , METH_O ,
ErrorE_ToInt_doc },
763 {
"IdSE_ToInt" , (PyCFunction)
NS(MkKernel_IdSE_ToInt) , METH_O ,
IdSE_ToInt_doc },
764 {
"IdSE_ToString" , (PyCFunction)
NS(MkKernel_IdSE_ToString) , METH_O ,
IdSE_ToString_doc },
767 {
"TypeE_ToInt" , (PyCFunction)
NS(MkKernel_TypeE_ToInt) , METH_O ,
TypeE_ToInt_doc },
771 {
"Cleanup" , (PyCFunction)
NS(MkKernel_Cleanup) , METH_NOARGS ,
Cleanup_doc },
772 {
"Setup" , (PyCFunction)
NS(MkKernel_Setup) , METH_NOARGS ,
Setup_doc },
782 {NULL, NULL, 0, NULL}
792 return (pid_t) PyLong_AS_LONG(ret);
812NS(sMkKernelGetState)(PyObject *module)
814 void *state = PyModule_GetState(module);
815 assert(state != NULL);
820NS(sMkKernelTraverse)(PyObject *module, visitproc visit,
void *arg)
843 Py_VISIT(
NS(MkKernelThreadState).MkExceptionC);
844 Py_VISIT(
NS(MkKernelThreadState).InitError);
845 Py_VISIT(
NS(MkKernelThreadState).InitSoftError);
846 Py_VISIT(
NS(MkKernelThreadState).inspect_stack);
847 Py_VISIT(
NS(MkKernelThreadState).emptyTuple);
852NS(sMkKernelClear)(PyObject *module)
874 Py_CLEAR(
NS(MkKernelThreadState).MkExceptionC);
875 Py_CLEAR(
NS(MkKernelThreadState).InitError);
876 Py_CLEAR(
NS(MkKernelThreadState).InitSoftError);
877 Py_CLEAR(
NS(MkKernelThreadState).inspect_stack);
878 Py_CLEAR(
NS(MkKernelThreadState).emptyTuple);
883NS(sMkKernelFree)(
void *module)
885 NS(sMkKernelClear)((PyObject *)module);
893NS(sMkKernelExec)(PyObject *module)
904 PyObject *mainM = PyImport_AddModule(
"__main__");
905 NS(pymkkernel) =
module;
919 LngErrorCheckN(tmpO = PyErr_NewException(
"pymkkernel.MkExceptionC", NULL, NULL));
921 NS(MkKernelThreadState).MkExceptionC = tmpO;
926 "from enum import IntEnum, IntFlag\n"
930 "class MkErrorE(IntEnum):\n"
935 "class MkIdSE(IntEnum):\n"
940 "class MkTimeoutE(IntEnum):\n"
951 "class MkTypeE(IntEnum):\n"
966 PyObject *mainD = PyModule_GetDict(mainM);
967 PyObject *myD = PyModule_GetDict(module);
968 tmpO = PyRun_String(enumCode, Py_file_input, mainD, myD);
974 MkErrorE_lngO = (PyTypeObject*) Py_NewRef(PyDict_GetItemString(myD,
"MkErrorE"));
975 MkIdSE_lngO = (PyTypeObject*) Py_NewRef(PyDict_GetItemString(myD,
"MkIdSE"));
976 MkTimeoutE_lngO = (PyTypeObject*) Py_NewRef(PyDict_GetItemString(myD,
"MkTimeoutE"));
977 MkTypeE_lngO = (PyTypeObject*) Py_NewRef(PyDict_GetItemString(myD,
"MkTypeE"));
981 PyObject *nameO = PyObject_GetAttrString(mainM,
"__name__");
983 if (strcmp(PyUnicode_AsUTF8(nameO),
"__main__") == 0) {
985 tmpO = PyImport_ImportModule(
"os");
993 "class InitError(Exception):\n"
995 "class InitSoftError(Exception):\n"
998 tmpO = PyRun_String(errorCode, Py_file_input, mainD, myD);
1002 NS(MkKernelThreadState).InitError = Py_NewRef(PyDict_GetItemString(myD,
"InitError"));
1003 NS(MkKernelThreadState).InitSoftError = Py_NewRef(PyDict_GetItemString(myD,
"InitSoftError"));
1007 LngErrorCheckN(
NS(MkKernelThreadState).inspect_stack = PyObject_GetAttrString(tmpO,
"stack"));
1019 {Py_mod_exec,
NS(sMkKernelExec)},
1020 {Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
1024static PyModuleDef
NS(sMkKernelDef) = {
1025 PyModuleDef_HEAD_INIT,
1026 .m_name =
"pymkkernel",
1027 .m_doc =
"python language binding for 'theKernel'",
1029 .m_methods =
NS(sMkKernelMethods),
1030 .m_slots =
NS(sMkKernelDefSlots),
1031 .m_traverse =
NS(sMkKernelTraverse),
1032 .m_clear =
NS(sMkKernelClear),
1033 .m_free =
NS(sMkKernelFree),
1047 return PyModuleDef_Init(&
NS(sMkKernelDef));
#define IdSE_ToString_doc
#define TimeoutE_FromInt_doc
PyMODINIT_FUNC LibMkKernel(void)
#define ErrorE_ToString_doc
#define OT_SETUP_hdl_static
#define ErrorE_FromInt_doc
#define TypeE_FromInt_doc
#define TimeoutE_ToString_doc
#define TimeoutE_ToInt_doc
#define TypeE_ToString_doc
#define LngErrorCheckN(PROC)
#define OT_SETUP_VARARGS(min, max, d)
#define OT_SETUP_NOARG(d)
#define OT_SETUP_ONEARG(d)
#define OT_LNG_OBJECT_IS(objV)
#define OT_SETUP_OBJ(o, v)
#define MkObjectC_MK_NULL
#define OtErrorCheckLng(PROC)
#define OT_CHECK_NI4(val)
#define OT_retObj_SET_Error
#define MkLogFileC_MK_NULL
#define OT_CHECK_REQUIRED(val)
#define OT_retObj_SET_None
#define OT_retObj_SET_I32(nat)
#define LngErrorCheckNT(TAG, PROC)
#define MkBufferListC_MK_NULL
#define MkRuntimeC_MK_NULL
static PyObject * PyC2O(MK_STRN v)
#define OT_ERROR_LNG_2_META(m)
#define OT_retObj_SET_STR(nat)
#define OT_NEW_Mk_enum_OBJ(typ, val)
#define MkBufferC_MK_NULL
#define OT_CHECK_OPTIONAL(val)
#define MkBufferStreamC_MK_NULL
#define OT_retObj_SET(val)
#define MkErrorC_Check(mng, PROC)
#define MkBufferListAppendSTR(...)
#define MkBufferListCreate(...)
#define MkBufferListDelete(x)
#define MkErrorStackFormat(...)
#define MK_UNUSED
mark unnused variables and functions
MK_STRN MkTimeoutE_ToString(enum MkTimeoutE value)
return the MkTimeoutE as string …
MkTimeoutE
Predefined Timeout values …
enum MkErrorE MkIdSE_FromInt(MK_I32 const value, enum MkIdSE *value_out)
return the MkIdSE from integer …
static MK_I32 MkTypeE_ToInt(enum MkTypeE value)
return the MkTypeE as integer …
static MK_I32 MkErrorE_ToInt(enum MkErrorE value)
return the MkErrorE as integer …
static MK_I32 MkTimeoutE_ToInt(enum MkTimeoutE value)
return the MkTimeoutE as integer …
enum MkErrorE MkTypeE_FromInt(MK_I32 const value, enum MkTypeE *value_out)
return the MkTypeE from integer …
MK_STRN MkIdSE_ToString(enum MkIdSE value)
return the MkIdSE as string …
static MK_I32 MkIdSE_ToInt(enum MkIdSE value)
return the MkIdSE as integer …
enum MkErrorE MkErrorE_FromInt(MK_I32 const value, enum MkErrorE *value_out)
return the MkErrorE from integer …
enum MkErrorE MkTimeoutE_FromInt(MK_I32 const value, enum MkTimeoutE *value_out)
return the MkTimeoutE from integer …
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 …
@ MK_ERROR
(persistent) raise an error-event, the calling-fucntion is interrupted.
@ MK_OK
(persistent) everything is OK.
void MkSetup(void)
setup pymkkernel internal memory …
int32_t MK_NUM
array size data-type ('num' items in array …
const MK_STRB * MK_STRN
constant string pointer data-type
MK_STRB * MK_STR
string pointer data-type with UTF8 ecoding (string)
signed int MK_I32
4 byte integer data-type
#define MkLogV_4M(x, callfunc, debug, printfmt,...)
MkIdSE
signal type of the MkIdS data val …
struct MkLalS MkLal
Language Abstraction Layer in duty.
#define OT_CHECK_STR(val)
#define OT_CHECK_ENUM(ename, val)
#define OT_CHECK_LNG_T(val)
The CLASS used to store a list of MkBufferS items into a flat array…
The data-type to store and handle the error-condition …
MkSysForkF SysFork
fork syscall …
The MkRuntimeS provide a per-thread environment for pymkkernel …