test/jdk/java/lang/invoke/AccessControlTest.java
author dholmes
Sat, 23 Jun 2018 01:32:41 -0400
changeset 50735 2f2af62dfac7
parent 47216 71c04702a3d5
child 57512 f557f260b787
permissions -rw-r--r--
8010319: Implementation of JEP 181: Nest-Based Access Control Reviewed-by: alanb, psandoz, mchung, coleenp, acorn, mcimadamore, forax, jlahoda, sspitsyn, abuckley Contributed-by: alex.buckley@oracle.com, maurizio.mimadamore@oracle.com, mandy.chung@oracle.com, tobias.hartmann@oracle.com, david.holmes@oracle.com, vladimir.x.ivanov@oracle.com, karen.kinnear@oracle.com, vladimir.kozlov@oracle.com, john.r.rose@oracle.com, daniel.smith@oracle.com, serguei.spitsyn@oracle.com, kumardotsrinivasan@gmail.com, boris.ulasevich@bell-sw.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
     1
/*
50735
2f2af62dfac7 8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents: 47216
diff changeset
     2
 * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
     4
 *
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
21596
0e3a39f29dbc 8027696: Incorrect copyright header in the tests
serb
parents: 20535
diff changeset
     7
 * published by the Free Software Foundation.
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
     8
 *
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    13
 * accompanied this code).
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    14
 *
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    18
 *
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    21
 * questions.
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    22
 */
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    23
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    24
/* @test
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    25
 * @summary test access checking by java.lang.invoke.MethodHandles.Lookup
35315
67dcc46f8241 8148147: Sync up @modules from jigsaw/jake
alanb
parents: 33874
diff changeset
    26
 * @compile AccessControlTest.java AccessControlTest_subpkg/Acquaintance_remote.java
19388
188246066dbb 8022749: Convert junit tests to testng in test/java/lang/invoke
henryjen
parents: 13044
diff changeset
    27
 * @run testng/othervm test.java.lang.invoke.AccessControlTest
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    28
 */
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    29
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    30
package test.java.lang.invoke;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    31
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    32
import java.lang.invoke.*;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    33
import java.lang.reflect.*;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
    34
import java.lang.reflect.Modifier;
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    35
import java.util.*;
19388
188246066dbb 8022749: Convert junit tests to testng in test/java/lang/invoke
henryjen
parents: 13044
diff changeset
    36
import org.testng.*;
188246066dbb 8022749: Convert junit tests to testng in test/java/lang/invoke
henryjen
parents: 13044
diff changeset
    37
import org.testng.annotations.*;
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    38
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    39
import static java.lang.invoke.MethodHandles.*;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    40
import static java.lang.invoke.MethodHandles.Lookup.*;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    41
import static java.lang.invoke.MethodType.*;
19388
188246066dbb 8022749: Convert junit tests to testng in test/java/lang/invoke
henryjen
parents: 13044
diff changeset
    42
