mirror of
https://github.com/python/cpython.git
synced 2025-11-06 16:41:59 +00:00
This is useful for implementing proper `input()`. It requires the JavaScript engine to support the wasm JSPI spec which is now stage 4. It is supported on Chrome since version 137 and on Firefox and node behind a flag. We override the `__wasi_fd_read()` syscall with our own variant that checks for a readAsync operation. If it has it, we use our own async variant of `fd_read()`, otherwise we use the original `fd_read()`. We also add a variant of `FS.createDevice()` called `FS.createAsyncInputDevice()`. Finally, if JSPI is available, we wrap the `main()` symbol with `WebAssembly.promising()` so that we can stack switch from `fd_read()`. If JSPI is not available, attempting to read from an AsyncInputDevice will raise an `OSError`.
25 lines
849 B
Python
25 lines
849 B
Python
import unittest
|
|
from test.support import is_emscripten
|
|
|
|
if not is_emscripten:
|
|
raise unittest.SkipTest("Emscripten-only test")
|
|
|
|
from _testinternalcapi import emscripten_set_up_async_input_device
|
|
from pathlib import Path
|
|
|
|
|
|
class EmscriptenAsyncInputDeviceTest(unittest.TestCase):
|
|
def test_emscripten_async_input_device(self):
|
|
jspi_supported = emscripten_set_up_async_input_device()
|
|
p = Path("/dev/blah")
|
|
self.addCleanup(p.unlink)
|
|
if not jspi_supported:
|
|
with open(p, "r") as f:
|
|
self.assertRaises(OSError, f.readline)
|
|
return
|
|
|
|
with open(p, "r") as f:
|
|
for _ in range(10):
|
|
self.assertEqual(f.readline().strip(), "ab")
|
|
self.assertEqual(f.readline().strip(), "fi")
|
|
self.assertEqual(f.readline().strip(), "xy")
|