rev 9803 : 8146401: Clean up oop.hpp: add inline directives and fix header files
1 /*
2 * Copyright (c) 2011, 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.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 #ifndef SHARE_VM_JVMCI_JVMCIJAVACLASSES_HPP
25 #define SHARE_VM_JVMCI_JVMCIJAVACLASSES_HPP
26
27 #include "classfile/systemDictionary.hpp"
28 #include "oops/instanceMirrorKlass.hpp"
29
30 class JVMCIJavaClasses : AllStatic {
31 public:
32 static void compute_offsets(TRAPS);
33 };
34
35 /* This macro defines the structure of the CompilationResult - classes.
36 * It will generate classes with accessors similar to javaClasses.hpp, but with specializations for oops, Handles and jni handles.
37 *
38 * The public interface of these classes will look like this:
39
40 * class StackSlot : AllStatic {
41 * public:
42 * static Klass* klass();
43 * static jint index(oop obj);
44 * static jint index(Handle obj);
45 * static jint index(jobject obj);
46 * static void set_index(oop obj, jint x);
47 * static void set_index(Handle obj, jint x);
48 * static void set_index(jobject obj, jint x);
49 * };
50 *
51 */
52
53 #define COMPILER_CLASSES_DO(start_class, end_class, char_field, int_field, boolean_field, long_field, float_field, oop_field, typeArrayOop_field, objArrayOop_field, static_oop_field, static_objArrayOop_field, static_int_field, static_boolean_field) \
54 start_class(Architecture) \
55 oop_field(Architecture, wordKind, "Ljdk/vm/ci/meta/PlatformKind;") \
56 end_class \
57 start_class(TargetDescription) \
58 oop_field(TargetDescription, arch, "Ljdk/vm/ci/code/Architecture;") \
59 end_class \
60 start_class(HotSpotResolvedObjectTypeImpl) \
61 oop_field(HotSpotResolvedObjectTypeImpl, javaClass, "Ljava/lang/Class;") \
62 end_class \
63 start_class(HotSpotResolvedJavaMethodImpl) \
64 long_field(HotSpotResolvedJavaMethodImpl, metaspaceMethod) \
65 end_class \
66 start_class(InstalledCode) \
67 long_field(InstalledCode, address) \
68 long_field(InstalledCode, entryPoint) \
69 long_field(InstalledCode, version) \
70 oop_field(InstalledCode, name, "Ljava/lang/String;") \
71 end_class \
72 start_class(HotSpotInstalledCode) \
73 int_field(HotSpotInstalledCode, size) \
74 long_field(HotSpotInstalledCode, codeStart) \
75 int_field(HotSpotInstalledCode, codeSize) \
76 end_class \
77 start_class(HotSpotNmethod) \
78 boolean_field(HotSpotNmethod, isDefault) \
79 end_class \
80 start_class(HotSpotCompiledCode) \
81 oop_field(HotSpotCompiledCode, name, "Ljava/lang/String;") \
82 objArrayOop_field(HotSpotCompiledCode, sites, "[Ljdk/vm/ci/code/CompilationResult$Site;") \
83 objArrayOop_field(HotSpotCompiledCode, exceptionHandlers, "[Ljdk/vm/ci/code/CompilationResult$ExceptionHandler;") \
84 objArrayOop_field(HotSpotCompiledCode, comments, "[Ljdk/vm/ci/hotspot/HotSpotCompiledCode$Comment;") \
85 objArrayOop_field(HotSpotCompiledCode, assumptions, "[Ljdk/vm/ci/meta/Assumptions$Assumption;") \
86 typeArrayOop_field(HotSpotCompiledCode, targetCode, "[B") \
87 int_field(HotSpotCompiledCode, targetCodeSize) \
88 typeArrayOop_field(HotSpotCompiledCode, dataSection, "[B") \
89 int_field(HotSpotCompiledCode, dataSectionAlignment) \
90 objArrayOop_field(HotSpotCompiledCode, dataSectionPatches, "[Ljdk/vm/ci/code/CompilationResult$DataPatch;") \
91 boolean_field(HotSpotCompiledCode, isImmutablePIC) \
92 int_field(HotSpotCompiledCode, totalFrameSize) \
93 int_field(HotSpotCompiledCode, customStackAreaOffset) \
94 objArrayOop_field(HotSpotCompiledCode, methods, "[Ljdk/vm/ci/meta/ResolvedJavaMethod;") \
95 end_class \
96 start_class(HotSpotCompiledCode_Comment) \
97 oop_field(HotSpotCompiledCode_Comment, text, "Ljava/lang/String;") \
98 int_field(HotSpotCompiledCode_Comment, pcOffset) \
99 end_class \
100 start_class(HotSpotCompiledNmethod) \
101 oop_field(HotSpotCompiledNmethod, method, "Ljdk/vm/ci/hotspot/HotSpotResolvedJavaMethod;") \
102 oop_field(HotSpotCompiledNmethod, installationFailureMessage, "Ljava/lang/String;") \
103 int_field(HotSpotCompiledNmethod, entryBCI) \
104 int_field(HotSpotCompiledNmethod, id) \
105 long_field(HotSpotCompiledNmethod, jvmciEnv) \
106 boolean_field(HotSpotCompiledNmethod, hasUnsafeAccess) \
107 end_class \
108 start_class(HotSpotJVMCIMetaAccessContext) \
109 static_objArrayOop_field(HotSpotJVMCIMetaAccessContext, allContexts, "[Ljava/lang/ref/WeakReference;") \
110 objArrayOop_field(HotSpotJVMCIMetaAccessContext, metadataRoots, "[Ljava/lang/Object;") \
111 end_class \
112 start_class(HotSpotForeignCallTarget) \
113 long_field(HotSpotForeignCallTarget, address) \
114 end_class \
115 start_class(Assumptions_NoFinalizableSubclass) \
116 oop_field(Assumptions_NoFinalizableSubclass, receiverType, "Ljdk/vm/ci/meta/ResolvedJavaType;") \
117 end_class \
118 start_class(Assumptions_ConcreteSubtype) \
119 oop_field(Assumptions_ConcreteSubtype, context, "Ljdk/vm/ci/meta/ResolvedJavaType;") \
120 oop_field(Assumptions_ConcreteSubtype, subtype, "Ljdk/vm/ci/meta/ResolvedJavaType;") \
121 end_class \
122 start_class(Assumptions_LeafType) \
123 oop_field(Assumptions_LeafType, context, "Ljdk/vm/ci/meta/ResolvedJavaType;") \
124 end_class \
125 start_class(Assumptions_ConcreteMethod) \
126 oop_field(Assumptions_ConcreteMethod, method, "Ljdk/vm/ci/meta/ResolvedJavaMethod;") \
127 oop_field(Assumptions_ConcreteMethod, context, "Ljdk/vm/ci/meta/ResolvedJavaType;") \
128 oop_field(Assumptions_ConcreteMethod, impl, "Ljdk/vm/ci/meta/ResolvedJavaMethod;") \
129 end_class \
130 start_class(Assumptions_CallSiteTargetValue) \
131 oop_field(Assumptions_CallSiteTargetValue, callSite, "Ljava/lang/invoke/CallSite;") \
132 oop_field(Assumptions_CallSiteTargetValue, methodHandle, "Ljava/lang/invoke/MethodHandle;") \
133 end_class \
134 start_class(CompilationResult_Site) \
135 int_field(CompilationResult_Site, pcOffset) \
136 end_class \
137 start_class(CompilationResult_Call) \
138 oop_field(CompilationResult_Call, target, "Ljdk/vm/ci/meta/InvokeTarget;") \
139 oop_field(CompilationResult_Call, debugInfo, "Ljdk/vm/ci/code/DebugInfo;") \
140 end_class \
141 start_class(CompilationResult_DataPatch) \
142 oop_field(CompilationResult_DataPatch, reference, "Ljdk/vm/ci/code/CompilationResult$Reference;") \
143 end_class \
144 start_class(CompilationResult_ConstantReference) \
145 oop_field(CompilationResult_ConstantReference, constant, "Ljdk/vm/ci/meta/VMConstant;") \
146 end_class \
147 start_class(CompilationResult_DataSectionReference) \
148 int_field(CompilationResult_DataSectionReference, offset) \
149 end_class \
150 start_class(InfopointReason) \
151 static_oop_field(InfopointReason, SAFEPOINT, "Ljdk/vm/ci/code/InfopointReason;") \
152 static_oop_field(InfopointReason, CALL, "Ljdk/vm/ci/code/InfopointReason;") \
153 static_oop_field(InfopointReason, IMPLICIT_EXCEPTION, "Ljdk/vm/ci/code/InfopointReason;") \
154 end_class \
155 start_class(CompilationResult_Infopoint) \
156 oop_field(CompilationResult_Infopoint, debugInfo, "Ljdk/vm/ci/code/DebugInfo;") \
157 oop_field(CompilationResult_Infopoint, reason, "Ljdk/vm/ci/code/InfopointReason;") \
158 end_class \
159 start_class(CompilationResult_ExceptionHandler) \
160 int_field(CompilationResult_ExceptionHandler, handlerPos) \
161 end_class \
162 start_class(CompilationResult_Mark) \
163 oop_field(CompilationResult_Mark, id, "Ljava/lang/Object;") \
164 end_class \
165 start_class(DebugInfo) \
166 oop_field(DebugInfo, bytecodePosition, "Ljdk/vm/ci/code/BytecodePosition;") \
167 oop_field(DebugInfo, referenceMap, "Ljdk/vm/ci/code/ReferenceMap;") \
168 oop_field(DebugInfo, calleeSaveInfo, "Ljdk/vm/ci/code/RegisterSaveLayout;") \
169 objArrayOop_field(DebugInfo, virtualObjectMapping, "[Ljdk/vm/ci/code/VirtualObject;") \
170 end_class \
171 start_class(HotSpotReferenceMap) \
172 objArrayOop_field(HotSpotReferenceMap, objects, "[Ljdk/vm/ci/code/Location;") \
173 objArrayOop_field(HotSpotReferenceMap, derivedBase, "[Ljdk/vm/ci/code/Location;") \
174 typeArrayOop_field(HotSpotReferenceMap, sizeInBytes, "[I") \
175 int_field(HotSpotReferenceMap, maxRegisterSize) \
176 end_class \
177 start_class(RegisterSaveLayout) \
178 objArrayOop_field(RegisterSaveLayout, registers, "[Ljdk/vm/ci/code/Register;") \
179 typeArrayOop_field(RegisterSaveLayout, slots, "[I") \
180 end_class \
181 start_class(BytecodeFrame) \
182 objArrayOop_field(BytecodeFrame, values, "[Ljdk/vm/ci/meta/JavaValue;") \
183 objArrayOop_field(BytecodeFrame, slotKinds, "[Ljdk/vm/ci/meta/JavaKind;") \
184 int_field(BytecodeFrame, numLocals) \
185 int_field(BytecodeFrame, numStack) \
186 int_field(BytecodeFrame, numLocks) \
187 boolean_field(BytecodeFrame, rethrowException) \
188 boolean_field(BytecodeFrame, duringCall) \
189 static_int_field(BytecodeFrame, BEFORE_BCI) \
190 end_class \
191 start_class(BytecodePosition) \
192 oop_field(BytecodePosition, caller, "Ljdk/vm/ci/code/BytecodePosition;") \
193 oop_field(BytecodePosition, method, "Ljdk/vm/ci/meta/ResolvedJavaMethod;") \
194 int_field(BytecodePosition, bci) \
195 end_class \
196 start_class(JavaConstant) \
197 end_class \
198 start_class(PrimitiveConstant) \
199 oop_field(PrimitiveConstant, kind, "Ljdk/vm/ci/meta/JavaKind;") \
200 long_field(PrimitiveConstant, primitive) \
201 end_class \
202 start_class(RawConstant) \
203 long_field(RawConstant, primitive) \
204 end_class \
205 start_class(NullConstant) \
206 end_class \
207 start_class(HotSpotCompressedNullConstant) \
208 end_class \
209 start_class(HotSpotObjectConstantImpl) \
210 oop_field(HotSpotObjectConstantImpl, object, "Ljava/lang/Object;") \
211 boolean_field(HotSpotObjectConstantImpl, compressed) \
212 end_class \
213 start_class(HotSpotMetaspaceConstantImpl) \
214 oop_field(HotSpotMetaspaceConstantImpl, metaspaceObject, "Ljdk/vm/ci/hotspot/MetaspaceWrapperObject;") \
215 boolean_field(HotSpotMetaspaceConstantImpl, compressed) \
216 end_class \
217 start_class(HotSpotSentinelConstant) \
218 end_class \
219 start_class(JavaKind) \
220 char_field(JavaKind, typeChar) \
221 static_oop_field(JavaKind, Boolean, "Ljdk/vm/ci/meta/JavaKind;"); \
222 static_oop_field(JavaKind, Byte, "Ljdk/vm/ci/meta/JavaKind;"); \
223 static_oop_field(JavaKind, Char, "Ljdk/vm/ci/meta/JavaKind;"); \
224 static_oop_field(JavaKind, Short, "Ljdk/vm/ci/meta/JavaKind;"); \
225 static_oop_field(JavaKind, Int, "Ljdk/vm/ci/meta/JavaKind;"); \
226 static_oop_field(JavaKind, Long, "Ljdk/vm/ci/meta/JavaKind;"); \
227 end_class \
228 start_class(LIRKind) \
229 oop_field(LIRKind, platformKind, "Ljdk/vm/ci/meta/PlatformKind;") \
230 int_field(LIRKind, referenceMask) \
231 end_class \
232 start_class(Value) \
233 oop_field(Value, lirKind, "Ljdk/vm/ci/meta/LIRKind;") \
234 static_oop_field(Value, ILLEGAL, "Ljdk/vm/ci/meta/AllocatableValue;"); \
235 end_class \
236 start_class(RegisterValue) \
237 oop_field(RegisterValue, reg, "Ljdk/vm/ci/code/Register;") \
238 end_class \
239 start_class(code_Location) \
240 oop_field(code_Location, reg, "Ljdk/vm/ci/code/Register;") \
241 int_field(code_Location, offset) \
242 end_class \
243 start_class(code_Register) \
244 int_field(code_Register, number) \
245 int_field(code_Register, encoding) \
246 end_class \
247 start_class(StackSlot) \
248 int_field(StackSlot, offset) \
249 boolean_field(StackSlot, addFrameSize) \
250 end_class \
251 start_class(VirtualObject) \
252 int_field(VirtualObject, id) \
253 oop_field(VirtualObject, type, "Ljdk/vm/ci/meta/ResolvedJavaType;") \
254 objArrayOop_field(VirtualObject, values, "[Ljdk/vm/ci/meta/JavaValue;") \
255 objArrayOop_field(VirtualObject, slotKinds, "[Ljdk/vm/ci/meta/JavaKind;") \
256 end_class \
257 start_class(StackLockValue) \
258 oop_field(StackLockValue, owner, "Ljdk/vm/ci/meta/JavaValue;") \
259 oop_field(StackLockValue, slot, "Ljdk/vm/ci/meta/AllocatableValue;") \
260 boolean_field(StackLockValue, eliminated) \
261 end_class \
262 start_class(HotSpotSpeculationLog) \
263 oop_field(HotSpotSpeculationLog, lastFailed, "Ljava/lang/Object;") \
264 end_class \
265 start_class(HotSpotStackFrameReference) \
266 oop_field(HotSpotStackFrameReference, compilerToVM, "Ljdk/vm/ci/hotspot/CompilerToVM;") \
267 long_field(HotSpotStackFrameReference, stackPointer) \
268 int_field(HotSpotStackFrameReference, frameNumber) \
269 int_field(HotSpotStackFrameReference, bci) \
270 oop_field(HotSpotStackFrameReference, method, "Ljdk/vm/ci/hotspot/HotSpotResolvedJavaMethod;") \
271 objArrayOop_field(HotSpotStackFrameReference, locals, "[Ljava/lang/Object;") \
272 typeArrayOop_field(HotSpotStackFrameReference, localIsVirtual, "[Z") \
273 end_class \
274 start_class(HotSpotMetaData) \
275 typeArrayOop_field(HotSpotMetaData, pcDescBytes, "[B") \
276 typeArrayOop_field(HotSpotMetaData, scopesDescBytes, "[B") \
277 typeArrayOop_field(HotSpotMetaData, relocBytes, "[B") \
278 typeArrayOop_field(HotSpotMetaData, exceptionBytes, "[B") \
279 typeArrayOop_field(HotSpotMetaData, oopMaps, "[B") \
280 objArrayOop_field(HotSpotMetaData, metadata, "[Ljava/lang/String;") \
281 end_class \
282 start_class(HotSpotOopMap) \
283 int_field(HotSpotOopMap, offset) \
284 int_field(HotSpotOopMap, count) \
285 typeArrayOop_field(HotSpotOopMap, data, "[B") \
286 end_class \
287 start_class(HotSpotConstantPool) \
288 long_field(HotSpotConstantPool, metaspaceConstantPool) \
289 end_class \
290 start_class(HotSpotJVMCIRuntime) \
291 objArrayOop_field(HotSpotJVMCIRuntime, trivialPrefixes, "[Ljava/lang/String;") \
292 end_class \
293 /* end*/
294
295 #define START_CLASS(name) \
296 class name : AllStatic { \
297 private: \
298 friend class JVMCICompiler; \
299 static void check(oop obj, const char* field_name, int offset) { \
300 assert(obj != NULL, "NULL field access of %s.%s", #name, field_name); \
301 assert(obj->is_a(SystemDictionary::name##_klass()), "wrong class, " #name " expected, found %s", obj->klass()->external_name()); \
302 assert(offset != 0, "must be valid offset"); \
303 } \
304 static void compute_offsets(TRAPS); \
305 public: \
306 static InstanceKlass* klass() { return SystemDictionary::name##_klass(); }
307
308 #define END_CLASS };
309
310 #define FIELD(name, type, accessor, cast) \
311 static int _##name##_offset; \
312 static type name(oop obj) { check(obj, #name, _##name##_offset); return cast obj->accessor(_##name##_offset); } \
313 static type name(Handle obj) { check(obj(), #name, _##name##_offset); return cast obj->accessor(_##name##_offset); } \
314 static type name(jobject obj) { check(JNIHandles::resolve(obj), #name, _##name##_offset); return cast JNIHandles::resolve(obj)->accessor(_##name##_offset); } \
315 static void set_##name(oop obj, type x) { check(obj, #name, _##name##_offset); obj->accessor##_put(_##name##_offset, x); } \
316 static void set_##name(Handle obj, type x) { check(obj(), #name, _##name##_offset); obj->accessor##_put(_##name##_offset, x); } \
317 static void set_##name(jobject obj, type x) { check(JNIHandles::resolve(obj), #name, _##name##_offset); JNIHandles::resolve(obj)->accessor##_put(_##name##_offset, x); }
318
319 #define EMPTY_CAST
320 #define CHAR_FIELD(klass, name) FIELD(name, jchar, char_field, EMPTY_CAST)
321 #define INT_FIELD(klass, name) FIELD(name, jint, int_field, EMPTY_CAST)
322 #define BOOLEAN_FIELD(klass, name) FIELD(name, jboolean, bool_field, EMPTY_CAST)
323 #define LONG_FIELD(klass, name) FIELD(name, jlong, long_field, EMPTY_CAST)
324 #define FLOAT_FIELD(klass, name) FIELD(name, jfloat, float_field, EMPTY_CAST)
325 #define OOP_FIELD(klass, name, signature) FIELD(name, oop, obj_field, EMPTY_CAST)
326 #define OBJARRAYOOP_FIELD(klass, name, signature) FIELD(name, objArrayOop, obj_field, (objArrayOop))
327 #define TYPEARRAYOOP_FIELD(klass, name, signature) FIELD(name, typeArrayOop, obj_field, (typeArrayOop))
328 #define STATIC_OOP_FIELD(klassName, name, signature) STATIC_OOPISH_FIELD(klassName, name, oop, signature)
329 #define STATIC_OBJARRAYOOP_FIELD(klassName, name, signature) STATIC_OOPISH_FIELD(klassName, name, objArrayOop, signature)
330 #define STATIC_OOPISH_FIELD(klassName, name, type, signature) \
331 static int _##name##_offset; \
332 static type name() { \
333 assert(klassName::klass() != NULL && klassName::klass()->is_linked(), "Class not yet linked: " #klassName); \
334 InstanceKlass* ik = klassName::klass(); \
335 address addr = ik->static_field_addr(_##name##_offset - InstanceMirrorKlass::offset_of_static_fields()); \
336 if (UseCompressedOops) { \
337 return (type) oopDesc::load_decode_heap_oop((narrowOop *)addr); \
338 } else { \
339 return (type) oopDesc::load_decode_heap_oop((oop*)addr); \
340 } \
341 } \
342 static void set_##name(type x) { \
343 assert(klassName::klass() != NULL && klassName::klass()->is_linked(), "Class not yet linked: " #klassName); \
344 assert(klassName::klass() != NULL, "Class not yet loaded: " #klassName); \
345 InstanceKlass* ik = klassName::klass(); \
346 address addr = ik->static_field_addr(_##name##_offset - InstanceMirrorKlass::offset_of_static_fields()); \
347 if (UseCompressedOops) { \
348 oop_store((narrowOop *)addr, x); \
349 } else { \
350 oop_store((oop*)addr, x); \
351 } \
352 }
353 #define STATIC_PRIMITIVE_FIELD(klassName, name, jtypename) \
354 static int _##name##_offset; \
355 static jtypename name() { \
356 assert(klassName::klass() != NULL && klassName::klass()->is_linked(), "Class not yet linked: " #klassName); \
357 InstanceKlass* ik = klassName::klass(); \
358 address addr = ik->static_field_addr(_##name##_offset - InstanceMirrorKlass::offset_of_static_fields()); \
359 return *((jtypename *)addr); \
360 } \
361 static void set_##name(jtypename x) { \
362 assert(klassName::klass() != NULL && klassName::klass()->is_linked(), "Class not yet linked: " #klassName); \
363 InstanceKlass* ik = klassName::klass(); \
364 address addr = ik->static_field_addr(_##name##_offset - InstanceMirrorKlass::offset_of_static_fields()); \
365 *((jtypename *)addr) = x; \
366 }
367
368 #define STATIC_INT_FIELD(klassName, name) STATIC_PRIMITIVE_FIELD(klassName, name, jint)
369 #define STATIC_BOOLEAN_FIELD(klassName, name) STATIC_PRIMITIVE_FIELD(klassName, name, jboolean)
370
371 COMPILER_CLASSES_DO(START_CLASS, END_CLASS, CHAR_FIELD, INT_FIELD, BOOLEAN_FIELD, LONG_FIELD, FLOAT_FIELD, OOP_FIELD, TYPEARRAYOOP_FIELD, OBJARRAYOOP_FIELD, STATIC_OOP_FIELD, STATIC_OBJARRAYOOP_FIELD, STATIC_INT_FIELD, STATIC_BOOLEAN_FIELD)
372 #undef START_CLASS
373 #undef END_CLASS
374 #undef FIELD
375 #undef CHAR_FIELD
376 #undef INT_FIELD
377 #undef BOOLEAN_FIELD
378 #undef LONG_FIELD
379 #undef FLOAT_FIELD
380 #undef OOP_FIELD
381 #undef TYPEARRAYOOP_FIELD
382 #undef OBJARRAYOOP_FIELD
383 #undef STATIC_OOPISH_FIELD
384 #undef STATIC_OOP_FIELD
385 #undef STATIC_OBJARRAYOOP_FIELD
386 #undef STATIC_INT_FIELD
387 #undef STATIC_BOOLEAN_FIELD
388 #undef EMPTY_CAST
389
390 void compute_offset(int &dest_offset, Klass* klass, const char* name, const char* signature, bool static_field, TRAPS);
391
392 #endif // SHARE_VM_JVMCI_JVMCIJAVACLASSES_HPP
--- EOF ---