17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 package jdk.test.lib.jittester.factories; 25 26 import java.util.ArrayList; 27 import java.util.HashSet; 28 import java.util.List; 29 import jdk.test.lib.jittester.BuiltInType; 30 import jdk.test.lib.jittester.IRNode; 31 import jdk.test.lib.jittester.Literal; 32 import jdk.test.lib.jittester.Nothing; 33 import jdk.test.lib.jittester.ProductionFailedException; 34 import jdk.test.lib.jittester.Rule; 35 import jdk.test.lib.jittester.Switch; 36 import jdk.test.lib.jittester.Type; 37 import jdk.test.lib.jittester.TypeUtil; 38 import jdk.test.lib.jittester.types.TypeKlass; 39 import jdk.test.lib.jittester.types.TypeByte; 40 import jdk.test.lib.jittester.types.TypeChar; 41 import jdk.test.lib.jittester.types.TypeInt; 42 import jdk.test.lib.jittester.types.TypeShort; 43 import jdk.test.lib.jittester.utils.PseudoRandom; 44 45 class SwitchFactory extends SafeFactory { 46 private int caseBlockIdx; 47 protected long complexityLimit; 48 protected int statementLimit, operatorLimit; 49 private boolean canHaveReturn = false; 50 private final TypeKlass ownerClass; 51 private final int level; 52 53 SwitchFactory(TypeKlass ownerClass, long complexityLimit, int statementLimit, 54 int operatorLimit, int level, boolean canHaveReturn) { 55 this.ownerClass = ownerClass; 56 this.complexityLimit = complexityLimit; 57 this.statementLimit = statementLimit; 58 this.operatorLimit = operatorLimit; 59 this.level = level; 60 this.canHaveReturn = canHaveReturn; 61 } 62 63 @Override 64 protected IRNode sproduce() throws ProductionFailedException { 65 if (statementLimit > 0 && complexityLimit > 0) { 66 ArrayList<Type> switchTypes = new ArrayList<>(); 67 switchTypes.add(new TypeChar()); 68 switchTypes.add(new TypeByte()); 69 switchTypes.add(new TypeShort()); 70 switchTypes.add(new TypeInt()); 71 PseudoRandom.shuffle(switchTypes); 72 IRNodeBuilder builder = new IRNodeBuilder() 73 .setOwnerKlass(ownerClass) 74 .setOperatorLimit(operatorLimit) 75 .setSubBlock(false) 76 .setCanHaveBreaks(true) 77 .setCanHaveContinues(false) 78 .setCanHaveReturn(canHaveReturn); 79 MAIN_LOOP: 80 for (Type type : switchTypes) { 81 ArrayList<IRNode> caseConsts = new ArrayList<>(); 82 ArrayList<IRNode> caseBlocks = new ArrayList<>(); 83 try { 84 int accumulatedStatements = 0; 85 int currentStatementsLimit = 0; 86 long accumulatedComplexity = 0L; 87 long currentComplexityLimit = 0L; 88 currentComplexityLimit = (long) (PseudoRandom.random() 89 * (complexityLimit - accumulatedComplexity)); 90 IRNode switchExp = builder.setComplexityLimit(currentComplexityLimit) 91 .setResultType(type) 92 .setExceptionSafe(false) 93 .setNoConsts(true) 94 .getLimitedExpressionFactory() 95 .produce(); 96 accumulatedComplexity += currentComplexityLimit; 97 ArrayList<Type> caseTypes = new ArrayList<>(); 98 caseTypes.add(new TypeByte()); 99 caseTypes.add(new TypeChar()); 100 caseTypes = new ArrayList<>(TypeUtil.getLessCapatiousOrEqualThan(caseTypes, 101 (BuiltInType) type)); 102 if (PseudoRandom.randomBoolean()) { // "default" 103 currentStatementsLimit = (int) (PseudoRandom.random() 104 * (statementLimit - accumulatedStatements)); 105 currentComplexityLimit = (long) (PseudoRandom.random() 106 * (complexityLimit - accumulatedComplexity)); 107 caseConsts.add(null); 108 caseBlocks.add(builder.setComplexityLimit(currentComplexityLimit) 109 .setStatementLimit(currentStatementsLimit) 110 .setLevel(level + 1) 111 .setCanHaveReturn(false) 112 .setCanHaveBreaks(false) 113 .getBlockFactory() 114 .produce()); 115 builder.setCanHaveBreaks(true) 116 .setCanHaveReturn(canHaveReturn); 117 accumulatedStatements += currentStatementsLimit; 118 accumulatedComplexity += currentComplexityLimit; 119 } 120 HashSet<Integer> cases = new HashSet<>(); | 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 package jdk.test.lib.jittester.factories; 25 26 import java.util.ArrayList; 27 import java.util.HashSet; 28 import java.util.List; 29 import jdk.test.lib.jittester.BuiltInType; 30 import jdk.test.lib.jittester.IRNode; 31 import jdk.test.lib.jittester.Literal; 32 import jdk.test.lib.jittester.Nothing; 33 import jdk.test.lib.jittester.ProductionFailedException; 34 import jdk.test.lib.jittester.Rule; 35 import jdk.test.lib.jittester.Switch; 36 import jdk.test.lib.jittester.Type; 37 import jdk.test.lib.jittester.utils.TypeUtil; 38 import jdk.test.lib.jittester.types.TypeKlass; 39 import jdk.test.lib.jittester.types.TypeByte; 40 import jdk.test.lib.jittester.types.TypeChar; 41 import jdk.test.lib.jittester.types.TypeInt; 42 import jdk.test.lib.jittester.types.TypeShort; 43 import jdk.test.lib.jittester.utils.PseudoRandom; 44 45 class SwitchFactory extends SafeFactory { 46 private int caseBlockIdx; 47 protected long complexityLimit; 48 protected int statementLimit, operatorLimit; 49 private boolean canHaveReturn = false; 50 private final TypeKlass ownerClass; 51 private final int level; 52 53 SwitchFactory(TypeKlass ownerClass, long complexityLimit, int statementLimit, 54 int operatorLimit, int level, boolean canHaveReturn) { 55 this.ownerClass = ownerClass; 56 this.complexityLimit = complexityLimit; 57 this.statementLimit = statementLimit; 58 this.operatorLimit = operatorLimit; 59 this.level = level; 60 this.canHaveReturn = canHaveReturn; 61 } 62 63 @Override 64 protected IRNode sproduce() throws ProductionFailedException { 65 if (statementLimit > 0 && complexityLimit > 0) { 66 List<Type> switchTypes = new ArrayList<>(); 67 switchTypes.add(new TypeChar()); 68 switchTypes.add(new TypeByte()); 69 switchTypes.add(new TypeShort()); 70 switchTypes.add(new TypeInt()); 71 PseudoRandom.shuffle(switchTypes); 72 IRNodeBuilder builder = new IRNodeBuilder() 73 .setOwnerKlass(ownerClass) 74 .setOperatorLimit(operatorLimit) 75 .setSubBlock(false) 76 .setCanHaveBreaks(true) 77 .setCanHaveContinues(false) 78 .setCanHaveReturn(canHaveReturn); 79 MAIN_LOOP: 80 for (Type type : switchTypes) { 81 List<IRNode> caseConsts = new ArrayList<>(); 82 List<IRNode> caseBlocks = new ArrayList<>(); 83 try { 84 int accumulatedStatements = 0; 85 int currentStatementsLimit = 0; 86 long accumulatedComplexity = 0L; 87 long currentComplexityLimit = 0L; 88 currentComplexityLimit = (long) (PseudoRandom.random() 89 * (complexityLimit - accumulatedComplexity)); 90 IRNode switchExp = builder.setComplexityLimit(currentComplexityLimit) 91 .setResultType(type) 92 .setExceptionSafe(false) 93 .setNoConsts(true) 94 .getLimitedExpressionFactory() 95 .produce(); 96 accumulatedComplexity += currentComplexityLimit; 97 List<Type> caseTypes = new ArrayList<>(); 98 caseTypes.add(new TypeByte()); 99 caseTypes.add(new TypeChar()); 100 caseTypes = new ArrayList<>(TypeUtil.getLessCapaciousOrEqualThan(caseTypes, 101 (BuiltInType) type)); 102 if (PseudoRandom.randomBoolean()) { // "default" 103 currentStatementsLimit = (int) (PseudoRandom.random() 104 * (statementLimit - accumulatedStatements)); 105 currentComplexityLimit = (long) (PseudoRandom.random() 106 * (complexityLimit - accumulatedComplexity)); 107 caseConsts.add(null); 108 caseBlocks.add(builder.setComplexityLimit(currentComplexityLimit) 109 .setStatementLimit(currentStatementsLimit) 110 .setLevel(level + 1) 111 .setCanHaveReturn(false) 112 .setCanHaveBreaks(false) 113 .getBlockFactory() 114 .produce()); 115 builder.setCanHaveBreaks(true) 116 .setCanHaveReturn(canHaveReturn); 117 accumulatedStatements += currentStatementsLimit; 118 accumulatedComplexity += currentComplexityLimit; 119 } 120 HashSet<Integer> cases = new HashSet<>(); |