solenv/gbuild/platform/EMSCRIPTEN_INTEL_GCC.mk     |    1 
 static/emscripten/registeroustring.js              |   56 --------------------
 static/source/unoembindhelpers/PrimaryBindings.cxx |   58 +++++++++++++++++++--
 3 files changed, 55 insertions(+), 60 deletions(-)

New commits:
commit 52a22b6863c08b071361fa9c212b886e1e48500b
Author:     Stephan Bergmann <stephan.bergm...@allotropia.de>
AuthorDate: Wed Feb 14 15:29:13 2024 +0100
Commit:     Stephan Bergmann <stephan.bergm...@allotropia.de>
CommitDate: Thu Feb 15 10:58:47 2024 +0100

    Fold registeroustring.js into PrimaryBindings.cxx
    
    Change-Id: I2e1aa828f194a104d354741518e8cb20015ac276
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163385
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <stephan.bergm...@allotropia.de>

diff --git a/solenv/gbuild/platform/EMSCRIPTEN_INTEL_GCC.mk 
b/solenv/gbuild/platform/EMSCRIPTEN_INTEL_GCC.mk
index f3bb7d7c6c27..8a36e425ce7a 100644
--- a/solenv/gbuild/platform/EMSCRIPTEN_INTEL_GCC.mk
+++ b/solenv/gbuild/platform/EMSCRIPTEN_INTEL_GCC.mk
@@ -14,7 +14,6 @@ include $(GBUILDDIR)/platform/unxgcc.mk
 # don't sort; later can override previous settings!
 gb_EMSCRIPTEN_PRE_JS_FILES = \
     $(SRCDIR)/static/emscripten/environment.js \
-    $(SRCDIR)/static/emscripten/registeroustring.js \
     $(call 
gb_CustomTarget_get_workdir,static/emscripten_fs_image)/soffice.data.js.link \
 
 gb_RUN_CONFIGURE := $(SRCDIR)/solenv/bin/run-configure