import static org.testng.Assert.*;
188246066dbb 8022749: Convert junit tests to testng in test/java/lang/invoke
henryjen
parents: 13044
diff changeset
    43
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    44
import test.java.lang.invoke.AccessControlTest_subpkg.Acquaintance_remote;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    45
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    46
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    47
/**
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    48
 * Test many combinations of Lookup access and cross-class lookupStatic.
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    49
 * @author jrose
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    50
 */
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    51
public class AccessControlTest {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    52
    static final Class<?> THIS_CLASS = AccessControlTest.class;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    53
    // How much output?
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    54
    static int verbosity = 0;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    55
    static {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    56
        String vstr = System.getProperty(THIS_CLASS.getSimpleName()+".verbosity");
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    57
        if (vstr == null)
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    58
            vstr = System.getProperty(THIS_CLASS.getName()+".verbosity");
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    59
        if (vstr != null)  verbosity = Integer.parseInt(vstr);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    60
    }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    61
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    62
    private class LookupCase implements Comparable<LookupCase> {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    63
        final Lookup   lookup;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    64
        final Class<?> lookupClass;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    65
        final int      lookupModes;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    66
        public LookupCase(Lookup lookup) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    67
            this.lookup = lookup;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    68
            this.lookupClass = lookup.lookupClass();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    69
            this.lookupModes = lookup.lookupModes();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    70
            assert(lookupString().equals(lookup.toString()));
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    71
            numberOf(lookupClass().getClassLoader()); // assign CL#
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    72
        }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    73
        public LookupCase(Class<?> lookupClass, int lookupModes) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    74
            this.lookup = null;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    75
            this.lookupClass = lookupClass;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    76
            this.lookupModes = lookupModes;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    77
            numberOf(lookupClass().getClassLoader()); // assign CL#
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    78
        }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    79
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    80
        public final Class<?> lookupClass() { return lookupClass; }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    81
        public final int      lookupModes() { return lookupModes; }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    82
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    83
        public Lookup lookup() { lookup.getClass(); return lookup; }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    84
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    85
        @Override
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    86
        public int compareTo(LookupCase that) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    87
            Class<?> c1 = this.lookupClass();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    88
            Class<?> c2 = that.lookupClass();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    89
            if (c1 != c2) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    90
                int cmp = c1.getName().compareTo(c2.getName());
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    91
                if (cmp != 0)  return cmp;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    92
                cmp = numberOf(c1.getClassLoader()) - numberOf(c2.getClassLoader());
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    93
                assert(cmp != 0);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    94
                return cmp;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    95
            }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    96
            return -(this.lookupModes() - that.lookupModes());
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    97
        }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    98
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
    99
        @Override
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   100
        public boolean equals(Object that) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   101
            return (that instanceof LookupCase && equals((LookupCase)that));
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   102
        }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   103
        public boolean equals(LookupCase that) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   104
            return (this.lookupClass() == that.lookupClass() &&
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   105
                    this.lookupModes() == that.lookupModes());
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   106
        }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   107
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   108
        @Override
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   109
        public int hashCode() {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   110
            return lookupClass().hashCode() + (lookupModes() * 31);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   111
        }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   112
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   113
        /** Simulate all assertions in the spec. for Lookup.toString. */
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   114
        private String lookupString() {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   115
            String name = lookupClass.getName();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   116
            String suffix = "";
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   117
            if (lookupModes == 0)
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   118
                suffix = "/noaccess";
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   119
            else if (lookupModes == PUBLIC)
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   120
                suffix = "/public";
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   121
             else if (lookupModes == (PUBLIC|UNCONDITIONAL))
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   122
                suffix = "/publicLookup";
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   123
            else if (lookupModes == (PUBLIC|MODULE))
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   124
                suffix = "/module";
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   125
            else if (lookupModes == (PUBLIC|MODULE|PACKAGE))
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   126
                suffix = "/package";
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   127
            else if (lookupModes == (PUBLIC|MODULE|PACKAGE|PRIVATE))
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   128
                suffix = "/private";
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   129
            else if (lookupModes == (PUBLIC|MODULE|PACKAGE|PRIVATE|PROTECTED))
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   130
                suffix = "";
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   131
            else
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   132
                suffix = "/#"+Integer.toHexString(lookupModes);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   133
            return name+suffix;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   134
        }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   135
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   136
        /** Simulate all assertions from the spec. for Lookup.in:
20535
cc85c8626435 8024438: JSR 292 API specification maintenance for JDK 8
jrose
parents: 19388
diff changeset
   137
         * <hr>
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   138
         * Creates a lookup on the specified new lookup class.
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   139
         * [A1] The resulting object will report the specified
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   140
         * class as its own {@link #lookupClass lookupClass}.
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   141
         * <p>
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   142
         * [A2] However, the resulting {@code Lookup} object is guaranteed
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   143
         * to have no more access capabilities than the original.
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   144
         * In particular, access capabilities can be lost as follows:<ul>
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   145
         * <li> [A3] If the old lookup class is in a named module, and the new
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   146
         * lookup class is in a different module {@code M}, then no members, not
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   147
         * even public members in {@code M}'s exported packages, will be accessible.
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   148
         * The exception to this is when this lookup is publicLookup, in which case
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   149
         * public access is not lost.
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   150
         * <li> [A4] If the old lookup class is in an unnamed module, and the new
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   151
         * lookup class is a different module then module access is lost.
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   152
         * <li> [A5] If the new lookup class differs from the old one then UNCONDITIONAL
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   153
         * is lost. If the new lookup class is not within the same package member as the
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   154
         * old one, protected members will not be accessible by virtue of inheritance.
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   155
         * (Protected members may continue to be accessible because of package sharing.)
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   156
         * <li> [A6] If the new lookup class is in a different package than the old one,
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   157
         * protected and default (package) members will not be accessible.
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   158
         * <li> [A7] If the new lookup class is not within the same package member
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   159
         * as the old one, private members will not be accessible.
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   160
         * <li> [A8] If the new lookup class is not accessible to the old lookup class,
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   161
         * then no members, not even public members, will be accessible.
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   162
         * <li> [A9] (In all other cases, public members will continue to be accessible.)
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   163
         * </ul>
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   164
         * Other than the above cases, the new lookup will have the same
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   165
         * access capabilities as the original. [A10]
20535
cc85c8626435 8024438: JSR 292 API specification maintenance for JDK 8
jrose
parents: 19388
diff changeset
   166
         * <hr>
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   167
         */
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   168
        public LookupCase in(Class<?> c2) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   169
            Class<?> c1 = lookupClass();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   170
            int m1 = lookupModes();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   171
            int changed = 0;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   172
            // for the purposes of access control then treat classes in different unnamed
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   173
            // modules as being in the same module.
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   174
            boolean sameModule = (c1.getModule() == c2.getModule()) ||
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   175
                                 (!c1.getModule().isNamed() && !c2.getModule().isNamed());
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   176
            boolean samePackage = (c1.getClassLoader() == c2.getClassLoader() &&
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   177
                                   c1.getPackageName().equals(c2.getPackageName()));
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   178
            boolean sameTopLevel = (topLevelClass(c1) == topLevelClass(c2));
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   179
            boolean sameClass = (c1 == c2);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   180
            assert(samePackage  || !sameTopLevel);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   181
            assert(sameTopLevel || !sameClass);
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   182
            boolean accessible = sameClass;
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   183
            if ((m1 & PACKAGE) != 0)  accessible |= samePackage;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   184
            if ((m1 & PUBLIC ) != 0)  accessible |= (c2.getModifiers() & PUBLIC) != 0;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   185
            if (!sameModule) {
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   186
                if (c1.getModule().isNamed() && (m1 & UNCONDITIONAL) == 0) {
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   187
                    accessible = false;  // [A3]
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   188
                } else {
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   189
                    changed |= (MODULE|PACKAGE|PRIVATE|PROTECTED);    // [A3] [A4]
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   190
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   191
            }
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   192
            if (!accessible) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   193
                // Different package and no access to c2; lose all access.
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   194
                changed |= (PUBLIC|MODULE|PACKAGE|PRIVATE|PROTECTED);  // [A8]
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   195
            }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   196
            if (!samePackage) {
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   197
                // Different package; loose PACKAGE and lower access.
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   198
                changed |= (PACKAGE|PRIVATE|PROTECTED);  // [A6]
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   199
            }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   200
            if (!sameTopLevel) {
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   201
                // Different top-level class.  Lose PRIVATE and PROTECTED access.
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   202
                changed |= (PRIVATE|PROTECTED);  // [A5] [A7]
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   203
            }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   204
            if (!sameClass) {
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   205
                changed |= (UNCONDITIONAL);     // [A5]
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   206
            } else {
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   207
                assert(changed == 0);       // [A10] (no deprivation if same class)
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   208
            }
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   209
            if (accessible)  assert((changed & PUBLIC) == 0);  // [A9]
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   210
            int m2 = m1 & ~changed;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   211
            LookupCase l2 = new LookupCase(c2, m2);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   212
            assert(l2.lookupClass() == c2); // [A1]
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   213
            assert((m1 | m2) == m1);        // [A2] (no elevation of access)
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   214
            return l2;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   215
        }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   216
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   217
        @Override
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   218
        public String toString() {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   219
            String s = lookupClass().getSimpleName();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   220
            String lstr = lookupString();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   221
            int sl = lstr.indexOf('/');
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   222
            if (sl >= 0)  s += lstr.substring(sl);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   223
            ClassLoader cld = lookupClass().getClassLoader();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   224
            if (cld != THIS_LOADER)  s += "/loader#"+numberOf(cld);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   225
            return s;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   226
        }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   227
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   228
        /** Predict the success or failure of accessing this method. */
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   229
        public boolean willAccess(Method m) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   230
            Class<?> c1 = lookupClass();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   231
            Class<?> c2 = m.getDeclaringClass();
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   232
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   233
            // publicLookup has access to all public types/members of types in unnamed modules
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   234
            if ((lookupModes & UNCONDITIONAL) != 0
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   235
                && (lookupModes & PUBLIC) != 0
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   236
                && !c2.getModule().isNamed()
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   237
                && Modifier.isPublic(c2.getModifiers())
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   238
                && Modifier.isPublic(m.getModifiers()))
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   239
                return true;
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   240
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   241
            LookupCase lc = this.in(c2);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   242
            int m1 = lc.lookupModes();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   243
            int m2 = fixMods(m.getModifiers());
