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

Reply via email to