From 99a131d0ab6fd2e6c26ca2542795971f05dfc91c Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Tue, 16 Oct 2018 20:17:19 +0300 Subject: [PATCH] KJS test infrastructure: cache reference to global object and it's original state instead of evaluate them for each run --- .../kotlin/js/test/NashornJsTestChecker.kt | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/NashornJsTestChecker.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/NashornJsTestChecker.kt index a8153e99523..6c7658f7605 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/NashornJsTestChecker.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/NashornJsTestChecker.kt @@ -55,34 +55,33 @@ fun ScriptEngine.loadFile(path: String) { } fun ScriptEngine.runAndRestoreContext( + globalObject: ScriptObjectMirror = eval("this") as ScriptObjectMirror, + originalState: Map = globalObject.toMap(), f: ScriptEngine.() -> Any? ): Any? { - val globalObject = eval("this") as ScriptObjectMirror - val before = globalObject.toMapWithAllMembers() - return try { this.f() } finally { - val after = globalObject.toMapWithAllMembers() - val diff = after.entries - before.entries - - - diff.forEach { - globalObject[it.key] = before[it.key] ?: ScriptRuntime.UNDEFINED + for (key in globalObject.keys) { + globalObject[key] = originalState[key] ?: ScriptRuntime.UNDEFINED } } } -private fun ScriptObjectMirror.toMapWithAllMembers(): Map = getOwnKeys(true).associate { it to this[it] } - abstract class AbstractNashornJsTestChecker { private var engineUsageCnt = 0 private var engineCache: ScriptEngine? = null + private var globalObject: ScriptObjectMirror? = null + private var originalState: Map? = null protected val engine - get() = engineCache ?: createScriptEngineForTest().also { engineCache = it } + get() = engineCache ?: createScriptEngineForTest().also { + engineCache = it + globalObject = it.eval("this") as ScriptObjectMirror + originalState = globalObject?.toMap() + } fun check( files: List, @@ -119,12 +118,12 @@ abstract class AbstractNashornJsTestChecker { // Recreate the engine once in a while if (engineUsageCnt++ > 100) { engineUsageCnt = 0 - engineCache = createScriptEngineForTest() + engineCache = null } beforeRun() - return engine.runAndRestoreContext { + return engine.runAndRestoreContext(globalObject!!, originalState!!) { files.forEach(engine::loadFile) engine.f() }