Extensible, fast and secure Scala expression evaluation engine
Created, developed and maintained at AVSystem.
Extensible, fast and secure Scala expression evaluation engine
License: MIT License
Extensible, fast and secure Scala expression evaluation engine
Created, developed and maintained at AVSystem.
Example code:
object ScexFlakyValidation {
private class DefaultJavaScexCompiler(val settings: ScexSettings)
extends ScexCompiler
with ScexPresentationCompiler
with ClassfileReusingScexCompiler
with TemplateOptimizingScexCompiler
with CachingScexCompiler // removing this fixes it, but requires a lower count of tests to not crash (1000 is too much)
with CachingScexPresentationCompiler
with WeakReferenceWrappingScexCompiler
with JavaScexCompiler
def main(args: Array[String]): Unit = {
val symbolValidator = SymbolValidator(PredefinedAccessSpecs.basicOperations)
val symbolAttributes = SymbolAttributes(Nil)
val syntaxValidator = SyntaxValidator.SimpleExpressions
val utils = NamedSource("test", "")
val profile = new ExpressionProfile("test", syntaxValidator, symbolValidator, symbolAttributes, "", utils)
val settings = new ScexSettings
// settings.noGetterAdapters.value = true //adding this option fixes it too
val scexCompiler = new DefaultJavaScexCompiler(settings)
val completer = scexCompiler.getCompleter[SimpleContext[Any], String](profile, template = false)
def validateExpr(expr: String): Boolean = completer.getErrors(expr).isEmpty
val invalidExpression = "symbolMissing" //basically any invalid expression works
val totalCount = 1000
val fpCount = (0 until totalCount)
.map(i => invalidExpression + " " * i) //spaces added to avoid hitting the cache
.count(validateExpr) // <- this is what gives false positives sometimes (completer.getErrors)
if (fpCount != 0) {
println(s"There were $fpCount/$totalCount false positives in validation")
} else {
println("all good")
}
}
}
This code tries to check for errors on the same invalid expression 1000 times (with added spaces to avoid hitting the cache). The number and order of FPs is nondeterministic, and seems to get higher the longer the code runs, e.g. for 1k times it's around 50-70%:
There were 695/1000 false positives in validation
But for 100 times it's between 10-30%:
There were 12/100 false positives in validation
It seems to not happen with either setting the noGetterAdapters = true
in ScexSettings, or when using a ScexCompiler
without CachingScexCompiler
mixed in, even though those seem to be completely unrelated.
Some other findings:
s"missingSymbol$i"
)profileCompilationResultsCache
and javaGetterAdaptersCache
. With either of them being removed, and the rest of caches still in place, there are no more FPsScexPresentationCompiler#Completer.workaroundAssertionError
looks like the culprit, but it doesn't affect this at allA declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.