summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/wasm2js.h48
-rw-r--r--test/wasm2js/dynamicLibrary.2asm.js38
-rw-r--r--test/wasm2js/dynamicLibrary.2asm.js.opt38
-rw-r--r--test/wasm2js/emscripten-grow-no.2asm.js38
-rw-r--r--test/wasm2js/emscripten-grow-no.2asm.js.opt38
-rw-r--r--test/wasm2js/emscripten-grow-yes.2asm.js38
-rw-r--r--test/wasm2js/emscripten-grow-yes.2asm.js.opt38
-rw-r--r--test/wasm2js/emscripten.2asm.js40
-rw-r--r--test/wasm2js/emscripten.2asm.js.opt64
9 files changed, 208 insertions, 172 deletions
diff --git a/src/wasm2js.h b/src/wasm2js.h
index 802765b1a..b91056ae8 100644
--- a/src/wasm2js.h
+++ b/src/wasm2js.h
@@ -2247,26 +2247,28 @@ void Wasm2JSGlue::emitMemory(
return;
}
- auto expr = R"(
- function(mem) {
- var _mem = new Uint8Array(mem);
- return function(offset, s) {
- var bytes, i;
- if (typeof Buffer === 'undefined') {
- bytes = atob(s);
- for (i = 0; i < bytes.length; i++)
- _mem[offset + i] = bytes.charCodeAt(i);
- } else {
- bytes = Buffer.from(s, 'base64');
- for (i = 0; i < bytes.length; i++)
- _mem[offset + i] = bytes[i];
- }
- }
- }
- )";
-
- // var assign$name = ($expr)(mem$name);
- out << "var " << segmentWriter << " = (" << expr << ")(" << buffer << ");\n";
+ auto expr =
+ R"(for (var base64ReverseLookup = new Uint8Array(123/*'z'+1*/), i = 25; i >= 0; --i) {
+ base64ReverseLookup[48+i] = 52+i; // '0-9'
+ base64ReverseLookup[65+i] = i; // 'A-Z'
+ base64ReverseLookup[97+i] = 26+i; // 'a-z'
+ }
+ base64ReverseLookup[43] = 62; // '+'
+ base64ReverseLookup[47] = 63; // '/'
+ /** @noinline Inlining this function would mean expanding the base64 string 4x times in the source code, which Closure seems to be happy to do. */
+ function base64DecodeToExistingUint8Array(uint8Array, offset, b64) {
+ var b1, b2, i = 0, j = offset, bLength = b64.length, end = offset + (bLength*3>>2);
+ if (b64[bLength-2] == '=') --end;
+ if (b64[bLength-1] == '=') --end;
+ for (; i < bLength; i += 4, j += 3) {
+ b1 = base64ReverseLookup[b64.charCodeAt(i+1)];
+ b2 = base64ReverseLookup[b64.charCodeAt(i+2)];
+ uint8Array[j] = base64ReverseLookup[b64.charCodeAt(i)] << 2 | b1 >> 4;
+ if (j+1 < end) uint8Array[j+1] = b1 << 4 | b2 >> 2;
+ if (j+2 < end) uint8Array[j+2] = b2 << 6 | base64ReverseLookup[b64.charCodeAt(i+3)];
+ }
+ })";
+ out << expr << '\n';
auto globalOffset = [&](const Memory::Segment& segment) {
if (auto* c = segment.offset->dynCast<Const>()) {
@@ -2280,10 +2282,12 @@ void Wasm2JSGlue::emitMemory(
Fatal() << "non-constant offsets aren't supported yet\n";
};
+ out << "var bufferView = new Uint8Array(" << buffer << ");\n";
+
for (auto& seg : wasm.memory.segments) {
assert(!seg.isPassive && "passive segments not implemented yet");
- out << segmentWriter << "(" << globalOffset(seg) << ", \""
- << base64Encode(seg.data) << "\");\n";
+ out << "base64DecodeToExistingUint8Array(bufferView, " << globalOffset(seg)
+ << ", \"" << base64Encode(seg.data) << "\");\n";
}
}
diff --git a/test/wasm2js/dynamicLibrary.2asm.js b/test/wasm2js/dynamicLibrary.2asm.js
index 98332dead..9666eb5ae 100644
--- a/test/wasm2js/dynamicLibrary.2asm.js
+++ b/test/wasm2js/dynamicLibrary.2asm.js
@@ -50,23 +50,27 @@ function asmFunc(global, env, buffer) {
}
var memasmFunc = new ArrayBuffer(16777216);
-var assignasmFunc = (
- function(mem) {
- var _mem = new Uint8Array(mem);
- return function(offset, s) {
- var bytes, i;
- if (typeof Buffer === 'undefined') {
- bytes = atob(s);
- for (i = 0; i < bytes.length; i++)
- _mem[offset + i] = bytes.charCodeAt(i);
- } else {
- bytes = Buffer.from(s, 'base64');
- for (i = 0; i < bytes.length; i++)
- _mem[offset + i] = bytes[i];
- }
- }
+for (var base64ReverseLookup = new Uint8Array(123/*'z'+1*/), i = 25; i >= 0; --i) {
+ base64ReverseLookup[48+i] = 52+i; // '0-9'
+ base64ReverseLookup[65+i] = i; // 'A-Z'
+ base64ReverseLookup[97+i] = 26+i; // 'a-z'
+ }
+ base64ReverseLookup[43] = 62; // '+'
+ base64ReverseLookup[47] = 63; // '/'
+ /** @noinline Inlining this function would mean expanding the base64 string 4x times in the source code, which Closure seems to be happy to do. */
+ function base64DecodeToExistingUint8Array(uint8Array, offset, b64) {
+ var b1, b2, i = 0, j = offset, bLength = b64.length, end = offset + (bLength*3>>2);
+ if (b64[bLength-2] == '=') --end;
+ if (b64[bLength-1] == '=') --end;
+ for (; i < bLength; i += 4, j += 3) {
+ b1 = base64ReverseLookup[b64.charCodeAt(i+1)];
+ b2 = base64ReverseLookup[b64.charCodeAt(i+2)];
+ uint8Array[j] = base64ReverseLookup[b64.charCodeAt(i)] << 2 | b1 >> 4;
+ if (j+1 < end) uint8Array[j+1] = b1 << 4 | b2 >> 2;
+ if (j+2 < end) uint8Array[j+2] = b2 << 6 | base64ReverseLookup[b64.charCodeAt(i+3)];
}
- )(memasmFunc);
-assignasmFunc(memoryBase, "ZHluYW1pYyBkYXRh");
+ }
+var bufferView = new Uint8Array(memasmFunc);
+base64DecodeToExistingUint8Array(bufferView, memoryBase, "ZHluYW1pYyBkYXRh");
var retasmFunc = asmFunc({Math,Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,NaN,Infinity}, {abort:function() { throw new Error('abort'); }},memasmFunc);
export var baz = retasmFunc.baz;
diff --git a/test/wasm2js/dynamicLibrary.2asm.js.opt b/test/wasm2js/dynamicLibrary.2asm.js.opt
index 61669987f..28c547fb4 100644
--- a/test/wasm2js/dynamicLibrary.2asm.js.opt
+++ b/test/wasm2js/dynamicLibrary.2asm.js.opt
@@ -42,23 +42,27 @@ function asmFunc(global, env, buffer) {
}
var memasmFunc = new ArrayBuffer(16777216);
-var assignasmFunc = (
- function(mem) {
- var _mem = new Uint8Array(mem);
- return function(offset, s) {
- var bytes, i;
- if (typeof Buffer === 'undefined') {
- bytes = atob(s);
- for (i = 0; i < bytes.length; i++)
- _mem[offset + i] = bytes.charCodeAt(i);
- } else {
- bytes = Buffer.from(s, 'base64');
- for (i = 0; i < bytes.length; i++)
- _mem[offset + i] = bytes[i];
- }
- }
+for (var base64ReverseLookup = new Uint8Array(123/*'z'+1*/), i = 25; i >= 0; --i) {
+ base64ReverseLookup[48+i] = 52+i; // '0-9'
+ base64ReverseLookup[65+i] = i; // 'A-Z'
+ base64ReverseLookup[97+i] = 26+i; // 'a-z'
+ }
+ base64ReverseLookup[43] = 62; // '+'
+ base64ReverseLookup[47] = 63; // '/'
+ /** @noinline Inlining this function would mean expanding the base64 string 4x times in the source code, which Closure seems to be happy to do. */
+ function base64DecodeToExistingUint8Array(uint8Array, offset, b64) {
+ var b1, b2, i = 0, j = offset, bLength = b64.length, end = offset + (bLength*3>>2);
+ if (b64[bLength-2] == '=') --end;
+ if (b64[bLength-1] == '=') --end;
+ for (; i < bLength; i += 4, j += 3) {
+ b1 = base64ReverseLookup[b64.charCodeAt(i+1)];
+ b2 = base64ReverseLookup[b64.charCodeAt(i+2)];
+ uint8Array[j] = base64ReverseLookup[b64.charCodeAt(i)] << 2 | b1 >> 4;
+ if (j+1 < end) uint8Array[j+1] = b1 << 4 | b2 >> 2;
+ if (j+2 < end) uint8Array[j+2] = b2 << 6 | base64ReverseLookup[b64.charCodeAt(i+3)];
}
- )(memasmFunc);
-assignasmFunc(memoryBase, "ZHluYW1pYyBkYXRh");
+ }
+var bufferView = new Uint8Array(memasmFunc);
+base64DecodeToExistingUint8Array(bufferView, memoryBase, "ZHluYW1pYyBkYXRh");
var retasmFunc = asmFunc({Math,Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,NaN,Infinity}, {abort:function() { throw new Error('abort'); }},memasmFunc);
export var baz = retasmFunc.baz;
diff --git a/test/wasm2js/emscripten-grow-no.2asm.js b/test/wasm2js/emscripten-grow-no.2asm.js
index 92a99dfb7..d01645368 100644
--- a/test/wasm2js/emscripten-grow-no.2asm.js
+++ b/test/wasm2js/emscripten-grow-no.2asm.js
@@ -44,24 +44,28 @@ function asmFunc(global, env, buffer) {
};
}
-var writeSegment = (
- function(mem) {
- var _mem = new Uint8Array(mem);
- return function(offset, s) {
- var bytes, i;
- if (typeof Buffer === 'undefined') {
- bytes = atob(s);
- for (i = 0; i < bytes.length; i++)
- _mem[offset + i] = bytes.charCodeAt(i);
- } else {
- bytes = Buffer.from(s, 'base64');
- for (i = 0; i < bytes.length; i++)
- _mem[offset + i] = bytes[i];
- }
- }
+for (var base64ReverseLookup = new Uint8Array(123/*'z'+1*/), i = 25; i >= 0; --i) {
+ base64ReverseLookup[48+i] = 52+i; // '0-9'
+ base64ReverseLookup[65+i] = i; // 'A-Z'
+ base64ReverseLookup[97+i] = 26+i; // 'a-z'
+ }
+ base64ReverseLookup[43] = 62; // '+'
+ base64ReverseLookup[47] = 63; // '/'
+ /** @noinline Inlining this function would mean expanding the base64 string 4x times in the source code, which Closure seems to be happy to do. */
+ function base64DecodeToExistingUint8Array(uint8Array, offset, b64) {
+ var b1, b2, i = 0, j = offset, bLength = b64.length, end = offset + (bLength*3>>2);
+ if (b64[bLength-2] == '=') --end;
+ if (b64[bLength-1] == '=') --end;
+ for (; i < bLength; i += 4, j += 3) {
+ b1 = base64ReverseLookup[b64.charCodeAt(i+1)];
+ b2 = base64ReverseLookup[b64.charCodeAt(i+2)];
+ uint8Array[j] = base64ReverseLookup[b64.charCodeAt(i)] << 2 | b1 >> 4;
+ if (j+1 < end) uint8Array[j+1] = b1 << 4 | b2 >> 2;
+ if (j+2 < end) uint8Array[j+2] = b2 << 6 | base64ReverseLookup[b64.charCodeAt(i+3)];
}
- )(wasmMemory.buffer);
-writeSegment(1600, "YWJj");
+ }
+var bufferView = new Uint8Array(wasmMemory.buffer);
+base64DecodeToExistingUint8Array(bufferView, 1600, "YWJj");
return asmFunc({
'Int8Array': Int8Array,
'Int16Array': Int16Array,
diff --git a/test/wasm2js/emscripten-grow-no.2asm.js.opt b/test/wasm2js/emscripten-grow-no.2asm.js.opt
index 92a99dfb7..d01645368 100644
--- a/test/wasm2js/emscripten-grow-no.2asm.js.opt
+++ b/test/wasm2js/emscripten-grow-no.2asm.js.opt
@@ -44,24 +44,28 @@ function asmFunc(global, env, buffer) {
};
}
-var writeSegment = (
- function(mem) {
- var _mem = new Uint8Array(mem);
- return function(offset, s) {
- var bytes, i;
- if (typeof Buffer === 'undefined') {
- bytes = atob(s);
- for (i = 0; i < bytes.length; i++)
- _mem[offset + i] = bytes.charCodeAt(i);
- } else {
- bytes = Buffer.from(s, 'base64');
- for (i = 0; i < bytes.length; i++)
- _mem[offset + i] = bytes[i];
- }
- }
+for (var base64ReverseLookup = new Uint8Array(123/*'z'+1*/), i = 25; i >= 0; --i) {
+ base64ReverseLookup[48+i] = 52+i; // '0-9'
+ base64ReverseLookup[65+i] = i; // 'A-Z'
+ base64ReverseLookup[97+i] = 26+i; // 'a-z'
+ }
+ base64ReverseLookup[43] = 62; // '+'
+ base64ReverseLookup[47] = 63; // '/'
+ /** @noinline Inlining this function would mean expanding the base64 string 4x times in the source code, which Closure seems to be happy to do. */
+ function base64DecodeToExistingUint8Array(uint8Array, offset, b64) {
+ var b1, b2, i = 0, j = offset, bLength = b64.length, end = offset + (bLength*3>>2);
+ if (b64[bLength-2] == '=') --end;
+ if (b64[bLength-1] == '=') --end;
+ for (; i < bLength; i += 4, j += 3) {
+ b1 = base64ReverseLookup[b64.charCodeAt(i+1)];
+ b2 = base64ReverseLookup[b64.charCodeAt(i+2)];
+ uint8Array[j] = base64ReverseLookup[b64.charCodeAt(i)] << 2 | b1 >> 4;
+ if (j+1 < end) uint8Array[j+1] = b1 << 4 | b2 >> 2;
+ if (j+2 < end) uint8Array[j+2] = b2 << 6 | base64ReverseLookup[b64.charCodeAt(i+3)];
}
- )(wasmMemory.buffer);
-writeSegment(1600, "YWJj");
+ }
+var bufferView = new Uint8Array(wasmMemory.buffer);
+base64DecodeToExistingUint8Array(bufferView, 1600, "YWJj");
return asmFunc({
'Int8Array': Int8Array,
'Int16Array': Int16Array,
diff --git a/test/wasm2js/emscripten-grow-yes.2asm.js b/test/wasm2js/emscripten-grow-yes.2asm.js
index 0f29bccde..ef1169ea4 100644
--- a/test/wasm2js/emscripten-grow-yes.2asm.js
+++ b/test/wasm2js/emscripten-grow-yes.2asm.js
@@ -67,24 +67,28 @@ function asmFunc(global, env, buffer) {
};
}
-var writeSegment = (
- function(mem) {
- var _mem = new Uint8Array(mem);
- return function(offset, s) {
- var bytes, i;
- if (typeof Buffer === 'undefined') {
- bytes = atob(s);
- for (i = 0; i < bytes.length; i++)
- _mem[offset + i] = bytes.charCodeAt(i);
- } else {
- bytes = Buffer.from(s, 'base64');
- for (i = 0; i < bytes.length; i++)
- _mem[offset + i] = bytes[i];
- }
- }
+for (var base64ReverseLookup = new Uint8Array(123/*'z'+1*/), i = 25; i >= 0; --i) {
+ base64ReverseLookup[48+i] = 52+i; // '0-9'
+ base64ReverseLookup[65+i] = i; // 'A-Z'
+ base64ReverseLookup[97+i] = 26+i; // 'a-z'
+ }
+ base64ReverseLookup[43] = 62; // '+'
+ base64ReverseLookup[47] = 63; // '/'
+ /** @noinline Inlining this function would mean expanding the base64 string 4x times in the source code, which Closure seems to be happy to do. */
+ function base64DecodeToExistingUint8Array(uint8Array, offset, b64) {
+ var b1, b2, i = 0, j = offset, bLength = b64.length, end = offset + (bLength*3>>2);
+ if (b64[bLength-2] == '=') --end;
+ if (b64[bLength-1] == '=') --end;
+ for (; i < bLength; i += 4, j += 3) {
+ b1 = base64ReverseLookup[b64.charCodeAt(i+1)];
+ b2 = base64ReverseLookup[b64.charCodeAt(i+2)];
+ uint8Array[j] = base64ReverseLookup[b64.charCodeAt(i)] << 2 | b1 >> 4;
+ if (j+1 < end) uint8Array[j+1] = b1 << 4 | b2 >> 2;
+ if (j+2 < end) uint8Array[j+2] = b2 << 6 | base64ReverseLookup[b64.charCodeAt(i+3)];
}
- )(wasmMemory.buffer);
-writeSegment(1600, "YWJj");
+ }
+var bufferView = new Uint8Array(wasmMemory.buffer);
+base64DecodeToExistingUint8Array(bufferView, 1600, "YWJj");
return asmFunc({
'Int8Array': Int8Array,
'Int16Array': Int16Array,
diff --git a/test/wasm2js/emscripten-grow-yes.2asm.js.opt b/test/wasm2js/emscripten-grow-yes.2asm.js.opt
index 0f29bccde..ef1169ea4 100644
--- a/test/wasm2js/emscripten-grow-yes.2asm.js.opt
+++ b/test/wasm2js/emscripten-grow-yes.2asm.js.opt
@@ -67,24 +67,28 @@ function asmFunc(global, env, buffer) {
};
}
-var writeSegment = (
- function(mem) {
- var _mem = new Uint8Array(mem);
- return function(offset, s) {
- var bytes, i;
- if (typeof Buffer === 'undefined') {
- bytes = atob(s);
- for (i = 0; i < bytes.length; i++)
- _mem[offset + i] = bytes.charCodeAt(i);
- } else {
- bytes = Buffer.from(s, 'base64');
- for (i = 0; i < bytes.length; i++)
- _mem[offset + i] = bytes[i];
- }
- }
+for (var base64ReverseLookup = new Uint8Array(123/*'z'+1*/), i = 25; i >= 0; --i) {
+ base64ReverseLookup[48+i] = 52+i; // '0-9'
+ base64ReverseLookup[65+i] = i; // 'A-Z'
+ base64ReverseLookup[97+i] = 26+i; // 'a-z'
+ }
+ base64ReverseLookup[43] = 62; // '+'
+ base64ReverseLookup[47] = 63; // '/'
+ /** @noinline Inlining this function would mean expanding the base64 string 4x times in the source code, which Closure seems to be happy to do. */
+ function base64DecodeToExistingUint8Array(uint8Array, offset, b64) {
+ var b1, b2, i = 0, j = offset, bLength = b64.length, end = offset + (bLength*3>>2);
+ if (b64[bLength-2] == '=') --end;
+ if (b64[bLength-1] == '=') --end;
+ for (; i < bLength; i += 4, j += 3) {
+ b1 = base64ReverseLookup[b64.charCodeAt(i+1)];
+ b2 = base64ReverseLookup[b64.charCodeAt(i+2)];
+ uint8Array[j] = base64ReverseLookup[b64.charCodeAt(i)] << 2 | b1 >> 4;
+ if (j+1 < end) uint8Array[j+1] = b1 << 4 | b2 >> 2;
+ if (j+2 < end) uint8Array[j+2] = b2 << 6 | base64ReverseLookup[b64.charCodeAt(i+3)];
}
- )(wasmMemory.buffer);
-writeSegment(1600, "YWJj");
+ }
+var bufferView = new Uint8Array(wasmMemory.buffer);
+base64DecodeToExistingUint8Array(bufferView, 1600, "YWJj");
return asmFunc({
'Int8Array': Int8Array,
'Int16Array': Int16Array,
diff --git a/test/wasm2js/emscripten.2asm.js b/test/wasm2js/emscripten.2asm.js
index fd9cbc607..ac03d032d 100644
--- a/test/wasm2js/emscripten.2asm.js
+++ b/test/wasm2js/emscripten.2asm.js
@@ -202,25 +202,29 @@ function asmFunc(global, env, buffer) {
};
}
-var writeSegment = (
- function(mem) {
- var _mem = new Uint8Array(mem);
- return function(offset, s) {
- var bytes, i;
- if (typeof Buffer === 'undefined') {
- bytes = atob(s);
- for (i = 0; i < bytes.length; i++)
- _mem[offset + i] = bytes.charCodeAt(i);
- } else {
- bytes = Buffer.from(s, 'base64');
- for (i = 0; i < bytes.length; i++)
- _mem[offset + i] = bytes[i];
- }
- }
+for (var base64ReverseLookup = new Uint8Array(123/*'z'+1*/), i = 25; i >= 0; --i) {
+ base64ReverseLookup[48+i] = 52+i; // '0-9'
+ base64ReverseLookup[65+i] = i; // 'A-Z'
+ base64ReverseLookup[97+i] = 26+i; // 'a-z'
+ }
+ base64ReverseLookup[43] = 62; // '+'
+ base64ReverseLookup[47] = 63; // '/'
+ /** @noinline Inlining this function would mean expanding the base64 string 4x times in the source code, which Closure seems to be happy to do. */
+ function base64DecodeToExistingUint8Array(uint8Array, offset, b64) {
+ var b1, b2, i = 0, j = offset, bLength = b64.length, end = offset + (bLength*3>>2);
+ if (b64[bLength-2] == '=') --end;
+ if (b64[bLength-1] == '=') --end;
+ for (; i < bLength; i += 4, j += 3) {
+ b1 = base64ReverseLookup[b64.charCodeAt(i+1)];
+ b2 = base64ReverseLookup[b64.charCodeAt(i+2)];
+ uint8Array[j] = base64ReverseLookup[b64.charCodeAt(i)] << 2 | b1 >> 4;
+ if (j+1 < end) uint8Array[j+1] = b1 << 4 | b2 >> 2;
+ if (j+2 < end) uint8Array[j+2] = b2 << 6 | base64ReverseLookup[b64.charCodeAt(i+3)];
}
- )(wasmMemory.buffer);
-writeSegment(1024, "aGVsbG8sIHdvcmxkIQoAAJwMAAAtKyAgIDBYMHgAKG51bGwpAAAAAAAAAAAAAAAAEQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAETCQsLAAAJBgsAAAsABhEAAAAREREAAAAAAAAAAAAAAAAAAAAACwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAADAAAAAAJDAAAAAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAANAAAABA0AAAAACQ4AAAAAAA4AAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAADwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAASEhIAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAKAAAAAAoAAAAACQsAAAAAAAsAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGLTBYKzBYIDBYLTB4KzB4IDB4AGluZgBJTkYAbmFuAE5BTgAuAA==");
-writeSegment(1600, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=");
+ }
+var bufferView = new Uint8Array(wasmMemory.buffer);
+base64DecodeToExistingUint8Array(bufferView, 1024, "aGVsbG8sIHdvcmxkIQoAAJwMAAAtKyAgIDBYMHgAKG51bGwpAAAAAAAAAAAAAAAAEQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAETCQsLAAAJBgsAAAsABhEAAAAREREAAAAAAAAAAAAAAAAAAAAACwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAADAAAAAAJDAAAAAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAANAAAABA0AAAAACQ4AAAAAAA4AAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAADwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAASEhIAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAKAAAAAAoAAAAACQsAAAAAAAsAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGLTBYKzBYIDBYLTB4KzB4IDB4AGluZgBJTkYAbmFuAE5BTgAuAA==");
+base64DecodeToExistingUint8Array(bufferView, 1600, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=");
return asmFunc({
'Int8Array': Int8Array,
'Int16Array': Int16Array,
diff --git a/test/wasm2js/emscripten.2asm.js.opt b/test/wasm2js/emscripten.2asm.js.opt
index 84e33bb6f..f554f869a 100644
--- a/test/wasm2js/emscripten.2asm.js.opt
+++ b/test/wasm2js/emscripten.2asm.js.opt
@@ -183,37 +183,41 @@ function asmFunc(global, env, buffer) {
};
}
-var writeSegment = (
- function(mem) {
- var _mem = new Uint8Array(mem);
- return function(offset, s) {
- var bytes, i;
- if (typeof Buffer === 'undefined') {
- bytes = atob(s);
- for (i = 0; i < bytes.length; i++)
- _mem[offset + i] = bytes.charCodeAt(i);
- } else {
- bytes = Buffer.from(s, 'base64');
- for (i = 0; i < bytes.length; i++)
- _mem[offset + i] = bytes[i];
- }
- }
+for (var base64ReverseLookup = new Uint8Array(123/*'z'+1*/), i = 25; i >= 0; --i) {
+ base64ReverseLookup[48+i] = 52+i; // '0-9'
+ base64ReverseLookup[65+i] = i; // 'A-Z'
+ base64ReverseLookup[97+i] = 26+i; // 'a-z'
+ }
+ base64ReverseLookup[43] = 62; // '+'
+ base64ReverseLookup[47] = 63; // '/'
+ /** @noinline Inlining this function would mean expanding the base64 string 4x times in the source code, which Closure seems to be happy to do. */
+ function base64DecodeToExistingUint8Array(uint8Array, offset, b64) {
+ var b1, b2, i = 0, j = offset, bLength = b64.length, end = offset + (bLength*3>>2);
+ if (b64[bLength-2] == '=') --end;
+ if (b64[bLength-1] == '=') --end;
+ for (; i < bLength; i += 4, j += 3) {
+ b1 = base64ReverseLookup[b64.charCodeAt(i+1)];
+ b2 = base64ReverseLookup[b64.charCodeAt(i+2)];
+ uint8Array[j] = base64ReverseLookup[b64.charCodeAt(i)] << 2 | b1 >> 4;
+ if (j+1 < end) uint8Array[j+1] = b1 << 4 | b2 >> 2;
+ if (j+2 < end) uint8Array[j+2] = b2 << 6 | base64ReverseLookup[b64.charCodeAt(i+3)];
}
- )(wasmMemory.buffer);
-writeSegment(1024, "aGVsbG8sIHdvcmxkIQoAAJwMAAAtKyAgIDBYMHgAKG51bGwp");
-writeSegment(1072, "EQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAETCQsLAAAJBgsAAAsABhEAAAARERE=");
-writeSegment(1153, "CwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAAL");
-writeSegment(1211, "DA==");
-writeSegment(1223, "DAAAAAAMAAAAAAkMAAAAAAAMAAAM");
-writeSegment(1269, "Dg==");
-writeSegment(1281, "DQAAAAQNAAAAAAkOAAAAAAAOAAAO");
-writeSegment(1327, "EA==");
-writeSegment(1339, "DwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhIS");
-writeSegment(1394, "EgAAABISEgAAAAAAAAk=");
-writeSegment(1443, "Cw==");
-writeSegment(1455, "CgAAAAAKAAAAAAkLAAAAAAALAAAL");
-writeSegment(1501, "DA==");
-writeSegment(1513, "DAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGLTBYKzBYIDBYLTB4KzB4IDB4AGluZgBJTkYAbmFuAE5BTgAu");
+ }
+var bufferView = new Uint8Array(wasmMemory.buffer);
+base64DecodeToExistingUint8Array(bufferView, 1024, "aGVsbG8sIHdvcmxkIQoAAJwMAAAtKyAgIDBYMHgAKG51bGwp");
+base64DecodeToExistingUint8Array(bufferView, 1072, "EQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAETCQsLAAAJBgsAAAsABhEAAAARERE=");
+base64DecodeToExistingUint8Array(bufferView, 1153, "CwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAAL");
+base64DecodeToExistingUint8Array(bufferView, 1211, "DA==");
+base64DecodeToExistingUint8Array(bufferView, 1223, "DAAAAAAMAAAAAAkMAAAAAAAMAAAM");
+base64DecodeToExistingUint8Array(bufferView, 1269, "Dg==");
+base64DecodeToExistingUint8Array(bufferView, 1281, "DQAAAAQNAAAAAAkOAAAAAAAOAAAO");
+base64DecodeToExistingUint8Array(bufferView, 1327, "EA==");
+base64DecodeToExistingUint8Array(bufferView, 1339, "DwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhIS");
+base64DecodeToExistingUint8Array(bufferView, 1394, "EgAAABISEgAAAAAAAAk=");
+base64DecodeToExistingUint8Array(bufferView, 1443, "Cw==");
+base64DecodeToExistingUint8Array(bufferView, 1455, "CgAAAAAKAAAAAAkLAAAAAAALAAAL");
+base64DecodeToExistingUint8Array(bufferView, 1501, "DA==");
+base64DecodeToExistingUint8Array(bufferView, 1513, "DAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGLTBYKzBYIDBYLTB4KzB4IDB4AGluZgBJTkYAbmFuAE5BTgAu");
return asmFunc({
'Int8Array': Int8Array,
'Int16Array': Int16Array,