From a024288795796881543e40e73db930324a0b4654 Mon Sep 17 00:00:00 2001 From: Ingvar Stepanyan Date: Tue, 3 Oct 2023 19:51:29 +0100 Subject: [PATCH] Avoid separate emval_call_void_method (#20368) --- src/embind/emval.js | 31 ++++++++++--------------------- src/library_sigs.js | 1 - system/include/emscripten/val.h | 32 ++++++++++---------------------- 3 files changed, 20 insertions(+), 44 deletions(-) diff --git a/src/embind/emval.js b/src/embind/emval.js index 44a4d77b2b39..26a6506a2be7 100644 --- a/src/embind/emval.js +++ b/src/embind/emval.js @@ -13,7 +13,7 @@ // -- jshint doesn't understand library syntax, so we need to mark the symbols exposed here /*global getStringOrSymbol, emval_handles, Emval, __emval_unregister, count_emval_handles, emval_symbols, __emval_decref, emval_newers*/ -/*global craftEmvalAllocator, emval_addMethodCaller, emval_methodCallers, addToLibrary, emval_allocateDestructors, global, emval_lookupTypes, makeLegalFunctionName*/ +/*global craftEmvalAllocator, emval_addMethodCaller, emval_methodCallers, addToLibrary, global, emval_lookupTypes, makeLegalFunctionName*/ /*global emval_get_global*/ var LibraryEmVal = { @@ -370,13 +370,6 @@ var LibraryEmVal = { return a; }, - $emval_allocateDestructors__deps: ['$Emval'], - $emval_allocateDestructors: (destructorsRef) => { - var destructors = []; - {{{ makeSetValue('destructorsRef', '0', 'Emval.toHandle(destructors)', '*') }}}; - return destructors; - }, - // Leave id 0 undefined. It's not a big deal, but might be confusing // to have null be a valid method caller. $emval_methodCallers: [undefined], @@ -414,9 +407,7 @@ var LibraryEmVal = { types[i].deleteObject(argN[i]); } } - if (!retType.isVoid) { - return retType['toWireType'](destructors, rv); - } + return retType['toWireType'](destructors, rv); }; #else var params = ["retType"]; @@ -461,20 +452,18 @@ var LibraryEmVal = { return emval_addMethodCaller(invokerFunction); }, - _emval_call_method__deps: ['$emval_allocateDestructors', '$getStringOrSymbol', '$emval_methodCallers', '$Emval'], + _emval_call_method__deps: ['$getStringOrSymbol', '$emval_methodCallers', '$Emval'], _emval_call_method: (caller, handle, methodName, destructorsRef, args) => { caller = emval_methodCallers[caller]; handle = Emval.toValue(handle); methodName = getStringOrSymbol(methodName); - return caller(handle, methodName, emval_allocateDestructors(destructorsRef), args); - }, - - _emval_call_void_method__deps: ['$emval_allocateDestructors', '$getStringOrSymbol', '$emval_methodCallers', '$Emval'], - _emval_call_void_method: (caller, handle, methodName, args) => { - caller = emval_methodCallers[caller]; - handle = Emval.toValue(handle); - methodName = getStringOrSymbol(methodName); - caller(handle, methodName, null, args); + var destructors = []; + var result = caller(handle, methodName, destructors, args); + // void and any other types w/o destructors don't need to allocate a handle + if (destructors.length) { + {{{ makeSetValue('destructorsRef', '0', 'Emval.toHandle(destructors)', '*') }}}; + } + return result; }, _emval_typeof__deps: ['$Emval'], diff --git a/src/library_sigs.js b/src/library_sigs.js index 433df7561815..8bbe3cfb8aac 100644 --- a/src/library_sigs.js +++ b/src/library_sigs.js @@ -339,7 +339,6 @@ sigs = { _emval_await__sig: 'pp', _emval_call__sig: 'ppipp', _emval_call_method__sig: 'dppppp', - _emval_call_void_method__sig: 'vpppp', _emval_decref__sig: 'vp', _emval_delete__sig: 'ipp', _emval_equals__sig: 'ipp', diff --git a/system/include/emscripten/val.h b/system/include/emscripten/val.h index 8c5d5c2ce752..763a4366875b 100644 --- a/system/include/emscripten/val.h +++ b/system/include/emscripten/val.h @@ -99,11 +99,6 @@ EM_GENERIC_WIRE_TYPE _emval_call_method( const char* methodName, EM_DESTRUCTORS* destructors, EM_VAR_ARGS argv); -void _emval_call_void_method( - EM_METHOD_CALLER caller, - EM_VAL handle, - const char* methodName, - EM_VAR_ARGS argv); EM_VAL _emval_typeof(EM_VAL value); bool _emval_instanceof(EM_VAL object, EM_VAL constructor); bool _emval_is_number(EM_VAL object); @@ -145,7 +140,9 @@ struct DestructorsRunner { : destructors(d) {} ~DestructorsRunner() { - _emval_run_destructors(destructors); + if (destructors) { + _emval_run_destructors(destructors); + } } DestructorsRunner(const DestructorsRunner&) = delete; @@ -170,12 +167,17 @@ struct GenericWireTypeConverter { }; template -T fromGenericWireType(double g) { +T fromGenericWireType(EM_GENERIC_WIRE_TYPE g) { typedef typename BindingType::WireType WireType; WireType wt = GenericWireTypeConverter::from(g); return BindingType::fromWireType(wt); } +template<> +inline void fromGenericWireType(EM_GENERIC_WIRE_TYPE g) { + (void)g; +} + template struct PackSize; @@ -271,7 +273,7 @@ struct MethodCaller { auto caller = Signature::get_method_caller(); WireTypePack argv(std::forward(args)...); - EM_DESTRUCTORS destructors; + EM_DESTRUCTORS destructors = nullptr; EM_GENERIC_WIRE_TYPE result = _emval_call_method( caller, handle, @@ -283,20 +285,6 @@ struct MethodCaller { } }; -template -struct MethodCaller { - static void call(EM_VAL handle, const char* methodName, Args&&... args) { - auto caller = Signature::get_method_caller(); - - WireTypePack argv(std::forward(args)...); - _emval_call_void_method( - caller, - handle, - methodName, - argv); - } -}; - } // end namespace internal #define EMSCRIPTEN_SYMBOL(name) \