package org.overture.interpreter.debug; import java.util.HashMap; import java.util.Map; import org.overture.ast.analysis.AnalysisException; import org.overture.ast.expressions.PExp; import org.overture.ast.node.INode; import org.overture.ast.statements.PStm; import org.overture.interpreter.ast.expressions.BreakpointExpression; import org.overture.interpreter.runtime.Breakpoint; import org.overture.interpreter.runtime.Context; import org.overture.interpreter.runtime.ValueException; import org.overture.interpreter.runtime.VdmRuntime; import org.overture.interpreter.values.Value; public class BreakpointManager { static final Map<PExp, Breakpoint> expressionMap = new HashMap<PExp, Breakpoint>(); static final Map<PStm, Breakpoint> statementMap = new HashMap<PStm, Breakpoint>(); public static Breakpoint getBreakpoint(INode node) throws AnalysisException { if(node instanceof PExp) { return getBreakpoint((PExp)node); }else if(node instanceof PStm) { return getBreakpoint((PStm)node); } throw new AnalysisException("Unsupported breakpoint node"); } public static Breakpoint getBreakpoint(PExp exp) { if (!expressionMap.containsKey(exp)) { expressionMap.put(exp, new Breakpoint(exp.getLocation())); } return expressionMap.get(exp); } public static Breakpoint getBreakpoint(PStm stmt) { if (!statementMap.containsKey(stmt)) { statementMap.put(stmt, new Breakpoint(stmt.getLocation())); } return statementMap.get(stmt); } public static void setBreakpoint(PStm stmt, Breakpoint breakpoint) { statementMap.put(stmt, breakpoint); } public static void setBreakpoint(PExp exp, Breakpoint breakpoint) { expressionMap.put(exp, breakpoint); } public static boolean shouldStop(PExp exp, Context ctxt) throws ValueException { return evalBreakpointCondition(exp, ctxt).boolValue(ctxt); } public static Value evalBreakpointCondition(PExp exp, Context ctxt) { if (exp instanceof BreakpointExpression) { return ((BreakpointExpression) exp).eval(ctxt); } try { return exp.apply(VdmRuntime.getExpressionEvaluator(), ctxt); } catch (AnalysisException e) { e.printStackTrace(); } return null; } }