KJS test infrastructure: cache reference to global object and it's original state instead of evaluate them for each run

This commit is contained in:
Zalim Bashorov
2018-10-16 20:17:19 +03:00
parent 180215f3f8
commit 99a131d0ab
@@ -55,34 +55,33 @@ fun ScriptEngine.loadFile(path: String) {
} }
fun ScriptEngine.runAndRestoreContext( fun ScriptEngine.runAndRestoreContext(
globalObject: ScriptObjectMirror = eval("this") as ScriptObjectMirror,
originalState: Map<String, Any?> = globalObject.toMap(),
f: ScriptEngine.() -> Any? f: ScriptEngine.() -> Any?
): Any? { ): Any? {
val globalObject = eval("this") as ScriptObjectMirror
val before = globalObject.toMapWithAllMembers()
return try { return try {
this.f() this.f()
} finally { } finally {
val after = globalObject.toMapWithAllMembers() for (key in globalObject.keys) {
val diff = after.entries - before.entries globalObject[key] = originalState[key] ?: ScriptRuntime.UNDEFINED
diff.forEach {
globalObject[it.key] = before[it.key] ?: ScriptRuntime.UNDEFINED
} }
} }
} }
private fun ScriptObjectMirror.toMapWithAllMembers(): Map<String, Any?> = getOwnKeys(true).associate { it to this[it] }
abstract class AbstractNashornJsTestChecker { abstract class AbstractNashornJsTestChecker {
private var engineUsageCnt = 0 private var engineUsageCnt = 0
private var engineCache: ScriptEngine? = null private var engineCache: ScriptEngine? = null
private var globalObject: ScriptObjectMirror? = null
private var originalState: Map<String, Any?>? = null
protected val engine 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( fun check(
files: List<String>, files: List<String>,
@@ -119,12 +118,12 @@ abstract class AbstractNashornJsTestChecker {
// Recreate the engine once in a while // Recreate the engine once in a while
if (engineUsageCnt++ > 100) { if (engineUsageCnt++ > 100) {
engineUsageCnt = 0 engineUsageCnt = 0
engineCache = createScriptEngineForTest() engineCache = null
} }
beforeRun() beforeRun()
return engine.runAndRestoreContext { return engine.runAndRestoreContext(globalObject!!, originalState!!) {
files.forEach(engine::loadFile) files.forEach(engine::loadFile)
engine.f() engine.f()
} }