def get_swig_typeconv_out(self, arg_list, py_varnames = None, is_callback = False): i = 0 prepss = [] unprepss = [] retvalprepss = [] sig_ss = [] # Signature strings # Generate python-equivalent of variable-names if not py_varnames: if is_callback: # These are c-to-py argument conversions py_varnames = ['py_%s'%(a[1]) for a in arg_list] else: # These are c-to-py return value conversions py_varnames = ['res']*len(arg_list) while i < len(arg_list): t, varname = arg_list[i] mode = 'out' tpl = self.find_typemap(mode, arg_list, i) if t.find('String') >= 0: #print 'NOT FOUND FOR: %s'%(str(arg_list[i])) #pdb.set_trace() tpl = self.find_typemap(mode, arg_list, i) std_unprep = ' Py_DECREF(py_%s);'%varname # If not found at first, try the 'argin' # typemap. if tpl is None: if is_callback: tpl = self.find_typemap('argin', arg_list, i) if not tpl: # Try to generate 'argin'-style typemap for likely callback arguments if cpp_header_parser.is_likely_callback_arg(t): # basic 'in' typemap is required tpl = self.generate_argin_typemap(t) mode = 'argin' else: mode = 'argin' if not (tpl is None): #tm_datatypes,tm_tempdata,tm_content = tpl tm_datatypes = tpl[0] sig_ss += [('%s %s'%a_) for a_ in tm_datatypes] arg_names = [a_[1] for a_ in arg_list[i:]] if mode == 'out': tms = self.process_typemap_out(tpl, t, arg_names, py_varnames[i:]) prepss.append(tms) unprepss.append(std_unprep) retvalprepss.append(None) else: resn = 'res' tms = self.process_typemap_in(tpl, t, [('*%s'%a) for a in arg_names], [resn]) prepss.append(None) unprepss.append(None) if not cpp_header_parser.is_builtin_type(t): tms += ' PyObject_SetAttrString(%s, "thisown", Py_False);\n Py_DECREF(%s);'%(resn,resn) else: tms += ' Py_DECREF(%s);'%(resn) retvalprepss.append(tms) for i_ in range(1, len(tm_datatypes)): prepss.append(None) unprepss.append(None) retvalprepss.append(None) i += len(tm_datatypes) else: sig_ss.append(t) tcls,flags = cpp_header_parser.parse_type(t) if 'ptr' in flags or 'ref' in flags: if 'ptr' in flags: ampersand_s = '' else: ampersand_s = '&' resn = 'py_%s'%varname prepss.append(' %s = SWIG_NewPointerObj((void*)%s%s, SWIGTYPE_p_%s, 0);'%(resn,ampersand_s,varname,tcls)) unprepss.append(std_unprep) retvalprepss.append(None) else: prepss.append(' ??? (typemap for %s not found)'%(t)); unprepss.append(None) retvalprepss.append(None) i += 1 return (prepss,unprepss,retvalprepss,' '.join(sig_ss))
def get_swig_typeconv_in(self, arg_list, py_varnames = None, is_callback = False): i = 0 prepss = [] unprepss = [] retvalprepss = [] # Generate python-equivalent of variable-names if not py_varnames: if not is_callback: # These are py-to-c argument conversions py_varnames = ['py_%s'%(a[1]) for a in arg_list] else: # These are py-to-c return value conversions py_varnames = ['res']*len(arg_list) while i < len(arg_list): t, varname = arg_list[i] py_varname = py_varnames[i] mode = 'in' tpl = self.find_typemap(mode, arg_list, i) std_unprep = None # If not found at first, try the 'argin' # typemap. if tpl is None: if not is_callback: mode = 'argout' tpl = self.find_typemap(mode, arg_list, i) tcls,flags = cpp_header_parser.parse_type(t) if not (tpl is None): #tm_datatypes,tm_tempdata,tm_content = tpl tm_datatypes = tpl[0] tms = self.process_typemap_in(tpl, tcls, [a_[1] for a_ in arg_list[i:]],py_varnames[i:]) if mode == 'in': prepss.append(tms) unprepss.append(std_unprep) retvalprepss.append(None) else: prepss.append(None) # argin typemap requires some extra preparations unprepss.append(None) retvalprepss.append(tms) for i_ in range(1, len(tm_datatypes)): prepss.append(None) unprepss.append(None) retvalprepss.append(None) i += len(tm_datatypes) else: if 'ptr' in flags or 'ref' in flags: if 'ptr' in flags: amp_s = '' else: amp_s = '&' prepss.append(template_typemap_ptr_in%(py_varname,amp_s,varname,tcls,tcls)) unprepss.append(std_unprep) retvalprepss.append(None) else: prepss.append(' ??? (typemap for %s not found)'%(t)); unprepss.append(None) retvalprepss.append(None) i += 1 # In callbacks, these are return values, so release ownership # of a pointer. Otherwise, just simply decrement the refcount. if is_callback: if 'ptr' in flags: prepss[-1] = prepss[-1] + ' PyObject_SetAttrString(%s, "thisown", Py_False);\n Py_DECREF(%s);'%(py_varname,py_varname) else: prepss[-1] = prepss[-1] + ' Py_DECREF(%s);'%(py_varname) return (prepss,unprepss,retvalprepss)