From: <vo...@us...> - 2008-01-02 16:04:33
|
Revision: 504 http://opde.svn.sourceforge.net/opde/?rev=504&view=rev Author: volca Date: 2008-01-02 07:14:58 -0800 (Wed, 02 Jan 2008) Log Message: ----------- A method for running python scripts on char* (May be replaced with some compile->run scenario with error checking and reporting) Modified Paths: -------------- trunk/src/bindings/bindings.cpp trunk/src/bindings/bindings.h Modified: trunk/src/bindings/bindings.cpp =================================================================== --- trunk/src/bindings/bindings.cpp 2008-01-02 15:13:25 UTC (rev 503) +++ trunk/src/bindings/bindings.cpp 2008-01-02 15:14:58 UTC (rev 504) @@ -21,7 +21,7 @@ * $Id$ * *****************************************************************************/ - + #include "bindings.h" #include "ServiceBinder.h" #include "logger.h" @@ -60,18 +60,18 @@ const Ogre::Vector3& v = inst.toVector(); return Py_BuildValue("[fff]", v.x, v.y, v.z); } - + default: //All possible paths must return a value Py_INCREF(Py_None); return Py_None; } } - + DVariant PyObjectToDVariant(PyObject* obj) { // Do a conversion from python object to DVariant instance // Look for the type of the python object - if (PyInt_Check(obj)) + if (PyInt_Check(obj)) return DVariant(static_cast<int>(PyInt_AsLong(obj))); else if (PyBool_Check(obj)) { @@ -90,7 +90,7 @@ PyArg_Parse(obj, "[fff]", &X, &Y, &Z); return DVariant(X, Y, Z); } - + return DVariant(DVariant::DV_INVALID); //Py_None, or a non-handled type } @@ -99,10 +99,10 @@ PyObject* Py_Log(PyObject *self, Logger::LogLevel level, PyObject* args) { const char* text; PyObject* result = NULL; - + if (PyArg_ParseTuple(args, "s", &text)) { Logger::getSingleton().log(level, "Python: %s", text); - + result = Py_None; Py_INCREF(result); } else { @@ -111,15 +111,15 @@ return result; } - + PyObject* Py_Log_Fatal(PyObject *self, PyObject* args) { return Py_Log(self, Logger::LOG_FATAL, args); } - + PyObject* Py_Log_Error(PyObject *self, PyObject* args) { return Py_Log(self, Logger::LOG_ERROR, args); } - + PyObject* Py_Log_Info(PyObject *self, PyObject* args) { return Py_Log(self, Logger::LOG_INFO, args); } @@ -127,12 +127,12 @@ PyObject* Py_Log_Debug(PyObject *self, PyObject* args) { return Py_Log(self, Logger::LOG_DEBUG, args); } - + PyObject* Py_Log_Verbose(PyObject *self, PyObject* args) { return Py_Log(self, Logger::LOG_VERBOSE, args); } } // namespace Python - + PyMethodDef sOpdeMethods[] = { {"log_fatal", Python::Py_Log_Fatal, METH_VARARGS}, {"log_error", Python::Py_Log_Error, METH_VARARGS}, @@ -141,16 +141,16 @@ {"log_verbose", Python::Py_Log_Verbose, METH_VARARGS}, {NULL, NULL}, }; - + void PythonLanguage::init() { Py_Initialize(); - + // Create an Opde module PyObject* module = Py_InitModule("Opde", sOpdeMethods); - + // Call all the binders here. The result is initialized Python VM PyObject *servicemod = Python::ServiceBinder::init(module); - + if (PyErr_Occurred()) { // TODO: Do something useful here, or forget it PyErr_Print(); @@ -158,9 +158,14 @@ } } - + void PythonLanguage::term() { Py_Finalize(); } + void PythonLanguage::runScriptPtr(const char* ptr) { + // Is this the right way? + PyRun_SimpleString(ptr); + } + } // namespace Opde Modified: trunk/src/bindings/bindings.h =================================================================== --- trunk/src/bindings/bindings.h 2008-01-02 15:13:25 UTC (rev 503) +++ trunk/src/bindings/bindings.h 2008-01-02 15:14:58 UTC (rev 504) @@ -21,7 +21,7 @@ * $Id$ * *****************************************************************************/ - + #ifndef __BINDINGS_H #define __BINDINGS_H @@ -35,26 +35,26 @@ // Global utilities - object conversion and such PyObject* DVariantToPyObject(const DVariant& inst); DVariant PyObjectToDVariant(PyObject* obj); - + /// Template definition of a Python instance holding a single object template<typename T> struct ObjectBase { PyObject_HEAD T mInstance; }; - + /// helper function to get type from Object template<typename T> T python_cast(PyObject* obj, PyTypeObject* type) { assert(obj->ob_type == type); return reinterpret_cast< T >(obj); } - + /// A template that binds sharedptr typed classes template <typename T> class shared_ptr_binder { protected: /// A python object type typedef ObjectBase<T> Object; - + /// A sort-of constructor method. To be used to create a new NULL Object* static Object* construct(PyTypeObject* type) { Object* object; @@ -67,10 +67,10 @@ // Here, tidy! ::new (&object->mInstance) T(); } - + return object; } - + /// Destructor for the python object. Safely decreases the reference to the shared_ptr. To be used in msType static void dealloc(PyObject *self) { // cast the object to LinkServiceBinder::Object @@ -78,26 +78,29 @@ // Decreases the shared_ptr counter o->mInstance.setNull(); - + // Call the destructor to clean up (&o->mInstance)->~T(); - + // Finally delete the object PyObject_Del(self); } - + }; - + }; - + /** Central class for python bindings. Call PythonLanguage::Init() to prepare python environment */ class PythonLanguage { public: /** Initializes python lang and all the bindings */ static void init(); - + /** Finalizes python lang */ static void term(); + + /** Runs a script loaded in memory on a given address */ + static void runScriptPtr(const char* ptr); }; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |