Commit 243dcc9b authored by Sergio Pérez's avatar Sergio Pérez
Browse files

* Fix Empty stack asterisk constraints missbehaviour

* Fix CFG absorbent clauses
parent 7a18e18a
Loading
Loading
Loading
Loading
+19 −3
Original line number Diff line number Diff line
@@ -30,7 +30,11 @@ public class AsteriskConstraint extends EdgeConstraint

	protected List<Constraints> resolve(Phase phase, EDG edg, Edge edge, Constraints constraints, int productionDepth)
	{
		if (phase.isInstanceof(Phase.Slicing))
			return super.wrap(constraints);
		super.check(phase, Phase.SummaryGeneration);

		return super.wrap(super.push(phase, constraints));
	}
	protected List<Constraints> resolve(Phase phase, EDG edg, Edge edge, Constraints constraints, AccessConstraint topConstraint, int productionDepth)
	{
@@ -75,7 +79,8 @@ public class AsteriskConstraint extends EdgeConstraint
	{
		super.check(phase, Phase.SummaryGeneration);

		if (existsPreviousAsteriskConstraint(constraints))
		// If the constraint prior to a grammar constraint is an asterisk constraint and we traverse another Asterisk
		if (isPreviousConstraintAsteriskConstraint(constraints))
			return super.wrap(this.popToAsteriskConstraint(constraints));

		return super.wrap(super.push(phase, constraints));
@@ -109,7 +114,7 @@ public class AsteriskConstraint extends EdgeConstraint

	private boolean existsPreviousAsteriskConstraint(Constraints constraints){
		boolean previousAsterisk = false;
		for(Constraint c : constraints.getEdgeConstraints()) {
		for(Constraint c : constraints.getEdgeConstraints()) { // Traverse from bottom to top of the stack
			if (c instanceof AsteriskConstraint)
				previousAsterisk = true;
			if (previousAsterisk && c instanceof GrammarConstraint)
@@ -118,6 +123,17 @@ public class AsteriskConstraint extends EdgeConstraint
		return previousAsterisk;
	}

	private boolean isPreviousConstraintAsteriskConstraint(Constraints constraints){
		Constraints constraintsClone = (Constraints) constraints.clone();
		constraintsClone.popEdgeConstraint();

		if (constraintsClone.isEdgeConstraintsEmpty())
			return false;

		Constraint c = constraintsClone.popEdgeConstraint();
		return c instanceof AsteriskConstraint;
	}

	private Constraints popToAsteriskConstraint(Constraints constraints){
		Constraint topConstraint = constraints.getEdgeConstraints().peek();
		while(!(topConstraint instanceof AsteriskConstraint)){
+4 −1
Original line number Diff line number Diff line
@@ -213,12 +213,15 @@ public class ControlFlowGenerator extends VoidVisitor<Void> implements Generator
			guardHangingStack.peek().clear();
			graph.getChild(n, Node.Type.Selectable).accept(this, arg);
			graph.getChild(n, Node.Type.Guard).accept(this, arg);
			if (!absorbentPattern || !absorbentCondition)
				guardHangingStack.peek().addAll(Set.copyOf(hangingNodes));

			// SAVE THE ABSORBENT CASE STATE AND RESTORE IT AFTER BODY
			boolean prevAbsorbentPattern = absorbentPattern;
			boolean prevAbsorbentCondition = absorbentCondition;

			graph.getChild(n, Node.Type.Body).accept(this, arg);

			absorbentCondition = prevAbsorbentCondition;
			absorbentPattern = prevAbsorbentPattern;
			stopCaseCFG = absorbentPattern && absorbentCondition;