test/hotspot/jtreg/runtime/modules/AccessCheck/MethodAccessReadTwice.java
author hseigel
Mon, 23 Oct 2017 10:42:26 -0400
changeset 47684 c3c04b6e14f8
permissions -rw-r--r--
8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution Summary: Store resolution exception in resolution_error table and set flag in cpCache indicating resolution failed. Reviewed-by: acorn, jrose, dholmes, lfoltan
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
47684
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
     1
/*
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
     2
 Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
     4
 *
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
     7
 * published by the Free Software Foundation.
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
     8
 *
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    13
 * accompanied this code).
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    14
 *
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    18
 *
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    21
 * questions.
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    22
 */
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    23
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    24
/*
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    25
 * @test
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    26
 * @bug 8174954
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    27
 * @summary Test that invokedynamic instructions, that initially throw IAE exceptions
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    28
 *          because of a missing module read edge, behave correctly when executed
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    29
 *          after the module read edge is added.
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    30
 * @compile ModuleLibrary.java
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    31
 *          p2/c2.java
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    32
 *          p5/c5.java
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    33
 *          p7/c7.java
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    34
 * @run main/othervm MethodAccessReadTwice
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    35
 */
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    36
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    37
import java.lang.module.Configuration;
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    38
import java.lang.module.ModuleDescriptor;
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    39
import java.lang.module.ModuleFinder;
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    40
import java.lang.ModuleLayer;
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    41
import java.lang.Module;
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    42
import java.util.HashMap;
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    43
import java.util.Map;
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    44
import java.util.Set;
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    45
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    46
// defines first_mod --> packages p5
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    47
// defines second_mod --> package p2, p2 is exported to first_mod
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    48
// defines third_mod --> packages p7
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    49
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    50
public class MethodAccessReadTwice {
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    51
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    52
    // Create a Layer over the boot layer.
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    53
    // Define modules within this layer to test access between
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    54
    // publicly defined classes within packages of those modules.
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    55
    public void createLayerOnBoot() throws Throwable {
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    56
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    57
        // Define module:     first_mod
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    58
        // Can read:          java.base
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    59
        // Packages:          p5
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    60
        // Packages exported: p5 is exported unqualifiedly
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    61
        ModuleDescriptor descriptor_first_mod =
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    62
                ModuleDescriptor.newModule("first_mod")
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    63
                        .requires("java.base")
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    64
                        .exports("p5")
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    65
                        .build();
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    66
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    67
        // Define module:     second_mod
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    68
        // Can read:          java.base
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    69
        // Packages:          p2
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    70
        // Packages exported: p2 is exported to first_mod
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    71
        ModuleDescriptor descriptor_second_mod =
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    72
                ModuleDescriptor.newModule("second_mod")
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    73
                        .requires("java.base")
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    74
                        .exports("p2")
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    75
                        .build();
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    76
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    77
        // Define module:     third_mod
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    78
        // Can read:          java.base
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    79
        // Packages:          p7
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    80
        // Packages exported: p7 is exported unqualifiedly
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    81
        ModuleDescriptor descriptor_third_mod =
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    82
                ModuleDescriptor.newModule("third_mod")
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    83
                        .requires("java.base")
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    84
                        .exports("p7")
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    85
                        .build();
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    86
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    87
        // Set up a ModuleFinder containing all modules for this layer
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    88
        ModuleFinder finder = ModuleLibrary.of(descriptor_first_mod,
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    89
                                               descriptor_second_mod,
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    90
                                               descriptor_third_mod);
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    91
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    92
        // Resolves "first_mod", "second_mod", and "third_mod"
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    93
        Configuration cf = ModuleLayer.boot()
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    94
                .configuration()
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    95
                .resolve(finder, ModuleFinder.of(),
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    96
                         Set.of("first_mod", "second_mod", "third_mod"));
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    97
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    98
        // Map each module to this class loader
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
    99
        Map<String, ClassLoader> map = new HashMap<>();
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   100
        ClassLoader loader = MethodAccessReadTwice.class.getClassLoader();
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   101
        map.put("first_mod", loader);
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   102
        map.put("second_mod", loader);
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   103
        map.put("third_mod", loader);
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   104
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   105
        // Create Layer that contains first_mod, second_mod, and third_mod
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   106
        ModuleLayer layer = ModuleLayer.boot().defineModules(cf, map::get);
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   107
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   108
        Class p2_c2_class = loader.loadClass("p2.c2");
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   109
        Class p5_c5_class = loader.loadClass("p5.c5");
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   110
        Class p7_c7_class = loader.loadClass("p7.c7");
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   111
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   112
        Module first_mod = p5_c5_class.getModule();
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   113
        Module second_mod = p2_c2_class.getModule();
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   114
        Module third_mod = p7_c7_class.getModule();
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   115
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   116
        p5.c5 c5_obj = new p5.c5();
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   117
        p2.c2 c2_obj = new p2.c2();
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   118
        p7.c7 c7_obj = new p7.c7();
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   119
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   120
        // Test that if an invokedynamic instruction gets an IAE exception because
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   121
        // of a module read issue, and then the read issue is fixed, that
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   122
        // re-executing the same invokedynamic instruction will get the same IAE.
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   123
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   124
        // First access check for p5.c5 --> call to method5 --> tries to access p2.c2
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   125
        try {
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   126
            // Should throw IAE because p5.c5's module cannot read p2.c2's module.
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   127
            c5_obj.method5(c2_obj);
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   128
            throw new RuntimeException("Test Failed, module first_mod should not have access to p2.c2");
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   129
        } catch (IllegalAccessError e) {
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   130
            String message = e.getMessage();
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   131
            if (!(message.contains("cannot access") &&
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   132
                  message.contains("because module first_mod does not read module second_mod"))) {
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   133
                throw new RuntimeException("Wrong message: " + message);
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   134
            } else {
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   135
                System.out.println("Test Succeeded at attempt #1");
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   136
            }
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   137
        }
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   138
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   139
        // Add a read edge from p5/c5's module (first_mod) to p2.c2's module (second_mod)
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   140
        c5_obj.methodAddReadEdge(p2_c2_class.getModule());
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   141
        // Second access check for p5.c5, should have same result as first
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   142
        try {
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   143
            c5_obj.method5(c2_obj); // should result in IAE
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   144
            throw new RuntimeException("Test Failed, access should have been cached above");
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   145
        } catch (IllegalAccessError e) {
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   146
            String message = e.getMessage();
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   147
            if (!(message.contains("cannot access") &&
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   148
                  message.contains("because module first_mod does not read module second_mod"))) {
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   149
                throw new RuntimeException("Wrong message: " + message);
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   150
            } else {
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   151
                System.out.println("Test Succeeded at attempt #2");
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   152
            }
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   153
        }
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   154
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   155
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   156
        // Test that if one invokedynamic instruction gets an IAE exception
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   157
        // because of a module read issue, and then the read issue is fixed, that
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   158
        // a subsequent invokedynamic instruction, that tries the same access,
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   159
        // succeeds.
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   160
        c7_obj.method7(c2_obj, second_mod); // Should not result in IAE
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   161
    }
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   162
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   163
    public static void main(String args[]) throws Throwable {
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   164
      MethodAccessReadTwice test = new MethodAccessReadTwice();
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   165
      test.createLayerOnBoot();
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   166
    }
c3c04b6e14f8 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution
hseigel
parents:
diff changeset
   167
}