| /* |
| * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| package selectionresolution; |
| |
| import java.util.function.BiConsumer; |
| import java.util.function.Consumer; |
| import java.util.Arrays; |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.EnumSet; |
| import java.util.HashSet; |
| import java.util.LinkedList; |
| |
| /** |
| * Templates are sets of transformations that are applied to a |
| * SelectionResolutionTestCase.Builder as part of building up a test |
| * case. Templates should contain a collection of different |
| * transforms, all of which represent an "interesting" case in a |
| * general category of cases. |
| * |
| */ |
| public class Template { |
| |
| public enum Kind { CLASS, INTERFACE; } |
| |
| public final Collection<Consumer<SelectionResolutionTestCase.Builder>> cases; |
| public final String name; |
| |
| /** |
| * Create a template from a collection of lambdas that modify a Builder. |
| * |
| * @param name The name of the template. |
| * @param cases The cases in the template. |
| */ |
| public Template(final String name, |
| final Collection<Consumer<SelectionResolutionTestCase.Builder>> cases) { |
| this.cases = cases; |
| this.name = name; |
| } |
| |
| /** |
| * Build a template out of a set of lambdas that modify a Builder. |
| * |
| * @param name The name of the template. |
| * @param cases The cases in the template. |
| */ |
| public Template(final String name, |
| final Consumer<SelectionResolutionTestCase.Builder>... cases) { |
| this(name, Arrays.asList(cases)); |
| } |
| |
| /** |
| * Build a template out of a set of lambdas that modify a Builder. |
| * Also include all cases from another template. |
| * |
| * @param name The name of the template. |
| * @param include Include all cases from this template. |
| * @param cases The cases in the template. |
| */ |
| public Template(final String name, |
| final Template include, |
| final Consumer<SelectionResolutionTestCase.Builder>... cases) { |
| this(name, new LinkedList(include.cases)); |
| this.cases.addAll(Arrays.asList(cases)); |
| } |
| |
| /** |
| * Build a template out of a set of lambdas that modify a Builder. |
| * Also include all cases from another template. |
| * |
| * @param name The name of the template. |
| * @param include Include all cases from this template. |
| * @param cases The cases in the template. |
| */ |
| public Template(final String name, |
| final Template... others) { |
| this(name, new LinkedList()); |
| |
| for(final Template template : others) { |
| cases.addAll(template.cases); |
| } |
| } |
| |
| /** |
| * Run all cases in the template. This will run each action in |
| * the template and then call the next action on a separate copy |
| * of the builder parameter. |
| * |
| * @param The next action to perform of the Builder. |
| * @param The Builder to modify. |
| */ |
| public void runCases(final Consumer<SelectionResolutionTestCase.Builder> next, |
| final SelectionResolutionTestCase.Builder builder) { |
| for(final Consumer<SelectionResolutionTestCase.Builder> thiscase : cases) { |
| final SelectionResolutionTestCase.Builder localbuilder = builder.copy(); |
| thiscase.accept(localbuilder); |
| next.accept(localbuilder); |
| } |
| } |
| |
| public void printCases(final SelectionResolutionTestCase.Builder builder) { |
| int i = 1; |
| System.err.println("Template " + name + ":\n"); |
| for(final Consumer<SelectionResolutionTestCase.Builder> thiscase : cases) { |
| final SelectionResolutionTestCase.Builder localbuilder = builder.copy(); |
| thiscase.accept(localbuilder); |
| System.err.println("Case " + i++); |
| System.err.println(localbuilder); |
| } |
| } |
| |
| /* Create an empty class in the given package */ |
| public static final ClassData emptyClass(final ClassData.Package pck) { |
| return new ClassData(pck, null); |
| } |
| |
| /* These are functions that are used to build callsite templates */ |
| public static void callsiteIsMethodref(final SelectionResolutionTestCase.Builder builder) { |
| builder.callsite = builder.methodref; |
| } |
| |
| public static void callsiteSubclassMethodref(final SelectionResolutionTestCase.Builder builder) { |
| final int callsite = |
| builder.addClass(Template.emptyClass(ClassData.Package.SAME)); |
| builder.hier.addInherit(callsite, builder.methodref); |
| builder.callsite = callsite; |
| } |
| |
| public static void callsiteUnrelatedMethodref(final SelectionResolutionTestCase.Builder builder) { |
| final int callsite = |
| builder.addClass(Template.emptyClass(ClassData.Package.SAME)); |
| builder.callsite = callsite; |
| } |
| |
| public static void methodrefIsExpected(final SelectionResolutionTestCase.Builder builder) { |
| builder.methodref = builder.expected; |
| } |
| |
| public static final Template MethodrefEqualsExpected = |
| new Template("MethodrefEqualsExpected", |
| Template::methodrefIsExpected); |
| |
| /***************************** |
| * Set Invoke Template * |
| *****************************/ |
| |
| public static final Template SetInvoke(final SelectionResolutionTestCase.InvokeInstruction invoke) { |
| return new Template("SetInvoke(" + invoke + ")", |
| Collections.singleton((builder) -> { |
| builder.invoke = invoke; |
| })); |
| } |
| |
| /***************************** |
| * Result Combo Template * |
| *****************************/ |
| public static Template ResultCombo(final EnumSet<Kind> kinds, |
| final EnumSet<MethodData.Access> accesses, |
| final EnumSet<MethodData.Context> contexts, |
| final EnumSet<ClassData.Package> packages) { |
| final LinkedList<Consumer<SelectionResolutionTestCase.Builder>> cases = |
| new LinkedList<>(); |
| |
| for (final Kind kind : kinds) { |
| for (final MethodData.Access acc : accesses) { |
| for (final MethodData.Context ctx : contexts) { |
| if (!(acc == MethodData.Access.PRIVATE && |
| ctx == MethodData.Context.ABSTRACT)) { |
| for (final ClassData.Package pck : packages) { |
| cases.add((builder) -> { |
| final MethodData meth = new MethodData(acc, ctx); |
| final ClassData cls = new ClassData(pck, meth); |
| switch(kind) { |
| case CLASS: |
| builder.expected = builder.addClass(cls); |
| break; |
| case INTERFACE: |
| builder.expected = builder.addInterface(cls); |
| break; |
| } |
| }); |
| } |
| } |
| } |
| } |
| } |
| |
| return new Template("ResultCombo", cases); |
| } |
| |
| public static Template ResolutionOverride(final EnumSet<Kind> kinds, |
| final EnumSet<MethodData.Access> accesses, |
| final EnumSet<MethodData.Context> contexts, |
| final EnumSet<ClassData.Package> packages) { |
| final LinkedList<Consumer<SelectionResolutionTestCase.Builder>> cases = |
| new LinkedList<>(); |
| |
| for (final Kind kind : kinds) { |
| for (final MethodData.Access acc : accesses) { |
| for (final MethodData.Context ctx : contexts) { |
| if (!(acc == MethodData.Access.PRIVATE && |
| ctx == MethodData.Context.ABSTRACT)) { |
| for (final ClassData.Package pck : packages) { |
| cases.add((builder) -> { |
| final MethodData meth = new MethodData(acc, ctx); |
| final ClassData cls = new ClassData(pck, meth); |
| int override = -1; |
| switch(kind) { |
| case CLASS: |
| override = builder.addClass(cls); |
| break; |
| case INTERFACE: |
| override = builder.addInterface(cls); |
| break; |
| } |
| builder.hier.addInherit(override, builder.expected); |
| }); |
| } |
| } |
| } |
| } |
| } |
| |
| return new Template("ResultCombo", cases); |
| } |
| |
| /****************************** |
| * Resolution Templates * |
| ******************************/ |
| |
| private static MethodData getMethodData(final MethodData.Access acc, |
| final MethodData.Context ctx) { |
| if (!(acc == MethodData.Access.PUBLIC || |
| acc == MethodData.Access.PLACEHOLDER) && |
| ctx != MethodData.Context.STATIC) { |
| return null; |
| } else { |
| return new MethodData(MethodData.Access.PUBLIC, ctx); |
| } |
| } |
| |
| public static final Template MethodrefNotEqualsExpectedClass = |
| new Template("MethodrefNotEqualsExpectedClass", |
| /* Case 1: Inherit from super. |
| * |
| * C2[](res) |
| * C1[C2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final int C2 = builder.expected; |
| final int C1 = builder.addClass(emptyClass(ClassData.Package.SAME)); |
| builder.hier.addInherit(C1, C2); |
| builder.methodref = C1; |
| }, |
| /* Case 2: Inherit from super. |
| * |
| * C2[](res), I[](def) |
| * C1[C2,I]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData.Context ctx = |
| builder.classdata.get(builder.expected).methoddata.context; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData mdata = getMethodData(acc, ctx); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final int C2 = builder.expected; |
| final int C1 = builder.addClass(emptyClass(ClassData.Package.SAME)); |
| final int I = builder.addInterface(withDef); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I); |
| builder.methodref = C1; |
| }, |
| /* Case 3: Inherit from super's super. |
| * |
| * C3[](res) |
| * C2[](), I[](def) |
| * C1[C2,I]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData.Context ctx = |
| builder.classdata.get(builder.expected).methoddata.context; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData mdata = getMethodData(acc, ctx); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final int C3 = builder.expected; |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(ClassData.Package.SAME)); |
| final int I = builder.addInterface(withDef); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I); |
| builder.methodref = C1; |
| }); |
| |
| public static final Template IfaceMethodrefNotEqualsExpected = |
| new Template("IfaceMethodrefNotEqualsExpected", |
| /* Case 1: Inherit from super. |
| * |
| * I2[](res) |
| * I1[I2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final int I2 = builder.expected; |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| builder.hier.addInherit(I1, I2); |
| builder.methodref = I1; |
| }, |
| /* Case 2: Inherit from super, skip private. |
| * |
| * I2[](res) |
| * I2[I3](priv) |
| * I1[I2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = new ClassData(pck, meth); |
| final int I3 = builder.expected; |
| final int I2 = builder.addInterface(withPrivDef); |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(I2, I3); |
| builder.methodref = I1; |
| }, |
| /* Case 3: Inherit from super, skip static. |
| * |
| * I2[](res) |
| * I2[I3](stat) |
| * I1[I2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = new ClassData(pck, meth); |
| final int I3 = builder.expected; |
| final int I2 = builder.addInterface(withStatDef); |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(I2, I3); |
| builder.methodref = I1; |
| }, |
| /* Case 4: Maximally-specific. |
| * |
| * I3[](def) |
| * I2[I3](res) |
| * I1[I2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData.Context ctx = |
| builder.classdata.get(builder.expected).methoddata.context; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData mdata = getMethodData(acc, ctx); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final int I3 = builder.addInterface(withDef); |
| final int I2 = builder.expected; |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(I2, I3); |
| builder.methodref = I1; |
| }, |
| /* Case 5: Diamond, expected at top. |
| * |
| * I4[](res) |
| * I2[I4](), I3[I4]() |
| * I1[I2,I3]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final int I4 = builder.expected; |
| final int I3 = builder.addInterface(emptyClass(pck)); |
| final int I2 = builder.addInterface(emptyClass(pck)); |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I4); |
| builder.hier.addInherit(I3, I4); |
| builder.methodref = I1; |
| }, |
| /* Case 6: Diamond, skip private. |
| * |
| * I4[](res) |
| * I2[I4](priv), I3[I4]() |
| * I1[I2,I3]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData.Context ctx = |
| builder.classdata.get(builder.expected).methoddata.context; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData mdata = getMethodData(acc, ctx); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = new ClassData(pck, meth); |
| final int I4 = builder.expected; |
| final int I3 = builder.addInterface(emptyClass(pck)); |
| final int I2 = builder.addInterface(withPrivDef); |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I4); |
| builder.hier.addInherit(I3, I4); |
| builder.methodref = I1; |
| }, |
| /* Case 7: Diamond, skip static. |
| * |
| * I4[](res) |
| * I2[I4](stat), I3[I4]() |
| * I1[I2,I3]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData.Context ctx = |
| builder.classdata.get(builder.expected).methoddata.context; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData mdata = getMethodData(acc, ctx); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = new ClassData(pck, meth); |
| final int I4 = builder.expected; |
| final int I3 = builder.addInterface(emptyClass(pck)); |
| final int I2 = builder.addInterface(withStatDef); |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I4); |
| builder.hier.addInherit(I3, I4); |
| builder.methodref = I1; |
| }, |
| /* Case 8: Diamond, maximally-specific. |
| * |
| * I4[](def) |
| * I2[I4](res), I3[I4]() |
| * I1[I2,I3]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData.Context ctx = |
| builder.classdata.get(builder.expected).methoddata.context; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData mdata = getMethodData(acc, ctx); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final int I4 = builder.addInterface(withDef); |
| final int I3 = builder.addInterface(emptyClass(pck)); |
| final int I2 = builder.expected; |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I4); |
| builder.hier.addInherit(I3, I4); |
| builder.methodref = I1; |
| }, |
| /* Case 9: Diamond, maximally-specific, skipping private. |
| * |
| * I4[](def) |
| * I2[I4](res), I3[I4](priv) |
| * I1[I2,I3]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData.Context ctx = |
| builder.classdata.get(builder.expected).methoddata.context; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData mdata = getMethodData(acc, ctx); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = new ClassData(pck, meth); |
| final int I4 = builder.addInterface(withDef); |
| final int I3 = builder.addInterface(withPrivDef); |
| final int I2 = builder.expected; |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I4); |
| builder.hier.addInherit(I3, I4); |
| builder.methodref = I1; |
| }, |
| /* Case 10: Diamond, maximally-specific, skipping static. |
| * |
| * I4[](def) |
| * I2[I4](res), I3[I4](stat) |
| * I1[I2,I3]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData.Context ctx = |
| builder.classdata.get(builder.expected).methoddata.context; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData mdata = getMethodData(acc, ctx); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = new ClassData(pck, meth); |
| final int I4 = builder.addInterface(withDef); |
| final int I3 = builder.addInterface(withStatDef); |
| final int I2 = builder.expected; |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I4); |
| builder.hier.addInherit(I3, I4); |
| builder.methodref = I1; |
| }); |
| |
| public static final Template MethodrefNotEqualsExpectedIface = |
| new Template("MethodrefNotEqualsExpectedIface", |
| /* Case 1: Inherit from superinterface. |
| * |
| * I[](res) |
| * C[I]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final int I = builder.expected; |
| final int C = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C, I); |
| builder.methodref = C; |
| }, |
| /* Case 2: Diamond, expected at top. |
| * |
| * I3[](res) |
| * I1[I3](), I2[I3]() |
| * C[I1,I2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final int I3 = builder.expected; |
| final int I2 = builder.addInterface(emptyClass(pck)); |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C, I1); |
| builder.hier.addInherit(C, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I3); |
| builder.methodref = C; |
| }, |
| /* Case 3: Diamond, skipping private. |
| * |
| * I3[](def) |
| * I1[I3](priv), I2[I3]() |
| * C[I1,I2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData.Context ctx = |
| builder.classdata.get(builder.expected).methoddata.context; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = new ClassData(pck, meth); |
| final int I3 = builder.expected; |
| final int I2 = builder.addInterface(emptyClass(pck)); |
| final int I1 = builder.addInterface(withPrivDef); |
| final int C = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C, I1); |
| builder.hier.addInherit(C, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I3); |
| builder.methodref = C; |
| }, |
| /* Case 4: Diamond, skipping static. |
| * |
| * I3[](def) |
| * I1[I3](stat), I2[I3]() |
| * C[I1,I2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData.Context ctx = |
| builder.classdata.get(builder.expected).methoddata.context; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = new ClassData(pck, meth); |
| final int I3 = builder.expected; |
| final int I2 = builder.addInterface(emptyClass(pck)); |
| final int I1 = builder.addInterface(withStatDef); |
| final int C = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C, I1); |
| builder.hier.addInherit(C, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I3); |
| builder.methodref = C; |
| }, |
| /* Case 5: Diamond, maximally-specific. |
| * |
| * I3[](def) |
| * I1[I3](res), I2[I3]() |
| * C[I1,I2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData.Context ctx = |
| builder.classdata.get(builder.expected).methoddata.context; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData mdata = getMethodData(acc, ctx); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final int I3 = builder.addInterface(withDef); |
| final int I2 = builder.addInterface(emptyClass(pck)); |
| final int I1 = builder.expected; |
| final int C = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C, I1); |
| builder.hier.addInherit(C, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I3); |
| builder.methodref = C; |
| }, |
| /* Case 6: Diamond, maximally-specific, skipping private. |
| * |
| * I3[](def) |
| * I1[I3](res), I2[I3](priv) |
| * C[I1,I2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData.Context ctx = |
| builder.classdata.get(builder.expected).methoddata.context; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData mdata = getMethodData(acc, ctx); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = new ClassData(pck, meth); |
| final int I3 = builder.addInterface(withDef); |
| final int I2 = builder.addInterface(withPrivDef); |
| final int I1 = builder.expected; |
| final int C = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C, I1); |
| builder.hier.addInherit(C, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I3); |
| builder.methodref = C; |
| }, |
| /* Case 7: Diamond, maximally-specific, skipping static. |
| * |
| * I3[](def) |
| * I1[I3](res), I2[I3](stat) |
| * C[I1,I2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData.Context ctx = |
| builder.classdata.get(builder.expected).methoddata.context; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData mdata = getMethodData(acc, ctx); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = new ClassData(pck, meth); |
| final int I3 = builder.addInterface(withDef); |
| final int I2 = builder.addInterface(withStatDef); |
| final int I1 = builder.expected; |
| final int C = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C, I1); |
| builder.hier.addInherit(C, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I3); |
| builder.methodref = C; |
| }, |
| /* Case 8: Diamond, with superclass, expected at top. |
| * |
| * I2[](res) |
| * C2[I2](), I1[I2]() |
| * C1[I1,C2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final int I2 = builder.expected; |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C2 = builder.addInterface(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C2, I2); |
| builder.methodref = C1; |
| }, |
| /* Case 9: Diamond with superclass, maximally-specific. |
| * |
| * I2[](def) |
| * C2[I2](), I1[I2](res), |
| * C1[I1,C2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData.Context ctx = |
| builder.classdata.get(builder.expected).methoddata.context; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData mdata = getMethodData(acc, ctx); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final int I2 = builder.addInterface(withDef); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int I1 = builder.expected; |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C2, I2); |
| builder.methodref = C1; |
| }, |
| /* Case 10: Inherit through superclass. |
| * |
| * I[](res) |
| * C2[I]() |
| * C1[C2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final int I = builder.expected; |
| final int C2 = builder.addInterface(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, I); |
| builder.methodref = C1; |
| }, |
| /* Case 11: Diamond, inherit through superclass, |
| * expected at top. |
| * |
| * I3[](res) |
| * I1[I3](), I2[I3]() |
| * C2[I1,I2]() |
| * C1[C2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final int I3 = builder.expected; |
| final int I2 = builder.addInterface(emptyClass(pck)); |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I1); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I3); |
| builder.hier.addInherit(C1, C2); |
| builder.methodref = C1; |
| }, |
| /* Case 12: Diamond through superclass, skip private. |
| * |
| * I3[](res) |
| * I1[I3](priv), I2[I3]() |
| * C2[I1,I2]() |
| * C1[C2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData.Context ctx = |
| builder.classdata.get(builder.expected).methoddata.context; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData mdata = getMethodData(acc, ctx); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = new ClassData(pck, meth); |
| final int I3 = builder.expected; |
| final int I2 = builder.addInterface(emptyClass(pck)); |
| final int I1 = builder.addInterface(withPrivDef); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I1); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I3); |
| builder.hier.addInherit(C1, C2); |
| builder.methodref = C1; |
| }, |
| /* Case 13: Diamond through superclass, skip static. |
| * |
| * I3[](def) |
| * I1[I3](stat), I2[I3]() |
| * C2[I1,I2]() |
| * C1[C2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData.Context ctx = |
| builder.classdata.get(builder.expected).methoddata.context; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData mdata = getMethodData(acc, ctx); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = new ClassData(pck, meth); |
| final int I3 = builder.expected; |
| final int I2 = builder.addInterface(emptyClass(pck)); |
| final int I1 = builder.addInterface(withStatDef); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I1); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I3); |
| builder.hier.addInherit(C1, C2); |
| builder.methodref = C1; |
| }, |
| /* Case 14: Diamond through superclass, maximally-specific. |
| * |
| * I3[](def) |
| * I1[I3](res), I2[I3]() |
| * C2[I1,I2]() |
| * C1[C2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData.Context ctx = |
| builder.classdata.get(builder.expected).methoddata.context; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData mdata = getMethodData(acc, ctx); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final int I3 = builder.addInterface(withDef); |
| final int I2 = builder.addInterface(emptyClass(pck)); |
| final int I1 = builder.expected; |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I1); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I3); |
| builder.hier.addInherit(C1, C2); |
| builder.methodref = C1; |
| }, |
| /* Case 15: Diamond through superclass, |
| * maximally-specific, skip private. |
| * |
| * I3[](def) |
| * I1[I3](res), I2[I3](priv) |
| * C2[I1,I2]() |
| * C1[C2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData.Context ctx = |
| builder.classdata.get(builder.expected).methoddata.context; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData mdata = getMethodData(acc, ctx); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = new ClassData(pck, meth); |
| final int I3 = builder.addInterface(withDef); |
| final int I2 = builder.addInterface(withPrivDef); |
| final int I1 = builder.expected; |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I1); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I3); |
| builder.hier.addInherit(C1, C2); |
| builder.methodref = C1; |
| }, |
| /* Case 16: Diamond through superclass, |
| * maximally-specific, skip static. |
| * |
| * I3[](pub) |
| * I1[I3](res), I2[I3](stat) |
| * C2[I1,I2]() |
| * C1[C2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData.Context ctx = |
| builder.classdata.get(builder.expected).methoddata.context; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData mdata = getMethodData(acc, ctx); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = new ClassData(pck, meth); |
| final int I3 = builder.addInterface(withDef); |
| final int I2 = builder.addInterface(withStatDef); |
| final int I1 = builder.expected; |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I1); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I3); |
| builder.hier.addInherit(C1, C2); |
| builder.methodref = C1; |
| }, |
| /* Case 17: Diamond, with superclass, inherit through |
| * superclass, expected at top. |
| * |
| * I2[](res) |
| * C3[I2](), I1[I2]() |
| * C2[I1,C3]() |
| * C1[C2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final int I2 = builder.expected; |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C3 = builder.addInterface(emptyClass(pck)); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I1); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C3, I2); |
| builder.hier.addInherit(C1, C2); |
| builder.methodref = C1; |
| }, |
| /* Case 18: Diamond, with superclass, inherit through |
| * superclass, maximally-specific. |
| * |
| * I2[](def) |
| * C3[I2](), I1[I2](res), |
| * C2[I1,C3]() |
| * C1[I1,C2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData.Context ctx = |
| builder.classdata.get(builder.expected).methoddata.context; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData mdata = getMethodData(acc, ctx); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final int I2 = builder.addInterface(withDef); |
| final int C3 = builder.addClass(emptyClass(pck)); |
| final int I1 = builder.expected; |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I1); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C3, I2); |
| builder.hier.addInherit(C1, C2); |
| builder.methodref = C1; |
| }); |
| |
| public static final Template IfaceMethodrefAmbiguous = |
| new Template("IfaceMethodrefAmbiguous", |
| /* Ambiguous. |
| * |
| * I2[](def), I3[](def) |
| * I1[I2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData expected = |
| builder.classdata.get(builder.expected); |
| final int I3 = builder.addInterface(expected); |
| final int I2 = builder.expected; |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.methodref = I1; |
| }); |
| |
| public static final Template MethodrefAmbiguous = |
| new Template("MethodrefAmbiguous", |
| /* Ambiguous. |
| * |
| * I1[](def), I2[](def) |
| * C[I2]() = mref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData expected = |
| builder.classdata.get(builder.expected); |
| final int I1 = builder.addInterface(expected); |
| final int I2 = builder.expected; |
| final int C = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C, I2); |
| builder.hier.addInherit(C, I1); |
| builder.methodref = C; |
| }); |
| |
| /****************************** |
| * Callsite Templates * |
| ******************************/ |
| |
| public static final Template AllCallsiteCases = |
| new Template("AllCallsiteCases", |
| Template::callsiteIsMethodref, |
| Template::callsiteSubclassMethodref, |
| Template::callsiteUnrelatedMethodref); |
| |
| public static final Template InvokespecialCallsiteCases = |
| new Template("InvokespecialCallsiteCases", |
| Template::callsiteIsMethodref, |
| Template::callsiteSubclassMethodref); |
| |
| public static final Template CallsiteEqualsMethodref = |
| new Template("CallsiteEqualsMethodref", |
| Template::callsiteIsMethodref); |
| |
| public static final Template CallsiteSubclassMethodref = |
| new Template("CallsiteSubclassMethodref", |
| Template::callsiteSubclassMethodref); |
| |
| public static final Template CallsiteUnrelatedToMethodref = |
| new Template("CallsiteUnrelatedToMethodref", |
| Template::callsiteUnrelatedMethodref); |
| |
| public static final Template CallsiteNotEqualsMethodref = |
| new Template("CallsiteNotEqualsMethodref", |
| Template::callsiteSubclassMethodref, |
| Template::callsiteUnrelatedMethodref); |
| |
| /********************************* |
| * AbstractMethodError Templates * |
| *********************************/ |
| |
| public static final Template ReabstractExpectedIface = |
| new Template("ReabstractExpectedIface", |
| (builder) -> {}, |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData expected = |
| builder.classdata.get(builder.expected); |
| final ClassData.Package pck = expected.packageId; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData mdata = |
| getMethodData(acc, MethodData.Context.STATIC); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final int C2 = builder.addInterface(withDef); |
| final int C1 = builder.expected; |
| builder.hier.addInherit(C1, C2); |
| }, |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData expected = |
| builder.classdata.get(builder.expected); |
| final ClassData.Package pck = expected.packageId; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData mdata = |
| getMethodData(acc, MethodData.Context.INSTANCE); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final int C2 = builder.addInterface(withDef); |
| final int C1 = builder.expected; |
| builder.hier.addInherit(C1, C2); |
| }); |
| |
| public static final Template ReabstractExpectedClass = |
| new Template("ReabstractExpectedClass", |
| ReabstractExpectedIface, |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData expected = |
| builder.classdata.get(builder.expected); |
| final ClassData.Package pck = expected.packageId; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData mdata = |
| getMethodData(acc, MethodData.Context.STATIC); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.expected; |
| builder.hier.addInherit(C1, C2); |
| }, |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData expected = |
| builder.classdata.get(builder.expected); |
| final ClassData.Package pck = expected.packageId; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData mdata = |
| getMethodData(acc, MethodData.Context.INSTANCE); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.expected; |
| builder.hier.addInherit(C1, C2); |
| }); |
| |
| public static final Template ReabstractMethodrefResolvedClass = |
| new Template("ReabstractMethodrefResolvedClass", |
| /* Case 1: Objectref overrides. |
| * |
| * C2[](*) = mref |
| * C1[C2](res) = oref = expected |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final int C2 = builder.methodref; |
| final int C1 = builder.addClass(withDef); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C1; |
| }, |
| /* Case 2: Objectref's super overrides. |
| * |
| * C3[*](*) = mref |
| * C2[C3](res) = expected |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 3: Objectref's super overrides, skip private. |
| * |
| * C3[*](*) = mref |
| * C2[C3](res) = expected |
| * C1[C2](priv) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = new ClassData(pck, meth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(withPrivDef); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 4: Objectref's super overrides, skip static. |
| * |
| * C3[*](*) = mref |
| * C2[C3](res) = expected |
| * C1[C2](stat) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = new ClassData(pck, meth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(withStatDef); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }); |
| |
| public static final Template ReabstractMethodrefResolvedIface = |
| new Template("ReabstractMethodrefResolvedIface", |
| /* Case 1: Objectref overrides. |
| * |
| * C2[](*) = mref |
| * C1[C2](res) = oref = expected |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final int C2 = builder.methodref; |
| final int C1 = builder.addClass(withDef); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C1; |
| }, |
| /* Case 2: Objectref's super overrides. |
| * |
| * C3[](*) = mref |
| * C2[C3](res) = expected |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 3: Objectref's super overrides, skip private. |
| * |
| * C3[*](*) = mref |
| * C2[C3](res) = expected |
| * C1[C2](priv) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = new ClassData(pck, meth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(withPrivDef); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 4: Objectref's super overrides, skip static. |
| * |
| * C3[*](*) = mref |
| * C2[C3](res) = expected |
| * C1[C2](stat) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = new ClassData(pck, meth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(withStatDef); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 5: Overlapping with new interface overriding. |
| * |
| * I2[*](def) = old expected |
| * C2[*](*) = mref, I1[I2](res) = expected |
| * C1[C2,I2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final int C2 = builder.methodref; |
| final int I2 = builder.expected; |
| final int I1 = builder.addInterface(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(I1, I2); |
| builder.objectref = C1; |
| builder.expected = I1; |
| }, |
| /* Case 6: Overlapping with new interface, skip private. |
| * |
| * I2[*](def) = old expected |
| * C2[*](*) = mref, I1[I2](res) = expected |
| * C1[C2,I2](priv) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = new ClassData(pck, meth); |
| final int C2 = builder.methodref; |
| final int I2 = builder.expected; |
| final int I1 = builder.addInterface(withDef); |
| final int C1 = builder.addClass(withPrivDef); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(I1, I2); |
| builder.objectref = C1; |
| builder.expected = I1; |
| }, |
| /* Case 7: Overlapping with new interface, skip static. |
| * |
| * I2[*](def) = old expected |
| * C2[*](*) = mref, I1[I2](res) = expected |
| * C1[C2,I2](stat) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = new ClassData(pck, meth); |
| final int C2 = builder.methodref; |
| final int I2 = builder.expected; |
| final int I1 = builder.addInterface(withDef); |
| final int C1 = builder.addClass(withStatDef); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(I1, I2); |
| builder.objectref = C1; |
| builder.expected = I1; |
| }, |
| /* Case 8: Overlap with objectref's super with new |
| * interface overriding, inherit through class. |
| * |
| * I2[*](def) = old expected |
| * C3[](*) = mref, I1[I2](res) = expected |
| * C2[C3,I1]() |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int I2 = builder.expected; |
| final int I1 = builder.addInterface(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, I1); |
| builder.hier.addInherit(I1, I2); |
| builder.objectref = C1; |
| builder.expected = I1; |
| }, |
| /* Case 9: Overlap with objectref's super with new |
| * interface double diamond, overriding. |
| * |
| * I3[*](def) = old expected |
| * C3[](*) = mref, I2[I3](def) |
| * C2[C3,I2](), I1[I2](res) = expected |
| * C1[C2,I1]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int I3 = builder.expected; |
| final int I2 = builder.addInterface(withDef); |
| final int I1 = builder.addInterface(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(I2, I3); |
| builder.objectref = C1; |
| builder.expected = I1; |
| }, |
| /* Case 10: Overlap with objectref's super with new |
| * interface double diamond, skip private. |
| * |
| * I3[*](def) = old expected |
| * C3[](*) = mref, I2[I3](res) = expected |
| * C2[C3,I2](), I1[I2](priv) |
| * C1[C2,I1]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = new ClassData(pck, meth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int I3 = builder.expected; |
| final int I2 = builder.addInterface(withDef); |
| final int I1 = builder.addInterface(withPrivDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(I2, I3); |
| builder.objectref = C1; |
| builder.expected = I2; |
| }, |
| /* Case 11: Overlap with objectref's super with new |
| * interface double diamond, skip static. |
| * |
| * I3[*](def) = old expected |
| * C3[](*) = mref, I2[I3](res) = expected |
| * C2[C3,I2](), I1[I2](stat) |
| * C1[C2,I1]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = new ClassData(pck, meth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int I3 = builder.expected; |
| final int I2 = builder.addInterface(withDef); |
| final int I1 = builder.addInterface(withStatDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(I2, I3); |
| builder.objectref = C1; |
| builder.expected = I2; |
| }, |
| /* Case 12: Objectref's super overrides, skip interface below. |
| * |
| * C3[](*) = mref |
| * C2[C3](res) = expected, I[](def) |
| * C1[C2,I]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| final int I = builder.addInterface(withDef); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 13: Objectref's super overrides, skip interface above. |
| * |
| * C3[](*) = mref, I[](def) |
| * C2[C3,I](res) = expected |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| final int I = builder.addInterface(withDef); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, I); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }); |
| |
| public static final Template ReabstractIfaceMethodrefResolved = |
| new Template("ReabstractIfaceMethodrefResolved", |
| /* Case 1: Objectref overrides. |
| * |
| * I[](*) = mref |
| * C[I](res) = oref = expected |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final int I = builder.methodref; |
| final int C = builder.addClass(withDef); |
| builder.hier.addInherit(C, I); |
| builder.objectref = C; |
| builder.expected = C; |
| }, |
| /* Case 2: Diamond, methodref at top, overriding. |
| * |
| * I3[](*) = mref |
| * I1[I3](), I2[I3](res) = expected |
| * C[I1,I2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final int I3 = builder.methodref; |
| final int I2 = builder.addInterface(withDef); |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C, I1); |
| builder.hier.addInherit(C, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I3); |
| builder.objectref = C; |
| builder.expected = I2; |
| }, |
| /* Case 3: Diamond, methodref at top, skip static. |
| * |
| * I3[](*) = mref |
| * I1[I3](), I2[I3](res) = expected |
| * C[I1,I2](stat) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = new ClassData(pck, meth); |
| final int I3 = builder.methodref; |
| final int I2 = builder.addInterface(withDef); |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C = builder.addClass(withStatDef); |
| builder.hier.addInherit(C, I1); |
| builder.hier.addInherit(C, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I3); |
| builder.objectref = C; |
| builder.expected = I2; |
| }, |
| /* Case 4: Diamond, with superclass, methodref at top, |
| * class overriding. |
| * |
| * I2[](*) = mref |
| * C2[I2](res) = expected, I1[I2]() |
| * C1[I1,C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final int I2 = builder.methodref; |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C2, I2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 5: Diamond, with superclass, methodref at top, |
| * class overriding, skip static. |
| * |
| * I2[](*) = mref |
| * C2[I2](res) = expected, I1[I2]() |
| * C1[I1,C2](stat) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = new ClassData(pck, meth); |
| final int I2 = builder.methodref; |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(withStatDef); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C2, I2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 6: Diamond, with superclass, expected at top, |
| * interface overriding |
| * |
| * I2[](*) = mref |
| * C2[I2](), I1[I2](res) = expected |
| * C1[I1,C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final int I2 = builder.methodref; |
| final int I1 = builder.addInterface(withDef); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C2, I2); |
| builder.objectref = C1; |
| builder.expected = I1; |
| }, |
| /* Case 7: Diamond, with superclass, expected at top, |
| * interface skip static |
| * |
| * I2[](*) = mref |
| * C2[I2](), I1[I2](res) = expected |
| * C1[I1,C2](stat) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = new ClassData(pck, meth); |
| final int I2 = builder.methodref; |
| final int I1 = builder.addInterface(withDef); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(withStatDef); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C2, I2); |
| builder.objectref = C1; |
| builder.expected = I1; |
| }, |
| /* Case 8: Y, with superclass, overlaping, expected |
| * at top, class overrides |
| * |
| * C2[I2](res) = expected, I1[](*) = mref |
| * C1[I1,C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final int I1 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 9: Diamond, with superclass, overlaping, expected |
| * at top, class overrides |
| * |
| * I2[](def) = old expected |
| * C2[I2](res) = expected, I1[](*) = mref |
| * C1[I1,C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final int I2 = builder.expected; |
| final int I1 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, I2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 10: Diamond, with superclass, overlaping, expected |
| * at top, class overrides, skipping static |
| * |
| * I2[](def) = old expected |
| * C2[I2](res) = expected, I1[](*) = mref |
| * C1[I1,C2](stat) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = new ClassData(pck, meth); |
| final int I2 = builder.expected; |
| final int I1 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(withStatDef); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, I2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 11: Superclass overrides. |
| * |
| * I[](*) = mref |
| * C2[I](res) = expected |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final int I = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, I); |
| builder.objectref = C1; |
| }, |
| /* Case 12: Superclass overrides, skipping static. |
| * |
| * I[](*) = mref |
| * C2[I](res) = expected |
| * C1[C2](stat) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = new ClassData(pck, meth); |
| final int I = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(withStatDef); |
| builder.hier.addInherit(C1, I); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, I); |
| builder.objectref = C1; |
| }, |
| /* Case 13: Double diamond, with superclass, inherit through |
| * superclass, expected at top. |
| * |
| * I3[](def) = old expected |
| * C3[I3](), I2[*](*) = mref |
| * C2[I2,C3](), I1[I2](res) = expected |
| * C1[C2,I1]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final int I3 = builder.expected; |
| final int I2 = builder.methodref; |
| final int I1 = builder.addInterface(withDef); |
| final int C3 = builder.addClass(emptyClass(pck)); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C3, I3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C1, I1); |
| builder.objectref = C1; |
| builder.expected = I1; |
| }, |
| /* Case 14: Double diamond, with superclass, inherit through |
| * superclass, expected at top. |
| * |
| * I3[](def) = mref |
| * C3[I3](), I2[*](*) = expected |
| * C2[I2,C3](), I1[I2](priv) |
| * C1[C2,I1]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = new ClassData(pck, meth); |
| final int I3 = builder.methodref; |
| final int I2 = builder.addInterface(withDef); |
| final int I1 = builder.addInterface(withPrivDef); |
| final int C3 = builder.addClass(emptyClass(pck)); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C3, I3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(I2, I3); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C1, I1); |
| builder.objectref = C1; |
| builder.expected = I2; |
| }, |
| /* Case 15: Double diamond, with superclass, inherit through |
| * superclass, expected at top. |
| * |
| * I3[](def) = mref |
| * C3[I3](), I2[*](*) = expected |
| * C2[I2,C3](), I1[I2](stat) |
| * C1[C2,I1]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final ClassData withDef = |
| new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = new ClassData(pck, meth); |
| final int I3 = builder.methodref; |
| final int I2 = builder.addInterface(withDef); |
| final int I1 = builder.addInterface(withStatDef); |
| final int C3 = builder.addClass(emptyClass(pck)); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C3, I3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(I2, I3); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C1, I1); |
| builder.objectref = C1; |
| builder.expected = I2; |
| }); |
| |
| /****************************** |
| * Abstract Overrides * |
| ******************************/ |
| |
| public static final Template OverrideAbstractExpectedIface = |
| Template.ResolutionOverride(EnumSet.of(Template.Kind.INTERFACE), |
| EnumSet.of(MethodData.Access.PUBLIC), |
| EnumSet.allOf(MethodData.Context.class), |
| EnumSet.of(ClassData.Package.SAME)); |
| |
| public static final Template OverrideAbstractExpectedClass = |
| Template.ResolutionOverride(EnumSet.allOf(Template.Kind.class), |
| EnumSet.of(MethodData.Access.PUBLIC), |
| EnumSet.allOf(MethodData.Context.class), |
| EnumSet.of(ClassData.Package.SAME)); |
| |
| public static final Template SelectionOverrideAbstract = |
| new Template("SelectionOverrideAbstract", |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData expected = |
| builder.classdata.get(builder.expected); |
| final MethodData olddef = |
| expected.methoddata; |
| if (MethodData.Context.ABSTRACT == olddef.context) { |
| final ClassData.Package pck = expected.packageId; |
| final MethodData.Access acc = olddef.access; |
| final MethodData mdata = |
| getMethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final int C2 = builder.objectref; |
| final int C1 = builder.addClass(withDef); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C1; |
| } |
| }); |
| |
| |
| /****************************** |
| * Ignored Abstract Templates * |
| ******************************/ |
| |
| public static final Template IgnoredAbstract = |
| new Template("IgnoredAbstract", |
| (builder) -> {}, |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData methodref = |
| builder.classdata.get(builder.methodref); |
| final ClassData.Package pck = methodref.packageId; |
| final MethodData mdata = |
| getMethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.ABSTRACT); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final int C2 = builder.addInterface(withDef); |
| final int C1 = builder.methodref; |
| builder.hier.addInherit(C1, C2); |
| }); |
| |
| /****************************** |
| * Selection Templates * |
| ******************************/ |
| |
| |
| |
| public static final Template TrivialObjectref = |
| new Template("TrivialObjectref", |
| Collections.singleton((builder) -> { |
| builder.objectref = builder.methodref; |
| })); |
| |
| public static final Template TrivialObjectrefNotEqualMethodref = |
| new Template("TrivialObjectrefNotEqualMethodref", |
| Collections.singleton( |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData.Package pck = oldexpected.packageId; |
| final int C2 = builder.methodref; |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| })); |
| |
| public static final Template MethodrefSelectionResolvedIsClassNoOverride = |
| new Template("MethodrefSelectionResolvedIsClassNoOverride", |
| /* Trivial. |
| * |
| * C[](*) = mref = oref |
| */ |
| (builder) -> { |
| builder.objectref = builder.methodref; |
| }, |
| /* Case 1: Inherit from super. |
| * |
| * C2[](*) = mref |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final int C2 = builder.methodref; |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 2: Objectref has private def. |
| * |
| * C2[](*) = mref |
| * C1[C2](priv) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = new ClassData(pck, meth); |
| final int C2 = builder.methodref; |
| final int C1 = builder.addClass(withDef); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 3: Objectref has static def. |
| * |
| * C2[](*) = mref |
| * C1[C2](stat) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withDef = new ClassData(pck, meth); |
| final int C2 = builder.methodref; |
| final int C1 = builder.addClass(withDef); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 4: Skip inherit from interface. |
| * |
| * C2[](*) = mref, I[](def) |
| * C1[C2,I]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData.Package pck = oldexpected.packageId; |
| final MethodData.Context ctx = |
| builder.classdata.get(builder.expected).methoddata.context; |
| final MethodData.Access acc = |
| builder.classdata.get(builder.expected).methoddata.access; |
| final MethodData mdata = getMethodData(acc, ctx); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final int C2 = builder.methodref; |
| final int C1 = builder.addClass(emptyClass(pck)); |
| final int I = builder.addInterface(withDef); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I); |
| builder.objectref = C1; |
| }, |
| /* Case 5: Objectref's super has a private def. |
| * |
| * C3[*](*) = mref |
| * C2[C3](res) = expected |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(pck, meth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 6: Objectref's super has a static def. |
| * |
| * C3[*](*) = mref |
| * C2[C3](res) = expected |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withDef = |
| new ClassData(pck, meth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }); |
| |
| public static final Template MethodrefSelectionResolvedIsClassOverride = |
| new Template("MethodrefSelectionResolvedIsClassOverride", |
| /* Case 7: Objectref overrides. |
| * |
| * C2[](*) = mref |
| * C1[C2](res) = oref = expected |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final int C2 = builder.methodref; |
| final int C1 = builder.addClass(withDef); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C1; |
| }, |
| /* Case 8: Objectref's super overrides. |
| * |
| * C3[*](*) = mref |
| * C2[C3](res) |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 9: Objectref's super overrides, |
| * objectref has a private def. |
| * |
| * C3[*](*) = mref |
| * C2[C3](res) |
| * C1[C2](priv) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = |
| new ClassData(pck, meth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(withPrivDef); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 10: Objectref's super overrides, |
| * objectref has a static def. |
| * |
| * C3[*](*) = mref |
| * C2[C3](res) |
| * C1[C2](stat) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withPrivDef = |
| new ClassData(pck, meth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(withPrivDef); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }); |
| |
| public static final Template MethodrefSelectionResolvedIsClass = |
| new Template("MethodrefSelectionResolvedIsClass", |
| MethodrefSelectionResolvedIsClassNoOverride, |
| MethodrefSelectionResolvedIsClassOverride); |
| |
| public static final Template MethodrefSelectionPackageSkipNoOverride = |
| new Template("MethodrefSelectionPackageSkipNoOverride", |
| MethodrefSelectionResolvedIsClass, |
| /* Case 11: Objectref has public def in other package. |
| * |
| * C2[](*) = mref |
| * Other.C1[C2](pub) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(ClassData.Package.OTHER, meth); |
| final int C2 = builder.methodref; |
| final int C1 = builder.addClass(withDef); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 12: Objectref has package private def in other package. |
| * |
| * C2[](*) = mref |
| * Other.C1[C2](pack) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PACKAGE, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(ClassData.Package.OTHER, meth); |
| final int C2 = builder.methodref; |
| final int C1 = builder.addClass(withDef); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 13: Objectref has protected def in other package. |
| * |
| * C2[](*) = mref |
| * Other.C1[C2](prot) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PROTECTED, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(ClassData.Package.OTHER, meth); |
| final int C2 = builder.methodref; |
| final int C1 = builder.addClass(withDef); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 14: Objectref's super has a public def in other package. |
| * |
| * C3[*](*) = mref |
| * Other.C2[C3](pub) = expected |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(ClassData.Package.OTHER, meth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 15: Objectref's super has a package |
| * private def in other package. |
| * |
| * C3[*](*) = mref |
| * Other.C2[C3](pack) = expected |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PACKAGE, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(ClassData.Package.OTHER, meth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 16: Objectref's super has a protected def |
| * in other package. |
| * |
| * C3[*](*) = mref |
| * Other.C2[C3](pack) = expected |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PROTECTED, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(ClassData.Package.OTHER, meth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 18: Objectref's has a public def in other |
| * package, skip private. |
| * |
| * C3[*](*) = mref |
| * Other.C2[C3](priv) |
| * C1[C2](pub) = oref, expected |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(ClassData.Package.OTHER, meth); |
| final MethodData privmeth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = |
| new ClassData(pck, privmeth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withPrivDef); |
| final int C1 = builder.addClass(withDef); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 19: Objectref's has a package private def in other |
| * package, skip private. |
| * |
| * C3[*](*) = mref |
| * Other.C2[C3](priv) |
| * C1[C2](pack) = oref, expected |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PACKAGE, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(ClassData.Package.OTHER, meth); |
| final MethodData privmeth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = |
| new ClassData(pck, privmeth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withPrivDef); |
| final int C1 = builder.addClass(withDef); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 20: Objectref's has a protected def in other |
| * package, skip private. |
| * |
| * C3[*](*) = mref |
| * Other.C2[C3](priv) |
| * C1[C2](pro) = oref, expected |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PROTECTED, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(ClassData.Package.OTHER, meth); |
| final MethodData privmeth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = |
| new ClassData(pck, privmeth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withPrivDef); |
| final int C1 = builder.addClass(withDef); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 21: Objectref's super has a public def in other |
| * package, skip private. |
| * |
| * C3[*](*) = mref |
| * Other.C2[C3](pub) = expected |
| * C1[C2](priv) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(ClassData.Package.OTHER, meth); |
| final MethodData privmeth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = |
| new ClassData(pck, privmeth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(withPrivDef); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 22: Objectref's superhas a package private |
| * def in other package, skip private. |
| * |
| * C3[*](*) = mref |
| * Other.C2[C3](pack) = expected |
| * C1[C2](priv) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PACKAGE, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(ClassData.Package.OTHER, meth); |
| final MethodData privmeth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = |
| new ClassData(pck, privmeth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(withPrivDef); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 23: Objectref's super has a protected def |
| * in other package, skip private. |
| * |
| * C3[*](*) = mref |
| * Other.C2[C3](pro) = expected |
| * C1[C2](priv) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PROTECTED, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(ClassData.Package.OTHER, meth); |
| final MethodData privmeth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = |
| new ClassData(pck, privmeth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withPrivDef); |
| final int C1 = builder.addClass(withDef); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }); |
| |
| public static final Template MethodrefSelectionPackageSkip = |
| new Template("MethodrefSelectionPackageSkip", |
| MethodrefSelectionPackageSkipNoOverride, |
| /* Case 17: Transitive override. |
| * |
| * C3[*](*) = mref |
| * C2[C3](pub) |
| * Other.C1[C2](pack) = oref, expected |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.INSTANCE); |
| final MethodData packmeth = |
| new MethodData(MethodData.Access.PACKAGE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPubDef = new ClassData(pck, meth); |
| final ClassData withPackDef = |
| new ClassData(ClassData.Package.OTHER, packmeth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withPubDef); |
| final int C1 = builder.addClass(withPackDef); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C1; |
| }, |
| /* Case 24: Transitive override, skip private in between. |
| * |
| * C4[*](*) = mref |
| * C3[C4](pub) |
| * C2[C3](priv) |
| * Other.C1[C2](pack) = oref, expected |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.INSTANCE); |
| final MethodData packmeth = |
| new MethodData(MethodData.Access.PACKAGE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPubDef = new ClassData(pck, meth); |
| final ClassData withPackDef = |
| new ClassData(ClassData.Package.OTHER, packmeth); |
| final MethodData privmeth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = |
| new ClassData(pck, privmeth); |
| final int C4 = builder.methodref; |
| final int C3 = builder.addClass(withPubDef); |
| final int C2 = builder.addClass(withPrivDef); |
| final int C1 = builder.addClass(withPackDef); |
| builder.hier.addInherit(C3, C4); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C1; |
| }, |
| /* Case 25: Transitive override, skip private in between. |
| * |
| * C4[*](*) = mref |
| * C3[C4](pub) |
| * Other.C2[C3](pack) = expected |
| * C1[C2](pack) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.INSTANCE); |
| final MethodData packmeth = |
| new MethodData(MethodData.Access.PACKAGE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPubDef = new ClassData(pck, meth); |
| final ClassData withPackDef = |
| new ClassData(ClassData.Package.OTHER, packmeth); |
| final MethodData privmeth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = |
| new ClassData(pck, privmeth); |
| final int C4 = builder.methodref; |
| final int C3 = builder.addClass(withPubDef); |
| final int C2 = builder.addClass(withPackDef); |
| final int C1 = builder.addClass(withPrivDef); |
| builder.hier.addInherit(C3, C4); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C2; |
| builder.expected = C2; |
| }); |
| |
| public static final Template MethodrefSelectionResolvedIsIfaceNoOverride = |
| new Template("MethodrefSelectionResolvedIsIfaceNoOverride", |
| /* Trivial objectref. |
| * |
| * C[](*) = mref = oref |
| */ |
| (builder) -> { |
| builder.objectref = builder.methodref; |
| }, |
| /* Case 1: Inherit from super. |
| * |
| * C2[](*) = mref |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final int C2 = builder.methodref; |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 2: Objectref has private def. |
| * |
| * C2[](*) = mref |
| * C1[C2](priv) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = new ClassData(pck, meth); |
| final int C2 = builder.methodref; |
| final int C1 = builder.addClass(withDef); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 3: Objectref has static def. |
| * |
| * C2[](*) = mref |
| * C1[C2](stat) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withDef = new ClassData(pck, meth); |
| final int C2 = builder.methodref; |
| final int C1 = builder.addClass(withDef); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 4: Overlapping. |
| * |
| * I[*](res) = expected |
| * C2[*](*) = mref |
| * C1[C2,I]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final int C2 = builder.methodref; |
| final int I = builder.expected; |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I); |
| builder.objectref = C1; |
| }, |
| /* Case 5: Overlapping with new interface. |
| * |
| * I2[*](res) = expected |
| * C2[*](*) = mref, I1[I2]() |
| * C1[C2,I2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final int C2 = builder.methodref; |
| final int I2 = builder.expected; |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(I1, I2); |
| builder.objectref = C1; |
| }, |
| /* Case 6: Overlapping with new interface with private def. |
| * |
| * I2[*](res) = expected |
| * C2[*](*) = mref, I1[I2](priv) |
| * C1[C2,I2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = |
| new ClassData(pck, meth); |
| final int C2 = builder.methodref; |
| final int I2 = builder.expected; |
| final int I1 = builder.addInterface(withPrivDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(I1, I2); |
| builder.objectref = C1; |
| }, |
| /* Case 7: Overlapping with new interface with static def. |
| * |
| * I2[*](res) = expected |
| * C2[*](*) = mref, I1[I2](stat) |
| * C1[C2,I2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = |
| new ClassData(pck, meth); |
| final int C2 = builder.methodref; |
| final int I2 = builder.expected; |
| final int I1 = builder.addInterface(withStatDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(I1, I2); |
| builder.objectref = C1; |
| }, |
| /* Case 8: Objectref's super has a private def. |
| * |
| * C3[*](*) = mref |
| * C2[C3](priv) |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(pck, meth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 9: Objectref's super has a static def. |
| * |
| * C3[*](*) = mref |
| * C2[C3](stat) |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withDef = |
| new ClassData(pck, meth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 10: Overlap with objectref's super. |
| * |
| * I[*](res) = expected |
| * C3[](*) = mref |
| * C2[C3,I]() |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int I = builder.expected; |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, I); |
| builder.objectref = C1; |
| }, |
| /* Case 11: Overlap with objectref's super with new interface. |
| * |
| * I2[*](res) = expected |
| * C3[](*) = mref, I1[I2]() |
| * C2[C3,I1]() |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int I2 = builder.expected; |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, I1); |
| builder.hier.addInherit(I1, I2); |
| builder.objectref = C1; |
| }, |
| /* Case 12: Overlap with objectref's super with new |
| * interface with private def. |
| * |
| * I2[*](res) = expected |
| * C3[](*) = mref, I1[I2](priv) |
| * C2[C3,I1]() |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = |
| new ClassData(pck, meth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int I2 = builder.expected; |
| final int I1 = builder.addInterface(withPrivDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, I1); |
| builder.hier.addInherit(I1, I2); |
| builder.objectref = C1; |
| }, |
| /* Case 13: Overlap with objectref's super with new |
| * interface with static def. |
| * |
| * I2[*](res) = expected |
| * C3[](*) = mref, I1[I2](stat) |
| * C2[C3,I1]() |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = |
| new ClassData(pck, meth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int I2 = builder.expected; |
| final int I1 = builder.addInterface(withStatDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, I1); |
| builder.hier.addInherit(I1, I2); |
| builder.objectref = C1; |
| }, |
| /* Case 14: Overlap with objectref's super with new |
| * interface double diamond. |
| * |
| * I3[*](res) = expected |
| * C3[](*) = mref, I2[I3]() |
| * C2[C3,I2](), I1[I2]() |
| * C1[C2,I1]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int I3 = builder.expected; |
| final int I2 = builder.addInterface(emptyClass(pck)); |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(I1, I2); |
| builder.objectref = C1; |
| }, |
| /* Case 15: Overlapping with new interface with private def. |
| * |
| * C2[*](*) = mref, I1[](priv) |
| * C1[C2,I2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = |
| new ClassData(pck, meth); |
| final int C2 = builder.methodref; |
| final int I1 = builder.addInterface(withPrivDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I1); |
| builder.objectref = C1; |
| }, |
| /* Case 16: Overlapping with new interface with static def. |
| * |
| * C2[*](*) = mref, I1[](stat) |
| * C1[C2,I2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = |
| new ClassData(pck, meth); |
| final int C2 = builder.methodref; |
| final int I1 = builder.addInterface(withStatDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I1); |
| builder.objectref = C1; |
| }); |
| |
| public static final Template MethodrefSelectionResolvedIsIface = |
| new Template("MethodrefSelectionResolvedIsIface", |
| MethodrefSelectionResolvedIsIfaceNoOverride, |
| /* Case 17: Objectref overrides. |
| * |
| * C2[](*) = mref |
| * C1[C2](res) = oref = expected |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final int C2 = builder.methodref; |
| final int C1 = builder.addClass(withDef); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C1; |
| }, |
| /* Case 18: Overlapping with new interface overriding. |
| * |
| * I2[*](def) = old expected |
| * C2[*](*) = mref, I1[I2](res) = expected |
| * C1[C2,I2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final int C2 = builder.methodref; |
| final int I2 = builder.expected; |
| final int I1 = builder.addInterface(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(I1, I2); |
| builder.objectref = C1; |
| builder.expected = I1; |
| }, |
| /* Case 19: Objectref's super overrides. |
| * |
| * C3[](*) = mref |
| * C2[C3](res) = expected |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 20: Overlap with objectref's super with |
| * new interface overriding. |
| * |
| * I2[*](def) = old expected |
| * C3[](*) = mref, I1[I2](res) = expected |
| * C2[C3,I1]() |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int I2 = builder.expected; |
| final int I1 = builder.addInterface(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, I1); |
| builder.hier.addInherit(I1, I2); |
| builder.objectref = C1; |
| builder.expected = I1; |
| }, |
| /* Case 21: Overlap with objectref's super with new |
| * interface double diamond, overriding. |
| * |
| * I3[*](def) = old expected |
| * C3[](*) = mref, I2[I3](def) |
| * C2[C3,I2](), I1[I2](res) = expected |
| * C1[C2,I1]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int I3 = builder.expected; |
| final int I2 = builder.addInterface(withDef); |
| final int I1 = builder.addInterface(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(I2, I3); |
| builder.objectref = C1; |
| builder.expected = I1; |
| }, |
| /* Case 22: Objectref's super overrides, skip private. |
| * |
| * C3[](*) = mref |
| * C2[C3](res) = expected |
| * C1[C2](priv) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = |
| new ClassData(pck, meth); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(withPrivDef); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 23: Objectref's super overrides, skip static. |
| * |
| * C3[](*) = mref |
| * C2[C3](res) = expected |
| * C1[C2](stat) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = |
| new ClassData(pck, meth); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(withStatDef); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 24: Overlap with objectref's super with new |
| * interface double diamond, overriding, skip private. |
| * |
| * I3[*](def) = old expected |
| * C3[](*) = mref, I2[I3](res) = expected |
| * C2[C3,I2](), I1[I2](priv) |
| * C1[C2,I1]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = |
| new ClassData(pck, meth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int I3 = builder.expected; |
| final int I2 = builder.addInterface(withDef); |
| final int I1 = builder.addInterface(withPrivDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(I2, I3); |
| builder.objectref = C1; |
| builder.expected = I2; |
| }, |
| /* Case 25: Overlap with objectref's super with new |
| * interface double diamond, overriding, skip static. |
| * |
| * I3[*](def) = old expected |
| * C3[](*) = mref, I2[I3](res) = expected |
| * C2[C3,I2](), I1[I2](stat) |
| * C1[C2,I1]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = |
| new ClassData(pck, meth); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int I3 = builder.expected; |
| final int I2 = builder.addInterface(withDef); |
| final int I1 = builder.addInterface(withStatDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(I2, I3); |
| builder.objectref = C1; |
| builder.expected = I2; |
| }, |
| /* Case 26: Skip interface method after class overrides. |
| * |
| * C3[](*) = mref |
| * C2[C3](res) = expected, I[](def) |
| * C1[C2, I]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| final int I = builder.addInterface(withDef); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 27: Skip interface method after class overrides. |
| * |
| * C3[](*) = mref, I[](def) |
| * C2[C3,I](res) = expected |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| final int I = builder.addInterface(withDef); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, I); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 28: Overlap with objectref's super with new |
| * interface double diamond, overriding. |
| * |
| * I3[*](def) = old expected |
| * C3[](*) = mref, I2[I3](def) |
| * C2[C3,I2](res) = expected, I1[I2](def) = expected |
| * C1[C2,I1]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final int C3 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int I3 = builder.expected; |
| final int I2 = builder.addInterface(withDef); |
| final int I1 = builder.addInterface(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(I2, I3); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }); |
| |
| public static final Template IfaceMethodrefSelectionNoOverride = |
| new Template("IfaceMethodrefSelectionNoOverride", |
| /* Case 1: Inherit from super. |
| * |
| * I[](*) = mref |
| * C[I]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final int I = builder.methodref; |
| final int C = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C, I); |
| builder.objectref = C; |
| }, |
| /* Case 2: Objectref has static def |
| * |
| * I[](*) = mref |
| * C[I](stat) = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = |
| new ClassData(pck, meth); |
| final int I = builder.methodref; |
| final int C = builder.addClass(withStatDef); |
| builder.hier.addInherit(C, I); |
| builder.objectref = C; |
| }, |
| /* Case 3: Diamond, methodref at top. |
| * |
| * I3[](*) = mref |
| * I1[I3](), I2[I3]() |
| * C[I1,I2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final int I3 = builder.methodref; |
| final int I2 = builder.addInterface(emptyClass(pck)); |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C, I1); |
| builder.hier.addInherit(C, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I3); |
| builder.objectref = C; |
| }, |
| /* Case 4: Diamond, methodref at top, skip private def |
| * |
| * I3[](*) = mref |
| * I1[I3](), I2[I3](priv) |
| * C[I1,I2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = |
| new ClassData(pck, meth); |
| final int I3 = builder.methodref; |
| final int I2 = builder.addInterface(withPrivDef); |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C, I1); |
| builder.hier.addInherit(C, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I3); |
| builder.objectref = C; |
| }, |
| /* Case 5: Diamond, methodref at top, skip static def |
| * |
| * I3[](*) = mref |
| * I1[I3](), I2[I3](stat) |
| * C[I1,I2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = |
| new ClassData(pck, meth); |
| final int I3 = builder.methodref; |
| final int I2 = builder.addInterface(withStatDef); |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C, I1); |
| builder.hier.addInherit(C, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I3); |
| builder.objectref = C; |
| }, |
| /* Case 6: Diamond, overlap with resolution. |
| * |
| * I3[](res) = expected |
| * I1[I3](), I2[](*) = mref |
| * C[I1,I2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final int I3 = builder.expected; |
| final int I2 = builder.methodref; |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C, I1); |
| builder.hier.addInherit(C, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.objectref = C; |
| }, |
| /* Case 7: Diamond, with superclass, expected at top. |
| * |
| * I2[](*) = mref |
| * C2[I2](), I1[I2]() |
| * C1[I1,C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final int I2 = builder.methodref; |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C2, I2); |
| builder.objectref = C1; |
| }, |
| /* Case 8: Diamond, with superclass, expected at top, |
| * class has static def. |
| * |
| * I2[](*) = mref |
| * C2[I2](stat), I1[I2]() |
| * C1[I1,C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = |
| new ClassData(pck, meth); |
| final int I2 = builder.methodref; |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C2 = builder.addClass(withStatDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C2, I2); |
| builder.objectref = C1; |
| }, |
| /* Case 9: Diamond, with superclass, expected at top, |
| * interface has private def |
| * |
| * I2[](*) = mref |
| * C2[I2](), I1[I2](priv) |
| * C1[I1,C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = |
| new ClassData(pck, meth); |
| final int I2 = builder.methodref; |
| final int I1 = builder.addInterface(withPrivDef); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C2, I2); |
| builder.objectref = C1; |
| }, |
| /* Case 10: Diamond, with superclass, expected at top, |
| * interface has static def |
| * |
| * I2[](*) = mref |
| * C2[I2](), I1[I2](stat) |
| * C1[I1,C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withPrivDef = |
| new ClassData(pck, meth); |
| final int I2 = builder.methodref; |
| final int I1 = builder.addInterface(withPrivDef); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C2, I2); |
| builder.objectref = C1; |
| }, |
| /* Case 11: Y, with superclass, expected |
| * at top. |
| * |
| * C2[](), I1[](*) = mref |
| * C1[I1,C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final int I1 = builder.methodref; |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 12: Y, with superclass, expected |
| * at top, class has static def |
| * |
| * C2[](stat), I1[](*) = mref |
| * C1[I1,C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = |
| new ClassData(pck, meth); |
| final int I1 = builder.methodref; |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 13: Diamond, with superclass, overlapping, expected |
| * at top. |
| * |
| * I2[](res) = expected |
| * C2[I2](), I1[](*) = mref |
| * C1[I1,C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final int I2 = builder.expected; |
| final int I1 = builder.methodref; |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, I2); |
| builder.objectref = C1; |
| }, |
| /* Case 14: Diamond, with superclass, overlapping, expected |
| * at top, class has static def |
| * |
| * I2[](def) = expected |
| * C2[I2](stat), I1[](*) = mref |
| * C1[I1,C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = |
| new ClassData(pck, meth); |
| final int I2 = builder.expected; |
| final int I1 = builder.methodref; |
| final int C2 = builder.addClass(withStatDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, I2); |
| builder.objectref = C1; |
| }, |
| /* Case 15: Inherit through superclass. |
| * |
| * I[](*) = mref |
| * C2[I]() |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final int I = builder.methodref; |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, I); |
| builder.objectref = C1; |
| }, |
| /* Case 16: Superclass has static def. |
| * |
| * I[](*) = mref |
| * C2[I](stat) = expected |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = |
| new ClassData(pck, meth); |
| final int I = builder.methodref; |
| final int C2 = builder.addClass(withStatDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, I); |
| builder.objectref = C1; |
| }, |
| /* Case 17: Diamond, inherit through superclass, |
| * methodref at top. |
| * |
| * I3[](*) = mref |
| * I1[I3](), I2[I3]() |
| * C2[I1,I2]() |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final int I3 = builder.methodref; |
| final int I2 = builder.addInterface(emptyClass(pck)); |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I1); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 18: Diamond, with superclass, inherit through |
| * superclass, methodref at top. |
| * |
| * I2[](*) = mref |
| * C3[I2](), I1[I2]() |
| * C2[I1,C3]() |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final int I2 = builder.methodref; |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C3 = builder.addClass(emptyClass(pck)); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I1); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C3, I2); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 19: Diamond, inherit through superclass, |
| * expected at top, skip private. |
| * |
| * I3[](*) = mref |
| * I1[I3](), I2[I3](priv) |
| * C2[I1,I2]() |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = |
| new ClassData(pck, meth); |
| final int I3 = builder.methodref; |
| final int I2 = builder.addInterface(withPrivDef); |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I1); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 20: Diamond, inherit through superclass, |
| * expected at top, skip static. |
| * |
| * I3[](*) = mref |
| * I1[I3](), I2[I3](stat) |
| * C2[I1,I2]() |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = |
| new ClassData(pck, meth); |
| final int I3 = builder.methodref; |
| final int I2 = builder.addInterface(withStatDef); |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I1); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 21: Diamond, inherit through superclass, |
| * overlapping, expected at top. |
| * |
| * I3[](res) = expected |
| * I1[I3](), I2[*](*) = mref |
| * C2[I1,I2]() |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final int I3 = builder.expected; |
| final int I2 = builder.methodref; |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I1); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 22: Y, with superclass, inherit through |
| * superclass, expected at top. |
| * |
| * C3[](), I1[*](*) = mref |
| * C2[I1,C3]() |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final int I1 = builder.methodref; |
| final int C3 = builder.addClass(emptyClass(pck)); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I1); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 23: Diamond, with superclass, inherit through |
| * superclass, overlapping, expected at top. |
| * |
| * I2[](res) = expected |
| * C3[I2](), I1[*](*) = mref |
| * C2[I1,C3]() |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final int I2 = builder.expected; |
| final int I1 = builder.methodref; |
| final int C3 = builder.addClass(emptyClass(pck)); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I1); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C3, I2); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }, |
| /* Case 24: Double diamond, with superclass, inherit through |
| * superclass, overlapping expected at top. |
| * |
| * I3[](res) = expected |
| * C3[I3](), I2[*](*) = mref |
| * C2[I2,C3](), I1[I2]() |
| * C1[C2,I1]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final int I3 = builder.expected; |
| final int I2 = builder.methodref; |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C3 = builder.addClass(emptyClass(pck)); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C3, I3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C1, I1); |
| builder.objectref = C1; |
| }, |
| /* Case 25: Double diamond, with superclass, inherit through |
| * superclass, skip private. |
| * |
| * I3[](def) = old expected |
| * C3[I3](), I2[*](*) = mref |
| * C2[I2,C3](), I1[I2](priv) |
| * C1[C2,I1]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = |
| new ClassData(pck, meth); |
| final int I3 = builder.expected; |
| final int I2 = builder.methodref; |
| final int I1 = builder.addInterface(withPrivDef); |
| final int C3 = builder.addClass(emptyClass(pck)); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C3, I3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C1, I1); |
| builder.objectref = C1; |
| }, |
| /* Case 26: Double diamond, with superclass, inherit through |
| * superclass, skip static. |
| * |
| * I3[](def) = old expected |
| * C3[I3](), I2[*](*) = mref |
| * C2[I2,C3](), I1[I2](stat) |
| * C1[C2,I1]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = |
| new ClassData(pck, meth); |
| final int I3 = builder.expected; |
| final int I2 = builder.methodref; |
| final int I1 = builder.addInterface(withStatDef); |
| final int C3 = builder.addClass(emptyClass(pck)); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C3, I3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C1, I1); |
| builder.objectref = C1; |
| }); |
| |
| public static final Template IfaceMethodrefSelection = |
| new Template("IfaceMethodrefSelection", |
| IfaceMethodrefSelectionNoOverride, |
| /* Case 27: Objectref overrides. |
| * |
| * I[](*) = mref |
| * C[I](res) = oref = expected |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final int I = builder.methodref; |
| final int C = builder.addClass(withDef); |
| builder.hier.addInherit(C, I); |
| builder.objectref = C; |
| builder.expected = C; |
| }, |
| /* Case 28: Diamond, methodref at top, overriding. |
| * |
| * I3[](*) = mref |
| * I1[I3](), I2[I3](res) = expected |
| * C[I1,I2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final int I3 = builder.methodref; |
| final int I2 = builder.addInterface(withDef); |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C, I1); |
| builder.hier.addInherit(C, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I3); |
| builder.objectref = C; |
| builder.expected = I2; |
| }, |
| /* Case 29: Diamond, with superclass, expected at top, |
| * class overriding. |
| * |
| * I2[](*) = mref |
| * C2[I2](res) = expected, I1[I2]() |
| * C1[I1,C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final int I2 = builder.methodref; |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C2, I2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 30: Diamond, with superclass, expected at top, |
| * interface overriding |
| * |
| * I2[](*) = mref |
| * C2[I2](), I1[I2](res) = expected |
| * C1[I1,C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final int I2 = builder.methodref; |
| final int I1 = builder.addInterface(withDef); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C2, I2); |
| builder.objectref = C1; |
| builder.expected = I1; |
| }, |
| /* Case 31: Y, with superclass, overlaping, expected |
| * at top, class overrides |
| * |
| * C2[](res) = expected, I1[](*) = mref |
| * C1[I1,C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final int I1 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 32: Diamond, with superclass, overlaping, expected |
| * at top, class overrides |
| * |
| * I2[](def) = old expected |
| * C2[I2](res) = expected, I1[](*) = mref |
| * C1[I1,C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final int I2 = builder.expected; |
| final int I1 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, I2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 33: Superclass overrides. |
| * |
| * I[](*) = mref |
| * C2[I](res) = expected |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final int I = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, I); |
| builder.expected = C2; |
| builder.objectref = C1; |
| }, |
| /* Case 34: Diamond, inherit through superclass, |
| * expected at top, override. |
| * |
| * I3[](*) = mref |
| * I1[I3](), I2[I3](res) = expected |
| * C2[I1,I2]() |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final int I3 = builder.methodref; |
| final int I2 = builder.addInterface(withDef); |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I1); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(I1, I3); |
| builder.hier.addInherit(I2, I3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = I2; |
| }, |
| /* Case 35: Y, with superclass, inherit through |
| * superclass, overlapping, expected at top. |
| * |
| * C3[](res) = expected, I1[*](*) = mref |
| * C2[I1,C3]() |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final int I1 = builder.methodref; |
| final int C3 = builder.addClass(withDef); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I1); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C3; |
| }, |
| /* Case 36: Diamond, with superclass, inherit through |
| * superclass, overlapping, expected at top. |
| * |
| * I2[](*) = oldexpected |
| * C3[I2](res) = expected, I1[*](*) = mref |
| * C2[I1,C3]() |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final int I2 = builder.expected; |
| final int I1 = builder.methodref; |
| final int C3 = builder.addClass(withDef); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I1); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C3, I2); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C3; |
| }, |
| /* Case 37: Double diamond, with superclass, inherit through |
| * superclass, overriding. |
| * |
| * I3[](def) = old expected |
| * C3[I3](), I2[*](*) = mref |
| * C2[I2,C3](), I1[I2](res) = expected |
| * C1[C2,I1]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final int I3 = builder.expected; |
| final int I2 = builder.methodref; |
| final int I1 = builder.addInterface(withDef); |
| final int C3 = builder.addClass(emptyClass(pck)); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C3, I3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C1, I1); |
| builder.objectref = C1; |
| builder.expected = I1; |
| }, |
| /* Case 38: Double diamond, with superclass, inherit through |
| * superclass, skip private. |
| * |
| * I3[](def) = old expected |
| * C3[I3](), I2[*](*) = mref |
| * C2[I2,C3](), I1[I2](priv) |
| * C1[C2,I1]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PRIVATE, |
| MethodData.Context.INSTANCE); |
| final ClassData withPrivDef = |
| new ClassData(pck, meth); |
| final int I3 = builder.expected; |
| final int I2 = builder.methodref; |
| final int I1 = builder.addInterface(withPrivDef); |
| final int C3 = builder.addClass(emptyClass(pck)); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C3, I3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C1, I1); |
| builder.objectref = C1; |
| }, |
| /* Case 39: Double diamond, with superclass, inherit through |
| * superclass, skip static. |
| * |
| * I3[](def) = old expected |
| * C3[I3](), I2[*](*) = mref |
| * C2[I2,C3](), I1[I2](stat) |
| * C1[C2,I1]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = |
| new ClassData(pck, meth); |
| final int I3 = builder.expected; |
| final int I2 = builder.methodref; |
| final int I1 = builder.addInterface(withStatDef); |
| final int C3 = builder.addClass(emptyClass(pck)); |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, I2); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C3, I3); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C1, I1); |
| builder.objectref = C1; |
| }, |
| /* Case 40: Superclass overrides. |
| * |
| * I[](*) = mref |
| * C3[I](res) = expected |
| * C2[C3](stat) = expected |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData withDef = |
| new ClassData(pck, oldexpected.methoddata); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PUBLIC, |
| MethodData.Context.STATIC); |
| final ClassData withStatDef = |
| new ClassData(pck, meth); |
| final int I = builder.methodref; |
| final int C3 = builder.addClass(withDef); |
| final int C2 = builder.addClass(withStatDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C2, I); |
| builder.expected = C3; |
| builder.objectref = C1; |
| }); |
| |
| // NOTE: The selection changes in JVMS 11 mean that private class methods |
| // are never selected to satisfy an interface method invocation, and so no |
| // IllegalAccessError is subsequently thrown. Because of this all the |
| // "private" cases below are commented out. At some point in the future |
| // these should be factored out and moved to a test that expects success |
| // but it is not that simple as the commented out cases result in 2600 |
| // testcases being excluded, but only ~150 failing cases were seen. Though |
| // it is not clear from the test if a single failure can result in further |
| // testcases being skipped. |
| public static final Template IfaceMethodrefSelectionOverrideNonPublic = |
| new Template("IfaceMethodrefSelection", |
| /* Case 1: Objectref overrides. |
| * |
| * I[](*) = mref |
| * C[I](priv) = oref = expected |
| */ |
| // (final SelectionResolutionTestCase.Builder builder) -> { |
| // final ClassData.Package pck = |
| // builder.classdata.get(builder.methodref).packageId; |
| // final ClassData oldexpected = |
| // builder.classdata.get(builder.expected); |
| // final MethodData meth = |
| // new MethodData(MethodData.Access.PRIVATE, |
| // MethodData.Context.INSTANCE); |
| // final ClassData withDef = |
| // new ClassData(pck, meth); |
| // final int I = builder.methodref; |
| // final int C = builder.addClass(withDef); |
| // builder.hier.addInherit(C, I); |
| // builder.objectref = C; |
| // builder.expected = C; |
| // }, |
| /* Case 2: Objectref overrides. |
| * |
| * I[](*) = mref |
| * C[I](prot) = oref = expected |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PROTECTED, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(pck, meth); |
| final int I = builder.methodref; |
| final int C = builder.addClass(withDef); |
| builder.hier.addInherit(C, I); |
| builder.objectref = C; |
| builder.expected = C; |
| }, |
| /* Case 3: Objectref overrides package private. |
| * |
| * I[](*) = mref |
| * C[I](pack) = oref = expected |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.methodref).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PACKAGE, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(pck, meth); |
| final int I = builder.methodref; |
| final int C = builder.addClass(withDef); |
| builder.hier.addInherit(C, I); |
| builder.objectref = C; |
| builder.expected = C; |
| }, |
| /* Case 4: Diamond, with superclass, expected at top, |
| * class overriding with private. |
| * |
| * I2[](*) = mref |
| * C2[I2](priv) = expected, I1[I2]() |
| * C1[I1,C2]() = oref |
| */ |
| // (final SelectionResolutionTestCase.Builder builder) -> { |
| // final ClassData.Package pck = |
| // builder.classdata.get(builder.expected).packageId; |
| // final ClassData oldexpected = |
| // builder.classdata.get(builder.expected); |
| // final MethodData meth = |
| // new MethodData(MethodData.Access.PRIVATE, |
| // MethodData.Context.INSTANCE); |
| // final ClassData withDef = |
| // new ClassData(pck, meth); |
| // final int I2 = builder.methodref; |
| // final int I1 = builder.addInterface(emptyClass(pck)); |
| // final int C2 = builder.addClass(withDef); |
| // final int C1 = builder.addClass(emptyClass(pck)); |
| // builder.hier.addInherit(C1, I1); |
| // builder.hier.addInherit(C1, C2); |
| // builder.hier.addInherit(I1, I2); |
| // builder.hier.addInherit(C2, I2); |
| // builder.objectref = C1; |
| // builder.expected = C2; |
| // }, |
| /* Case 5: Diamond, with superclass, expected at top, |
| * class overriding with package private. |
| * |
| * I2[](*) = mref |
| * C2[I2](pack) = expected, I1[I2]() |
| * C1[I1,C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PACKAGE, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(pck, meth); |
| final int I2 = builder.methodref; |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C2, I2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 6: Diamond, with superclass, expected at top, |
| * class overriding with protected. |
| * |
| * I2[](*) = mref |
| * C2[I2](prot) = expected, I1[I2]() |
| * C1[I1,C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PROTECTED, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(pck, meth); |
| final int I2 = builder.methodref; |
| final int I1 = builder.addInterface(emptyClass(pck)); |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(I1, I2); |
| builder.hier.addInherit(C2, I2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 7: Y, with superclass, overlaping, expected |
| * at top, class overrides |
| * |
| * C2[](priv) = expected, I1[](*) = mref |
| * C1[I1,C2]() = oref |
| */ |
| // (final SelectionResolutionTestCase.Builder builder) -> { |
| // final ClassData.Package pck = |
| // builder.classdata.get(builder.expected).packageId; |
| // final ClassData oldexpected = |
| // builder.classdata.get(builder.expected); |
| // final MethodData meth = |
| // new MethodData(MethodData.Access.PRIVATE, |
| // MethodData.Context.INSTANCE); |
| // final ClassData withDef = |
| // new ClassData(pck, meth); |
| // final int I1 = builder.methodref; |
| // final int C2 = builder.addClass(withDef); |
| // final int C1 = builder.addClass(emptyClass(pck)); |
| // builder.hier.addInherit(C1, I1); |
| // builder.hier.addInherit(C1, C2); |
| // builder.objectref = C1; |
| // builder.expected = C2; |
| // }, |
| /* Case 8: Y, with superclass, overlaping, expected |
| * at top, class overrides |
| * |
| * C2[](prot) = expected, I1[](*) = mref |
| * C1[I1,C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PROTECTED, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(pck, meth); |
| final int I1 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 9: Y, with superclass, overlaping, expected |
| * at top, class overrides |
| * |
| * C2[](pack) = expected, I1[](*) = mref |
| * C1[I1,C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PACKAGE, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(pck, meth); |
| final int I1 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 10: Diamond, with superclass, overlaping, expected |
| * at top, class overrides |
| * |
| * I2[](def) = old expected |
| * C2[I2](priv) = expected, I1[](*) = mref |
| * C1[I1,C2]() = oref |
| */ |
| // (final SelectionResolutionTestCase.Builder builder) -> { |
| // final ClassData.Package pck = |
| // builder.classdata.get(builder.expected).packageId; |
| // final ClassData oldexpected = |
| // builder.classdata.get(builder.expected); |
| // final MethodData meth = |
| // new MethodData(MethodData.Access.PRIVATE, |
| // MethodData.Context.INSTANCE); |
| // final ClassData withDef = |
| // new ClassData(pck, meth); |
| // final int I2 = builder.expected; |
| // final int I1 = builder.methodref; |
| // final int C2 = builder.addClass(withDef); |
| // final int C1 = builder.addClass(emptyClass(pck)); |
| // builder.hier.addInherit(C1, I1); |
| // builder.hier.addInherit(C1, C2); |
| // builder.hier.addInherit(C2, I2); |
| // builder.objectref = C1; |
| // builder.expected = C2; |
| // }, |
| /* Case 11: Diamond, with superclass, overlaping, expected |
| * at top, class overrides |
| * |
| * I2[](def) = old expected |
| * C2[I2](pack) = expected, I1[](*) = mref |
| * C1[I1,C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PACKAGE, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(pck, meth); |
| final int I2 = builder.expected; |
| final int I1 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, I2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 12: Diamond, with superclass, overlaping, expected |
| * at top, class overrides |
| * |
| * I2[](def) = old expected |
| * C2[I2](prot) = expected, I1[](*) = mref |
| * C1[I1,C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PROTECTED, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(pck, meth); |
| final int I2 = builder.expected; |
| final int I1 = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I1); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, I2); |
| builder.objectref = C1; |
| builder.expected = C2; |
| }, |
| /* Case 13: Superclass overrides. |
| * |
| * I[](*) = mref |
| * C2[I](priv) = expected |
| * C1[C2]() = oref |
| */ |
| // (final SelectionResolutionTestCase.Builder builder) -> { |
| // final ClassData.Package pck = |
| // builder.classdata.get(builder.expected).packageId; |
| // final ClassData oldexpected = |
| // builder.classdata.get(builder.expected); |
| // final MethodData meth = |
| // new MethodData(MethodData.Access.PRIVATE, |
| // MethodData.Context.INSTANCE); |
| // final ClassData withDef = |
| // new ClassData(pck, meth); |
| // final int I = builder.methodref; |
| // final int C2 = builder.addClass(withDef); |
| // final int C1 = builder.addClass(emptyClass(pck)); |
| // builder.hier.addInherit(C1, I); |
| // builder.hier.addInherit(C1, C2); |
| // builder.hier.addInherit(C2, I); |
| // builder.expected = C2; |
| // builder.objectref = C1; |
| // }, |
| /* Case 14: Superclass overrides. |
| * |
| * I[](*) = mref |
| * C2[I](prot) = expected |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PROTECTED, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(pck, meth); |
| final int I = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, I); |
| builder.expected = C2; |
| builder.objectref = C1; |
| }, |
| /* Case 15: Superclass overrides. |
| * |
| * I[](*) = mref |
| * C2[I](pack) = expected |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.expected).packageId; |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final MethodData meth = |
| new MethodData(MethodData.Access.PACKAGE, |
| MethodData.Context.INSTANCE); |
| final ClassData withDef = |
| new ClassData(pck, meth); |
| final int I = builder.methodref; |
| final int C2 = builder.addClass(withDef); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, I); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C2, I); |
| builder.expected = C2; |
| builder.objectref = C1; |
| }); |
| |
| /*********************** |
| * Ambiguous selection * |
| ***********************/ |
| |
| public static final Template MethodrefAmbiguousResolvedIsIface = |
| new Template("MethodrefAmbiguousResolvedIsIface", |
| /* Inherit from interface. |
| * |
| * C2[](*) = mref, I[](any) |
| * C1[C2,I]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData.Package pck = oldexpected.packageId; |
| final MethodData.Context ctx = oldexpected.methoddata.context; |
| final MethodData mdata = |
| new MethodData(MethodData.Access.PUBLIC, ctx); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final int C2 = builder.methodref; |
| final int C1 = builder.addClass(emptyClass(pck)); |
| final int I = builder.addInterface(withDef); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I); |
| builder.objectref = C1; |
| }); |
| |
| public static final Template IfaceMethodrefAmbiguousResolvedIsIface = |
| new Template("IfaceMethodrefAmbiguousResolvedIsIface", |
| /* Inherit from interface. |
| * |
| * I1[](*) = mref, I2[](any) |
| * C1[I1,I2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData.Package pck = oldexpected.packageId; |
| final MethodData.Context ctx = oldexpected.methoddata.context; |
| final MethodData mdata = |
| new MethodData(MethodData.Access.PUBLIC, ctx); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final int I1 = builder.methodref; |
| final int C = builder.addClass(emptyClass(pck)); |
| final int I2 = builder.addInterface(withDef); |
| builder.hier.addInherit(C, I1); |
| builder.hier.addInherit(C, I2); |
| builder.objectref = C; |
| }); |
| |
| public static final Template InvokespecialAmbiguousResolvedIsIface = |
| new Template("InvokespecialAmbiguousResolvedIsIface", |
| /* Inherit from interface. |
| * |
| * C2[](*) = csite, I[](any) |
| * C1[C2,I]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData oldexpected = |
| builder.classdata.get(builder.expected); |
| final ClassData.Package pck = oldexpected.packageId; |
| final MethodData.Context ctx = oldexpected.methoddata.context; |
| final MethodData mdata = |
| new MethodData(MethodData.Access.PUBLIC, ctx); |
| final ClassData withDef = new ClassData(pck, mdata); |
| final int C2 = builder.callsite; |
| final int C1 = builder.addClass(emptyClass(pck)); |
| final int I = builder.addInterface(withDef); |
| builder.hier.addInherit(C1, C2); |
| builder.hier.addInherit(C1, I); |
| builder.objectref = C1; |
| }); |
| |
| /****************************** |
| * invokespecial Templates * |
| ******************************/ |
| |
| // Create this by taking MethodrefSelection and replacing |
| // methodref with callsite. |
| public static final Template ObjectrefAssignableToCallsite = |
| new Template("ObjectrefAssignableToCallsite", |
| /* Case 1: Objectref equals callsite |
| * |
| * C[](*) = csite = oref |
| */ |
| (builder) -> { |
| builder.objectref = builder.callsite; |
| }, |
| /* Case 2: Inherit from super. |
| * |
| * C2[](*) = csite |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.callsite).packageId; |
| final int C2 = builder.callsite; |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }); |
| |
| public static final Template ObjectrefExactSubclassOfCallsite = |
| new Template("ObjectrefSubclassOfCallsite", |
| /* Inherit from super. |
| * |
| * C2[](*) = csite |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.callsite).packageId; |
| final int C2 = builder.callsite; |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }); |
| |
| public static final Template ObjectrefEqualsOrExactSubclassOfCallsite = |
| new Template("ObjectrefEqualsOrExactSubclassOfCallsite", |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| builder.objectref = builder.callsite; |
| }, |
| /* Inherit from super. |
| * |
| * C2[](*) = csite |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.callsite).packageId; |
| final int C2 = builder.callsite; |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }); |
| |
| public static final Template ObjectrefEqualsCallsite = |
| new Template("TrivialObjectref", |
| Collections.singleton((builder) -> { |
| builder.objectref = builder.callsite; |
| })); |
| |
| public static final Template ObjectrefSubclassOfSubclassOfCallsite = |
| new Template("ObjectrefSubclassOfCallsite", |
| /* Inherit from super. |
| * |
| * C3[](*) = csite |
| * C2[C3]() |
| * C1[C2]() = oref |
| */ |
| (final SelectionResolutionTestCase.Builder builder) -> { |
| final ClassData.Package pck = |
| builder.classdata.get(builder.callsite).packageId; |
| final int C3 = builder.callsite; |
| final int C2 = builder.addClass(emptyClass(pck)); |
| final int C1 = builder.addClass(emptyClass(pck)); |
| builder.hier.addInherit(C2, C3); |
| builder.hier.addInherit(C1, C2); |
| builder.objectref = C1; |
| }); |
| |
| private static class Placeholder extends ClassData { |
| private final String placeholder; |
| |
| |
| private Placeholder(final String placeholder, |
| final MethodData methoddata) { |
| super(ClassData.Package.PLACEHOLDER, methoddata); |
| this.placeholder = placeholder; |
| } |
| |
| private Placeholder(final String placeholder) { |
| this(placeholder, null); |
| } |
| |
| public String toString() { |
| return " = <Placeholder for " + placeholder + ">\n\n"; |
| } |
| |
| public static final Placeholder objectref = new Placeholder("objectref"); |
| public static final Placeholder methodref = new Placeholder("methodref"); |
| public static final Placeholder callsite = new Placeholder("callsite"); |
| public static final Placeholder expected = |
| new Placeholder("expected", |
| new MethodData(MethodData.Access.PLACEHOLDER, |
| MethodData.Context.PLACEHOLDER)); |
| } |
| |
| public static void main(String... args) { |
| |
| System.err.println("*** Resolution Templates ***\n"); |
| final SelectionResolutionTestCase.Builder withExpectedIface = |
| new SelectionResolutionTestCase.Builder(); |
| withExpectedIface.expected = |
| withExpectedIface.addInterface(Placeholder.expected); |
| final SelectionResolutionTestCase.Builder withExpectedClass = |
| new SelectionResolutionTestCase.Builder(); |
| withExpectedClass.expected = |
| withExpectedClass.addClass(Placeholder.expected); |
| |
| MethodrefNotEqualsExpectedClass.printCases(withExpectedClass); |
| MethodrefNotEqualsExpectedIface.printCases(withExpectedIface); |
| IfaceMethodrefNotEqualsExpected.printCases(withExpectedIface); |
| MethodrefAmbiguous.printCases(withExpectedIface); |
| IfaceMethodrefAmbiguous.printCases(withExpectedIface); |
| ReabstractExpectedIface.printCases(withExpectedIface); |
| ReabstractExpectedClass.printCases(withExpectedClass); |
| |
| final SelectionResolutionTestCase.Builder methodrefExpectedIface = |
| withExpectedIface.copy(); |
| methodrefExpectedIface.methodref = |
| methodrefExpectedIface.addClass(Placeholder.methodref); |
| final SelectionResolutionTestCase.Builder methodrefExpectedClass = |
| withExpectedClass.copy(); |
| methodrefExpectedClass.methodref = |
| methodrefExpectedClass.addClass(Placeholder.methodref); |
| final SelectionResolutionTestCase.Builder ifaceMethodref = |
| withExpectedIface.copy(); |
| ifaceMethodref.methodref = |
| ifaceMethodref.addInterface(Placeholder.methodref); |
| |
| IgnoredAbstract.printCases(methodrefExpectedIface); |
| MethodrefSelectionResolvedIsClass.printCases(methodrefExpectedClass); |
| MethodrefSelectionResolvedIsIface.printCases(methodrefExpectedIface); |
| IfaceMethodrefSelection.printCases(ifaceMethodref); |
| IfaceMethodrefSelectionOverrideNonPublic.printCases(ifaceMethodref); |
| |
| } |
| |
| } |