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