Published
Edited
Apr 12, 2019
13 stars
Insert cell
Insert cell
Insert cell
Insert cell
async function run(math) {
// Parse math
let compiledMath = [...compileMath(math)];
let { linear, ranges } = createLinear(compiledMath);
let linearBuffer = new Uint8Array(linear);
let module = await WebAssembly.compile(linearBuffer);
let instance = await WebAssembly.instantiate(module);
return {
result: await instance.exports.x(),
linear,
ranges
};
}
Insert cell
Insert cell
Insert cell
magicNumber = [0x00, 0x61, 0x73, 0x6d]
Insert cell
md`The magic number, as a string is… a null byte and then the letters 'a' 's' 'm'`
Insert cell
magicNumber.map(s => String.fromCharCode(s))
Insert cell
Insert cell
version = [0x01, 0x00, 0x00, 0x00]
Insert cell
Insert cell
functionName = 0x78
Insert cell
Insert cell
Insert cell
operators = ({
"+": 0x6a,
"-": 0x6b,
"*": 0x6c,
"/": 0x6d
})
Insert cell
function* compileMath(math) {
for (let elem of math.split(/\s+/).filter(Boolean)) {
if (operators[elem]) {
yield operators[elem];
} else {
const int = parseInt(elem);
if (!Number.isInteger(int))
throw new Error(`Invalid number provided: ${elem}`);
if (Math.abs(int) > Math.pow(2, 32))
throw new Error("Integer out of range");
yield 0x41;
yield* leb.encodeI32(int);
}
}
}
Insert cell
createLinear = compiledMath => {
let linear = [
...magicNumber,
...version,
0x01,
0x05,
0x01,
0x60,
0x00,
0x01,
0x7f,
0x03,
0x02,
0x01,
0x00,
0x07,
0x05,
0x01,
0x01,
functionName,
0x00,
0x00,
0x0a,
compiledMath.length + 4,
0x01,
compiledMath.length + 2,
0x00,
...compiledMath,
0x0b
];
let ranges = [
{
name: "magic number",
start: 0,
end: magicNumber.length
},
{
name: "version",
start: magicNumber.length,
end: magicNumber.length + version.length
},
{
name: "function name",
start: magicNumber.length + version.length + 15,
end: magicNumber.length + version.length + 16
},
{
name: "length",
start: magicNumber.length + version.length + 19,
end: magicNumber.length + version.length + 20
},
{
name: "length",
start: magicNumber.length + version.length + 21,
end: magicNumber.length + version.length + 22
},
{
name: "math",
start: magicNumber.length + version.length + 23,
end: magicNumber.length + version.length + 23 + compiledMath.length
}
].map((r, i) => ({ color: scheme[i], ...r }));
return { linear, ranges };
}
Insert cell
Insert cell
Insert cell
leb = require("https://file-cpxqhkvsbv.now.sh/")
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more