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