< prev index next >
test/testlibrary/jittester/src/jdk/test/lib/jittester/factories/ForFactory.java
Print this page
*** 21,54 ****
* questions.
*/
package jdk.test.lib.jittester.factories;
import jdk.test.lib.jittester.IRNode;
- import jdk.test.lib.jittester.Initialization;
import jdk.test.lib.jittester.Literal;
import jdk.test.lib.jittester.LocalVariable;
import jdk.test.lib.jittester.Nothing;
import jdk.test.lib.jittester.ProductionFailedException;
import jdk.test.lib.jittester.Rule;
import jdk.test.lib.jittester.SymbolTable;
import jdk.test.lib.jittester.Type;
import jdk.test.lib.jittester.loops.For;
import jdk.test.lib.jittester.loops.Loop;
import jdk.test.lib.jittester.types.TypeKlass;
- import jdk.test.lib.jittester.types.TypeInt;
import jdk.test.lib.jittester.utils.PseudoRandom;
! class ForFactory extends SafeFactory {
private final Loop loop;
private final long complexityLimit;
private final int statementLimit;
private final int operatorLimit;
private final TypeKlass ownerClass;
private final Type returnType;
private final int level;
- private long thisLoopIterLimit = 0;
private final boolean canHaveReturn;
ForFactory(TypeKlass ownerClass, Type returnType, long complexityLimit, int statementLimit,
int operatorLimit, int level, boolean canHaveReturn) {
this.ownerClass = ownerClass;
--- 21,56 ----
* questions.
*/
package jdk.test.lib.jittester.factories;
+ import jdk.test.lib.jittester.Block;
import jdk.test.lib.jittester.IRNode;
import jdk.test.lib.jittester.Literal;
import jdk.test.lib.jittester.LocalVariable;
import jdk.test.lib.jittester.Nothing;
import jdk.test.lib.jittester.ProductionFailedException;
import jdk.test.lib.jittester.Rule;
+ import jdk.test.lib.jittester.Statement;
import jdk.test.lib.jittester.SymbolTable;
import jdk.test.lib.jittester.Type;
+ import jdk.test.lib.jittester.TypeList;
import jdk.test.lib.jittester.loops.For;
import jdk.test.lib.jittester.loops.Loop;
import jdk.test.lib.jittester.types.TypeKlass;
import jdk.test.lib.jittester.utils.PseudoRandom;
! import java.util.LinkedList;
!
! class ForFactory extends SafeFactory<For> {
private final Loop loop;
private final long complexityLimit;
private final int statementLimit;
private final int operatorLimit;
private final TypeKlass ownerClass;
private final Type returnType;
private final int level;
private final boolean canHaveReturn;
ForFactory(TypeKlass ownerClass, Type returnType, long complexityLimit, int statementLimit,
int operatorLimit, int level, boolean canHaveReturn) {
this.ownerClass = ownerClass;
*** 60,70 ****
loop = new Loop();
this.canHaveReturn = canHaveReturn;
}
@Override
! protected IRNode sproduce() throws ProductionFailedException {
if (statementLimit <= 0 || complexityLimit <= 0) {
throw new ProductionFailedException();
}
IRNodeBuilder builder = new IRNodeBuilder()
.setOwnerKlass(ownerClass)
--- 62,73 ----
loop = new Loop();
this.canHaveReturn = canHaveReturn;
}
@Override
! protected For sproduce() throws ProductionFailedException {
! Block emptyBlock = new Block(ownerClass, returnType, new LinkedList<>(), level - 1);
if (statementLimit <= 0 || complexityLimit <= 0) {
throw new ProductionFailedException();
}
IRNodeBuilder builder = new IRNodeBuilder()
.setOwnerKlass(ownerClass)
*** 79,89 ****
complexity -= headerComplLimit;
int headerStatementLimit = PseudoRandom.randomNotZero((int) (statementLimit / 4.0));
long statement1ComplLimit = (long) (0.005 * complexity * PseudoRandom.random());
complexity -= statement1ComplLimit;
// Loop body parameters
! thisLoopIterLimit = (long) (0.0001 * complexity * PseudoRandom.random());
if (thisLoopIterLimit > Integer.MAX_VALUE || thisLoopIterLimit == 0) {
throw new ProductionFailedException();
}
complexity = thisLoopIterLimit > 0 ? complexity / thisLoopIterLimit : 0;
long condComplLimit = (long) (complexity * PseudoRandom.random());
--- 82,92 ----
complexity -= headerComplLimit;
int headerStatementLimit = PseudoRandom.randomNotZero((int) (statementLimit / 4.0));
long statement1ComplLimit = (long) (0.005 * complexity * PseudoRandom.random());
complexity -= statement1ComplLimit;
// Loop body parameters
! long thisLoopIterLimit = (long) (0.0001 * complexity * PseudoRandom.random());
if (thisLoopIterLimit > Integer.MAX_VALUE || thisLoopIterLimit == 0) {
throw new ProductionFailedException();
}
complexity = thisLoopIterLimit > 0 ? complexity / thisLoopIterLimit : 0;
long condComplLimit = (long) (complexity * PseudoRandom.random());
*** 98,108 ****
int body2StatementLimit = PseudoRandom.randomNotZero((int) (statementLimit / 4.0));
long body3ComplLimit = complexity;
int body3StatementLimit = PseudoRandom.randomNotZero((int) (statementLimit / 4.0));
// Production
loop.initialization = builder.getCounterInitializerFactory(0).produce();
! IRNode header;
try {
header = builder.setComplexityLimit(headerComplLimit)
.setStatementLimit(headerStatementLimit)
.setLevel(level - 1)
.setSubBlock(true)
--- 101,111 ----
int body2StatementLimit = PseudoRandom.randomNotZero((int) (statementLimit / 4.0));
long body3ComplLimit = complexity;
int body3StatementLimit = PseudoRandom.randomNotZero((int) (statementLimit / 4.0));
// Production
loop.initialization = builder.getCounterInitializerFactory(0).produce();
! Block header;
try {
header = builder.setComplexityLimit(headerComplLimit)
.setStatementLimit(headerStatementLimit)
.setLevel(level - 1)
.setSubBlock(true)
*** 110,125 ****
.setCanHaveContinues(false)
.setCanHaveReturn(false)
.getBlockFactory()
.produce();
} catch (ProductionFailedException e) {
! header = new Nothing();
}
SymbolTable.push();
IRNode statement1;
try {
! Rule rule = new Rule("statement1");
builder.setComplexityLimit(statement1ComplLimit);
rule.add("assignment", builder.getAssignmentOperatorFactory());
rule.add("function", builder.getFunctionFactory(), 0.1);
rule.add("initialization", builder.setIsConstant(false)
.setIsStatic(false)
--- 113,128 ----
.setCanHaveContinues(false)
.setCanHaveReturn(false)
.getBlockFactory()
.produce();
} catch (ProductionFailedException e) {
! header = emptyBlock;
}
SymbolTable.push();
IRNode statement1;
try {
! Rule<IRNode> rule = new Rule<>("statement1");
builder.setComplexityLimit(statement1ComplLimit);
rule.add("assignment", builder.getAssignmentOperatorFactory());
rule.add("function", builder.getFunctionFactory(), 0.1);
rule.add("initialization", builder.setIsConstant(false)
.setIsStatic(false)
*** 127,138 ****
.getVariableInitializationFactory());
statement1 = rule.produce();
} catch (ProductionFailedException e) {
statement1 = new Nothing();
}
! LocalVariable counter = new LocalVariable(((Initialization) loop.initialization).get());
! Literal limiter = new Literal(Integer.valueOf((int) thisLoopIterLimit), new TypeInt());
loop.condition = builder.setComplexityLimit(condComplLimit)
.setLocalVariable(counter)
.getLoopingConditionFactory(limiter)
.produce();
IRNode statement2;
--- 130,141 ----
.getVariableInitializationFactory());
statement1 = rule.produce();
} catch (ProductionFailedException e) {
statement1 = new Nothing();
}
! LocalVariable counter = new LocalVariable(loop.initialization.getVariableInfo());
! Literal limiter = new Literal((int) thisLoopIterLimit, TypeList.INT);
loop.condition = builder.setComplexityLimit(condComplLimit)
.setLocalVariable(counter)
.getLoopingConditionFactory(limiter)
.produce();
IRNode statement2;
*** 140,150 ****
statement2 = builder.setComplexityLimit(statement2ComplLimit)
.getAssignmentOperatorFactory().produce();
} catch (ProductionFailedException e) {
statement2 = new Nothing();
}
! IRNode body1;
try {
body1 = builder.setComplexityLimit(body1ComplLimit)
.setStatementLimit(body1StatementLimit)
.setLevel(level)
.setSubBlock(true)
--- 143,153 ----
statement2 = builder.setComplexityLimit(statement2ComplLimit)
.getAssignmentOperatorFactory().produce();
} catch (ProductionFailedException e) {
statement2 = new Nothing();
}
! Block body1;
try {
body1 = builder.setComplexityLimit(body1ComplLimit)
.setStatementLimit(body1StatementLimit)
.setLevel(level)
.setSubBlock(true)
*** 152,165 ****
.setCanHaveContinues(false)
.setCanHaveReturn(false)
.getBlockFactory()
.produce();
} catch (ProductionFailedException e) {
! body1 = new Nothing();
}
loop.manipulator = builder.setLocalVariable(counter).getCounterManipulatorFactory().produce();
! IRNode body2;
try {
body2 = builder.setComplexityLimit(body2ComplLimit)
.setStatementLimit(body2StatementLimit)
.setLevel(level)
.setSubBlock(true)
--- 155,168 ----
.setCanHaveContinues(false)
.setCanHaveReturn(false)
.getBlockFactory()
.produce();
} catch (ProductionFailedException e) {
! body1 = emptyBlock;
}
loop.manipulator = builder.setLocalVariable(counter).getCounterManipulatorFactory().produce();
! Block body2;
try {
body2 = builder.setComplexityLimit(body2ComplLimit)
.setStatementLimit(body2StatementLimit)
.setLevel(level)
.setSubBlock(true)
*** 167,179 ****
.setCanHaveContinues(true)
.setCanHaveReturn(false)
.getBlockFactory()
.produce();
} catch (ProductionFailedException e) {
! body2 = new Nothing();
}
! IRNode body3;
try {
body3 = builder.setComplexityLimit(body3ComplLimit)
.setStatementLimit(body3StatementLimit)
.setLevel(level)
.setSubBlock(true)
--- 170,182 ----
.setCanHaveContinues(true)
.setCanHaveReturn(false)
.getBlockFactory()
.produce();
} catch (ProductionFailedException e) {
! body2 = emptyBlock;
}
! Block body3;
try {
body3 = builder.setComplexityLimit(body3ComplLimit)
.setStatementLimit(body3StatementLimit)
.setLevel(level)
.setSubBlock(true)
*** 181,192 ****
.setCanHaveContinues(false)
.setCanHaveReturn(canHaveReturn)
.getBlockFactory()
.produce();
} catch (ProductionFailedException e) {
! body3 = new Nothing();
}
SymbolTable.pop();
! return new For(level, loop, thisLoopIterLimit, header, statement1, statement2, body1,
body2, body3);
}
}
--- 184,198 ----
.setCanHaveContinues(false)
.setCanHaveReturn(canHaveReturn)
.getBlockFactory()
.produce();
} catch (ProductionFailedException e) {
! body3 = emptyBlock;
}
SymbolTable.pop();
! return new For(level, loop, thisLoopIterLimit, header,
! new Statement(statement1, false),
! new Statement(statement2, false),
! body1,
body2, body3);
}
}
< prev index next >