From 5f921d8d86deea0dbe575d44f3b827961e92570a Mon Sep 17 00:00:00 2001 From: tianqiao Date: Fri, 17 Nov 2017 16:11:38 +0800 Subject: [PATCH] =?UTF-8?q?//bugfix=E5=A4=84=E7=90=86ExpressRunner?= =?UTF-8?q?=E5=B5=8C=E5=A5=97=E6=83=85=E5=86=B5=E4=B8=8B=EF=BC=8Ccache?= =?UTF-8?q?=E8=BF=98=E5=8E=9F=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../instruction/OperateDataCacheManager.java | 13 +++- .../express/bugfix/RecursivelyRunnerTest.java | 60 +++++++++++++++++++ 3 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 src/test/java/com/ql/util/express/bugfix/RecursivelyRunnerTest.java diff --git a/pom.xml b/pom.xml index c704c0b..c15fe35 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 64e2588..7788b39 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 0000000..2945559 --- /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; + } + } +} -- GitLab