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 )
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