I'm using Pycapnp in a project, where we compile `.capnp` files directly to Cython instead of using the dynamic interface (for speed). For this, we need access to the `reraise_kj_exception` C function defined by Pycapnp. This is not possible, because Cython does not automatically make this function available to downstream users. My previous solution, in #301, was rather flawed. The file `capabilityHelper.cpp`, where `reraise_kj_exception` is defined, was bundled into the distribution, so that this file could be included in downstream libraries. This turns out to be a terrible idea, because it redefines a bunch of other things like `ReadPromiseAdapter`. For reasons not entirely clear to me, this leads to segmentation faults. This PR revers #301. Instead, in this PR I've made `reraise_kj_exception` a Cython-level function, that can be used by downstream libraries. The C-level variant has been renamed to `c_reraise_kj_exception`.
169 lines
6.2 KiB
Cython
169 lines
6.2 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) except +reraise_kj_exception
|
|
|
|
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) except +reraise_kj_exception
|
|
|
|
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=?)
|
|
|
|
|
|
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) except +reraise_kj_exception
|
|
cpdef to_segments(_DynamicStructBuilder self) except +reraise_kj_exception
|
|
cpdef _to_bytes_packed_helper(_DynamicStructBuilder self, word_count) except +reraise_kj_exception
|
|
cpdef to_bytes_packed(_DynamicStructBuilder self) except +reraise_kj_exception
|
|
|
|
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=?)
|
|
|
|
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) except +reraise_kj_exception
|
|
|
|
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) except +reraise_kj_exception
|
|
cpdef get_root_as_any(self) except +reraise_kj_exception
|
|
cpdef set_root(self, value) except +reraise_kj_exception
|
|
cpdef get_segments_for_output(self) except +reraise_kj_exception
|
|
cpdef new_orphan(self, schema) except +reraise_kj_exception
|
|
|
|
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
|