Skip to content

Commit 0538c9d

Browse files
authored
Simplify embind code to reading basic types. NFC (#19981)
This change was split out from my work on getting embind to work with addresses over 4GB.
1 parent b256e55 commit 0538c9d

File tree

5 files changed

+47
-75
lines changed

5 files changed

+47
-75
lines changed

src/embind/embind.js

Lines changed: 43 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
/*jslint sub:true*/ /* The symbols 'fromWireType' and 'toWireType' must be accessed via array notation to be closure-safe since craftInvokerFunction crafts functions as strings that can't be closured. */
1414

1515
// -- jshint doesn't understand library syntax, so we need to specifically tell it about the symbols we define
16-
/*global typeDependencies, flushPendingDeletes, getTypeName, getBasestPointer, throwBindingError, UnboundTypeError, embindRepr, registeredInstances, registeredTypes, getShiftFromSize*/
16+
/*global typeDependencies, flushPendingDeletes, getTypeName, getBasestPointer, throwBindingError, UnboundTypeError, embindRepr, registeredInstances, registeredTypes*/
1717
/*global ensureOverloadTable, embind__requireFunction, awaitingDependencies, makeLegalFunctionName, embind_charCodes:true, registerType, createNamedFunction, RegisteredPointer, throwInternalError*/
1818
/*global simpleReadValueFromPointer, floatReadValueFromPointer, integerReadValueFromPointer, enumReadValueFromPointer, replacePublicSymbol, craftInvokerFunction, tupleRegistrations*/
1919
/*global finalizationRegistry, attachFinalizer, detachFinalizer, releaseClassHandle, runDestructor*/
@@ -274,110 +274,88 @@ var LibraryEmbind = {
274274
});
275275
},
276276

277-
_embind_register_bool__deps: [
278-
'$getShiftFromSize', '$readLatin1String', '$registerType'],
279-
_embind_register_bool: (rawType, name, size, trueValue, falseValue) => {
280-
var shift = getShiftFromSize(size);
281-
277+
_embind_register_bool__deps: ['$readLatin1String', '$registerType'],
278+
_embind_register_bool: (rawType, name, trueValue, falseValue) => {
282279
name = readLatin1String(name);
283280
registerType(rawType, {
284-
name,
285-
// ambiguous emscripten ABI: sometimes return values are
286-
// true or false, and sometimes integers (0 or 1)
287-
'fromWireType': (wt) => !!wt,
288-
'toWireType': (destructors, o) => o ? trueValue : falseValue,
289-
'argPackAdvance': 8,
290-
'readValueFromPointer': function(pointer) {
291-
// TODO: if heap is fixed (like in asm.js) this could be executed outside
292-
var heap;
293-
if (size === 1) {
294-
heap = HEAP8;
295-
} else if (size === 2) {
296-
heap = HEAP16;
297-
} else if (size === 4) {
298-
heap = HEAP32;
299-
} else {
300-
throw new TypeError("Unknown boolean type size: " + name);
301-
}
302-
return this['fromWireType'](heap[pointer >> shift]);
303-
},
304-
destructorFunction: null, // This type does not need a destructor
305-
});
306-
},
307-
308-
$getShiftFromSize__deps: [],
309-
$getShiftFromSize: (size) => {
310-
switch (size) {
311-
case 1: return 0;
312-
case 2: return 1;
313-
case 4: return 2;
314-
case 8: return 3;
315-
default:
316-
throw new TypeError(`Unknown type size: ${size}`);
317-
}
281+
name,
282+
'fromWireType': function(wt) {
283+
// ambiguous emscripten ABI: sometimes return values are
284+
// true or false, and sometimes integers (0 or 1)
285+
return !!wt;
286+
},
287+
'toWireType': function(destructors, o) {
288+
return o ? trueValue : falseValue;
289+
},
290+
'argPackAdvance': 8,
291+
'readValueFromPointer': function(pointer) {
292+
return this['fromWireType'](HEAPU8[pointer]);
293+
},
294+
destructorFunction: null, // This type does not need a destructor
295+
});
318296
},
319297

