diff --git a/pom.xml b/pom.xml
index c704c0b06bb0dc5a4e5151e87b4def67877e232f..c15fe3582559a9fa0ff2ba54cf195b9e3d0b64f6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
com.taobao.util
taobao-express
jar
- 3.1.5
+ 3.1.6
taobao-express
diff --git a/src/main/java/com/ql/util/express/instruction/OperateDataCacheManager.java b/src/main/java/com/ql/util/express/instruction/OperateDataCacheManager.java
index 64e2588fae48e6a466f1ed7a75d3db07c100b6bf..7788b393b11489c9e620e9c5beddec2b3d21e7cf 100644
--- a/src/main/java/com/ql/util/express/instruction/OperateDataCacheManager.java
+++ b/src/main/java/com/ql/util/express/instruction/OperateDataCacheManager.java
@@ -86,8 +86,17 @@ class RunnerDataCache{
return this.cache;
}
public void pop(ExpressRunner aRunner){
- this.cache = this.stack.pop().getOperateDataCache();
-
+
+// 原有的逻辑
+// this.cache = this.stack.pop().getOperateDataCache();
+
+ //bugfix处理ExpressRunner嵌套情况下,cache还原的问题
+ this.stack.pop();
+ if(!this.stack.isEmpty()){
+ this.cache = this.stack.peek().getOperateDataCache();
+ }else{
+ this.cache = null;
+ }
}
}
diff --git a/src/test/java/com/ql/util/express/bugfix/RecursivelyRunnerTest.java b/src/test/java/com/ql/util/express/bugfix/RecursivelyRunnerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..29455593a38faba100556c19f52e10efdf28fac2
--- /dev/null
+++ b/src/test/java/com/ql/util/express/bugfix/RecursivelyRunnerTest.java
@@ -0,0 +1,60 @@
+package com.ql.util.express.bugfix;
+
+import com.ql.util.express.DefaultContext;
+import com.ql.util.express.ExpressRunner;
+import com.ql.util.express.Operator;
+import org.junit.Test;
+
+import java.lang.reflect.Method;
+
+public class RecursivelyRunnerTest {
+
+ @Test
+ public void testEvalOperator() throws Exception{
+ ExpressRunner runner = new ExpressRunner();
+ runner.addFunction("eval",new EvalOperator());
+ String express = "eval('10')+eval('20')+eval('30')";
+ Object r = runner.execute(express, null, null, true, false);
+ System.out.println(r);
+
+ }
+
+ @Test
+ public void testSubRunner() throws Exception{
+ ExpressRunner runner = new ExpressRunner();
+
+ //bind SubRunner.evel method
+ SubRunner subRunner = new SubRunner();
+ Method [] methods = SubRunner.class.getDeclaredMethods();
+ for (Method m : methods) {
+ String name = m.getName();
+ runner.addFunctionOfServiceMethod(name, subRunner, name, m.getParameterTypes(), null);
+ }
+
+ String express = "eval('10')+eval('20')+eval('30')";
+ Object r = runner.execute(express, null, null, true, false);
+ System.out.println(r);
+
+ }
+
+ public static class EvalOperator extends Operator{
+
+ private ExpressRunner subRun = new ExpressRunner();
+
+ @Override
+ public Object executeInner(Object[] list) throws Exception {
+ Object result = subRun.execute((String) list[0], new DefaultContext(), null, true, false);
+ return result;
+ }
+ }
+
+ public static class SubRunner {
+
+ private ExpressRunner subRun = new ExpressRunner();
+
+ public Object eval(String obj) throws Exception {
+ Object result = subRun.execute(obj, new DefaultContext(), null, true, false);
+ return result;
+ }
+ }
+}