[C++-sig] pyplusplus is alive :-)

Niall Douglas s_sourceforge at nedprod.com
Fri Mar 31 15:07:57 CEST 2006


On 29 Mar 2006 at 23:55, Roman Yakovenko wrote:

> Problem number 1. pyplusplus generates invalid code mainly because of
> unions that have unnamed struct inside.
> 
> 	struct FXAPI Header
> 	{
> 		FXuint length;
> 		char guid[16];
> 		union Flags
> 		{
> 			struct
> 			{
> 				FXuint hasItemIdList : 1;
> 				FXuint pointsToFileOrDir : 1;
> 				FXuint hasDescription : 1;
>                                 ...
> 			};
> 			FXuint raw;
> 		} flags;
>     }
> 
> I am almost sure, that it can not be exported to Python.
> First of all I am not sure how I should export unions? What do you
> expect to get?

The above is simply a technique for mapping bits to the same place as 
an int. Unnamed structs simply push their members into the enclosing 
namespace, therefore you'd access the above as 
header.flags.pointsToFileOrDir. Right now, pyplusplus is putting a 
$_x after flags because gccxml gives unnamed structs an internal 
name. To generate correct code, all pyplusplus needs to do is ignore 
any unnamed structs it sees.

> According to this http://lists.boost.org/Archives/boost/2002/11/39157.php
> it will not be supported.
> 
> So I propose you to change union to struct, or to write some hand written code
> that will export it. May be I could learn from it and will implement automatic
> solution. But I don't promise.

Thing is, we're not exporting a union. We're exporting the *members* 
of a union. Boost.Python does not need to know that the members refer 
to the same memory space - it just needs to know they are there like 
any other normal members of a struct.

Worst case scenario - let pyplusplus only support accessing the first 
member of a union only.

> Second and I think very important problem is unnamed structs within union.
> In order to export bit fields pyplusplus creates wrapper that will
> expose set\get
> properties to the fields. In this case it do generates invalid code, because of
> unnamed struct.
> 
> What do you propose?

pyplusplus should specifically filter out any unnamed structs it 
encounters and pretend they're not there. This will generate correct 
code.

Cheers,
Niall






More information about the Cplusplus-sig mailing list