320298
$integerReadValueFromPointer__deps: [],
321-
$integerReadValueFromPointer: (name, shift, signed) => {
299+
$integerReadValueFromPointer: (name, width, signed) => {
322300
// integers are quite common, so generate very specialized functions
323-
switch (shift) {
324-
case 0: return signed ?
301+
switch (width) {
302+
case 1: return signed ?
325303
function readS8FromPointer(pointer) { return HEAP8[pointer]; } :
326304
function readU8FromPointer(pointer) { return HEAPU8[pointer]; };
327-
case 1: return signed ?
305+
case 2: return signed ?
328306
function readS16FromPointer(pointer) { return HEAP16[pointer >> 1]; } :
329307
function readU16FromPointer(pointer) { return HEAPU16[pointer >> 1]; };
330-
case 2: return signed ?
308+
case 4: return signed ?
331309
function readS32FromPointer(pointer) { return HEAP32[pointer >> 2]; } :
332310
function readU32FromPointer(pointer) { return HEAPU32[pointer >> 2]; };
333311
#if WASM_BIGINT
334-
case 3: return signed ?
312+
case 8: return signed ?
335313
function readS64FromPointer(pointer) { return HEAP64[pointer >> 3]; } :
336314
function readU64FromPointer(pointer) { return HEAPU64[pointer >> 3]; };
337315
#endif
338316
default:
339-
throw new TypeError("Unknown integer type: " + name);
317+
throw new TypeError(`invalid integer width (${width}): ${name}`);
340318
}
341319
},
342320

343321
$enumReadValueFromPointer__deps: [],
344-
$enumReadValueFromPointer: (name, shift, signed) => {
345-
switch (shift) {
346-
case 0: return function(pointer) {
322+
$enumReadValueFromPointer: (name, width, signed) => {
323+
switch (width) {
324+
case 1: return function(pointer) {
347325
var heap = signed ? HEAP8 : HEAPU8;
348326
return this['fromWireType'](heap[pointer]);
349327
};
350-
case 1: return function(pointer) {
328+
case 2: return function(pointer) {
351329
var heap = signed ? HEAP16 : HEAPU16;
352330
return this['fromWireType'](heap[pointer >> 1]);
353331
};
354-
case 2: return function(pointer) {
332+
case 4: return function(pointer) {
355333
var heap = signed ? HEAP32 : HEAPU32;
356334
return this['fromWireType'](heap[pointer >> 2]);
357335
};
358336
default:
359-
throw new TypeError("Unknown integer type: " + name);
337+
throw new TypeError(`invalid integer width (${width}): ${name}`);
360338
}
361339
},
362340

363341
$floatReadValueFromPointer__deps: [],
364-
$floatReadValueFromPointer: (name, shift) => {
365-
switch (shift) {
366-
case 2: return function(pointer) {
342+
$floatReadValueFromPointer: (name, width) => {
343+
switch (width) {
344+
case 4: return function(pointer) {
367345
return this['fromWireType'](HEAPF32[pointer >> 2]);
368346
};
369-
case 3: return function(pointer) {
347+
case 8: return function(pointer) {
370348
return this['fromWireType'](HEAPF64[pointer >> 3]);
371349
};
372350
default:
373-
throw new TypeError("Unknown float type: " + name);
351+
throw new TypeError(`invalid float width (${width}): ${name}`);
374352
}
375353
},
376354

377355
// When converting a number from JS to C++ side, the valid range of the number is
378356
// [minRange, maxRange], inclusive.
379357
_embind_register_integer__deps: [
380-
'$embindRepr', '$getShiftFromSize', '$integerReadValueFromPointer',
358+
'$embindRepr', '$integerReadValueFromPointer',
381359
'$readLatin1String', '$registerType'],
382360
_embind_register_integer: (primitiveType, name, size, minRange, maxRange) => {
383361
name = readLatin1String(name);
@@ -387,8 +365,6 @@ var LibraryEmbind = {
387365
maxRange = 4294967295;
388366
}
389367

390-
var shift = getShiftFromSize(size);
391-
392368
var fromWireType = (value) => value;
393369

394370
if (minRange === 0) {
@@ -426,7 +402,7 @@ var LibraryEmbind = {
426402
'fromWireType': fromWireType,
427403
'toWireType': toWireType,
428404
'argPackAdvance': 8,
429-
'readValueFromPointer': integerReadValueFromPointer(name, shift, minRange !== 0),
405+
'readValueFromPointer': integerReadValueFromPointer(name, size, minRange !== 0),
430406
destructorFunction: null, // This type does not need a destructor
431407
});
432408
},
@@ -437,8 +413,6 @@ var LibraryEmbind = {
437413
_embind_register_bigint: (primitiveType, name, size, minRange, maxRange) => {
438414
name = readLatin1String(name);
439415

440-
var shift = getShiftFromSize(size);
441-
442416
var isUnsignedType = (name.indexOf('u') != -1);
443417

444418
// maxRange comes through as -1 for uint64_t (see issue 13902). Work around that temporarily
@@ -459,7 +433,7 @@ var LibraryEmbind = {
459433
return value;
460434
},
461435
'argPackAdvance': 8,
462-
'readValueFromPointer': integerReadValueFromPointer(name, shift, !isUnsignedType),
436+
'readValueFromPointer': integerReadValueFromPointer(name, size, !isUnsignedType),
463437
destructorFunction: null, // This type does not need a destructor
464438
});
465439
},
@@ -469,10 +443,9 @@ var LibraryEmbind = {
469443
#endif
470444

471445
_embind_register_float__deps: [
472-
'$embindRepr', '$floatReadValueFromPointer', '$getShiftFromSize',
446+
'$embindRepr', '$floatReadValueFromPointer',
473447
'$readLatin1String', '$registerType'],
474448
_embind_register_float: (rawType, name, size) => {
475-
var shift = getShiftFromSize(size);
476449
name = readLatin1String(name);
477450
registerType(rawType, {
478451
name,
@@ -488,7 +461,7 @@ var LibraryEmbind = {
488461
return value;
489462
},
490463
'argPackAdvance': 8,
491-
'readValueFromPointer': floatReadValueFromPointer(name, shift),
464+
'readValueFromPointer': floatReadValueFromPointer(name, size),
492465
destructorFunction: null, // This type does not need a destructor
493466
});
494467
},
@@ -2391,10 +2364,9 @@ var LibraryEmbind = {
23912364
});
23922365
},
23932366

2394-
_embind_register_enum__deps: ['$exposePublicSymbol', '$getShiftFromSize', '$enumReadValueFromPointer',
2367+
_embind_register_enum__deps: ['$exposePublicSymbol', '$enumReadValueFromPointer',
23952368
'$readLatin1String', '$registerType'],
23962369
_embind_register_enum: (rawType, name, size, isSigned) => {
2397-
var shift = getShiftFromSize(size);
23982370
name = readLatin1String(name);
23992371

24002372
function ctor() {}
@@ -2408,7 +2380,7 @@ var LibraryEmbind = {
24082380
},
24092381
'toWireType': (destructors, c) => c.value,
24102382
'argPackAdvance': 8,
2411-
'readValueFromPointer': enumReadValueFromPointer(name, shift, isSigned),
2383+
'readValueFromPointer': enumReadValueFromPointer(name, size, isSigned),
24122384
destructorFunction: null,
24132385
});
24142386
exposePublicSymbol(name, ctor);

src/embind/embind_ts.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ var LibraryEmbind = {
267267
registerPrimitiveType(rawType, name);
268268
},
269269
_embind_register_bool__deps: ['$registerPrimitiveType'],
270-
_embind_register_bool: (rawType, name, size, trueValue, falseValue) => {
270+
_embind_register_bool: (rawType, name, trueValue, falseValue) => {
271271
registerPrimitiveType(rawType, name);
272272
},
273273
_embind_register_integer__deps: ['$registerPrimitiveType'],

src/library_sigs.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ sigs = {
289289
_embind_finalize_value_array__sig: 'vp',
290290
_embind_finalize_value_object__sig: 'vp',
291291
_embind_register_bigint__sig: 'vpppjj',
292-
_embind_register_bool__sig: 'vpppii',
292+
_embind_register_bool__sig: 'vppii',
293293
_embind_register_class__sig: 'vppppppppppppp',
294294
_embind_register_class_class_function__sig: 'vppippppi',
295295
_embind_register_class_class_property__sig: 'vpppppppp',

system/include/emscripten/bind.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ void _embind_register_void(
5656
void _embind_register_bool(
5757
TYPEID boolType,
5858
const char* name,
59-
size_t size,
6059
bool trueValue,
6160
bool falseValue);
6261

system/lib/embind/bind.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ EMSCRIPTEN_BINDINGS(builtin) {
119119

120120
_embind_register_void(TypeID<void>::get(), "void");
121121

122-
_embind_register_bool(TypeID<bool>::get(), "bool", sizeof(bool), true, false);
122+
_embind_register_bool(TypeID<bool>::get(), "bool", true, false);
123+
static_assert(sizeof(bool) == 1);
123124

124125
register_integer<char>("char");
125126
register_integer<signed char>("signed char");

0 commit comments

Comments
 (0)