Class ScriptEngines
java.lang.Object
scripting.ScriptEngines
集中式腳本引擎工廠 —— Track B(Nashorn → GraalJS)遷移的「引擎接縫」。
兩處引擎建立點(AbstractScriptManager.getInvocable(String, MapleClient) 與
PortalScriptManager)都向本類別取引擎,使引擎建立集中於一處。
C8 收尾(2026-06-02):正式環境 GraalJS-only、Nashorn-free
C0–C7 的「雙引擎並存 + 逐類別 rollout(portal→reactor→npc→quest→event)+ 黃金參考 differ」 全數完成後,本里程碑(C8)把所有類別一次切到 GraalJS 並拔除 Nashorn:
fresh()/fresh(String)一律建立 GraalJS 引擎 —— 不再有 backend 選擇、 不再有逐類別白名單(allowlist 機制已隨 C8 移除;回退方式為 git revert,非執行期開關)。nashorn-core:15.7已由build.gradle的implementation降為testImplementation→ src/ 不再 import 任何 Nashorn API 套件。黃金參考引擎的 建立點移入測試樹(test/scripting/GoldenReference),供*RolloutDifferTest續存比對。- map/ 與 special/ 兩類別在 C3–C7 期間始終留在 Nashorn(不在 rollout 白名單內),於 C8 首次切到
GraalJS;其執行緒模型與 npc/quest 相同(經
NPCScriptManager的 per-clientnpc_mutex序列化),correctness parity 由MapSpecialRolloutDifferTest把關。
安全性聲明(誠實)
newGraalEngine() 刻意關閉 GraalJS 沙箱(allowAllAccess),授予腳本對整個 JVM 的
無限制反射存取。這與 Nashorn 過去授予這 ~2,700 個「受信任的第一方伺服器內容」的信任等級
對等(非退步)。切勿用於執行不受信任的 JS。-
Method Summary
Modifier and TypeMethodDescriptionstatic ScriptEngineFactoryfactory()給將來可能需要 factory 形式的呼叫點(目前 PortalScriptManager 改用fresh(String))。static ScriptEnginefresh()全新 GraalJS 引擎。static ScriptEngine全新 GraalJS 引擎。static Invocableserialized(Invocable iv) 把一個 event 引擎的Invocable包成「序列化進入」代理:per-engine 一把ReentrantLock,橫跨整個invokeFunction/put/… 持鎖,滿足 GraalJS 「Context 禁止並發、但允許序列換執行緒」的契約。static LocktrackStructuralLock(Lock inner) 把EventInstanceManager的結構鎖(wL/rL)包成「會登記持有狀態」的Lock: 成功取得時 +1、釋放時 -1(per-thread 計數)。
-
Method Details
-
fresh
全新 GraalJS 引擎。 -
fresh
全新 GraalJS 引擎。path參數於 C8 後不再影響 backend 選擇(全域 GraalJS), 保留簽章供AbstractScriptManager/PortalScriptManager既有呼叫點。 -
serialized
把一個 event 引擎的Invocable包成「序列化進入」代理:per-engine 一把ReentrantLock,橫跨整個invokeFunction/put/… 持鎖,滿足 GraalJS 「Context 禁止並發、但允許序列換執行緒」的契約。只有 GraalJS 需要序列化:本方法只在底層引擎為
GraalJSScriptEngine時裝代理; 否則原樣回傳 iv(C8 後正式環境引擎一律為 GraalJS,此分歧僅在test/以 nashorn-core 黃金引擎 驗證代理契約時才走到)。回傳的代理同時實作ScriptEngine與Invocable,故EventScriptManager的(ScriptEngine) ivcast 與EventManager的iv.invokeFunction(...)皆可用。必須
ReentrantLock:排程方法體會同執行緒同步回呼另一 invoke (如 scheduledTimeout → dispose → playerExit),reentrant 才不自我死鎖。 -
trackStructuralLock
把EventInstanceManager的結構鎖(wL/rL)包成「會登記持有狀態」的Lock: 成功取得時 +1、釋放時 -1(per-thread 計數)。除此之外完全委派內層鎖,語意不變 (可重入、公平性、Condition 皆沿用內層ReentrantReadWriteLock的)。供EventInstanceManager的rL/wL欄位初始化使用。 -
factory
給將來可能需要 factory 形式的呼叫點(目前 PortalScriptManager 改用fresh(String))。
-