Commit 90894510 authored by Alexander Weigl's avatar Alexander Weigl

Renaming/refactoring trying to make things easier

parent 31c8f187
Pipeline #15060 failed with stage
in 1 minute and 47 seconds
...@@ -116,12 +116,12 @@ casesStmt ...@@ -116,12 +116,12 @@ casesStmt
casesList casesList
: (TRY | : (TRY |
(CASE (expression (CASE (expression
| (CLOSES INDENT closesScript=stmtList DEDENT) ) ) ) | (CLOSES INDENT closesGuard=stmtList DEDENT) ) ) )
COLON INDENT? body=stmtList DEDENT? COLON INDENT? body=stmtList DEDENT?
; ;
/*closesExpression /*closesExpression
: CLOSES INDENT closesScript=stmtList DEDENT : CLOSES INDENT closesGuard=stmtList DEDENT
;*/ ;*/
forEachStmt forEachStmt
......
...@@ -29,7 +29,7 @@ public class ShortCommandPrinter extends DefaultASTVisitor<String> { ...@@ -29,7 +29,7 @@ public class ShortCommandPrinter extends DefaultASTVisitor<String> {
} }
@Override @Override
public String visit(SimpleCaseStatement caseStatement) { public String visit(GuardedCaseStatement caseStatement) {
return "case " + Facade.prettyPrint(caseStatement.getGuard()); return "case " + Facade.prettyPrint(caseStatement.getGuard());
} }
...@@ -40,7 +40,7 @@ public class ShortCommandPrinter extends DefaultASTVisitor<String> { ...@@ -40,7 +40,7 @@ public class ShortCommandPrinter extends DefaultASTVisitor<String> {
@Override @Override
public String visit(ClosesCase closesCase) { public String visit(ClosesCase closesCase) {
return "closes with {" + Facade.prettyPrint(closesCase.getClosesScript()) + "}"; return "closes with {" + Facade.prettyPrint(closesCase.getClosesGuard()) + "}";
} }
@Override @Override
......
...@@ -118,15 +118,15 @@ public class ASTChanger extends DefaultASTVisitor<ASTNode> { ...@@ -118,15 +118,15 @@ public class ASTChanger extends DefaultASTVisitor<ASTNode> {
} }
@Override @Override
public SimpleCaseStatement visit(SimpleCaseStatement simpleCaseStatement) { public GuardedCaseStatement visit(GuardedCaseStatement guardedCaseStatement) {
simpleCaseStatement.getGuard().accept(this); guardedCaseStatement.getGuard().accept(this);
simpleCaseStatement.getBody().accept(this); guardedCaseStatement.getBody().accept(this);
return simpleCaseStatement; return guardedCaseStatement;
} }
@Override @Override
public ASTNode visit(ClosesCase closesCase) { public ASTNode visit(ClosesCase closesCase) {
closesCase.getClosesScript().accept(this); closesCase.getClosesGuard().accept(this);
closesCase.getBody().accept(this); closesCase.getBody().accept(this);
return closesCase; return closesCase;
} }
......
...@@ -167,9 +167,9 @@ public interface ASTTraversal<T> extends Visitor<T> { ...@@ -167,9 +167,9 @@ public interface ASTTraversal<T> extends Visitor<T> {
} }
@Override @Override
default T visit(SimpleCaseStatement simpleCaseStatement) { default T visit(GuardedCaseStatement guardedCaseStatement) {
simpleCaseStatement.getGuard().accept(this); guardedCaseStatement.getGuard().accept(this);
simpleCaseStatement.getBody().accept(this); guardedCaseStatement.getBody().accept(this);
return null; return null;
} }
...@@ -184,7 +184,7 @@ public interface ASTTraversal<T> extends Visitor<T> { ...@@ -184,7 +184,7 @@ public interface ASTTraversal<T> extends Visitor<T> {
@Override @Override
default T visit(ClosesCase closesCase) { default T visit(ClosesCase closesCase) {
closesCase.getClosesScript().accept(this); closesCase.getClosesGuard().accept(this);
closesCase.getBody().accept(this); closesCase.getBody().accept(this);
return null; return null;
} }
......
...@@ -143,8 +143,8 @@ public class DefaultASTVisitor<T> implements Visitor<T> { ...@@ -143,8 +143,8 @@ public class DefaultASTVisitor<T> implements Visitor<T> {
} }
@Override @Override
public T visit(SimpleCaseStatement simpleCaseStatement) { public T visit(GuardedCaseStatement guardedCaseStatement) {
return defaultVisit(simpleCaseStatement); return defaultVisit(guardedCaseStatement);
} }
@Override @Override
......
...@@ -178,7 +178,7 @@ public class PrettyPrinter extends DefaultASTVisitor<Void> { ...@@ -178,7 +178,7 @@ public class PrettyPrinter extends DefaultASTVisitor<Void> {
} }
@Override @Override
public Void visit(SimpleCaseStatement caseStatement) { public Void visit(GuardedCaseStatement caseStatement) {
s.append("case "); s.append("case ");
caseStatement.getGuard().accept(this); caseStatement.getGuard().accept(this);
s.append(" {"); s.append(" {");
......
...@@ -352,14 +352,13 @@ public class TransformAst implements ScriptLanguageVisitor<Object> { ...@@ -352,14 +352,13 @@ public class TransformAst implements ScriptLanguageVisitor<Object> {
cs = new TryCase(); cs = new TryCase();
} else if (ctx.closesScript != null) { } else if (ctx.closesScript != null) {
cs = new ClosesCase(); cs = new ClosesCase();
cs.setClosedStmt(true);
Statements closes = (Statements) ctx.closesScript.accept(this); Statements closes = (Statements) ctx.closesScript.accept(this);
((ClosesCase) cs).setClosesScript(closes); ((ClosesCase) cs).setClosesGuard(closes);
closes.setParent(cs); closes.setParent(cs);
} else { } else {
cs = new SimpleCaseStatement(); cs = new GuardedCaseStatement();
Expression<ParserRuleContext> guard = (Expression<ParserRuleContext>) ctx.expression().accept(this); Expression<ParserRuleContext> guard = (Expression<ParserRuleContext>) ctx.expression().accept(this);
((SimpleCaseStatement) cs).setGuard(guard); ((GuardedCaseStatement) cs).setGuard(guard);
} }
cs.setBody(accept); cs.setBody(accept);
......
...@@ -72,7 +72,7 @@ public interface Visitor<T> { ...@@ -72,7 +72,7 @@ public interface Visitor<T> {
T visit(TryCase TryCase); T visit(TryCase TryCase);
T visit(SimpleCaseStatement simpleCaseStatement); T visit(GuardedCaseStatement guardedCaseStatement);
T visit(CaseStatement caseStatement); T visit(CaseStatement caseStatement);
......
...@@ -38,8 +38,7 @@ import lombok.Setter; ...@@ -38,8 +38,7 @@ import lombok.Setter;
@Setter @Setter
@RequiredArgsConstructor @RequiredArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class CaseStatement extends Statement<ScriptLanguageParser.CasesListContext> { public abstract class CaseStatement extends Statement<ScriptLanguageParser.CasesListContext> {
public boolean isClosedStmt;
protected Statements body; protected Statements body;
/** /**
...@@ -52,9 +51,6 @@ public class CaseStatement extends Statement<ScriptLanguageParser.CasesListConte ...@@ -52,9 +51,6 @@ public class CaseStatement extends Statement<ScriptLanguageParser.CasesListConte
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
@Override public CaseStatement copy() { @Override public abstract CaseStatement copy();
CaseStatement cs = new CaseStatement(isClosedStmt, body.copy());
cs.setRuleContext(this.ruleContext);
return cs;
}
} }
...@@ -10,23 +10,20 @@ import lombok.NoArgsConstructor; ...@@ -10,23 +10,20 @@ import lombok.NoArgsConstructor;
@Data @Data
@NoArgsConstructor @NoArgsConstructor
public class ClosesCase extends CaseStatement { public class ClosesCase extends CaseStatement {
private boolean isClosedStmt = true;
/** /**
* Script that should be executed and shown whether case can be closed * Script that should be executed and shown whether case can be closed
*/ */
private Statements closesScript; private Statements closesGuard;
/** /**
* A close subscript() {bodyscript} expression * A close subscript() {bodyscript} expression
* *
* @param closesScript the script that is exectued in order to determine whether goal would clos. This proof is pruned afterwards * @param closesGuard the script that is exectued in order to determine whether goal would clos. This proof is pruned afterwards
* @param body the actual script that is then executed when closesscript was successful and pruned * @param body the actual script that is then executed when closesscript was successful and pruned
*/ */
public ClosesCase(Statements closesScript, Statements body) { public ClosesCase(Statements closesGuard, Statements body) {
this.body = body; this.body = body;
this.closesScript = closesScript; this.closesGuard = closesGuard;
} }
/** /**
...@@ -42,7 +39,7 @@ public class ClosesCase extends CaseStatement { ...@@ -42,7 +39,7 @@ public class ClosesCase extends CaseStatement {
*/ */
@Override @Override
public ClosesCase copy() { public ClosesCase copy() {
ClosesCase cs = new ClosesCase(closesScript.copy(), body.copy()); ClosesCase cs = new ClosesCase(closesGuard.copy(), body.copy());
cs.setRuleContext(this.ruleContext); cs.setRuleContext(this.ruleContext);
return cs; return cs;
} }
......
...@@ -11,11 +11,10 @@ import lombok.NoArgsConstructor; ...@@ -11,11 +11,10 @@ import lombok.NoArgsConstructor;
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class SimpleCaseStatement extends CaseStatement { public class GuardedCaseStatement extends CaseStatement {
private Expression guard; private Expression guard;
private boolean isClosedStmt = false;
public SimpleCaseStatement(Expression guard, Statements body) { public GuardedCaseStatement(Expression guard, Statements body) {
this.guard = guard; this.guard = guard;
this.body = body; this.body = body;
} }
...@@ -32,8 +31,8 @@ public class SimpleCaseStatement extends CaseStatement { ...@@ -32,8 +31,8 @@ public class SimpleCaseStatement extends CaseStatement {
* {@inheritDoc} * {@inheritDoc}
*/ */
@Override @Override
public SimpleCaseStatement copy() { public GuardedCaseStatement copy() {
SimpleCaseStatement scs = new SimpleCaseStatement(guard.copy(), body.copy()); GuardedCaseStatement scs = new GuardedCaseStatement(guard.copy(), body.copy());
scs.setRuleContext(this.ruleContext); scs.setRuleContext(this.ruleContext);
return scs; return scs;
} }
......
...@@ -10,8 +10,6 @@ import lombok.NoArgsConstructor; ...@@ -10,8 +10,6 @@ import lombok.NoArgsConstructor;
@Data @Data
@NoArgsConstructor @NoArgsConstructor
public class TryCase extends CaseStatement { public class TryCase extends CaseStatement {
private boolean isClosedStmt = true;
public TryCase(Statements body) { public TryCase(Statements body) {
this.body = body; this.body = body;
} }
......
...@@ -230,7 +230,18 @@ public class KeYProofFacade { ...@@ -230,7 +230,18 @@ public class KeYProofFacade {
} }
public enum ProofState { public enum ProofState {
EMPTY, VIRGIN, DIRTY; /**
* There is no KeY Proof actually loaded.
*/
EMPTY,
/**
* The loaded KeY Proof is untouched iff there is only one node --- the root.
*/
VIRGIN,
/**
* The KeY Proof was ravished by Taclets and other stuff.
*/
DIRTY;
} }
//endregion //endregion
} }
......
...@@ -4,7 +4,6 @@ import com.google.common.collect.BiMap; ...@@ -4,7 +4,6 @@ import com.google.common.collect.BiMap;
import com.google.common.collect.ImmutableBiMap; import com.google.common.collect.ImmutableBiMap;
import de.uka.ilkd.key.api.ScriptApi; import de.uka.ilkd.key.api.ScriptApi;
import de.uka.ilkd.key.api.VariableAssignments; import de.uka.ilkd.key.api.VariableAssignments;
import de.uka.ilkd.key.proof.Goal;
import de.uka.ilkd.key.proof.Node; import de.uka.ilkd.key.proof.Node;
import de.uka.ilkd.key.proof.Proof; import de.uka.ilkd.key.proof.Proof;
import edu.kit.iti.formal.psdbg.interpreter.data.GoalNode; import edu.kit.iti.formal.psdbg.interpreter.data.GoalNode;
...@@ -18,7 +17,6 @@ import edu.kit.iti.formal.psdbg.parser.ast.Statements; ...@@ -18,7 +17,6 @@ import edu.kit.iti.formal.psdbg.parser.ast.Statements;
import edu.kit.iti.formal.psdbg.parser.ast.TryCase; import edu.kit.iti.formal.psdbg.parser.ast.TryCase;
import edu.kit.iti.formal.psdbg.parser.types.SimpleType; import edu.kit.iti.formal.psdbg.parser.types.SimpleType;
import lombok.Getter; import lombok.Getter;
import org.key_project.util.collection.ImmutableList;
import java.util.List; import java.util.List;
...@@ -38,8 +36,6 @@ public class KeyInterpreter extends Interpreter<KeyData> { ...@@ -38,8 +36,6 @@ public class KeyInterpreter extends Interpreter<KeyData> {
.put(SimpleType.INT_ARRAY, VariableAssignments.VarType.INT_ARRAY) .put(SimpleType.INT_ARRAY, VariableAssignments.VarType.INT_ARRAY)
.put(SimpleType.SEQ, VariableAssignments.VarType.SEQ) .put(SimpleType.SEQ, VariableAssignments.VarType.SEQ)
.build(); .build();
@Getter
private ScriptApi scriptApi;
public KeyInterpreter(CommandLookup lookup) { public KeyInterpreter(CommandLookup lookup) {
super(lookup); super(lookup);
...@@ -48,15 +44,18 @@ public class KeyInterpreter extends Interpreter<KeyData> { ...@@ -48,15 +44,18 @@ public class KeyInterpreter extends Interpreter<KeyData> {
@Override @Override
public Object visit(ClosesCase closesCase) { public Object visit(ClosesCase closesCase) {
/*
State<KeyData> currentStateToMatch = peekState(); State<KeyData> currentStateToMatch = peekState();
State<KeyData> currentStateToMatchCopy = currentStateToMatch.copy(); //deepcopy State<KeyData> currentStateToMatchCopy = currentStateToMatch.copy(); //deepcopy
GoalNode<KeyData> selectedGoalNode = currentStateToMatch.getSelectedGoalNode(); GoalNode<KeyData> selectedGoalNode = currentStateToMatch.getSelectedGoalNode();
GoalNode<KeyData> selectedGoalCopy = currentStateToMatch.getSelectedGoalNode().deepCopy(); //deepcopy GoalNode<KeyData> selectedGoalCopy = currentStateToMatch.getSelectedGoalNode().deepCopy(); //deepcopy
*/
enterScope(closesCase); enterScope(closesCase);
//execute closesscript //execute closesscript
executeBody(closesCase.getClosesScript(), selectedGoalNode, new VariableAssignment(selectedGoalNode.getAssignments())); boolean closed = suspicionExecution(closesCase.getClosesGuard(), true);
//executeBody(closesCase.getClosesGuard(), selectedGoalNode, new VariableAssignment(selectedGoalNode.getAssignments()));
//check whether script closed proof //check whether script closed proof
State<KeyData> stateafterIsClosable = peekState(); /*State<KeyData> stateafterIsClosable = peekState();
List<GoalNode<KeyData>> goals = stateafterIsClosable.getGoals(); List<GoalNode<KeyData>> goals = stateafterIsClosable.getGoals();
boolean allClosed = true; boolean allClosed = true;
for (GoalNode<KeyData> goal : goals) { for (GoalNode<KeyData> goal : goals) {
...@@ -75,39 +74,21 @@ public class KeyInterpreter extends Interpreter<KeyData> { ...@@ -75,39 +74,21 @@ public class KeyInterpreter extends Interpreter<KeyData> {
pushState(currentStateToMatchCopy); pushState(currentStateToMatchCopy);
exitScope(closesCase); exitScope(closesCase);
return allClosed; return allClosed;
*/
exitScope(closesCase);
return closed;
} }
@Override @Override
public Object visit(TryCase tryCase) { public Object visit(TryCase tryCase) {
//historylistener for recording try
enterScope(tryCase); enterScope(tryCase);
boolean b = suspicionExecution(tryCase.getBody()); boolean b = suspicionExecution(tryCase.getBody(), false);
exitScope(tryCase); exitScope(tryCase);
return b; return b;
/* //executeBody and if goal is closed afterwards return true
//else prune proof and return false
State<T> stateBeforeTry = peekState().copy();
State<T> tState = executeBody(tryCase.getBody(), peekState().getSelectedGoalNode(), peekState().getSelectedGoalNode().getAssignments());
boolean isClosed = tState.getGoals().stream().allMatch(tGoalNode -> tGoalNode.isClosed());
if(!isClosed){
exitScope(tryCase);
return false;
}else{
exitScope(tryCase);
return true;
}
*/
} }
private boolean suspicionExecution(Statements statements) { private boolean suspicionExecution(Statements statements, boolean alwaysPrune) {
logger.debug(String.format("Beginning of suspicion execution of %s", statements)); logger.debug(String.format("Beginning of suspicion execution of %s", statements));
GoalNode<KeyData> goalNode = getSelectedNode(); GoalNode<KeyData> goalNode = getSelectedNode();
pushState(new State<>(goalNode.deepCopy())); // copy for later prove pushState(new State<>(goalNode.deepCopy())); // copy for later prove
...@@ -124,7 +105,7 @@ public class KeyInterpreter extends Interpreter<KeyData> { ...@@ -124,7 +105,7 @@ public class KeyInterpreter extends Interpreter<KeyData> {
.allMatch(g -> g.getData().getNode().isClosed()); .allMatch(g -> g.getData().getNode().isClosed());
logger.debug("Ended Side Computation"); logger.debug("Ended Side Computation");
if (!allGoalsClosed) { if (!allGoalsClosed || alwaysPrune) {
logger.debug("Try was not successful, rolling back proof"); logger.debug("Try was not successful, rolling back proof");
//Throw away the new state, and truncate the prove! //Throw away the new state, and truncate the prove!
Proof currentKeYproof = goalNode.getData().getProof(); Proof currentKeYproof = goalNode.getData().getProof();
......
...@@ -198,7 +198,7 @@ public class Debugger { ...@@ -198,7 +198,7 @@ public class Debugger {
} }
@Override @Override
public Void visit(SimpleCaseStatement caseStatement) { public Void visit(GuardedCaseStatement caseStatement) {
suffix(caseStatement); suffix(caseStatement);
System.out.println("case " + Facade.prettyPrint(caseStatement.getGuard())); System.out.println("case " + Facade.prettyPrint(caseStatement.getGuard()));
return super.visit(caseStatement); return super.visit(caseStatement);
......
...@@ -32,22 +32,25 @@ import java.util.stream.Stream; ...@@ -32,22 +32,25 @@ import java.util.stream.Stream;
public class Interpreter<T> extends DefaultASTVisitor<Object> public class Interpreter<T> extends DefaultASTVisitor<Object>
implements ScopeObservable { implements ScopeObservable {
private static final int MAX_ITERATIONS = 5; private static final int MAX_ITERATIONS = 5;
protected static Logger logger = LogManager.getLogger(Interpreter.class); protected static Logger logger = LogManager.getLogger(Interpreter.class);
@Getter @Getter
public final AtomicBoolean hardStop = new AtomicBoolean(false); public final AtomicBoolean hardStop = new AtomicBoolean(false);
private Stack<State<T>> stateStack = new Stack<>();
@Getter @Getter
protected List<Visitor> entryListeners = new ArrayList<>(), protected List<Visitor> entryListeners = new ArrayList<>(),
exitListeners = new ArrayList<>(); exitListeners = new ArrayList<>();
private Stack<State<T>> stateStack = new Stack<>();
@Getter @Getter
@Setter @Setter
private MatcherApi<T> matcherApi; private MatcherApi<T> matcherApi;
@Getter @Getter
private CommandLookup functionLookup; private CommandLookup functionLookup;
@Getter @Getter
@Setter @Setter
private boolean scrictSelectedGoalMode = false; private boolean scrictSelectedGoalMode = false;
...@@ -55,6 +58,7 @@ public class Interpreter<T> extends DefaultASTVisitor<Object> ...@@ -55,6 +58,7 @@ public class Interpreter<T> extends DefaultASTVisitor<Object>
@Getter @Getter
@Setter @Setter
private VariableAssignmentHook<T> variableAssignmentHook = null; private VariableAssignmentHook<T> variableAssignmentHook = null;
@Getter @Getter
@Setter @Setter
private boolean suppressListeners = false; private boolean suppressListeners = false;
...@@ -67,12 +71,12 @@ public class Interpreter<T> extends DefaultASTVisitor<Object> ...@@ -67,12 +71,12 @@ public class Interpreter<T> extends DefaultASTVisitor<Object>
public <T extends ParserRuleContext> void enterScope(ASTNode<T> node) { public <T extends ParserRuleContext> void enterScope(ASTNode<T> node) {
if (hardStop.get()) if (hardStop.get())
throw new InterpreterRuntimeException("hard stop"); throw new InterpreterRuntimeException("hard stop");
if(!suppressListeners) callListeners(getEntryListeners(), node); if (!suppressListeners) callListeners(getEntryListeners(), node);
} }
@Override @Override
public <T extends ParserRuleContext> void exitScope(ASTNode<T> node) { public <T extends ParserRuleContext> void exitScope(ASTNode<T> node) {
if(!suppressListeners) callListeners(getExitListeners(), node); if (!suppressListeners) callListeners(getExitListeners(), node);
} }
/** /**
...@@ -262,20 +266,22 @@ public class Interpreter<T> extends DefaultASTVisitor<Object> ...@@ -262,20 +266,22 @@ public class Interpreter<T> extends DefaultASTVisitor<Object>
} }
@Override @Override
public Object visit(SimpleCaseStatement simpleCaseStatement) { public Object visit(GuardedCaseStatement guardedCaseStatement) {
Expression matchExpression = guardedCaseStatement.getGuard();
Expression matchExpression = simpleCaseStatement.getGuard();
State<T> currentStateToMatch = peekState(); State<T> currentStateToMatch = peekState();
GoalNode<T> selectedGoal = currentStateToMatch.getSelectedGoalNode(); GoalNode<T> selectedGoal = currentStateToMatch.getSelectedGoalNode();
VariableAssignment va = evaluateMatchInGoal(matchExpression, selectedGoal); VariableAssignment va = evaluateMatchInGoal(matchExpression, selectedGoal);
if (va != null) { try {
enterScope(simpleCaseStatement); enterScope(guardedCaseStatement);
executeBody(simpleCaseStatement.getBody(), selectedGoal, va); if (va != null) {
exitScope(simpleCaseStatement); executeBody(guardedCaseStatement.getBody(), selectedGoal, va);
return true; return true;
} else { } else {
return false; return false;
}
} finally {
exitScope(guardedCaseStatement);
} }
} }
...@@ -319,13 +325,12 @@ public class Interpreter<T> extends DefaultASTVisitor<Object> ...@@ -319,13 +325,12 @@ public class Interpreter<T> extends DefaultASTVisitor<Object>
/** /**
* Match a set of goal nodes against a matchpattern of a case and return the matched goals together with instantiated variables * Match a set of goal nodes against a matchpattern of a case and return the matched goals together with instantiated variables
*
*/ */
/* private Map<GoalNode<T>, VariableAssignment> matchGoal(Set<GoalNode<T>> allGoalsBeforeCases, CaseStatement aCase) { /* private Map<GoalNode<T>, VariableAssignment> matchGoal(Set<GoalNode<T>> allGoalsBeforeCases, CaseStatement aCase) {
HashMap<GoalNode<T>, VariableAssignment> matchedGoals = new HashMap<>(); HashMap<GoalNode<T>, VariableAssignment> matchedGoals = new HashMap<>();
if (!aCase.isClosedStmt()) { if (!aCase.isClosedStmt()) {
SimpleCaseStatement caseStmt = (SimpleCaseStatement) aCase; GuardedCaseStatement caseStmt = (GuardedCaseStatement) aCase;
Expression matchExpression = caseStmt.getGuard(); Expression matchExpression = caseStmt.getGuard();
for (GoalNode<T> goal : allGoalsBeforeCases) { for (GoalNode<T> goal : allGoalsBeforeCases) {
VariableAssignment va = evaluateMatchInGoal(matchExpression, goal); VariableAssignment va = evaluateMatchInGoal(matchExpression, goal);
......
...@@ -137,8 +137,8 @@ public class BlockListener<T> implements InterpreterObserver<T> { ...@@ -137,8 +137,8 @@ public class BlockListener<T> implements InterpreterObserver<T> {
}