1 /*
2 * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
38 * @author jrose
39 */
40 class MethodHandleNatives {
41
42 private MethodHandleNatives() { } // static only
43
44 /// MemberName support
45
46 static native void init(MemberName self, Object ref);
47 static native void expand(MemberName self);
48 static native MemberName resolve(MemberName self, Class<?> caller) throws LinkageError;
49 static native int getMembers(Class<?> defc, String matchName, String matchSig,
50 int matchFlags, Class<?> caller, int skip, MemberName[] results);
51
52 /// Field layout queries parallel to sun.misc.Unsafe:
53 static native long objectFieldOffset(MemberName self); // e.g., returns vmindex
54 static native long staticFieldOffset(MemberName self); // e.g., returns vmindex
55 static native Object staticFieldBase(MemberName self); // e.g., returns clazz
56 static native Object getMemberVMInfo(MemberName self); // returns {vmindex,vmtarget}
57
58 /// MethodHandle support
59
60 /** Fetch MH-related JVM parameter.
61 * which=0 retrieves MethodHandlePushLimit
62 * which=1 retrieves stack slot push size (in address units)
63 */
64 static native int getConstant(int which);
65
66 static final boolean COUNT_GWT;
67
68 /// CallSite support
69
70 /** Tell the JVM that we need to change the target of a CallSite. */
71 static native void setCallSiteTargetNormal(CallSite site, MethodHandle target);
72 static native void setCallSiteTargetVolatile(CallSite site, MethodHandle target);
73
74 private static native void registerNatives();
75 static {
76 registerNatives();
77 COUNT_GWT = getConstant(Constants.GC_COUNT_GWT) != 0;
78
79 // The JVM calls MethodHandleNatives.<clinit>. Cascade the <clinit> calls as needed:
80 MethodHandleImpl.initStatics();
81 }
82
83 // All compile-time constants go here.
84 // There is an opportunity to check them against the JVM's idea of them.
85 static class Constants {
86 Constants() { } // static only
87 // MethodHandleImpl
88 static final int // for getConstant
89 GC_COUNT_GWT = 4,
90 GC_LAMBDA_SUPPORT = 5;
91
92 // MemberName
93 // The JVM uses values of -2 and above for vtable indexes.
94 // Field values are simple positive offsets.
95 // Ref: src/share/vm/oops/methodOop.hpp
96 // This value is negative enough to avoid such numbers,
97 // but not too negative.
98 static final int
99 MN_IS_METHOD = 0x00010000, // method (not constructor)
100 MN_IS_CONSTRUCTOR = 0x00020000, // constructor
101 MN_IS_FIELD = 0x00040000, // field
102 MN_IS_TYPE = 0x00080000, // nested type
103 MN_CALLER_SENSITIVE = 0x00100000, // @CallerSensitive annotation detected
104 MN_REFERENCE_KIND_SHIFT = 24, // refKind
105 MN_REFERENCE_KIND_MASK = 0x0F000000 >> MN_REFERENCE_KIND_SHIFT,
106 // The SEARCH_* bits are not for MN.flags but for the matchFlags argument of MHN.getMembers:
107 MN_SEARCH_SUPERCLASSES = 0x00100000,
108 MN_SEARCH_INTERFACES = 0x00200000;
109
110 /**
111 * Basic types as encoded in the JVM. These code values are not
112 * intended for use outside this class. They are used as part of
113 * a private interface between the JVM and this class.
114 */
115 static final int
116 T_BOOLEAN = 4,
117 T_CHAR = 5,
118 T_FLOAT = 6,
119 T_DOUBLE = 7,
120 T_BYTE = 8,
121 T_SHORT = 9,
122 T_INT = 10,
123 T_LONG = 11,
124 T_OBJECT = 12,
125 //T_ARRAY = 13
126 T_VOID = 14,
127 //T_ADDRESS = 15
128 T_ILLEGAL = 99;
129
130 /**
131 * Constant pool entry types.
132 */
133 static final byte
134 CONSTANT_Utf8 = 1,
135 CONSTANT_Integer = 3,
136 CONSTANT_Float = 4,
137 CONSTANT_Long = 5,
138 CONSTANT_Double = 6,
139 CONSTANT_Class = 7,
140 CONSTANT_String = 8,
141 CONSTANT_Fieldref = 9,
142 CONSTANT_Methodref = 10,
143 CONSTANT_InterfaceMethodref = 11,
144 CONSTANT_NameAndType = 12,
145 CONSTANT_MethodHandle = 15, // JSR 292
146 CONSTANT_MethodType = 16, // JSR 292
147 CONSTANT_InvokeDynamic = 18,
148 CONSTANT_LIMIT = 19; // Limit to tags found in classfiles
149
150 /**
151 * Access modifier flags.
152 */
153 static final char
154 ACC_PUBLIC = 0x0001,
155 ACC_PRIVATE = 0x0002,
156 ACC_PROTECTED = 0x0004,
157 ACC_STATIC = 0x0008,
158 ACC_FINAL = 0x0010,
159 ACC_SYNCHRONIZED = 0x0020,
160 ACC_VOLATILE = 0x0040,
161 ACC_TRANSIENT = 0x0080,
162 ACC_NATIVE = 0x0100,
163 ACC_INTERFACE = 0x0200,
164 ACC_ABSTRACT = 0x0400,
165 ACC_STRICT = 0x0800,
166 ACC_SYNTHETIC = 0x1000,
167 ACC_ANNOTATION = 0x2000,
168 ACC_ENUM = 0x4000,
169 // aliases:
170 ACC_SUPER = ACC_SYNCHRONIZED,
171 ACC_BRIDGE = ACC_VOLATILE,
172 ACC_VARARGS = ACC_TRANSIENT;
173
174 /**
175 * Constant pool reference-kind codes, as used by CONSTANT_MethodHandle CP entries.
176 */
177 static final byte
178 REF_NONE = 0, // null value
179 REF_getField = 1,
180 REF_getStatic = 2,
181 REF_putField = 3,
182 REF_putStatic = 4,
183 REF_invokeVirtual = 5,
184 REF_invokeStatic = 6,
185 REF_invokeSpecial = 7,
186 REF_newInvokeSpecial = 8,
187 REF_invokeInterface = 9,
188 REF_LIMIT = 10;
189 }
190
191 static boolean refKindIsValid(int refKind) {
192 return (refKind > REF_NONE && refKind < REF_LIMIT);
|
1 /*
2 * Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
38 * @author jrose
39 */
40 class MethodHandleNatives {
41
42 private MethodHandleNatives() { } // static only
43
44 /// MemberName support
45
46 static native void init(MemberName self, Object ref);
47 static native void expand(MemberName self);
48 static native MemberName resolve(MemberName self, Class<?> caller) throws LinkageError;
49 static native int getMembers(Class<?> defc, String matchName, String matchSig,
50 int matchFlags, Class<?> caller, int skip, MemberName[] results);
51
52 /// Field layout queries parallel to sun.misc.Unsafe:
53 static native long objectFieldOffset(MemberName self); // e.g., returns vmindex
54 static native long staticFieldOffset(MemberName self); // e.g., returns vmindex
55 static native Object staticFieldBase(MemberName self); // e.g., returns clazz
56 static native Object getMemberVMInfo(MemberName self); // returns {vmindex,vmtarget}
57
58 /// CallSite support
59
60 /** Tell the JVM that we need to change the target of a CallSite. */
61 static native void setCallSiteTargetNormal(CallSite site, MethodHandle target);
62 static native void setCallSiteTargetVolatile(CallSite site, MethodHandle target);
63
64 private static native void registerNatives();
65 static {
66 registerNatives();
67
68 // The JVM calls MethodHandleNatives.<clinit>. Cascade the <clinit> calls as needed:
69 MethodHandleImpl.initStatics();
70 }
71
72 // All compile-time constants go here.
73 // There is an opportunity to check them against the JVM's idea of them.
74 static class Constants {
75 Constants() { } // static only
76
77 /**
78 * Constant pool reference-kind codes, as used by CONSTANT_MethodHandle CP entries.
79 */
80 static final byte
81 REF_NONE = 0, // null value
82 REF_getField = 1,
83 REF_getStatic = 2,
84 REF_putField = 3,
85 REF_putStatic = 4,
86 REF_invokeVirtual = 5,
87 REF_invokeStatic = 6,
88 REF_invokeSpecial = 7,
89 REF_newInvokeSpecial = 8,
90 REF_invokeInterface = 9,
91 REF_LIMIT = 10;
92 }
93
94 static boolean refKindIsValid(int refKind) {
95 return (refKind > REF_NONE && refKind < REF_LIMIT);
|