| # Copyright Bruno da Silva de Oliveira 2003. Use, modification and |
| # distribution is subject to 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) |
| |
| ''' |
| Various helpers for interface files. |
| ''' |
| |
| from settings import * |
| from policies import * |
| from declarations import * |
| |
| #============================================================================== |
| # FunctionWrapper |
| #============================================================================== |
| class FunctionWrapper(object): |
| '''Holds information about a wrapper for a function or a method. It is |
| divided in 2 parts: the name of the Wrapper, and its code. The code is |
| placed in the declaration section of the module, while the name is used to |
| def' the function or method (with the pyste namespace prepend to it). If |
| code is None, the name is left unchanged. |
| ''' |
| |
| def __init__(self, name, code=None): |
| self.name = name |
| self.code = code |
| |
| def FullName(self): |
| if self.code: |
| return namespaces.pyste + self.name |
| else: |
| return self.name |
| |
| |
| _printed_warnings = {} # used to avoid double-prints of warnings |
| |
| #============================================================================== |
| # HandlePolicy |
| #============================================================================== |
| def HandlePolicy(function, policy): |
| '''Show a warning to the user if the function needs a policy and doesn't |
| have one. Return a policy to the function, which is the given policy itself |
| if it is not None, or a default policy for this method. |
| ''' |
| |
| def IsString(type): |
| 'Return True if the Type instance can be considered a string' |
| return type.FullName() == 'const char*' |
| |
| def IsPyObject(type): |
| return type.FullName() == '_object *' # internal name of PyObject |
| |
| result = function.result |
| # if the function returns const char*, a policy is not needed |
| if IsString(result) or IsPyObject(result): |
| return policy |
| # if returns a const T&, set the default policy |
| if policy is None and result.const and isinstance(result, ReferenceType): |
| policy = return_value_policy(copy_const_reference) |
| # basic test if the result type demands a policy |
| needs_policy = isinstance(result, (ReferenceType, PointerType)) |
| # show a warning to the user, if needed |
| if needs_policy and policy is None: |
| global _printed_warnings |
| warning = '---> Error: %s returns a pointer or a reference, ' \ |
| 'but no policy was specified.' % function.FullName() |
| if warning not in _printed_warnings: |
| print warning |
| print |
| # avoid double prints of the same warning |
| _printed_warnings[warning] = 1 |
| return policy |
| |
| |
| #============================================================================== |
| # EspecializeTypeID |
| #============================================================================== |
| _exported_type_ids = {} |
| def EspecializeTypeID(typename): |
| global _exported_type_ids |
| macro = 'BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID(%s)\n' % typename |
| if macro not in _exported_type_ids: |
| _exported_type_ids[macro] = 1 |
| return macro |
| else: |
| return None |