From 2fd6e728513f46e1f313667dfcf6b3d6e09cad39 Mon Sep 17 00:00:00 2001 From: Kester Maddock Date: Sun, 16 May 2004 13:05:15 +0000 Subject: Changed Python _getattr/_setattr methods to use const STR_String& instead of char* - makes using these methods much nicer. --- source/gameengine/Expressions/ListValue.cpp | 2 +- source/gameengine/Expressions/ListValue.h | 2 +- source/gameengine/Expressions/PyObjectPlus.cpp | 6 +++--- source/gameengine/Expressions/PyObjectPlus.h | 11 ++++++----- source/gameengine/Expressions/Value.cpp | 4 ++-- source/gameengine/Expressions/Value.h | 18 ++++++++++++++++-- 6 files changed, 29 insertions(+), 14 deletions(-) (limited to 'source/gameengine/Expressions') diff --git a/source/gameengine/Expressions/ListValue.cpp b/source/gameengine/Expressions/ListValue.cpp index 380befa51bd..6984e5663db 100644 --- a/source/gameengine/Expressions/ListValue.cpp +++ b/source/gameengine/Expressions/ListValue.cpp @@ -205,7 +205,7 @@ PyMethodDef CListValue::Methods[] = { -PyObject* CListValue::_getattr(char* attr) { +PyObject* CListValue::_getattr(const STR_String& attr) { _getattr_up(CValue); } diff --git a/source/gameengine/Expressions/ListValue.h b/source/gameengine/Expressions/ListValue.h index 10c64a13177..431f8f558a9 100644 --- a/source/gameengine/Expressions/ListValue.h +++ b/source/gameengine/Expressions/ListValue.h @@ -59,7 +59,7 @@ public: bool CheckEqual(CValue* first,CValue* second); - virtual PyObject* _getattr(char *attr); + virtual PyObject* _getattr(const STR_String& attr); KX_PYMETHOD(CListValue,append); KX_PYMETHOD(CListValue,reverse); diff --git a/source/gameengine/Expressions/PyObjectPlus.cpp b/source/gameengine/Expressions/PyObjectPlus.cpp index f9801fe0f60..74468cf030d 100644 --- a/source/gameengine/Expressions/PyObjectPlus.cpp +++ b/source/gameengine/Expressions/PyObjectPlus.cpp @@ -100,15 +100,15 @@ PyParentObject PyObjectPlus::Parents[] = {&PyObjectPlus::Type, NULL}; /*------------------------------ * PyObjectPlus attributes -- attributes ------------------------------*/ -PyObject *PyObjectPlus::_getattr(char *attr) +PyObject *PyObjectPlus::_getattr(const STR_String& attr) { //if (streq(attr, "type")) // return Py_BuildValue("s", (*(GetParents()))->tp_name); - return Py_FindMethod(Methods, this, attr); + return Py_FindMethod(Methods, this, const_cast(attr.ReadPtr())); } -int PyObjectPlus::_setattr(char *attr, PyObject *value) +int PyObjectPlus::_setattr(const STR_String& attr, PyObject *value) { //return PyObject::_setattr(attr,value); //cerr << "Unknown attribute" << endl; diff --git a/source/gameengine/Expressions/PyObjectPlus.h b/source/gameengine/Expressions/PyObjectPlus.h index 40d8ffb5903..7c5f531f35b 100644 --- a/source/gameengine/Expressions/PyObjectPlus.h +++ b/source/gameengine/Expressions/PyObjectPlus.h @@ -40,6 +40,7 @@ #endif #include "KX_Python.h" +#include "STR_String.h" /*------------------------------ * Python defines @@ -72,7 +73,7 @@ inline void Py_Fatal(char *M) { // which allows attribute and method calls // to be properly passed up the hierarchy. #define _getattr_up(Parent) \ - PyObject *rvalue = Py_FindMethod(Methods, this, attr); \ + PyObject *rvalue = Py_FindMethod(Methods, this, const_cast(attr.ReadPtr())); \ if (rvalue == NULL) \ { \ PyErr_Clear(); \ @@ -107,15 +108,15 @@ class PyObjectPlus : public PyObject { // The PyObjectPlus abstract class // Py_DECREF(this); // }; // decref method - virtual PyObject *_getattr(char *attr); // _getattr method + virtual PyObject *_getattr(const STR_String& attr); // _getattr method static PyObject *__getattr(PyObject * PyObj, char *attr) // This should be the entry in Type. - { return ((PyObjectPlus*) PyObj)->_getattr(attr); }; + { return ((PyObjectPlus*) PyObj)->_getattr(STR_String(attr)); }; - virtual int _setattr(char *attr, PyObject *value); // _setattr method + virtual int _setattr(const STR_String& attr, PyObject *value); // _setattr method static int __setattr(PyObject *PyObj, // This should be the entry in Type. char *attr, PyObject *value) - { return ((PyObjectPlus*) PyObj)->_setattr(attr, value); }; + { return ((PyObjectPlus*) PyObj)->_setattr(STR_String(attr), value); }; virtual PyObject *_repr(void); // _repr method static PyObject *__repr(PyObject *PyObj) // This should be the entry in Type. diff --git a/source/gameengine/Expressions/Value.cpp b/source/gameengine/Expressions/Value.cpp index 58f07790f6a..55dd1f5c1dd 100644 --- a/source/gameengine/Expressions/Value.cpp +++ b/source/gameengine/Expressions/Value.cpp @@ -609,7 +609,7 @@ static PyMethodDef CValueMethods[] = }; -PyObject* CValue::_getattr(char* attr) +PyObject* CValue::_getattr(const STR_String& attr) { CValue* resultattr = FindIdentifier(attr); STR_String text; @@ -698,7 +698,7 @@ CValue* CValue::ConvertPythonToValue(PyObject* pyobj) return vallie; } -int CValue::_setattr(char* attr,PyObject* pyobj) +int CValue::_setattr(const STR_String& attr,PyObject* pyobj) { if (!pyobj) { // member deletion diff --git a/source/gameengine/Expressions/Value.h b/source/gameengine/Expressions/Value.h index 527dfa85d39..4656e2ca5ac 100644 --- a/source/gameengine/Expressions/Value.h +++ b/source/gameengine/Expressions/Value.h @@ -200,6 +200,20 @@ public: static char method_name##_doc[]; \ /* The line above should remain empty */ +/** + * Method table macro (with doc) + */ +#define KX_PYMETHODTABLE(class_name, method_name) \ + {#method_name , (PyCFunction) class_name::sPy##method_name, METH_VARARGS, class_name::method_name##_doc} + +/** + * Function implementation macro + */ +#define KX_PYMETHODDEF_DOC(class_name, method_name, doc_string) \ +char class_name::method_name##_doc[] = doc_string; \ +PyObject* class_name::Py##method_name(PyObject* self, PyObject* args, PyObject* kwds) + + #ifndef NO_EXP_PYTHON_EMBEDDING #include "PyObjectPlus.h" @@ -239,7 +253,7 @@ public: - PyObject* _getattr(char* attr); + virtual PyObject* _getattr(const STR_String& attr); void SpecialRelease() { @@ -266,7 +280,7 @@ public: virtual CValue* ConvertPythonToValue(PyObject* pyobj); - int _setattr(char* attr,PyObject* value); + virtual int _setattr(const STR_String& attr,PyObject* value); KX_PYMETHOD(CValue,GetName); -- cgit v1.2.3