From 821e93783729ff74268e63c329d8a839c47fded9 Mon Sep 17 00:00:00 2001 From: Siu Kwan Lam Date: Mon, 28 Jan 2013 15:20:36 -0600 Subject: [PATCH] Add binding util for iterator to list --- newbinding/binding.py | 43 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/newbinding/binding.py b/newbinding/binding.py index 85b74e9..1764559 100644 --- a/newbinding/binding.py +++ b/newbinding/binding.py @@ -46,6 +46,7 @@ Void = BuiltinTypes('void') Unsigned = BuiltinTypes('unsigned') Bool = BuiltinTypes('bool') ConstStdString = BuiltinTypes('const std::string') +PyObjectPtr = BuiltinTypes('PyObject*') class Class(_Type): format = 'O' @@ -81,6 +82,8 @@ class Class(_Type): else: for i in v: self.includes.add(i) + elif k == '_realname_': + self.realname = v elif k == '_downcast_': if isinstance(v, Class): self.downcastables.add(v) @@ -146,7 +149,7 @@ class Class(_Type): writer.die_if_false(raw) ptrty = ptr(self).fullname ty = self.fullname - fmt = 'typecast<%(ty)s>::from(%(raw)s)' + fmt = 'typecast<%(ty)s >::from(%(raw)s)' casted = writer.declare(ptrty, fmt % locals()) writer.die_if_false(casted) return casted @@ -252,12 +255,8 @@ class Method(object): writer.raises(TypeError, 'Invalid number of args') def compile_cpp_body(self, writer, retty, argtys): - if isinstance(self.parent, Class): - args = writer.parse_arguments('args', ptr(self.parent), *argtys) - ret = writer.method_call(self.realname, retty.fullname, *args) - else: - args = writer.parse_arguments('args', *argtys) - ret = writer.call(self.fullname, retty.fullname, *args) + args = writer.parse_arguments('args', ptr(self.parent), *argtys) + ret = writer.method_call(self.realname, retty.fullname, *args) writer.return_value(retty.wrap(writer, ret)) def compile_py(self, writer): @@ -273,6 +272,29 @@ class Method(object): writer.println() +class IterToList(Method): + def __init__(self, elemty, argtys, iterty, begin, end): + super(IterToList, self).__init__(PyObjectPtr, *argtys) + self.elemty = elemty + self.iterty = iterty + self.begin = begin + self.end = end + + def compile_cpp_body(self, writer, retty, argtys): + args = writer.parse_arguments('args', ptr(self.parent), *argtys) + it = writer.method_call(self.begin, self.iterty, *args) + end = writer.method_call(self.end, self.iterty, *args) + con = writer.call('PyList_New', 'PyObject*', '0') + writer.die_if_false(con) + with writer.block('for (; %(it)s != %(end)s; ++%(it)s)' % locals()): + elem = writer.declare(self.elemty.fullname, '*%(it)s;' % locals()) + wrapped = self.elemty.wrap(writer, elem) + ok = writer.call('PyList_Append', 'int', con, wrapped) + with writer.block('if (%(ok)s == -1)' % locals()): + writer.return_value(None) + writer.return_value(con) + + class StaticMethod(Method): def compile_cpp_body(self, writer, retty, argtys): @@ -296,7 +318,6 @@ class StaticMethod(Method): writer.return_value(wrapped) writer.println() - class Function(Method): _kind_ = 'func' @@ -305,6 +326,11 @@ class Function(Method): self.parent = parent self.name = name + def compile_cpp_body(self, writer, retty, argtys): + args = writer.parse_arguments('args', *argtys) + ret = writer.call(self.fullname, retty.fullname, *args) + writer.return_value(retty.wrap(writer, ret)) + def compile_py(self, writer): with writer.function(self.name, varargs='args') as varargs: unwrapped = writer.unwrap_many(varargs) @@ -315,7 +341,6 @@ class Function(Method): writer.return_value(wrapped) writer.println() - class Destructor(Method): _kind_ = 'dtor'