50735
2f2af62dfac7 8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents: 47216
diff changeset
   244
            // allow private lookup on nestmates. Otherwise, privacy is strictly enforced
2f2af62dfac7 8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents: 47216
diff changeset
   245
            if (c1 != c2 && ((m2 & PRIVATE) == 0 || !c1.isNestmateOf(c2))) {
2f2af62dfac7 8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents: 47216
diff changeset
   246
                m1 &= ~PRIVATE;
2f2af62dfac7 8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents: 47216
diff changeset
   247
            }
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   248
            // protected access is sometimes allowed
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   249
            if ((m2 & PROTECTED) != 0) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   250
                int prev = m2;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   251
                m2 |= PACKAGE;  // it acts like a package method also
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   252
                if ((lookupModes() & PROTECTED) != 0 &&
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   253
                    c2.isAssignableFrom(c1))
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   254
                    m2 |= PUBLIC;  // from a subclass, it acts like a public method also
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   255
            }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   256
            if (verbosity >= 2)
50735
2f2af62dfac7 8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents: 47216
diff changeset
   257
                System.out.format("%s willAccess %s m1=0x%h m2=0x%h => %s%n", this, lc, m1, m2, ((m2 & m1) != 0));
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   258
            return (m2 & m1) != 0;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   259
        }
