diff --git a/src/library_getvalue.js b/src/library_getvalue.js index 13a040a6c4b5a..9d5af93fd5787 100644 --- a/src/library_getvalue.js +++ b/src/library_getvalue.js @@ -12,7 +12,7 @@ var LibraryMemOps = { * @param {string} type */`, $setValue: function(ptr, value, type = 'i8') { - if (type.endsWith('*')) type = '{{{ POINTER_WASM_TYPE }}}'; + if (type.endsWith('*')) type = '*'; switch (type) { case 'i1': {{{ makeSetValue('ptr', '0', 'value', 'i1') }}}; break; case 'i8': {{{ makeSetValue('ptr', '0', 'value', 'i8') }}}; break; @@ -21,6 +21,7 @@ var LibraryMemOps = { case 'i64': {{{ makeSetValue('ptr', '0', 'value', 'i64') }}}; break; case 'float': {{{ makeSetValue('ptr', '0', 'value', 'float') }}}; break; case 'double': {{{ makeSetValue('ptr', '0', 'value', 'double') }}}; break; + case '*': {{{ makeSetValue('ptr', '0', 'value', '*') }}}; break; default: abort('invalid type for setValue: ' + type); } }, @@ -31,7 +32,7 @@ var LibraryMemOps = { * @param {string} type */`, $getValue: function(ptr, type = 'i8') { - if (type.endsWith('*')) type = '{{{ POINTER_WASM_TYPE }}}'; + if (type.endsWith('*')) type = '*'; switch (type) { case 'i1': return {{{ makeGetValue('ptr', '0', 'i1') }}}; case 'i8': return {{{ makeGetValue('ptr', '0', 'i8') }}}; @@ -40,6 +41,7 @@ var LibraryMemOps = { case 'i64': return {{{ makeGetValue('ptr', '0', 'i64') }}}; case 'float': return {{{ makeGetValue('ptr', '0', 'float') }}}; case 'double': return {{{ makeGetValue('ptr', '0', 'double') }}}; + case '*': return {{{ makeGetValue('ptr', '0', '*') }}}; default: abort('invalid type for getValue: ' + type); } return null; diff --git a/src/parseTools.js b/src/parseTools.js index 99886d5a6e7ed..e2eef1fc52939 100644 --- a/src/parseTools.js +++ b/src/parseTools.js @@ -411,7 +411,7 @@ function makeGetValue(ptr, pos, type, noNeedFirst, unsigned, ignore, align) { const slab = getHeapForType(type); let ret = slab + '[' + getHeapOffset(offset, type) + ']'; - if (slab.substr(slab.length - 2) == '64') { + if (MEMORY64 && isPointerType(type)) { ret = `Number(${ret})`; } return ret; diff --git a/tests/core/test_getValue_setValue.cpp b/tests/core/test_getValue_setValue.cpp index 4f16d39f0a22f..962a7a57ee190 100644 --- a/tests/core/test_getValue_setValue.cpp +++ b/tests/core/test_getValue_setValue.cpp @@ -3,25 +3,29 @@ // University of Illinois/NCSA Open Source License. Both these licenses can be // found in the LICENSE file. -#include +#include int main() { char buffer_char[8] = { 'x' }; - void* buffer_ptr[] = { (void*)0x12345678 }; -#ifdef DIRECT + int buffer_ptr[] = { 0x12345678, 0x77665544 }; EM_ASM({ +#ifdef DIRECT out('i32: ' + getValue($0, 'i32')); setValue($0, 1234, 'i32'); out('i32: ' + getValue($0, 'i32')); - out('ptr: 0x' + getValue($1, '*').toString(16)); - }, buffer_char, buffer_ptr); + i64 = getValue($1, 'i64'); + ptr = getValue($1, '*'); + out('i64: 0x' + i64.toString(16) + ' ' + typeof(i64)); + out('ptr: 0x' + ptr.toString(16) + ' ' + typeof(ptr)); #else - EM_ASM({ out('i32: ' + getValue($0, 'i32')); Module['setValue']($0, 1234, 'i32'); out('i32: ' + Module['getValue']($0, 'i32')); - out('ptr: 0x' + Module['getValue']($1, 'i32').toString(16)); - }, buffer_char, buffer_ptr); + i64 = Module['getValue']($1, 'i64'); + ptr = Module['getValue']($1, '*'); + out('i64: 0x' + i64.toString(16) + ' ' + typeof(i64)); + out('ptr: 0x' + ptr.toString(16) + ' ' + typeof(ptr)); #endif + }, buffer_char, buffer_ptr); } diff --git a/tests/core/test_getValue_setValue.out b/tests/core/test_getValue_setValue.out index 0f1bfe40d31dd..7ddde3db3e75b 100644 --- a/tests/core/test_getValue_setValue.out +++ b/tests/core/test_getValue_setValue.out @@ -1,3 +1,4 @@ i32: 120 i32: 1234 -ptr: 0x12345678 +i64: 0x12345678 number +ptr: 0x12345678 number diff --git a/tests/core/test_getValue_setValue64.out b/tests/core/test_getValue_setValue64.out new file mode 100644 index 0000000000000..eee6da0a8bd94 --- /dev/null +++ b/tests/core/test_getValue_setValue64.out @@ -0,0 +1,4 @@ +i32: 120 +i32: 1234 +i64: 0x7766554412345678 bigint +ptr: 0x7766554412345800 number diff --git a/tests/test_core.py b/tests/test_core.py index 0a4a1c00c93ed..793b5761d6161 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -7007,10 +7007,10 @@ def test_dyncall_specific(self, *args): def test_getValue_setValue(self): # these used to be exported, but no longer are by default - def test(output_prefix='', args=None, assert_returncode=0): - src = test_file('core/test_getValue_setValue.cpp') - expected = test_file('core/test_getValue_setValue' + output_prefix + '.out') - self.do_run_from_file(src, expected, assert_returncode=assert_returncode, emcc_args=args) + def test(out_suffix='', args=None, assert_returncode=0): + if not out_suffix and self.is_wasm64(): + out_suffix = '64' + self.do_run_in_out_file_test('core/test_getValue_setValue.cpp', out_suffix=out_suffix, assert_returncode=assert_returncode, emcc_args=args) # see that direct usage (not on module) works. we don't export, but the use # keeps it alive through JSDCE