Пример #1
0
def AddWrapReg( mb, cls_name, declaration, args_mod_in ):
    if type(cls_name) != str:
        cls = cls_name
        cls_name = cls.name # or alias?
    else:
        cls = mb.class_(cls_name)
    
    # Create a wrapper class inst
    wrapper = calldef.mem_fun_v_wrapper_t( declaration )

    template = []
    
    # NOTE: Comparing directly gives problems
    template.append( '%(override)s func_%(alias)s = this->get_override( "%(alias)s" );' )
    template.append( 'if( func_%(alias)s.ptr() != Py_None )' )
    template.append( wrapper.indent('try {' ) )
    template.append( wrapper.indent(wrapper.indent('%(return_)sfunc_%(alias)s( %(args_mod_in)s );' ) ) )
    template.append( wrapper.indent('} catch(...) {') )
    template.append( wrapper.indent(wrapper.indent('PyErr_Print();')) )
    template.append( wrapper.indent(wrapper.indent('%(return_)sthis->%(wrapped_class)s::%(name)s( %(args)s );') ) )
    template.append( wrapper.indent( '}' ) )    
    template.append( 'else' )
    template.append( wrapper.indent('%(return_)sthis->%(wrapped_class)s::%(name)s( %(args)s );') )
    
    template = os.linesep.join( template )

    return_ = ''
    if not declarations.is_void( wrapper.declaration.return_type ):
        return_ = 'return '
        
    answer = [ wrapper.create_declaration(wrapper.declaration.partial_name) + '{' ]
    answer.append( wrapper.indent( 
        template % {
            'override' : wrapper.override_identifier()
            , 'name' : wrapper.declaration.partial_name
            , 'alias' : wrapper.declaration.alias
            , 'return_' : return_
            , 'args' : wrapper.function_call_args()
            , 'args_mod_in' : GenerateArgNames(args_mod_in)
            , 'wrapped_class' : wrapper.wrapped_class_identifier()
        }      
    ) )
    answer.append( '}' )
    cls.add_wrapper_code( 
        os.linesep.join( answer )
    )
    
    # Add default body
    cls.add_wrapper_code( wrapper.create_default_function() )
    
    # Add registration code
    reg = calldef.mem_fun_v_t( declaration, wrapper )
    # WTF, why does it needs to be a code_creator instance. It only uses it for full_name
    cc = hackcodecreator_t(cls_name+'_wrapper')      
    wrapper.parent = cc
    cls.add_registration_code( reg._create_impl(), True )
Пример #2
0
 def GetWrapper(self, cls, methodname):
     wrapper = None
     try:
         wrapper = calldef.mem_fun_v_wrapper_t( cls.mem_fun(methodname) )
     except: #matcher.declaration_not_found_t:
         for base in cls.recursive_bases:
             wrapper = self.GetWrapper(base.related_class, methodname)
             if wrapper:
                 break
     return wrapper