Skip to content

Commit 4e6019d

Browse files
committed
Replace env.sleep/now_ms shims with the time stdlib module.
1 parent 418235a commit 4e6019d

6 files changed

Lines changed: 39 additions & 47 deletions

File tree

engine/src/lib.rs

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -682,22 +682,6 @@ pub fn repl_new(source: &str, level: Level) -> Box<ReplState> {
682682
fn register_ffi_module(vm: &vm::VirtualMachine) {
683683
use rustpython::vm::PyObjectRef;
684684

685-
let sleep_fn = vm.new_function(
686-
"sleep",
687-
|ms: i64, vm: &vm::VirtualMachine| -> vm::PyResult {
688-
wasm_ffi::sleep_ms(ms);
689-
Ok(vm.ctx.none())
690-
},
691-
);
692-
693-
let now_ms_fn = vm.new_function("now_ms", |vm: &vm::VirtualMachine| -> PyObjectRef {
694-
let ms = std::time::SystemTime::now()
695-
.duration_since(std::time::UNIX_EPOCH)
696-
.map(|d| d.as_millis() as i64)
697-
.unwrap_or(0);
698-
vm.ctx.new_int(ms).into()
699-
});
700-
701685
let show_svg_fn = vm.new_function(
702686
"show_svg",
703687
|svg: String, vm: &vm::VirtualMachine| -> vm::PyResult {
@@ -777,8 +761,6 @@ fn register_ffi_module(vm: &vm::VirtualMachine) {
777761
);
778762

779763
let dict = vm.ctx.new_dict();
780-
dict.set_item("sleep", sleep_fn.into(), vm).unwrap();
781-
dict.set_item("now_ms", now_ms_fn.into(), vm).unwrap();
782764
dict.set_item("show_svg", show_svg_fn.into(), vm).unwrap();
783765
dict.set_item("get_key_event", get_key_event_fn.into(), vm)
784766
.unwrap();

engine/src/wasm_ffi.rs

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
#[cfg(target_arch = "wasm32")]
77
#[link(wasm_import_module = "env")]
88
unsafe extern "C" {
9-
fn sleep(ms: i64);
109
fn draw_svg(ptr: *const u8, len: usize);
1110
fn get_key_event(key_ptr: *mut u8, key_len: usize, mods_ptr: *mut u8) -> i32;
1211
fn text_width(
@@ -35,22 +34,6 @@ unsafe extern "C" {
3534
) -> f64;
3635
}
3736

38-
/// Block for `ms` milliseconds. On WASM, calls the host's env.sleep (which yields
39-
/// to the JS event loop and wakes early on Stop). On native, uses std::thread::sleep.
40-
pub fn sleep_ms(ms: i64) {
41-
if ms <= 0 {
42-
return;
43-
}
44-
#[cfg(target_arch = "wasm32")]
45-
unsafe {
46-
sleep(ms);
47-
}
48-
#[cfg(not(target_arch = "wasm32"))]
49-
{
50-
std::thread::sleep(std::time::Duration::from_millis(ms as u64));
51-
}
52-
}
53-
5437
/// Show an SVG image. On WASM, calls the env import; on native, prints to stdout.
5538
pub fn show_svg(svg: &str) {
5639
#[cfg(target_arch = "wasm32")]

lib/spython/system.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
11
import sys
22
import builtins
3+
import time as _time
4+
5+
6+
def sleep(ms: int) -> None:
7+
_time.sleep(ms / 1000.0)
8+
9+
10+
def now_ms() -> int:
11+
return int(_time.time() * 1000)
12+
313

414
try:
515
from _spython_ffi import (
6-
sleep,
7-
now_ms,
816
show_svg,
917
get_key_event,
1018
text_width,
@@ -14,13 +22,6 @@
1422
load_bitmap,
1523
) # type: ignore[import-not-found]
1624
except ImportError:
17-
import time as _time
18-
19-
def sleep(ms: int) -> None:
20-
_time.sleep(ms / 1000.0)
21-
22-
def now_ms() -> int:
23-
return int(_time.time() * 1000)
2425

2526
def show_svg(svg: str) -> None:
2627
print(svg)

typeshed_allowlist.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ os
2323
os.path
2424
re
2525
sys
26+
time
2627
types
2728
typing
2829
typing_extensions

wasm/tests/wasi.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,34 @@ export function makeWasi(options: WasiOptions) {
249249
path_filestat_get: (): number => WASI_ENOSYS,
250250
fd_prestat_get: (): number => WASI_EBADF,
251251
fd_prestat_dir_name: (): number => WASI_ENOSYS,
252-
poll_oneoff: (): number => WASI_ENOSYS,
252+
poll_oneoff: (
253+
inPtr: number,
254+
outPtr: number,
255+
nsubscriptions: number,
256+
neventsPtr: number,
257+
): number => {
258+
// Test polyfill: emit a clock event for the first clock subscription
259+
// (so std::thread::sleep / time.sleep don't panic), but skip the
260+
// actual block to keep tests fast.
261+
try {
262+
const dv = new DataView(buf());
263+
for (let i = 0; i < nsubscriptions; i++) {
264+
const o = inPtr + i * 48;
265+
const userdata = dv.getBigUint64(o, true);
266+
const tag = dv.getUint8(o + 8);
267+
if (tag !== 0) continue;
268+
const u8 = new Uint8Array(buf());
269+
u8.fill(0, outPtr, outPtr + 32);
270+
dv.setBigUint64(outPtr, userdata, true);
271+
dv.setInt32(neventsPtr, 1, true);
272+
return WASI_ESUCCESS;
273+
}
274+
dv.setInt32(neventsPtr, 0, true);
275+
return WASI_ESUCCESS;
276+
} catch {
277+
return WASI_ENOSYS;
278+
}
279+
},
253280
sched_yield: (): number => WASI_ESUCCESS,
254281
};
255282
}

wasm/tests/wasm_test.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,6 @@ function makeEnv(
6666
check_interrupt: (): number => {
6767
return interrupted ? 1 : 0;
6868
},
69-
sleep: (_ms: bigint): void => {},
70-
now_ms: (): bigint => BigInt(Date.now()),
7169
draw_svg: (ptr: number, len: number): void => {
7270
const b = new Uint8Array(getBuffer() as ArrayBuffer);
7371
svgs.push(decoder.decode(b.slice(ptr, ptr + len)));

0 commit comments

Comments
 (0)