Add history consistency check
This commit is contained in:
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(
|
||||
|
||||
Reference in New Issue
Block a user