diff --git a/.gitignore b/.gitignore index aac1b9026..06b4db74f 100644 --- a/.gitignore +++ b/.gitignore @@ -60,3 +60,6 @@ typings/ lib/ package-lock.json + +# Generated polyfill binaries +packages/proposal-sign-extension-ops/src/polyfills/*.wasm diff --git a/package.json b/package.json index 242ad4119..4d17fdf3a 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,8 @@ "markdown-to-html": "0.0.13", "mocha": "4.0.1", "performance-now": "2.1.0", - "prettier": "1.9.2" + "prettier": "1.9.2", + "assemblyscript": "github:AssemblyScript/assemblyscript" }, "dependencies": { "babel-plugin-mamacro": "0.0.3", diff --git a/packages/helper-wasm-bytecode/src/index.js b/packages/helper-wasm-bytecode/src/index.js index c7f854cc3..1c17719b0 100644 --- a/packages/helper-wasm-bytecode/src/index.js +++ b/packages/helper-wasm-bytecode/src/index.js @@ -319,6 +319,13 @@ const symbolsByByte = { 0xba: createSymbolObject("convert_u/i64", "f64"), 0xbb: createSymbolObject("promote/f32", "f64"), + // Sign extension op proposal + 0xc0: createSymbolObject("extend8_s", "i32"), + 0xc1: createSymbolObject("extend16_s", "i32"), + 0xc2: createSymbolObject("extend8_s", "i64"), + 0xc3: createSymbolObject("extend16_s", "i64"), + 0xc4: createSymbolObject("extend32_s", "i64"), + 0xbc: createSymbolObject("reinterpret/f32", "i32"), 0xbd: createSymbolObject("reinterpret/f64", "i64"), 0xbe: createSymbolObject("reinterpret/i32", "f32"), diff --git a/packages/proposal-sign-extension-ops/README.md b/packages/proposal-sign-extension-ops/README.md new file mode 100644 index 000000000..17c7d5f28 --- /dev/null +++ b/packages/proposal-sign-extension-ops/README.md @@ -0,0 +1,4 @@ +# Sign extension proposal + + + diff --git a/packages/proposal-sign-extension-ops/package.json b/packages/proposal-sign-extension-ops/package.json new file mode 100644 index 000000000..6555a2358 --- /dev/null +++ b/packages/proposal-sign-extension-ops/package.json @@ -0,0 +1,35 @@ +{ + "name": "@webassemblyjs/proposal-sign-ops", + "version": "1.5.6", + "description": "", + "main": "lib/index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://github.com/xtuc/webassemblyjs.git" + }, + "publishConfig": { + "access": "public" + }, + "author": "Mauro Bringolf", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.5.6", + "@webassemblyjs/helper-buffer": "1.5.6", + "@webassemblyjs/helper-wasm-bytecode": "1.5.6", + "@webassemblyjs/helper-wasm-section": "1.5.6", + "@webassemblyjs/wasm-edit": "1.5.6", + "@webassemblyjs/wasm-gen": "1.5.6", + "@webassemblyjs/wasm-opt": "1.5.6", + "debug": "^3.1.0" + }, + "devDependencies": { + "@webassemblyjs/helper-test-framework": "1.5.6", + "@webassemblyjs/wast-parser": "1.5.6", + "@webassemblyjs/wasm-parser": "1.5.6", + "@webassemblyjs/wast-printer": "1.5.6", + "wabt": "1.0.0" + } +} diff --git a/packages/proposal-sign-extension-ops/src/index.js b/packages/proposal-sign-extension-ops/src/index.js new file mode 100644 index 000000000..f2811d629 --- /dev/null +++ b/packages/proposal-sign-extension-ops/src/index.js @@ -0,0 +1,91 @@ +import { traverse, callInstruction, numberLiteral } from "@webassemblyjs/ast"; +import { parse } from "@webassemblyjs/wast-parser"; +import { readFileSync } from "fs"; +import path from "path"; + +const funcFromWast = sourcePath => { + const ast = parse(readFileSync(sourcePath, "utf8")); + return ast.body[0].fields.find(f => f.type === "Func"); +}; + +class Polyfills { + constructor(startIndex) { + this.startIndex = startIndex; + + this.asts = { + i32_extend8_s: funcFromWast( + path.join(__dirname, "/polyfills/i32_extend8_s.wast") + ), + i32_extend16_s: funcFromWast( + path.join(__dirname, "/polyfills/i32_extend16_s.wast") + ), + i64_extend8_s: funcFromWast( + path.join(__dirname, "/polyfills/i64_extend8_s.wast") + ), + i64_extend16_s: funcFromWast( + path.join(__dirname, "/polyfills/i64_extend16_s.wast") + ), + i64_extend32_s: funcFromWast( + path.join(__dirname, "/polyfills/i64_extend32_s.wast") + ) + }; + + this.instructions = Object.keys(this.asts); + + this.index = {}; + + this.instructions.forEach(instrName => { + this.index[instrName] = -1; + }); + } + + replaceWith(path, instrName) { + if (this.index[instrName] === -1) { + this.index[instrName] = this.startIndex++; + } + + const index = this.index[instrName]; + path.replaceWith(callInstruction(numberLiteral(index, String(index)))); + } + + matchesInstruction(instrName) { + return this.instructions.includes(instrName); + } + + insertInto(ast) { + const funcsToPush = Object.keys(this.index) + .filter(instrName => this.index[instrName] >= 0) + .sort((x, y) => (this.index[x] > this.index[y] ? 1 : -1)) + .map(instrName => this.asts[instrName]); + + ast.body[0].fields.push(...funcsToPush); + } +} + +export function transformAst(ast) { + let numberOfFuncs = 0; + + const countFuncVisitor = { + Func() { + ++numberOfFuncs; + } + }; + + traverse(ast, countFuncVisitor); + + const polyfills = new Polyfills(numberOfFuncs); + + const signExtendVisitor = { + Instr(path) { + if (polyfills.matchesInstruction(path.node.id)) { + polyfills.replaceWith(path, path.node.id); + } + } + }; + + traverse(ast, signExtendVisitor); + + polyfills.insertInto(ast); + + return ast; +} diff --git a/packages/proposal-sign-extension-ops/src/polyfills/i32_extend16_s.wast b/packages/proposal-sign-extension-ops/src/polyfills/i32_extend16_s.wast new file mode 100644 index 000000000..45a3fb183 --- /dev/null +++ b/packages/proposal-sign-extension-ops/src/polyfills/i32_extend16_s.wast @@ -0,0 +1,16 @@ +(module + (type (func (param i32) (result i32))) + (func $i32_extend16_s (param i32) (result i32) + (get_local 0) + (i32.const -32768) + (i32.or) + (get_local 0) + (i32.const 32767) + (i32.and) + (get_local 0) + (i32.const 32768) + (i32.and) + (select) + ) + (export "i32_extend16_s" (func $i32_extend16_s)) +) diff --git a/packages/proposal-sign-extension-ops/src/polyfills/i32_extend8_s.wast b/packages/proposal-sign-extension-ops/src/polyfills/i32_extend8_s.wast new file mode 100644 index 000000000..78a7712a1 --- /dev/null +++ b/packages/proposal-sign-extension-ops/src/polyfills/i32_extend8_s.wast @@ -0,0 +1,16 @@ +(module + (type (func (param i32) (result i32))) + (func $i32_extend8_s (param i32) (result i32) + (get_local 0) + (i32.const -128) + (i32.or) + (get_local 0) + (i32.const 127) + (i32.and) + (get_local 0) + (i32.const 128) + (i32.and) + (select) + ) + (export "i32_extend8_s" (func $i32_extend8_s)) +) diff --git a/packages/proposal-sign-extension-ops/src/polyfills/i64_extend16_s.wast b/packages/proposal-sign-extension-ops/src/polyfills/i64_extend16_s.wast new file mode 100644 index 000000000..ac52c000b --- /dev/null +++ b/packages/proposal-sign-extension-ops/src/polyfills/i64_extend16_s.wast @@ -0,0 +1,18 @@ +(module + (type (func (param i64) (result i64))) + (func $i64_extend16_s (param i64) (result i64) + (get_local 0) + (i64.const -32768) + (i64.or) + (get_local 0) + (i64.const 32767) + (i64.and) + (get_local 0) + (i64.const 32768) + (i64.and) + (i64.const 0) + (i64.ne) + (select) + ) + (export "i64_extend16_s" (func $i64_extend16_s)) +) diff --git a/packages/proposal-sign-extension-ops/src/polyfills/i64_extend32_s.wast b/packages/proposal-sign-extension-ops/src/polyfills/i64_extend32_s.wast new file mode 100644 index 000000000..648d6b635 --- /dev/null +++ b/packages/proposal-sign-extension-ops/src/polyfills/i64_extend32_s.wast @@ -0,0 +1,18 @@ +(module + (type (func (param i64) (result i64))) + (func $i64_extend32_s (param i64) (result i64) + (get_local 0) + (i64.const -2147483648) + (i64.or) + (get_local 0) + (i64.const 2147483647) + (i64.and) + (get_local 0) + (i64.const 2147483648) + (i64.and) + (i64.const 0) + (i64.ne) + (select) + ) + (export "i64_extend32_s" (func $i64_extend32_s)) +) diff --git a/packages/proposal-sign-extension-ops/src/polyfills/i64_extend8_s.wast b/packages/proposal-sign-extension-ops/src/polyfills/i64_extend8_s.wast new file mode 100644 index 000000000..04cd1a2dc --- /dev/null +++ b/packages/proposal-sign-extension-ops/src/polyfills/i64_extend8_s.wast @@ -0,0 +1,18 @@ +(module + (type (func (param i64) (result i64))) + (func $i64_extend8_s (param i64) (result i64) + (get_local 0) + (i64.const -128) + (i64.or) + (get_local 0) + (i64.const 127) + (i64.and) + (get_local 0) + (i64.const 128) + (i64.and) + (i64.const 0) + (i64.ne) + (select) + ) + (export "i64_extend8_s" (func $i64_extend8_s)) +) diff --git a/packages/proposal-sign-extension-ops/test/exec.js b/packages/proposal-sign-extension-ops/test/exec.js new file mode 100644 index 000000000..034d85ac4 --- /dev/null +++ b/packages/proposal-sign-extension-ops/test/exec.js @@ -0,0 +1,54 @@ +const path = require("path"); +const wabt = require("wabt"); +const assert = require("assert"); + +const { readFileSync } = require("fs"); + +const polyfills = [ + { + name: "i32_extend8_s", + fixtures: [ + [0, 0], + [0x7f, 127], + [0x80, -128], + [0xff, -1], + [0x01234500, 0], + [0xfedcba80, -0x80], + [-1, -1] + ] + }, + { + name: "i32_extend16_s", + fixtures: [ + [0, 0], + [0x7fff, 32767], + [0x8000, -32768], + [0xffff, -1], + [0x01230000, 0], + [0xfedc8000, -0x8000], + [-1, -1] + ] + } +]; + +polyfills.forEach(p => { + p.path = path.join(__dirname, `../lib/polyfills/${p.name}.wast`); +}); + +polyfills.forEach(polyfill => { + describe(polyfill.path, () => { + const wast = readFileSync(polyfill.path, "utf8").trim(); + const wasm = wabt + .parseWat(polyfill.path, wast) + .toBinary({ write_debug_names: false }); + + it("should return correct values", () => { + return WebAssembly.instantiate(wasm.buffer).then(result => { + const polyfillFn = result.instance.exports[polyfill.name]; + polyfill.fixtures.forEach(([input, output]) => { + assert.equal(output, polyfillFn(input)); + }); + }); + }); + }); +}); diff --git a/packages/proposal-sign-extension-ops/test/index.js b/packages/proposal-sign-extension-ops/test/index.js new file mode 100644 index 000000000..23a18ac31 --- /dev/null +++ b/packages/proposal-sign-extension-ops/test/index.js @@ -0,0 +1,41 @@ +const { parse } = require("@webassemblyjs/wast-parser"); +const { print } = require("@webassemblyjs/wast-printer"); +const path = require("path"); + +const { + getFixtures, + compareStrings +} = require("@webassemblyjs/helper-test-framework"); +const { readFileSync, existsSync, writeFileSync } = require("fs"); + +const { transformAst } = require("../lib/"); + +const testCases = getFixtures( + path.join(__dirname, "./wast/"), + "/**/input.wast" +); + +testCases.forEach(testCase => { + describe(testCase, () => { + const input = readFileSync(testCase, "utf8").trim(); + + it("should transpile sign extension operators into functions correctly", () => { + const actualOutput = print(transformAst(parse(input))); + + if (!existsSync(path.join(path.dirname(testCase), "output.wast"))) { + writeFileSync( + path.join(path.dirname(testCase), "output.wast"), + actualOutput + ); + return; + } + + const expectedOutput = readFileSync( + path.join(path.dirname(testCase), "output.wast"), + "utf8" + ).trim(); + + compareStrings(actualOutput, expectedOutput); + }); + }); +}); diff --git a/packages/proposal-sign-extension-ops/test/wast/empty/input.wast b/packages/proposal-sign-extension-ops/test/wast/empty/input.wast new file mode 100644 index 000000000..4d181e6e6 --- /dev/null +++ b/packages/proposal-sign-extension-ops/test/wast/empty/input.wast @@ -0,0 +1,4 @@ +(module + (func) +) + diff --git a/packages/proposal-sign-extension-ops/test/wast/empty/output.wast b/packages/proposal-sign-extension-ops/test/wast/empty/output.wast new file mode 100644 index 000000000..4d181e6e6 --- /dev/null +++ b/packages/proposal-sign-extension-ops/test/wast/empty/output.wast @@ -0,0 +1,4 @@ +(module + (func) +) + diff --git a/packages/proposal-sign-extension-ops/test/wast/mixed/input.wast b/packages/proposal-sign-extension-ops/test/wast/mixed/input.wast new file mode 100644 index 000000000..91c7ff015 --- /dev/null +++ b/packages/proposal-sign-extension-ops/test/wast/mixed/input.wast @@ -0,0 +1,15 @@ +(module + (func (param i32) (result i32) + (get_local 0) + (i32_extend16_s) + (i32_extend8_s) + ) + (func (param i32) (result i32) + (get_local 0) + ) + (func (param i32) (result i32) + (get_local 0) + (i32_extend8_s) + ) +) + diff --git a/packages/proposal-sign-extension-ops/test/wast/mixed/output.wast b/packages/proposal-sign-extension-ops/test/wast/mixed/output.wast new file mode 100644 index 000000000..827a06c5b --- /dev/null +++ b/packages/proposal-sign-extension-ops/test/wast/mixed/output.wast @@ -0,0 +1,38 @@ +(module + (func (param i32) (result i32) + (get_local 0) + (call 3) + (call 4) + ) + (func (param i32) (result i32) + (get_local 0) + ) + (func (param i32) (result i32) + (get_local 0) + (call 4) + ) + (func $i32_extend16_s (param i32) (result i32) + (get_local 0) + (i32.const -32768) + (i32.or) + (get_local 0) + (i32.const 32767) + (i32.and) + (get_local 0) + (i32.const 32768) + (i32.and) + (select) + ) + (func $i32_extend8_s (param i32) (result i32) + (get_local 0) + (i32.const -128) + (i32.or) + (get_local 0) + (i32.const 127) + (i32.and) + (get_local 0) + (i32.const 128) + (i32.and) + (select) + ) +) diff --git a/packages/proposal-sign-extension-ops/test/wast/multiple-instruction-i32_extend16_s/input.wast b/packages/proposal-sign-extension-ops/test/wast/multiple-instruction-i32_extend16_s/input.wast new file mode 100644 index 000000000..ac66606a2 --- /dev/null +++ b/packages/proposal-sign-extension-ops/test/wast/multiple-instruction-i32_extend16_s/input.wast @@ -0,0 +1,14 @@ +(module + (func (param i32) (result i32) + (get_local 0) + (i32_extend16_s) + ) + (func (param i32) (result i32) + (get_local 0) + ) + (func (param i32) (result i32) + (get_local 0) + (i32_extend16_s) + ) +) + diff --git a/packages/proposal-sign-extension-ops/test/wast/multiple-instruction-i32_extend16_s/output.wast b/packages/proposal-sign-extension-ops/test/wast/multiple-instruction-i32_extend16_s/output.wast new file mode 100644 index 000000000..13f198a7b --- /dev/null +++ b/packages/proposal-sign-extension-ops/test/wast/multiple-instruction-i32_extend16_s/output.wast @@ -0,0 +1,25 @@ +(module + (func (param i32) (result i32) + (get_local 0) + (call 3) + ) + (func (param i32) (result i32) + (get_local 0) + ) + (func (param i32) (result i32) + (get_local 0) + (call 3) + ) + (func $i32_extend16_s (param i32) (result i32) + (get_local 0) + (i32.const -32768) + (i32.or) + (get_local 0) + (i32.const 32767) + (i32.and) + (get_local 0) + (i32.const 32768) + (i32.and) + (select) + ) +) diff --git a/packages/proposal-sign-extension-ops/test/wast/multiple-instruction-i32_extend8_s/input.wast b/packages/proposal-sign-extension-ops/test/wast/multiple-instruction-i32_extend8_s/input.wast new file mode 100644 index 000000000..d05cd70dd --- /dev/null +++ b/packages/proposal-sign-extension-ops/test/wast/multiple-instruction-i32_extend8_s/input.wast @@ -0,0 +1,15 @@ +(module + (func (param i32) (result i32) + (get_local 0) + (i32_extend8_s) + ) + (func (param i32) (result i32) + (get_local 0) + (i32_extend8_s) + ) + (func (param i32) (result i32) + (get_local 0) + (i32_extend8_s) + ) +) + diff --git a/packages/proposal-sign-extension-ops/test/wast/multiple-instruction-i32_extend8_s/output.wast b/packages/proposal-sign-extension-ops/test/wast/multiple-instruction-i32_extend8_s/output.wast new file mode 100644 index 000000000..f07f0095c --- /dev/null +++ b/packages/proposal-sign-extension-ops/test/wast/multiple-instruction-i32_extend8_s/output.wast @@ -0,0 +1,26 @@ +(module + (func (param i32) (result i32) + (get_local 0) + (call 3) + ) + (func (param i32) (result i32) + (get_local 0) + (call 3) + ) + (func (param i32) (result i32) + (get_local 0) + (call 3) + ) + (func $i32_extend8_s (param i32) (result i32) + (get_local 0) + (i32.const -128) + (i32.or) + (get_local 0) + (i32.const 127) + (i32.and) + (get_local 0) + (i32.const 128) + (i32.and) + (select) + ) +) diff --git a/packages/proposal-sign-extension-ops/test/wast/single-instruction-i32_extend16_s/input.wast b/packages/proposal-sign-extension-ops/test/wast/single-instruction-i32_extend16_s/input.wast new file mode 100644 index 000000000..ddbb8821c --- /dev/null +++ b/packages/proposal-sign-extension-ops/test/wast/single-instruction-i32_extend16_s/input.wast @@ -0,0 +1,7 @@ +(module + (func (param i32) (result i32) + (get_local 0) + (i32_extend16_s) + ) +) + diff --git a/packages/proposal-sign-extension-ops/test/wast/single-instruction-i32_extend16_s/output.wast b/packages/proposal-sign-extension-ops/test/wast/single-instruction-i32_extend16_s/output.wast new file mode 100644 index 000000000..6a69176ba --- /dev/null +++ b/packages/proposal-sign-extension-ops/test/wast/single-instruction-i32_extend16_s/output.wast @@ -0,0 +1,18 @@ +(module + (func (param i32) (result i32) + (get_local 0) + (call 1) + ) + (func $i32_extend16_s (param i32) (result i32) + (get_local 0) + (i32.const -32768) + (i32.or) + (get_local 0) + (i32.const 32767) + (i32.and) + (get_local 0) + (i32.const 32768) + (i32.and) + (select) + ) +) diff --git a/packages/proposal-sign-extension-ops/test/wast/single-instruction-i32_extend8_s/input.wast b/packages/proposal-sign-extension-ops/test/wast/single-instruction-i32_extend8_s/input.wast new file mode 100644 index 000000000..ec3a4b4cd --- /dev/null +++ b/packages/proposal-sign-extension-ops/test/wast/single-instruction-i32_extend8_s/input.wast @@ -0,0 +1,7 @@ +(module + (func (param i32) (result i32) + (get_local 0) + (i32_extend8_s) + ) +) + diff --git a/packages/proposal-sign-extension-ops/test/wast/single-instruction-i32_extend8_s/output.wast b/packages/proposal-sign-extension-ops/test/wast/single-instruction-i32_extend8_s/output.wast new file mode 100644 index 000000000..ffb292095 --- /dev/null +++ b/packages/proposal-sign-extension-ops/test/wast/single-instruction-i32_extend8_s/output.wast @@ -0,0 +1,18 @@ +(module + (func (param i32) (result i32) + (get_local 0) + (call 1) + ) + (func $i32_extend8_s (param i32) (result i32) + (get_local 0) + (i32.const -128) + (i32.or) + (get_local 0) + (i32.const 127) + (i32.and) + (get_local 0) + (i32.const 128) + (i32.and) + (select) + ) +) diff --git a/packages/proposal-sign-extension-ops/test/wast/single-instruction-i64_extend16_s/input.wast b/packages/proposal-sign-extension-ops/test/wast/single-instruction-i64_extend16_s/input.wast new file mode 100644 index 000000000..5870a7742 --- /dev/null +++ b/packages/proposal-sign-extension-ops/test/wast/single-instruction-i64_extend16_s/input.wast @@ -0,0 +1,7 @@ +(module + (func (param i64) (result i64) + (get_local 0) + (i64_extend16_s) + ) +) + diff --git a/packages/proposal-sign-extension-ops/test/wast/single-instruction-i64_extend16_s/output.wast b/packages/proposal-sign-extension-ops/test/wast/single-instruction-i64_extend16_s/output.wast new file mode 100644 index 000000000..8bcfd45c4 --- /dev/null +++ b/packages/proposal-sign-extension-ops/test/wast/single-instruction-i64_extend16_s/output.wast @@ -0,0 +1,20 @@ +(module + (func (param i64) (result i64) + (get_local 0) + (call 1) + ) + (func $i64_extend16_s (param i64) (result i64) + (get_local 0) + (i64.const -32768) + (i64.or) + (get_local 0) + (i64.const 32767) + (i64.and) + (get_local 0) + (i64.const 32768) + (i64.and) + (i64.const 0) + (i64.ne) + (select) + ) +) diff --git a/packages/proposal-sign-extension-ops/test/wast/single-instruction-i64_extend32_s/input.wast b/packages/proposal-sign-extension-ops/test/wast/single-instruction-i64_extend32_s/input.wast new file mode 100644 index 000000000..bc8aa90eb --- /dev/null +++ b/packages/proposal-sign-extension-ops/test/wast/single-instruction-i64_extend32_s/input.wast @@ -0,0 +1,7 @@ +(module + (func (param i64) (result i64) + (get_local 0) + (i64_extend32_s) + ) +) + diff --git a/packages/proposal-sign-extension-ops/test/wast/single-instruction-i64_extend32_s/output.wast b/packages/proposal-sign-extension-ops/test/wast/single-instruction-i64_extend32_s/output.wast new file mode 100644 index 000000000..455693bc5 --- /dev/null +++ b/packages/proposal-sign-extension-ops/test/wast/single-instruction-i64_extend32_s/output.wast @@ -0,0 +1,20 @@ +(module + (func (param i64) (result i64) + (get_local 0) + (call 1) + ) + (func $i64_extend32_s (param i64) (result i64) + (get_local 0) + (i64.const -2147483648) + (i64.or) + (get_local 0) + (i64.const 2147483647) + (i64.and) + (get_local 0) + (i64.const 2147483648) + (i64.and) + (i64.const 0) + (i64.ne) + (select) + ) +) diff --git a/packages/proposal-sign-extension-ops/test/wast/single-instruction-i64_extend8_s/input.wast b/packages/proposal-sign-extension-ops/test/wast/single-instruction-i64_extend8_s/input.wast new file mode 100644 index 000000000..044ce51d9 --- /dev/null +++ b/packages/proposal-sign-extension-ops/test/wast/single-instruction-i64_extend8_s/input.wast @@ -0,0 +1,7 @@ +(module + (func (param i64) (result i64) + (get_local 0) + (i64_extend8_s) + ) +) + diff --git a/packages/proposal-sign-extension-ops/test/wast/single-instruction-i64_extend8_s/output.wast b/packages/proposal-sign-extension-ops/test/wast/single-instruction-i64_extend8_s/output.wast new file mode 100644 index 000000000..91c2628c0 --- /dev/null +++ b/packages/proposal-sign-extension-ops/test/wast/single-instruction-i64_extend8_s/output.wast @@ -0,0 +1,20 @@ +(module + (func (param i64) (result i64) + (get_local 0) + (call 1) + ) + (func $i64_extend8_s (param i64) (result i64) + (get_local 0) + (i64.const -128) + (i64.or) + (get_local 0) + (i64.const 127) + (i64.and) + (get_local 0) + (i64.const 128) + (i64.and) + (i64.const 0) + (i64.ne) + (select) + ) +) diff --git a/scripts/build.sh b/scripts/build.sh index 651fec628..99f964870 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -29,6 +29,8 @@ for D in ./packages/*; do $OPTS & done + wait +cp -r packages/proposal-sign-extension-ops/src/polyfills packages/proposal-sign-extension-ops/lib/ cp -v packages/dce/src/libwabt.js packages/dce/lib/libwabt.js diff --git a/yarn.lock b/yarn.lock index 6e082d90b..261b58854 100644 --- a/yarn.lock +++ b/yarn.lock @@ -554,6 +554,10 @@ lodash "^4.17.5" to-fast-properties "^2.0.0" +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + "@yarnpkg/lockfile@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.0.0.tgz#33d1dbb659a23b81f87f048762b35a446172add3" @@ -707,6 +711,17 @@ asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" +"assemblyscript@github:AssemblyScript/assemblyscript": + version "0.5.0" + resolved "https://codeload.github.com/AssemblyScript/assemblyscript/tar.gz/9d25f78fc15d61cc180e55aa6d53636ec7350e6e" + dependencies: + "@protobufjs/utf8" "^1.1.0" + binaryen "48.0.0-nightly.20180520" + glob "^7.1.2" + long "^4.0.0" + minimist "^1.2.0" + ts-node "^6.0.3" + assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" @@ -807,6 +822,10 @@ binary-extensions@^1.0.0: buffers "~0.1.1" chainsaw "~0.1.0" +binaryen@48.0.0-nightly.20180520: + version "48.0.0-nightly.20180520" + resolved "https://registry.yarnpkg.com/binaryen/-/binaryen-48.0.0-nightly.20180520.tgz#24ce2172da6c6e44af97889fce5b1d96542db596" + bl@~0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/bl/-/bl-0.4.2.tgz#5db31d72f038c54e68adc39578125fe3b0addc96" @@ -954,7 +973,7 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" dependencies: @@ -1410,7 +1429,7 @@ diff@3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75" -diff@^3.2.0: +diff@^3.1.0, diff@^3.2.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" @@ -2587,6 +2606,10 @@ lodash@^4.15.0, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lo version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" @@ -2621,6 +2644,10 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" +make-error@^1.1.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535" + map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -3609,6 +3636,13 @@ sort-keys@^2.0.0: dependencies: is-plain-obj "^1.0.0" +source-map-support@^0.5.3: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" @@ -3619,6 +3653,10 @@ source-map@^0.5.0, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + spdx-correct@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" @@ -3891,6 +3929,19 @@ trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" +ts-node@^6.0.3: + version "6.0.5" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-6.0.5.tgz#977c1c931da7a2b09ae2930101f0104a5c2271e9" + dependencies: + arrify "^1.0.0" + chalk "^2.3.0" + diff "^3.1.0" + make-error "^1.1.1" + minimist "^1.2.0" + mkdirp "^0.5.1" + source-map-support "^0.5.3" + yn "^2.0.0" + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -4192,3 +4243,7 @@ yargs@~3.10.0: cliui "^2.1.0" decamelize "^1.0.0" window-size "0.1.0" + +yn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a"