diff --git a/static/emscripten/registeroustring.js 
b/static/emscripten/registeroustring.js
deleted file mode 100644
index 0abd522ca98e..000000000000
--- a/static/emscripten/registeroustring.js
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-if (!('preRun' in Module)) Module['preRun'] = [];
-Module.preRun.push(function() {
-    // Wait until Embind is set up:
-    Module.addOnPreMain(function() {
-        Module.registerType(Module.getOUStringRawType(), {
-            name: 'rtl::OUString',
-            'fromWireType'(ptr) {
-                let data = Module.HEAPU32[ptr >> 2];
-                let length = Module.HEAPU32[(data >> 2) + 1];
-                let buffer = data + 8;
-                let str = '';
-                for (let i = 0; i < length; ++i) {
-                    let c = Module.HEAPU16[(buffer >> 1) + i];
-                    str += String.fromCharCode(c);
-                }
-                Module.rtl_uString_release(data);
-                Module._free(ptr);
-                return str;
-            },
-            'toWireType'(destructors, value) {
-                if (typeof value != 'string') {
-                    Module.throwBindingError('Cannot pass non-string to C++ 
OUString');
-                }
-                let data = Module._malloc(8 + (value.length + 1) * 2);
-                Module.HEAPU32[data >> 2] = 1;
-                Module.HEAPU32[(data >> 2) + 1] = value.length;
-                let buffer = data + 8;
-                for (let i = 0; i < value.length; ++i) {
-                    Module.HEAPU16[(buffer >> 1) + i] = value.charCodeAt(i);
-                }
-                Module.HEAPU16[(buffer >> 1) + value.length] = 0;
-                let ptr = Module._malloc(4);
-                Module.HEAPU32[ptr >> 2] = data;
-                if (destructors !== null) {
-                    destructors.push(Module._free, ptr);
-                }
-                return ptr;
-            },
-            'argPackAdvance': 8,
-            'readValueFromPointer'(pointer) {
-                return this['fromWireType'](Module.HEAPU32[((pointer)>>2)]);
-            },
-            destructorFunction(ptr) {
-                Module._free(ptr);
-            },
-        });
-    });
-});
diff --git a/static/source/unoembindhelpers/PrimaryBindings.cxx 
b/static/source/unoembindhelpers/PrimaryBindings.cxx
index ee4998988c19..0a27162c3ef1 100644
--- a/static/source/unoembindhelpers/PrimaryBindings.cxx
+++ b/static/source/unoembindhelpers/PrimaryBindings.cxx
@@ -9,6 +9,7 @@
 #ifdef EMSCRIPTEN
 #include <com/sun/star/frame/XModel.hpp>
 
+#include <emscripten.h>
 #include <emscripten/bind.h>
 
 #include <comphelper/processfactory.hxx>
@@ -22,6 +23,58 @@
 using namespace emscripten;
 using namespace css::uno;
 
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Winvalid-pp-token"
+EM_JS(void, jsRegisterString, (std::type_info const* raw),
+// clang-format off
+{
+    Module.registerType(raw, {
+        name: 'rtl::OUString',
+        fromWireType(ptr) {
+            let data = Module.HEAPU32[ptr >> 2];
+            let length = Module.HEAPU32[(data >> 2) + 1];
+            let buffer = data + 8;
+            let str = '';
+            for (let i = 0; i < length; ++i) {
+                let c = Module.HEAPU16[(buffer >> 1) + i];
+                str += String.fromCharCode(c);
+            }
+            Module.rtl_uString_release(data);
+            Module._free(ptr);
+            return str;
+        },
+        toWireType(destructors, value) {
+            if (typeof value != 'string') {
+                Module.throwBindingError('Cannot pass non-string to C++ 
OUString');
+            }
+            let data = Module._malloc(8 + (value.length + 1) * 2);
+            Module.HEAPU32[data >> 2] = 1;
+            Module.HEAPU32[(data >> 2) + 1] = value.length;
+            let buffer = data + 8;
+            for (let i = 0; i < value.length; ++i) {
+                Module.HEAPU16[(buffer >> 1) + i] = value.charCodeAt(i);
+            }
+            Module.HEAPU16[(buffer >> 1) + value.length] = 0;
+            let ptr = Module._malloc(4);
+            Module.HEAPU32[ptr >> 2] = data;
+            if (destructors !== null) {
+                destructors.push(Module._free, ptr);
+            }
+            return ptr;
+        },
+        argPackAdvance: 8,
+        readValueFromPointer(pointer) {
+            return this.fromWireType(Module.HEAPU32[((pointer)>>2)]);
+        },
+        destructorFunction(ptr) {
+            Module._free(ptr);
+        },
+    });
+}
+// clang-format on
+);
+#pragma clang diagnostic pop
+
 namespace
 {
 template <typename T> void registerInOutParam(char const* name)
@@ -30,8 +83,6 @@ template <typename T> void registerInOutParam(char const* 
name)
         "val", &unoembindhelpers::UnoInOutParam<T>::get, 
&unoembindhelpers::UnoInOutParam<T>::set);
 }
 
-std::uintptr_t getOUStringRawType() { return 
reinterpret_cast<std::uintptr_t>(&typeid(OUString)); }
-
 Reference<css::frame::XModel> getCurrentModelFromViewSh()
 {
     SfxViewShell* pSh = nullptr;
@@ -112,10 +163,11 @@ EMSCRIPTEN_BINDINGS(PrimaryBindings)
     registerInOutParam<char16_t>("uno_InOutParam_char");
 
     function("getCurrentModelFromViewSh", &getCurrentModelFromViewSh);
-    function("getOUStringRawType", &getOUStringRawType);
     function("getUnoComponentContext", 
&comphelper::getProcessComponentContext);
     function("rtl_uString_release",
              +[](std::uintptr_t ptr) { 
rtl_uString_release(reinterpret_cast<rtl_uString*>(ptr)); });
+
+    jsRegisterString(&typeid(OUString));
 }
 #endif
 

Reply via email to