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:
@@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user