Skip to content

Commit 7d1ff56

Browse files
authored
wasm2js: export memory growth function only if memory growth is enabled (#2194)
Previously we tried to export it if the memory was exported, even if growth was not on, which caused an error.
1 parent 2d773d6 commit 7d1ff56

File tree

7 files changed

+388
-2
lines changed

7 files changed

+388
-2
lines changed

src/wasm2js.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -578,8 +578,10 @@ void Wasm2JSBuilder::addExports(Ref ast, Module* wasm) {
578578
Ref descs = ValueBuilder::makeObject();
579579
Ref growDesc = ValueBuilder::makeObject();
580580
ValueBuilder::appendToObjectWithQuotes(descs, IString("grow"), growDesc);
581-
ValueBuilder::appendToObjectWithQuotes(
582-
growDesc, IString("value"), ValueBuilder::makeName(WASM_MEMORY_GROW));
581+
if (wasm->memory.max > wasm->memory.initial) {
582+
ValueBuilder::appendToObjectWithQuotes(
583+
growDesc, IString("value"), ValueBuilder::makeName(WASM_MEMORY_GROW));
584+
}
583585
Ref bufferDesc = ValueBuilder::makeObject();
584586
Ref bufferGetter = ValueBuilder::makeFunction(IString(""));
585587
bufferGetter[3]->push_back(
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
function instantiate(asmLibraryArg, wasmMemory, wasmTable) {
2+
3+
function asmFunc(global, env, buffer) {
4+
"almost asm";
5+
var memory = env.memory;
6+
var HEAP8 = new global.Int8Array(buffer);
7+
var HEAP16 = new global.Int16Array(buffer);
8+
var HEAP32 = new global.Int32Array(buffer);
9+
var HEAPU8 = new global.Uint8Array(buffer);
10+
var HEAPU16 = new global.Uint16Array(buffer);
11+
var HEAPU32 = new global.Uint32Array(buffer);
12+
var HEAPF32 = new global.Float32Array(buffer);
13+
var HEAPF64 = new global.Float64Array(buffer);
14+
var Math_imul = global.Math.imul;
15+
var Math_fround = global.Math.fround;
16+
var Math_abs = global.Math.abs;
17+
var Math_clz32 = global.Math.clz32;
18+
var Math_min = global.Math.min;
19+
var Math_max = global.Math.max;
20+
var Math_floor = global.Math.floor;
21+
var Math_ceil = global.Math.ceil;
22+
var Math_sqrt = global.Math.sqrt;
23+
var abort = env.abort;
24+
var nan = global.NaN;
25+
var infinity = global.Infinity;
26+
// EMSCRIPTEN_START_FUNCS;
27+
// EMSCRIPTEN_END_FUNCS;
28+
var FUNCTION_TABLE = [];
29+
return {
30+
"memory": Object.create(Object.prototype, {
31+
"grow": {
32+
33+
},
34+
"buffer": {
35+
"get": function () {
36+
return buffer;
37+
}
38+
39+
}
40+
})
41+
};
42+
}
43+
44+
var writeSegment = (
45+
function(mem) {
46+
var _mem = new Uint8Array(mem);
47+
return function(offset, s) {
48+
var bytes;
49+
if (typeof Buffer === 'undefined') {
50+
bytes = atob(s);
51+
for (var i = 0; i < bytes.length; i++)
52+
_mem[offset + i] = bytes.charCodeAt(i);
53+
} else {
54+
bytes = Buffer.from(s, 'base64');
55+
for (var i = 0; i < bytes.length; i++)
56+
_mem[offset + i] = bytes[i];
57+
}
58+
}
59+
}
60+
)(wasmMemory.buffer);
61+
writeSegment(1600, "YWJj");
62+
return asmFunc({
63+
'Int8Array': Int8Array,
64+
'Int16Array': Int16Array,
65+
'Int32Array': Int32Array,
66+
'Uint8Array': Uint8Array,
67+
'Uint16Array': Uint16Array,
68+
'Uint32Array': Uint32Array,
69+
'Float32Array': Float32Array,
70+
'Float64Array': Float64Array,
71+
'NaN': NaN,
72+
'Infinity': Infinity,
73+
'Math': Math
74+
},
75+
asmLibraryArg,
76+
wasmMemory.buffer
77+
)
78+
79+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
function instantiate(asmLibraryArg, wasmMemory, wasmTable) {
2+
3+
function asmFunc(global, env, buffer) {
4+
"almost asm";
5+
var memory = env.memory;
6+
var HEAP8 = new global.Int8Array(buffer);
7+
var HEAP16 = new global.Int16Array(buffer);
8+
var HEAP32 = new global.Int32Array(buffer);
9+
var HEAPU8 = new global.Uint8Array(buffer);
10+
var HEAPU16 = new global.Uint16Array(buffer);
11+
var HEAPU32 = new global.Uint32Array(buffer);
12+
var HEAPF32 = new global.Float32Array(buffer);
13+
var HEAPF64 = new global.Float64Array(buffer);
14+
var Math_imul = global.Math.imul;
15+
var Math_fround = global.Math.fround;
16+
var Math_abs = global.Math.abs;
17+
var Math_clz32 = global.Math.clz32;
18+
var Math_min = global.Math.min;
19+
var Math_max = global.Math.max;
20+
var Math_floor = global.Math.floor;
21+
var Math_ceil = global.Math.ceil;
22+
var Math_sqrt = global.Math.sqrt;
23+
var abort = env.abort;
24+
var nan = global.NaN;
25+
var infinity = global.Infinity;
26+
// EMSCRIPTEN_START_FUNCS;
27+
// EMSCRIPTEN_END_FUNCS;
28+
var FUNCTION_TABLE = [];
29+
return {
30+
"memory": Object.create(Object.prototype, {
31+
"grow": {
32+
33+
},
34+
"buffer": {
35+
"get": function () {
36+
return buffer;
37+
}
38+
39+
}
40+
})
41+
};
42+
}
43+
44+
var writeSegment = (
45+
function(mem) {
46+
var _mem = new Uint8Array(mem);
47+
return function(offset, s) {
48+
var bytes;
49+
if (typeof Buffer === 'undefined') {
50+
bytes = atob(s);
51+
for (var i = 0; i < bytes.length; i++)
52+
_mem[offset + i] = bytes.charCodeAt(i);
53+
} else {
54+
bytes = Buffer.from(s, 'base64');
55+
for (var i = 0; i < bytes.length; i++)
56+
_mem[offset + i] = bytes[i];
57+
}
58+
}
59+
}
60+
)(wasmMemory.buffer);
61+
writeSegment(1600, "YWJj");
62+
return asmFunc({
63+
'Int8Array': Int8Array,
64+
'Int16Array': Int16Array,
65+
'Int32Array': Int32Array,
66+
'Uint8Array': Uint8Array,
67+
'Uint16Array': Uint16Array,
68+
'Uint32Array': Uint32Array,
69+
'Float32Array': Float32Array,
70+
'Float64Array': Float64Array,
71+
'NaN': NaN,
72+
'Infinity': Infinity,
73+
'Math': Math
74+
},
75+
asmLibraryArg,
76+
wasmMemory.buffer
77+
)
78+
79+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
(module
2+
(type $0 (func))
3+
(import "env" "memory" (memory $0 256 256))
4+
(data (i32.const 1600) "abc")
5+
(export "memory" (memory $0))
6+
)
7+
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
function instantiate(asmLibraryArg, wasmMemory, wasmTable) {
2+
3+
function asmFunc(global, env, buffer) {
4+
"almost asm";
5+
var memory = env.memory;
6+
var HEAP8 = new global.Int8Array(buffer);
7+
var HEAP16 = new global.Int16Array(buffer);
8+
var HEAP32 = new global.Int32Array(buffer);
9+
var HEAPU8 = new global.Uint8Array(buffer);
10+
var HEAPU16 = new global.Uint16Array(buffer);
11+
var HEAPU32 = new global.Uint32Array(buffer);
12+
var HEAPF32 = new global.Float32Array(buffer);
13+
var HEAPF64 = new global.Float64Array(buffer);
14+
var Math_imul = global.Math.imul;
15+
var Math_fround = global.Math.fround;
16+
var Math_abs = global.Math.abs;
17+
var Math_clz32 = global.Math.clz32;
18+
var Math_min = global.Math.min;
19+
var Math_max = global.Math.max;
20+
var Math_floor = global.Math.floor;
21+
var Math_ceil = global.Math.ceil;
22+
var Math_sqrt = global.Math.sqrt;
23+
var abort = env.abort;
24+
var nan = global.NaN;
25+
var infinity = global.Infinity;
26+
// EMSCRIPTEN_START_FUNCS;
27+
// EMSCRIPTEN_END_FUNCS;
28+
var FUNCTION_TABLE = [];
29+
function __wasm_memory_grow(pagesToAdd) {
30+
pagesToAdd = pagesToAdd | 0;
31+
var oldPages = __wasm_memory_size() | 0;
32+
var newPages = oldPages + pagesToAdd | 0;
33+
if ((oldPages < newPages) && (newPages < 65536)) {
34+
var newBuffer = new ArrayBuffer(Math_imul(newPages, 65536));
35+
var newHEAP8 = new global.Int8Array(newBuffer);
36+
newHEAP8.set(HEAP8);
37+
HEAP8 = newHEAP8;
38+
HEAP8 = new global.Int8Array(newBuffer);
39+
HEAP16 = new global.Int16Array(newBuffer);
40+
HEAP32 = new global.Int32Array(newBuffer);
41+
HEAPU8 = new global.Uint8Array(newBuffer);
42+
HEAPU16 = new global.Uint16Array(newBuffer);
43+
HEAPU32 = new global.Uint32Array(newBuffer);
44+
HEAPF32 = new global.Float32Array(newBuffer);
45+
HEAPF64 = new global.Float64Array(newBuffer);
46+
buffer = newBuffer;
47+
memory.buffer = newBuffer;
48+
}
49+
return oldPages;
50+
}
51+
52+
function __wasm_memory_size() {
53+
return buffer.byteLength / 65536 | 0;
54+
}
55+
56+
return {
57+
"memory": Object.create(Object.prototype, {
58+
"grow": {
59+
"value": __wasm_memory_grow
60+
},
61+
"buffer": {
62+
"get": function () {
63+
return buffer;
64+
}
65+
66+
}
67+
})
68+
};
69+
}
70+
71+
var writeSegment = (
72+
function(mem) {
73+
var _mem = new Uint8Array(mem);
74+
return function(offset, s) {
75+
var bytes;
76+
if (typeof Buffer === 'undefined') {
77+
bytes = atob(s);
78+
for (var i = 0; i < bytes.length; i++)
79+
_mem[offset + i] = bytes.charCodeAt(i);
80+
} else {
81+
bytes = Buffer.from(s, 'base64');
82+
for (var i = 0; i < bytes.length; i++)
83+
_mem[offset + i] = bytes[i];
84+
}
85+
}
86+
}
87+
)(wasmMemory.buffer);
88+
writeSegment(1600, "YWJj");
89+
return asmFunc({
90+
'Int8Array': Int8Array,
91+
'Int16Array': Int16Array,
92+
'Int32Array': Int32Array,
93+
'Uint8Array': Uint8Array,
94+
'Uint16Array': Uint16Array,
95+
'Uint32Array': Uint32Array,
96+
'Float32Array': Float32Array,
97+
'Float64Array': Float64Array,
98+
'NaN': NaN,
99+
'Infinity': Infinity,
100+
'Math': Math
101+
},
102+
asmLibraryArg,
103+
wasmMemory.buffer
104+
)
105+
106+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
function instantiate(asmLibraryArg, wasmMemory, wasmTable) {
2+
3+
function asmFunc(global, env, buffer) {
4+
"almost asm";
5+
var memory = env.memory;
6+
var HEAP8 = new global.Int8Array(buffer);
7+
var HEAP16 = new global.Int16Array(buffer);
8+
var HEAP32 = new global.Int32Array(buffer);
9+
var HEAPU8 = new global.Uint8Array(buffer);
10+
var HEAPU16 = new global.Uint16Array(buffer);
11+
var HEAPU32 = new global.Uint32Array(buffer);
12+
var HEAPF32 = new global.Float32Array(buffer);
13+
var HEAPF64 = new global.Float64Array(buffer);
14+
var Math_imul = global.Math.imul;
15+
var Math_fround = global.Math.fround;
16+
var Math_abs = global.Math.abs;
17+
var Math_clz32 = global.Math.clz32;
18+
var Math_min = global.Math.min;
19+
var Math_max = global.Math.max;
20+
var Math_floor = global.Math.floor;
21+
var Math_ceil = global.Math.ceil;
22+
var Math_sqrt = global.Math.sqrt;
23+
var abort = env.abort;
24+
var nan = global.NaN;
25+
var infinity = global.Infinity;
26+
// EMSCRIPTEN_START_FUNCS;
27+
// EMSCRIPTEN_END_FUNCS;
28+
var FUNCTION_TABLE = [];
29+
function __wasm_memory_grow(pagesToAdd) {
30+
pagesToAdd = pagesToAdd | 0;
31+
var oldPages = __wasm_memory_size() | 0;
32+
var newPages = oldPages + pagesToAdd | 0;
33+
if ((oldPages < newPages) && (newPages < 65536)) {
34+
var newBuffer = new ArrayBuffer(Math_imul(newPages, 65536));
35+
var newHEAP8 = new global.Int8Array(newBuffer);
36+
newHEAP8.set(HEAP8);
37+
HEAP8 = newHEAP8;
38+
HEAP8 = new global.Int8Array(newBuffer);
39+
HEAP16 = new global.Int16Array(newBuffer);
40+
HEAP32 = new global.Int32Array(newBuffer);
41+
HEAPU8 = new global.Uint8Array(newBuffer);
42+
HEAPU16 = new global.Uint16Array(newBuffer);
43+
HEAPU32 = new global.Uint32Array(newBuffer);
44+
HEAPF32 = new global.Float32Array(newBuffer);
45+
HEAPF64 = new global.Float64Array(newBuffer);
46+
buffer = newBuffer;
47+
memory.buffer = newBuffer;
48+
}
49+
return oldPages;
50+
}
51+
52+
function __wasm_memory_size() {
53+
return buffer.byteLength / 65536 | 0;
54+
}
55+
56+
return {
57+
"memory": Object.create(Object.prototype, {
58+
"grow": {
59+
"value": __wasm_memory_grow
60+
},
61+
"buffer": {
62+
"get": function () {
63+
return buffer;
64+
}
65+
66+
}
67+
})
68+
};
69+
}
70+
71+
var writeSegment = (
72+
function(mem) {
73+
var _mem = new Uint8Array(mem);
74+
return function(offset, s) {
75+
var bytes;
76+
if (typeof Buffer === 'undefined') {
77+
bytes = atob(s);
78+
for (var i = 0; i < bytes.length; i++)
79+
_mem[offset + i] = bytes.charCodeAt(i);
80+
} else {
81+
bytes = Buffer.from(s, 'base64');
82+
for (var i = 0; i < bytes.length; i++)
83+
_mem[offset + i] = bytes[i];
84+
}
85+
}
86+
}
87+
)(wasmMemory.buffer);
88+
writeSegment(1600, "YWJj");
89+
return asmFunc({
90+
'Int8Array': Int8Array,
91+
'Int16Array': Int16Array,
92+
'Int32Array': Int32Array,
93+
'Uint8Array': Uint8Array,
94+
'Uint16Array': Uint16Array,
95+
'Uint32Array': Uint32Array,
96+
'Float32Array': Float32Array,
97+
'Float64Array': Float64Array,
98+
'NaN': NaN,
99+
'Infinity': Infinity,
100+
'Math': Math
101+
},
102+
asmLibraryArg,
103+
wasmMemory.buffer
104+
)
105+
106+
}

0 commit comments

Comments
 (0)