hotspot/test/runtime/SelectionResolution/classes/selectionresolution/ClassBuilder.java
author stsmirno
Mon, 17 Oct 2016 18:54:12 -0400
changeset 41705 332239c052cc
parent 37196 f3f7367e8c53
permissions -rw-r--r--
8165687: Fix license and copyright headers in jd9 under hotspot/test Summary: Legal notices and Oracle copyrights were updated (white and blank space, commas) in tests files for uniformity to meet Oracle requirements. Reviewed-by: dholmes, iris Contributed-by: Stanislav Smirnov <stanislav.smirnov@oracle.com>, Vassili Igouchkine <vassili.igouchkine@oracle.com>
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
37196
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
     1
/*
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
     2
 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
     4
 *
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
     7
 * published by the Free Software Foundation.
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
     8
 *
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    13
 * accompanied this code).
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    14
 *
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    18
 *
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    21
 * questions.
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    22
 */
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    23
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    24
package selectionresolution;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    25
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    26
import java.util.ArrayList;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    27
import java.util.Iterator;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    28
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    29
import static jdk.internal.org.objectweb.asm.Opcodes.ACC_ABSTRACT;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    30
import static jdk.internal.org.objectweb.asm.Opcodes.ACC_PUBLIC;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    31
import static jdk.internal.org.objectweb.asm.Opcodes.ACC_PRIVATE;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    32
import static jdk.internal.org.objectweb.asm.Opcodes.ACC_PROTECTED;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    33
import static jdk.internal.org.objectweb.asm.Opcodes.ACC_STATIC;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    34
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    35
/**
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    36
 * Constructs classes and interfaces based on the information from a
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    37
 * DefaultMethodTestCase
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    38
 *
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    39
 */
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    40
public class ClassBuilder extends Builder {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    41
    private final ArrayList<ClassConstruct> classes;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    42
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    43
    // Add a class in every package to be able to instantiate package
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    44
    // private classes from outside the package
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    45
    private final Clazz[] helpers = new Clazz[4];
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    46
    private ClassConstruct callsiteClass;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    47
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    48
    public enum ExecutionMode { DIRECT, INDY, MH_INVOKE_EXACT, MH_INVOKE_GENERIC}
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    49
    private final ExecutionMode execMode;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    50
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    51
    public ClassBuilder(SelectionResolutionTestCase testcase,
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    52
                        ExecutionMode execMode) {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    53
        super(testcase);
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    54
        this.classes = new ArrayList<>();
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    55
        this.execMode = execMode;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    56
    }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    57
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    58
    public ClassConstruct[] build() throws Exception {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    59
        buildClassConstructs();
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    60
        return classes.toArray(new ClassConstruct[0]);
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    61
    }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    62
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    63
    public ClassConstruct getCallsiteClass() {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    64
        return callsiteClass;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    65
    }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    66
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    67
    private void buildClassConstructs() throws Exception {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    68
        TestBuilder tb = new TestBuilder(testcase.methodref, testcase);
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    69
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    70
        classes.add(new Clazz("Test", ACC_PUBLIC, -1));
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    71
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    72
        for (int classId = 0; classId < classdata.size(); classId++) {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    73
            ClassConstruct C;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    74
            String[] interfaces = getInterfaces(classId);
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    75
            ClassData data = classdata.get(classId);
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    76
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    77
            if (isClass(classId)) {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    78
                C = new Clazz(getName(classId),
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    79
                              getExtending(classId),
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    80
                              getClassModifiers(data),
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    81
                              classId,
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    82
                              interfaces);
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    83
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    84
                addHelperMethod(classId);
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    85
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    86
            } else {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    87
                C = new Interface(getName(classId),
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    88
                                  getAccessibility(data.access),
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    89
                                  classId, interfaces);
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    90
            }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    91
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    92
            // Add a method "m()LTestObject;" if applicable
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    93
            if (containsMethod(data)) {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    94
                // Method will either be abstract or concrete depending on the
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    95
                // abstract modifier
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    96
                C.addTestMethod(getMethodModifiers(data));
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    97
            }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    98
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
    99
            if (classId == testcase.callsite) {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   100
                // Add test() method
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   101
                tb.addTest(C, execMode);
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   102
                callsiteClass = C;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   103
            }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   104
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   105
            classes.add(C);
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   106
        }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   107
        classes.add(tb.getMainTestClass());
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   108
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   109
    }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   110
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   111
    private void addHelperMethod(int classId) {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   112
        int packageId = classdata.get(classId).packageId.ordinal();
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   113
        Clazz C = helpers[packageId];
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   114
        if (C == null) {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   115
            C = new Clazz(getPackageName(packageId) + "Helper", -1, ACC_PUBLIC);
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   116
            helpers[packageId] = C;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   117
            classes.add(C);
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   118
        }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   119
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   120
        Method m = C.addMethod("get" + getClassName(classId),
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   121
                               "()L" + getName(classId) + ";",
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   122
                               ACC_PUBLIC + ACC_STATIC);
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   123
        m.makeInstantiateMethod(getName(classId));
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   124
    }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   125
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   126
    private String[] getInterfaces(int classId) {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   127
        ArrayList<String> interfaces = new ArrayList<>();
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   128
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   129
        // Figure out if we're extending/implementing an interface
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   130
        for (final int intf : hier.interfaces()) {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   131
            if (hier.inherits(classId, intf)) {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   132
                interfaces.add(getName(intf));
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   133
            }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   134
        }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   135
        return interfaces.toArray(new String[0]);
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   136
    }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   137
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   138
    private String getExtending(int classId) {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   139
        int extending = -1;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   140
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   141
        // See if we're extending another class
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   142
        for (final int extendsClass : hier.classes()) {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   143
            if (hier.inherits(classId, extendsClass)) {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   144
                // Sanity check that we haven't already found an extending class
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   145
                if (extending != -1) {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   146
                    throw new RuntimeException("Multiple extending classes");
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   147
                }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   148
                extending = extendsClass;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   149
            }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   150
        }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   151
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   152
        return extending == -1 ? null : getName(extending);
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   153
    }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   154
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   155
    /**
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   156
     * Returns modifiers for a Class
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   157
     * @param cd ClassData for the Class
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   158
     * @return ASM modifiers for a Class
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   159
     */
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   160
    private int getClassModifiers(ClassData cd) {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   161
        // For Classes we only care about accessibility (public, private etc)
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   162
        return getAccessibility(cd.access) | getAbstraction(cd.abstraction);
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   163
    }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   164
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   165
    /**
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   166
     * Returns modifiers for Method type
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   167
     * @param cd ClassData for the Class or Interface where the Method resides
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   168
     * @return ASM modifiers for the Method
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   169
     */
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   170
    private int getMethodModifiers(ClassData cd) {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   171
        int mod = 0;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   172
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   173
        // For methods we want everything
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   174
        mod += getAccessibility(cd.methoddata.access);
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   175
        mod += getAbstraction(cd.methoddata.context);
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   176
        mod += getContext(cd.methoddata.context);
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   177
        mod += getExtensibility();
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   178
        return mod;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   179
    }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   180
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   181
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   182
    /**
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   183
     * Convert ClassData access type to ASM
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   184
     * @param access
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   185
     * @return ASM version of accessibility (public / private / protected)
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   186
     */
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   187
    private int getAccessibility(MethodData.Access access) {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   188
        switch(access) {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   189
        case PACKAGE:
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   190
            //TODO: Do I need to set this or will this be the default?
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   191
            return 0;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   192
        case PRIVATE:
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   193
            return ACC_PRIVATE;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   194
        case PROTECTED:
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   195
            return ACC_PROTECTED;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   196
        case PUBLIC:
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   197
            return ACC_PUBLIC;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   198
        default:
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   199
            throw new RuntimeException("Illegal accessibility modifier: " + access);
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   200
        }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   201
    }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   202
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   203
    /**
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   204
     * Convert ClassData abstraction type to ASM
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   205
     * @param abstraction
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   206
     * @return ASM version of abstraction (abstract / non-abstract)
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   207
     */
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   208
    private int getAbstraction(MethodData.Context context) {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   209
        return context == MethodData.Context.ABSTRACT ? ACC_ABSTRACT : 0;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   210
    }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   211
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   212
    /**
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   213
     * Convert ClassData context type to ASM
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   214
     * @param context
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   215
     * @return ASM version of context (static / non-static)
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   216
     */
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   217
    private int getContext(MethodData.Context context) {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   218
        return context == MethodData.Context.STATIC ? ACC_STATIC : 0;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   219
    }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   220
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   221
    /**
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   222
     * Convert ClassData extensibility type to ASM
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   223
     * @param extensibility
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   224
     * @return ASM version of extensibility (final / non-final)
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   225
     */
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   226
    private int getExtensibility() {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   227
        return 0;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   228
    }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   229
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   230
    /**
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   231
     * Determine if we need a method at all, abstraction is set to null if this
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   232
     * Class/Interface should not have a test method
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   233
     * @param cd
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   234
     * @return
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   235
     */
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   236
    private boolean containsMethod(ClassData cd) {
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   237
        return cd.methoddata != null;
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   238
    }
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   239
f3f7367e8c53 8078112: [TESTBUG] Integrate Selection/Resolution test suite into jtreg tests
ddmitriev
parents:
diff changeset
   240
}