33874
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   260
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   261
        /** Predict the success or failure of accessing this class. */
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   262
        public boolean willAccessClass(Class<?> c2, boolean load) {
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   263
            Class<?> c1 = lookupClass();
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   264
            if (load && c2.getClassLoader() != null) {
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   265
                if (c1.getClassLoader() == null) {
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   266
                    // not visible
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   267
                    return false;
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   268
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   269
            }
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   270
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   271
            // publicLookup has access to all public types/members of types in unnamed modules
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 36511
diff changeset
   272
            if ((lookupModes & UNCONDITIONAL) != 0
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   273
                && (lookupModes & PUBLIC) != 0
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   274
                && (!c2.getModule().isNamed())
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   275
                && Modifier.isPublic(c2.getModifiers()))
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   276
                return true;
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   277
33874
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   278
            LookupCase lc = this.in(c2);
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   279
            int m1 = lc.lookupModes();
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   280
            boolean r = false;
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   281
            if (m1 == 0) {
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   282
                r = false;
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   283
            } else {
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   284
                int m2 = fixMods(c2.getModifiers());
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   285
                if ((m2 & PUBLIC) != 0) {
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   286
                    r = true;
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   287
                } else if ((m1 & PACKAGE) != 0 && c1.getPackage() == c2.getPackage()) {
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   288
                    r = true;
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   289
                }
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   290
            }
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   291
            if (verbosity >= 2) {
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   292
                System.out.println(this+" willAccessClass "+lc+" c1="+c1+" c2="+c2+" => "+r);
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   293
            }
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   294
            return r;
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   295
        }
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   296
    }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   297
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   298
    private static Class<?> topLevelClass(Class<?> cls) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   299
        Class<?> c = cls;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   300
        for (Class<?> ec; (ec = c.getEnclosingClass()) != null; )
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   301
            c = ec;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   302
        assert(c.getEnclosingClass() == null);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   303
        assert(c == cls || cls.getEnclosingClass() != null);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   304
        return c;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   305
    }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   306
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   307
    private final TreeSet<LookupCase> CASES = new TreeSet<>();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   308
    private final TreeMap<LookupCase,TreeSet<LookupCase>> CASE_EDGES = new TreeMap<>();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   309
    private final ArrayList<ClassLoader> LOADERS = new ArrayList<>();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   310
    private final ClassLoader THIS_LOADER = this.getClass().getClassLoader();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   311
    { if (THIS_LOADER != null)  LOADERS.add(THIS_LOADER); }  // #1
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   312
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   313
    private LookupCase lookupCase(String name) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   314
        for (LookupCase lc : CASES) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   315
            if (lc.toString().equals(name))
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   316
                return lc;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   317
        }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   318
        throw new AssertionError(name);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   319
    }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   320
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   321
    private int numberOf(ClassLoader cl) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   322
        if (cl == null)  return 0;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   323
        int i = LOADERS.indexOf(cl);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   324
        if (i < 0) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   325
            i = LOADERS.size();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   326
            LOADERS.add(cl);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   327
        }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   328
        return i+1;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   329
    }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   330
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   331
    private void addLookupEdge(LookupCase l1, Class<?> c2, LookupCase l2) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   332
        TreeSet<LookupCase> edges = CASE_EDGES.get(l2);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   333
        if (edges == null)  CASE_EDGES.put(l2, edges = new TreeSet<>());
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   334
        if (edges.add(l1)) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   335
            Class<?> c1 = l1.lookupClass();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   336
            assert(l2.lookupClass() == c2); // [A1]
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   337
            int m1 = l1.lookupModes();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   338
            int m2 = l2.lookupModes();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   339
            assert((m1 | m2) == m1);        // [A2] (no elevation of access)
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   340
            LookupCase expect = l1.in(c2);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   341
            if (!expect.equals(l2))
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   342
                System.out.println("*** expect "+l1+" => "+expect+" but got "+l2);
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   343
            assertEquals(l2, expect);
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   344
        }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   345
    }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   346
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   347
    private void makeCases(Lookup[] originalLookups) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   348
        // make initial set of lookup test cases
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   349
        CASES.clear(); LOADERS.clear(); CASE_EDGES.clear();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   350
        ArrayList<Class<?>> classes = new ArrayList<>();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   351
        for (Lookup l : originalLookups) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   352
            CASES.add(new LookupCase(l));
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   353
            classes.remove(l.lookupClass());  // no dups please
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   354
            classes.add(l.lookupClass());
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   355
        }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   356
        System.out.println("loaders = "+LOADERS);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   357
        int rounds = 0;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   358
        for (int lastCount = -1; lastCount != CASES.size(); ) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   359
            lastCount = CASES.size();  // if CASES grow in the loop we go round again
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   360
            for (LookupCase lc1 : CASES.toArray(new LookupCase[0])) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   361
                for (Class<?> c2 : classes) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   362
                    LookupCase lc2 = new LookupCase(lc1.lookup().in(c2));
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   363
                    addLookupEdge(lc1, c2, lc2);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   364
                    CASES.add(lc2);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   365
                }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   366
            }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   367
            rounds++;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   368
        }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   369
        System.out.println("filled in "+CASES.size()+" cases from "+originalLookups.length+" original cases in "+rounds+" rounds");
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   370
        if (false) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   371
            System.out.println("CASES: {");
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   372
            for (LookupCase lc : CASES) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   373
                System.out.println(lc);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   374
                Set<LookupCase> edges = CASE_EDGES.get(lc);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   375
                if (edges != null)
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   376
                    for (LookupCase prev : edges) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   377
                        System.out.println("\t"+prev);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   378
                    }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   379
            }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   380
            System.out.println("}");
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   381
        }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   382
    }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   383
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   384
    @Test public void test() {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   385
        makeCases(lookups());
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   386
        if (verbosity > 0) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   387
            verbosity += 9;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   388
            Method pro_in_self = targetMethod(THIS_CLASS, PROTECTED, methodType(void.class));
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   389
            testOneAccess(lookupCase("AccessControlTest/public"),  pro_in_self, "find");
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   390
            testOneAccess(lookupCase("Remote_subclass/public"),    pro_in_self, "find");
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   391
            testOneAccess(lookupCase("Remote_subclass"),           pro_in_self, "find");
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   392
            verbosity -= 9;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   393
        }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   394
        Set<Class<?>> targetClassesDone = new HashSet<>();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   395
        for (LookupCase targetCase : CASES) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   396
            Class<?> targetClass = targetCase.lookupClass();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   397
            if (!targetClassesDone.add(targetClass))  continue;  // already saw this one
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   398
            String targetPlace = placeName(targetClass);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   399
            if (targetPlace == null)  continue;  // Object, String, not a target
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   400
            for (int targetAccess : ACCESS_CASES) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   401
                MethodType methodType = methodType(void.class);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   402
                Method method = targetMethod(targetClass, targetAccess, methodType);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   403
                // Try to access target method from various contexts.
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   404
                for (LookupCase sourceCase : CASES) {
33874
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   405
                    testOneAccess(sourceCase, method, "findClass");
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   406
                    testOneAccess(sourceCase, method, "accessClass");
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   407
                    testOneAccess(sourceCase, method, "find");
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   408
                    testOneAccess(sourceCase, method, "unreflect");
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   409
                }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   410
            }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   411
        }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   412
        System.out.println("tested "+testCount+" access scenarios; "+testCountFails+" accesses were denied");
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   413
    }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   414
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   415
    private int testCount, testCountFails;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   416
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   417
    private void testOneAccess(LookupCase sourceCase, Method method, String kind) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   418
        Class<?> targetClass = method.getDeclaringClass();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   419
        String methodName = method.getName();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   420
        MethodType methodType = methodType(method.getReturnType(), method.getParameterTypes());
