From d1735577dc77f99a59858f28547d98d107786462 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Wed, 9 Oct 2024 13:29:36 +0200 Subject: [PATCH] More refactoring to enable Python pools We won't be able to import `UnsafeEval` directly from `builtin_wrappers.ts` so this adds a `setUnsafeEval` function to inject it from the outside. Similarly, we need everything imported from emscriptenSetup.ts to be bundled, so we don't want to import from topLevelEntropy in builtin_wrappers, so we call `setGetRandomValues` from the outside. --- src/pyodide/internal/builtin_wrappers.ts | 20 ++++++++++++++++++-- src/pyodide/internal/emscriptenSetup.ts | 5 +++++ src/pyodide/internal/python.ts | 10 +++++++++- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/pyodide/internal/builtin_wrappers.ts b/src/pyodide/internal/builtin_wrappers.ts index 9f45ff5f0d8..885a3a40b9e 100644 --- a/src/pyodide/internal/builtin_wrappers.ts +++ b/src/pyodide/internal/builtin_wrappers.ts @@ -1,5 +1,21 @@ -import { default as UnsafeEval } from 'internal:unsafe-eval'; -export { getRandomValues } from 'pyodide-internal:topLevelEntropy/lib'; +import type { getRandomValues as getRandomValuesType } from 'pyodide-internal:topLevelEntropy/lib'; +import type { default as UnsafeEvalType } from 'internal:unsafe-eval'; + +let getRandomValuesInner: typeof getRandomValuesType; +export function setGetRandomValues(func: typeof getRandomValuesType) { + getRandomValuesInner = func; +} + +export function getRandomValues(Module: Module, arr: Uint8Array): Uint8Array { + return getRandomValuesInner(Module, arr); +} + +// We can't import UnsafeEval directly here because it isn't available when setting up Python pool. +// Thus, we inject it from outside via this function. +let UnsafeEval: typeof UnsafeEvalType; +export function setUnsafeEval(mod: typeof UnsafeEvalType) { + UnsafeEval = mod; +} let lastTime: number; let lastDelta = 0; diff --git a/src/pyodide/internal/emscriptenSetup.ts b/src/pyodide/internal/emscriptenSetup.ts index 6931ddd5743..7f971494f35 100644 --- a/src/pyodide/internal/emscriptenSetup.ts +++ b/src/pyodide/internal/emscriptenSetup.ts @@ -13,6 +13,11 @@ import { reportError } from 'pyodide-internal:util'; */ import { _createPyodideModule } from 'pyodide-internal:generated/pyodide.asm'; +export { + setUnsafeEval, + setGetRandomValues, +} from 'pyodide-internal:builtin_wrappers'; + /** * A preRun hook. Make sure environment variables are visible at runtime. */ diff --git a/src/pyodide/internal/python.ts b/src/pyodide/internal/python.ts index 7cf7a2111a7..ea8e1e94bff 100644 --- a/src/pyodide/internal/python.ts +++ b/src/pyodide/internal/python.ts @@ -16,7 +16,9 @@ import { entropyMountFiles, entropyAfterRuntimeInit, entropyBeforeTopLevel, + getRandomValues, } from 'pyodide-internal:topLevelEntropy/lib'; +import { default as UnsafeEval } from 'internal:unsafe-eval'; /** * This file is a simplified version of the Pyodide loader: @@ -42,7 +44,11 @@ import pyodideWasmModule from 'pyodide-internal:generated/pyodide.asm.wasm'; * in this zip file to initialize their runtime state. */ import pythonStdlib from 'pyodide-internal:generated/python_stdlib.zip'; -import { instantiateEmscriptenModule } from 'pyodide-internal:emscriptenSetup'; +import { + instantiateEmscriptenModule, + setUnsafeEval, + setGetRandomValues, +} from 'pyodide-internal:emscriptenSetup'; /** * After running `instantiateEmscriptenModule` but before calling into any C @@ -83,6 +89,8 @@ export async function loadPyodide( pyodideWasmModule ) ); + setUnsafeEval(UnsafeEval); + setGetRandomValues(getRandomValues); await enterJaegerSpan('prepare_wasm_linear_memory', () => prepareWasmLinearMemory(Module) );