diff options
Diffstat (limited to 'platform/javascript/javascript_singleton.cpp')
| -rw-r--r-- | platform/javascript/javascript_singleton.cpp | 22 | 
1 files changed, 18 insertions, 4 deletions
diff --git a/platform/javascript/javascript_singleton.cpp b/platform/javascript/javascript_singleton.cpp index 5ef67c0cdd..1dd73ef8e9 100644 --- a/platform/javascript/javascript_singleton.cpp +++ b/platform/javascript/javascript_singleton.cpp @@ -28,12 +28,16 @@  /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */  /*************************************************************************/ -#ifdef JAVASCRIPT_EVAL_ENABLED -  #include "api/javascript_singleton.h"  #include "emscripten.h"  extern "C" { +extern void godot_js_os_download_buffer(const uint8_t *p_buf, int p_buf_size, const char *p_name, const char *p_mime); +} + +#ifdef JAVASCRIPT_EVAL_ENABLED + +extern "C" {  typedef union {  	int64_t i;  	double r; @@ -50,6 +54,7 @@ extern int godot_js_wrapper_object_setvar(int p_id, int p_key_type, godot_js_wra  extern void godot_js_wrapper_object_set(int p_id, const char *p_name, int p_type, godot_js_wrapper_ex *p_val);  extern void godot_js_wrapper_object_unref(int p_id);  extern int godot_js_wrapper_create_cb(void *p_ref, void (*p_callback)(void *p_ref, int p_arg_id, int p_argc)); +extern void godot_js_wrapper_object_set_cb_ret(int p_type, godot_js_wrapper_ex *p_val);  extern int godot_js_wrapper_create_object(const char *p_method, void **p_args, int p_argc, GodotJSWrapperVariant2JSCallback p_variant2js_callback, godot_js_wrapper_ex *p_cb_rval, void **p_lock, GodotJSWrapperFreeLockCallback p_lock_callback);  }; @@ -178,7 +183,7 @@ Variant JavaScriptObjectImpl::_js2variant(int p_type, godot_js_wrapper_ex *p_val  		case Variant::FLOAT:  			return p_val->r;  		case Variant::STRING: { -			String out((const char *)p_val->p); +			String out = String::utf8((const char *)p_val->p);  			free(p_val->p);  			return out;  		} @@ -253,6 +258,16 @@ void JavaScriptObjectImpl::_callback(void *p_ref, int p_args_id, int p_argc) {  	Callable::CallError err;  	Variant ret;  	obj->_callable.call(argv, 1, ret, err); + +	// Set return value +	godot_js_wrapper_ex exchange; +	void *lock = nullptr; +	const Variant *v = &ret; +	int type = _variant2js((const void **)&v, 0, &exchange, &lock); +	godot_js_wrapper_object_set_cb_ret(type, &exchange); +	if (lock) { +		_free_lock(&lock, type); +	}  }  Ref<JavaScriptObject> JavaScript::create_callback(const Callable &p_callable) { @@ -301,7 +316,6 @@ union js_eval_ret {  };  extern int godot_js_eval(const char *p_js, int p_use_global_ctx, union js_eval_ret *p_union_ptr, void *p_byte_arr, void *p_byte_arr_write, void *(*p_callback)(void *p_ptr, void *p_ptr2, int p_len)); -extern int godot_js_os_download_buffer(const uint8_t *p_buf, int p_buf_size, const char *p_name, const char *p_mime);  }  void *resize_PackedByteArray_and_open_write(void *p_arr, void *r_write, int p_len) {  |