33874
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   421
        boolean isFindOrAccessClass = "findClass".equals(kind) || "accessClass".equals(kind);
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   422
        boolean willAccess = isFindOrAccessClass ?
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   423
                sourceCase.willAccessClass(targetClass, "findClass".equals(kind)) : sourceCase.willAccess(method);
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   424
        boolean didAccess = false;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   425
        ReflectiveOperationException accessError = null;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   426
        try {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   427
            switch (kind) {
33874
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   428
            case "accessClass":
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   429
                sourceCase.lookup().accessClass(targetClass);
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   430
                break;
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   431
            case "findClass":
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   432
                sourceCase.lookup().findClass(targetClass.getName());
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   433
                break;
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   434
            case "find":
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   435
                if ((method.getModifiers() & Modifier.STATIC) != 0)
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   436
                    sourceCase.lookup().findStatic(targetClass, methodName, methodType);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   437
                else
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   438
                    sourceCase.lookup().findVirtual(targetClass, methodName, methodType);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   439
                break;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   440
            case "unreflect":
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   441
                sourceCase.lookup().unreflect(method);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   442
                break;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   443
            default:
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   444
                throw new AssertionError(kind);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   445
            }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   446
            didAccess = true;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   447
        } catch (ReflectiveOperationException ex) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   448
            accessError = ex;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   449
        }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   450
        if (willAccess != didAccess) {
33874
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   451
            System.out.println(sourceCase+" => "+targetClass.getSimpleName()+(isFindOrAccessClass?"":"."+methodName+methodType));
46651fd30c0b 8139885: implement JEP 274: enhanced method handles
mhaupt
parents: 32649
diff changeset
   452
            System.out.println("fail "+(isFindOrAccessClass?kind:"on "+method)+" ex="+accessError);
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   453
            assertEquals(willAccess, didAccess);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   454
        }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   455
        testCount++;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   456
        if (!didAccess)  testCountFails++;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   457
    }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   458
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   459
    static Method targetMethod(Class<?> targetClass, int targetAccess, MethodType methodType) {
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   460
        assert targetAccess != MODULE;
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   461
        String methodName = accessName(targetAccess)+placeName(targetClass);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   462
        if (verbosity >= 2)
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   463
            System.out.println(targetClass.getSimpleName()+"."+methodName+methodType);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   464
        try {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   465
            Method method = targetClass.getDeclaredMethod(methodName, methodType.parameterArray());
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   466
            assertEquals(method.getReturnType(), methodType.returnType());
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   467
            int haveMods = method.getModifiers();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   468
            assert(Modifier.isStatic(haveMods));
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   469
            assert(targetAccess == fixMods(haveMods));
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   470
            return method;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   471
        } catch (NoSuchMethodException ex) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   472
            throw new AssertionError(methodName, ex);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   473
        }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   474
    }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   475
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   476
    static String placeName(Class<?> cls) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   477
        // return "self", "sibling", "nestmate", etc.
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   478
        if (cls == AccessControlTest.class)  return "self";
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   479
        String cln = cls.getSimpleName();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   480
        int under = cln.lastIndexOf('_');
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   481
        if (under < 0)  return null;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   482
        return cln.substring(under+1);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   483
    }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   484
    static String accessName(int acc) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   485
        switch (acc) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   486
        case PUBLIC:     return "pub_in_";
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   487
        case PROTECTED:  return "pro_in_";
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   488
        case PACKAGE:    return "pkg_in_";
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   489
        case PRIVATE:    return "pri_in_";
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   490
        }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   491
        assert(false);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   492
        return "?";
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   493
    }
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35315
diff changeset
   494
    // MODULE not a test case at this time
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   495
    private static final int[] ACCESS_CASES = {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   496
        PUBLIC, PACKAGE, PRIVATE, PROTECTED
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   497
    };
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   498
    /** Return one of the ACCESS_CASES. */
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   499
    static int fixMods(int mods) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   500
        mods &= (PUBLIC|PRIVATE|PROTECTED);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   501
        switch (mods) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   502
        case PUBLIC: case PRIVATE: case PROTECTED: return mods;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   503
        case 0:  return PACKAGE;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   504
        }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   505
        throw new AssertionError(mods);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   506
    }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   507
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   508
    static Lookup[] lookups() {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   509
        ArrayList<Lookup> tem = new ArrayList<>();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   510
        Collections.addAll(tem,
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   511
                           AccessControlTest.lookup_in_self(),
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   512
                           Inner_nestmate.lookup_in_nestmate(),
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   513
                           AccessControlTest_sibling.lookup_in_sibling());
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   514
        if (true) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   515
            Collections.addAll(tem,Acquaintance_remote.lookups());
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   516
        } else {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   517
            try {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   518
                Class<?> remc = Class.forName("test.java.lang.invoke.AccessControlTest_subpkg.Acquaintance_remote");
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   519
                Lookup[] remls = (Lookup[]) remc.getMethod("lookups").invoke(null);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   520
                Collections.addAll(tem, remls);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   521
            } catch (ReflectiveOperationException ex) {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   522
                throw new LinkageError("reflection failed", ex);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   523
            }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   524
        }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   525
        tem.add(publicLookup());
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   526
        tem.add(publicLookup().in(String.class));
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   527
        tem.add(publicLookup().in(List.class));
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   528
        return tem.toArray(new Lookup[0]);
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   529
    }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   530
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   531
    static Lookup lookup_in_self() {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   532
        return MethodHandles.lookup();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   533
    }
