Skip to content

Commit c9ea251

Browse files
authored
Merge branch 'main' into webloop-browser-unsupported-methods
2 parents 163bd7c + 2438f08 commit c9ea251

10 files changed

Lines changed: 300 additions & 273 deletions

File tree

cpython/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ LIBFFIREPO=https://github.com/libffi/libffi
1515
LIBFFI_COMMIT=f08493d249d2067c8b3207ba46693dd858f95db3
1616

1717
HIWIREBUILD=$(ROOT)/build/hiwire
18-
HIWIREREPO=https://github.com/hoodmane/hiwire
18+
HIWIREREPO=https://github.com/pyodide/hiwire
1919
HIWIRE_COMMIT=6a1e67280a15d929ebeceee54a6358c9c8d5f697
2020

2121
ifdef CPYTHON_DEBUG

src/js/emscripten-settings.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import { ConfigType } from "./pyodide";
44
import { initializeNativeFS } from "./nativefs";
55
import { loadBinaryFile, getBinaryResponse } from "./compat";
6-
import { API, PreRunFunc, type Module, type FSType } from "./types";
6+
import { API, PreRunFunc, type PyodideModule, type FSType } from "./types";
77
import { getSentinelImport } from "generated/sentinel";
88

99
/**
@@ -122,7 +122,7 @@ function callFsInitHook(
122122
];
123123
}
124124

125-
function computeVersionTuple(Module: Module): [number, number, number] {
125+
function computeVersionTuple(Module: PyodideModule): [number, number, number] {
126126
const versionInt = Module.HEAPU32[Module._Py_Version >>> 2];
127127
const major = (versionInt >>> 24) & 0xff;
128128
const minor = (versionInt >>> 16) & 0xff;
@@ -144,7 +144,7 @@ function computeVersionTuple(Module: Module): [number, number, number] {
144144
*/
145145
function installStdlib(stdlibURL: string): PreRunFunc {
146146
const stdlibPromise: Promise<Uint8Array> = loadBinaryFile(stdlibURL);
147-
return async (Module: Module) => {
147+
return async (Module: PyodideModule) => {
148148
Module.API.pyVersionTuple = computeVersionTuple(Module);
149149
const [pymajor, pyminor] = Module.API.pyVersionTuple;
150150
Module.FS.mkdirTree("/lib");

src/js/nativefs.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { Module } from "./types";
1+
import { PyodideModule } from "./types";
22

33
/**
44
* @private
55
*/
6-
async function syncfs(m: Module, direction: boolean): Promise<void> {
6+
async function syncfs(m: PyodideModule, direction: boolean): Promise<void> {
77
return new Promise((resolve, reject) => {
88
m.FS.syncfs(direction, (err: any) => {
99
if (err) {
@@ -18,21 +18,21 @@ async function syncfs(m: Module, direction: boolean): Promise<void> {
1818
/**
1919
* @private
2020
*/
21-
export async function syncLocalToRemote(m: Module): Promise<void> {
21+
export async function syncLocalToRemote(m: PyodideModule): Promise<void> {
2222
return await syncfs(m, false);
2323
}
2424

2525
/**
2626
* @private
2727
*/
28-
export async function syncRemoteToLocal(m: Module): Promise<void> {
28+
export async function syncRemoteToLocal(m: PyodideModule): Promise<void> {
2929
return await syncfs(m, true);
3030
}
3131

3232
/**
3333
* @private
3434
*/
35-
export function initializeNativeFS(module: Module) {
35+
export function initializeNativeFS(module: PyodideModule) {
3636
const FS = module.FS;
3737
const MEMFS = module.FS.filesystems.MEMFS;
3838
const PATH = module.PATH;

src/js/pyodide.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { version as version_ } from "./version";
1616
import type { PyodideAPI } from "./api.js";
1717
import type {
1818
TypedArray,
19-
Module,
19+
PyodideModule,
2020
PackageData,
2121
FSType,
2222
Lockfile,
@@ -40,7 +40,7 @@ export const version: string = version_;
4040

4141
declare function _createPyodideModule(
4242
settings: EmscriptenSettings,
43-
): Promise<Module>;
43+
): Promise<PyodideModule>;
4444

4545
// BUILD_ID is generated from hashing together pyodide.asm.js and
4646
// pyodide.asm.wasm in esbuild.config.outer.mjs

src/js/types.ts

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export type TypedArray =
2121
| Float64Array;
2222

2323
declare global {
24-
export var Module: Module;
24+
export var Module: PyodideModule;
2525
export var API: API;
2626
}
2727

@@ -263,7 +263,7 @@ interface PyodideFSType {
263263
export type FSType = Omit<typeof FS, "lookupPath"> & PyodideFSType;
264264

265265
/** @hidden */
266-
export type PreRunFunc = (Module: Module) => void;
266+
export type PreRunFunc = (Module: PyodideModule) => void;
267267

268268
type DSO = any;
269269

@@ -274,13 +274,8 @@ export interface LDSO {
274274
};
275275
}
276276

277-
/**
278-
* TODO: consider renaming the type to ModuleType to avoid name collisions
279-
* between Module and ModuleType?
280-
* @hidden
281-
*/
282-
export interface Module {
283-
API: API;
277+
/** @hidden */
278+
export interface EmscriptenModule {
284279
locateFile: (file: string) => string;
285280
exited?: { toThrow: any };
286281
ENV: { [key: string]: string };
@@ -298,6 +293,36 @@ export interface Module {
298293
ERRNO_CODES: { [k: string]: number };
299294
stringToNewUTF8(x: string): number;
300295
stringToUTF8OnStack: (str: string) => number;
296+
HEAP8: Uint8Array;
297+
HEAPU32: Uint32Array;
298+
getExceptionMessage(e: number): [string, string];
299+
exitCode: number | undefined;
300+
ExitStatus: { new (exitCode: number): Error };
301+
_free: (ptr: number) => void;
302+
stackSave: () => number;
303+
stackRestore: (ptr: number) => void;
304+
promiseMap: {
305+
free(id: number): void;
306+
};
307+
_emscripten_dlopen_promise(lib: number, flags: number): number;
308+
_dlerror(): number;
309+
UTF8ToString: (
310+
ptr: number,
311+
maxBytesToRead: number,
312+
ignoreNul?: boolean,
313+
) => string;
314+
}
315+
316+
/** @hidden */
317+
export interface PythonModule extends EmscriptenModule {
318+
_Py_EMSCRIPTEN_SIGNAL_HANDLING: number;
319+
Py_EmscriptenSignalBuffer: TypedArray;
320+
_Py_Version: number;
321+
}
322+
323+
/** @hidden */
324+
export interface PyodideModule extends PythonModule {
325+
API: API;
301326
_compat_to_string_repr: number;
302327
_compat_null_to_none: number;
303328
js2python_convert: (
@@ -312,36 +337,16 @@ export interface Module {
312337
},
313338
) => any;
314339
_PropagatePythonError: typeof Error;
315-
_Py_EMSCRIPTEN_SIGNAL_HANDLING: number;
316-
Py_EmscriptenSignalBuffer: TypedArray;
317-
HEAP8: Uint8Array;
318-
HEAPU32: Uint32Array;
319340
__hiwire_get(a: number): any;
320341
__hiwire_set(a: number, b: any): void;
321342
__hiwire_immortal_add(a: any): void;
322343
_jslib_init(): number;
323344
_init_pyodide_proxy(): number;
324-
getExceptionMessage(e: number): [string, string];
345+
325346
handle_js_error(e: any): void;
326-
exitCode: number | undefined;
327-
ExitStatus: { new (exitCode: number): Error };
328-
_Py_Version: number;
329347
_print_stdout: (ptr: number) => void;
330348
_print_stderr: (ptr: number) => void;
331-
_free: (ptr: number) => void;
332-
stackSave: () => number;
333-
stackRestore: (ptr: number) => void;
334-
promiseMap: {
335-
free(id: number): void;
336-
};
337-
_emscripten_dlopen_promise(lib: number, flags: number): number;
338349
getPromise(p: number): Promise<any>;
339-
_dlerror(): number;
340-
UTF8ToString: (
341-
ptr: number,
342-
maxBytesToRead: number,
343-
ignoreNul?: boolean,
344-
) => string;
345350
}
346351

347352
/**
@@ -579,7 +584,7 @@ export type PackageManagerAPI = Pick<
579584
* @hidden
580585
*/
581586
export type PackageManagerModule = Pick<
582-
Module,
587+
PyodideModule,
583588
| "PATH"
584589
| "LDSO"
585590
| "stringToNewUTF8"

src/tests/test_asyncio.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -332,20 +332,18 @@ def test_eval_code_await_error(selenium):
332332
)
333333

334334

335+
@run_in_pyodide
335336
def test_ensure_future_memleak(selenium):
336-
selenium.run_js(
337-
"""
338-
self.o = { "xxx" : 777 };
339-
pyodide.runPython(`
340-
import asyncio
341-
from js import o
342-
async def test():
343-
return o
344-
asyncio.ensure_future(test())
345-
None
346-
`);
347-
"""
348-
)
337+
import asyncio
338+
339+
from pyodide.code import run_js
340+
341+
o = run_js("() => ({ xxx: 777 })")()
342+
343+
async def test():
344+
return o
345+
346+
asyncio.ensure_future(test())
349347

350348

351349
def test_await_pyproxy_eval_async(selenium):

src/tests/test_filesystem.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,23 +28,23 @@ def test_idbfs_persist_code(selenium_standalone):
2828
pyodide.FS.mount(pyodide.FS.filesystems.{fstype}, {{root : "."}}, mountDir);
2929
"""
3030
)
31-
# create file in mount
32-
selenium.run_js(
33-
f"""
34-
pyodide.runPython(`
35-
import pathlib
36-
p = pathlib.Path('{mount_dir}/test_idbfs/__init__.py')
37-
p.parent.mkdir(exist_ok=True, parents=True)
38-
p.write_text("def test(): return 7")
39-
from importlib import invalidate_caches
40-
invalidate_caches()
41-
import sys
42-
sys.path.append('{mount_dir}')
43-
from test_idbfs import test
44-
assert test() == 7
45-
`);
46-
"""
47-
)
31+
32+
@run_in_pyodide
33+
def create_test_file(selenium_module, mount_dir):
34+
import sys
35+
from importlib import invalidate_caches
36+
from pathlib import Path
37+
38+
p = Path(f"{mount_dir}/test_idbfs/__init__.py")
39+
p.parent.mkdir(exist_ok=True, parents=True)
40+
p.write_text("def test(): return 7")
41+
invalidate_caches()
42+
sys.path.append(mount_dir)
43+
from test_idbfs import test
44+
45+
assert test() == 7
46+
47+
create_test_file(selenium, mount_dir)
4848
# sync TO idbfs
4949
selenium.run_js(
5050
"""

0 commit comments

Comments
 (0)