Skip to content

Commit e91ea21

Browse files
authored
[Wasm64] More embind fixes. (#17332)
Enough to make two more tests pass: - test_embind_val - test_embind_dynamic_initialization
1 parent 7121168 commit e91ea21

File tree

5 files changed

+34
-21
lines changed

5 files changed

+34
-21
lines changed

src/embind/embind.js

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,7 @@ var LibraryEmbind = {
629629
return value;
630630
},
631631
'toWireType': function (destructors, value) {
632-
if (typeof value != "bigint") {
632+
if (typeof value != "bigint" && typeof value != "number") {
633633
throw new TypeError('Cannot convert "' + embindRepr(value) + '" to ' + this.name);
634634
}
635635
if (value < minRange || value > maxRange) {
@@ -678,7 +678,7 @@ var LibraryEmbind = {
678678

679679
// For types whose wire types are 32-bit pointers.
680680
$simpleReadValueFromPointer: function(pointer) {
681-
return this['fromWireType'](HEAPU32[pointer >> 2]);
681+
return this['fromWireType']({{{ makeGetValue('pointer', '0', 'i32') }}});
682682
},
683683

684684
_embind_register_std_string__sig: 'vpp',
@@ -698,14 +698,15 @@ var LibraryEmbind = {
698698
registerType(rawType, {
699699
name: name,
700700
'fromWireType': function(value) {
701-
var length = HEAPU32[value >> 2];
701+
var length = {{{ makeGetValue('value', '0', SIZE_TYPE) }}};
702+
var payload = value + {{{ POINTER_SIZE }}};
702703

703704
var str;
704705
if (stdStringIsUTF8) {
705-
var decodeStartPtr = value + 4;
706+
var decodeStartPtr = payload;
706707
// Looping here to support possible embedded '0' bytes
707708
for (var i = 0; i <= length; ++i) {
708-
var currentBytePtr = value + 4 + i;
709+
var currentBytePtr = payload + i;
709710
if (i == length || HEAPU8[currentBytePtr] == 0) {
710711
var maxRead = currentBytePtr - decodeStartPtr;
711712
var stringSegment = UTF8ToString(decodeStartPtr, maxRead);
@@ -721,7 +722,7 @@ var LibraryEmbind = {
721722
} else {
722723
var a = new Array(length);
723724
for (var i = 0; i < length; ++i) {
724-
a[i] = String.fromCharCode(HEAPU8[value + 4 + i]);
725+
a[i] = String.fromCharCode(HEAPU8[payload + i]);
725726
}
726727
str = a.join('');
727728
}
@@ -748,13 +749,14 @@ var LibraryEmbind = {
748749
}
749750

750751
// assumes 4-byte alignment
751-
var ptr = _malloc(4 + length + 1);
752+
var base = _malloc({{{ POINTER_SIZE }}} + length + 1);
753+
var ptr = base + {{{ POINTER_SIZE }}};
752754
#if CAN_ADDRESS_2GB
753755
ptr >>>= 0;
754756
#endif
755-
HEAPU32[ptr >> 2] = length;
757+
{{{ makeSetValue('base', '0', 'length', SIZE_TYPE) }}};
756758
if (stdStringIsUTF8 && valueIsOfTypeString) {
757-
stringToUTF8(value, ptr + 4, length + 1);
759+
stringToUTF8(value, ptr, length + 1);
758760
} else {
759761
if (valueIsOfTypeString) {
760762
for (var i = 0; i < length; ++i) {
@@ -763,19 +765,19 @@ var LibraryEmbind = {
763765
_free(ptr);
764766
throwBindingError('String has UTF-16 code units that do not fit in 8 bits');
765767
}
766-
HEAPU8[ptr + 4 + i] = charCode;
768+
HEAPU8[ptr + i] = charCode;
767769
}
768770
} else {
769771
for (var i = 0; i < length; ++i) {
770-
HEAPU8[ptr + 4 + i] = value[i];
772+
HEAPU8[ptr + i] = value[i];
771773
}
772774
}
773775
}
774776

775777
if (destructors !== null) {
776-
destructors.push(_free, ptr);
778+
destructors.push(_free, base);
777779
}
778-
return ptr;
780+
return base;
779781
},
780782
'argPackAdvance': 8,
781783
'readValueFromPointer': simpleReadValueFromPointer,
@@ -1658,9 +1660,19 @@ var LibraryEmbind = {
16581660

16591661
$RegisteredPointer_fromWireType__deps: [
16601662
'$downcastPointer', '$registeredPointers',
1661-
'$getInheritedInstance', '$makeClassHandle'],
1663+
'$getInheritedInstance', '$makeClassHandle',
1664+
#if MEMORY64
1665+
'$bigintToI53Checked'
1666+
#endif
1667+
],
16621668
$RegisteredPointer_fromWireType: function(ptr) {
16631669
// ptr is a raw pointer (or a raw smartpointer)
1670+
#if MEMORY64
1671+
ptr = bigintToI53Checked(ptr);
1672+
#if ASSERTIONS
1673+
assert(ptr != NaN);
1674+
#endif
1675+
#endif
16641676

16651677
// rawPointer is a maybe-null raw pointer
16661678
var rawPointer = this.getPointee(ptr);

src/embind/emval.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,9 @@ var LibraryEmVal = {
153153

154154
_emval_take_value__sig: 'ppp',
155155
_emval_take_value__deps: ['$Emval', '$requireRegisteredType'],
156-
_emval_take_value: function(type, argv) {
156+
_emval_take_value: function(type, arg) {
157157
type = requireRegisteredType(type, '_emval_take_value');
158-
var v = type['readValueFromPointer'](argv);
158+
var v = type['readValueFromPointer'](arg);
159159
return Emval.toHandle(v);
160160
},
161161

src/jsifier.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,15 @@ function runJSify(functionsOnly) {
101101
// to double (this limits the range to int53).
102102
// And convert the return value if the function returns a pointer.
103103
return modifyFunction(snippet, (name, args, body) => {
104-
const argNames = args.split(',');
104+
let argLines = args.split('\n');
105+
argLines = argLines.map((line) => line.split('//')[0]);
106+
const argNames = argLines.join(' ').split(',').map((name) => name.trim());
105107
let newArgs = [];
106108
let argConvertions = '';
107109
for (let i = 1; i < sig.length; i++) {
108110
const name = argNames[i - 1];
109111
if (sig[i] == 'p') {
110-
argConvertions += `${name} = Number(${name})\n`;
112+
argConvertions += ` ${name} = Number(${name});\n`;
111113
newArgs.push(`Number(${name})`);
112114
} else {
113115
newArgs.push(name);
@@ -130,7 +132,7 @@ function ${name}(${args}) {
130132
// before executing the function body.
131133
return `\
132134
function ${name}(${args}) {
133-
${argConvertions};
135+
${argConvertions}
134136
${body};
135137
}`;
136138
});

src/library.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ mergeInto(LibraryManager.library, {
167167
'$emscripten_realloc_buffer',
168168
#endif
169169
],
170+
emscripten_resize_heap: 'ip',
170171
emscripten_resize_heap: function(requestedSize) {
171172
var oldSize = HEAPU8.length;
172173
requestedSize = requestedSize >>> 0;

tests/test_core.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7442,7 +7442,6 @@ def test_embind_unsigned(self):
74427442
self.emcc_args += ['-lembind']
74437443
self.do_run_in_out_file_test('embind/test_unsigned.cpp')
74447444

7445-
@no_wasm64('embind does not yet support MEMORY64')
74467445
def test_embind_val(self):
74477446
self.emcc_args += ['-lembind']
74487447
self.do_run_in_out_file_test('embind/test_val.cpp')
@@ -7451,7 +7450,6 @@ def test_embind_val_assignment(self):
74517450
err = self.expect_fail([EMCC, test_file('embind/test_val_assignment.cpp'), '-lembind', '-c'])
74527451
self.assertContained('candidate function not viable: expects an lvalue for object argument', err)
74537452

7454-
@no_wasm64('embind does not yet support MEMORY64')
74557453
def test_embind_dynamic_initialization(self):
74567454
self.emcc_args += ['-lembind']
74577455
self.do_run_in_out_file_test('embind/test_dynamic_initialization.cpp')

0 commit comments

Comments
 (0)