/*
 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/*
 // This is the Java representation of the below jasm code.  The test tries
 // to create a sub-type of jdk.internal.reflect.MethodAccessorImpl in order
 // to bypass Reflection.getCallerClass.  That should fail with an IAE.
 //
 import java.lang.reflect.Module;
 class fakeMethodAccessor extends jdk.internal.reflect.MethodAccessorImpl {
     public static void main(String[] a) throws Exception {
        fakeMethodAccessor f = new fakeMethodAccessor();
        System.out.println(String.class.getModule()
           .isExported("jdk.internal.misc", fakeMethodAccessor.class.getModule()));
     }
 }
*/

super class fakeMethodAccessor
    extends jdk/internal/reflect/MethodAccessorImpl
    version 53:0
{


Method "<init>":"()V"
    stack 1 locals 1
{
        aload_0;
        invokespecial    Method jdk/internal/reflect/MethodAccessorImpl."<init>":"()V";
        return;
}

public static Method main:"([Ljava/lang/String;)V"
    throws java/lang/Exception
    stack 4 locals 2
{
        new    class FakeMethodAccessor;
        dup;
        invokespecial    Method "<init>":"()V";
        astore_1;
        getstatic    Field java/lang/System.out:"Ljava/io/PrintStream;";
        ldc    class java/lang/String;
        invokevirtual    Method java/lang/Class.getModule:"()Ljava/lang/reflect/Module;";
        ldc    String "jdk.internal.misc";
        ldc    class FakeMethodAccessor;
        invokevirtual    Method java/lang/Class.getModule:"()Ljava/lang/reflect/Module;";
        invokevirtual    Method java/lang/reflect/Module.isExported:"(Ljava/lang/String;Ljava/lang/reflect/Module;)Z";
        invokevirtual    Method java/io/PrintStream.println:"(Z)V";
        return;
}

} // end Class FakeMethodAccessor
