// We'll create values to be stored with fields, method parameters,
// and return values.
ValueFactory valueFactory = new ParticularValueFactory();
ValueFactory detailedValueFactory = new DetailedValueFactory();
InvocationUnit storingInvocationUnit =
new StoringInvocationUnit(valueFactory,
fieldPropagationValue,
methodPropagationParameter,
methodPropagationReturnvalue);
// Evaluate synthetic classes in more detail, notably to propagate
// the arrays of the classes generated for enum switch statements.
programClassPool.classesAccept(
new ClassAccessFilter(ClassConstants.INTERNAL_ACC_SYNTHETIC, 0,
new AllMethodVisitor(
new AllAttributeVisitor(
new PartialEvaluator(detailedValueFactory, storingInvocationUnit, false)))));
// Evaluate non-synthetic classes.
programClassPool.classesAccept(
new ClassAccessFilter(0, ClassConstants.INTERNAL_ACC_SYNTHETIC,
new AllMethodVisitor(
new AllAttributeVisitor(
new PartialEvaluator(valueFactory, storingInvocationUnit, false)))));
if (fieldPropagationValue)
{
// Count the constant fields.
programClassPool.classesAccept(
new AllFieldVisitor(
new ConstantMemberFilter(fieldPropagationValueCounter)));
}
if (methodPropagationParameter)
{
// Count the constant method parameters.
programClassPool.classesAccept(
new AllMethodVisitor(
new ConstantParameterFilter(methodPropagationParameterCounter)));
}
if (methodPropagationReturnvalue)
{
// Count the constant method return values.
programClassPool.classesAccept(
new AllMethodVisitor(
new ConstantMemberFilter(methodPropagationReturnvalueCounter)));
}
if (classUnboxingEnumCounter.getCount() > 0)
{
// Propagate the simple enum constant counts.
programClassPool.classesAccept(
new SimpleEnumFilter(
new SimpleEnumArrayPropagator()));
}
if (codeSimplificationAdvanced)
{
// Fill out constants into the arrays of synthetic classes,
// notably the arrays of the classes generated for enum switch
// statements.
InvocationUnit loadingInvocationUnit =
new LoadingInvocationUnit(valueFactory,
fieldPropagationValue,
methodPropagationParameter,
methodPropagationReturnvalue);
programClassPool.classesAccept(
new ClassAccessFilter(ClassConstants.INTERNAL_ACC_SYNTHETIC, 0,
new AllMethodVisitor(
new AllAttributeVisitor(
new PartialEvaluator(valueFactory, loadingInvocationUnit, false)))));
}
}
// Perform partial evaluation again, now loading any previously stored
// values for fields, method parameters, and method return values.
ValueFactory valueFactory = new IdentifiedValueFactory();
InvocationUnit loadingInvocationUnit =
new LoadingInvocationUnit(valueFactory,
fieldPropagationValue,
methodPropagationParameter,
methodPropagationReturnvalue);