Emscripten: Towards a working C++ UNO bridge
commita469aea9c0b532d928cd41e389c9c51de1af06f0
authorStephan Bergmann <stephan.bergmann@allotropia.de>
Wed, 8 May 2024 07:46:55 +0000 (8 09:46 +0200)
committerStephan Bergmann <stephan.bergmann@allotropia.de>
Wed, 8 May 2024 11:01:04 +0000 (8 13:01 +0200)
tree8a2f5ff87b20d601372c52d65db86b82b540e08a
parent90f19126fa405a0632eae4ee8525b66bbce12625
Emscripten: Towards a working C++ UNO bridge

...by making the general UNO -> C++ function call case work (modulo handling
exceptions, which I'll look into later).

Wasm call_indirect unfortunately needs to statically know the call target's
signature, so we statically need to know all possible signatures.  So introduce
wasmcallgen helper to scan the existing UNOIDL API upfront and generate the
relevant callvirtualfunction-wrapper.cxx and callvirtualfunction-inst.s code.
(The good thing is that the number of different signatures is somewhat limited,
each parameter can only be one of i32, i64, f32, or f64.  So even if 3rd-party
extensions bring along new UNOIDL interface methods, chances are relatively high
that the signatures needed for them would already be covered by the existing
ones.)

Testing this can nicely be done in unotest/source/embindtest/embindtest.js via
css.script.Invocation (which internally exercises the relevant code).  (Instead
of adding individual org.libreoffice.embindtest.StructLong/String etc., it would
be nicer to introduce some polymorphic StructOne<T>, but the Emind UNO binding
does not support polymorphic structs, so the embindtest.js code would not work.)

Change-Id: If829c9e3772bfd27561f3ad743d38a71d11545b6
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/167308
Reviewed-by: Stephan Bergmann <stephan.bergmann@allotropia.de>
Tested-by: Jenkins
16 files changed:
Repository.mk
bridges/CustomTarget_gcc3_wasm.mk [new file with mode: 0644]
bridges/Library_cpp_uno.mk
bridges/Module_bridges.mk
bridges/inc/wasm/callvirtualfunction.hxx [new file with mode: 0644]
bridges/source/cpp_uno/gcc3_wasm/uno2cpp.cxx
offapi/UnoApi_offapi.mk
offapi/org/libreoffice/embindtest/StructLong.idl [new file with mode: 0644]
offapi/org/libreoffice/embindtest/StructString.idl [new file with mode: 0644]
offapi/org/libreoffice/embindtest/XTest.idl
solenv/gbuild/extensions/pre_BuildTools.mk
static/Executable_wasmcallgen.mk [new file with mode: 0644]
static/Module_static.mk
static/source/wasmcallgen/wasmcallgen.cxx [new file with mode: 0644]
unotest/source/embindtest/embindtest.cxx
unotest/source/embindtest/embindtest.js