kbe常用宏展开示例(INSTANCE_SCRIPT_HREADER)

子类化  将一些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);
}	  
发布了19 篇原创文章 · 获赞 10 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/ltk80/article/details/104346558
今日推荐