private CodeExecutableElement createIsSameMethod(SpecializationData specialization) { if (!specialization.isSpecialized() || !options.implicitCastOptimization().isDuplicateTail()) { return null;
private CodeTree createExecuteChild(NodeExecutionData execution, LocalVariable target, LocalContext currentValues, boolean shared) { final CodeTreeBuilder builder = CodeTreeBuilder.createBuilder(); CodeTree assignment = createAssignmentStart(target, shared); final Set<ExecutableTypeData> executableTypes = findSpecializedExecutableTypes(execution, target.getTypeMirror()); if (executableTypes.isEmpty()) { throw new AssertionError(); // cannot execute child } else if (executableTypes.size() == 1 && !typeSystem.hasImplicitSourceTypes(target.getTypeMirror())) { ExecutableTypeData executableType = executableTypes.iterator().next(); if (isObject(target.getTypeMirror()) && executableType.getEvaluatedCount() == 0) { return createPolymorphicExecuteChild(execution, target, currentValues, shared); } else { builder.tree(assignment); builder.tree(createSingleExecute(execution, target, currentValues, executableType)); } } else { if (options.implicitCastOptimization().isNone()) { throw new AssertionError("findSpecializedExecutableTypes is always 1 if implicit cast opt is disabled"); } else if (options.implicitCastOptimization().isDuplicateTail()) { builder.tree(createExecuteChildDuplicateTail(builder, execution, assignment, target, currentValues)); } else if (options.implicitCastOptimization().isMergeCasts()) { // TODO throw new UnsupportedOperationException(); } else { throw new AssertionError(); } } return builder.build(); }
} else { ImplicitCastOptimization opt = options.implicitCastOptimization(); if (specializationExecution.isFastPath() && !opt.isNone()) { if (opt.isDuplicateTail()) { String typeHintField = implicitClassFieldName(execution); checkBuilder.tree(TypeSystemCodeGenerator.implicitCheck(typeSystem, targetType, valueReference, typeHintField)); castBuilder.tree(TypeSystemCodeGenerator.implicitCast(typeSystem, targetType, valueReference, typeHintField)); } else if (opt.isMergeCasts()) { checkBuilder.tree(ImplicitCastNodeFactory.check(implicitNodeFieldName(execution), valueReference)); castBuilder.tree(ImplicitCastNodeFactory.cast(implicitNodeFieldName(execution), valueReference));
if (options.implicitCastOptimization().isDuplicateTail()) { constructor.addParameter(var.createParameter()); CodeTree implicitType = TypeSystemCodeGenerator.implicitType(typeSystem, p.getType(), var.createReference()); builder.startStatement().string("this.").string(implicitFieldName).string(" = ").tree(implicitType).end(); } else if (options.implicitCastOptimization().isMergeCasts()) {
public CodeTypeElement create() { String name = typeName(typeSystem); CodeTypeElement clazz = GeneratorUtils.createClass(typeSystem, null, modifiers(PUBLIC, FINAL), name, typeSystem.getTemplateType().asType()); clazz.add(GeneratorUtils.createConstructorUsingFields(modifiers(PROTECTED), clazz)); CodeVariableElement singleton = createSingleton(clazz); clazz.add(singleton); for (TypeMirror type : typeSystem.getLegacyTypes()) { if (ElementUtils.isVoid(type) || ElementUtils.isObject(type)) { continue; } clazz.addOptional(createIsTypeMethod(type)); clazz.addOptional(createAsTypeMethod(type)); clazz.addOptional(createExpectTypeMethod(type, context.getType(Object.class))); } List<TypeMirror> lookupTargetTypes = typeSystem.lookupTargetTypes(); for (TypeMirror type : lookupTargetTypes) { clazz.add(createAsImplicitTypeMethod(type, false)); if (typeSystem.getOptions().implicitCastOptimization().isNone()) { clazz.add(createExpectImplicitTypeMethod(type, false)); } clazz.add(createIsImplicitTypeMethod(type, false)); if (typeSystem.getOptions().implicitCastOptimization().isDuplicateTail()) { clazz.add(createAsImplicitTypeMethod(type, true)); clazz.add(createExpectImplicitTypeMethod(type, true)); clazz.add(createIsImplicitTypeMethod(type, true)); clazz.add(createGetImplicitClass(type)); } } return clazz; }
@Override public CodeTypeElement create(ProcessorContext context, TypeSystemData typeSystem) { CodeTypeElement clazz = new TypeClassFactory(context, typeSystem).create(); if (typeSystem.getOptions().implicitCastOptimization().isMergeCasts()) { for (TypeMirror type : typeSystem.lookupTargetTypes()) { clazz.add(new ImplicitCastNodeFactory(context, typeSystem, type).create()); } } return clazz; }