This PR is for resolving the following issue: [issue](https://github.com/capnproto/pycapnp/issues/379) 1. Created `_PyCustomMessageBuilder` extends `MessageBuilder`, enabling the ability to customise the `SegmentAllocate` method in Python. This allows allocation and data population within shared memory, and supports zero-copy inter-process data transfer by passing segment offsets. 2. Fields of type `Data` now support being set with a `memoryview`. When retrieving a `Data` field from a `DynamicStructBuilder`, it will return a writable `memoryview`, allowing users to modify the data directly. This enables memory to be pre-allocated and content to be modified in later, eliminating an extra copy. When retrieving a `Data` field from a `DynamicStructReader`, it will return a read-only `memoryview`, allowing user to read data without memory copy. * add memoryview and custom builder * support set dynamic field * add curSize * add initialSize and lastSize * change StringPtr name * add test case * refine test case * convert func to py callable object * add initial value * refine example * add copy as_reader and new_message, make structReader's data field return RO memoryView * rebase master and bugfix * reformat flake8 * refine test case * refine test cases for blob * remove unused import for flake8 * run black . --------- Co-authored-by: Brian Xu <brian.xu1@bytedance.com>
169 lines
5.9 KiB
Cython
169 lines
5.9 KiB
Cython
# cython: language_level = 2
|
|
|
|
from capnp.includes cimport capnp_cpp as capnp
|
|
from capnp.includes cimport schema_cpp
|
|
from capnp.includes.capnp_cpp cimport (
|
|
Schema as C_Schema, StructSchema as C_StructSchema, InterfaceSchema as C_InterfaceSchema,
|
|
EnumSchema as C_EnumSchema, ListSchema as C_ListSchema, DynamicStruct as C_DynamicStruct,
|
|
DynamicValue as C_DynamicValue, Type as C_Type, DynamicList as C_DynamicList, SchemaLoader as C_SchemaLoader,
|
|
SchemaParser as C_SchemaParser, ParsedSchema as C_ParsedSchema, VOID, ArrayPtr, StringPtr,
|
|
String, StringTree, DynamicOrphan as C_DynamicOrphan, AnyPointer as C_DynamicObject,
|
|
DynamicCapability as C_DynamicCapability, Request, Response, RemotePromise, Promise,
|
|
CallContext, RpcSystem, makeRpcServer, makeRpcClient, Capability as C_Capability,
|
|
TwoPartyVatNetwork as C_TwoPartyVatNetwork, Side, AsyncIoStream, Own,
|
|
DynamicStruct_Builder, PyRefCounter, PyAsyncIoStream
|
|
)
|
|
from capnp.includes.schema_cpp cimport Node as C_Node, EnumNode as C_EnumNode
|
|
from capnp.includes.types cimport *
|
|
from capnp.helpers cimport helpers
|
|
|
|
cdef void reraise_kj_exception()
|
|
|
|
cdef class _StructSchemaField:
|
|
cdef C_StructSchema.Field thisptr
|
|
cdef object _parent
|
|
cdef _init(self, C_StructSchema.Field other, parent=?)
|
|
|
|
cdef class _StringArrayPtr:
|
|
cdef StringPtr * thisptr
|
|
cdef object parent
|
|
cdef size_t size
|
|
cdef ArrayPtr[StringPtr] asArrayPtr(self)
|
|
|
|
cdef class SchemaLoader:
|
|
cdef C_SchemaLoader * thisptr
|
|
|
|
cdef class SchemaParser:
|
|
cdef C_SchemaParser * thisptr
|
|
cdef public dict modules_by_id
|
|
cdef list _all_imports
|
|
cdef _StringArrayPtr _last_import_array
|
|
cpdef _parse_disk_file(self, displayName, diskPath, imports)
|
|
|
|
cdef class _DynamicOrphan:
|
|
cdef C_DynamicOrphan thisptr
|
|
cdef public object _parent
|
|
|
|
cdef _init(self, C_DynamicOrphan other, object parent)
|
|
|
|
cdef C_DynamicOrphan move(self)
|
|
cpdef get(self)
|
|
|
|
|
|
cdef class _DynamicStructReader:
|
|
cdef C_DynamicStruct.Reader thisptr
|
|
cdef public object _parent
|
|
cdef public bint is_root
|
|
cdef object _obj_to_pin
|
|
cdef object _schema
|
|
|
|
cdef _init(self, C_DynamicStruct.Reader other, object parent, bint isRoot=?, bint tryRegistry=?)
|
|
|
|
cpdef _get(self, field)
|
|
cpdef _has(self, field)
|
|
cpdef _DynamicEnumField _which(self)
|
|
cpdef _which_str(self)
|
|
cpdef _get_by_field(self, _StructSchemaField field)
|
|
cpdef _has_by_field(self, _StructSchemaField field)
|
|
|
|
cpdef as_builder(self, num_first_segment_words=?, allocate_seg_callable=?)
|
|
|
|
|
|
cdef class _DynamicStructBuilder:
|
|
cdef DynamicStruct_Builder thisptr
|
|
cdef public object _parent
|
|
cdef public bint is_root
|
|
cdef public bint _is_written
|
|
cdef object _schema
|
|
|
|
cdef _init(self, DynamicStruct_Builder other, object parent, bint isRoot=?, bint tryRegistry=?)
|
|
|
|
cdef _check_write(self)
|
|
cpdef to_bytes(_DynamicStructBuilder self)
|
|
cpdef to_segments(_DynamicStructBuilder self)
|
|
cpdef _to_bytes_packed_helper(_DynamicStructBuilder self, word_count)
|
|
cpdef to_bytes_packed(_DynamicStructBuilder self)
|
|
|
|
cpdef _get(self, field)
|
|
cpdef _set(self, field, value)
|
|
cpdef _has(self, field)
|
|
cpdef init(self, field, size=?)
|
|
cpdef _get_by_field(self, _StructSchemaField field)
|
|
cpdef _set_by_field(self, _StructSchemaField field, value)
|
|
cpdef _has_by_field(self, _StructSchemaField field)
|
|
cpdef _init_by_field(self, _StructSchemaField field, size=?)
|
|
cpdef init_resizable_list(self, field)
|
|
cpdef _DynamicEnumField _which(self)
|
|
cpdef _which_str(self)
|
|
cpdef adopt(self, field, _DynamicOrphan orphan)
|
|
cpdef disown(self, field)
|
|
|
|
cpdef as_reader(self)
|
|
cpdef copy(self, num_first_segment_words=?, allocate_seg_callable=?)
|
|
|
|
cdef class _DynamicEnumField:
|
|
cdef object thisptr
|
|
|
|
cdef _init(self, proto)
|
|
cpdef _str(self)
|
|
|
|
cdef class _Schema:
|
|
cdef C_Schema thisptr
|
|
|
|
cdef _init(self, C_Schema other)
|
|
|
|
cpdef as_const_value(self)
|
|
cpdef as_struct(self)
|
|
cpdef as_interface(self)
|
|
cpdef as_enum(self)
|
|
cpdef get_proto(self)
|
|
|
|
cdef class _InterfaceSchema:
|
|
cdef C_InterfaceSchema thisptr
|
|
cdef object __method_names, __method_names_inherited, __methods, __methods_inherited
|
|
cdef _init(self, C_InterfaceSchema other)
|
|
|
|
cdef class _DynamicEnum:
|
|
cdef capnp.DynamicEnum thisptr
|
|
cdef public object _parent
|
|
|
|
cdef _init(self, capnp.DynamicEnum other, object parent)
|
|
cpdef _as_str(self)
|
|
|
|
cdef class _DynamicListBuilder:
|
|
cdef C_DynamicList.Builder thisptr
|
|
cdef public object _parent
|
|
cdef _init(self, C_DynamicList.Builder other, object parent)
|
|
|
|
cpdef _get(self, int64_t index)
|
|
cpdef _set(self, index, value)
|
|
|
|
cpdef adopt(self, index, _DynamicOrphan orphan)
|
|
cpdef disown(self, index)
|
|
|
|
cpdef init(self, index, size)
|
|
|
|
cdef class _MessageBuilder:
|
|
cdef schema_cpp.MessageBuilder * thisptr
|
|
cpdef init_root(self, schema)
|
|
cpdef get_root(self, schema)
|
|
cpdef get_root_as_any(self)
|
|
cpdef set_root(self, value)
|
|
cpdef get_segments_for_output(self)
|
|
cpdef new_orphan(self, schema)
|
|
|
|
cdef to_python_reader(C_DynamicValue.Reader self, object parent)
|
|
cdef to_python_builder(C_DynamicValue.Builder self, object parent)
|
|
cdef _to_dict(msg, bint verbose, bint ordered)
|
|
cdef _from_list(_DynamicListBuilder msg, list d)
|
|
cdef _from_tuple(_DynamicListBuilder msg, tuple d)
|
|
cdef _setDynamicFieldWithField(DynamicStruct_Builder thisptr, _StructSchemaField field, value, parent)
|
|
cdef _setDynamicFieldStatic(DynamicStruct_Builder thisptr, field, value, parent)
|
|
|
|
cdef api object wrap_dynamic_struct_reader(Response & r) with gil
|
|
cdef api Promise[void] * call_server_method(
|
|
object server, char * _method_name, CallContext & _context, object kj_loop) except * with gil
|
|
cdef api object wrap_kj_exception(capnp.Exception & exception) with gil
|
|
cdef api object wrap_kj_exception_for_reraise(capnp.Exception & exception) with gil
|
|
cdef api object get_exception_info(object exc_type, object exc_obj, object exc_tb) with gil
|