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
|
configuration: ScriptEvaluationConfiguration
|
||||||
): ResultWithDiagnostics<LinkedSnippet<KJvmEvaluatedSnippet>> {
|
): 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 lastSnippetClass = history.lastItem()?.first
|
||||||
val historyBeforeSnippet = history.items.map { it.second }
|
val historyBeforeSnippet = history.items.map { it.second }
|
||||||
val currentConfiguration = ScriptEvaluationConfiguration(configuration) {
|
val currentConfiguration = ScriptEvaluationConfiguration(configuration) {
|
||||||
@@ -61,6 +66,21 @@ class BasicJvmReplEvaluator(val scriptEvaluator: ScriptEvaluator = BasicJvmScrip
|
|||||||
lastEvaluatedSnippet = newNode
|
lastEvaluatedSnippet = newNode
|
||||||
return newNode.asSuccess(evalRes.reports)
|
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(
|
class KJvmEvaluatedSnippet(
|
||||||
|
|||||||
Reference in New Issue
Block a user