Пример #1
0
    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))
Пример #2
0
    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)