32649
2ee9017c7597 8136583: Core libraries should use blessed modifier order
martin
parents: 23010
diff changeset
   534
    public static      void pub_in_self() { }
2ee9017c7597 8136583: Core libraries should use blessed modifier order
martin
parents: 23010
diff changeset
   535
    protected static   void pro_in_self() { }
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   536
    static /*package*/ void pkg_in_self() { }
32649
2ee9017c7597 8136583: Core libraries should use blessed modifier order
martin
parents: 23010
diff changeset
   537
    private static     void pri_in_self() { }
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   538
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   539
    static class Inner_nestmate {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   540
        static Lookup lookup_in_nestmate() {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   541
            return MethodHandles.lookup();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   542
        }
32649
2ee9017c7597 8136583: Core libraries should use blessed modifier order
martin
parents: 23010
diff changeset
   543
        public static      void pub_in_nestmate() { }
2ee9017c7597 8136583: Core libraries should use blessed modifier order
martin
parents: 23010
diff changeset
   544
        protected static   void pro_in_nestmate() { }
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   545
        static /*package*/ void pkg_in_nestmate() { }
32649
2ee9017c7597 8136583: Core libraries should use blessed modifier order
martin
parents: 23010
diff changeset
   546
        private static     void pri_in_nestmate() { }
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   547
    }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   548
}
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   549
class AccessControlTest_sibling {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   550
    static Lookup lookup_in_sibling() {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   551
        return MethodHandles.lookup();
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   552
    }
32649
2ee9017c7597 8136583: Core libraries should use blessed modifier order
martin
parents: 23010
diff changeset
   553
    public static      void pub_in_sibling() { }
2ee9017c7597 8136583: Core libraries should use blessed modifier order
martin
parents: 23010
diff changeset
   554
    protected static   void pro_in_sibling() { }
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   555
    static /*package*/ void pkg_in_sibling() { }
32649
2ee9017c7597 8136583: Core libraries should use blessed modifier order
martin
parents: 23010
diff changeset
   556
    private static     void pri_in_sibling() { }
13044
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   557
}
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   558
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   559
// This guy tests access from outside the package:
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   560
/*
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   561
package test.java.lang.invoke.AccessControlTest_subpkg;
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   562
public class Acquaintance_remote {
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   563
    public static Lookup[] lookups() { ...
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   564
    }
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   565
    ...
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   566
}
8411854afc2b 7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
diff changeset
   567
*/