[pygccxml-development] pyplusplus template instantiation handling improvement
Brought to you by:
mbaas,
roman_yakovenko
From: Roman Y. <rom...@gm...> - 2006-05-14 09:12:23
|
Hi. I committed a set of changes, that improves pyplusplus template instantiation handling. In order to try them you need SVN version of gccxml + pygccxml + pyplusplus. You can find more information about pygccxml and pyplusplus here: http://www.language-binding.net/ Examples 1. you have some template global function do_smth template< class X > struct basic_string{}; template< class Ch > basic_string<Ch> do_smth(){ return basic_string<Ch>(); } inline void inst(){ do_smth<wchar_t>(); do_smth<char>(); } gccxml reports that there are 2 functions with the same name - do_smth and different return types. Obviously this is wrong. This fact causes pyplusplu= s to generate wrong code( code, that could not be compiled ). Another example is class templates: namespace demangled{ template< unsigned long i1, unsigned long i2, unsigned long i3> struct item_t{ static const unsigned long v1 =3D i1; static const unsigned long v2 =3D i2; static const unsigned long v3 =3D i3; }; struct buggy{ typedef unsigned long ulong; typedef item_t< ulong( 0xDEECE66DUL ) | (ulong(0x5) << 32), 0xB, ulong(1) << 31 > my_item_t; my_item_t my_item_var; }; } gccxml reports my_item_var class name as "item_t<0deece66d,11,080000000>" Obviously the reported name is wrong. Now about solution: Recently I created a patch to gccxml, that adds demangled string to be dump to generated file. gccxml already dumps mangled string for every declaratio= n. For example the mangled name of my_item_t class is: N9demangled6item_tILm3740067437ELm11ELm2147483648EEE If we demangle the string we will get: demangled::item_t<3740067437l, 11l, 2147483648l> As you can see, mangled string contains the correct name of the class. So, from now pygccxml + pyplusplus takes into account information extracted from demangled string. Enjoy --=20 Roman Yakovenko C++ Python language binding http://www.language-binding.net/ |