Thread: [pygccxml-commit] SF.net SVN: pygccxml: [575] pyplusplus_dev/contrib/pypp_api/pypp_api
Brought to you by:
mbaas,
roman_yakovenko
From: <mb...@us...> - 2006-09-22 06:47:09
|
Revision: 575 http://svn.sourceforge.net/pygccxml/?rev=575&view=rev Author: mbaas Date: 2006-09-21 23:47:02 -0700 (Thu, 21 Sep 2006) Log Message: ----------- 1) Switched to the Py++ arg policies. 2) Added a decoration method setAttr() that can be used to set arbitrary attributes on decl_wrappers. Modified Paths: -------------- pyplusplus_dev/contrib/pypp_api/pypp_api/__init__.py pyplusplus_dev/contrib/pypp_api/pypp_api/declwrapper.py Modified: pyplusplus_dev/contrib/pypp_api/pypp_api/__init__.py =================================================================== --- pyplusplus_dev/contrib/pypp_api/pypp_api/__init__.py 2006-09-21 19:13:52 UTC (rev 574) +++ pyplusplus_dev/contrib/pypp_api/pypp_api/__init__.py 2006-09-22 06:47:02 UTC (rev 575) @@ -67,6 +67,11 @@ PRIVATE = ACCESS_TYPES.PRIVATE from decltypes import arg, cpp -from argpolicy import * +#from argpolicy import * +from pyplusplus.function_transformers.arg_policies import output_t as Output +from pyplusplus.function_transformers.arg_policies import input_t as Input +from pyplusplus.function_transformers.arg_policies import inout_t as InOut +from pyplusplus.function_transformers.arg_policies import input_array_t as InputArray +from pyplusplus.function_transformers.arg_policies import output_array_t as OutputArray -from modulebuilder import ModuleBuilder \ No newline at end of file +from modulebuilder import ModuleBuilder Modified: pyplusplus_dev/contrib/pypp_api/pypp_api/declwrapper.py =================================================================== --- pyplusplus_dev/contrib/pypp_api/pypp_api/declwrapper.py 2006-09-21 19:13:52 UTC (rev 574) +++ pyplusplus_dev/contrib/pypp_api/pypp_api/declwrapper.py 2006-09-22 06:47:02 UTC (rev 575) @@ -254,8 +254,30 @@ if decoration_log!=None: ps = ", ".join(map(lambda x: str(x), policies)) self._logDecoration("setArgPolicy(%s)"%ps, decl) - self.modulebuilder.mArgPolicyManager.setArgPolicy(decl, policies) + decl.function_transformers.extend(list(policies)) +# self.modulebuilder.mArgPolicyManager.setArgPolicy(decl, policies) + # setAttr + def setAttr(self, attr, value): + """Set an arbitrary attribute. + + Sets an arbitrary attribute on the contained decl_wrappers. + + This method can be used as a backdoor to access Py++ + decl_wrapper properties that are not directly exposed in + pypp_api (yet). + + @param attr: Attribute name + @type attr: str + @param value: The value that should be set + """ + self._checkLock() + for decl in self._iterContained(): + if decoration_log!=None: + self._logDecoration('setAttr("%s", %s)'%(attr,value), decl) + setattr(decl, attr, value) + return self + # addMethod def addMethod(self, name, impl): """Add a new method to a class. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mb...@us...> - 2006-09-29 16:45:10
|
Revision: 609 http://svn.sourceforge.net/pygccxml/?rev=609&view=rev Author: mbaas Date: 2006-09-29 09:45:03 -0700 (Fri, 29 Sep 2006) Log Message: ----------- 1) Emulate the finalize functionality by modifying the decl_wrappers and post-processing the code creator tree. 2) Activate the extended code creator API. 3) Import all call policies at once instead of importing them one by one. 4) Fixed the Var()/Vars() methods. 5) Bugfix: Some decoration methods weren't returning self. Modified Paths: -------------- pyplusplus_dev/contrib/pypp_api/pypp_api/__init__.py pyplusplus_dev/contrib/pypp_api/pypp_api/declwrapper.py pyplusplus_dev/contrib/pypp_api/pypp_api/modulebuilder.py Modified: pyplusplus_dev/contrib/pypp_api/pypp_api/__init__.py =================================================================== --- pyplusplus_dev/contrib/pypp_api/pypp_api/__init__.py 2006-09-29 16:41:06 UTC (rev 608) +++ pyplusplus_dev/contrib/pypp_api/pypp_api/__init__.py 2006-09-29 16:45:03 UTC (rev 609) @@ -50,16 +50,17 @@ # Bring in call policies to use -from pyplusplus.decl_wrappers import return_self -from pyplusplus.decl_wrappers import return_internal_reference -from pyplusplus.decl_wrappers import with_custodian_and_ward -from pyplusplus.decl_wrappers import copy_const_reference -from pyplusplus.decl_wrappers import copy_non_const_reference -from pyplusplus.decl_wrappers import manage_new_object -from pyplusplus.decl_wrappers import reference_existing_object -from pyplusplus.decl_wrappers import return_by_value -from pyplusplus.decl_wrappers import return_opaque_pointer -from pyplusplus.decl_wrappers import return_value_policy +from pyplusplus.decl_wrappers.call_policies import * +#from pyplusplus.decl_wrappers import return_self +#from pyplusplus.decl_wrappers import return_internal_reference +#from pyplusplus.decl_wrappers import with_custodian_and_ward +#from pyplusplus.decl_wrappers import copy_const_reference +#from pyplusplus.decl_wrappers import copy_non_const_reference +#from pyplusplus.decl_wrappers import manage_new_object +#from pyplusplus.decl_wrappers import reference_existing_object +#from pyplusplus.decl_wrappers import return_by_value +#from pyplusplus.decl_wrappers import return_opaque_pointer +#from pyplusplus.decl_wrappers import return_value_policy from pygccxml.declarations import ACCESS_TYPES PUBLIC = ACCESS_TYPES.PUBLIC @@ -75,3 +76,5 @@ from pyplusplus.function_transformers.arg_policies import output_array_t as OutputArray from modulebuilder import ModuleBuilder + +import extendcreators Modified: pyplusplus_dev/contrib/pypp_api/pypp_api/declwrapper.py =================================================================== --- pyplusplus_dev/contrib/pypp_api/pypp_api/declwrapper.py 2006-09-29 16:41:06 UTC (rev 608) +++ pyplusplus_dev/contrib/pypp_api/pypp_api/declwrapper.py 2006-09-29 16:45:03 UTC (rev 609) @@ -191,13 +191,48 @@ def finalize(self): """Finalize virtual member functions or an entire class. - Prevents the generation of wrappers for virtual member functions. + This method can be called on classes or individual member functions + to prevent the generation of wrapper classes. This is done by + resetting the virtuality attribute of the members to "non-virtual" + and by ignoring protected and private member functions. + A ValueError exception is raised if the method is called on pure + virtual functions because those cannot be wrapped without a wrapper + class. + + Even when finalize() was successfully called it is still possible + that Py++ generates a wrapper class nevertheless. The presence + of virtual member functions is only one part of the test whether + a wrapper class has to be generated (member variables can also + trigger a wrapper class which is not prevented by this method). """ self._checkLock() + VIRTUALITY_TYPES = pygccxml.declarations.VIRTUALITY_TYPES for decl in self._iterContained(): + # Mark the declaration as being finalized + decl._pypp_api_finalized = True + + if not isinstance(decl, pygccxml.declarations.member_calldef_t): + continue + + if (isinstance(decl, pyplusplus.decl_wrappers.constructor_t) or + isinstance(decl, pyplusplus.decl_wrappers.destructor_t)): + continue + + if decl.virtuality==VIRTUALITY_TYPES.PURE_VIRTUAL: + raise ValueError, "%s\nMember is pure virtual and cannot be finalized."%decl + + # Pretend that this method is a non-virtual method + decl.virtuality = VIRTUALITY_TYPES.NOT_VIRTUAL + if decoration_log!=None: self._logDecoration("finalize", decl) - decl.finalize() +# decl.finalize() + + # Ignore protected and private methods as these would trigger + # the generation of a wrapper class + ACCESS_TYPES = pygccxml.declarations.ACCESS_TYPES + self.Methods(accesstype=ACCESS_TYPES.PROTECTED, allow_empty=True).ignore() + self.Methods(accesstype=ACCESS_TYPES.PRIVATE, allow_empty=True).ignore() return self # setPolicy @@ -213,6 +248,8 @@ self._logDecoration("setPolicy(...)", decl) decl.call_policies = policy + return self + # setHeldType def setHeldType(self, heldtype): """Explicitly set the held type. @@ -257,6 +294,8 @@ decl.function_transformers.extend(list(policies)) # self.modulebuilder.mArgPolicyManager.setArgPolicy(decl, policies) + return self + # setAttr def setAttr(self, attr, value): """Set an arbitrary attribute. @@ -294,7 +333,7 @@ @param impl: The name of the C/C++ function that implements the method. @type impl: str """ - self.cdef(name, impl) + return self.cdef(name, impl) # def @@ -377,6 +416,7 @@ header=None, headerdir=None, accesstype=None, + const=None, filter=None, recursive=None, allow_empty=None, @@ -429,6 +469,8 @@ @param headerdir: Select declarations by the directory in which their header file is located @type headerdir: str @param accesstype: Access type (PUBLIC or PROTECTED). This implies the type flag MEMBER_FUNCTION. + @param const: Select declarations by their constness. + @type const: bool @param filter: User defined filter function @type callable @param recursive: Extend the search to grandchildren? If not specified, a global (customizable) default value is used. @@ -484,6 +526,9 @@ if accesstype!=None: addFilter(accesstype, AccessTypeFilter) itype |= METHOD + # const filter + if const!=None: + addFilter(const, ConstFilter) # custom filters if filter!=None: if _type(filter)==list: @@ -577,7 +622,7 @@ # Vars def Vars(self, name=None, type=0, **args): - return self.Vars(name=name, type=type|VARIABLE, **args) + return self.Decls(name=name, type=type|VARIABLE, **args) # Decl def Decl(self, name=None, **args): Modified: pyplusplus_dev/contrib/pypp_api/pypp_api/modulebuilder.py =================================================================== --- pyplusplus_dev/contrib/pypp_api/pypp_api/modulebuilder.py 2006-09-29 16:41:06 UTC (rev 608) +++ pyplusplus_dev/contrib/pypp_api/pypp_api/modulebuilder.py 2006-09-29 16:45:03 UTC (rev 609) @@ -316,6 +316,9 @@ # maker = module_creator.creator_t(self.mFinalDecls, module_name=moduleName) extmodule = maker.create(decl_headers=self.mHeaderFiles) + # Preprocess the tree + self._preprocessCreatorTree(extmodule) + # Let the arg policy manager update the tree... self.mArgPolicyManager.updateCreators(extmodule) @@ -526,6 +529,74 @@ self.mEndCreators.append(creator) # ---------- Internal helpers ----------- # + def _preprocessCreatorTree(self, root): + """Preprocess the code creator tree. + + Extends the nodes. + + This method has to be called after the code creator tree was + generated by Py++. + + @param root: The root of the code creator tree. + @type root: code_creator_t + """ + + # Iterate over the entire code creator tree... + for node in root.iter(): + # If the code creator is based on a declaration, assign + # the code creator to the declaration. This makes it easy + # to obtain the corresponding code creator from a given + # decl_wrapper. + if isinstance(node, code_creators.declaration_based_t): + # Assign the code creator to the corresponding decl_wrapper + node.declaration.code_creator = node + + # Is this a class wrapper creator? Then remove it if it was + # created on a finalized class + if isinstance(node, code_creators.class_wrapper_t): + finalized = getattr(node.declaration, "_pypp_api_finalized", False) + if finalized: + self._removeWrapperClass(node) + + def _removeWrapperClass(self, wrappernode): + """Remove a wrapper class code creator. + + All transformed member functions are moved out of the class + (as they are still needed) and then the wrapper class is removed. + """ + class_creator = wrappernode.class_creator + + # Search for members that have function transformers... + # (it is iterated over list(iter) so that the tree can be + # modified) + for node in list(wrappernode.iter()): + # Proceed to the next node if we are not dealing with a member + # function + if not isinstance(node, code_creators.calldef.calldef_wrapper_t): + continue + + # Check if the node has function transformers. + # If this is the case we must keep that node and move it outside + # the wrapper class. + if node.declaration.function_transformers: + node.remove() + node.insertBefore(wrappernode) + class_creator.associated_decl_creators.append(node) + + # Remove the class wrapper creator + wrappernode.remove() + + # Remove all references to the wrapper creator (except on member + # functions with function transformers) + for node in class_creator.iter(): + if not hasattr(node, "wrapper"): + continue + if isinstance(node, code_creators.calldef.calldef_t): + if node.declaration.function_transformers: + continue + node.wrapper = None + + def buildTemplateFileContents(self): """ Build up the contents of a file to instantiate the needed templates. headerFiles - List of header files for this module. @@ -719,4 +790,4 @@ self.__print_decl_header() curr_level = self.level + 1 print ' ' * curr_level * self.INDENT_SIZE, 'type: %s value: %s'%(self.__inst.type.decl_string, self.__inst.value) - \ No newline at end of file + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mb...@us...> - 2006-10-04 12:18:00
|
Revision: 619 http://svn.sourceforge.net/pygccxml/?rev=619&view=rev Author: mbaas Date: 2006-10-04 05:17:55 -0700 (Wed, 04 Oct 2006) Log Message: ----------- Minor bugfix: access_type filtering was constraining the type to METHOD but there are also other member types. Modified Paths: -------------- pyplusplus_dev/contrib/pypp_api/pypp_api/decltypes.py pyplusplus_dev/contrib/pypp_api/pypp_api/declwrapper.py pyplusplus_dev/contrib/pypp_api/pypp_api/filters.py Modified: pyplusplus_dev/contrib/pypp_api/pypp_api/decltypes.py =================================================================== --- pyplusplus_dev/contrib/pypp_api/pypp_api/decltypes.py 2006-10-04 09:53:10 UTC (rev 618) +++ pyplusplus_dev/contrib/pypp_api/pypp_api/decltypes.py 2006-10-04 12:17:55 UTC (rev 619) @@ -19,6 +19,7 @@ VARIABLE = 0x40 CALLABLE = METHOD | FUNCTION | CONSTRUCTOR +CLASS_MEMBER = METHOD | CONSTRUCTOR | VARIABLE | ENUM # cpp class cpp: @@ -70,4 +71,4 @@ elif type(val)==str: return '"%s"'%val else: - return str(val) \ No newline at end of file + return str(val) Modified: pyplusplus_dev/contrib/pypp_api/pypp_api/declwrapper.py =================================================================== --- pyplusplus_dev/contrib/pypp_api/pypp_api/declwrapper.py 2006-10-04 09:53:10 UTC (rev 618) +++ pyplusplus_dev/contrib/pypp_api/pypp_api/declwrapper.py 2006-10-04 12:17:55 UTC (rev 619) @@ -468,7 +468,7 @@ @type header: str @param headerdir: Select declarations by the directory in which their header file is located @type headerdir: str - @param accesstype: Access type (PUBLIC or PROTECTED). This implies the type flag MEMBER_FUNCTION. + @param accesstype: Access type (PUBLIC or PROTECTED). This implies the type flags CLASS_MEMBER. @param const: Select declarations by their constness. @type const: bool @param filter: User defined filter function @@ -525,7 +525,7 @@ # accesstype filter if accesstype!=None: addFilter(accesstype, AccessTypeFilter) - itype |= METHOD + itype |= CLASS_MEMBER # const filter if const!=None: addFilter(const, ConstFilter) Modified: pyplusplus_dev/contrib/pypp_api/pypp_api/filters.py =================================================================== --- pyplusplus_dev/contrib/pypp_api/pypp_api/filters.py 2006-10-04 09:53:10 UTC (rev 618) +++ pyplusplus_dev/contrib/pypp_api/pypp_api/filters.py 2006-10-04 12:17:55 UTC (rev 619) @@ -429,7 +429,13 @@ return "accesstype==%s"%self.accesstype def __call__(self, decl): - at = getattr(decl, "access_type", None) + try: + at = getattr(decl, "access_type", None) + except RuntimeError, e: + # Accessing access_type on non-member variables + # raises an error + at = None + if at==None: return False return at==self.accesstype This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mb...@us...> - 2006-10-08 11:31:25
|
Revision: 628 http://svn.sourceforge.net/pygccxml/?rev=628&view=rev Author: mbaas Date: 2006-10-08 04:30:57 -0700 (Sun, 08 Oct 2006) Log Message: ----------- Added a new filter to filter by virtuality. Modified Paths: -------------- pyplusplus_dev/contrib/pypp_api/pypp_api/__init__.py pyplusplus_dev/contrib/pypp_api/pypp_api/decltypes.py pyplusplus_dev/contrib/pypp_api/pypp_api/declwrapper.py pyplusplus_dev/contrib/pypp_api/pypp_api/filters.py Modified: pyplusplus_dev/contrib/pypp_api/pypp_api/__init__.py =================================================================== --- pyplusplus_dev/contrib/pypp_api/pypp_api/__init__.py 2006-10-08 08:08:28 UTC (rev 627) +++ pyplusplus_dev/contrib/pypp_api/pypp_api/__init__.py 2006-10-08 11:30:57 UTC (rev 628) @@ -67,7 +67,7 @@ PROTECTED = ACCESS_TYPES.PROTECTED PRIVATE = ACCESS_TYPES.PRIVATE -from decltypes import arg, cpp +from decltypes import * #from argpolicy import * from pyplusplus.function_transformers.arg_policies import output_t as Output from pyplusplus.function_transformers.arg_policies import input_t as Input Modified: pyplusplus_dev/contrib/pypp_api/pypp_api/decltypes.py =================================================================== --- pyplusplus_dev/contrib/pypp_api/pypp_api/decltypes.py 2006-10-08 08:08:28 UTC (rev 627) +++ pyplusplus_dev/contrib/pypp_api/pypp_api/decltypes.py 2006-10-08 11:30:57 UTC (rev 628) @@ -21,6 +21,11 @@ CALLABLE = METHOD | FUNCTION | CONSTRUCTOR CLASS_MEMBER = METHOD | CONSTRUCTOR | VARIABLE | ENUM +NON_VIRTUAL = 0x01 +NON_PURE_VIRTUAL = 0x02 +PURE_VIRTUAL = 0x04 +VIRTUAL = NON_PURE_VIRTUAL | PURE_VIRTUAL + # cpp class cpp: """This class wraps C++ source code for default values. Modified: pyplusplus_dev/contrib/pypp_api/pypp_api/declwrapper.py =================================================================== --- pyplusplus_dev/contrib/pypp_api/pypp_api/declwrapper.py 2006-10-08 08:08:28 UTC (rev 627) +++ pyplusplus_dev/contrib/pypp_api/pypp_api/declwrapper.py 2006-10-08 11:30:57 UTC (rev 628) @@ -417,6 +417,7 @@ headerdir=None, accesstype=None, const=None, + virtuality=None, filter=None, recursive=None, allow_empty=None, @@ -471,6 +472,8 @@ @param accesstype: Access type (PUBLIC or PROTECTED). This implies the type flags CLASS_MEMBER. @param const: Select declarations by their constness. @type const: bool + @param virtuality: Select declarations by their virtuality. This implies the type flags CLASS_MEMBER: + @type virtuality: Virtuality flags @param filter: User defined filter function @type callable @param recursive: Extend the search to grandchildren? If not specified, a global (customizable) default value is used. @@ -529,6 +532,10 @@ # const filter if const!=None: addFilter(const, ConstFilter) + # virtuality filter + if virtuality!=None: + addFilter(virtuality, VirtualityFilter) + itype |= CLASS_MEMBER # custom filters if filter!=None: if _type(filter)==list: Modified: pyplusplus_dev/contrib/pypp_api/pypp_api/filters.py =================================================================== --- pyplusplus_dev/contrib/pypp_api/pypp_api/filters.py 2006-10-08 08:08:28 UTC (rev 627) +++ pyplusplus_dev/contrib/pypp_api/pypp_api/filters.py 2006-10-08 11:30:57 UTC (rev 628) @@ -461,6 +461,45 @@ const = bool(getattr(decl, "has_const", False)) return const==self.constness +# VirtualityFilter +class VirtualityFilter(FilterBase): + """Filter by virtuality. + """ + + def __init__(self, virtuality_flags): + """Constructor. + + virtuality_flags is a combination of the flags NON_VIRTUAL, + NON_PURE_VIRTUAL, PURE_VIRTUAL and VIRTUAL. + """ + FilterBase.__init__(self) + self.virtuality_flags = virtuality_flags + + def __str__(self): + f = [] + if self.virtuality_flags & NON_VIRTUAL: + f.append("non-virtual") + if self.virtuality_flags & NON_PURE_VIRTUAL: + f.append("non-pure virtual") + if self.virtuality_flags & PURE_VIRTUAL: + f.append("pure virtual") + + v = "|".join(f) + return "virtuality==%s"%v + + def __call__(self, decl): + v = getattr(decl, "virtuality", None) + if v==None: + return False + vf = self.virtuality_flags + if vf&NON_VIRTUAL and v==VIRTUALITY_TYPES.NOT_VIRTUAL: + return True + elif vf&NON_PURE_VIRTUAL and v==VIRTUALITY_TYPES.VIRTUAL: + return True + elif vf&PURE_VIRTUAL and v==VIRTUALITY_TYPES.PURE_VIRTUAL: + return True + return False + # CustomFilter class CustomFilter(FilterBase): """Filter by user defined function. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |