子类化 将一些py操作填充进派生类
类:class ClientObjectBase:public script::ScriptObject 属于脚本导出类
宏操作展开为:
static PyTypeObject _scriptType;
typedef ClientObjectBase ThisClass;
static PyObject* _tp_repr(PyObject* self) {
return static_cast<ClientObjectBase*>(self)->tp_repr(); }
static PyObject* _tp_str(PyObject* self) {
return static_cast<ClientObjectBase*>(self)->tp_str(); }
static PyObject* _tp_new(PyTypeObject* type, PyObject* args, PyObject* kwds) {
return ClientObjectBase::tp_new(type, args, kwds); }
static PyObject* _tp_getattro(PyObject* self, PyObject* name) {
return static_cast<ClientObjectBase*>(self)->onScriptGetAttribute(name); }
static int _tp_setattro(PyObject* self, PyObject* name, PyObject* value) {
return (value != 0) ?
static_cast<ClientObjectBase*>(self)->onScriptSetAttribute(name, value):
static_cast<ClientObjectBase*>(self)->onScriptDelAttribute(name); }
static int _tp_init(PyObject* self, PyObject *args, PyObject* kwds) {
return static_cast<ClientObjectBase*>(self)->onScriptInit(self, args, kwds); }
public:
static PyMethodDef* _ClientObjectBase_lpScriptmethods;
static PyMemberDef* _ClientObjectBase_lpScriptmembers;
static PyGetSetDef* _ClientObjectBase_lpgetseters;
static PyMethodDef _ClientObjectBase_scriptMethods[];
static PyMemberDef _ClientObjectBase_scriptMembers[];
static PyGetSetDef _ClientObjectBase_scriptGetSeters[];
static bool _ClientObjectBase_py_installed;
static int __py_readonly_descr(PyObject* self, PyObject* value, void* closure) {
PyErr_Format(PyExc_TypeError, "Sorry, this attribute %s.%s is read-only",
(self != 0 ? self->ob_type->tp_name : "ClientObjectBase"),
(closure != 0 ? (char*)closure : "unknown"));
PyErr_PrintEx(0);
return 0; }
static int __py_writeonly_descr(PyObject* self, PyObject* value, void* closure) {
PyErr_Format(PyExc_TypeError, "Sorry, this attribute %s.%s is write-only",
(self != 0 ? self->ob_type->tp_name : "ClientObjectBase"),
(closure != 0 ? (char*)(closure) : "unknown"));
PyErr_PrintEx(0);
return 0; }
static PyTypeObject* getScriptType(void) { return &_scriptType; }
static PyTypeObject* getBaseScriptType(void) {
if(strcmp("ScriptObject", "ScriptObject") == 0)
return 0;
return ScriptObject::getScriptType(); }
static long calcDictOffset(void) {
if(strcmp("ScriptObject", "ScriptObject") == 0)
return 0;
return 0; }
static int calcTotalMethodCount(void) {
int nlen = 0;
while(true) {
PyMethodDef* pmf = &_ClientObjectBase_scriptMethods[nlen];
if(!pmf->ml_doc && !pmf->ml_flags && !pmf->ml_meth && !pmf->ml_name)
break;
nlen++;
}
if(strcmp("ClientObjectBase", "ScriptObject") == 0)
return nlen;
return ScriptObject::calcTotalMethodCount() + nlen;
}
static int calcTotalMemberCount(void) {
int nlen = 0;
while(true) {
PyMemberDef* pmd = &_ClientObjectBase_scriptMembers[nlen];
if(!pmd->doc && !pmd->flags && !pmd->type && !pmd->name && !pmd->offset)
break;
nlen++;
}
if(strcmp("ClientObjectBase", "ScriptObject") == 0)
return nlen;
return ScriptObject::calcTotalMemberCount() + nlen;
}
static int calcTotalGetSetCount(void) {
int nlen = 0;
while(true) {
PyGetSetDef* pgs = &_ClientObjectBase_scriptGetSeters[nlen];
if(!pgs->doc && !pgs->get && !pgs->set && !pgs->name && !pgs->closure)
break;
nlen++;
}
if(strcmp("ClientObjectBase", "ScriptObject") == 0)
return nlen;
return ScriptObject::calcTotalGetSetCount() + nlen;
}
static void setupScriptMethodAndAttribute(
PyMethodDef* lppmf, PyMemberDef* lppmd, PyGetSetDef* lppgs) {
int i = 0;
PyMethodDef* pmf = 0;
PyMemberDef* pmd = 0;
PyGetSetDef* pgs = 0;
while(true){
pmf = &_ClientObjectBase_scriptMethods[i];
if(!pmf->ml_doc && !pmf->ml_flags && !pmf->ml_meth && !pmf->ml_name)
break;
i++;
*(lppmf++) = *pmf;
}
i = 0;
while(true){
pmd = &_ClientObjectBase_scriptMembers[i];
if(!pmd->doc && !pmd->flags && !pmd->type && !pmd->name && !pmd->offset)
break;
i++;
*(lppmd++) = *pmd;
}
i = 0;
while(true){
pgs = &_ClientObjectBase_scriptGetSeters[i];
if(!pgs->doc && !pgs->get && !pgs->set && !pgs->name && !pgs->closure)
break;
i++;
*(lppgs++) = *pgs;
}
if(strcmp("ClientObjectBase", "ScriptObject") == 0){
*(lppmf) = *pmf;
*(lppmd) = *pmd;
*(lppgs) = *pgs;
return;
}
ScriptObject::setupScriptMethodAndAttribute(lppmf, lppmd, lppgs);
}
static void registerScript(PyObject* mod, const char* name = "ClientObjectBase") {
int nMethodCount = ClientObjectBase::calcTotalMethodCount();
int nMemberCount = ClientObjectBase::calcTotalMemberCount();
int nGetSetCount = ClientObjectBase::calcTotalGetSetCount();
_ClientObjectBase_lpScriptmethods = new PyMethodDef[nMethodCount + 2];
_ClientObjectBase_lpScriptmembers = new PyMemberDef[nMemberCount + 2];
_ClientObjectBase_lpgetseters = new PyGetSetDef[nGetSetCount + 2];
setupScriptMethodAndAttribute(_ClientObjectBase_lpScriptmethods,
_ClientObjectBase_lpScriptmembers, _ClientObjectBase_lpgetseters);
_scriptType.tp_methods = _ClientObjectBase_lpScriptmethods;
_scriptType.tp_members = _ClientObjectBase_lpScriptmembers;
_scriptType.tp_getset = _ClientObjectBase_lpgetseters;
if (PyType_Ready(&_scriptType) < 0){
DebugHelper::getSingleton().error_msg(("registerScript(): PyType_Ready("
"ClientObjectBase" ") error!"));
PyErr_Print();
return;
}
if(mod) {
( _Py_RefTotal++ , ((PyObject *)(&_scriptType))->ob_refcnt++);
if(PyModule_AddObject(mod, name, (PyObject *)&_scriptType) < 0) {
DebugHelper::getSingleton().error_msg((fmt::format("registerScript():
PyModule_AddObject({}) error!", name)));
}
}
{ if (PyErr_Occurred()) { PyErr_PrintEx(0); } };
_ClientObjectBase_py_installed = true;
}
static void installScript(PyObject* mod, const char* name = "ClientObjectBase") {
ClientObjectBase::onInstallScript(mod);
registerScript(mod, name);
ScriptObject::scriptObjectTypes[name] = &_scriptType;
}
static void unregisterScript(void) {
if (_ClientObjectBase_lpScriptmethods) {
delete[] _ClientObjectBase_lpScriptmethods;
_ClientObjectBase_lpScriptmethods = 0;
};
if (_ClientObjectBase_lpScriptmembers) {
delete[] _ClientObjectBase_lpScriptmembers;
_ClientObjectBase_lpScriptmembers = 0;
};
if (_ClientObjectBase_lpgetseters) {
delete[] _ClientObjectBase_lpgetseters;
_ClientObjectBase_lpgetseters = 0;
};
if(_ClientObjectBase_py_installed)
do {
PyObject *_py_decref_tmp = (PyObject *)(&_scriptType);
if (_Py_RefTotal-- , --(_py_decref_tmp)->ob_refcnt != 0) {
if (((PyObject*)_py_decref_tmp)->ob_refcnt < 0)
_Py_NegativeRefcount(
"e:\\kbe\\kbengine-1.3.6\\kbe\\src\\lib\\client_lib\\clientobjectbase.h",
56, (PyObject *)(_py_decref_tmp));
}
else
_Py_Dealloc(_py_decref_tmp);
} while (0);
}
static void uninstallScript(void) {
ClientObjectBase::onUninstallScript();
unregisterScript();
};
static void _tp_dealloc(PyObject* self) {
delete static_cast<ClientObjectBase*>(self);
}