src/java.base/share/classes/java/lang/invoke/VarHandles.java
author redestad
Thu, 19 Sep 2019 23:38:50 +0200
changeset 58238 3386b9a8ef4d
parent 52914 4fa75d8ad418
permissions -rw-r--r--
8230768: Arrays of SoftReferences in MethodTypeForm should not be @Stable Reviewed-by: mchung
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     1
/*
52914
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
     2
 * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved.
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     4
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    10
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    15
 * accompanied this code).
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    16
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    20
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    23
 * questions.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    24
 */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    25
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    26
package java.lang.invoke;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    27
52914
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
    28
import java.lang.reflect.Field;
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
    29
import java.lang.reflect.Modifier;
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
    30
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    31
import static java.lang.invoke.MethodHandleStatics.UNSAFE;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    32
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    33
final class VarHandles {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    34
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    35
    static VarHandle makeFieldHandle(MemberName f, Class<?> refc, Class<?> type, boolean isWriteAllowedOnFinalFields) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    36
        if (!f.isStatic()) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    37
            long foffset = MethodHandleNatives.objectFieldOffset(f);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    38
            if (!type.isPrimitive()) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    39
                return f.isFinal() && !isWriteAllowedOnFinalFields
52220
9c260a6b6471 8207146: Rename jdk.internal.misc.Unsafe::xxxObject to xxxReference
mchung
parents: 47859
diff changeset
    40
                       ? new VarHandleReferences.FieldInstanceReadOnly(refc, foffset, type)
9c260a6b6471 8207146: Rename jdk.internal.misc.Unsafe::xxxObject to xxxReference
mchung
parents: 47859
diff changeset
    41
                       : new VarHandleReferences.FieldInstanceReadWrite(refc, foffset, type);
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    42
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    43
            else if (type == boolean.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    44
                return f.isFinal() && !isWriteAllowedOnFinalFields
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    45
                       ? new VarHandleBooleans.FieldInstanceReadOnly(refc, foffset)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    46
                       : new VarHandleBooleans.FieldInstanceReadWrite(refc, foffset);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    47
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    48
            else if (type == byte.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    49
                return f.isFinal() && !isWriteAllowedOnFinalFields
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    50
                       ? new VarHandleBytes.FieldInstanceReadOnly(refc, foffset)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    51
                       : new VarHandleBytes.FieldInstanceReadWrite(refc, foffset);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    52
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    53
            else if (type == short.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    54
                return f.isFinal() && !isWriteAllowedOnFinalFields
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    55
                       ? new VarHandleShorts.FieldInstanceReadOnly(refc, foffset)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    56
                       : new VarHandleShorts.FieldInstanceReadWrite(refc, foffset);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    57
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    58
            else if (type == char.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    59
                return f.isFinal() && !isWriteAllowedOnFinalFields
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    60
                       ? new VarHandleChars.FieldInstanceReadOnly(refc, foffset)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    61
                       : new VarHandleChars.FieldInstanceReadWrite(refc, foffset);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    62
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    63
            else if (type == int.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    64
                return f.isFinal() && !isWriteAllowedOnFinalFields
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    65
                       ? new VarHandleInts.FieldInstanceReadOnly(refc, foffset)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    66
                       : new VarHandleInts.FieldInstanceReadWrite(refc, foffset);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    67
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    68
            else if (type == long.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    69
                return f.isFinal() && !isWriteAllowedOnFinalFields
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    70
                       ? new VarHandleLongs.FieldInstanceReadOnly(refc, foffset)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    71
                       : new VarHandleLongs.FieldInstanceReadWrite(refc, foffset);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    72
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    73
            else if (type == float.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    74
                return f.isFinal() && !isWriteAllowedOnFinalFields
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    75
                       ? new VarHandleFloats.FieldInstanceReadOnly(refc, foffset)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    76
                       : new VarHandleFloats.FieldInstanceReadWrite(refc, foffset);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    77
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    78
            else if (type == double.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    79
                return f.isFinal() && !isWriteAllowedOnFinalFields
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    80
                       ? new VarHandleDoubles.FieldInstanceReadOnly(refc, foffset)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    81
                       : new VarHandleDoubles.FieldInstanceReadWrite(refc, foffset);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    82
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    83
            else {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    84
                throw new UnsupportedOperationException();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    85
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    86
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    87
        else {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    88
            // TODO This is not lazy on first invocation
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    89
            // and might cause some circular initialization issues
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    90
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    91
            // Replace with something similar to direct method handles
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    92
            // where a barrier is used then elided after use
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    93
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    94
            if (UNSAFE.shouldBeInitialized(refc))
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    95
                UNSAFE.ensureClassInitialized(refc);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    96
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    97
            Object base = MethodHandleNatives.staticFieldBase(f);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    98
            long foffset = MethodHandleNatives.staticFieldOffset(f);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    99
            if (!type.isPrimitive()) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   100
                return f.isFinal() && !isWriteAllowedOnFinalFields
52220
9c260a6b6471 8207146: Rename jdk.internal.misc.Unsafe::xxxObject to xxxReference
mchung
parents: 47859
diff changeset
   101
                       ? new VarHandleReferences.FieldStaticReadOnly(base, foffset, type)
9c260a6b6471 8207146: Rename jdk.internal.misc.Unsafe::xxxObject to xxxReference
mchung
parents: 47859
diff changeset
   102
                       : new VarHandleReferences.FieldStaticReadWrite(base, foffset, type);
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   103
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   104
            else if (type == boolean.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   105
                return f.isFinal() && !isWriteAllowedOnFinalFields
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   106
                       ? new VarHandleBooleans.FieldStaticReadOnly(base, foffset)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   107
                       : new VarHandleBooleans.FieldStaticReadWrite(base, foffset);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   108
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   109
            else if (type == byte.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   110
                return f.isFinal() && !isWriteAllowedOnFinalFields
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   111
                       ? new VarHandleBytes.FieldStaticReadOnly(base, foffset)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   112
                       : new VarHandleBytes.FieldStaticReadWrite(base, foffset);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   113
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   114
            else if (type == short.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   115
                return f.isFinal() && !isWriteAllowedOnFinalFields
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   116
                       ? new VarHandleShorts.FieldStaticReadOnly(base, foffset)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   117
                       : new VarHandleShorts.FieldStaticReadWrite(base, foffset);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   118
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   119
            else if (type == char.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   120
                return f.isFinal() && !isWriteAllowedOnFinalFields
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   121
                       ? new VarHandleChars.FieldStaticReadOnly(base, foffset)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   122
                       : new VarHandleChars.FieldStaticReadWrite(base, foffset);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   123
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   124
            else if (type == int.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   125
                return f.isFinal() && !isWriteAllowedOnFinalFields
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   126
                       ? new VarHandleInts.FieldStaticReadOnly(base, foffset)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   127
                       : new VarHandleInts.FieldStaticReadWrite(base, foffset);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   128
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   129
            else if (type == long.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   130
                return f.isFinal() && !isWriteAllowedOnFinalFields
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   131
                       ? new VarHandleLongs.FieldStaticReadOnly(base, foffset)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   132
                       : new VarHandleLongs.FieldStaticReadWrite(base, foffset);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   133
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   134
            else if (type == float.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   135
                return f.isFinal() && !isWriteAllowedOnFinalFields
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   136
                       ? new VarHandleFloats.FieldStaticReadOnly(base, foffset)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   137
                       : new VarHandleFloats.FieldStaticReadWrite(base, foffset);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   138
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   139
            else if (type == double.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   140
                return f.isFinal() && !isWriteAllowedOnFinalFields
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   141
                       ? new VarHandleDoubles.FieldStaticReadOnly(base, foffset)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   142
                       : new VarHandleDoubles.FieldStaticReadWrite(base, foffset);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   143
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   144
            else {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   145
                throw new UnsupportedOperationException();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   146
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   147
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   148
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   149
52914
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   150
    // Required by instance field handles
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   151
    static Field getFieldFromReceiverAndOffset(Class<?> receiverType,
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   152
                                               long offset,
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   153
                                               Class<?> fieldType) {
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   154
        for (Field f : receiverType.getDeclaredFields()) {
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   155
            if (Modifier.isStatic(f.getModifiers())) continue;
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   156
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   157
            if (offset == UNSAFE.objectFieldOffset(f)) {
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   158
                assert f.getType() == fieldType;
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   159
                return f;
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   160
            }
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   161
        }
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   162
        throw new InternalError("Field not found at offset");
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   163
    }
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   164
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   165
    // Required by instance static field handles
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   166
    static Field getStaticFieldFromBaseAndOffset(Object base,
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   167
                                                 long offset,
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   168
                                                 Class<?> fieldType) {
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   169
        // @@@ This is a little fragile assuming the base is the class
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   170
        Class<?> receiverType = (Class<?>) base;
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   171
        for (Field f : receiverType.getDeclaredFields()) {
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   172
            if (!Modifier.isStatic(f.getModifiers())) continue;
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   173
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   174
            if (offset == UNSAFE.staticFieldOffset(f)) {
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   175
                assert f.getType() == fieldType;
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   176
                return f;
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   177
            }
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   178
        }
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   179
        throw new InternalError("Static field not found at offset");
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   180
    }
4fa75d8ad418 8210031: implementation for JVM Constants API
vromero
parents: 52220
diff changeset
   181
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   182
    static VarHandle makeArrayElementHandle(Class<?> arrayClass) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   183
        if (!arrayClass.isArray())
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   184
            throw new IllegalArgumentException("not an array: " + arrayClass);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   185
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   186
        Class<?> componentType = arrayClass.getComponentType();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   187
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   188
        int aoffset = UNSAFE.arrayBaseOffset(arrayClass);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   189
        int ascale = UNSAFE.arrayIndexScale(arrayClass);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   190
        int ashift = 31 - Integer.numberOfLeadingZeros(ascale);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   191
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   192
        if (!componentType.isPrimitive()) {
52220
9c260a6b6471 8207146: Rename jdk.internal.misc.Unsafe::xxxObject to xxxReference
mchung
parents: 47859
diff changeset
   193
            return new VarHandleReferences.Array(aoffset, ashift, arrayClass);
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   194
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   195
        else if (componentType == boolean.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   196
            return new VarHandleBooleans.Array(aoffset, ashift);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   197
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   198
        else if (componentType == byte.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   199
            return new VarHandleBytes.Array(aoffset, ashift);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   200
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   201
        else if (componentType == short.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   202
            return new VarHandleShorts.Array(aoffset, ashift);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   203
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   204
        else if (componentType == char.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   205
            return new VarHandleChars.Array(aoffset, ashift);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   206
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   207
        else if (componentType == int.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   208
            return new VarHandleInts.Array(aoffset, ashift);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   209
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   210
        else if (componentType == long.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   211
            return new VarHandleLongs.Array(aoffset, ashift);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   212
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   213
        else if (componentType == float.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   214
            return new VarHandleFloats.Array(aoffset, ashift);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   215
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   216
        else if (componentType == double.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   217
            return new VarHandleDoubles.Array(aoffset, ashift);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   218
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   219
        else {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   220
            throw new UnsupportedOperationException();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   221
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   222
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   223
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   224
    static VarHandle byteArrayViewHandle(Class<?> viewArrayClass,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   225
                                         boolean be) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   226
        if (!viewArrayClass.isArray())
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   227
            throw new IllegalArgumentException("not an array: " + viewArrayClass);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   228
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   229
        Class<?> viewComponentType = viewArrayClass.getComponentType();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   230
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   231
        if (viewComponentType == long.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   232
            return new VarHandleByteArrayAsLongs.ArrayHandle(be);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   233
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   234
        else if (viewComponentType == int.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   235
            return new VarHandleByteArrayAsInts.ArrayHandle(be);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   236
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   237
        else if (viewComponentType == short.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   238
            return new VarHandleByteArrayAsShorts.ArrayHandle(be);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   239
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   240
        else if (viewComponentType == char.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   241
            return new VarHandleByteArrayAsChars.ArrayHandle(be);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   242
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   243
        else if (viewComponentType == double.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   244
            return new VarHandleByteArrayAsDoubles.ArrayHandle(be);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   245
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   246
        else if (viewComponentType == float.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   247
            return new VarHandleByteArrayAsFloats.ArrayHandle(be);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   248
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   249
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   250
        throw new UnsupportedOperationException();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   251
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   252
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   253
    static VarHandle makeByteBufferViewHandle(Class<?> viewArrayClass,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   254
                                              boolean be) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   255
        if (!viewArrayClass.isArray())
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   256
            throw new IllegalArgumentException("not an array: " + viewArrayClass);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   257
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   258
        Class<?> viewComponentType = viewArrayClass.getComponentType();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   259
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   260
        if (viewComponentType == long.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   261
            return new VarHandleByteArrayAsLongs.ByteBufferHandle(be);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   262
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   263
        else if (viewComponentType == int.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   264
            return new VarHandleByteArrayAsInts.ByteBufferHandle(be);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   265
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   266
        else if (viewComponentType == short.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   267
            return new VarHandleByteArrayAsShorts.ByteBufferHandle(be);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   268
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   269
        else if (viewComponentType == char.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   270
            return new VarHandleByteArrayAsChars.ByteBufferHandle(be);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   271
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   272
        else if (viewComponentType == double.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   273
            return new VarHandleByteArrayAsDoubles.ByteBufferHandle(be);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   274
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   275
        else if (viewComponentType == float.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   276
            return new VarHandleByteArrayAsFloats.ByteBufferHandle(be);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   277
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   278
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   279
        throw new UnsupportedOperationException();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   280
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   281
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   282
//    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   283
//     * A helper program to generate the VarHandleGuards class with a set of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   284
//     * static guard methods each of which corresponds to a particular shape and
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   285
//     * performs a type check of the symbolic type descriptor with the VarHandle
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   286
//     * type descriptor before linking/invoking to the underlying operation as
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   287
//     * characterized by the operation member name on the VarForm of the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   288
//     * VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   289
//     * <p>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   290
//     * The generated class essentially encapsulates pre-compiled LambdaForms,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   291
//     * one for each method, for the most set of common method signatures.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   292
//     * This reduces static initialization costs, footprint costs, and circular
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   293
//     * dependencies that may arise if a class is generated per LambdaForm.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   294
//     * <p>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   295
//     * A maximum of L*T*S methods will be generated where L is the number of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   296
//     * access modes kinds (or unique operation signatures) and T is the number
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   297
//     * of variable types and S is the number of shapes (such as instance field,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   298
//     * static field, or array access).
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   299
//     * If there are 4 unique operation signatures, 5 basic types (Object, int,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   300
//     * long, float, double), and 3 shapes then a maximum of 60 methods will be
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   301
//     * generated.  However, the number is likely to be less since there
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   302
//     * be duplicate signatures.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   303
//     * <p>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   304
//     * Each method is annotated with @LambdaForm.Compiled to inform the runtime
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   305
//     * that such methods should be treated as if a method of a class that is the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   306
//     * result of compiling a LambdaForm.  Annotation of such methods is
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   307
//     * important for correct evaluation of certain assertions and method return
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   308
//     * type profiling in HotSpot.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   309
//     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   310
//    public static class GuardMethodGenerator {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   311
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   312
//        static final String GUARD_METHOD_SIG_TEMPLATE = "<RETURN> <NAME>_<SIGNATURE>(<PARAMS>)";
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   313
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   314
//        static final String GUARD_METHOD_TEMPLATE =
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   315
//                "@ForceInline\n" +
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   316
//                "@LambdaForm.Compiled\n" +
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   317
//                "final static <METHOD> throws Throwable {\n" +
37792
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   318
//                "    if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodType) {\n" +
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   319
//                "        <RESULT_ERASED>MethodHandle.linkToStatic(<LINK_TO_STATIC_ARGS>);<RETURN_ERASED>\n" +
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   320
//                "    }\n" +
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   321
//                "    else {\n" +
37792
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   322
//                "        MethodHandle mh = handle.getMethodHandle(ad.mode);\n" +
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   323
//                "        <RETURN>mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(<LINK_TO_INVOKER_ARGS>);\n" +
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   324
//                "    }\n" +
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   325
//                "}";
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   326
//
37792
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   327
//        static final String GUARD_METHOD_TEMPLATE_V =
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   328
//                "@ForceInline\n" +
37792
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   329
//                "@LambdaForm.Compiled\n" +
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   330
//                "final static <METHOD> throws Throwable {\n" +
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   331
//                "    if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodType) {\n" +
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   332
//                "        MethodHandle.linkToStatic(<LINK_TO_STATIC_ARGS>);\n" +
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   333
//                "    }\n" +
37792
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   334
//                "    else if (handle.vform.getMethodType_V(ad.type) == ad.symbolicMethodType) {\n" +
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   335
//                "        MethodHandle.linkToStatic(<LINK_TO_STATIC_ARGS>);\n" +
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   336
//                "    }\n" +
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   337
//                "    else {\n" +
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   338
//                "        MethodHandle mh = handle.getMethodHandle(ad.mode);\n" +
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   339
//                "        mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(<LINK_TO_INVOKER_ARGS>);\n" +
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   340
//                "    }\n" +
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   341
//                "}";
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   342
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   343
//        // A template for deriving the operations
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   344
//        // could be supported by annotating VarHandle directly with the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   345
//        // operation kind and shape
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   346
//        interface VarHandleTemplate {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   347
//            Object get();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   348
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   349
//            void set(Object value);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   350
//
47859
065700a01c96 8180437: Remaining renames of CAS misnomer "swap" => "set"
psandoz
parents: 47216
diff changeset
   351
//            boolean compareAndSet(Object actualValue, Object expectedValue);
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   352
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   353
//            Object compareAndExchange(Object actualValue, Object expectedValue);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   354
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   355
//            Object getAndUpdate(Object value);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   356
//        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   357
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   358
//        static class HandleType {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   359
//            final Class<?> receiver;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   360
//            final Class<?>[] intermediates;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   361
//            final Class<?> value;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   362
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   363
//            HandleType(Class<?> receiver, Class<?> value, Class<?>... intermediates) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   364
//                this.receiver = receiver;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   365
//                this.intermediates = intermediates;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   366
//                this.value = value;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   367
//            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   368
//        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   369
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   370
//        /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   371
//         * @param args parameters
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   372
//         */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   373
//        public static void main(String[] args) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   374
//            System.out.println("package java.lang.invoke;");
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   375
//            System.out.println();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   376
//            System.out.println("import jdk.internal.vm.annotation.ForceInline;");
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   377
//            System.out.println();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   378
//            System.out.println("// This class is auto-generated by " +
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   379
//                               GuardMethodGenerator.class.getName() +
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   380
//                               ". Do not edit.");
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   381
//            System.out.println("final class VarHandleGuards {");
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   382
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   383
//            System.out.println();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   384
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   385
//            // Declare the stream of shapes
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   386
//            Stream<HandleType> hts = Stream.of(
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   387
//                    // Object->Object
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   388
//                    new HandleType(Object.class, Object.class),
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   389
//                    // Object->int
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   390
//                    new HandleType(Object.class, int.class),
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   391
//                    // Object->long
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   392
//                    new HandleType(Object.class, long.class),
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   393
//                    // Object->float
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   394
//                    new HandleType(Object.class, float.class),
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   395
//                    // Object->double
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   396
//                    new HandleType(Object.class, double.class),
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   397
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   398
//                    // <static>->Object
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   399
//                    new HandleType(null, Object.class),
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   400
//                    // <static>->int
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   401
//                    new HandleType(null, int.class),
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   402
//                    // <static>->long
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   403
//                    new HandleType(null, long.class),
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   404
//                    // <static>->float
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   405
//                    new HandleType(null, float.class),
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   406
//                    // <static>->double
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   407
//                    new HandleType(null, double.class),
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   408
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   409
//                    // Array[int]->Object
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   410
//                    new HandleType(Object.class, Object.class, int.class),
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   411
//                    // Array[int]->int
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   412
//                    new HandleType(Object.class, int.class, int.class),
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   413
//                    // Array[int]->long
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   414
//                    new HandleType(Object.class, long.class, int.class),
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   415
//                    // Array[int]->float
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   416
//                    new HandleType(Object.class, float.class, int.class),
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   417
//                    // Array[int]->double
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   418
//                    new HandleType(Object.class, double.class, int.class),
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   419
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   420
//                    // Array[long]->int
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   421
//                    new HandleType(Object.class, int.class, long.class),
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   422
//                    // Array[long]->long
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   423
//                    new HandleType(Object.class, long.class, long.class)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   424
//            );
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   425
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   426
//            hts.flatMap(ht -> Stream.of(VarHandleTemplate.class.getMethods()).
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   427
//                    map(m -> generateMethodType(m, ht.receiver, ht.value, ht.intermediates))).
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   428
//                    distinct().
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   429
//                    map(mt -> generateMethod(mt)).
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   430
//                    forEach(s -> {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   431
//                        System.out.println(s);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   432
//                        System.out.println();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   433
//                    });
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   434
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   435
//            System.out.println("}");
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   436
//        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   437
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   438
//        static MethodType generateMethodType(Method m, Class<?> receiver, Class<?> value, Class<?>... intermediates) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   439
//            Class<?> returnType = m.getReturnType() == Object.class
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   440
//                                  ? value : m.getReturnType();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   441
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   442
//            List<Class<?>> params = new ArrayList<>();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   443
//            if (receiver != null)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   444
//                params.add(receiver);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   445
//            for (int i = 0; i < intermediates.length; i++) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   446
//                params.add(intermediates[i]);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   447
//            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   448
//            for (Parameter p : m.getParameters()) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   449
//                params.add(value);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   450
//            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   451
//            return MethodType.methodType(returnType, params);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   452
//        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   453
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   454
//        static String generateMethod(MethodType mt) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   455
//            Class<?> returnType = mt.returnType();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   456
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   457
//            LinkedHashMap<String, Class<?>> params = new LinkedHashMap<>();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   458
//            params.put("handle", VarHandle.class);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   459
//            for (int i = 0; i < mt.parameterCount(); i++) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   460
//                params.put("arg" + i, mt.parameterType(i));
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   461
//            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   462
//            params.put("ad", VarHandle.AccessDescriptor.class);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   463
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   464
//            // Generate method signature line
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   465
//            String RETURN = className(returnType);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   466
//            String NAME = "guard";
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   467
//            String SIGNATURE = getSignature(mt);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   468
//            String PARAMS = params.entrySet().stream().
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   469
//                    map(e -> className(e.getValue()) + " " + e.getKey()).
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   470
//                    collect(joining(", "));
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   471
//            String METHOD = GUARD_METHOD_SIG_TEMPLATE.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   472
//                    replace("<RETURN>", RETURN).
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   473
//                    replace("<NAME>", NAME).
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   474
//                    replace("<SIGNATURE>", SIGNATURE).
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   475
//                    replace("<PARAMS>", PARAMS);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   476
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   477
//            // Generate method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   478
//            params.remove("ad");
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   479
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   480
//            List<String> LINK_TO_STATIC_ARGS = params.keySet().stream().
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   481
//                    collect(toList());
37792
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   482
//            LINK_TO_STATIC_ARGS.add("handle.vform.getMemberName(ad.mode)");
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   483
//            List<String> LINK_TO_STATIC_ARGS_V = params.keySet().stream().
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   484
//                    collect(toList());
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   485
//            LINK_TO_STATIC_ARGS_V.add("handle.vform.getMemberName_V(ad.mode)");
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   486
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   487
//            List<String> LINK_TO_INVOKER_ARGS = params.keySet().stream().
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   488
//                    collect(toList());
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   489
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   490
//            RETURN = returnType == void.class
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   491
//                     ? ""
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   492
//                     : returnType == Object.class
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   493
//                       ? "return "
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   494
//                       : "return (" + returnType.getName() + ") ";
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   495
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   496
//            String RESULT_ERASED = returnType == void.class
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   497
//                                   ? ""
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   498
//                                   : returnType != Object.class
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   499
//                                     ? "return (" + returnType.getName() + ") "
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   500
//                                     : "Object r = ";
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   501
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   502
//            String RETURN_ERASED = returnType != Object.class
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   503
//                                   ? ""
37792
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   504
//                                   : " return ad.returnType.cast(r);";
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   505
//
37792
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   506
//            String template = returnType == void.class
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   507
//                              ? GUARD_METHOD_TEMPLATE_V
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   508
//                              : GUARD_METHOD_TEMPLATE;
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   509
//            return template.
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   510
//                    replace("<METHOD>", METHOD).
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   511
//                    replace("<NAME>", NAME).
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   512
//                    replaceAll("<RETURN>", RETURN).
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   513
//                    replace("<RESULT_ERASED>", RESULT_ERASED).
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   514
//                    replace("<RETURN_ERASED>", RETURN_ERASED).
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   515
//                    replaceAll("<LINK_TO_STATIC_ARGS>", LINK_TO_STATIC_ARGS.stream().
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   516
//                            collect(joining(", "))).
37792
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   517
//                    replaceAll("<LINK_TO_STATIC_ARGS_V>", LINK_TO_STATIC_ARGS_V.stream().
dd626e6f5967 8155258: VarHandle implementation improvements
psandoz
parents: 36934
diff changeset
   518
//                            collect(joining(", "))).
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   519
//                    replace("<LINK_TO_INVOKER_ARGS>", LINK_TO_INVOKER_ARGS.stream().
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   520
//                            collect(joining(", ")))
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   521
//                    ;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   522
//        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   523
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   524
//        static String className(Class<?> c) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   525
//            String n = c.getName();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   526
//            if (n.startsWith("java.lang.")) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   527
//                n = n.replace("java.lang.", "");
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   528
//                if (n.startsWith("invoke.")) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   529
//                    n = n.replace("invoke.", "");
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   530
//                }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   531
//            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   532
//            return n.replace('$', '.');
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   533
//        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   534
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   535
//        static String getSignature(MethodType m) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   536
//            StringBuilder sb = new StringBuilder(m.parameterCount() + 1);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   537
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   538
//            for (int i = 0; i < m.parameterCount(); i++) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   539
//                Class<?> pt = m.parameterType(i);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   540
//                sb.append(getCharType(pt));
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   541
//            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   542
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   543
//            sb.append('_').append(getCharType(m.returnType()));
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   544
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   545
//            return sb.toString();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   546
//        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   547
//
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   548
//        static char getCharType(Class<?> pt) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   549
//            if (pt == void.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   550
//                return 'V';
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   551
//            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   552
//            else if (!pt.isPrimitive()) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   553
//                return 'L';
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   554
//            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   555
//            else if (pt == boolean.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   556
//                return 'Z';
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   557
//            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   558
//            else if (pt == int.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   559
//                return 'I';
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   560
//            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   561
//            else if (pt == long.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   562
//                return 'J';
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   563
//            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   564
//            else if (pt == float.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   565
//                return 'F';
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   566
//            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   567
//            else if (pt == double.class) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   568
//                return 'D';
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   569
//            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   570
//            else {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   571
//                throw new IllegalStateException(pt.getName());
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   572
//            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   573
//        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   574
//    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   575
}