Skip to content

Commit a94550a

Browse files
committed
[Wasm64] Initial work for get parts of embind working
1 parent 28020ed commit a94550a

File tree

4 files changed

+53
-47
lines changed

4 files changed

+53
-47
lines changed

src/embind/embind.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,7 @@ var LibraryEmbind = {
439439

440440
_embind_register_bool__deps: [
441441
'$getShiftFromSize', '$readLatin1String', '$registerType'],
442+
_embind_register_bool__sig: 'vpppii',
442443
_embind_register_bool: function(rawType, name, size, trueValue, falseValue) {
443444
var shift = getShiftFromSize(size);
444445

@@ -546,6 +547,7 @@ var LibraryEmbind = {
546547
_embind_register_integer__deps: [
547548
'embind_repr', '$getShiftFromSize', '$integerReadValueFromPointer',
548549
'$readLatin1String', '$registerType'],
550+
_embind_register_integer__sig: 'vpppjj',
549551
_embind_register_integer: function(primitiveType, name, size, minRange, maxRange) {
550552
name = readLatin1String(name);
551553
if (maxRange === -1) { // LLVM doesn't have signed and unsigned 32-bit types, so u32 literals come out as 'i32 -1'. Always treat those as max u32.
@@ -599,6 +601,7 @@ var LibraryEmbind = {
599601
#if WASM_BIGINT
600602
_embind_register_bigint__deps: [
601603
'embind_repr', '$readLatin1String', '$registerType', '$integerReadValueFromPointer'],
604+
_embind_register_bigint__sig: 'vpppjj',
602605
_embind_register_bigint: function(primitiveType, name, size, minRange, maxRange) {
603606
name = readLatin1String(name);
604607

@@ -639,6 +642,7 @@ var LibraryEmbind = {
639642
_embind_register_float__deps: [
640643
'embind_repr', '$floatReadValueFromPointer', '$getShiftFromSize',
641644
'$readLatin1String', '$registerType'],
645+
_embind_register_float__sig: 'vppp',
642646
_embind_register_float: function(rawType, name, size) {
643647
var shift = getShiftFromSize(size);
644648
name = readLatin1String(name);

src/embind/emval.js

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
// -- jshint doesn't understand library syntax, so we need to mark the symbols exposed here
1515
/*global getStringOrSymbol, emval_handle_array, Emval, __emval_unregister, count_emval_handles, emval_symbols, emval_free_list, get_first_emval, __emval_decref, emval_newers*/
16-
/*global craftEmvalAllocator, __emval_addMethodCaller, emval_methodCallers, LibraryManager, mergeInto, __emval_allocateDestructors, global, __emval_lookupTypes, makeLegalFunctionName*/
16+
/*global craftEmvalAllocator, emval_addMethodCaller, emval_methodCallers, LibraryManager, mergeInto, emval_allocateDestructors, global, emval_lookupTypes, makeLegalFunctionName*/
1717
/*global emval_get_global*/
1818

1919
var LibraryEmVal = {
@@ -261,7 +261,7 @@ var LibraryEmVal = {
261261
})()('return this')();
262262
},
263263
#endif
264-
_emval_get_global__sig: 'ii',
264+
_emval_get_global__sig: 'pp',
265265
_emval_get_global__deps: ['$Emval', '$getStringOrSymbol', '$emval_get_global'],
266266
_emval_get_global: function(name) {
267267
if (name===0) {
@@ -279,7 +279,7 @@ var LibraryEmVal = {
279279
return Emval.toHandle(Module[name]);
280280
},
281281

282-
_emval_get_property__sig: 'iii',
282+
_emval_get_property__sig: 'ppp',
283283
_emval_get_property__deps: ['$Emval'],
284284
_emval_get_property: function(handle, key) {
285285
handle = Emval.toValue(handle);
@@ -296,7 +296,7 @@ var LibraryEmVal = {
296296
handle[key] = value;
297297
},
298298

299-
_emval_as__sig: 'iiii',
299+
_emval_as__sig: 'dppp',
300300
_emval_as__deps: ['$Emval', '$requireRegisteredType'],
301301
_emval_as: function(handle, returnType, destructorsRef) {
302302
handle = Emval.toValue(handle);
@@ -308,58 +308,65 @@ var LibraryEmVal = {
308308
},
309309

310310
_emval_as_int64__deps: ['$Emval', '$requireRegisteredType'],
311+
_emval_as_int64__sig: 'dppp',
311312
_emval_as_int64: function(handle, returnType, destructorsRef) {
312313
handle = Emval.toValue(handle);
313314
returnType = requireRegisteredType(returnType, 'emval::as');
314315
return returnType['toWireType'](null, handle);
315316
},
316317

317318
_emval_as_uint64__deps: ['$Emval', '$requireRegisteredType'],
319+
_emval_as_uint64__sig: 'dppp',
318320
_emval_as_uint64: function(handle, returnType, destructorsRef) {
319321
handle = Emval.toValue(handle);
320322
returnType = requireRegisteredType(returnType, 'emval::as');
321323
return returnType['toWireType'](null, handle);
322324
},
323325

324326
_emval_equals__deps: ['$Emval'],
327+
_emval_equals__sig: 'ipp',
325328
_emval_equals: function(first, second) {
326329
first = Emval.toValue(first);
327330
second = Emval.toValue(second);
328331
return first == second;
329332
},
330333

331334
_emval_strictly_equals__deps: ['$Emval'],
335+
_emval_strictly_equals__sig: 'ipp',
332336
_emval_strictly_equals: function(first, second) {
333337
first = Emval.toValue(first);
334338
second = Emval.toValue(second);
335339
return first === second;
336340
},
337341

338342
_emval_greater_than__deps: ['$Emval'],
343+
_emval_greater_than__sig: 'ipp',
339344
_emval_greater_than: function(first, second) {
340345
first = Emval.toValue(first);
341346
second = Emval.toValue(second);
342347
return first > second;
343348
},
344349

345350
_emval_less_than__deps: ['$Emval'],
351+
_emval_less_than__sig: 'ipp',
346352
_emval_less_than: function(first, second) {
347353
first = Emval.toValue(first);
348354
second = Emval.toValue(second);
349355
return first < second;
350356
},
351357

352358
_emval_not__deps: ['$Emval'],
359+
_emval_not__sig: 'ip',
353360
_emval_not: function(object) {
354361
object = Emval.toValue(object);
355362
return !object;
356363
},
357364

358-
_emval_call__sig: 'iiiii',
359-
_emval_call__deps: ['_emval_lookupTypes', '$Emval'],
365+
_emval_call__sig: 'ppppp',
366+
_emval_call__deps: ['$emval_lookupTypes', '$Emval'],
360367
_emval_call: function(handle, argCount, argTypes, argv) {
361368
handle = Emval.toValue(handle);
362-
var types = __emval_lookupTypes(argCount, argTypes);
369+
var types = emval_lookupTypes(argCount, argTypes);
363370

364371
var args = new Array(argCount);
365372
for (var i = 0; i < argCount; ++i) {
@@ -372,18 +379,18 @@ var LibraryEmVal = {
372379
return Emval.toHandle(rv);
373380
},
374381

375-
_emval_lookupTypes__deps: ['$requireRegisteredType'],
376-
_emval_lookupTypes: function(argCount, argTypes) {
382+
$emval_lookupTypes__deps: ['$requireRegisteredType'],
383+
$emval_lookupTypes: function(argCount, argTypes) {
377384
var a = new Array(argCount);
378385
for (var i = 0; i < argCount; ++i) {
379-
a[i] = requireRegisteredType(HEAP32[(argTypes >> 2) + i],
386+
a[i] = requireRegisteredType({{{ makeGetValue('argTypes', 'i * POINTER_SIZE', '*') }}},
380387
"parameter " + i);
381388
}
382389
return a;
383390
},
384391

385-
_emval_allocateDestructors__deps: ['$Emval'],
386-
_emval_allocateDestructors: function(destructorsRef) {
392+
$emval_allocateDestructors__deps: ['$Emval'],
393+
$emval_allocateDestructors: function(destructorsRef) {
387394
var destructors = [];
388395
HEAP32[destructorsRef >> 2] = Emval.toHandle(destructors);
389396
return destructors;
@@ -393,18 +400,18 @@ var LibraryEmVal = {
393400
// to have null be a valid method caller.
394401
$emval_methodCallers: [undefined],
395402

396-
_emval_addMethodCaller__deps: ['$emval_methodCallers'],
397-
_emval_addMethodCaller: function(caller) {
403+
$emval_addMethodCaller__deps: ['$emval_methodCallers'],
404+
$emval_addMethodCaller: function(caller) {
398405
var id = emval_methodCallers.length;
399406
emval_methodCallers.push(caller);
400407
return id;
401408
},
402409

403410
$emval_registeredMethods: [],
404-
_emval_get_method_caller__sig: 'iii',
405-
_emval_get_method_caller__deps: ['_emval_addMethodCaller', '_emval_lookupTypes', '$new_', '$makeLegalFunctionName', '$emval_registeredMethods'],
411+
_emval_get_method_caller__sig: 'ppp',
412+
_emval_get_method_caller__deps: ['$emval_addMethodCaller', '$emval_lookupTypes', '$new_', '$makeLegalFunctionName', '$emval_registeredMethods'],
406413
_emval_get_method_caller: function(argCount, argTypes) {
407-
var types = __emval_lookupTypes(argCount, argTypes);
414+
var types = emval_lookupTypes(argCount, argTypes);
408415
var retType = types[0];
409416
var signatureName = retType.name + "_$" + types.slice(1).map(function (t) { return t.name; }).join("_") + "$";
410417
var returnId = emval_registeredMethods[signatureName];
@@ -469,69 +476,76 @@ var LibraryEmVal = {
469476
params.push(functionBody);
470477
var invokerFunction = new_(Function, params).apply(null, args);
471478
#endif
472-
returnId = __emval_addMethodCaller(invokerFunction);
479+
returnId = emval_addMethodCaller(invokerFunction);
473480
emval_registeredMethods[signatureName] = returnId;
474481
return returnId;
475482
},
476483

477-
_emval_call_method__deps: ['_emval_allocateDestructors', '$getStringOrSymbol', '$emval_methodCallers', '$Emval'],
484+
_emval_call_method__deps: ['$emval_allocateDestructors', '$getStringOrSymbol', '$emval_methodCallers', '$Emval'],
485+
_emval_call_method__sig: 'dppppp',
478486
_emval_call_method: function(caller, handle, methodName, destructorsRef, args) {
479487
caller = emval_methodCallers[caller];
480488
handle = Emval.toValue(handle);
481489
methodName = getStringOrSymbol(methodName);
482-
return caller(handle, methodName, __emval_allocateDestructors(destructorsRef), args);
490+
return caller(handle, methodName, emval_allocateDestructors(destructorsRef), args);
483491
},
484492

485-
_emval_call_void_method__sig: 'viiii',
486-
_emval_call_void_method__deps: ['_emval_allocateDestructors', '$getStringOrSymbol', '$emval_methodCallers', '$Emval'],
493+
_emval_call_void_method__sig: 'vpppp',
494+
_emval_call_void_method__deps: ['$emval_allocateDestructors', '$getStringOrSymbol', '$emval_methodCallers', '$Emval'],
487495
_emval_call_void_method: function(caller, handle, methodName, args) {
488496
caller = emval_methodCallers[caller];
489497
handle = Emval.toValue(handle);
490498
methodName = getStringOrSymbol(methodName);
491499
caller(handle, methodName, null, args);
492500
},
493501

494-
_emval_typeof__sig: 'ii',
502+
_emval_typeof__sig: 'pp',
495503
_emval_typeof__deps: ['$Emval'],
496504
_emval_typeof: function(handle) {
497505
handle = Emval.toValue(handle);
498506
return Emval.toHandle(typeof handle);
499507
},
500508

501509
_emval_instanceof__deps: ['$Emval'],
510+
_emval_instanceof__sig: 'ipp',
502511
_emval_instanceof: function(object, constructor) {
503512
object = Emval.toValue(object);
504513
constructor = Emval.toValue(constructor);
505514
return object instanceof constructor;
506515
},
507516

508517
_emval_is_number__deps: ['$Emval'],
518+
_emval_is_number__sig: 'ip',
509519
_emval_is_number: function(handle) {
510520
handle = Emval.toValue(handle);
511521
return typeof handle == 'number';
512522
},
513523

514524
_emval_is_string__deps: ['$Emval'],
525+
_emval_is_string__sig: 'ip',
515526
_emval_is_string: function(handle) {
516527
handle = Emval.toValue(handle);
517528
return typeof handle == 'string';
518529
},
519530

520531
_emval_in__deps: ['$Emval'],
532+
_emval_in__sig: 'ipp',
521533
_emval_in: function(item, object) {
522534
item = Emval.toValue(item);
523535
object = Emval.toValue(object);
524536
return item in object;
525537
},
526538

527539
_emval_delete__deps: ['$Emval'],
540+
_emval_delete__sig: 'ipp',
528541
_emval_delete: function(object, property) {
529542
object = Emval.toValue(object);
530543
property = Emval.toValue(property);
531544
return delete object[property];
532545
},
533546

534547
_emval_throw__deps: ['$Emval'],
548+
_emval_throw__sig: 'vp',
535549
_emval_throw: function(object) {
536550
object = Emval.toValue(object);
537551
throw object;

system/include/emscripten/val.h

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#error Including <emscripten/val.h> requires building with -std=c++11 or newer!
1212
#endif
1313

14+
#include <cassert>
1415
#include <array>
1516
#include <climits>
1617
#include <emscripten/wire.h>
@@ -190,15 +191,14 @@ union GenericWireType {
190191
union {
191192
unsigned u;
192193
float f;
193-
#if __ILP32__
194-
const void* p;
195-
#endif
194+
// Use uint32_t for pointer values. This limits us, for now, to 32-bit
195+
// address ranges even on wasm64. This is enforced by assertions below.
196+
// TODO(sbc): Allow full 64-bit address range here under wasm64, most
197+
// likely by increasing the size of GenericWireType on wamsm64.
198+
uint32_t p;
196199
} w[2];
197200
double d;
198201
uint64_t u;
199-
#if __LP64__
200-
const void* p;
201-
#endif
202202
};
203203
static_assert(sizeof(GenericWireType) == 8, "GenericWireType must be 8 bytes");
204204
static_assert(alignof(GenericWireType) == 8, "GenericWireType must be 8-byte-aligned");
@@ -225,29 +225,18 @@ inline void writeGenericWireType(GenericWireType*& cursor, uint64_t wt) {
225225

226226
template<typename T>
227227
void writeGenericWireType(GenericWireType*& cursor, T* wt) {
228-
#if __ILP32__
229-
cursor->w[0].p = wt;
230-
#else
231-
cursor->p = wt;
232-
// FIXME: This requires the JS reading code to be audited to be compatible with it.
233-
assert(false);
234-
abort();
235-
#endif
228+
uintptr_t short_ptr = reinterpret_cast<uintptr_t>(wt);
229+
assert(short_ptr <= UINT32_MAX);
230+
cursor->w[0].p = short_ptr;
236231
++cursor;
237232
}
238233

239234
template<typename ElementType>
240235
inline void writeGenericWireType(GenericWireType*& cursor, const memory_view<ElementType>& wt) {
236+
uintptr_t short_ptr = reinterpret_cast<uintptr_t>(wt.data);
237+
assert(short_ptr <= UINT32_MAX);
241238
cursor->w[0].u = wt.size;
242-
#if __ILP32__
243-
cursor->w[1].p = wt.data;
244-
#else
245-
// FIXME: need to change GenericWireType such that it can store a 64-bit pointer?
246-
// This requires the JS reading code to be audited to be compatible with it.
247-
cursor->w[1].u = 0;
248-
assert(false);
249-
abort();
250-
#endif
239+
cursor->w[1].p = short_ptr;
251240
++cursor;
252241
}
253242

tests/test_core.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7332,7 +7332,6 @@ def test2():
73327332

73337333
do_test(test2, level=2, prefix='hello_libcxx')
73347334

7335-
@no_wasm64('embind does not yet support MEMORY64')
73367335
def test_embind(self):
73377336
# Verify that both the old `--bind` arg and the new `-lembind` arg work
73387337
for args in [['-lembind'], ['--bind']]:

0 commit comments

Comments
 (0)