1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
// wasm2js.js - enough of a polyfill for the WebAssembly object so that we can load
// wasm2js code that way. Similar to the same file in emscripten, but tailored for
// fuzzing purposes here.
var WebAssembly = {
Memory: function(opts) {
return {
buffer: new ArrayBuffer(opts['initial'] * 64 * 1024),
grow: function(amount) {
var oldBuffer = this.buffer;
var ret = __growWasmMemory(amount);
assert(this.buffer !== oldBuffer); // the call should have updated us
return ret;
}
};
},
Table: function(opts) {
var ret = new Array(opts['initial']);
ret.grow = function(by) {
ret.push(null);
};
ret.set = function(i, func) {
ret[i] = func;
};
ret.get = function(i) {
return ret[i];
};
return ret;
},
Module: function(binary) {
// TODO: use the binary and info somehow - right now the wasm2js output is embedded in
// the main JS
return {};
},
Instance: function(module, info) {
// TODO: use the module and info somehow - right now the wasm2js output is embedded in
// the main JS
var decodeBase64 = typeof atob === 'function' ? atob : function (input) {
var keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
var output = '';
var chr1, chr2, chr3;
var enc1, enc2, enc3, enc4;
var i = 0;
// remove all characters that are not A-Z, a-z, 0-9, +, /, or =
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, '');
do {
enc1 = keyStr.indexOf(input.charAt(i++));
enc2 = keyStr.indexOf(input.charAt(i++));
enc3 = keyStr.indexOf(input.charAt(i++));
enc4 = keyStr.indexOf(input.charAt(i++));
chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;
output = output + String.fromCharCode(chr1);
if (enc3 !== 64) {
output = output + String.fromCharCode(chr2);
}
if (enc4 !== 64) {
output = output + String.fromCharCode(chr3);
}
} while (i < input.length);
return output;
};
var atob = decodeBase64;
// Additional imports
asmLibraryArg['__tempMemory__'] = 0; // risky!
// This will be replaced by the actual wasm2js code.
var exports = instantiate(asmLibraryArg, wasmMemory, wasmTable);
return {
'exports': exports
};
},
instantiate: function(binary, info) {
return {
then: function(ok, err) {
ok({
'instance': new WebAssembly.Instance(new WebAssembly.Module(binary, info))
});
}
};
}
};
var asmLibraryArg = {
};
var wasmMemory = new WebAssembly.Memory({ initial: 1 });
var wasmTable = new WebAssembly.Table({ initial: 1 });
|