From 85c72c8bc97d3dd67fd7d3ddd7dbf18c37d42d5b Mon Sep 17 00:00:00 2001 From: Delan Azabani Date: Fri, 25 Jul 2025 17:08:27 +0800 Subject: [PATCH] Expose ScriptEnvironmentPreparer to Rust Signed-off-by: Delan Azabani --- mozjs-sys/src/jsglue.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/mozjs-sys/src/jsglue.cpp b/mozjs-sys/src/jsglue.cpp index e7c65f912c..5b5ef09ca8 100644 --- a/mozjs-sys/src/jsglue.cpp +++ b/mozjs-sys/src/jsglue.cpp @@ -173,6 +173,21 @@ class RustJobQueue : public JS::JobQueue { } }; +struct RustEnvironmentPreparer : public js::ScriptEnvironmentPreparer { + JSContext* cx; + explicit RustEnvironmentPreparer(JSContext* cx) : cx(cx) {} + void invoke(JS::HandleObject global, Closure& closure) override { + MOZ_ASSERT(JS_IsGlobalObject(global)); + MOZ_ASSERT(!JS_IsExceptionPending(cx)); + + JSAutoRealm ar(cx, global); + // TODO: AutoReportException are(cx); + if (!closure(cx)) { + return; + } + } +}; + struct JSExternalStringCallbacksTraps { void (*latin1Finalize)(const void* privateData, JS::Latin1Char* chars); void (*utf16Finalize)(const void* privateData, char16_t* chars); @@ -1106,6 +1121,10 @@ JS::JobQueue* CreateJobQueue(const JobQueueTraps* aTraps, const void* aQueue, void DeleteJobQueue(JS::JobQueue* queue) { delete queue; } +void InitScriptEnvironmentPreparer(JSContext* cx) { + js::SetScriptEnvironmentPreparer(cx, new RustEnvironmentPreparer(cx)); +} + JSExternalStringCallbacks* CreateJSExternalStringCallbacks( const JSExternalStringCallbacksTraps* aTraps, void* privateData) { return new RustJSExternalStringCallbacks(*aTraps, privateData);