Generate setters for C++ class instance attributes.

This commit is contained in:
Gustavo J. A. M. Carneiro committed 2007-06-10 19:22:51 +01:00
1 parent f5d218921a
commit bdbd7926dc
4 files changed
+79 -10

No files matched your search

+52 -1
View File
@@ -2,7 +2,7 @@
Wraps C++ class instance/static attributes.
"""
from typehandlers.base import ForwardWrapperBase
from typehandlers.base import ForwardWrapperBase, ReverseWrapperBase
from typehandlers import codesink
import settings
@@ -80,6 +80,57 @@ class CppStaticAttributeGetter(ForwardWrapperBase):
code_sink.writeln('}')
class CppInstanceAttributeSetter(ReverseWrapperBase):
'''
A setter for a C++ instance attribute.
'''
def __init__(self, value_type, class_, attribute_name):
"""
value_type -- a ReturnValue object handling the value type;
class_ -- the class (CppClass object)
attribute_name -- name of attribute
"""
super(CppInstanceAttributeSetter, self).__init__(
value_type, [], "return -1;")
self.class_ = class_
self.attribute_name = attribute_name
self.c_function_name = "_wrap_%s__set_%s" % (self.class_.pystruct,
self.attribute_name)
value_type.value = "self->obj->%s" % self.attribute_name
def generate(self, code_sink):
"""
code_sink -- a CodeSink instance that will receive the generated code
"""
self.declarations.declare_variable('PyObject*', 'py_retval')
self.before_call.write_code(
'py_retval = Py_BuildValue("(O)", value);')
self.before_call.add_cleanup_code('Py_DECREF(py_retval);')
self.return_value.convert_python_to_c(self)
parse_tuple_params = ['py_retval']
parse_tuple_params.extend(self.parse_params.get_parameters())
self.before_call.write_error_check('!PyArg_ParseTuple(%s)' %
(', '.join(parse_tuple_params),))
## cleanup and return
self.after_call.write_cleanup()
self.after_call.write_code('return 0;')
## now generate the function itself
code_sink.writeln("static int %s(%s *self, PyObject *value)"
% (self.c_function_name, self.class_.pystruct))
code_sink.writeln('{')
code_sink.indent()
self.declarations.get_code_sink().flush_to(code_sink)
code_sink.writeln()
self.before_call.sink.flush_to(code_sink)
self.after_call.sink.flush_to(code_sink)
code_sink.unindent()
code_sink.writeln('}')
class PyDescrGenerator(object):
"""
Class that generates a Python descriptor type.