Add history consistency check

This commit is contained in:
Ilya Muradyan
2020-04-21 16:17:36 +03:00
committed by Ilya Chernikov
parent e5ca572b91
commit ea1a6fbee7
@@ -29,6 +29,11 @@ class BasicJvmReplEvaluator(val scriptEvaluator: ScriptEvaluator = BasicJvmScrip
configuration: ScriptEvaluationConfiguration
): ResultWithDiagnostics<LinkedSnippet<KJvmEvaluatedSnippet>> {
if (!verifyHistoryConsistency(snippet))
return ResultWithDiagnostics.Failure(
ScriptDiagnostic(ScriptDiagnostic.unspecifiedError, "Snippet cannot be evaluated due to history mismatch")
)
val lastSnippetClass = history.lastItem()?.first
val historyBeforeSnippet = history.items.map { it.second }
val currentConfiguration = ScriptEvaluationConfiguration(configuration) {
@@ -61,6 +66,21 @@ class BasicJvmReplEvaluator(val scriptEvaluator: ScriptEvaluator = BasicJvmScrip
lastEvaluatedSnippet = newNode
return newNode.asSuccess(evalRes.reports)
}
private fun verifyHistoryConsistency(compiledSnippet: LinkedSnippet<out CompiledSnippet>): Boolean {
var compiled = compiledSnippet.previous
var evaluated = lastEvaluatedSnippet
while (compiled != null && evaluated != null) {
val evaluatedVal = evaluated.get()
if (evaluatedVal.compiledSnippet !== compiled.get())
return false
if (evaluatedVal.result.scriptClass == null)
return false
compiled = compiled.previous
evaluated = evaluated.previous
}
return compiled == null && evaluated == null
}
}
class KJvmEvaluatedSnippet(