Skip to content

Commit

Permalink
Fix break and return statements.
Browse files Browse the repository at this point in the history
  • Loading branch information
ikulikov committed Sep 6, 2023
1 parent 2677893 commit 270d4c3
Show file tree
Hide file tree
Showing 16 changed files with 206 additions and 60 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<groupId>org.thingsboard</groupId>
<artifactId>tbel</artifactId>
<packaging>jar</packaging>
<version>1.0.9</version>
<version>1.1.0</version>

<name>tbel</name>
<url>https://thingsboard.io/</url>
Expand Down
6 changes: 5 additions & 1 deletion src/main/java/org/mvel2/MVELInterpretedRuntime.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import org.mvel2.util.ExecutionStack;

import static org.mvel2.Operator.AND;
import static org.mvel2.Operator.BREAK;
import static org.mvel2.Operator.CHOR;
import static org.mvel2.Operator.END_OF_STMT;
import static org.mvel2.Operator.NOOP;
Expand Down Expand Up @@ -131,14 +132,17 @@ private Object parseAndExecuteInterpreted() {
}
}

if (variableFactory.tiltFlag()) {
if (variableFactory.tiltFlag() || variableFactory.breakFlag()) {
return stk.pop();
}

switch (procBooleanOperator(operator = tk.getOperator())) {
case RETURN:
variableFactory.setTiltFlag(true);
return stk.pop();
case BREAK:
variableFactory.setBreakFlag(true);
return stk.pop();
case OP_TERMINATE:
return stk.peek();
case OP_RESET_FRAME:
Expand Down
21 changes: 5 additions & 16 deletions src/main/java/org/mvel2/MVELRuntime.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,8 @@
package org.mvel2;

import org.mvel2.ast.ASTNode;
import org.mvel2.ast.DoNode;
import org.mvel2.ast.DoUntilNode;
import org.mvel2.ast.ForEachNode;
import org.mvel2.ast.ForNode;
import org.mvel2.ast.Function;
import org.mvel2.ast.LineLabel;
import org.mvel2.ast.WhileNode;
import org.mvel2.compiler.CompiledExpression;
import org.mvel2.debug.Debugger;
import org.mvel2.debug.DebuggerContext;
Expand Down Expand Up @@ -76,9 +71,6 @@ public static Object execute(boolean debugger, final CompiledExpression expressi
while (node != null) {
if (node instanceof Function) {
node.getReducedValueAccelerated(ctx, ctx, variableFactory);
} else if (node instanceof ForNode || node instanceof ForEachNode || node instanceof WhileNode
|| node instanceof DoNode || node instanceof DoUntilNode) {
variableFactory.setFinishBreakFlag(true);
}
node = node.nextASTNode;
}
Expand Down Expand Up @@ -110,20 +102,17 @@ else if (stk.isEmpty()) {
stk.push(tk.getReducedValueAccelerated(ctx, ctx, variableFactory));
}

if (variableFactory.tiltFlag()) {
if (variableFactory.finishBreakFlag()) {
variableFactory.setTiltFlag(false);
} else {
return stk.pop();
}
if (variableFactory.tiltFlag() || variableFactory.breakFlag()) {
return stk.pop();
}

switch (operator = tk.getOperator()) {
case RETURN:
case BREAK:
variableFactory.setTiltFlag(true);
return stk.pop();

case BREAK:
variableFactory.setBreakFlag(true);
return stk.pop();
case NOOP:
continue;

Expand Down
4 changes: 2 additions & 2 deletions src/main/java/org/mvel2/ast/BreakNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,13 @@ public Object getReducedValueAccelerated(Object ctx, Object thisValue, VariableR
setAccessor((Accessor) subCompileExpression(expr, start, offset, pCtx));
}

factory.setTiltFlag(true);
factory.setBreakFlag(true);

return accessor.getValue(ctx, thisValue, new StackDemarcResolverFactory(factory));
}

public Object getReducedValue(Object ctx, Object thisValue, VariableResolverFactory factory) {
factory.setTiltFlag(true);
factory.setBreakFlag(true);
return eval(expr, start, offset, ctx, new StackDemarcResolverFactory(factory));
}

Expand Down
17 changes: 12 additions & 5 deletions src/main/java/org/mvel2/ast/DoNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,13 @@ public DoNode(char[] expr, int start, int offset, int blockStart, int blockOffse

public Object getReducedValueAccelerated(Object ctx, Object thisValue, VariableResolverFactory factory) {
VariableResolverFactory ctxFactory = new MapVariableResolverFactory(new HashMap<String, Object>(0), factory);
factory.setFinishBreakFlag(true);
Object v;
do {
checkExecution(ctx);
compiledBlock.getValue(ctx, thisValue, ctxFactory);
if (factory.tiltFlag() & factory.finishBreakFlag()) {
v = compiledBlock.getValue(ctx, thisValue, ctxFactory);
if (ctxFactory.tiltFlag()) return v;
if (ctxFactory.breakFlag()) {
ctxFactory.setBreakFlag(false);
break;
}
}
Expand All @@ -75,10 +77,15 @@ public Object getReducedValueAccelerated(Object ctx, Object thisValue, VariableR

public Object getReducedValue(Object ctx, Object thisValue, VariableResolverFactory factory) {
VariableResolverFactory ctxFactory = new MapVariableResolverFactory(new HashMap<String, Object>(0), factory);

Object v;
do {
checkExecution(ctx);
compiledBlock.getValue(ctx, thisValue, ctxFactory);
v = compiledBlock.getValue(ctx, thisValue, ctxFactory);
if (ctxFactory.tiltFlag()) return v;
if (ctxFactory.breakFlag()) {
ctxFactory.setBreakFlag(false);
break;
}
}
while ((Boolean) condition.getValue(ctx, thisValue, factory));

Expand Down
17 changes: 12 additions & 5 deletions src/main/java/org/mvel2/ast/DoUntilNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,13 @@ public DoUntilNode(char[] expr, int start, int offset, int blockStart, int block

public Object getReducedValueAccelerated(Object ctx, Object thisValue, VariableResolverFactory factory) {
VariableResolverFactory lc = new MapVariableResolverFactory(new HashMap(0), factory);
factory.setFinishBreakFlag(true);
Object v;
do {
checkExecution(ctx);
compiledBlock.getValue(ctx, thisValue, lc);
if (factory.tiltFlag() & factory.finishBreakFlag()) {
v = compiledBlock.getValue(ctx, thisValue, lc);
if (lc.tiltFlag()) return v;
if (lc.breakFlag()) {
lc.setBreakFlag(false);
break;
}
}
Expand All @@ -72,10 +74,15 @@ public Object getReducedValueAccelerated(Object ctx, Object thisValue, VariableR

public Object getReducedValue(Object ctx, Object thisValue, VariableResolverFactory factory) {
VariableResolverFactory lc = new MapVariableResolverFactory(new HashMap(0), factory);

Object v;
do {
checkExecution(ctx);
compiledBlock.getValue(ctx, thisValue, lc);
v = compiledBlock.getValue(ctx, thisValue, lc);
if (lc.tiltFlag()) return v;
if (lc.breakFlag()) {
lc.setBreakFlag(false);
break;
}
}
while (!(Boolean) condition.getValue(ctx, thisValue, lc));

Expand Down
32 changes: 32 additions & 0 deletions src/main/java/org/mvel2/ast/ForEachNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,10 @@ public Object getReducedValueAccelerated(Object ctx, Object thisValue, VariableR
itemR.setValue(Array.get(iterCond, i));
v = compiledBlock.getValue(ctx, thisValue, itemFactory);
if (itemFactory.tiltFlag()) return v;
if (itemFactory.breakFlag()) {
itemFactory.setBreakFlag(false);
break;
}
}
break;
case CHARSEQUENCE:
Expand All @@ -98,6 +102,10 @@ public Object getReducedValueAccelerated(Object ctx, Object thisValue, VariableR
itemR.setValue(o);
v = compiledBlock.getValue(ctx, thisValue, itemFactory);
if (itemFactory.tiltFlag()) return v;
if (itemFactory.breakFlag()) {
itemFactory.setBreakFlag(false);
break;
}
}
break;
case INTEGER:
Expand All @@ -107,6 +115,10 @@ public Object getReducedValueAccelerated(Object ctx, Object thisValue, VariableR
itemR.setValue(i);
v = compiledBlock.getValue(ctx, thisValue, itemFactory);
if (itemFactory.tiltFlag()) return v;
if (itemFactory.breakFlag()) {
itemFactory.setBreakFlag(false);
break;
}
}
break;

Expand All @@ -116,6 +128,10 @@ public Object getReducedValueAccelerated(Object ctx, Object thisValue, VariableR
itemR.setValue(o);
v = compiledBlock.getValue(ctx, thisValue, itemFactory);
if (itemFactory.tiltFlag()) return v;
if (itemFactory.breakFlag()) {
itemFactory.setBreakFlag(false);
break;
}
}

break;
Expand All @@ -142,6 +158,10 @@ public Object getReducedValue(Object ctx, Object thisValue, VariableResolverFact
itemR.setValue(o);
v = compiledBlock.getValue(ctx, thisValue, itemFactory);
if (itemFactory.tiltFlag()) return v;
if (itemFactory.breakFlag()) {
itemFactory.setBreakFlag(false);
break;
}
}
}
else if (iterCond != null && iterCond.getClass().isArray()) {
Expand All @@ -151,6 +171,10 @@ else if (iterCond != null && iterCond.getClass().isArray()) {
itemR.setValue(Array.get(iterCond, i));
v = compiledBlock.getValue(ctx, thisValue, itemFactory);
if (itemFactory.tiltFlag()) return v;
if (itemFactory.breakFlag()) {
itemFactory.setBreakFlag(false);
break;
}
}
}
else if (iterCond instanceof CharSequence) {
Expand All @@ -159,6 +183,10 @@ else if (iterCond instanceof CharSequence) {
itemR.setValue(o);
v = compiledBlock.getValue(ctx, thisValue, itemFactory);
if (itemFactory.tiltFlag()) return v;
if (itemFactory.breakFlag()) {
itemFactory.setBreakFlag(false);
break;
}
}
}
else if (iterCond instanceof Integer) {
Expand All @@ -168,6 +196,10 @@ else if (iterCond instanceof Integer) {
itemR.setValue(i);
v = compiledBlock.getValue(ctx, thisValue, itemFactory);
if (itemFactory.tiltFlag()) return v;
if (itemFactory.breakFlag()) {
itemFactory.setBreakFlag(false);
break;
}
}
}
else {
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/org/mvel2/ast/ForNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ public Object getReducedValueAccelerated(Object ctx, Object thisValue, VariableR
checkExecution(ctx);
v = compiledBlock.getValue(ctx, thisValue, ctxFactory);
if (ctxFactory.tiltFlag()) return v;
if (ctxFactory.breakFlag()) {
ctxFactory.setBreakFlag(false);
break;
}
}
return null;
}
Expand All @@ -77,6 +81,10 @@ public Object getReducedValue(Object ctx, Object thisValue, VariableResolverFact
checkExecution(ctx);
v = compiledBlock.getValue(ctx, thisValue, factory);
if (factory.tiltFlag()) return v;
if (factory.breakFlag()) {
factory.setBreakFlag(false);
break;
}
}

return null;
Expand Down
17 changes: 14 additions & 3 deletions src/main/java/org/mvel2/ast/UntilNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,20 +57,31 @@ public UntilNode(char[] expr, int start, int offset, int blockStart, int blockOf

public Object getReducedValueAccelerated(Object ctx, Object thisValue, VariableResolverFactory factory) {
VariableResolverFactory ctxFactory = new MapVariableResolverFactory(new HashMap(0), factory);
Object v;
while (!(Boolean) condition.getValue(ctx, thisValue, factory)) {
checkExecution(ctx);
compiledBlock.getValue(ctx, thisValue, ctxFactory);
v = compiledBlock.getValue(ctx, thisValue, ctxFactory);
if (ctxFactory.tiltFlag()) return v;
if (ctxFactory.breakFlag()) {
ctxFactory.setBreakFlag(false);
break;
}
}

return null;
}

public Object getReducedValue(Object ctx, Object thisValue, VariableResolverFactory factory) {
VariableResolverFactory ctxFactory = new MapVariableResolverFactory(new HashMap(0), factory);

Object v;
while (!(Boolean) condition.getValue(ctx, thisValue, factory)) {
checkExecution(ctx);
compiledBlock.getValue(ctx, thisValue, ctxFactory);
v = compiledBlock.getValue(ctx, thisValue, ctxFactory);
if (ctxFactory.tiltFlag()) return v;
if (ctxFactory.breakFlag()) {
ctxFactory.setBreakFlag(false);
break;
}
}
return null;
}
Expand Down
18 changes: 12 additions & 6 deletions src/main/java/org/mvel2/ast/WhileNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,25 +53,31 @@ public WhileNode(char[] expr, int start, int offset, int blockStart, int blockEn
}

public Object getReducedValueAccelerated(Object ctx, Object thisValue, VariableResolverFactory factory) {
factory.setFinishBreakFlag(true);
VariableResolverFactory ctxFactory = new MapVariableResolverFactory(new HashMap<String, Object>(), factory);
Object v;
while ((Boolean) condition.getValue(ctx, thisValue, factory)) {
checkExecution(ctx);
compiledBlock.getValue(ctx, thisValue, ctxFactory);
if (factory.tiltFlag() & factory.finishBreakFlag()) {
v = compiledBlock.getValue(ctx, thisValue, ctxFactory);
if (ctxFactory.tiltFlag()) return v;
if (ctxFactory.breakFlag()) {
ctxFactory.setBreakFlag(false);
break;
}
}

return null;
}

public Object getReducedValue(Object ctx, Object thisValue, VariableResolverFactory factory) {
VariableResolverFactory ctxFactory = new MapVariableResolverFactory(new HashMap<String, Object>(), factory);

Object v;
while ((Boolean) condition.getValue(ctx, thisValue, factory)) {
checkExecution(ctx);
compiledBlock.getValue(ctx, thisValue, ctxFactory);
v = compiledBlock.getValue(ctx, thisValue, ctxFactory);
if (ctxFactory.tiltFlag()) return v;
if (ctxFactory.breakFlag()) {
ctxFactory.setBreakFlag(false);
break;
}
}
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ public interface VariableResolverFactory extends Serializable {

public void setTiltFlag(boolean tilt);

public boolean finishBreakFlag();
public boolean breakFlag();

public void setFinishBreakFlag(boolean mayBeBreak);
public void setBreakFlag(boolean breakFlag);
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public abstract class BaseVariableResolverFactory implements VariableResolverFac

private boolean tiltFlag;

private boolean finishBreak;
private boolean breakFlag;

public VariableResolverFactory getNextFactory() {
return nextFactory;
Expand Down Expand Up @@ -180,12 +180,12 @@ public void setTiltFlag(boolean tiltFlag) {
this.tiltFlag = tiltFlag;
if (nextFactory != null) nextFactory.setTiltFlag(tiltFlag);
}
public boolean finishBreakFlag() {
return finishBreak;
public boolean breakFlag() {
return breakFlag;
}

public void setFinishBreakFlag(boolean finishBreak) {
this.finishBreak = finishBreak;
if (nextFactory != null) nextFactory.setFinishBreakFlag(finishBreak);
public void setBreakFlag(boolean breakFlag) {
this.breakFlag = breakFlag;
if (nextFactory != null) nextFactory.setBreakFlag(breakFlag);
}
}
Loading

0 comments on commit 270d4c3

Please sign in to comment.