From 010aaa32fb93c5033a698d7213469af02d76fef3 Mon Sep 17 00:00:00 2001 From: Katie Bell Date: Fri, 31 May 2024 17:58:46 +1000 Subject: [PATCH] gh-97747: Improvements to WASM browser REPL. (#97665) Improvements to WASM browser REPL. Adds a text box to write and run code outside the REPL, a stop button, and handling of Ctrl-D for EOF. --- Tools/wasm/python.html | 67 ++++++++++++++++++++++++++++++++++--- Tools/wasm/python.worker.js | 10 ++++-- 2 files changed, 69 insertions(+), 8 deletions(-) diff --git a/Tools/wasm/python.html b/Tools/wasm/python.html index 17ffa0ea8bf..81a035a5c4c 100644 --- a/Tools/wasm/python.html +++ b/Tools/wasm/python.html @@ -35,11 +35,12 @@

Simple REPL for Python WASM

-
+
+ +
+
The simple REPL provides a limited Python experience in the browser. diff --git a/Tools/wasm/python.worker.js b/Tools/wasm/python.worker.js index 1b794608fff..4ce4e16fc0f 100644 --- a/Tools/wasm/python.worker.js +++ b/Tools/wasm/python.worker.js @@ -19,18 +19,18 @@ class StdinBuffer { } stdin = () => { - if (this.numberOfCharacters + 1 === this.readIndex) { + while (this.numberOfCharacters + 1 === this.readIndex) { if (!this.sentNull) { // Must return null once to indicate we're done for now. this.sentNull = true return null } this.sentNull = false + // Prompt will reset this.readIndex to 1 this.prompt() } const char = this.buffer[this.readIndex] this.readIndex += 1 - // How do I send an EOF?? return char } } @@ -71,7 +71,11 @@ var Module = { onmessage = (event) => { if (event.data.type === 'run') { - // TODO: Set up files from event.data.files + if (event.data.files) { + for (const [filename, contents] of Object.entries(event.data.files)) { + Module.FS.writeFile(filename, contents) + } + } const ret = callMain(event.data.args) postMessage({ type: 'finished',