Beispiel #1
0
 def WrapVar(self, v, unused_ln, unused_ns):
   """Process AST.VarDecl v."""
   assert self.nested, 'C++ global vars not allowed, use const'
   assert '::' not in v.name.cpp_name
   vname = v.name.cpp_name
   if v.cpp_set and not v.cpp_get:
     raise NameError('Property %s has setter, but no getter' % v.name.native)
   getter = 'get_' + vname
   setter = 'set_' + vname
   if self.final:
     base = None
     cobj = _GetCppObj() + '->'
   else:
     base = 'auto cpp = ThisPtr(self); if (!cpp) '
     cobj = 'cpp->'
   is_property = False
   if v.cpp_get.name.cpp_name:
     # It's a property var (with cpp only `getter`, `setter`).
     assert not v.cpp_get.name.native
     is_property = True
     if v.cpp_get.classmethod or v.cpp_set.classmethod:
       raise ValueError('Static properties not supported')
     if v.cpp_set.name.cpp_name:
       assert not v.cpp_set.name.native
     else:
       setter = 'nullptr'
     vname = Ident(v.cpp_get.name.cpp_name) + '()'
   cvar = cobj + vname
   unproperty = False
   if v.cpp_get.name.native:
     # It's an unproperty var (@getter pyname / @setter pyname).
     assert not v.cpp_get.name.cpp_name
     unproperty = True
     self.methods.append((v.cpp_get.name.native, getter,
                          NOARGS, '%s()->%s  C++ %s.%s getter' %
                          (v.cpp_get.name.native, v.type.lang_type,
                           self.name, v.name.cpp_name)))
     if v.cpp_set.name.native:
       assert not v.cpp_set.name.cpp_name
       self.methods.append((v.cpp_set.name.native, setter,
                            'METH_O', '%s(%s)  C++ %s.%s setter' %
                            (v.cpp_set.name.native, v.type.lang_type,
                             self.name, v.name.cpp_name)))
     else:
       setter = 'nullptr'
   else:
     self.properties.append((v.name.native, getter, setter, 'C++ %s %s.%s' % (
         v.type.cpp_type, self.CppName(), vname)))
   # For a nested container we'll try to return it (we use cpp_toptr_conversion
   # as an indicator for a custom container).
   for s in gen.VarGetter(getter, unproperty, base, cvar, _GetCppObj(),
                          pc=postconv.Initializer(v.type, self.typemap),
                          get_nested=(not is_property and not unproperty and
                                      v.type.cpp_toptr_conversion)): yield s
   if setter != 'nullptr':
     for s in gen.VarSetter(setter, unproperty, base, cvar, v,
                            cobj + Ident(v.cpp_set.name.cpp_name)
                            if v.cpp_set.name.cpp_name else '',
                            as_str=('PyUnicode_AsUTF8' if self.py3output else
                                    'PyString_AS_STRING')): yield s
Beispiel #2
0
    def WrapVar(self, v, unused_ln, unused_ns, unused_class_ns=''):
        """Process AST.VarDecl v."""
        assert self.nested, 'C++ global vars not allowed, use const'
        assert '::' not in v.name.cpp_name
        vname = v.name.cpp_name
        ctype = v.type.cpp_type
        if v.cpp_set and not v.cpp_get:
            raise NameError('Property %s has setter, but no getter' %
                            v.name.native)
        getter = 'get_' + vname
        setter = 'set_' + vname
        if self.final:
            base = None
            cobj = _GetCppObj() + '->'
        else:
            base = 'auto cpp = ThisPtr(self); if (!cpp) '
            cobj = 'cpp->'
        is_property = False
        if v.cpp_get.name.cpp_name:
            # It's a property var (with cpp only `getter`, `setter`).
            assert not v.cpp_get.name.native
            is_property = True
            if v.cpp_get.classmethod or v.cpp_set.classmethod:
                raise ValueError('Static properties not supported')
            if v.cpp_set.name.cpp_name:
                assert not v.cpp_set.name.native
            else:
                setter = 'nullptr'
            vname = Ident(v.cpp_get.name.cpp_name) + '()'
        nested_container = not is_property
        cvar = cobj + vname
        getval = cvar
        setval = (cobj + Ident(v.cpp_set.name.cpp_name)
                  if v.cpp_set.name.cpp_name else '')
        if v.is_extend_variable:
            orig_getter_name = v.cpp_get.name.cpp_name.split(
                ast_manipulations.EXTEND_INFIX)[-1]
            cname = Ident(v.cpp_get.name.cpp_name)
            wrapper_name = 'wrap' + types.Mangle(cname)
            getval = wrapper_name + '_as_' + orig_getter_name + '(self)'

            if v.cpp_set:
                setval = v.cpp_set.name.cpp_name
        unproperty = False
        if v.cpp_get.name.native:
            # It's an unproperty var (@getter pyname / @setter pyname).
            assert not v.cpp_get.name.cpp_name
            unproperty = True
            nested_container = False
            self.methods.append((v.cpp_get.name.native, getter, NOARGS,
                                 '%s()->%s  C++ %s.%s getter' %
                                 (v.cpp_get.name.native, v.type.lang_type,
                                  self.name, v.name.cpp_name)))
            if v.cpp_set.name.native:
                assert not v.cpp_set.name.cpp_name
                self.methods.append((v.cpp_set.name.native, setter, 'METH_O',
                                     '%s(%s)  C++ %s.%s setter' %
                                     (v.cpp_set.name.native, v.type.lang_type,
                                      self.name, v.name.cpp_name)))
            else:
                setter = 'nullptr'
        else:
            self.properties.append(
                (v.name.native, getter, setter,
                 'C++ %s %s.%s' % (ctype, self.CppName(), vname)))
            if not v.type.cpp_abstract and not ctype.startswith(
                    '::std::shared_ptr'):
                if v.type.cpp_raw_pointer or ctype.startswith(
                        '::std::unique_ptr'):
                    getval = '*' + cvar
                    nested_container = False
                elif nested_container and v.type.cpp_toptr_conversion:
                    # For a nested container we'll try to return it (we use
                    # cpp_toptr_conversion as an indicator for a custom container).
                    getval = '::clif::MakeStdShared(%s, &%s)' % (_GetCppObj(),
                                                                 cvar)
        for s in gen.VarGetter(getter,
                               unproperty,
                               base,
                               getval,
                               postconv.Initializer(v.type, self.typemap),
                               is_extend=v.is_extend_variable):
            yield s
        if setter != 'nullptr':
            for s in gen.VarSetter(setter,
                                   unproperty,
                                   base,
                                   cvar,
                                   v,
                                   setval,
                                   as_str=('PyUnicode_AsUTF8' if self.py3output
                                           else 'PyString_AS_STRING'),
                                   is_extend=v.is_extend_variable):
                yield s