From ea1a6fbee7ac20b499d82637be5896730ff20be0 Mon Sep 17 00:00:00 2001 From: Ilya Muradyan Date: Tue, 21 Apr 2020 16:17:36 +0300 Subject: [PATCH] Add history consistency check --- .../experimental/jvm/BasicJvmReplEvaluator.kt | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/BasicJvmReplEvaluator.kt b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/BasicJvmReplEvaluator.kt index 2e200f26903..e5a612512ac 100644 --- a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/BasicJvmReplEvaluator.kt +++ b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/BasicJvmReplEvaluator.kt @@ -29,6 +29,11 @@ class BasicJvmReplEvaluator(val scriptEvaluator: ScriptEvaluator = BasicJvmScrip configuration: ScriptEvaluationConfiguration ): ResultWithDiagnostics> { + 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): 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(