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; + } + } +}