diff options
| -rw-r--r-- | README.md | 4 | ||||
| -rw-r--r-- | index.mjs | 49 | ||||
| -rw-r--r-- | php-wasm.c | 2 |
3 files changed, 49 insertions, 6 deletions
@@ -8,13 +8,13 @@ Article about this repo (Japanese): https://blog.nsfisis.dev/posts/2023-10-02/co ## Build ``` -$ docker build -t php-wasm . +$ docker build -t tiny-php.wasm . ``` ## Run ``` -$ echo 'echo "Hello, World!", PHP_EOL;' | docker run --rm -i php-wasm +$ echo 'echo "Hello, World!", PHP_EOL;' | docker run --rm -i tiny-php.wasm ``` ## License @@ -1,12 +1,57 @@ import { readFile } from 'node:fs/promises'; import PHPWasm from './php-wasm.mjs' +const PRELUDE = ` +define('STDIN', fopen('php://stdin', 'r')); +define('STDOUT', fopen('php://stdout', 'r')); +define('STDERR', fopen('php://stderr', 'r')); + +`; + const code = await readFile('/dev/stdin', { encoding: 'utf-8' }); -const { ccall } = await PHPWasm(); +const BUFFER_MAX = 1024 * 1024; // 1 MiB + +let stdoutPos = 0; // bytewise +const stdoutBuf = Buffer.alloc(BUFFER_MAX); +let stderrPos = 0; // bytewise +const stderrBuf = Buffer.alloc(BUFFER_MAX); + +const { ccall } = await PHPWasm({ + stdout: (asciiCode) => { + if (asciiCode === null) { + return; // flush + } + if (BUFFER_MAX <= stdoutPos) { + return; // ignore + } + stdoutBuf.writeUInt8( + asciiCode < 0 ? asciiCode + 256 : asciiCode, + stdoutPos++, + ); + }, + stderr: (asciiCode) => { + if (asciiCode === null) { + return; // flush + } + if (BUFFER_MAX <= stderrPos) { + return; // ignore + } + stderrBuf.writeUInt8( + asciiCode < 0 ? asciiCode + 256 : asciiCode, + stderrPos++, + ); + }, +}); const result = ccall( 'php_wasm_run', 'number', ['string'], - [code], + [PRELUDE + code], ); console.log(`result: ${result}`); + +console.log("stdout:"); +console.log(stdoutBuf.subarray(0, stdoutPos).toString()); + +console.log("stderr:"); +console.log(stderrBuf.subarray(0, stderrPos).toString()); @@ -15,9 +15,7 @@ int EMSCRIPTEN_KEEPALIVE php_wasm_run(const char* code) { PHP_EMBED_END_BLOCK(); - fprintf(stdout, "\n"); fflush(stdout); - fprintf(stderr, "\n"); fflush(stderr); return result == SUCCESS ? 0 : 1; |
