Skip to content

Commit e6415d6

Browse files
authored
embind: Use single type object for emval. (#20806)
If register_type is used, emval will be registered multiple times for different type id's, but only a single type object is needed on the JS side for all of them.
1 parent 946c850 commit e6415d6

File tree

6 files changed

+35
-32
lines changed

6 files changed

+35
-32
lines changed

src/embind/embind.js

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,25 @@ var LibraryEmbind = {
3838
#if EMBIND_AOT
3939
$InvokerFunctions: '<<< EMBIND_AOT_OUTPUT >>>',
4040
#endif
41-
41+
// If register_type is used, emval will be registered multiple times for
42+
// different type id's, but only a single type object is needed on the JS side
43+
// for all of them. Store the type for reuse.
44+
$EmValType__deps: ['_emval_decref', '$Emval', '$simpleReadValueFromPointer', '$GenericWireTypeSize'],
45+
$EmValType: `{
46+
name: 'emscripten::val',
47+
'fromWireType': (handle) => {
48+
var rv = Emval.toValue(handle);
49+
__emval_decref(handle);
50+
return rv;
51+
},
52+
'toWireType': (destructors, value) => Emval.toHandle(value),
53+
'argPackAdvance': GenericWireTypeSize,
54+
'readValueFromPointer': simpleReadValueFromPointer,
55+
destructorFunction: null, // This type does not need a destructor
56+
57+
// TODO: do we need a deleteObject here? write a test where
58+
// emval is passed into JS via an interface
59+
}`,
4260
$init_embind__deps: [
4361
'$getInheritedInstanceCount', '$getLiveInheritedInstances',
4462
'$flushPendingDeletes', '$setDelayFunction'],
@@ -668,32 +686,17 @@ var LibraryEmbind = {
668686
},
669687

670688
_embind_register_emval__deps: [
671-
'_emval_decref', '$Emval',
672-
'$readLatin1String', '$registerType', '$simpleReadValueFromPointer'],
673-
_embind_register_emval: (rawType, name) => {
674-
name = readLatin1String(name);
675-
registerType(rawType, {
676-
name,
677-
'fromWireType': (handle) => {
678-
var rv = Emval.toValue(handle);
679-
__emval_decref(handle);
680-
return rv;
681-
},
682-
'toWireType': (destructors, value) => Emval.toHandle(value),
683-
'argPackAdvance': GenericWireTypeSize,
684-
'readValueFromPointer': simpleReadValueFromPointer,
685-
destructorFunction: null, // This type does not need a destructor
686-
});
687-
},
689+
'$registerType', '$EmValType'],
690+
_embind_register_emval: (rawType) => registerType(rawType, EmValType),
688691

689692
_embind_register_user_type__deps: ['_embind_register_emval'],
690693
_embind_register_user_type: (rawType, name) => {
691-
__embind_register_emval(rawType, name);
694+
__embind_register_emval(rawType);
692695
},
693696

694697
_embind_register_optional__deps: ['_embind_register_emval'],
695698
_embind_register_optional: (rawOptionalType, rawType) => {
696-
__embind_register_emval(rawOptionalType, "");
699+
__embind_register_emval(rawOptionalType);
697700
},
698701

699702
_embind_register_memory_view__deps: ['$readLatin1String', '$registerType'],

src/embind/embind_gen.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -463,8 +463,9 @@ var LibraryEmbind = {
463463
_embind_register_std_wstring: (rawType, charSize, name) => {
464464
registerPrimitiveType(rawType, name, 'function');
465465
},
466-
_embind_register_emval: (rawType, name) => {
467-
registerPrimitiveType(rawType, name, 'none');
466+
_embind_register_emval__deps: ['$registerType', '$PrimitiveType'],
467+
_embind_register_emval: (rawType) => {
468+
registerType(rawType, new PrimitiveType(rawType, 'emscripten::val', 'none'));
468469
},
469470
_embind_register_user_type__deps: ['$registerType', '$readLatin1String', '$UserType'],
470471
_embind_register_user_type: (rawType, name) => {

src/library_sigs.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ sigs = {
297297
_embind_register_class_function__sig: 'vppippppii',
298298
_embind_register_class_property__sig: 'vpppppppppp',
299299
_embind_register_constant__sig: 'vppd',
300-
_embind_register_emval__sig: 'vpp',
300+
_embind_register_emval__sig: 'vp',
301301
_embind_register_enum__sig: 'vpppi',
302302
_embind_register_enum_value__sig: 'vppi',
303303
_embind_register_float__sig: 'vppp',

system/include/emscripten/bind.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,7 @@ void _embind_register_std_wstring(
9191
const char* name);
9292

9393
void _embind_register_emval(
94-
TYPEID emvalType,
95-
const char* name);
94+
TYPEID emvalType);
9695

9796
void _embind_register_memory_view(
9897
TYPEID memoryViewType,

system/lib/embind/bind.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ EMSCRIPTEN_BINDINGS(builtin) {
154154
_embind_register_std_wstring(TypeID<std::wstring>::get(), sizeof(wchar_t), "std::wstring");
155155
_embind_register_std_wstring(TypeID<std::u16string>::get(), sizeof(char16_t), "std::u16string");
156156
_embind_register_std_wstring(TypeID<std::u32string>::get(), sizeof(char32_t), "std::u32string");
157-
_embind_register_emval(TypeID<val>::get(), "emscripten::val");
157+
_embind_register_emval(TypeID<val>::get());
158158

159159
// Some of these types are aliases for each other. Luckily,
160160
// embind.js's _embind_register_memory_view ignores duplicate

test/code_size/embind_val_wasm.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
22
"a.html": 673,
33
"a.html.gz": 431,
4-
"a.js": 7395,
5-
"a.js.gz": 3109,
6-
"a.wasm": 11458,
7-
"a.wasm.gz": 5733,
8-
"total": 19526,
9-
"total_gz": 9273
4+
"a.js": 7411,
5+
"a.js.gz": 3140,
6+
"a.wasm": 11439,
7+
"a.wasm.gz": 5729,
8+
"total": 19523,
9+
"total_gz": 9300
1010
}

0 commit comments

Comments
 (0)