pygccxml-commit Mailing List for C++ Python language bindings (Page 86)
Brought to you by:
mbaas,
roman_yakovenko
You can subscribe to this list here.
2006 |
Jan
|
Feb
|
Mar
(190) |
Apr
(166) |
May
(170) |
Jun
(75) |
Jul
(105) |
Aug
(131) |
Sep
(99) |
Oct
(84) |
Nov
(67) |
Dec
(54) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2007 |
Jan
(66) |
Feb
(49) |
Mar
(25) |
Apr
(62) |
May
(21) |
Jun
(34) |
Jul
(9) |
Aug
(21) |
Sep
(5) |
Oct
|
Nov
(63) |
Dec
(34) |
2008 |
Jan
(10) |
Feb
(42) |
Mar
(26) |
Apr
(25) |
May
(6) |
Jun
(40) |
Jul
(18) |
Aug
(29) |
Sep
(6) |
Oct
(32) |
Nov
(14) |
Dec
(56) |
2009 |
Jan
(127) |
Feb
(52) |
Mar
(2) |
Apr
(10) |
May
(29) |
Jun
(3) |
Jul
|
Aug
(16) |
Sep
(4) |
Oct
(11) |
Nov
(8) |
Dec
(14) |
2010 |
Jan
(31) |
Feb
(1) |
Mar
(7) |
Apr
(9) |
May
(1) |
Jun
|
Jul
(2) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2011 |
Jan
|
Feb
(8) |
Mar
(4) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2014 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Matthias B. <mb...@us...> - 2006-03-08 08:47:46
|
Update of /cvsroot/pygccxml/source/pygccxml/parser In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24362/parser Added Files: .cvsignore Log Message: Added .cvsignore files so that the *.pyc files are ignored by cvs --- NEW FILE: .cvsignore --- *.pyc |
From: Matthias B. <mb...@us...> - 2006-03-08 08:46:18
|
Update of /cvsroot/pygccxml/source/pygccxml/declarations In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23434 Modified Files: class_declaration.py cpptypes.py declaration.py filters.py scopedef.py Log Message: Cleaned up the doc strings to that epydoc doesn't generate any warnings/errors anymore. I also added a few bits and pieces. Index: class_declaration.py =================================================================== RCS file: /cvsroot/pygccxml/source/pygccxml/declarations/class_declaration.py,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** class_declaration.py 20 Dec 2005 08:55:00 -0000 1.18 --- class_declaration.py 8 Mar 2006 08:46:09 -0000 1.19 *************** *** 208,212 **** @param access: describes desired members ! @type access: L<ACCESS_TYPES> @return: [ members ] --- 208,212 ---- @param access: describes desired members ! @type access: L{ACCESS_TYPES} @return: [ members ] *************** *** 230,234 **** @param access: describes desired members ! @type access: L<ACCESS_TYPES> @param new_members: list of new members --- 230,234 ---- @param access: describes desired members ! @type access: L{ACCESS_TYPES} @param new_members: list of new members Index: cpptypes.py =================================================================== RCS file: /cvsroot/pygccxml/source/pygccxml/declarations/cpptypes.py,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** cpptypes.py 14 Feb 2006 08:28:15 -0000 1.23 --- cpptypes.py 8 Mar 2006 08:46:10 -0000 1.24 *************** *** 302,306 **** @param return_type: function return type ! @type: L{type_t} @param arguments_types: list of argument L{type<type_t>} --- 302,306 ---- @param return_type: function return type ! @type return_type: L{type_t} @param arguments_types: list of argument L{type<type_t>} Index: declaration.py =================================================================== RCS file: /cvsroot/pygccxml/source/pygccxml/declarations/declaration.py,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** declaration.py 2 Mar 2006 05:55:39 -0000 1.18 --- declaration.py 8 Mar 2006 08:46:10 -0000 1.19 *************** *** 18,22 **** class location_t(object): ! """provides information about declaration location within source file""" def __init__(self, file_name='', line=-1 ): --- 18,26 ---- class location_t(object): ! """Provides information about the location of the declaration within the source file. ! ! The header file name and the line number of the declaration can be ! accessed via the attributes C{file_name} and C{line}. ! """ def __init__(self, file_name='', line=-1 ): *************** *** 43,47 **** self._file_name = new_file_name file_name = property( _get_file_name, _set_file_name ! , doc="path to file, in which declaration has been declarated") def _get_line( self ): --- 47,53 ---- self._file_name = new_file_name file_name = property( _get_file_name, _set_file_name ! , doc="""The full file name of the header in which the declaration was found. ! @type: str ! """) def _get_line( self ): *************** *** 50,60 **** self._line = new_line line = property( _get_line, _set_line ! , doc="line number of declaration within file") def as_tuple( self ): return (self.file_name, self.line) class declaration_t( object ): ! """base class for all classes, that describes a C++ declaration""" def __init__( self, name='', parent=None, location=None, is_artificial=False, mangled=None ): self._name = name --- 56,73 ---- self._line = new_line line = property( _get_line, _set_line ! , doc="""The line number where the declaration was found ! @type: int ! """) def as_tuple( self ): + """Return the header file name and the line number. + + @returns: Returns a 2-tuple (file name, line number). + """ return (self.file_name, self.line) class declaration_t( object ): ! """Base class for all classes that represent a C++ declaration. ! """ def __init__( self, name='', parent=None, location=None, is_artificial=False, mangled=None ): self._name = name *************** *** 118,122 **** self._name = new_name name = property( _get_name, _set_name ! , doc="declaration name") def _get_parent(self): --- 131,137 ---- self._name = new_name name = property( _get_name, _set_name ! , doc="""Declaration name ! @type: str ! """) def _get_parent(self): *************** *** 127,131 **** self._parent = new_parent parent = property( _get_parent, _set_parent ! , doc="reference to parent declaration") def __get_top_parent(self): --- 142,148 ---- self._parent = new_parent parent = property( _get_parent, _set_parent ! , doc="""Reference to parent declaration ! @type: declaration_t ! """) def __get_top_parent(self): *************** *** 138,142 **** me = parent parent = me.parent ! top_parent = property( __get_top_parent, doc="reference to top parent declaration" ) def _get_location( self ): --- 155,162 ---- me = parent parent = me.parent ! top_parent = property( __get_top_parent, ! doc="""reference to top parent declaration ! @type: declaration_t ! """ ) def _get_location( self ): *************** *** 145,149 **** self._location = new_location location = property( _get_location, _set_location ! , doc="location of the declaration within source file") def _get_is_artificial( self ): --- 165,171 ---- self._location = new_location location = property( _get_location, _set_location ! , doc="""Location of the declaration within source file ! @type: L{location_t} ! """) def _get_is_artificial( self ): *************** *** 152,156 **** self._is_artificial = new_artificial is_artificial = property( _get_is_artificial, _set_is_artificial ! , doc="describes whether declaration is compiler generated or not") def _get_mangled( self ): --- 174,180 ---- self._is_artificial = new_artificial is_artificial = property( _get_is_artificial, _set_is_artificial ! , doc="""Describes whether declaration is compiler generated or not ! @type: bool ! """) def _get_mangled( self ): *************** *** 159,163 **** self._mangled = mangled mangled = property( _get_mangled, _set_mangled ! , doc="compiler generated declaration name" ) def _create_decl_string(self): --- 183,189 ---- self._mangled = mangled mangled = property( _get_mangled, _set_mangled ! , doc="""Compiler generated declaration name ! @type: str ! """ ) def _create_decl_string(self): *************** *** 166,168 **** def _decl_string(self): return self._create_decl_string() ! decl_string = property( _decl_string, doc="full name of the declaration" ) --- 192,197 ---- def _decl_string(self): return self._create_decl_string() ! decl_string = property( _decl_string, ! doc="""Full name of the declaration ! @type: str ! """ ) Index: filters.py =================================================================== RCS file: /cvsroot/pygccxml/source/pygccxml/declarations/filters.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** filters.py 2 Mar 2006 05:53:14 -0000 1.1 --- filters.py 8 Mar 2006 08:46:10 -0000 1.2 *************** *** 95,107 **** class calldef_matcher_t( declaration_matcher_t ): def __init__( self, return_type=None, arg_types=None, *arguments, **keywords): ! """ ! return_value_type could be string or instance of class derived from ! cpptypes.type_t ! arg_types could be a list of strings or cpptypes.type_t. ! It could be a mix. In this case you should specify all arguments. ! If you don't want to match some argument you can insert None ! instead. ! In future it should be possible to select function by it's ! default argument value and/or exception .... """ if not keywords.has_key( 'decl_type' ): --- 95,108 ---- class calldef_matcher_t( declaration_matcher_t ): def __init__( self, return_type=None, arg_types=None, *arguments, **keywords): ! """Constructor. ! ! return_value_type could be string or instance of class derived from ! cpptypes.type_t ! arg_types could be a list of strings or cpptypes.type_t. ! It could be a mix. In this case you should specify all arguments. ! If you don't want to match some argument you can insert None ! instead. ! In future it should be possible to select function by it's ! default argument value and/or exception .... """ if not keywords.has_key( 'decl_type' ): *************** *** 157,159 **** if not isinstance( decl.parent, class_declaration.class_t ): return False ! return self.access_type == decl.parent.find_out_member_access_type( decl ) \ No newline at end of file --- 158,160 ---- if not isinstance( decl.parent, class_declaration.class_t ): return False ! return self.access_type == decl.parent.find_out_member_access_type( decl ) Index: scopedef.py =================================================================== RCS file: /cvsroot/pygccxml/source/pygccxml/declarations/scopedef.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** scopedef.py 18 Dec 2005 12:11:13 -0000 1.8 --- scopedef.py 8 Mar 2006 08:46:10 -0000 1.9 *************** *** 11,16 **** class scopedef_t( declaration.declaration_t ): ! """ ! base class for L{namespace_t} and L{class_t} classes """ def __init__( self, name='', parent=''): --- 11,19 ---- class scopedef_t( declaration.declaration_t ): ! """Base class for L{namespace_t} and L{class_t} classes. ! ! This is the base class for all declaration classes that may have ! children nodes. The children can be accessed via the C{declarations} ! property. """ def __init__( self, name='', parent=''): *************** *** 36,40 **** def _get_declarations(self): return self._get_declarations_impl() ! declarations = property( _get_declarations ) def remove_declaration( self, decl ): --- 39,46 ---- def _get_declarations(self): return self._get_declarations_impl() ! declarations = property( _get_declarations, ! doc="""A list of children declarations. ! @type: list of L{declaration_t} ! """) def remove_declaration( self, decl ): |
From: Matthias B. <mb...@us...> - 2006-03-08 08:41:24
|
Update of /cvsroot/pygccxml/source/pygccxml In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21030 Modified Files: __init__.py Log Message: Added a module doc string. This text will be shown on the entry page. It contains a little introduction and pointers to the most important functions/classes. Index: __init__.py =================================================================== RCS file: /cvsroot/pygccxml/source/pygccxml/__init__.py,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** __init__.py 28 Feb 2006 07:11:08 -0000 1.19 --- __init__.py 8 Mar 2006 08:41:18 -0000 1.20 *************** *** 4,7 **** --- 4,33 ---- # http://www.boost.org/LICENSE_1_0.txt) + """Python gccxml frontend. + + This package provides functionality to extract and inspect + declarations from C/C++ header files. This is accomplished + by invoking the external tool U{gccxml<http://www.gccxml.org/>} + which parses a header file and dumps the declarations as a + XML file. This XML file is then read by pygccxml and the contents + are made available as appropriate Python objects. + + To parse a set of C/C++ header files you use the + L{parse()<parser.parse>} function in the L{parser} sub package which + returns a tree that contains all declarations found in the header + files. The root of the tree represents the main namespace C{::} and + the children nodes represent the namespace contents such as other + namespaces, classes, functions, etc. Each node in the tree is an + object of a type derived from the + L{declaration_t<declarations.declaration_t>} base class. An inner + node is always either a namespace (L{namespace_t<declarations.namespace_t>}) + or a class (L{class_t<declarations.class_t>}) which are both derived + from L{scopedef_t<declarations.scopedef_t>}. Everything else (free functions, + member functions, enumerations, variables, etc.) is always a leaf. + You will find all those declaration classes in the L{declarations} + sub-package. + + """ + import pygccxml.declarations as declarations import pygccxml.parser as parser *************** *** 12,14 **** #TODO: # 1. Write documentation for filtering functionality. ! # 2. Add "explicit" property for constructors \ No newline at end of file --- 38,40 ---- #TODO: # 1. Write documentation for filtering functionality. ! # 2. Add "explicit" property for constructors |
From: Matthias B. <mb...@us...> - 2006-03-08 08:38:59
|
Update of /cvsroot/pygccxml/source/pygccxml/parser In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19663 Modified Files: __init__.py project_reader.py Log Message: Started adding doc strings. Index: __init__.py =================================================================== RCS file: /cvsroot/pygccxml/source/pygccxml/parser/__init__.py,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** __init__.py 6 Mar 2006 14:31:41 -0000 1.18 --- __init__.py 8 Mar 2006 08:38:53 -0000 1.19 *************** *** 4,7 **** --- 4,9 ---- # http://www.boost.org/LICENSE_1_0.txt) + """Parser sub-package. + """ from config import config_t *************** *** 28,31 **** --- 30,45 ---- , compilation_mode=COMPILATION_MODE.FILE_BY_FILE , cache=None ): + """Parse header files. + + @param files: The header files that should be parsed + @type files: list of str + @param config: Configuration object or None + @type config: L{config_t} + @param compilation_mode: Determines whether the files are parsed individually or as one single chunk + @type compilation_mode: L{COMPILATION_MODE} + @param cache: Declaration cache (None=no cache) + @type cache: L{cache_base_t} or str + @returns: Declarations + """ if not config: Index: project_reader.py =================================================================== RCS file: /cvsroot/pygccxml/source/pygccxml/parser/project_reader.py,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** project_reader.py 6 Mar 2006 04:52:08 -0000 1.24 --- project_reader.py 8 Mar 2006 08:38:53 -0000 1.25 *************** *** 74,78 **** --- 74,99 ---- class project_reader_t: + """Parses header files and returns the contained declarations. + """ def __init__( self, config, cache=None, decl_factory=None): + """Constructor. + + config is a configuration object that contains the parameters + for invoking gccxml. cache specifies the cache to use for + caching declarations between separate runs. By default, no + cache is used. decl_factory is an object that must provide + the same interface than + L{decl_factory_t<declarations.decl_factory_t>}, i.e. there must + be a set of C{create_*} methods that return an instance of an + appropriate declaration class. By default, the declaration + classes defined in the L{declarations} package are used. + + @param config: Configuration object + @type config: L{config_t} + @param cache: Declaration cache (None=no cache) + @type cache: L{cache_base_t} or str + @param decl_factory: Custom declaration factory object or None + @type decl_factory: decl_factory_t + """ self.__config = config self.__dcache = None *************** *** 88,91 **** --- 109,120 ---- def read_files( self, files, compilation_mode=COMPILATION_MODE.FILE_BY_FILE): + """Parse header files. + + @param files: The header files that should be parsed + @type files: list of str + @param compilation_mode: Determines whether the files are parsed individually or as one single chunk + @type compilation_mode: L{COMPILATION_MODE} + @returns: Declarations + """ if compilation_mode == COMPILATION_MODE.ALL_AT_ONCE: return self.__parse_all_at_once(files) *************** *** 166,169 **** --- 195,204 ---- def read_string(self, content): + """Parse a string containing C/C++ source code. + + @param content: C/C++ source code. + @type content: str + @returns: Declarations + """ reader = source_reader.source_reader_t( self.__config, None, self.__decl_factory ) return reader.read_string( content ) |
From: Matthias B. <mb...@us...> - 2006-03-08 08:37:36
|
Update of /cvsroot/pygccxml/source/pygccxml/parser In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18921 Modified Files: directory_cache.py Log Message: Switched to epytext markup for the main class Index: directory_cache.py =================================================================== RCS file: /cvsroot/pygccxml/source/pygccxml/parser/directory_cache.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** directory_cache.py 6 Mar 2006 14:31:41 -0000 1.1 --- directory_cache.py 8 Mar 2006 08:37:20 -0000 1.2 *************** *** 7,10 **** --- 7,18 ---- # by Matthias Baas (ba...@ir...). + """Directory cache implementation. + + This module contains the implementation of a cache that uses individual + files stored in a dedicated cache directory to store the cached contents. + The cache class is L{directory_cache_t} which can be passed to the C{cache} + argument of the L{parse()} function. + """ + import os, os.path, gzip, md5 import cPickle *************** *** 101,104 **** --- 109,121 ---- def update(self, source_file, configuration, declarations, included_files): """Replace a cache entry by a new value. + + @param source_file: Header file name. + @type source_file: str + @param configuration: Configuration object. + @type configuration: L{config_t} + @param declarations: Declarations contained in the header file. + @type declarations: picklable object + @param included_files: Dependent files + @type included_files: list of str """ # Normlize all paths... *************** *** 139,142 **** --- 156,165 ---- def cached_value(self, source_file, configuration): """Return the cached declarations or None. + + @param source_file: Header file name + @type source_file: str + @param configuration: Configuration object + @type configuration: L{config_t} + @return: Cached declarations or None """ *************** *** 180,184 **** """Load the cache. ! This method is called in the constructor. """ --- 203,210 ---- """Load the cache. ! Loads the file index.dat which contains the index table and ! the file name repository. ! ! This method is called by the constructor. """ *************** *** 200,203 **** --- 226,232 ---- def _save(self): """Save the cache index if it was modified. + + Saves the index table and the file name repository in the file + index.dat. """ if self.__modified_flag: *************** *** 211,214 **** --- 240,247 ---- Reads a pickled object from disk and returns it. + + @param filename: Name of the file that should be read. + @type filename: str + @returns: Unpickled file contents """ if self.__compression: *************** *** 224,227 **** --- 257,265 ---- The data object is written to a file using the pickle mechanism. + + @param filename: Output file name + @type filename: str + @param data: A Python object that will be pickled + @type data: picklable object """ if self.__compression: *************** *** 236,240 **** source_file is the name of the header and key is its corresponding ! cache key (obtained by a call to _create_cache_key()). The entry is removed from the index table, any referenced file name is released and the cache file is deleted. --- 274,278 ---- source_file is the name of the header and key is its corresponding ! cache key (obtained by a call to L{_create_cache_key()}). The entry is removed from the index table, any referenced file name is released and the cache file is deleted. *************** *** 242,245 **** --- 280,288 ---- If key references a non-existing entry, the method returns immediately. + + @param source_file: Header file name + @type source_file: str + @param key: Key value for the specified header file + @type key: hashable object """ *************** *** 265,269 **** def _create_cache_key(self, source_file): ! """Return the cache key for a header file.""" path, name = os.path.split(source_file) return name+str(hash(path)) --- 308,318 ---- def _create_cache_key(self, source_file): ! """Return the cache key for a header file. ! ! @param source_file: Header file name ! @type source_file: str ! @returns: Key for the given header file ! @rtype: str ! """ path, name = os.path.split(source_file) return name+str(hash(path)) *************** *** 271,274 **** --- 320,328 ---- def _create_cache_filename(self, source_file): """Return the cache file name for a header file. + + @param source_file: Header file name + @type source_file: str + @returns: Cache file name (*.cache) + @rtype: str """ res = self._create_cache_key(source_file)+".cache" *************** *** 277,280 **** --- 331,343 ---- def _create_config_signature(self, config): """Return the signature for a config object. + + The signature is computed as md5 digest of the contents of + working_directory, include_paths, define_symbols and + undefine_symbols. + + @param config: Configuration object + @type config: L{config_t} + @returns: Signature + @rtype: str """ m = md5.new() |
From: Matthias B. <mb...@us...> - 2006-03-08 08:32:04
|
Update of /cvsroot/pygccxml/source/pygccxml/docs In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16043 Added Files: generate_reference_manual.py Log Message: Added a script to generate a reference manual for pygccxml using epydoc (the resulting pages will be written to the directory 'refman') --- NEW FILE: generate_reference_manual.py --- # Generate documentation using epydocs # import os, os.path pj = os.path.join # Output directory output = "refman" # Which markup to use by default? default_format = "epytext" # The modules that should be included in the manual module_dirs = ["declarations", "parser", "utils", "__init__.py" ] main_dir = os.path.join("..") module_params = [os.path.join(main_dir,d) for d in module_dirs] cmd_line = "epydoc -o %s --docformat %s "%(output, default_format) cmd_line += " ".join(module_params) print "Running: ", cmd_line os.system(cmd_line) |
From: Allen B. <al...@us...> - 2006-03-07 00:01:40
|
Update of /cvsroot/pygccxml/source/pyplusplus/experimental In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4417 Added Files: __init__.py Log Message: Added missing module __init__.py file. --- NEW FILE: __init__.py --- # Copyright 2004 Roman Yakovenko. # Distributed under the Boost Software License, Version 1.0. (See # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) """ This is an experimental module to high-level API testing """ |
From: Matthias B. <mb...@us...> - 2006-03-06 15:08:50
|
Update of /cvsroot/pygccxml/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9294 Modified Files: setup_pyplusplus.py Log Message: Added the new sub-packages so they get included in the build Index: setup_pyplusplus.py =================================================================== RCS file: /cvsroot/pygccxml/source/setup_pyplusplus.py,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** setup_pyplusplus.py 6 Feb 2006 09:46:02 -0000 1.7 --- setup_pyplusplus.py 6 Mar 2006 15:08:47 -0000 1.8 *************** *** 19,22 **** --- 19,24 ---- , 'pyplusplus.module_creator' , 'pyplusplus.code_repository' + , 'pyplusplus.decl_wrappers' + , 'pyplusplus.module_builder' , 'pyplusplus.utils'] ) |
From: Matthias B. <mb...@us...> - 2006-03-06 14:31:46
|
Update of /cvsroot/pygccxml/source/pygccxml/parser In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23339 Modified Files: __init__.py Added Files: directory_cache.py Log Message: Added a new cache class: directory_cache_t --- NEW FILE: directory_cache.py --- # Copyright 2004 Roman Yakovenko. # Distributed under the Boost Software License, Version 1.0. (See # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) # # The initial version of the directory_cache_t class was written # by Matthias Baas (ba...@ir...). import os, os.path, gzip, md5 import cPickle import declarations_cache class index_entry_t: """Entry of the index table in the directory cache index. Each cached header file (i.e. each *.cache file) has a corresponding index_entry_t object. This object is used to determine whether the cache file with the declarations is still valid or not. This class is a helper class for the directory_cache_t class. """ def __init__( self, filesigs, configsig ): """Constructor. filesigs is a list of tuples (fileid, sig)... configsig is the signature of the configuration object. """ self.filesigs = filesigs self.configsig = configsig def __getstate__(self): return (self.filesigs, self.configsig) def __setstate__(self, state): self.filesigs, self.configsig = state class directory_cache_t ( declarations_cache.cache_base_t ): """Cache class that stores its data as multiple files inside a directory. The cache stores one index file called "index.dat" which is always read by the cache when the cache object is created. Each header file will have its corresponding *.cache file that stores the declarations found in the header file. The index file is used to determine whether a *.cache file is still valid or not (by checking if one of the dependent files (i.e. the header file itself and all included files) have been modified since the last run). """ def __init__( self, dir="cache", compression=False, md5_sigs=True ): """Constructor. dir is the cache directory (it is created if it does not exist). If compression is set to True the cache files will be compressed using gzip. md5_sigs determines whether file modifications is checked by computing a md5 digest or by checking the modification date. """ declarations_cache.cache_base_t.__init__(self) # Cache directory self.__dir = os.path.abspath(dir) # Flag that determines whether the cache files will be compressed self.__compression = compression # Flag that determines whether the signature is a md5 digest or # the modification time # (this flag is passed to the filename_repository_t class) self.__md5_sigs = md5_sigs # Filename repository self.__filename_rep = filename_repository_t(self.__md5_sigs) # Index dictionary (Key is the value returned by _create_cache_key() # (which is based on the header file name) and value is an # index_entry_t object) self.__index = {} # Flag that indicates whether the index was modified self.__modified_flag = False # Check if dir refers to an existing file... if os.path.isfile(self.__dir): raise ValueError, "Cannot use %s as cache directory. There is already a file with that name."%self.__dir # Load the cache or create the cache directory... if os.path.isdir(self.__dir): self._load() else: # Create the cache directory... os.mkdir(self.__dir) def flush(self): """Save the index table to disk.""" self._save() # self.__filename_rep._dump() def update(self, source_file, configuration, declarations, included_files): """Replace a cache entry by a new value. """ # Normlize all paths... source_file = os.path.normpath(source_file) included_files = map(lambda p: os.path.normpath(p), included_files) # Create the list of dependent files. This is the included_files list # + the source file. Duplicate names are removed. dependent_files = {} for name in [source_file]+included_files: dependent_files[name] = 1 dependent_files = dependent_files.keys() key = self._create_cache_key(source_file) # Remove an existing entry (if there is one) # After calling this method, it is guaranteed that __index[key] # does not exist anymore. self._remove_entry(source_file, key) # Create a new entry... # Create the sigs of all dependent files... filesigs = [] for filename in dependent_files: id,sig = self.__filename_rep.acquire_filename(filename) filesigs.append((id,sig)) configsig = self._create_config_signature(configuration) entry = index_entry_t(filesigs, configsig) self.__index[key] = entry self.__modified_flag = True # Write the declarations into the cache file... cachefilename = self._create_cache_filename(source_file) self._write_file(cachefilename, declarations) def cached_value(self, source_file, configuration): """Return the cached declarations or None. """ # Check if the cache contains an entry for source_file key = self._create_cache_key(source_file) entry = self.__index.get(key) if entry==None: # print "CACHE: %s: Not cached"%source_file return None # Check if the entry is still valid. It is not valid if: # - the source_file has been updated # - the configuration object has changed (i.e. the header is parsed # by gccxml with different settings which may influence the # declarations) # - the included files have been updated # (this list is part of the cache entry as it cannot be known # by the caller when cached_value() is called. It was instead # passed to update()) # Check if the config is different... configsig = self._create_config_signature(configuration) if configsig!=entry.configsig: # print "CACHE: %s: Config mismatch"%source_file return None # Check if any of the dependent files has been modified... for id, sig in entry.filesigs: if self.__filename_rep.is_file_modified(id, sig): # print "CACHE: %s: Entry not up to date"%source_file return None # Load and return the cached declarations cachefilename = self._create_cache_filename(source_file) decls = self._read_file(cachefilename) # print "CACHE: Using cached decls for",source_file return decls def _load(self): """Load the cache. This method is called in the constructor. """ indexfilename = os.path.join(self.__dir, "index.dat") if os.path.exists(indexfilename): data = self._read_file(indexfilename) self.__index = data[0] self.__filename_rep = data[1] if self.__filename_rep._md5_sigs!=self.__md5_sigs: print "CACHE: Warning: md5_sigs stored in the cache is set to %s."%self.__filename_rep._md5_sigs print " Please remove the cache to change this setting." self.__md5_sigs = self.__filename_rep._md5_sigs else: self.__index = {} self.__filename_rep = filename_repository_t(self.__md5_sigs) self.__modified_flag = False def _save(self): """Save the cache index if it was modified. """ if self.__modified_flag: self.__filename_rep.update_id_counter() indexfilename = os.path.join(self.__dir, "index.dat") self._write_file(indexfilename, (self.__index,self.__filename_rep)) self.__modified_flag = False def _read_file(self, filename): """Read a Python object from a cache file. Reads a pickled object from disk and returns it. """ if self.__compression: f = gzip.GzipFile(filename, "rb") else: f = file(filename, "rb") res = cPickle.load(f) f.close() return res def _write_file(self, filename, data): """Write a data item into a file. The data object is written to a file using the pickle mechanism. """ if self.__compression: f = gzip.GzipFile(filename, "wb") else: f = file(filename, "wb") cPickle.dump(data, f, cPickle.HIGHEST_PROTOCOL) f.close() def _remove_entry(self, source_file, key): """Remove an entry from the cache. source_file is the name of the header and key is its corresponding cache key (obtained by a call to _create_cache_key()). The entry is removed from the index table, any referenced file name is released and the cache file is deleted. If key references a non-existing entry, the method returns immediately. """ entry = self.__index.get(key) if entry==None: return # Release the referenced files... for id, sig in entry.filesigs: self.__filename_rep.release_filename(id) # Remove the cache entry... del self.__index[key] self.__modified_flag = True # Delete the corresponding cache file... cachefilename = self._create_cache_filename(source_file) try: os.remove(cachefilename) except OSError, e: print "Could not remove cache file (%s)"%e def _create_cache_key(self, source_file): """Return the cache key for a header file.""" path, name = os.path.split(source_file) return name+str(hash(path)) def _create_cache_filename(self, source_file): """Return the cache file name for a header file. """ res = self._create_cache_key(source_file)+".cache" return os.path.join(self.__dir, res) def _create_config_signature(self, config): """Return the signature for a config object. """ m = md5.new() m.update(config.working_directory) map(lambda p: m.update(p), config.include_paths) map(lambda p: m.update(p), config.define_symbols) map(lambda p: m.update(p), config.undefine_symbols) return m.digest() class filename_entry_t: """This is a record stored in the filename_repository_t class. The class is an internal class used in the implementation of the filename_repository_t class and it just serves as a container for the file name and the reference count. """ def __init__( self, filename ): """Constructor. The reference count is initially set to 0. """ # Filename self.filename = filename # Reference count self.refcount = 0 # Cached signature value for the file. # If sig_valid flag is False, the signature still has to be computed, # otherwise the cached value can be used. # These attributes must not be pickled! self.sig_valid = False self.signature = None def __getstate__(self): # Only pickle filename and refcount return (self.filename, self.refcount) def __setstate__(self, state): self.filename, self.refcount = state self.sig_valid = False self.signature = None def inc_ref_count(self): """Increase the reference count by 1.""" self.refcount += 1 def dec_ref_count(self): """Decrease the reference count by 1 and return the new count.""" self.refcount -= 1 return self.refcount class filename_repository_t: """File name repository. This class stores file names and can check whether a file has been modified or not since a previous call. A file name is stored by calling acquire_filename() which returns an ID and a signature of the file. The signature can later be used to check if the file was modified by calling is_file_modified(). If the file name is no longer required release_filename() should be called so that the entry can be removed from the repository. """ def __init__( self, md5_sigs ): """Constructor. """ # Flag that determines whether the signature is a md5 digest or # the modification time # (this flag is passed to the filename_repository_t class) self._md5_sigs = md5_sigs # ID lookup table (key: filename / value: id) self.__id_lut = {} # Entry dictionary (key: id / value: filename_entry_t) # This dictionary contains the actual data. # It must always hold that each entry in __entries has a corresponding # entry in __id_lut (i.e. the keys in __id_lut must be the names # stored in __entries) self.__entries = {} # A counter for new ids self.__next_id = 1 def acquire_filename(self, name): """Acquire a file name and return its id and its signature. """ id = self.__id_lut.get(name) # Is this a new entry? if id==None: # then create one... id = self.__next_id self.__next_id += 1 self.__id_lut[name] = id entry = filename_entry_t(name) self.__entries[id] = entry else: # otherwise obtain the entry... entry = self.__entries[id] entry.inc_ref_count() return id, self._get_signature(entry) def release_filename(self, id): """Release a file name. """ entry = self.__entries.get(id) if entry==None: raise ValueError, "Invalid filename id (%d)"%id # Decrease reference count and check if the entry has to be removed... if entry.dec_ref_count()==0: del self.__entries[id] del self.__id_lut[entry.filename] def is_file_modified(self, id, signature): """Check if the file referred to by id has been modified. """ entry = self.__entries.get(id) if entry==None: raise ValueError, "Invalid filename id (%d)"%id # Is the signature already known? if entry.sig_valid: # use the cached signature filesig = entry.signature else: # compute the signature and store it filesig = self._get_signature(entry) entry.signature = filesig entry.sig_valid = True return filesig!=signature def update_id_counter(self): """Update the id counter so that it doesn't grow forever. """ if len(self.__entries)==0: self.__next_id = 1 else: self.__next_id = max(self.__entries.keys())+1 def _get_signature(self, entry): """Return the signature of the file stored in entry. """ if self._md5_sigs: # return md5 digest of the file content... if not os.path.exists(entry.filename): return None try: f = file(entry.filename) except IOError, e: print "Cannot determine md5 digest:",e return None data = f.read() f.close() return md5.new(data).digest() else: # return file modification date... try: return os.path.getmtime(entry.filename) except OSError, e: return None def _dump(self): """Dump contents for debugging/testing. """ print 70*"-" print "ID lookup table:" for name in self.__id_lut: id = self.__id_lut[name] print " %s -> %d"%(name, id) print 70*"-" print "%-4s %-60s %s"%("ID", "Filename", "Refcount") print 70*"-" for id in self.__entries: entry = self.__entries[id] print "%04d %-60s %d"%(id, entry.filename, entry.refcount) Index: __init__.py =================================================================== RCS file: /cvsroot/pygccxml/source/pygccxml/parser/__init__.py,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** __init__.py 2 Mar 2006 05:53:14 -0000 1.17 --- __init__.py 6 Mar 2006 14:31:41 -0000 1.18 *************** *** 19,22 **** --- 19,23 ---- from declarations_cache import file_cache_t from declarations_cache import dummy_cache_t + from directory_cache import directory_cache_t #shortcut CONTENT_TYPE = file_configuration_t.CONTENT_TYPE *************** *** 42,44 **** def parse_xml_file( content, config=None ): parser = source_reader_t( config ) ! return parser.read_xml_file( content ) \ No newline at end of file --- 43,45 ---- def parse_xml_file( content, config=None ): parser = source_reader_t( config ) ! return parser.read_xml_file( content ) |
From: Roman <rom...@us...> - 2006-03-06 05:02:44
|
Update of /cvsroot/pygccxml/source/pygccxml/unittests In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8117/pygccxml/unittests Modified Files: test_all.py Log Message: I created new multiple declarations class. Index: test_all.py =================================================================== RCS file: /cvsroot/pygccxml/source/pygccxml/unittests/test_all.py,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** test_all.py 5 Mar 2006 05:44:14 -0000 1.17 --- test_all.py 6 Mar 2006 05:02:40 -0000 1.18 *************** *** 31,34 **** --- 31,35 ---- import filters_tester import cache_enums_tester + import decl_printer_tester def create_suite(): *************** *** 60,63 **** --- 61,65 ---- , filters_tester , cache_enums_tester + , decl_printer_tester ] |
From: Roman <rom...@us...> - 2006-03-06 05:02:43
|
Update of /cvsroot/pygccxml/source/pyplusplus/unittests In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8117/pyplusplus/unittests Modified Files: test_all.py Added Files: mdecl_wrapper_tester.py Log Message: I created new multiple declarations class. --- NEW FILE: mdecl_wrapper_tester.py --- # Copyright 2004 Roman Yakovenko. # Distributed under the Boost Software License, Version 1.0. (See # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) import os import sys import unittest import autoconfig from pygccxml import parser from pygccxml import declarations from pyplusplus import decl_wrappers from pyplusplus import module_builder class tester_t(unittest.TestCase): def _get_files( self ): files = [ 'enums_to_be_exported.hpp' , 'free_functions_to_be_exported.hpp' , 'free_operators_to_be_exported.hpp' , 'global_variables_to_be_exported.hpp' , 'index_operator_to_be_exported.hpp' , 'member_functions_to_be_exported.hpp' ] return map( lambda f: os.path.join( autoconfig.data_directory, f ) , files ) def test(self): config = parser.config_t( gccxml_path=autoconfig.gccxml_path , include_paths=[autoconfig.boost_path] , undefine_symbols=['__MINGW32__']) mb = module_builder.module_builder_t( 'dummy' , self._get_files() , config ) classes = filter( lambda d: isinstance( d, decl_wrappers.class_t ) , declarations.make_flatten( mb.declarations ) ) mdw = decl_wrappers.mdecl_wrapper_t( classes ) #check set to property functionality for d in mdw: d.always_expose_using_scope = False mdw.always_expose_using_scope = True all_true = True for d in mdw: all_true &= d.always_expose_using_scope self.failUnless( all_true ) #check call method functionality for d in mdw: d.ignore = True mdw.include() all_false = False for d in mdw: all_true |= d.ignore self.failUnless( not all_false ) #check for exception: try: mdw.call_policies = None self.fail( "Runtime error has not been raised." ) except RuntimeError: pass def create_suite(): suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) return suite def run_suite(): unittest.TextTestRunner(verbosity=2).run( create_suite() ) if __name__ == "__main__": run_suite() Index: test_all.py =================================================================== RCS file: /cvsroot/pygccxml/source/pyplusplus/unittests/test_all.py,v retrieving revision 1.32 retrieving revision 1.33 diff -C2 -d -r1.32 -r1.33 *** test_all.py 5 Mar 2006 05:51:30 -0000 1.32 --- test_all.py 6 Mar 2006 05:02:41 -0000 1.33 *************** *** 42,45 **** --- 42,47 ---- import optional_tester import index_operator_tester + import dwrapper_printer_tester + import mdecl_wrapper_tester def create_suite(times): *************** *** 80,83 **** --- 82,87 ---- , optional_tester , index_operator_tester + , dwrapper_printer_tester + , mdecl_wrapper_tester ] |
From: Roman <rom...@us...> - 2006-03-06 05:02:43
|
Update of /cvsroot/pygccxml/source/pyplusplus/decl_wrappers In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8117/pyplusplus/decl_wrappers Added Files: mdecl_wrapper.py Log Message: I created new multiple declarations class. --- NEW FILE: mdecl_wrapper.py --- # Copyright 2004 Roman Yakovenko. # Distributed under the Boost Software License, Version 1.0. (See # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) class call_redirector_t( object ): def __init__( self, name, decls ): object.__init__( self ) self.name = name self.decls = decls def __call__( self, *arguments, **keywords ): for d in self.decls: callable = getattr(d, self.name) callable( *arguments, **keywords ) class mdecl_wrapper_t( object ): def __init__( self, decls ): object.__init__( self ) self.__dict__['_decls'] = decls def __len__( self ): return len( self._decls ) def __getitem__( self, index ): return self._decls[index] def __ensure_attribute( self, name ): invalid_decls = filter( lambda d: not hasattr( d, name ), self._decls ) if invalid_decls: raise RuntimeError( "Not all declarations have '%s' attribute." % name ) def __setattr__( self, name, value ): self.__ensure_attribute( name ) for d in self._decls: setattr( d, name, value ) def __getattr__( self, name ): return call_redirector_t( name, self._decls ) |
From: Roman <rom...@us...> - 2006-03-06 05:00:39
|
Update of /cvsroot/pygccxml/source/pyplusplus/decl_wrappers In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7137/pyplusplus/decl_wrappers Modified Files: __init__.py Added Files: decl_wrapper_printer.py Log Message: Removing DeclPrinter class from experemental folder. Now there are 2 printers: decl_printer_t and decl_wrapper_printer_t Index: __init__.py =================================================================== RCS file: /cvsroot/pygccxml/source/pyplusplus/decl_wrappers/__init__.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** __init__.py 28 Feb 2006 07:31:33 -0000 1.1 --- __init__.py 6 Mar 2006 05:00:33 -0000 1.2 *************** *** 4,13 **** # http://www.boost.org/LICENSE_1_0.txt) ! import calldef_wrapper ! import class_wrapper ! import enumeration_wrapper ! import namespace_wrapper ! import typedef_wrapper ! import variable_wrapper from pygccxml import declarations --- 4,32 ---- # http://www.boost.org/LICENSE_1_0.txt) ! from decl_wrapper import decl_wrapper_t ! ! from calldef_wrapper import calldef_t ! from calldef_wrapper import member_function_t ! from calldef_wrapper import constructor_t ! from calldef_wrapper import destructor_t ! from calldef_wrapper import member_operator_t ! from calldef_wrapper import casting_operator_t ! from calldef_wrapper import free_function_t ! from calldef_wrapper import free_operator_t ! ! from class_wrapper import class_declaration_t ! from class_wrapper import class_t ! ! from enumeration_wrapper import enumeration_t ! ! from namespace_wrapper import namespace_t ! ! from typedef_wrapper import typedef_t ! ! from variable_wrapper import variable_t ! ! from scopedef_wrapper import scopedef_t ! ! from pygccxml import declarations *************** *** 33,36 **** --- 52,60 ---- from call_policies import return_value_policy + from decl_wrapper_printer import decl_wrapper_printer_t + from decl_wrapper_printer import print_declarations + + from mdecl_wrapper import mdecl_wrapper_t + class dwfactory_t( declarations.decl_factory_t ): """ *************** *** 41,80 **** def create_member_function( self, *arguments, **keywords ): ! return calldef_wrapper.member_function_t(*arguments, **keywords) def create_constructor( self, *arguments, **keywords ): ! return calldef_wrapper.constructor_t(*arguments, **keywords) def create_destructor( self, *arguments, **keywords ): ! return calldef_wrapper.destructor_t(*arguments, **keywords) def create_member_operator( self, *arguments, **keywords ): ! return calldef_wrapper.member_operator_t(*arguments, **keywords) def create_casting_operator( self, *arguments, **keywords ): ! return calldef_wrapper.casting_operator_t(*arguments, **keywords) def create_free_function( self, *arguments, **keywords ): ! return calldef_wrapper.free_function_t(*arguments, **keywords) def create_free_operator( self, *arguments, **keywords ): ! return calldef_wrapper.free_operator_t(*arguments, **keywords) def create_class_declaration(self, *arguments, **keywords ): ! return class_wrapper.class_declaration_t(*arguments, **keywords) def create_class( self, *arguments, **keywords ): ! return class_wrapper.class_t(*arguments, **keywords) def create_enumeration( self, *arguments, **keywords ): ! return enumeration_wrapper.enumeration_t(*arguments, **keywords) def create_namespace( self, *arguments, **keywords ): ! return namespace_wrapper.namespace_t(*arguments, **keywords) def create_typedef( self, *arguments, **keywords ): ! return typedef_wrapper.typedef_t(*arguments, **keywords) def create_variable( self, *arguments, **keywords ): ! return variable_wrapper.variable_t(*arguments, **keywords) --- 65,104 ---- def create_member_function( self, *arguments, **keywords ): ! return member_function_t(*arguments, **keywords) def create_constructor( self, *arguments, **keywords ): ! return constructor_t(*arguments, **keywords) def create_destructor( self, *arguments, **keywords ): ! return destructor_t(*arguments, **keywords) def create_member_operator( self, *arguments, **keywords ): ! return member_operator_t(*arguments, **keywords) def create_casting_operator( self, *arguments, **keywords ): ! return casting_operator_t(*arguments, **keywords) def create_free_function( self, *arguments, **keywords ): ! return free_function_t(*arguments, **keywords) def create_free_operator( self, *arguments, **keywords ): ! return free_operator_t(*arguments, **keywords) def create_class_declaration(self, *arguments, **keywords ): ! return class_declaration_t(*arguments, **keywords) def create_class( self, *arguments, **keywords ): ! return class_t(*arguments, **keywords) def create_enumeration( self, *arguments, **keywords ): ! return enumeration_t(*arguments, **keywords) def create_namespace( self, *arguments, **keywords ): ! return namespace_t(*arguments, **keywords) def create_typedef( self, *arguments, **keywords ): ! return typedef_t(*arguments, **keywords) def create_variable( self, *arguments, **keywords ): ! return variable_t(*arguments, **keywords) --- NEW FILE: decl_wrapper_printer.py --- # Copyright 2004 Roman Yakovenko, 2006 Allen Bierbaum, Matthias Baas # Distributed under the Boost Software License, Version 1.0. (See # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) import os import sys from pygccxml import declarations class decl_wrapper_printer_t( declarations.decl_printer_t ): """ Helper class for printing decl tree. """ JUSTIFY = 20 INDENT_SIZE = 4 def __init__( self, level=0, print_details=True, recursive=True, writer=None ): declarations.decl_printer_t.__init__(self, level, print_details, recursive, writer) def clone( self, increment_level=True ): level = self.level if increment_level: level += 1 return decl_wrapper_printer_t(level, self.print_details, self.recursive, self.writer) def print_decl_header(self): super( decl_wrapper_printer_t, self ).print_decl_header() if not self.print_details: return self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Alias: " + self.instance.alias + os.linesep ) self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Ignore: " + str( self.instance.ignore ) + os.linesep ) def print_calldef_wrapper(self): if not self.print_details: return self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Call policies: " + str(self.instance.call_policies) + os.linesep ) self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Use keywords: " + str(self.instance.use_keywords) + os.linesep ) self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Use signature: " + str(self.instance.create_with_signature) + os.linesep ) self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Use default arguments: " + str(self.instance.use_default_arguments) + os.linesep ) def visit_member_function( self ): super( decl_wrapper_printer_t, self ).visit_member_function() self.print_calldef_wrapper() def visit_constructor( self ): super( decl_wrapper_printer_t, self ).visit_constructor() self.print_calldef_wrapper() def visit_destructor( self ): super( decl_wrapper_printer_t, self ).visit_destructor() self.print_calldef_wrapper() def visit_member_operator( self ): super( decl_wrapper_printer_t, self ).visit_member_operator() self.print_calldef_wrapper() def visit_casting_operator( self ): super( decl_wrapper_printer_t, self ).visit_casting_operator() self.print_calldef_wrapper() def visit_free_function( self ): super( decl_wrapper_printer_t, self ).visit_free_function() self.print_calldef_wrapper() def visit_free_operator( self ): super( decl_wrapper_printer_t, self ).visit_free_operator() self.print_calldef_wrapper() def visit_class_declaration(self ): super( decl_wrapper_printer_t, self ).visit_class_declaration() def visit_class(self ): super( decl_wrapper_printer_t, self ).visit_class() self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Expose using scope: " + str(self.instance.always_expose_using_scope) + os.linesep ) self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Redefine operators: " + str(self.instance.redefine_operators) + os.linesep ) self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Held type: " + str(self.instance.held_type) + os.linesep ) self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Use noncopyable: " + str(self.instance.noncopyable) + os.linesep ) self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Class wrapper alias: " + str(self.instance.wrapper_alias) + os.linesep ) def visit_enumeration(self): super( decl_wrapper_printer_t, self ).visit_enumeration() self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Enumeration value aliases: " + str(self.instance.value_aliases) + os.linesep ) self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Enumeration export values: " + str(self.instance.export_values) + os.linesep ) def visit_namespace(self ): super( decl_wrapper_printer_t, self ).visit_namespace() def visit_typedef(self ): super( decl_wrapper_printer_t, self ).visit_typedef() def visit_variable(self ): super( decl_wrapper_printer_t, self ).visit_variable() def print_declarations( decls, detailed=True, recursive=True, writer=sys.stdout.write ): """ Print decl tree rooted at each of the included nodes. decls - either a single decl or a list of decls. """ prn = decl_wrapper_printer_t(0, detailed, recursive, writer) if type(decls) is not list: decls = [decls] for d in decls: prn.level = 0 prn.instance = d declarations.apply_visitor(prn, d) |
From: Roman <rom...@us...> - 2006-03-06 05:00:38
|
Update of /cvsroot/pygccxml/source/pyplusplus/unittests In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7137/pyplusplus/unittests Added Files: dwrapper_printer_tester.py Log Message: Removing DeclPrinter class from experemental folder. Now there are 2 printers: decl_printer_t and decl_wrapper_printer_t --- NEW FILE: dwrapper_printer_tester.py --- # Copyright 2004 Roman Yakovenko. # Distributed under the Boost Software License, Version 1.0. (See # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) import os import sys import unittest import autoconfig from pygccxml import parser from pyplusplus import decl_wrappers from pyplusplus import module_builder class tester_t(unittest.TestCase): def _get_files( self ): files = [ 'enums_to_be_exported.hpp' , 'free_functions_to_be_exported.hpp' , 'free_operators_to_be_exported.hpp' , 'global_variables_to_be_exported.hpp' , 'index_operator_to_be_exported.hpp' , 'member_functions_to_be_exported.hpp' ] return map( lambda f: os.path.join( autoconfig.data_directory, f ) , files ) def test(self): config = parser.config_t( gccxml_path=autoconfig.gccxml_path , include_paths=[autoconfig.boost_path] , undefine_symbols=['__MINGW32__']) mb = module_builder.module_builder_t( 'dummy' , self._get_files() , config ) writer = lambda decl: None decl_wrappers.print_declarations( mb.declarations, writer=writer ) def create_suite(): suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) return suite def run_suite(): unittest.TextTestRunner(verbosity=2).run( create_suite() ) if __name__ == "__main__": run_suite() |
From: Roman <rom...@us...> - 2006-03-06 05:00:38
|
Update of /cvsroot/pygccxml/source/pygccxml/unittests In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7137/pygccxml/unittests Added Files: decl_printer_tester.py Log Message: Removing DeclPrinter class from experemental folder. Now there are 2 printers: decl_printer_t and decl_wrapper_printer_t --- NEW FILE: decl_printer_tester.py --- # Copyright 2004 Roman Yakovenko. # Distributed under the Boost Software License, Version 1.0. (See # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) import unittest import autoconfig import parser_test_case from pygccxml import parser from pygccxml import declarations class tester_t( parser_test_case.parser_test_case_t ): def __init__(self, *args): parser_test_case.parser_test_case_t.__init__(self, *args) self.__files = [ 'core_ns_join_1.hpp' , 'core_ns_join_2.hpp' , 'core_ns_join_3.hpp' , 'core_membership.hpp' , 'core_class_hierarchy.hpp' , 'core_types.hpp' , 'core_diamand_hierarchy_base.hpp' , 'core_diamand_hierarchy_derived1.hpp' , 'core_diamand_hierarchy_derived2.hpp' , 'core_diamand_hierarchy_final_derived.hpp' , 'core_overloads_1.hpp' , 'core_overloads_2.hpp' ] def test(self): prj_reader = parser.project_reader_t( self.config ) prj_decls = prj_reader.read_files( self.__files , compilation_mode=parser.COMPILATION_MODE.FILE_BY_FILE ) writer = lambda decl: None declarations.print_declarations( prj_decls, writer=writer ) def create_suite(): suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) return suite def run_suite(): unittest.TextTestRunner(verbosity=2).run( create_suite() ) if __name__ == "__main__": run_suite() |
From: Roman <rom...@us...> - 2006-03-06 05:00:36
|
Update of /cvsroot/pygccxml/source/pygccxml/declarations In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7137/pygccxml/declarations Modified Files: __init__.py Added Files: decl_printer.py Log Message: Removing DeclPrinter class from experemental folder. Now there are 2 printers: decl_printer_t and decl_wrapper_printer_t --- NEW FILE: decl_printer.py --- # Copyright 2004 Roman Yakovenko, 2006 Allen Bierbaum, Matthias Baas # Distributed under the Boost Software License, Version 1.0. (See # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) import os import sys import decl_visitor import algorithm class decl_printer_t( decl_visitor.decl_visitor_t ): """ Helper class for printing decl tree. """ JUSTIFY = 20 INDENT_SIZE = 4 def __init__( self, level=0, print_details=True, recursive=True, writer=None ): decl_visitor.decl_visitor_t.__init__(self) self.__inst = None self.__level = level self.__print_details = print_details self.__recursive = recursive self.__writer = writer if not self.__writer: self.__writer = sys.stdout.write def clone(self, increment_level=True): level = self.__level if increment_level: level += 1 return decl_printer_t( level , self.print_details , recursive=self.recursive , writer=self.writer ) def _get_recursive(self): return self.__recursive def _set_recursive(self, recursive): self.__recursive = recursive recursive = property( _get_recursive, _set_recursive) def _get_level(self): return self.__level def _set_level(self, lvl): self.__level = lvl level = property( _get_level, _set_level ) def _get_print_details(self): return self.__print_details def _set_print_details(self, details): self.__print_details = details print_details = property( _get_print_details, _set_print_details) def _get_writer(self): return self.__writer def _set_writer(self, writer): self.__writer = writer writer = property( _get_writer, _set_writer) def _get_inst(self): return self.__inst def _set_inst(self, inst): self.__inst = inst instance = property( _get_inst, _set_inst ) def __nice_decl_name( self, inst ): name = inst.__class__.__name__ return name #if name.endswith( '_t' ): # name = name[:-len('_t')] #return name.replace( '_', ' ' ) def print_decl_header(self): header = self.__nice_decl_name( self.__inst ) + ": '%s'" % self.__inst.name self.writer( ' ' * self.level * self.INDENT_SIZE + header.ljust( self.JUSTIFY ) + os.linesep ) if self.__print_details: curr_level = self.level + 1 if self.__inst.location: location = 'location: [%s]:%s'%(self.__inst.location.file_name, self.__inst.location.line) self.writer( ' ' * curr_level * self.INDENT_SIZE + location + os.linesep ) artificial = 'artificial: ' + "'%s'" % str(self.__inst.is_artificial) self.writer( ' ' * curr_level * self.INDENT_SIZE + artificial.ljust( self.JUSTIFY ) + os.linesep ) def __get_method_signature(self, decl=None): """ Returns function signature: [retval, [arg1, ..., argN]]. """ if None is decl: decl = self.__inst retval = decl.return_type.decl_string args = [] for arg in decl.arguments: args.append(arg.type.decl_string) return [retval, args] def visit_member_function( self ): self.print_decl_header() self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Signature: " + str( self.__get_method_signature() ) + os.linesep ) def visit_constructor( self ): self.print_decl_header() def visit_destructor( self ): self.print_decl_header() def visit_member_operator( self ): self.print_decl_header() def visit_casting_operator( self ): self.print_decl_header() def visit_free_function( self ): self.print_decl_header() def visit_free_operator( self ): self.print_decl_header() def visit_class_declaration(self ): self.print_decl_header() def visit_class(self ): self.print_decl_header() curr_level = self.level + 1 class_type = 'class type: ' + "'%s'" % str(self.__inst.class_type) self.writer( ' ' * curr_level * self.INDENT_SIZE + class_type.ljust( self.JUSTIFY ) + os.linesep ) def print_hierarchy(hierarchy_type, classes, curr_level): self.writer( ' ' * curr_level * self.INDENT_SIZE + hierarchy_type.ljust( self.JUSTIFY ) + os.linesep ) curr_level += 1 for class_ in classes: class_str = 'class: ' + "'%s'" % str(class_.related_class.decl_string) self.writer( ' ' * curr_level * self.INDENT_SIZE + class_str.ljust( self.JUSTIFY ) + os.linesep ) access = 'access: ' + "'%s'" % str(class_.access) self.writer( ' ' * (curr_level + 1)* self.INDENT_SIZE + access.ljust( self.JUSTIFY ) + os.linesep ) def print_members(members_type, members, curr_level): self.writer( ' ' * curr_level * self.INDENT_SIZE + members_type.ljust( self.JUSTIFY ) + os.linesep ) if self.__recursive: curr_level += 1 for member in members: prn = self.clone() prn.instance = member algorithm.apply_visitor( prn, member ) if self.__inst.bases: print_hierarchy( 'base classes: ', self.__inst.bases, curr_level ) if self.__inst.derived: print_hierarchy( 'derived classes: ', self.__inst.derived, curr_level ) print_members( 'public: ', self.__inst.public_members, curr_level ) print_members( 'protected: ', self.__inst.protected_members, curr_level ) print_members( 'private: ', self.__inst.private_members, curr_level ) def visit_enumeration(self): self.print_decl_header() curr_level = self.level + 1 self.writer( ' ' * curr_level * self.INDENT_SIZE + 'values: ['.ljust( self.JUSTIFY ) ) for name, value in self.__inst.values.items(): self.writer( "%s:%s, "% (name, value) + os.linesep ) def visit_namespace(self ): self.print_decl_header() if self.__recursive: for decl in self.__inst.declarations: prn = self.clone() prn.instance = decl algorithm.apply_visitor( prn, decl ) def visit_typedef(self ): self.print_decl_header() curr_level = self.level + 1 self.writer( ' ' * curr_level * self.INDENT_SIZE + 'alias to: ' + self.__inst.type.decl_string + os.linesep ) def visit_variable(self ): self.print_decl_header() curr_level = self.level + 1 self.writer( ' ' * curr_level * self.INDENT_SIZE + 'type: %s value: %s'%(self.__inst.type.decl_string, self.__inst.value) + os.linesep) def print_declarations( decls, detailed=True, recursive=True, writer=sys.stdout.write ): """ Print decl tree rooted at each of the included nodes. decls - either a single decl or a list of decls. """ prn = decl_printer_t(0, detailed, recursive, writer) if type(decls) is not list: decls = [decls] for d in decls: prn.level = 0 prn.instance = d algorithm.apply_visitor(prn, d) Index: __init__.py =================================================================== RCS file: /cvsroot/pygccxml/source/pygccxml/declarations/__init__.py,v retrieving revision 1.34 retrieving revision 1.35 diff -C2 -d -r1.34 -r1.35 *** __init__.py 5 Mar 2006 05:41:11 -0000 1.34 --- __init__.py 6 Mar 2006 05:00:32 -0000 1.35 *************** *** 142,144 **** from filters import access_type_matcher_t ! from matcher import matcher \ No newline at end of file --- 142,147 ---- from filters import access_type_matcher_t ! from matcher import matcher ! ! from decl_printer import decl_printer_t ! from decl_printer import print_declarations \ No newline at end of file |
From: Roman <rom...@us...> - 2006-03-06 04:56:17
|
Update of /cvsroot/pygccxml/source/pyplusplus/code_creators In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5588/pyplusplus/code_creators Modified Files: algorithm.py Log Message: Cleaning decl_wrapper\algorithm.py and code_creators\algorithm.py files There is still work that should be done Index: algorithm.py =================================================================== RCS file: /cvsroot/pygccxml/source/pyplusplus/code_creators/algorithm.py,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** algorithm.py 14 Dec 2005 09:09:52 -0000 1.13 --- algorithm.py 6 Mar 2006 04:56:13 -0000 1.14 *************** *** 9,12 **** --- 9,15 ---- """ + from pyplusplus.decl_wrappers.algorithm import * + + import re import types *************** *** 14,96 **** import namespace - def creators_affect_on_me( me ): - """ - This algorithm finds all code creators that can influence on code generated - by me. Description of alogrithm: - [a b c d e f g] - | - + [k l m] - | - + [y x] <-- we are here ( x ) - The answer of this algorithm is [y,l,k,d,c,b,a] - """ - class impl: - def __init__( self, creator): - self._creator = creator - - def _get_left_siblings( self, child ): - if not child or not child.parent: - return [] - ids = map( id, child.parent.creators ) - child_index = ids.index( id( child ) ) - return child.parent.creators[:child_index] - - def _get_definition_set( self, child ): - answer = [] - while child: - answer.extend( self._get_left_siblings( child ) ) - child = child.parent - return answer - - def affect_creators(self): - return self._get_definition_set( self._creator ) - return impl( me ).affect_creators() - - __RE_VALID_IDENTIFIER = re.compile( r"[_a-z]\w*", re.I | re.L | re.U ) - def create_valid_name(name): - """ - This function takes valid C++ class\\function name and will return valid - Python name. I need this function in order to expose template instantiations - """ - global __RE_VALID_IDENTIFIER - match_found = __RE_VALID_IDENTIFIER.match(name) - if match_found and ( match_found.end() - match_found.start() == len(name) ): - return name - replace_table = { - '<' : '_less_' - , '>' : '_grate_' - , '::' : '_scope_' - , ',' : '_comma_' - , ' ' : '_' - , '\t' : '_' - , '*' : '_ptr_' - , '&' : '_ref_' - , '(' : '_obrace_' - , ')' : '_cbrace_' - , '[' : '_o_sq_brace_' - , ']' : '_c_sq_brace_' - , '=' : '_equal_' - } - for orig, dest in replace_table.items(): - name = name.replace( orig, dest ) - return name - - - def create_identifier(creator, full_name ): - """ - This function will find all relevant namespace aliases and will return new - full name that takes into account namespace aliases. - """ - dset = creators_affect_on_me( creator ) - dset = filter( lambda x: isinstance( x, namespace.namespace_alias_t ), dset ) - full_name = full_name.lstrip( '::' ) - for nsalias in dset: - fnsname = nsalias.full_namespace_name + '::' - if full_name.startswith( fnsname ): - new_name = nsalias.alias + '::' + full_name[ len(fnsname) : ] - return new_name - else: - return full_name - def _make_flatten_list( creator_or_creators ): import compound --- 17,20 ---- *************** *** 176,191 **** search_area = make_flatten( where ) return filter( lambda inst: isinstance( inst, what ), search_area ) ! find_by_class_instance = staticmethod( find_by_class_instance ) ! ! ! class dummy_type_t( pygccxml.declarations.type_t ): ! #This class is very usefull for code generation ! def __init__( self, decl_string ): ! pygccxml.declarations.type_t.__init__( self ) ! self._decl_string = decl_string ! ! def _create_decl_string(self): ! return self._decl_string ! ! def _clone_impl( self ): ! return concrete_array_1_type_t( self._decl_string ) --- 100,102 ---- search_area = make_flatten( where ) return filter( lambda inst: isinstance( inst, what ), search_area ) ! find_by_class_instance = staticmethod( find_by_class_instance ) \ No newline at end of file |
From: Roman <rom...@us...> - 2006-03-06 04:56:17
|
Update of /cvsroot/pygccxml/source/pyplusplus/decl_wrappers In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5588/pyplusplus/decl_wrappers Modified Files: algorithm.py Log Message: Cleaning decl_wrapper\algorithm.py and code_creators\algorithm.py files There is still work that should be done Index: algorithm.py =================================================================== RCS file: /cvsroot/pygccxml/source/pyplusplus/decl_wrappers/algorithm.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** algorithm.py 28 Feb 2006 07:31:33 -0000 1.1 --- algorithm.py 6 Mar 2006 04:56:14 -0000 1.2 *************** *** 93,182 **** return full_name - def _make_flatten_list( creator_or_creators ): - import compound - def proceed_single( creator ): - answer = [ creator ] - if not isinstance( creator, compound.compound_t): - return answer - for internal in creator.creators: - if isinstance( creator, compound.compound_t): - answer.extend( proceed_single( internal ) ) - else: - answer.append( internal ) - return answer - - creators = [] - if isinstance( creator_or_creators, types.ListType ): - creators.extend( creator_or_creators ) - else: - creators.append( creator_or_creators ) - answer = [] - for creator in creators: - answer.extend( proceed_single( creator ) ) - return answer - - def _make_flatten_generator( creator_or_creators ): - import compound - def proceed_single( creator ): - yield creator - if not isinstance( creator, compound.compound_t): - return - for internal in creator.creators: - if isinstance( internal, compound.compound_t): - for internal_internal in proceed_single( internal ): - yield internal_internal - else: - yield internal - - if isinstance( creator_or_creators, types.ListType ): - for creator in creator_or_creators: - for internal in proceed_single( creator ): - yield internal - else: - for internal in proceed_single( creator_or_creators ): - yield internal - - """ - make_flatten - function that will create flat representation of code creators tree. - """ - make_flatten = _make_flatten_list - - class creator_finder: - """ - This class is used as container for different find algorithms. - """ - "creator_finder - this class used as namespace" - def find_by_declaration( declaration_matcher, where, recursive=True ): - """ - Finds code creator by declaration. - declaration_matcher should be callable, that takes single argument - declaration, and returns True or False - where - code creator or list of code creators - This function returns a list of all relevant code creators - """ - import declaration_based #prevent cyclic import - search_area = where - if recursive: - search_area = make_flatten( where ) - return filter( lambda inst: isinstance( inst, declaration_based.declaration_based_t ) \ - and declaration_matcher( inst.declaration ) - , search_area ) - find_by_declaration = staticmethod( find_by_declaration ) - - def find_by_declaration_single( declaration_matcher, where, recursive=True ): - answer = creator_finder.find_by_declaration( declaration_matcher, where, recursive ) - if len( answer ) == 1: - return answer[0] - return None - find_by_declaration_single = staticmethod( find_by_declaration_single ) - - def find_by_class_instance( what, where, recursive=True ): - search_area = where - if recursive: - search_area = make_flatten( where ) - return filter( lambda inst: isinstance( inst, what ), search_area ) - find_by_class_instance = staticmethod( find_by_class_instance ) - - class dummy_type_t( pygccxml.declarations.type_t ): #This class is very usefull for code generation --- 93,96 ---- |
From: Roman <rom...@us...> - 2006-03-06 04:53:34
|
Update of /cvsroot/pygccxml/source/pygccxml/unittests In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4471/pygccxml/unittests Modified Files: autoconfig.py Log Message: Adding Allen family name to spell checker ignore list Index: autoconfig.py =================================================================== RCS file: /cvsroot/pygccxml/source/pygccxml/unittests/autoconfig.py,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** autoconfig.py 21 Dec 2005 07:29:23 -0000 1.10 --- autoconfig.py 6 Mar 2006 04:53:31 -0000 1.11 *************** *** 45,48 **** --- 45,49 ---- map( pydsc.doc_checker.speller.ignore_always , [ 'Yakovenko' + , 'Bierbaum' , 'org' , 'http' |
From: Roman <rom...@us...> - 2006-03-06 04:52:11
|
Update of /cvsroot/pygccxml/source/pygccxml/parser In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4043/pygccxml/parser Modified Files: project_reader.py Log Message: Fixing bug in project reader when merging declarations from different compilations Index: project_reader.py =================================================================== RCS file: /cvsroot/pygccxml/source/pygccxml/parser/project_reader.py,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** project_reader.py 2 Mar 2006 05:53:14 -0000 1.23 --- project_reader.py 6 Mar 2006 04:52:08 -0000 1.24 *************** *** 86,90 **** if not decl_factory: self.__decl_factory = pygccxml.declarations.decl_factory_t() ! def read_files( self, files, compilation_mode=COMPILATION_MODE.FILE_BY_FILE): if compilation_mode == COMPILATION_MODE.ALL_AT_ONCE: --- 86,90 ---- if not decl_factory: self.__decl_factory = pygccxml.declarations.decl_factory_t() ! def read_files( self, files, compilation_mode=COMPILATION_MODE.FILE_BY_FILE): if compilation_mode == COMPILATION_MODE.ALL_AT_ONCE: *************** *** 277,281 **** for decl_wrapper_type in declarated_types: if isinstance( decl_wrapper_type.declaration, pygccxml.declarations.class_t ): ! decl_wrapper_type.declaration = leaved_classes[ create_key(decl_wrapper_type.declaration) ] def _join_declarations( self, declref ): --- 277,295 ---- for decl_wrapper_type in declarated_types: if isinstance( decl_wrapper_type.declaration, pygccxml.declarations.class_t ): ! key = create_key(decl_wrapper_type.declaration) ! if leaved_classes.has_key( key ): ! decl_wrapper_type.declaration = leaved_classes[ create_key(decl_wrapper_type.declaration) ] ! else: ! msg = [] ! msg.append( "Unable to find out actual class definition: '%s'." % decl_wrapper_type.declaration.name ) ! msg.append( "Class definition has been changed from one compilation to an other." ) ! msg.append( "Why did it happen to me? Here is a short list of reasons: " ) ! msg.append( " 1. There are different preprocessor definitions applied on same file during compilation" ) ! msg.append( " 2. GCC implementation details. Diamand class hierarchy will reproduce this behaviour." ) ! msg.append( " If name starts with '__vmi_class_type_info_pseudo' you can ignore this message." ) ! msg.append( " 3. Bug in pygccxml." ) ! logger.error( os.linesep.join(msg) ) ! #'__vmi_class_type_info_pseudo1' ! def _join_declarations( self, declref ): |
From: Roman <rom...@us...> - 2006-03-05 06:26:17
|
Update of /cvsroot/pygccxml/source/pygccxml/parser In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7764/pygccxml/parser Modified Files: source_reader.py Log Message: fixing big bug that existed from the begining. files should be a list and not a dictionary. Many thanks to Matthias Index: source_reader.py =================================================================== RCS file: /cvsroot/pygccxml/source/pygccxml/parser/source_reader.py,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** source_reader.py 2 Mar 2006 05:53:14 -0000 1.25 --- source_reader.py 5 Mar 2006 06:26:13 -0000 1.26 *************** *** 239,242 **** if decl.location: decl.location.file_name = self.__produce_full_file( decl.location.file_name ) ! return (decls, files) --- 239,242 ---- if decl.location: decl.location.file_name = self.__produce_full_file( decl.location.file_name ) ! return ( decls, files.values() ) |
From: Roman <rom...@us...> - 2006-03-05 05:51:34
|
Update of /cvsroot/pygccxml/source/pyplusplus/module_creator In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19454/pyplusplus/module_creator Modified Files: creator.py Log Message: operator[] is now supported Index: creator.py =================================================================== RCS file: /cvsroot/pygccxml/source/pyplusplus/module_creator/creator.py,v retrieving revision 1.58 retrieving revision 1.59 diff -C2 -d -r1.58 -r1.59 *** creator.py 28 Feb 2006 07:31:33 -0000 1.58 --- creator.py 5 Mar 2006 05:51:30 -0000 1.59 *************** *** 119,127 **** return True if isinstance( declaration, declarations.member_operator_t ) \ ! and declaration.symbol == '()': return True if not code_creators.operator_t.supported.is_supported( declaration ): #see http://www.boost.org/libs/python/doc/v2/operators.html#introduction return False return True --- 119,130 ---- return True if isinstance( declaration, declarations.member_operator_t ) \ ! and declaration.symbol in ( '()', '[]' ): return True if not code_creators.operator_t.supported.is_supported( declaration ): #see http://www.boost.org/libs/python/doc/v2/operators.html#introduction return False + if isinstance( declaration, declarations.constructor_t ) \ + and declaration.is_artificial: + return False return True *************** *** 152,161 **** or decl.access_type == declarations.ACCESS_TYPES.PUBLIC , members ) ! if declarations.has_destructor( class_decl ) \ ! and not declarations.has_public_destructor( class_decl ): #remove artificial constructors ! members = filter( lambda decl: not isinstance( decl, declarations.constructor_t ) ! or not decl.is_artificial ! , members ) members = filter( lambda member: not member.ignore, members ) ordered_members = self._reorder_decls( members ) --- 155,164 ---- or decl.access_type == declarations.ACCESS_TYPES.PUBLIC , members ) ! #-#if declarations.has_destructor( class_decl ) \ ! #-# and not declarations.has_public_destructor( class_decl ): #remove artificial constructors ! members = filter( lambda decl: not isinstance( decl, declarations.constructor_t ) ! or not decl.is_artificial ! , members ) members = filter( lambda member: not member.ignore, members ) ordered_members = self._reorder_decls( members ) *************** *** 382,386 **** return ! if self.__curr_decl.symbol == '()': self.visit_member_function() else: --- 385,389 ---- return ! if self.__curr_decl.symbol in ( '()', '[]' ): self.visit_member_function() else: *************** *** 453,458 **** #I don't know but sometimes boost.python requieres #to construct wrapper from wrapped classe ! scons = code_creators.special_constructor_wrapper_t( class_inst=self.__curr_decl ) ! wrapper.adopt_creator( scons ) trivial_constr = declarations.find_trivial_constructor(self.__curr_decl) if trivial_constr and trivial_constr.is_artificial: --- 456,462 ---- #I don't know but sometimes boost.python requieres #to construct wrapper from wrapped classe ! if not declarations.is_noncopyable( self.__curr_decl ): ! scons = code_creators.special_constructor_wrapper_t( class_inst=self.__curr_decl ) ! wrapper.adopt_creator( scons ) trivial_constr = declarations.find_trivial_constructor(self.__curr_decl) if trivial_constr and trivial_constr.is_artificial: |
From: Roman <rom...@us...> - 2006-03-05 05:51:34
|
Update of /cvsroot/pygccxml/source/pyplusplus/unittests In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19454/pyplusplus/unittests Modified Files: test_all.py Added Files: index_operator_tester.py Log Message: operator[] is now supported --- NEW FILE: index_operator_tester.py --- # Copyright 2004 Roman Yakovenko. # Distributed under the Boost Software License, Version 1.0. (See # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) import os import sys import unittest import fundamental_tester_base from pygccxml import declarations from pyplusplus import code_creators class tester_t(fundamental_tester_base.fundamental_tester_base_t): EXTENSION_NAME = 'index_operator' def __init__( self, *args ): fundamental_tester_base.fundamental_tester_base_t.__init__( self , tester_t.EXTENSION_NAME , *args ) def run_tests(self, module): cont = module.container() self.failUnless( cont[3] == 1 ) self.failUnless( cont[0] == 0 ) def create_suite(): suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) return suite def run_suite(): unittest.TextTestRunner(verbosity=2).run( create_suite() ) if __name__ == "__main__": run_suite() Index: test_all.py =================================================================== RCS file: /cvsroot/pygccxml/source/pyplusplus/unittests/test_all.py,v retrieving revision 1.31 retrieving revision 1.32 diff -C2 -d -r1.31 -r1.32 *** test_all.py 2 Mar 2006 13:30:37 -0000 1.31 --- test_all.py 5 Mar 2006 05:51:30 -0000 1.32 *************** *** 41,44 **** --- 41,45 ---- import regression3_tester import optional_tester + import index_operator_tester def create_suite(times): *************** *** 78,81 **** --- 79,83 ---- , class_order4_tester , optional_tester + , index_operator_tester ] |
From: Roman <rom...@us...> - 2006-03-05 05:51:33
|
Update of /cvsroot/pygccxml/source/pyplusplus/unittests/data In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19454/pyplusplus/unittests/data Added Files: index_operator_to_be_exported.hpp Log Message: operator[] is now supported --- NEW FILE: index_operator_to_be_exported.hpp --- // Copyright 2004 Roman Yakovenko. // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef __index_operator_to_be_exported_hpp__ #define __index_operator_to_be_exported_hpp__ namespace operators{ struct container{ int operator[]( int index ){ return index % 2; } }; } #endif//__index_operator_to_be_exported_hpp__ |
From: Roman <rom...@us...> - 2006-03-05 05:51:33
|
Update of /cvsroot/pygccxml/source/pyplusplus/decl_wrappers In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19454/pyplusplus/decl_wrappers Modified Files: calldef_wrapper.py Log Message: operator[] is now supported Index: calldef_wrapper.py =================================================================== RCS file: /cvsroot/pygccxml/source/pyplusplus/decl_wrappers/calldef_wrapper.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** calldef_wrapper.py 28 Feb 2006 07:31:33 -0000 1.1 --- calldef_wrapper.py 5 Mar 2006 05:51:30 -0000 1.2 *************** *** 17,22 **** self._use_default_arguments = True self._create_with_signature = False - if isinstance( self, declarations.member_operator_t ) and self.symbol == '()': - self.alias = '__call__' def _get_call_policies(self): --- 17,20 ---- *************** *** 64,67 **** --- 62,77 ---- declarations.member_operator_t.__init__( self, *arguments, **keywords ) calldef_t.__init__( self ) + + def _get_alias( self): + alias = super( member_operator_t, self )._get_alias() + if alias == self.name: + if self.symbol == '()': + alias = '__call__' + elif self.symbol == '[]': + alias = '__getitem__' + else: + pass + return alias + alias = property( _get_alias, decl_wrapper.decl_wrapper_t._set_alias ) class casting_operator_t( declarations.casting_operator_t, calldef_t ): |