Remove unnecessary allocation when setting strings

This commit is contained in:
Jason Paryani
2014-02-13 12:04:30 -08:00
parent e23e1cb4ed
commit 6ccc208757

View File

@@ -274,7 +274,6 @@ ctypedef fused _DynamicStructReaderOrBuilder:
ctypedef fused _DynamicSetterClasses: ctypedef fused _DynamicSetterClasses:
C_DynamicList.Builder C_DynamicList.Builder
DynamicStruct_Builder DynamicStruct_Builder
Request
ctypedef fused PromiseTypes: ctypedef fused PromiseTypes:
Promise Promise
@@ -655,6 +654,17 @@ cdef C_DynamicValue.Reader _extract_dynamic_server(object value):
cdef C_DynamicValue.Reader _extract_dynamic_enum(_DynamicEnum value): cdef C_DynamicValue.Reader _extract_dynamic_enum(_DynamicEnum value):
return C_DynamicValue.Reader(value.thisptr) return C_DynamicValue.Reader(value.thisptr)
cdef _setBytes(_DynamicSetterClasses thisptr, field, value):
cdef capnp.StringPtr temp_string = capnp.StringPtr(<char*>value, len(value))
cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(temp_string)
thisptr.set(field, temp)
cdef _setBaseString(_DynamicSetterClasses thisptr, field, value):
encoded_value = value.encode()
cdef capnp.StringPtr temp_string = capnp.StringPtr(<char*>encoded_value, len(encoded_value))
cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(temp_string)
thisptr.set(field, temp)
cdef _setDynamicField(_DynamicSetterClasses thisptr, field, value, parent): cdef _setDynamicField(_DynamicSetterClasses thisptr, field, value, parent):
cdef C_DynamicValue.Reader temp cdef C_DynamicValue.Reader temp
value_type = type(value) value_type = type(value)
@@ -672,21 +682,14 @@ cdef _setDynamicField(_DynamicSetterClasses thisptr, field, value, parent):
temp = C_DynamicValue.Reader(<cbool>value) temp = C_DynamicValue.Reader(<cbool>value)
thisptr.set(field, temp) thisptr.set(field, temp)
elif value_type is bytes: elif value_type is bytes:
temp2 = new capnp.StringPtr(<char*>value, len(value)) _setBytes(thisptr, field, value)
temp = C_DynamicValue.Reader(deref(temp2))
thisptr.set(field, temp)
del temp2
elif isinstance(value, basestring): elif isinstance(value, basestring):
encoded_value = value.encode() _setBaseString(thisptr, field, value)
temp2 = new capnp.StringPtr(<char*>encoded_value, len(encoded_value))
temp = C_DynamicValue.Reader(deref(temp2))
thisptr.set(field, temp)
del temp2
elif value_type is list: elif value_type is list:
builder = to_python_builder(thisptr.init(field, len(value)), parent) builder = to_python_builder(thisptr.init(field, len(value)), parent)
_from_list(builder, value) _from_list(builder, value)
elif value_type is dict: elif value_type is dict:
if (_DynamicSetterClasses is DynamicStruct_Builder or _DynamicSetterClasses is Request): if _DynamicSetterClasses is DynamicStruct_Builder:
builder = to_python_builder(thisptr.get(field), parent) builder = to_python_builder(thisptr.get(field), parent)
_from_dict(builder, value) _from_dict(builder, value)
else: else: