From ea1f22e5c6d763886189f8250997b867ea466735 Mon Sep 17 00:00:00 2001 From: Jason Paryani Date: Sun, 25 Aug 2013 16:41:37 -0700 Subject: [PATCH] Fix new error with DynamicValue.Builder no longer being copyable --- capnp/capnp.pyx | 49 ++++++++++----------------------------------- capnp/capnp_cpp.pxd | 8 ++++---- 2 files changed, 15 insertions(+), 42 deletions(-) diff --git a/capnp/capnp.pyx b/capnp/capnp.pyx index 46b259b..fab0831 100644 --- a/capnp/capnp.pyx +++ b/capnp/capnp.pyx @@ -134,13 +134,15 @@ cdef class _DynamicListBuilder: # self.thisptr._init(size) # return self + cpdef _get(self, index) except +ValueError: + return toPython(self.thisptr[index], self._parent) + def __getitem__(self, index): size = self.thisptr.size() if index >= size: raise IndexError('Out of bounds') index = index % size - temp = self.thisptr[index] - return toPython(temp, self._parent) + return self._get(index) def _setitem(self, index, valid_values value): cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(value) @@ -242,39 +244,7 @@ cdef class _DynamicValueReader: else: raise ValueError("Cannot convert type to Python. Type is unhandled by capnproto library") - -cdef int getType(C_DynamicValue.Builder & self): - return self.getType() - -cdef toPython(C_DynamicValue.Builder & self, object parent): - cdef int type = getType(self) - if type == capnp.TYPE_BOOL: - return self.asBool() - elif type == capnp.TYPE_INT: - return self.asInt() - elif type == capnp.TYPE_UINT: - return self.asUint() - elif type == capnp.TYPE_FLOAT: - return self.asDouble() - elif type == capnp.TYPE_TEXT: - return self.asText()[:] - elif type == capnp.TYPE_DATA: - temp = self.asData() - return (temp.begin())[:temp.size()] - elif type == capnp.TYPE_LIST: - return list(_DynamicListBuilder()._init(self.asList(), parent)) - elif type == capnp.TYPE_STRUCT: - return _DynamicStructBuilder()._init(self.asStruct(), parent) - elif type == capnp.TYPE_ENUM: - return fixMaybe(self.asEnum().getEnumerant()).getProto().getName().cStr() - elif type == capnp.TYPE_VOID: - return None - elif type == capnp.TYPE_UNKOWN: - raise ValueError("Cannot convert type to Python. Type is unknown by capnproto library") - else: - raise ValueError("Cannot convert type to Python. Type is unhandled by capnproto library") - -cdef toPythonByValue(C_DynamicValue.Builder self, object parent): +cdef toPython(C_DynamicValue.Builder self, object parent): cdef int type = self.getType() if type == capnp.TYPE_BOOL: return self.asBool() @@ -330,9 +300,12 @@ cdef class _DynamicStructBuilder: self._parent = parent return self - def __getattr__(self, field): + cpdef _get(self, field) except +ValueError: return toPython(self.thisptr.get(field), self._parent) + def __getattr__(self, field): + return self._get(field) + cdef _setattrInt(self, field, value): cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(value) self.thisptr.set(field, temp) @@ -373,9 +346,9 @@ cdef class _DynamicStructBuilder: cpdef init(self, field, size=None) except +ValueError: if size is None: - return toPythonByValue(self.thisptr.init(field), self._parent) + return toPython(self.thisptr.init(field), self._parent) else: - return toPythonByValue(self.thisptr.init(field, size), self._parent) + return toPython(self.thisptr.init(field, size), self._parent) # cpdef which(self): # try: diff --git a/capnp/capnp_cpp.pxd b/capnp/capnp_cpp.pxd index 6ef4d98..4ed5917 100644 --- a/capnp/capnp_cpp.pxd +++ b/capnp/capnp_cpp.pxd @@ -99,7 +99,7 @@ cdef extern from "capnp/dynamic.h" namespace " ::capnp": StructSchema getSchema() Maybe[StructSchema.Field] which() cppclass Builder: - DynamicValueForward.Builder get(char *) except +ValueError + DynamicValueForward.Builder get(char *) bint has(char *) except +ValueError void set(char *, DynamicValueForward.Reader&) except +ValueError DynamicValueForward.Builder init(char *, uint size) @@ -121,10 +121,10 @@ cdef extern from "capnp/dynamic.h" namespace " ::capnp": DynamicValueForward.Reader operator[](uint) except +ValueError uint size() cppclass Builder: - DynamicValueForward.Builder operator[](uint) except +ValueError + DynamicValueForward.Builder operator[](uint) uint size() - void set(uint index, DynamicValueForward.Reader& value) - DynamicValueForward.Builder init(uint index, uint size) + void set(uint index, DynamicValueForward.Reader& value) except +ValueError + DynamicValueForward.Builder init(uint index, uint size) except +ValueError cdef cppclass DynamicValue: cppclass Reader: