aviatorscript icon indicating copy to clipboard operation
aviatorscript copied to clipboard

Expression.execute传入参数为Immutable对象时,脚本中定义新变量报错

Open mistyzyq opened this issue 9 months ago • 0 comments

问题版本:5.4.3

测试代码(Java 17):

String content = "a + b;\n" +
        "x = a+b;\n" + // 报错行
        "return x;\n"
        ;
Expression expression = AviatorEvaluator.getInstance().compile(content, false);
expression.execute(Map.of(
        "a", 1,
        "b", 2
));

执行脚本抛出异常:

java.lang.UnsupportedOperationException: null
	at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:142)
	at java.base/java.util.ImmutableCollections$AbstractImmutableMap.put(ImmutableCollections.java:1072)
	at com.googlecode.aviator.utils.Env.put(Env.java:492)
	at com.googlecode.aviator.utils.Env.put(Env.java:52)
	at com.googlecode.aviator.runtime.type.AviatorJavaType.setValue(AviatorJavaType.java:427)
	at AviatorScript_1744627627722_78.execute0(AviatorScript_1744627627722_78:3)
	at com.googlecode.aviator.ClassExpression.executeDirectly(ClassExpression.java:55)
	at com.googlecode.aviator.BaseExpression.execute(BaseExpression.java:268)
	at com.googlecode.aviator.BaseExpression.execute(BaseExpression.java:255)

如果没有定义新的变量,则不会有这个问题。根据源码猜测,是引擎内的 Env 直接将传入的 Immutable Map 作为内部的 Value Map 使用了。

mistyzyq avatar Apr 14 '25 10:04 mistyzyq