Dear Rouslan,
It looks interesting. I say go for it. You will learn something and might make
some improvements on existing ideas.
I recommend putting the code on www.github.com
Kind regards,
Samuel
On 4/05/2010, at 8:44 AM, Rouslan Korneychuk wrote:
> Hi, I'm new here. I'm working on a program that exposes C++ declarations to
> Python and I was wondering if there is any interest in it.
>
> It's a hobby project. I was originally using Boost.Python on another project
> but found a couple of things I didn't like. Eg: you can't really have private
> constructors. If you want a Python object created, you either have to expose
> the constructor in Python, or create an instance of the object somewhere else
> in memory, and have it either copied to the PyObject or have the PyObject
> hold a reference to it. I was working on a rudimentary 3D game engine that
> was a Python extension. It was important to avoid copying potentially huge
> amounts of data, but to have almost every PyObject just be a pointer to
> another object (and the object already is just a few or even one pointer)
> seemed like an pointless compromise, considering that I was writing code that
> was specifically designed to be a Python extension (There was also another
> issue I came across but don't remember now).
>
> So I looked for other solutions and noticed that Py++ (which simply generates
> Boost.Python code for you) was based on a seperate program called GCCXML. I
> figured I could use GCCXML and generate code however I wanted. So I did.
>
> My program generates human-readable code (it even uses proper indentation).
> The program still has a lot of work to be done on it, but it can already
> generate working Python extensions.
>
> It takes an input file like this:
> <?xml version="1.0"?>
> <module name="testmodule" include="main.h">
> <doc>module doc string</doc>
>
> <class name="AClass" type="MyClass">
> <doc>class doc string</doc>
> <init/>
> <member cmember="value"/>
> <def func="greet"/>
> <propery get="getX" set="setX"/>
> </class>
> </module>
>
> You can probably figure out what the resulting code does. The goal is to
> generate code that is as close to hand-written code as possible. It even
> forgoes using PyArg_ParseTupleAndKeywords and has the argument checks
> hard-wired. It also generates a header file that contains a PyObject
> implementation of MyClass called obj_AClass, with every constructor fowarded
> and with the new and delete operators overloaded to play nice with Python's
> memory handler:
> ...
> extern PyTypeObject obj_AClassType;
>
> struct obj_AClass {
> PyObject_HEAD
> MyClass base;
> bool initialized;
>
> void *operator new(size_t s) {
> void *ptr = PyMem_Malloc(s);
> if(!ptr) throw std::bad_alloc();
> return ptr;
> }
>
> void operator delete(void *ptr) {
> PyMem_Free(ptr);
> }
>
> obj_AClass(MyClass const & _0) : base(_0) {
> PyObject_Init(reinterpret_cast<PyObject*>(this),&obj_AClassType);
> initialized = true;
> }
>
> obj_AClass(unsigned int _0) : base(_0) {
> PyObject_Init(reinterpret_cast<PyObject*>(this),&obj_AClassType);
> initialized = true;
> }
>
> };
> ...
>
> If you want to expose one overload of a constructor or function but not the
> others, you can add overload="list,of,args" to <init/> or <def/>. Default
> values for arguments are handled automatically. When handling overloaded
> functions, it checks the types of the arguments to pick the best overload,
> taking into consideration polymorphism and the fact that basic types like
> ints can be converted from one-another. It will automatically detect if two
> overloads match to the same set of Python arguments (eg: void func(float) vs
> void func(double)). The only issue is it will not use keyword arguments for
> overloaded functions (I don't know if that can even be done reliably *and*
> efficiently. I would need to give it more thought).
>
> If there is enough interest I can put this project up on SourceForge or
> Google Code.
> --
> http://mail.python.org/mailman/listinfo/python-list
--
http://mail.python.org/mailman/listinfo/python-list