summaryrefslogtreecommitdiffstats
path: root/platform/web/javascript_bridge_singleton.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'platform/web/javascript_bridge_singleton.cpp')
-rw-r--r--platform/web/javascript_bridge_singleton.cpp23
1 files changed, 19 insertions, 4 deletions
diff --git a/platform/web/javascript_bridge_singleton.cpp b/platform/web/javascript_bridge_singleton.cpp
index 1bb72456e8..2f0215e359 100644
--- a/platform/web/javascript_bridge_singleton.cpp
+++ b/platform/web/javascript_bridge_singleton.cpp
@@ -72,7 +72,8 @@ private:
WASM_EXPORT static void _free_lock(void **p_lock, int p_type);
WASM_EXPORT static Variant _js2variant(int p_type, godot_js_wrapper_ex *p_val);
WASM_EXPORT static void *_alloc_variants(int p_size);
- WASM_EXPORT static void _callback(void *p_ref, int p_arg_id, int p_argc);
+ WASM_EXPORT static void callback(void *p_ref, int p_arg_id, int p_argc);
+ static void _callback(const JavaScriptObjectImpl *obj, Variant arg);
protected:
bool _set(const StringName &p_name, const Variant &p_value) override;
@@ -245,9 +246,10 @@ Variant JavaScriptObjectImpl::callp(const StringName &p_method, const Variant **
return _js2variant(type, &exchange);
}
-void JavaScriptObjectImpl::_callback(void *p_ref, int p_args_id, int p_argc) {
+void JavaScriptObjectImpl::callback(void *p_ref, int p_args_id, int p_argc) {
const JavaScriptObjectImpl *obj = (JavaScriptObjectImpl *)p_ref;
ERR_FAIL_COND_MSG(obj->_callable.is_null(), "JavaScript callback failed.");
+
Vector<const Variant *> argp;
Array arg_arr;
for (int i = 0; i < p_argc; i++) {
@@ -256,7 +258,20 @@ void JavaScriptObjectImpl::_callback(void *p_ref, int p_args_id, int p_argc) {
int type = godot_js_wrapper_object_getvar(p_args_id, Variant::INT, &exchange);
arg_arr.push_back(_js2variant(type, &exchange));
}
- obj->_callable.call(arg_arr);
+ Variant arg = arg_arr;
+
+#ifdef PROXY_TO_PTHREAD_ENABLED
+ if (!Thread::is_main_thread()) {
+ callable_mp_static(JavaScriptObjectImpl::_callback).bind(obj, arg).call_deferred();
+ return;
+ }
+#endif
+
+ _callback(obj, arg);
+}
+
+void JavaScriptObjectImpl::_callback(const JavaScriptObjectImpl *obj, Variant arg) {
+ obj->_callable.call(arg);
// Set return value
godot_js_wrapper_ex exchange;
@@ -273,7 +288,7 @@ void JavaScriptObjectImpl::_callback(void *p_ref, int p_args_id, int p_argc) {
Ref<JavaScriptObject> JavaScriptBridge::create_callback(const Callable &p_callable) {
Ref<JavaScriptObjectImpl> out = memnew(JavaScriptObjectImpl);
out->_callable = p_callable;
- out->_js_id = godot_js_wrapper_create_cb(out.ptr(), JavaScriptObjectImpl::_callback);
+ out->_js_id = godot_js_wrapper_create_cb(out.ptr(), JavaScriptObjectImpl::callback);
return out;
}