commit 22dd345d419035bd442c37aa59440f7da1056c86 Author: DieMyst Date: Tue Mar 12 12:05:20 2019 +0300 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..da4b614 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.idea +build +node_modules \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..f709786 --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +To compile wasm file, run: +``` +npm run asbuild +``` + +Wasm files will be generated in `build` directory. \ No newline at end of file diff --git a/assembly/index.ts b/assembly/index.ts new file mode 100644 index 0000000..80f0344 --- /dev/null +++ b/assembly/index.ts @@ -0,0 +1,33 @@ +import "allocator/tlsf"; +//import "allocator/buddy"; +//import "allocator/arena"; + +export function allocate(size: i32) :i32 { + return memory.allocate(size); +} + +export function deallocate(ptr: i32, size: i32): void { + memory.free(ptr); +} + +export function invoke(ptr: i32, size: i32): i32 { + + let inputStr: string = String.fromUTF8(ptr, size); + + let str = "Hello, world! From user " + inputStr; + + let strLen: i32 = str.length; + let addr = memory.allocate(strLen + 4); + for (let i = 0; i < 4; i++) { + let b: u8 = (strLen >> i * 8) as u8 & 0xFF; + store(addr + i, b); + } + + let strAddr = addr + 4; + for (let i = 0; i < strLen; i++) { + let b: u8 = str.charCodeAt(i) as u8; + store(strAddr + i, b); + } + + return addr; +} \ No newline at end of file diff --git a/assembly/tsconfig.json b/assembly/tsconfig.json new file mode 100644 index 0000000..c614e5c --- /dev/null +++ b/assembly/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../node_modules/assemblyscript/std/assembly.json", + "include": [ + "./**/*.ts" + ] +} \ No newline at end of file diff --git a/index.js b/index.js new file mode 100644 index 0000000..fbf1823 --- /dev/null +++ b/index.js @@ -0,0 +1,6 @@ +const fs = require("fs"); +const compiled = new WebAssembly.Module(fs.readFileSync(__dirname + "/build/optimized.wasm")); +const imports = {}; +Object.defineProperty(module, "exports", { + get: () => new WebAssembly.Instance(compiled, imports).exports +}); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..b697706 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,155 @@ +{ + "name": "example", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", + "dev": true + }, + "assemblyscript": { + "version": "github:AssemblyScript/assemblyscript#d4114150601d4a4074f63ca75cda692c2045f591", + "from": "github:AssemblyScript/assemblyscript", + "dev": true, + "requires": { + "@protobufjs/utf8": "^1.1.0", + "binaryen": "72.0.0-nightly.20190308", + "glob": "^7.1.3", + "long": "^4.0.0", + "opencollective-postinstall": "^2.0.0", + "source-map-support": "^0.5.10" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "binaryen": { + "version": "72.0.0-nightly.20190308", + "resolved": "https://registry.npmjs.org/binaryen/-/binaryen-72.0.0-nightly.20190308.tgz", + "integrity": "sha512-aUa9Hc3rfvG/9GwUQBuxx1ApBZIOLSEv81nBgQ5ldq+yANenHO7Ml7m3bUrBbDLhIPX2+a26jei4+lLd7CGlJA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "opencollective-postinstall": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", + "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..27bfab6 --- /dev/null +++ b/package.json @@ -0,0 +1,16 @@ +{ + "name": "assemblyscript-helloworld", + "version": "0.0.1", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "asbuild:optimized": "asc assembly/index.ts -b build/optimized.wasm -t build/optimized.wat --sourceMap --validate --optimize --use abort=''", + "asbuild": "npm run asbuild:optimized" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "assemblyscript": "github:AssemblyScript/assemblyscript" + } +} \ No newline at end of file