Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/hotspot/share/classfile/javaClasses.cpp
40949 views
1
/*
2
* Copyright (c) 1997, 2021, 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
25
#include "precompiled.hpp"
26
#include "jvm.h"
27
#include "cds/archiveBuilder.hpp"
28
#include "cds/heapShared.inline.hpp"
29
#include "cds/metaspaceShared.hpp"
30
#include "classfile/altHashing.hpp"
31
#include "classfile/classLoaderData.inline.hpp"
32
#include "classfile/javaClasses.inline.hpp"
33
#include "classfile/javaThreadStatus.hpp"
34
#include "classfile/moduleEntry.hpp"
35
#include "classfile/stringTable.hpp"
36
#include "classfile/symbolTable.hpp"
37
#include "classfile/systemDictionary.hpp"
38
#include "classfile/vmClasses.hpp"
39
#include "classfile/vmSymbols.hpp"
40
#include "code/debugInfo.hpp"
41
#include "code/dependencyContext.hpp"
42
#include "code/pcDesc.hpp"
43
#include "interpreter/interpreter.hpp"
44
#include "interpreter/linkResolver.hpp"
45
#include "logging/log.hpp"
46
#include "logging/logStream.hpp"
47
#include "memory/oopFactory.hpp"
48
#include "memory/resourceArea.hpp"
49
#include "memory/universe.hpp"
50
#include "oops/fieldStreams.inline.hpp"
51
#include "oops/instanceKlass.inline.hpp"
52
#include "oops/instanceMirrorKlass.hpp"
53
#include "oops/klass.hpp"
54
#include "oops/klass.inline.hpp"
55
#include "oops/method.inline.hpp"
56
#include "oops/objArrayOop.inline.hpp"
57
#include "oops/oop.inline.hpp"
58
#include "oops/symbol.hpp"
59
#include "oops/recordComponent.hpp"
60
#include "oops/typeArrayOop.inline.hpp"
61
#include "prims/jvmtiExport.hpp"
62
#include "prims/methodHandles.hpp"
63
#include "prims/resolvedMethodTable.hpp"
64
#include "runtime/fieldDescriptor.inline.hpp"
65
#include "runtime/frame.inline.hpp"
66
#include "runtime/handles.inline.hpp"
67
#include "runtime/init.hpp"
68
#include "runtime/interfaceSupport.inline.hpp"
69
#include "runtime/java.hpp"
70
#include "runtime/javaCalls.hpp"
71
#include "runtime/jniHandles.inline.hpp"
72
#include "runtime/reflectionUtils.hpp"
73
#include "runtime/safepoint.hpp"
74
#include "runtime/safepointVerifiers.hpp"
75
#include "runtime/thread.inline.hpp"
76
#include "runtime/vframe.inline.hpp"
77
#include "runtime/vm_version.hpp"
78
#include "utilities/align.hpp"
79
#include "utilities/preserveException.hpp"
80
#include "utilities/utf8.hpp"
81
#if INCLUDE_JVMCI
82
#include "jvmci/jvmciJavaClasses.hpp"
83
#endif
84
85
#define INJECTED_FIELD_COMPUTE_OFFSET(klass, name, signature, may_be_java) \
86
klass::_##name##_offset = JavaClasses::compute_injected_offset(JavaClasses::klass##_##name##_enum);
87
88
#if INCLUDE_CDS
89
#define INJECTED_FIELD_SERIALIZE_OFFSET(klass, name, signature, may_be_java) \
90
f->do_u4((u4*)&_##name##_offset);
91
#endif
92
93
#define DECLARE_INJECTED_FIELD(klass, name, signature, may_be_java) \
94
{ VM_CLASS_ID(klass), VM_SYMBOL_ENUM_NAME(name##_name), VM_SYMBOL_ENUM_NAME(signature), may_be_java },
95
96
InjectedField JavaClasses::_injected_fields[] = {
97
ALL_INJECTED_FIELDS(DECLARE_INJECTED_FIELD)
98
};
99
100
// Register native methods of Object
101
void java_lang_Object::register_natives(TRAPS) {
102
InstanceKlass* obj = vmClasses::Object_klass();
103
Method::register_native(obj, vmSymbols::hashCode_name(),
104
vmSymbols::void_int_signature(), (address) &JVM_IHashCode, CHECK);
105
Method::register_native(obj, vmSymbols::wait_name(),
106
vmSymbols::long_void_signature(), (address) &JVM_MonitorWait, CHECK);
107
Method::register_native(obj, vmSymbols::notify_name(),
108
vmSymbols::void_method_signature(), (address) &JVM_MonitorNotify, CHECK);
109
Method::register_native(obj, vmSymbols::notifyAll_name(),
110
vmSymbols::void_method_signature(), (address) &JVM_MonitorNotifyAll, CHECK);
111
Method::register_native(obj, vmSymbols::clone_name(),
112
vmSymbols::void_object_signature(), (address) &JVM_Clone, THREAD);
113
}
114
115
int JavaClasses::compute_injected_offset(InjectedFieldID id) {
116
return _injected_fields[id].compute_offset();
117
}
118
119
InjectedField* JavaClasses::get_injected(Symbol* class_name, int* field_count) {
120
*field_count = 0;
121
122
vmSymbolID sid = vmSymbols::find_sid(class_name);
123
if (sid == vmSymbolID::NO_SID) {
124
// Only well known classes can inject fields
125
return NULL;
126
}
127
128
int count = 0;
129
int start = -1;
130
131
#define LOOKUP_INJECTED_FIELD(klass, name, signature, may_be_java) \
132
if (sid == VM_SYMBOL_ENUM_NAME(klass)) { \
133
count++; \
134
if (start == -1) start = klass##_##name##_enum; \
135
}
136
ALL_INJECTED_FIELDS(LOOKUP_INJECTED_FIELD);
137
#undef LOOKUP_INJECTED_FIELD
138
139
if (start != -1) {
140
*field_count = count;
141
return _injected_fields + start;
142
}
143
return NULL;
144
}
145
146
147
// Helpful routine for computing field offsets at run time rather than hardcoding them
148
// Finds local fields only, including static fields. Static field offsets are from the
149
// beginning of the mirror.
150
static void compute_offset(int &dest_offset,
151
InstanceKlass* ik, Symbol* name_symbol, Symbol* signature_symbol,
152
bool is_static = false) {
153
fieldDescriptor fd;
154
if (ik == NULL) {
155
ResourceMark rm;
156
log_error(class)("Mismatch JDK version for field: %s type: %s", name_symbol->as_C_string(), signature_symbol->as_C_string());
157
vm_exit_during_initialization("Invalid layout of well-known class");
158
}
159
160
if (!ik->find_local_field(name_symbol, signature_symbol, &fd) || fd.is_static() != is_static) {
161
ResourceMark rm;
162
log_error(class)("Invalid layout of %s field: %s type: %s", ik->external_name(),
163
name_symbol->as_C_string(), signature_symbol->as_C_string());
164
#ifndef PRODUCT
165
// Prints all fields and offsets
166
Log(class) lt;
167
LogStream ls(lt.error());
168
ik->print_on(&ls);
169
#endif //PRODUCT
170
vm_exit_during_initialization("Invalid layout of well-known class: use -Xlog:class+load=info to see the origin of the problem class");
171
}
172
dest_offset = fd.offset();
173
}
174
175
// Overloading to pass name as a string.
176
static void compute_offset(int& dest_offset, InstanceKlass* ik,
177
const char* name_string, Symbol* signature_symbol,
178
bool is_static = false) {
179
TempNewSymbol name = SymbolTable::probe(name_string, (int)strlen(name_string));
180
if (name == NULL) {
181
ResourceMark rm;
182
log_error(class)("Name %s should be in the SymbolTable since its class is loaded", name_string);
183
vm_exit_during_initialization("Invalid layout of well-known class", ik->external_name());
184
}
185
compute_offset(dest_offset, ik, name, signature_symbol, is_static);
186
}
187
188
189
#if INCLUDE_CDS
190
#define FIELD_SERIALIZE_OFFSET(offset, klass, name, signature, is_static) \
191
f->do_u4((u4*)&offset)
192
#endif
193
194
#define FIELD_COMPUTE_OFFSET(offset, klass, name, signature, is_static) \
195
compute_offset(offset, klass, name, vmSymbols::signature(), is_static)
196
197
198
// java_lang_String
199
200
int java_lang_String::_value_offset;
201
int java_lang_String::_hash_offset;
202
int java_lang_String::_hashIsZero_offset;
203
int java_lang_String::_coder_offset;
204
int java_lang_String::_flags_offset;
205
206
bool java_lang_String::_initialized;
207
208
bool java_lang_String::is_instance(oop obj) {
209
return is_instance_inlined(obj);
210
}
211
212
bool java_lang_String::test_and_set_flag(oop java_string, uint8_t flag_mask) {
213
uint8_t* addr = flags_addr(java_string);
214
uint8_t value = Atomic::load(addr);
215
while ((value & flag_mask) == 0) {
216
uint8_t old_value = value;
217
value |= flag_mask;
218
value = Atomic::cmpxchg(addr, old_value, value);
219
if (value == old_value) return false; // Flag bit changed from 0 to 1.
220
}
221
return true; // Flag bit is already 1.
222
}
223
224
#define STRING_FIELDS_DO(macro) \
225
macro(_value_offset, k, vmSymbols::value_name(), byte_array_signature, false); \
226
macro(_hash_offset, k, "hash", int_signature, false); \
227
macro(_hashIsZero_offset, k, "hashIsZero", bool_signature, false); \
228
macro(_coder_offset, k, "coder", byte_signature, false);
229
230
void java_lang_String::compute_offsets() {
231
if (_initialized) {
232
return;
233
}
234
235
InstanceKlass* k = vmClasses::String_klass();
236
STRING_FIELDS_DO(FIELD_COMPUTE_OFFSET);
237
STRING_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
238
239
_initialized = true;
240
}
241
242
#if INCLUDE_CDS
243
void java_lang_String::serialize_offsets(SerializeClosure* f) {
244
STRING_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
245
STRING_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET);
246
f->do_bool(&_initialized);
247
}
248
#endif
249
250
class CompactStringsFixup : public FieldClosure {
251
private:
252
bool _value;
253
254
public:
255
CompactStringsFixup(bool value) : _value(value) {}
256
257
void do_field(fieldDescriptor* fd) {
258
if (fd->name() == vmSymbols::compact_strings_name()) {
259
oop mirror = fd->field_holder()->java_mirror();
260
assert(fd->field_holder() == vmClasses::String_klass(), "Should be String");
261
assert(mirror != NULL, "String must have mirror already");
262
mirror->bool_field_put(fd->offset(), _value);
263
}
264
}
265
};
266
267
void java_lang_String::set_compact_strings(bool value) {
268
CompactStringsFixup fix(value);
269
vmClasses::String_klass()->do_local_static_fields(&fix);
270
}
271
272
Handle java_lang_String::basic_create(int length, bool is_latin1, TRAPS) {
273
assert(_initialized, "Must be initialized");
274
assert(CompactStrings || !is_latin1, "Must be UTF16 without CompactStrings");
275
276
// Create the String object first, so there's a chance that the String
277
// and the char array it points to end up in the same cache line.
278
oop obj;
279
obj = vmClasses::String_klass()->allocate_instance(CHECK_NH);
280
281
// Create the char array. The String object must be handlized here
282
// because GC can happen as a result of the allocation attempt.
283
Handle h_obj(THREAD, obj);
284
int arr_length = is_latin1 ? length : length << 1; // 2 bytes per UTF16.
285
typeArrayOop buffer = oopFactory::new_byteArray(arr_length, CHECK_NH);;
286
287
// Point the String at the char array
288
obj = h_obj();
289
set_value(obj, buffer);
290
// No need to zero the offset, allocation zero'ed the entire String object
291
set_coder(obj, is_latin1 ? CODER_LATIN1 : CODER_UTF16);
292
return h_obj;
293
}
294
295
Handle java_lang_String::create_from_unicode(const jchar* unicode, int length, TRAPS) {
296
bool is_latin1 = CompactStrings && UNICODE::is_latin1(unicode, length);
297
Handle h_obj = basic_create(length, is_latin1, CHECK_NH);
298
typeArrayOop buffer = value(h_obj());
299
assert(TypeArrayKlass::cast(buffer->klass())->element_type() == T_BYTE, "only byte[]");
300
if (is_latin1) {
301
for (int index = 0; index < length; index++) {
302
buffer->byte_at_put(index, (jbyte)unicode[index]);
303
}
304
} else {
305
for (int index = 0; index < length; index++) {
306
buffer->char_at_put(index, unicode[index]);
307
}
308
}
309
310
#ifdef ASSERT
311
{
312
ResourceMark rm;
313
char* expected = UNICODE::as_utf8(unicode, length);
314
char* actual = as_utf8_string(h_obj());
315
if (strcmp(expected, actual) != 0) {
316
fatal("Unicode conversion failure: %s --> %s", expected, actual);
317
}
318
}
319
#endif
320
321
return h_obj;
322
}
323
324
oop java_lang_String::create_oop_from_unicode(const jchar* unicode, int length, TRAPS) {
325
Handle h_obj = create_from_unicode(unicode, length, CHECK_NULL);
326
return h_obj();
327
}
328
329
Handle java_lang_String::create_from_str(const char* utf8_str, TRAPS) {
330
if (utf8_str == NULL) {
331
return Handle();
332
}
333
bool has_multibyte, is_latin1;
334
int length = UTF8::unicode_length(utf8_str, is_latin1, has_multibyte);
335
if (!CompactStrings) {
336
has_multibyte = true;
337
is_latin1 = false;
338
}
339
340
Handle h_obj = basic_create(length, is_latin1, CHECK_NH);
341
if (length > 0) {
342
if (!has_multibyte) {
343
const jbyte* src = reinterpret_cast<const jbyte*>(utf8_str);
344
ArrayAccess<>::arraycopy_from_native(src, value(h_obj()), typeArrayOopDesc::element_offset<jbyte>(0), length);
345
} else if (is_latin1) {
346
UTF8::convert_to_unicode(utf8_str, value(h_obj())->byte_at_addr(0), length);
347
} else {
348
UTF8::convert_to_unicode(utf8_str, value(h_obj())->char_at_addr(0), length);
349
}
350
}
351
352
#ifdef ASSERT
353
// This check is too strict when the input string is not a valid UTF8.
354
// For example, it may be created with arbitrary content via jni_NewStringUTF.
355
if (UTF8::is_legal_utf8((const unsigned char*)utf8_str, (int)strlen(utf8_str), false)) {
356
ResourceMark rm;
357
const char* expected = utf8_str;
358
char* actual = as_utf8_string(h_obj());
359
if (strcmp(expected, actual) != 0) {
360
fatal("String conversion failure: %s --> %s", expected, actual);
361
}
362
}
363
#endif
364
365
return h_obj;
366
}
367
368
oop java_lang_String::create_oop_from_str(const char* utf8_str, TRAPS) {
369
Handle h_obj = create_from_str(utf8_str, CHECK_NULL);
370
return h_obj();
371
}
372
373
Handle java_lang_String::create_from_symbol(Symbol* symbol, TRAPS) {
374
const char* utf8_str = (char*)symbol->bytes();
375
int utf8_len = symbol->utf8_length();
376
377
bool has_multibyte, is_latin1;
378
int length = UTF8::unicode_length(utf8_str, utf8_len, is_latin1, has_multibyte);
379
if (!CompactStrings) {
380
has_multibyte = true;
381
is_latin1 = false;
382
}
383
384
Handle h_obj = basic_create(length, is_latin1, CHECK_NH);
385
if (length > 0) {
386
if (!has_multibyte) {
387
const jbyte* src = reinterpret_cast<const jbyte*>(utf8_str);
388
ArrayAccess<>::arraycopy_from_native(src, value(h_obj()), typeArrayOopDesc::element_offset<jbyte>(0), length);
389
} else if (is_latin1) {
390
UTF8::convert_to_unicode(utf8_str, value(h_obj())->byte_at_addr(0), length);
391
} else {
392
UTF8::convert_to_unicode(utf8_str, value(h_obj())->char_at_addr(0), length);
393
}
394
}
395
396
#ifdef ASSERT
397
{
398
ResourceMark rm;
399
const char* expected = symbol->as_utf8();
400
char* actual = as_utf8_string(h_obj());
401
if (strncmp(expected, actual, utf8_len) != 0) {
402
fatal("Symbol conversion failure: %s --> %s", expected, actual);
403
}
404
}
405
#endif
406
407
return h_obj;
408
}
409
410
// Converts a C string to a Java String based on current encoding
411
Handle java_lang_String::create_from_platform_dependent_str(const char* str, TRAPS) {
412
assert(str != NULL, "bad arguments");
413
414
typedef jstring (JNICALL *to_java_string_fn_t)(JNIEnv*, const char *);
415
static to_java_string_fn_t _to_java_string_fn = NULL;
416
417
if (_to_java_string_fn == NULL) {
418
void *lib_handle = os::native_java_library();
419
_to_java_string_fn = CAST_TO_FN_PTR(to_java_string_fn_t, os::dll_lookup(lib_handle, "JNU_NewStringPlatform"));
420
#if defined(_WIN32) && !defined(_WIN64)
421
if (_to_java_string_fn == NULL) {
422
// On 32 bit Windows, also try __stdcall decorated name
423
_to_java_string_fn = CAST_TO_FN_PTR(to_java_string_fn_t, os::dll_lookup(lib_handle, "_JNU_NewStringPlatform@8"));
424
}
425
#endif
426
if (_to_java_string_fn == NULL) {
427
fatal("JNU_NewStringPlatform missing");
428
}
429
}
430
431
jstring js = NULL;
432
{
433
JavaThread* thread = THREAD;
434
HandleMark hm(thread);
435
ThreadToNativeFromVM ttn(thread);
436
js = (_to_java_string_fn)(thread->jni_environment(), str);
437
}
438
439
Handle native_platform_string(THREAD, JNIHandles::resolve(js));
440
JNIHandles::destroy_local(js); // destroy local JNIHandle.
441
return native_platform_string;
442
}
443
444
// Converts a Java String to a native C string that can be used for
445
// native OS calls.
446
char* java_lang_String::as_platform_dependent_str(Handle java_string, TRAPS) {
447
typedef char* (*to_platform_string_fn_t)(JNIEnv*, jstring, bool*);
448
static to_platform_string_fn_t _to_platform_string_fn = NULL;
449
450
if (_to_platform_string_fn == NULL) {
451
void *lib_handle = os::native_java_library();
452
_to_platform_string_fn = CAST_TO_FN_PTR(to_platform_string_fn_t, os::dll_lookup(lib_handle, "GetStringPlatformChars"));
453
if (_to_platform_string_fn == NULL) {
454
fatal("GetStringPlatformChars missing");
455
}
456
}
457
458
char *native_platform_string;
459
{ JavaThread* thread = THREAD;
460
jstring js = (jstring) JNIHandles::make_local(thread, java_string());
461
bool is_copy;
462
HandleMark hm(thread);
463
ThreadToNativeFromVM ttn(thread);
464
JNIEnv *env = thread->jni_environment();
465
native_platform_string = (_to_platform_string_fn)(env, js, &is_copy);
466
assert(is_copy == JNI_TRUE, "is_copy value changed");
467
JNIHandles::destroy_local(js);
468
}
469
return native_platform_string;
470
}
471
472
Handle java_lang_String::char_converter(Handle java_string, jchar from_char, jchar to_char, TRAPS) {
473
oop obj = java_string();
474
// Typical usage is to convert all '/' to '.' in string.
475
typeArrayOop value = java_lang_String::value(obj);
476
int length = java_lang_String::length(obj, value);
477
bool is_latin1 = java_lang_String::is_latin1(obj);
478
479
// First check if any from_char exist
480
int index; // Declared outside, used later
481
for (index = 0; index < length; index++) {
482
jchar c = !is_latin1 ? value->char_at(index) :
483
((jchar) value->byte_at(index)) & 0xff;
484
if (c == from_char) {
485
break;
486
}
487
}
488
if (index == length) {
489
// No from_char, so do not copy.
490
return java_string;
491
}
492
493
// Check if result string will be latin1
494
bool to_is_latin1 = false;
495
496
// Replacement char must be latin1
497
if (CompactStrings && UNICODE::is_latin1(to_char)) {
498
if (is_latin1) {
499
// Source string is latin1 as well
500
to_is_latin1 = true;
501
} else if (!UNICODE::is_latin1(from_char)) {
502
// We are replacing an UTF16 char. Scan string to
503
// check if result can be latin1 encoded.
504
to_is_latin1 = true;
505
for (index = 0; index < length; index++) {
506
jchar c = value->char_at(index);
507
if (c != from_char && !UNICODE::is_latin1(c)) {
508
to_is_latin1 = false;
509
break;
510
}
511
}
512
}
513
}
514
515
// Create new UNICODE (or byte) buffer. Must handlize value because GC
516
// may happen during String and char array creation.
517
typeArrayHandle h_value(THREAD, value);
518
Handle string = basic_create(length, to_is_latin1, CHECK_NH);
519
typeArrayOop from_buffer = h_value();
520
typeArrayOop to_buffer = java_lang_String::value(string());
521
522
// Copy contents
523
for (index = 0; index < length; index++) {
524
jchar c = (!is_latin1) ? from_buffer->char_at(index) :
525
((jchar) from_buffer->byte_at(index)) & 0xff;
526
if (c == from_char) {
527
c = to_char;
528
}
529
if (!to_is_latin1) {
530
to_buffer->char_at_put(index, c);
531
} else {
532
to_buffer->byte_at_put(index, (jbyte) c);
533
}
534
}
535
return string;
536
}
537
538
jchar* java_lang_String::as_unicode_string(oop java_string, int& length, TRAPS) {
539
jchar* result = as_unicode_string_or_null(java_string, length);
540
if (result == NULL) {
541
THROW_MSG_0(vmSymbols::java_lang_OutOfMemoryError(), "could not allocate Unicode string");
542
}
543
return result;
544
}
545
546
jchar* java_lang_String::as_unicode_string_or_null(oop java_string, int& length) {
547
typeArrayOop value = java_lang_String::value(java_string);
548
length = java_lang_String::length(java_string, value);
549
bool is_latin1 = java_lang_String::is_latin1(java_string);
550
551
jchar* result = NEW_RESOURCE_ARRAY_RETURN_NULL(jchar, length);
552
if (result != NULL) {
553
if (!is_latin1) {
554
for (int index = 0; index < length; index++) {
555
result[index] = value->char_at(index);
556
}
557
} else {
558
for (int index = 0; index < length; index++) {
559
result[index] = ((jchar) value->byte_at(index)) & 0xff;
560
}
561
}
562
}
563
return result;
564
}
565
566
unsigned int java_lang_String::hash_code(oop java_string) {
567
// The hash and hashIsZero fields are subject to a benign data race,
568
// making it crucial to ensure that any observable result of the
569
// calculation in this method stays correct under any possible read of
570
// these fields. Necessary restrictions to allow this to be correct
571
// without explicit memory fences or similar concurrency primitives is
572
// that we can ever only write to one of these two fields for a given
573
// String instance, and that the computation is idempotent and derived
574
// from immutable state
575
assert(_initialized && (_hash_offset > 0) && (_hashIsZero_offset > 0), "Must be initialized");
576
if (java_lang_String::hash_is_set(java_string)) {
577
return java_string->int_field(_hash_offset);
578
}
579
580
typeArrayOop value = java_lang_String::value(java_string);
581
int length = java_lang_String::length(java_string, value);
582
bool is_latin1 = java_lang_String::is_latin1(java_string);
583
584
unsigned int hash = 0;
585
if (length > 0) {
586
if (is_latin1) {
587
hash = java_lang_String::hash_code(value->byte_at_addr(0), length);
588
} else {
589
hash = java_lang_String::hash_code(value->char_at_addr(0), length);
590
}
591
}
592
593
if (hash != 0) {
594
java_string->int_field_put(_hash_offset, hash);
595
} else {
596
java_string->bool_field_put(_hashIsZero_offset, true);
597
}
598
return hash;
599
}
600
601
char* java_lang_String::as_quoted_ascii(oop java_string) {
602
typeArrayOop value = java_lang_String::value(java_string);
603
int length = java_lang_String::length(java_string, value);
604
bool is_latin1 = java_lang_String::is_latin1(java_string);
605
606
if (length == 0) return NULL;
607
608
char* result;
609
int result_length;
610
if (!is_latin1) {
611
jchar* base = value->char_at_addr(0);
612
result_length = UNICODE::quoted_ascii_length(base, length) + 1;
613
result = NEW_RESOURCE_ARRAY(char, result_length);
614
UNICODE::as_quoted_ascii(base, length, result, result_length);
615
} else {
616
jbyte* base = value->byte_at_addr(0);
617
result_length = UNICODE::quoted_ascii_length(base, length) + 1;
618
result = NEW_RESOURCE_ARRAY(char, result_length);
619
UNICODE::as_quoted_ascii(base, length, result, result_length);
620
}
621
assert(result_length >= length + 1, "must not be shorter");
622
assert(result_length == (int)strlen(result) + 1, "must match");
623
return result;
624
}
625
626
Symbol* java_lang_String::as_symbol(oop java_string) {
627
typeArrayOop value = java_lang_String::value(java_string);
628
int length = java_lang_String::length(java_string, value);
629
bool is_latin1 = java_lang_String::is_latin1(java_string);
630
if (!is_latin1) {
631
jchar* base = (length == 0) ? NULL : value->char_at_addr(0);
632
Symbol* sym = SymbolTable::new_symbol(base, length);
633
return sym;
634
} else {
635
ResourceMark rm;
636
jbyte* position = (length == 0) ? NULL : value->byte_at_addr(0);
637
const char* base = UNICODE::as_utf8(position, length);
638
Symbol* sym = SymbolTable::new_symbol(base, length);
639
return sym;
640
}
641
}
642
643
Symbol* java_lang_String::as_symbol_or_null(oop java_string) {
644
typeArrayOop value = java_lang_String::value(java_string);
645
int length = java_lang_String::length(java_string, value);
646
bool is_latin1 = java_lang_String::is_latin1(java_string);
647
if (!is_latin1) {
648
jchar* base = (length == 0) ? NULL : value->char_at_addr(0);
649
return SymbolTable::probe_unicode(base, length);
650
} else {
651
ResourceMark rm;
652
jbyte* position = (length == 0) ? NULL : value->byte_at_addr(0);
653
const char* base = UNICODE::as_utf8(position, length);
654
return SymbolTable::probe(base, length);
655
}
656
}
657
658
int java_lang_String::utf8_length(oop java_string, typeArrayOop value) {
659
assert(value_equals(value, java_lang_String::value(java_string)),
660
"value must be same as java_lang_String::value(java_string)");
661
int length = java_lang_String::length(java_string, value);
662
if (length == 0) {
663
return 0;
664
}
665
if (!java_lang_String::is_latin1(java_string)) {
666
return UNICODE::utf8_length(value->char_at_addr(0), length);
667
} else {
668
return UNICODE::utf8_length(value->byte_at_addr(0), length);
669
}
670
}
671
672
int java_lang_String::utf8_length(oop java_string) {
673
typeArrayOop value = java_lang_String::value(java_string);
674
return utf8_length(java_string, value);
675
}
676
677
char* java_lang_String::as_utf8_string(oop java_string) {
678
int length;
679
return as_utf8_string(java_string, length);
680
}
681
682
char* java_lang_String::as_utf8_string(oop java_string, int& length) {
683
typeArrayOop value = java_lang_String::value(java_string);
684
length = java_lang_String::length(java_string, value);
685
bool is_latin1 = java_lang_String::is_latin1(java_string);
686
if (!is_latin1) {
687
jchar* position = (length == 0) ? NULL : value->char_at_addr(0);
688
return UNICODE::as_utf8(position, length);
689
} else {
690
jbyte* position = (length == 0) ? NULL : value->byte_at_addr(0);
691
return UNICODE::as_utf8(position, length);
692
}
693
}
694
695
// Uses a provided buffer if it's sufficiently large, otherwise allocates
696
// a resource array to fit
697
char* java_lang_String::as_utf8_string_full(oop java_string, char* buf, int buflen, int& utf8_len) {
698
typeArrayOop value = java_lang_String::value(java_string);
699
int len = java_lang_String::length(java_string, value);
700
bool is_latin1 = java_lang_String::is_latin1(java_string);
701
if (!is_latin1) {
702
jchar *position = (len == 0) ? NULL : value->char_at_addr(0);
703
utf8_len = UNICODE::utf8_length(position, len);
704
if (utf8_len >= buflen) {
705
buf = NEW_RESOURCE_ARRAY(char, utf8_len + 1);
706
}
707
return UNICODE::as_utf8(position, len, buf, utf8_len + 1);
708
} else {
709
jbyte *position = (len == 0) ? NULL : value->byte_at_addr(0);
710
utf8_len = UNICODE::utf8_length(position, len);
711
if (utf8_len >= buflen) {
712
buf = NEW_RESOURCE_ARRAY(char, utf8_len + 1);
713
}
714
return UNICODE::as_utf8(position, len, buf, utf8_len + 1);
715
}
716
}
717
718
char* java_lang_String::as_utf8_string(oop java_string, typeArrayOop value, char* buf, int buflen) {
719
assert(value_equals(value, java_lang_String::value(java_string)),
720
"value must be same as java_lang_String::value(java_string)");
721
int length = java_lang_String::length(java_string, value);
722
bool is_latin1 = java_lang_String::is_latin1(java_string);
723
if (!is_latin1) {
724
jchar* position = (length == 0) ? NULL : value->char_at_addr(0);
725
return UNICODE::as_utf8(position, length, buf, buflen);
726
} else {
727
jbyte* position = (length == 0) ? NULL : value->byte_at_addr(0);
728
return UNICODE::as_utf8(position, length, buf, buflen);
729
}
730
}
731
732
char* java_lang_String::as_utf8_string(oop java_string, char* buf, int buflen) {
733
typeArrayOop value = java_lang_String::value(java_string);
734
return as_utf8_string(java_string, value, buf, buflen);
735
}
736
737
char* java_lang_String::as_utf8_string(oop java_string, int start, int len) {
738
typeArrayOop value = java_lang_String::value(java_string);
739
bool is_latin1 = java_lang_String::is_latin1(java_string);
740
assert(start + len <= java_lang_String::length(java_string), "just checking");
741
if (!is_latin1) {
742
jchar* position = value->char_at_addr(start);
743
return UNICODE::as_utf8(position, len);
744
} else {
745
jbyte* position = value->byte_at_addr(start);
746
return UNICODE::as_utf8(position, len);
747
}
748
}
749
750
char* java_lang_String::as_utf8_string(oop java_string, typeArrayOop value, int start, int len, char* buf, int buflen) {
751
assert(value_equals(value, java_lang_String::value(java_string)),
752
"value must be same as java_lang_String::value(java_string)");
753
assert(start + len <= java_lang_String::length(java_string), "just checking");
754
bool is_latin1 = java_lang_String::is_latin1(java_string);
755
if (!is_latin1) {
756
jchar* position = value->char_at_addr(start);
757
return UNICODE::as_utf8(position, len, buf, buflen);
758
} else {
759
jbyte* position = value->byte_at_addr(start);
760
return UNICODE::as_utf8(position, len, buf, buflen);
761
}
762
}
763
764
bool java_lang_String::equals(oop java_string, const jchar* chars, int len) {
765
assert(java_string->klass() == vmClasses::String_klass(),
766
"must be java_string");
767
typeArrayOop value = java_lang_String::value_no_keepalive(java_string);
768
int length = java_lang_String::length(java_string, value);
769
if (length != len) {
770
return false;
771
}
772
bool is_latin1 = java_lang_String::is_latin1(java_string);
773
if (!is_latin1) {
774
for (int i = 0; i < len; i++) {
775
if (value->char_at(i) != chars[i]) {
776
return false;
777
}
778
}
779
} else {
780
for (int i = 0; i < len; i++) {
781
if ((((jchar) value->byte_at(i)) & 0xff) != chars[i]) {
782
return false;
783
}
784
}
785
}
786
return true;
787
}
788
789
bool java_lang_String::equals(oop str1, oop str2) {
790
assert(str1->klass() == vmClasses::String_klass(),
791
"must be java String");
792
assert(str2->klass() == vmClasses::String_klass(),
793
"must be java String");
794
typeArrayOop value1 = java_lang_String::value_no_keepalive(str1);
795
bool is_latin1 = java_lang_String::is_latin1(str1);
796
typeArrayOop value2 = java_lang_String::value_no_keepalive(str2);
797
bool is_latin2 = java_lang_String::is_latin1(str2);
798
799
if (is_latin1 != is_latin2) {
800
// Strings with different coders are never equal.
801
return false;
802
}
803
return value_equals(value1, value2);
804
}
805
806
void java_lang_String::print(oop java_string, outputStream* st) {
807
assert(java_string->klass() == vmClasses::String_klass(), "must be java_string");
808
typeArrayOop value = java_lang_String::value_no_keepalive(java_string);
809
810
if (value == NULL) {
811
// This can happen if, e.g., printing a String
812
// object before its initializer has been called
813
st->print("NULL");
814
return;
815
}
816
817
int length = java_lang_String::length(java_string, value);
818
bool is_latin1 = java_lang_String::is_latin1(java_string);
819
820
st->print("\"");
821
for (int index = 0; index < length; index++) {
822
st->print("%c", (!is_latin1) ? value->char_at(index) :
823
((jchar) value->byte_at(index)) & 0xff );
824
}
825
st->print("\"");
826
}
827
828
// java_lang_Class
829
830
int java_lang_Class::_klass_offset;
831
int java_lang_Class::_array_klass_offset;
832
int java_lang_Class::_oop_size_offset;
833
int java_lang_Class::_static_oop_field_count_offset;
834
int java_lang_Class::_class_loader_offset;
835
int java_lang_Class::_module_offset;
836
int java_lang_Class::_protection_domain_offset;
837
int java_lang_Class::_component_mirror_offset;
838
int java_lang_Class::_init_lock_offset;
839
int java_lang_Class::_signers_offset;
840
int java_lang_Class::_name_offset;
841
int java_lang_Class::_source_file_offset;
842
int java_lang_Class::_classData_offset;
843
int java_lang_Class::_classRedefinedCount_offset;
844
845
bool java_lang_Class::_offsets_computed = false;
846
GrowableArray<Klass*>* java_lang_Class::_fixup_mirror_list = NULL;
847
GrowableArray<Klass*>* java_lang_Class::_fixup_module_field_list = NULL;
848
849
#ifdef ASSERT
850
inline static void assert_valid_static_string_field(fieldDescriptor* fd) {
851
assert(fd->has_initial_value(), "caller should have checked this");
852
assert(fd->field_type() == T_OBJECT, "caller should have checked this");
853
// Can't use vmSymbols::string_signature() as fd->signature() may have been relocated
854
// during DumpSharedSpaces
855
assert(fd->signature()->equals("Ljava/lang/String;"), "just checking");
856
}
857
#endif
858
859
static void initialize_static_string_field(fieldDescriptor* fd, Handle mirror, TRAPS) {
860
DEBUG_ONLY(assert_valid_static_string_field(fd);)
861
oop string = fd->string_initial_value(CHECK);
862
mirror()->obj_field_put(fd->offset(), string);
863
}
864
865
#if INCLUDE_CDS_JAVA_HEAP
866
static void initialize_static_string_field_for_dump(fieldDescriptor* fd, Handle mirror) {
867
DEBUG_ONLY(assert_valid_static_string_field(fd);)
868
assert(DumpSharedSpaces, "must be");
869
if (HeapShared::is_archived_object(mirror())) {
870
// Archive the String field and update the pointer.
871
oop s = mirror()->obj_field(fd->offset());
872
oop archived_s = StringTable::create_archived_string(s);
873
mirror()->obj_field_put(fd->offset(), archived_s);
874
} else {
875
guarantee(false, "Unexpected");
876
}
877
}
878
#endif
879
880
static void initialize_static_primitive_field(fieldDescriptor* fd, Handle mirror) {
881
assert(fd->has_initial_value(), "caller should have checked this");
882
BasicType t = fd->field_type();
883
switch (t) {
884
case T_BYTE:
885
mirror()->byte_field_put(fd->offset(), fd->int_initial_value());
886
break;
887
case T_BOOLEAN:
888
mirror()->bool_field_put(fd->offset(), fd->int_initial_value());
889
break;
890
case T_CHAR:
891
mirror()->char_field_put(fd->offset(), fd->int_initial_value());
892
break;
893
case T_SHORT:
894
mirror()->short_field_put(fd->offset(), fd->int_initial_value());
895
break;
896
case T_INT:
897
mirror()->int_field_put(fd->offset(), fd->int_initial_value());
898
break;
899
case T_FLOAT:
900
mirror()->float_field_put(fd->offset(), fd->float_initial_value());
901
break;
902
case T_DOUBLE:
903
mirror()->double_field_put(fd->offset(), fd->double_initial_value());
904
break;
905
case T_LONG:
906
mirror()->long_field_put(fd->offset(), fd->long_initial_value());
907
break;
908
default:
909
// Illegal ConstantValue attribute in class file should have been
910
// caught during classfile parsing.
911
ShouldNotReachHere();
912
}
913
}
914
915
static void initialize_static_field(fieldDescriptor* fd, Handle mirror, TRAPS) {
916
assert(mirror.not_null() && fd->is_static(), "just checking");
917
if (fd->has_initial_value()) {
918
if (fd->field_type() != T_OBJECT) {
919
initialize_static_primitive_field(fd, mirror);
920
} else {
921
initialize_static_string_field(fd, mirror, CHECK);
922
}
923
}
924
}
925
926
#if INCLUDE_CDS_JAVA_HEAP
927
static void initialize_static_field_for_dump(fieldDescriptor* fd, Handle mirror) {
928
assert(mirror.not_null() && fd->is_static(), "just checking");
929
if (fd->has_initial_value()) {
930
if (fd->field_type() != T_OBJECT) {
931
initialize_static_primitive_field(fd, mirror);
932
} else {
933
initialize_static_string_field_for_dump(fd, mirror);
934
}
935
}
936
}
937
#endif
938
939
void java_lang_Class::fixup_mirror(Klass* k, TRAPS) {
940
assert(InstanceMirrorKlass::offset_of_static_fields() != 0, "must have been computed already");
941
942
// If the offset was read from the shared archive, it was fixed up already
943
if (!k->is_shared()) {
944
if (k->is_instance_klass()) {
945
// During bootstrap, java.lang.Class wasn't loaded so static field
946
// offsets were computed without the size added it. Go back and
947
// update all the static field offsets to included the size.
948
for (JavaFieldStream fs(InstanceKlass::cast(k)); !fs.done(); fs.next()) {
949
if (fs.access_flags().is_static()) {
950
int real_offset = fs.offset() + InstanceMirrorKlass::offset_of_static_fields();
951
fs.set_offset(real_offset);
952
}
953
}
954
}
955
}
956
957
if (k->is_shared() && k->has_archived_mirror_index()) {
958
if (HeapShared::open_archive_heap_region_mapped()) {
959
bool present = restore_archived_mirror(k, Handle(), Handle(), Handle(), CHECK);
960
assert(present, "Missing archived mirror for %s", k->external_name());
961
return;
962
} else {
963
k->clear_java_mirror_handle();
964
k->clear_archived_mirror_index();
965
}
966
}
967
create_mirror(k, Handle(), Handle(), Handle(), Handle(), CHECK);
968
}
969
970
void java_lang_Class::initialize_mirror_fields(Klass* k,
971
Handle mirror,
972
Handle protection_domain,
973
Handle classData,
974
TRAPS) {
975
// Allocate a simple java object for a lock.
976
// This needs to be a java object because during class initialization
977
// it can be held across a java call.
978
typeArrayOop r = oopFactory::new_typeArray(T_INT, 0, CHECK);
979
set_init_lock(mirror(), r);
980
981
// Set protection domain also
982
set_protection_domain(mirror(), protection_domain());
983
984
// Initialize static fields
985
InstanceKlass::cast(k)->do_local_static_fields(&initialize_static_field, mirror, CHECK);
986
987
// Set classData
988
set_class_data(mirror(), classData());
989
}
990
991
// Set the java.lang.Module module field in the java_lang_Class mirror
992
void java_lang_Class::set_mirror_module_field(JavaThread* current, Klass* k, Handle mirror, Handle module) {
993
if (module.is_null()) {
994
// During startup, the module may be NULL only if java.base has not been defined yet.
995
// Put the class on the fixup_module_list to patch later when the java.lang.Module
996
// for java.base is known. But note that since we captured the NULL module another
997
// thread may have completed that initialization.
998
999
bool javabase_was_defined = false;
1000
{
1001
MutexLocker m1(current, Module_lock);
1002
// Keep list of classes needing java.base module fixup
1003
if (!ModuleEntryTable::javabase_defined()) {
1004
assert(k->java_mirror() != NULL, "Class's mirror is null");
1005
k->class_loader_data()->inc_keep_alive();
1006
assert(fixup_module_field_list() != NULL, "fixup_module_field_list not initialized");
1007
fixup_module_field_list()->push(k);
1008
} else {
1009
javabase_was_defined = true;
1010
}
1011
}
1012
1013
// If java.base was already defined then patch this particular class with java.base.
1014
if (javabase_was_defined) {
1015
ModuleEntry *javabase_entry = ModuleEntryTable::javabase_moduleEntry();
1016
assert(javabase_entry != NULL && javabase_entry->module() != NULL,
1017
"Setting class module field, " JAVA_BASE_NAME " should be defined");
1018
Handle javabase_handle(current, javabase_entry->module());
1019
set_module(mirror(), javabase_handle());
1020
}
1021
} else {
1022
assert(Universe::is_module_initialized() ||
1023
(ModuleEntryTable::javabase_defined() &&
1024
(module() == ModuleEntryTable::javabase_moduleEntry()->module())),
1025
"Incorrect java.lang.Module specification while creating mirror");
1026
set_module(mirror(), module());
1027
}
1028
}
1029
1030
// Statically allocate fixup lists because they always get created.
1031
void java_lang_Class::allocate_fixup_lists() {
1032
GrowableArray<Klass*>* mirror_list =
1033
new (ResourceObj::C_HEAP, mtClass) GrowableArray<Klass*>(40, mtClass);
1034
set_fixup_mirror_list(mirror_list);
1035
1036
GrowableArray<Klass*>* module_list =
1037
new (ResourceObj::C_HEAP, mtModule) GrowableArray<Klass*>(500, mtModule);
1038
set_fixup_module_field_list(module_list);
1039
}
1040
1041
void java_lang_Class::create_mirror(Klass* k, Handle class_loader,
1042
Handle module, Handle protection_domain,
1043
Handle classData, TRAPS) {
1044
assert(k != NULL, "Use create_basic_type_mirror for primitive types");
1045
assert(k->java_mirror() == NULL, "should only assign mirror once");
1046
1047
// Use this moment of initialization to cache modifier_flags also,
1048
// to support Class.getModifiers(). Instance classes recalculate
1049
// the cached flags after the class file is parsed, but before the
1050
// class is put into the system dictionary.
1051
int computed_modifiers = k->compute_modifier_flags();
1052
k->set_modifier_flags(computed_modifiers);
1053
// Class_klass has to be loaded because it is used to allocate
1054
// the mirror.
1055
if (vmClasses::Class_klass_loaded()) {
1056
// Allocate mirror (java.lang.Class instance)
1057
oop mirror_oop = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(k, CHECK);
1058
Handle mirror(THREAD, mirror_oop);
1059
Handle comp_mirror;
1060
1061
// Setup indirection from mirror->klass
1062
java_lang_Class::set_klass(mirror(), k);
1063
1064
InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass());
1065
assert(oop_size(mirror()) == mk->instance_size(k), "should have been set");
1066
1067
java_lang_Class::set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror()));
1068
1069
// It might also have a component mirror. This mirror must already exist.
1070
if (k->is_array_klass()) {
1071
if (k->is_typeArray_klass()) {
1072
BasicType type = TypeArrayKlass::cast(k)->element_type();
1073
comp_mirror = Handle(THREAD, Universe::java_mirror(type));
1074
} else {
1075
assert(k->is_objArray_klass(), "Must be");
1076
Klass* element_klass = ObjArrayKlass::cast(k)->element_klass();
1077
assert(element_klass != NULL, "Must have an element klass");
1078
comp_mirror = Handle(THREAD, element_klass->java_mirror());
1079
}
1080
assert(comp_mirror() != NULL, "must have a mirror");
1081
1082
// Two-way link between the array klass and its component mirror:
1083
// (array_klass) k -> mirror -> component_mirror -> array_klass -> k
1084
set_component_mirror(mirror(), comp_mirror());
1085
// See below for ordering dependencies between field array_klass in component mirror
1086
// and java_mirror in this klass.
1087
} else {
1088
assert(k->is_instance_klass(), "Must be");
1089
1090
initialize_mirror_fields(k, mirror, protection_domain, classData, THREAD);
1091
if (HAS_PENDING_EXCEPTION) {
1092
// If any of the fields throws an exception like OOM remove the klass field
1093
// from the mirror so GC doesn't follow it after the klass has been deallocated.
1094
// This mirror looks like a primitive type, which logically it is because it
1095
// it represents no class.
1096
java_lang_Class::set_klass(mirror(), NULL);
1097
return;
1098
}
1099
}
1100
1101
// set the classLoader field in the java_lang_Class instance
1102
assert(class_loader() == k->class_loader(), "should be same");
1103
set_class_loader(mirror(), class_loader());
1104
1105
// Setup indirection from klass->mirror
1106
// after any exceptions can happen during allocations.
1107
k->set_java_mirror(mirror);
1108
1109
// Set the module field in the java_lang_Class instance. This must be done
1110
// after the mirror is set.
1111
set_mirror_module_field(THREAD, k, mirror, module);
1112
1113
if (comp_mirror() != NULL) {
1114
// Set after k->java_mirror() is published, because compiled code running
1115
// concurrently doesn't expect a k to have a null java_mirror.
1116
release_set_array_klass(comp_mirror(), k);
1117
}
1118
} else {
1119
assert(fixup_mirror_list() != NULL, "fixup_mirror_list not initialized");
1120
fixup_mirror_list()->push(k);
1121
}
1122
}
1123
1124
#if INCLUDE_CDS_JAVA_HEAP
1125
// Clears mirror fields. Static final fields with initial values are reloaded
1126
// from constant pool. The object identity hash is in the object header and is
1127
// not affected.
1128
class ResetMirrorField: public FieldClosure {
1129
private:
1130
Handle _m;
1131
1132
public:
1133
ResetMirrorField(Handle mirror) : _m(mirror) {}
1134
1135
void do_field(fieldDescriptor* fd) {
1136
assert(DumpSharedSpaces, "dump time only");
1137
assert(_m.not_null(), "Mirror cannot be NULL");
1138
1139
if (fd->is_static() && fd->has_initial_value()) {
1140
initialize_static_field_for_dump(fd, _m);
1141
return;
1142
}
1143
1144
BasicType ft = fd->field_type();
1145
switch (ft) {
1146
case T_BYTE:
1147
_m()->byte_field_put(fd->offset(), 0);
1148
break;
1149
case T_CHAR:
1150
_m()->char_field_put(fd->offset(), 0);
1151
break;
1152
case T_DOUBLE:
1153
_m()->double_field_put(fd->offset(), 0);
1154
break;
1155
case T_FLOAT:
1156
_m()->float_field_put(fd->offset(), 0);
1157
break;
1158
case T_INT:
1159
_m()->int_field_put(fd->offset(), 0);
1160
break;
1161
case T_LONG:
1162
_m()->long_field_put(fd->offset(), 0);
1163
break;
1164
case T_SHORT:
1165
_m()->short_field_put(fd->offset(), 0);
1166
break;
1167
case T_BOOLEAN:
1168
_m()->bool_field_put(fd->offset(), false);
1169
break;
1170
case T_ARRAY:
1171
case T_OBJECT: {
1172
// It might be useful to cache the String field, but
1173
// for now just clear out any reference field
1174
oop o = _m()->obj_field(fd->offset());
1175
_m()->obj_field_put(fd->offset(), NULL);
1176
break;
1177
}
1178
default:
1179
ShouldNotReachHere();
1180
break;
1181
}
1182
}
1183
};
1184
1185
static void set_klass_field_in_archived_mirror(oop mirror_obj, int offset, Klass* k) {
1186
assert(java_lang_Class::is_instance(mirror_obj), "must be");
1187
// this is the copy of k in the output buffer
1188
Klass* copy = ArchiveBuilder::get_relocated_klass(k);
1189
1190
// This is the address of k, if the archive is loaded at the requested location
1191
Klass* def = ArchiveBuilder::current()->to_requested(copy);
1192
1193
log_debug(cds, heap, mirror)(
1194
"Relocate mirror metadata field at %d from " PTR_FORMAT " ==> " PTR_FORMAT,
1195
offset, p2i(k), p2i(def));
1196
1197
mirror_obj->metadata_field_put(offset, def);
1198
}
1199
1200
void java_lang_Class::archive_basic_type_mirrors() {
1201
assert(HeapShared::is_heap_object_archiving_allowed(),
1202
"HeapShared::is_heap_object_archiving_allowed() must be true");
1203
1204
for (int t = T_BOOLEAN; t < T_VOID+1; t++) {
1205
BasicType bt = (BasicType)t;
1206
oop m = Universe::_mirrors[t].resolve();
1207
if (m != NULL) {
1208
// Update the field at _array_klass_offset to point to the relocated array klass.
1209
oop archived_m = HeapShared::archive_heap_object(m);
1210
assert(archived_m != NULL, "sanity");
1211
Klass *ak = (Klass*)(archived_m->metadata_field(_array_klass_offset));
1212
assert(ak != NULL || t == T_VOID, "should not be NULL");
1213
if (ak != NULL) {
1214
set_klass_field_in_archived_mirror(archived_m, _array_klass_offset, ak);
1215
}
1216
1217
// Clear the fields. Just to be safe
1218
Klass *k = m->klass();
1219
Handle archived_mirror_h(Thread::current(), archived_m);
1220
ResetMirrorField reset(archived_mirror_h);
1221
InstanceKlass::cast(k)->do_nonstatic_fields(&reset);
1222
1223
log_trace(cds, heap, mirror)(
1224
"Archived %s mirror object from " PTR_FORMAT " ==> " PTR_FORMAT,
1225
type2name(bt), p2i(m), p2i(archived_m));
1226
1227
Universe::replace_mirror(bt, archived_m);
1228
}
1229
}
1230
}
1231
//
1232
// After the mirror object is successfully archived, the archived
1233
// klass is set with _has_archived_raw_mirror flag.
1234
//
1235
// The _has_archived_raw_mirror flag is cleared at runtime when the
1236
// archived mirror is restored. If archived java heap data cannot
1237
// be used at runtime, new mirror object is created for the shared
1238
// class. The _has_archived_raw_mirror is cleared also during the process.
1239
oop java_lang_Class::archive_mirror(Klass* k) {
1240
assert(HeapShared::is_heap_object_archiving_allowed(),
1241
"HeapShared::is_heap_object_archiving_allowed() must be true");
1242
1243
// Mirror is already archived
1244
if (k->has_archived_mirror_index()) {
1245
assert(k->archived_java_mirror() != NULL, "no archived mirror");
1246
return k->archived_java_mirror();
1247
}
1248
1249
// No mirror
1250
oop mirror = k->java_mirror();
1251
if (mirror == NULL) {
1252
return NULL;
1253
}
1254
1255
if (k->is_instance_klass()) {
1256
InstanceKlass *ik = InstanceKlass::cast(k);
1257
assert(ik->signers() == NULL, "class with signer should have been excluded");
1258
1259
if (!(ik->is_shared_boot_class() || ik->is_shared_platform_class() ||
1260
ik->is_shared_app_class())) {
1261
// Archiving mirror for classes from non-builtin loaders is not
1262
// supported.
1263
return NULL;
1264
}
1265
}
1266
1267
// Now start archiving the mirror object
1268
oop archived_mirror = HeapShared::archive_heap_object(mirror);
1269
if (archived_mirror == NULL) {
1270
return NULL;
1271
}
1272
1273
archived_mirror = process_archived_mirror(k, mirror, archived_mirror);
1274
if (archived_mirror == NULL) {
1275
return NULL;
1276
}
1277
1278
k->set_archived_java_mirror(archived_mirror);
1279
1280
ResourceMark rm;
1281
log_trace(cds, heap, mirror)(
1282
"Archived %s mirror object from " PTR_FORMAT " ==> " PTR_FORMAT,
1283
k->external_name(), p2i(mirror), p2i(archived_mirror));
1284
1285
return archived_mirror;
1286
}
1287
1288
// The process is based on create_mirror().
1289
oop java_lang_Class::process_archived_mirror(Klass* k, oop mirror,
1290
oop archived_mirror) {
1291
// Clear nonstatic fields in archived mirror. Some of the fields will be set
1292
// to archived metadata and objects below.
1293
Klass *c = archived_mirror->klass();
1294
Handle archived_mirror_h(Thread::current(), archived_mirror);
1295
ResetMirrorField reset(archived_mirror_h);
1296
InstanceKlass::cast(c)->do_nonstatic_fields(&reset);
1297
1298
if (k->is_array_klass()) {
1299
oop archived_comp_mirror;
1300
if (k->is_typeArray_klass()) {
1301
// The primitive type mirrors are already archived. Get the archived mirror.
1302
oop comp_mirror = java_lang_Class::component_mirror(mirror);
1303
archived_comp_mirror = HeapShared::find_archived_heap_object(comp_mirror);
1304
assert(archived_comp_mirror != NULL, "Must be");
1305
} else {
1306
assert(k->is_objArray_klass(), "Must be");
1307
Klass* element_klass = ObjArrayKlass::cast(k)->element_klass();
1308
assert(element_klass != NULL, "Must have an element klass");
1309
archived_comp_mirror = archive_mirror(element_klass);
1310
if (archived_comp_mirror == NULL) {
1311
return NULL;
1312
}
1313
}
1314
java_lang_Class::set_component_mirror(archived_mirror, archived_comp_mirror);
1315
} else {
1316
assert(k->is_instance_klass(), "Must be");
1317
1318
// Reset local static fields in the mirror
1319
InstanceKlass::cast(k)->do_local_static_fields(&reset);
1320
1321
java_lang_Class:set_init_lock(archived_mirror, NULL);
1322
1323
set_protection_domain(archived_mirror, NULL);
1324
set_signers(archived_mirror, NULL);
1325
set_source_file(archived_mirror, NULL);
1326
}
1327
1328
// clear class loader and mirror_module_field
1329
set_class_loader(archived_mirror, NULL);
1330
set_module(archived_mirror, NULL);
1331
1332
// The archived mirror's field at _klass_offset is still pointing to the original
1333
// klass. Updated the field in the archived mirror to point to the relocated
1334
// klass in the archive.
1335
set_klass_field_in_archived_mirror(archived_mirror, _klass_offset, as_Klass(mirror));
1336
1337
// The field at _array_klass_offset is pointing to the original one dimension
1338
// higher array klass if exists. Relocate the pointer.
1339
Klass *arr = array_klass_acquire(mirror);
1340
if (arr != NULL) {
1341
set_klass_field_in_archived_mirror(archived_mirror, _array_klass_offset, arr);
1342
}
1343
return archived_mirror;
1344
}
1345
1346
void java_lang_Class::update_archived_primitive_mirror_native_pointers(oop archived_mirror) {
1347
if (MetaspaceShared::relocation_delta() != 0) {
1348
assert(archived_mirror->metadata_field(_klass_offset) == NULL, "must be for primitive class");
1349
1350
Klass* ak = ((Klass*)archived_mirror->metadata_field(_array_klass_offset));
1351
if (ak != NULL) {
1352
archived_mirror->metadata_field_put(_array_klass_offset,
1353
(Klass*)(address(ak) + MetaspaceShared::relocation_delta()));
1354
}
1355
}
1356
}
1357
1358
void java_lang_Class::update_archived_mirror_native_pointers(oop archived_mirror) {
1359
assert(MetaspaceShared::relocation_delta() != 0, "must be");
1360
1361
Klass* k = ((Klass*)archived_mirror->metadata_field(_klass_offset));
1362
archived_mirror->metadata_field_put(_klass_offset,
1363
(Klass*)(address(k) + MetaspaceShared::relocation_delta()));
1364
1365
Klass* ak = ((Klass*)archived_mirror->metadata_field(_array_klass_offset));
1366
if (ak != NULL) {
1367
archived_mirror->metadata_field_put(_array_klass_offset,
1368
(Klass*)(address(ak) + MetaspaceShared::relocation_delta()));
1369
}
1370
}
1371
1372
1373
// Returns true if the mirror is updated, false if no archived mirror
1374
// data is present. After the archived mirror object is restored, the
1375
// shared klass' _has_raw_archived_mirror flag is cleared.
1376
bool java_lang_Class::restore_archived_mirror(Klass *k,
1377
Handle class_loader, Handle module,
1378
Handle protection_domain, TRAPS) {
1379
// Postpone restoring archived mirror until java.lang.Class is loaded. Please
1380
// see more details in vmClasses::resolve_all().
1381
if (!vmClasses::Class_klass_loaded()) {
1382
assert(fixup_mirror_list() != NULL, "fixup_mirror_list not initialized");
1383
fixup_mirror_list()->push(k);
1384
return true;
1385
}
1386
1387
oop m = k->archived_java_mirror();
1388
assert(m != NULL, "must have stored non-null archived mirror");
1389
1390
// Sanity: clear it now to prevent re-initialization if any of the following fails
1391
k->clear_archived_mirror_index();
1392
1393
// mirror is archived, restore
1394
log_debug(cds, mirror)("Archived mirror is: " PTR_FORMAT, p2i(m));
1395
assert(HeapShared::is_archived_object(m), "must be archived mirror object");
1396
assert(as_Klass(m) == k, "must be");
1397
Handle mirror(THREAD, m);
1398
1399
if (!k->is_array_klass()) {
1400
// - local static final fields with initial values were initialized at dump time
1401
1402
// create the init_lock
1403
typeArrayOop r = oopFactory::new_typeArray(T_INT, 0, CHECK_(false));
1404
set_init_lock(mirror(), r);
1405
1406
if (protection_domain.not_null()) {
1407
set_protection_domain(mirror(), protection_domain());
1408
}
1409
}
1410
1411
assert(class_loader() == k->class_loader(), "should be same");
1412
if (class_loader.not_null()) {
1413
set_class_loader(mirror(), class_loader());
1414
}
1415
1416
k->set_java_mirror(mirror);
1417
1418
set_mirror_module_field(THREAD, k, mirror, module);
1419
1420
if (log_is_enabled(Trace, cds, heap, mirror)) {
1421
ResourceMark rm(THREAD);
1422
log_trace(cds, heap, mirror)(
1423
"Restored %s archived mirror " PTR_FORMAT, k->external_name(), p2i(mirror()));
1424
}
1425
1426
return true;
1427
}
1428
#endif // INCLUDE_CDS_JAVA_HEAP
1429
1430
void java_lang_Class::fixup_module_field(Klass* k, Handle module) {
1431
assert(_module_offset != 0, "must have been computed already");
1432
java_lang_Class::set_module(k->java_mirror(), module());
1433
}
1434
1435
int java_lang_Class::oop_size(oop java_class) {
1436
assert(_oop_size_offset != 0, "must be set");
1437
int size = java_class->int_field(_oop_size_offset);
1438
assert(size > 0, "Oop size must be greater than zero, not %d", size);
1439
return size;
1440
}
1441
1442
1443
void java_lang_Class::set_oop_size(HeapWord* java_class, int size) {
1444
assert(_oop_size_offset != 0, "must be set");
1445
assert(size > 0, "Oop size must be greater than zero, not %d", size);
1446
*(int*)(((char*)java_class) + _oop_size_offset) = size;
1447
}
1448
1449
int java_lang_Class::static_oop_field_count(oop java_class) {
1450
assert(_static_oop_field_count_offset != 0, "must be set");
1451
return java_class->int_field(_static_oop_field_count_offset);
1452
}
1453
1454
int java_lang_Class::static_oop_field_count_raw(oop java_class) {
1455
assert(_static_oop_field_count_offset != 0, "must be set");
1456
return java_class->int_field_raw(_static_oop_field_count_offset);
1457
}
1458
1459
void java_lang_Class::set_static_oop_field_count(oop java_class, int size) {
1460
assert(_static_oop_field_count_offset != 0, "must be set");
1461
java_class->int_field_put(_static_oop_field_count_offset, size);
1462
}
1463
1464
oop java_lang_Class::protection_domain(oop java_class) {
1465
assert(_protection_domain_offset != 0, "must be set");
1466
return java_class->obj_field(_protection_domain_offset);
1467
}
1468
void java_lang_Class::set_protection_domain(oop java_class, oop pd) {
1469
assert(_protection_domain_offset != 0, "must be set");
1470
java_class->obj_field_put(_protection_domain_offset, pd);
1471
}
1472
1473
void java_lang_Class::set_component_mirror(oop java_class, oop comp_mirror) {
1474
assert(_component_mirror_offset != 0, "must be set");
1475
java_class->obj_field_put(_component_mirror_offset, comp_mirror);
1476
}
1477
oop java_lang_Class::component_mirror(oop java_class) {
1478
assert(_component_mirror_offset != 0, "must be set");
1479
return java_class->obj_field(_component_mirror_offset);
1480
}
1481
1482
oop java_lang_Class::init_lock(oop java_class) {
1483
assert(_init_lock_offset != 0, "must be set");
1484
return java_class->obj_field(_init_lock_offset);
1485
}
1486
void java_lang_Class::set_init_lock(oop java_class, oop init_lock) {
1487
assert(_init_lock_offset != 0, "must be set");
1488
java_class->obj_field_put(_init_lock_offset, init_lock);
1489
}
1490
1491
objArrayOop java_lang_Class::signers(oop java_class) {
1492
assert(_signers_offset != 0, "must be set");
1493
return (objArrayOop)java_class->obj_field(_signers_offset);
1494
}
1495
void java_lang_Class::set_signers(oop java_class, objArrayOop signers) {
1496
assert(_signers_offset != 0, "must be set");
1497
java_class->obj_field_put(_signers_offset, signers);
1498
}
1499
1500
oop java_lang_Class::class_data(oop java_class) {
1501
assert(_classData_offset != 0, "must be set");
1502
return java_class->obj_field(_classData_offset);
1503
}
1504
void java_lang_Class::set_class_data(oop java_class, oop class_data) {
1505
assert(_classData_offset != 0, "must be set");
1506
java_class->obj_field_put(_classData_offset, class_data);
1507
}
1508
1509
void java_lang_Class::set_class_loader(oop java_class, oop loader) {
1510
assert(_class_loader_offset != 0, "offsets should have been initialized");
1511
java_class->obj_field_put(_class_loader_offset, loader);
1512
}
1513
1514
oop java_lang_Class::class_loader(oop java_class) {
1515
assert(_class_loader_offset != 0, "must be set");
1516
return java_class->obj_field(_class_loader_offset);
1517
}
1518
1519
oop java_lang_Class::module(oop java_class) {
1520
assert(_module_offset != 0, "must be set");
1521
return java_class->obj_field(_module_offset);
1522
}
1523
1524
void java_lang_Class::set_module(oop java_class, oop module) {
1525
assert(_module_offset != 0, "must be set");
1526
java_class->obj_field_put(_module_offset, module);
1527
}
1528
1529
oop java_lang_Class::name(Handle java_class, TRAPS) {
1530
assert(_name_offset != 0, "must be set");
1531
oop o = java_class->obj_field(_name_offset);
1532
if (o == NULL) {
1533
o = StringTable::intern(java_lang_Class::as_external_name(java_class()), THREAD);
1534
java_class->obj_field_put(_name_offset, o);
1535
}
1536
return o;
1537
}
1538
1539
oop java_lang_Class::source_file(oop java_class) {
1540
assert(_source_file_offset != 0, "must be set");
1541
return java_class->obj_field(_source_file_offset);
1542
}
1543
1544
void java_lang_Class::set_source_file(oop java_class, oop source_file) {
1545
assert(_source_file_offset != 0, "must be set");
1546
java_class->obj_field_put(_source_file_offset, source_file);
1547
}
1548
1549
oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS) {
1550
// This should be improved by adding a field at the Java level or by
1551
// introducing a new VM klass (see comment in ClassFileParser)
1552
oop java_class = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(NULL, CHECK_NULL);
1553
if (type != T_VOID) {
1554
Klass* aklass = Universe::typeArrayKlassObj(type);
1555
assert(aklass != NULL, "correct bootstrap");
1556
release_set_array_klass(java_class, aklass);
1557
}
1558
#ifdef ASSERT
1559
InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(vmClasses::Class_klass());
1560
assert(java_lang_Class::static_oop_field_count(java_class) == 0, "should have been zeroed by allocation");
1561
#endif
1562
return java_class;
1563
}
1564
1565
1566
Klass* java_lang_Class::as_Klass_raw(oop java_class) {
1567
//%note memory_2
1568
assert(java_lang_Class::is_instance(java_class), "must be a Class object");
1569
Klass* k = ((Klass*)java_class->metadata_field_raw(_klass_offset));
1570
assert(k == NULL || k->is_klass(), "type check");
1571
return k;
1572
}
1573
1574
1575
void java_lang_Class::set_klass(oop java_class, Klass* klass) {
1576
assert(java_lang_Class::is_instance(java_class), "must be a Class object");
1577
java_class->metadata_field_put(_klass_offset, klass);
1578
}
1579
1580
1581
void java_lang_Class::print_signature(oop java_class, outputStream* st) {
1582
assert(java_lang_Class::is_instance(java_class), "must be a Class object");
1583
Symbol* name = NULL;
1584
bool is_instance = false;
1585
if (is_primitive(java_class)) {
1586
name = vmSymbols::type_signature(primitive_type(java_class));
1587
} else {
1588
Klass* k = as_Klass(java_class);
1589
is_instance = k->is_instance_klass();
1590
name = k->name();
1591
}
1592
if (name == NULL) {
1593
st->print("<null>");
1594
return;
1595
}
1596
if (is_instance) st->print("L");
1597
st->write((char*) name->base(), (int) name->utf8_length());
1598
if (is_instance) st->print(";");
1599
}
1600
1601
Symbol* java_lang_Class::as_signature(oop java_class, bool intern_if_not_found) {
1602
assert(java_lang_Class::is_instance(java_class), "must be a Class object");
1603
Symbol* name;
1604
if (is_primitive(java_class)) {
1605
name = vmSymbols::type_signature(primitive_type(java_class));
1606
// Because this can create a new symbol, the caller has to decrement
1607
// the refcount, so make adjustment here and below for symbols returned
1608
// that are not created or incremented due to a successful lookup.
1609
name->increment_refcount();
1610
} else {
1611
Klass* k = as_Klass(java_class);
1612
if (!k->is_instance_klass()) {
1613
name = k->name();
1614
name->increment_refcount();
1615
} else {
1616
ResourceMark rm;
1617
const char* sigstr = k->signature_name();
1618
int siglen = (int) strlen(sigstr);
1619
if (!intern_if_not_found) {
1620
name = SymbolTable::probe(sigstr, siglen);
1621
} else {
1622
name = SymbolTable::new_symbol(sigstr, siglen);
1623
}
1624
}
1625
}
1626
return name;
1627
}
1628
1629
// Returns the Java name for this Java mirror (Resource allocated)
1630
// See Klass::external_name().
1631
// For primitive type Java mirrors, its type name is returned.
1632
const char* java_lang_Class::as_external_name(oop java_class) {
1633
assert(java_lang_Class::is_instance(java_class), "must be a Class object");
1634
const char* name = NULL;
1635
if (is_primitive(java_class)) {
1636
name = type2name(primitive_type(java_class));
1637
} else {
1638
name = as_Klass(java_class)->external_name();
1639
}
1640
if (name == NULL) {
1641
name = "<null>";
1642
}
1643
return name;
1644
}
1645
1646
Klass* java_lang_Class::array_klass_acquire(oop java_class) {
1647
Klass* k = ((Klass*)java_class->metadata_field_acquire(_array_klass_offset));
1648
assert(k == NULL || k->is_klass() && k->is_array_klass(), "should be array klass");
1649
return k;
1650
}
1651
1652
1653
void java_lang_Class::release_set_array_klass(oop java_class, Klass* klass) {
1654
assert(klass->is_klass() && klass->is_array_klass(), "should be array klass");
1655
java_class->release_metadata_field_put(_array_klass_offset, klass);
1656
}
1657
1658
1659
BasicType java_lang_Class::primitive_type(oop java_class) {
1660
assert(java_lang_Class::is_primitive(java_class), "just checking");
1661
Klass* ak = ((Klass*)java_class->metadata_field(_array_klass_offset));
1662
BasicType type = T_VOID;
1663
if (ak != NULL) {
1664
// Note: create_basic_type_mirror above initializes ak to a non-null value.
1665
type = ArrayKlass::cast(ak)->element_type();
1666
} else {
1667
assert(java_class == Universe::void_mirror(), "only valid non-array primitive");
1668
}
1669
assert(Universe::java_mirror(type) == java_class, "must be consistent");
1670
return type;
1671
}
1672
1673
BasicType java_lang_Class::as_BasicType(oop java_class, Klass** reference_klass) {
1674
assert(java_lang_Class::is_instance(java_class), "must be a Class object");
1675
if (is_primitive(java_class)) {
1676
if (reference_klass != NULL)
1677
(*reference_klass) = NULL;
1678
return primitive_type(java_class);
1679
} else {
1680
if (reference_klass != NULL)
1681
(*reference_klass) = as_Klass(java_class);
1682
return T_OBJECT;
1683
}
1684
}
1685
1686
1687
oop java_lang_Class::primitive_mirror(BasicType t) {
1688
oop mirror = Universe::java_mirror(t);
1689
assert(mirror != NULL && mirror->is_a(vmClasses::Class_klass()), "must be a Class");
1690
assert(java_lang_Class::is_primitive(mirror), "must be primitive");
1691
return mirror;
1692
}
1693
1694
#define CLASS_FIELDS_DO(macro) \
1695
macro(_classRedefinedCount_offset, k, "classRedefinedCount", int_signature, false); \
1696
macro(_class_loader_offset, k, "classLoader", classloader_signature, false); \
1697
macro(_component_mirror_offset, k, "componentType", class_signature, false); \
1698
macro(_module_offset, k, "module", module_signature, false); \
1699
macro(_name_offset, k, "name", string_signature, false); \
1700
macro(_classData_offset, k, "classData", object_signature, false);
1701
1702
void java_lang_Class::compute_offsets() {
1703
if (_offsets_computed) {
1704
return;
1705
}
1706
1707
_offsets_computed = true;
1708
1709
InstanceKlass* k = vmClasses::Class_klass();
1710
CLASS_FIELDS_DO(FIELD_COMPUTE_OFFSET);
1711
1712
// Init lock is a C union with component_mirror. Only instanceKlass mirrors have
1713
// init_lock and only ArrayKlass mirrors have component_mirror. Since both are oops
1714
// GC treats them the same.
1715
_init_lock_offset = _component_mirror_offset;
1716
1717
CLASS_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
1718
}
1719
1720
#if INCLUDE_CDS
1721
void java_lang_Class::serialize_offsets(SerializeClosure* f) {
1722
f->do_bool(&_offsets_computed);
1723
f->do_u4((u4*)&_init_lock_offset);
1724
1725
CLASS_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
1726
1727
CLASS_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET);
1728
}
1729
#endif
1730
1731
int java_lang_Class::classRedefinedCount(oop the_class_mirror) {
1732
assert(_classRedefinedCount_offset != 0, "offsets should have been initialized");
1733
return the_class_mirror->int_field(_classRedefinedCount_offset);
1734
}
1735
1736
void java_lang_Class::set_classRedefinedCount(oop the_class_mirror, int value) {
1737
assert(_classRedefinedCount_offset != 0, "offsets should have been initialized");
1738
the_class_mirror->int_field_put(_classRedefinedCount_offset, value);
1739
}
1740
1741
1742
// Note: JDK1.1 and before had a privateInfo_offset field which was used for the
1743
// platform thread structure, and a eetop offset which was used for thread
1744
// local storage (and unused by the HotSpot VM). In JDK1.2 the two structures
1745
// merged, so in the HotSpot VM we just use the eetop field for the thread
1746
// instead of the privateInfo_offset.
1747
//
1748
// Note: The stackSize field is only present starting in 1.4.
1749
1750
int java_lang_Thread::_name_offset;
1751
int java_lang_Thread::_group_offset;
1752
int java_lang_Thread::_contextClassLoader_offset;
1753
int java_lang_Thread::_inheritedAccessControlContext_offset;
1754
int java_lang_Thread::_priority_offset;
1755
int java_lang_Thread::_eetop_offset;
1756
int java_lang_Thread::_interrupted_offset;
1757
int java_lang_Thread::_daemon_offset;
1758
int java_lang_Thread::_stillborn_offset;
1759
int java_lang_Thread::_stackSize_offset;
1760
int java_lang_Thread::_tid_offset;
1761
int java_lang_Thread::_thread_status_offset;
1762
int java_lang_Thread::_park_blocker_offset;
1763
1764
#define THREAD_FIELDS_DO(macro) \
1765
macro(_name_offset, k, vmSymbols::name_name(), string_signature, false); \
1766
macro(_group_offset, k, vmSymbols::group_name(), threadgroup_signature, false); \
1767
macro(_contextClassLoader_offset, k, vmSymbols::contextClassLoader_name(), classloader_signature, false); \
1768
macro(_inheritedAccessControlContext_offset, k, vmSymbols::inheritedAccessControlContext_name(), accesscontrolcontext_signature, false); \
1769
macro(_priority_offset, k, vmSymbols::priority_name(), int_signature, false); \
1770
macro(_daemon_offset, k, vmSymbols::daemon_name(), bool_signature, false); \
1771
macro(_eetop_offset, k, "eetop", long_signature, false); \
1772
macro(_interrupted_offset, k, "interrupted", bool_signature, false); \
1773
macro(_stillborn_offset, k, "stillborn", bool_signature, false); \
1774
macro(_stackSize_offset, k, "stackSize", long_signature, false); \
1775
macro(_tid_offset, k, "tid", long_signature, false); \
1776
macro(_thread_status_offset, k, "threadStatus", int_signature, false); \
1777
macro(_park_blocker_offset, k, "parkBlocker", object_signature, false)
1778
1779
void java_lang_Thread::compute_offsets() {
1780
assert(_group_offset == 0, "offsets should be initialized only once");
1781
1782
InstanceKlass* k = vmClasses::Thread_klass();
1783
THREAD_FIELDS_DO(FIELD_COMPUTE_OFFSET);
1784
}
1785
1786
#if INCLUDE_CDS
1787
void java_lang_Thread::serialize_offsets(SerializeClosure* f) {
1788
THREAD_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
1789
}
1790
#endif
1791
1792
JavaThread* java_lang_Thread::thread(oop java_thread) {
1793
return (JavaThread*)java_thread->address_field(_eetop_offset);
1794
}
1795
1796
1797
void java_lang_Thread::set_thread(oop java_thread, JavaThread* thread) {
1798
java_thread->address_field_put(_eetop_offset, (address)thread);
1799
}
1800
1801
bool java_lang_Thread::interrupted(oop java_thread) {
1802
// Make sure the caller can safely access oops.
1803
assert(Thread::current()->is_VM_thread() ||
1804
(JavaThread::current()->thread_state() != _thread_blocked &&
1805
JavaThread::current()->thread_state() != _thread_in_native),
1806
"Unsafe access to oop");
1807
return java_thread->bool_field_volatile(_interrupted_offset);
1808
}
1809
1810
void java_lang_Thread::set_interrupted(oop java_thread, bool val) {
1811
// Make sure the caller can safely access oops.
1812
assert(Thread::current()->is_VM_thread() ||
1813
(JavaThread::current()->thread_state() != _thread_blocked &&
1814
JavaThread::current()->thread_state() != _thread_in_native),
1815
"Unsafe access to oop");
1816
java_thread->bool_field_put_volatile(_interrupted_offset, val);
1817
}
1818
1819
1820
oop java_lang_Thread::name(oop java_thread) {
1821
return java_thread->obj_field(_name_offset);
1822
}
1823
1824
1825
void java_lang_Thread::set_name(oop java_thread, oop name) {
1826
java_thread->obj_field_put(_name_offset, name);
1827
}
1828
1829
1830
ThreadPriority java_lang_Thread::priority(oop java_thread) {
1831
return (ThreadPriority)java_thread->int_field(_priority_offset);
1832
}
1833
1834
1835
void java_lang_Thread::set_priority(oop java_thread, ThreadPriority priority) {
1836
java_thread->int_field_put(_priority_offset, priority);
1837
}
1838
1839
1840
oop java_lang_Thread::threadGroup(oop java_thread) {
1841
return java_thread->obj_field(_group_offset);
1842
}
1843
1844
1845
bool java_lang_Thread::is_stillborn(oop java_thread) {
1846
return java_thread->bool_field(_stillborn_offset) != 0;
1847
}
1848
1849
1850
// We never have reason to turn the stillborn bit off
1851
void java_lang_Thread::set_stillborn(oop java_thread) {
1852
java_thread->bool_field_put(_stillborn_offset, true);
1853
}
1854
1855
1856
bool java_lang_Thread::is_alive(oop java_thread) {
1857
JavaThread* thr = java_lang_Thread::thread(java_thread);
1858
return (thr != NULL);
1859
}
1860
1861
1862
bool java_lang_Thread::is_daemon(oop java_thread) {
1863
return java_thread->bool_field(_daemon_offset) != 0;
1864
}
1865
1866
1867
void java_lang_Thread::set_daemon(oop java_thread) {
1868
java_thread->bool_field_put(_daemon_offset, true);
1869
}
1870
1871
oop java_lang_Thread::context_class_loader(oop java_thread) {
1872
return java_thread->obj_field(_contextClassLoader_offset);
1873
}
1874
1875
oop java_lang_Thread::inherited_access_control_context(oop java_thread) {
1876
return java_thread->obj_field(_inheritedAccessControlContext_offset);
1877
}
1878
1879
1880
jlong java_lang_Thread::stackSize(oop java_thread) {
1881
return java_thread->long_field(_stackSize_offset);
1882
}
1883
1884
// Write the thread status value to threadStatus field in java.lang.Thread java class.
1885
void java_lang_Thread::set_thread_status(oop java_thread,
1886
JavaThreadStatus status) {
1887
java_thread->int_field_put(_thread_status_offset, static_cast<int>(status));
1888
}
1889
1890
// Read thread status value from threadStatus field in java.lang.Thread java class.
1891
JavaThreadStatus java_lang_Thread::get_thread_status(oop java_thread) {
1892
// Make sure the caller is operating on behalf of the VM or is
1893
// running VM code (state == _thread_in_vm).
1894
assert(Threads_lock->owned_by_self() || Thread::current()->is_VM_thread() ||
1895
JavaThread::current()->thread_state() == _thread_in_vm,
1896
"Java Thread is not running in vm");
1897
return static_cast<JavaThreadStatus>(java_thread->int_field(_thread_status_offset));
1898
}
1899
1900
1901
jlong java_lang_Thread::thread_id(oop java_thread) {
1902
return java_thread->long_field(_tid_offset);
1903
}
1904
1905
oop java_lang_Thread::park_blocker(oop java_thread) {
1906
return java_thread->obj_field(_park_blocker_offset);
1907
}
1908
1909
const char* java_lang_Thread::thread_status_name(oop java_thread) {
1910
JavaThreadStatus status = static_cast<JavaThreadStatus>(java_thread->int_field(_thread_status_offset));
1911
switch (status) {
1912
case JavaThreadStatus::NEW : return "NEW";
1913
case JavaThreadStatus::RUNNABLE : return "RUNNABLE";
1914
case JavaThreadStatus::SLEEPING : return "TIMED_WAITING (sleeping)";
1915
case JavaThreadStatus::IN_OBJECT_WAIT : return "WAITING (on object monitor)";
1916
case JavaThreadStatus::IN_OBJECT_WAIT_TIMED : return "TIMED_WAITING (on object monitor)";
1917
case JavaThreadStatus::PARKED : return "WAITING (parking)";
1918
case JavaThreadStatus::PARKED_TIMED : return "TIMED_WAITING (parking)";
1919
case JavaThreadStatus::BLOCKED_ON_MONITOR_ENTER : return "BLOCKED (on object monitor)";
1920
case JavaThreadStatus::TERMINATED : return "TERMINATED";
1921
default : return "UNKNOWN";
1922
};
1923
}
1924
int java_lang_ThreadGroup::_parent_offset;
1925
int java_lang_ThreadGroup::_name_offset;
1926
int java_lang_ThreadGroup::_threads_offset;
1927
int java_lang_ThreadGroup::_groups_offset;
1928
int java_lang_ThreadGroup::_maxPriority_offset;
1929
int java_lang_ThreadGroup::_destroyed_offset;
1930
int java_lang_ThreadGroup::_daemon_offset;
1931
int java_lang_ThreadGroup::_nthreads_offset;
1932
int java_lang_ThreadGroup::_ngroups_offset;
1933
1934
oop java_lang_ThreadGroup::parent(oop java_thread_group) {
1935
assert(oopDesc::is_oop(java_thread_group), "thread group must be oop");
1936
return java_thread_group->obj_field(_parent_offset);
1937
}
1938
1939
// ("name as oop" accessor is not necessary)
1940
1941
const char* java_lang_ThreadGroup::name(oop java_thread_group) {
1942
oop name = java_thread_group->obj_field(_name_offset);
1943
// ThreadGroup.name can be null
1944
if (name != NULL) {
1945
return java_lang_String::as_utf8_string(name);
1946
}
1947
return NULL;
1948
}
1949
1950
int java_lang_ThreadGroup::nthreads(oop java_thread_group) {
1951
assert(oopDesc::is_oop(java_thread_group), "thread group must be oop");
1952
return java_thread_group->int_field(_nthreads_offset);
1953
}
1954
1955
objArrayOop java_lang_ThreadGroup::threads(oop java_thread_group) {
1956
oop threads = java_thread_group->obj_field(_threads_offset);
1957
assert(threads != NULL, "threadgroups should have threads");
1958
assert(threads->is_objArray(), "just checking"); // Todo: Add better type checking code
1959
return objArrayOop(threads);
1960
}
1961
1962
int java_lang_ThreadGroup::ngroups(oop java_thread_group) {
1963
assert(oopDesc::is_oop(java_thread_group), "thread group must be oop");
1964
return java_thread_group->int_field(_ngroups_offset);
1965
}
1966
1967
objArrayOop java_lang_ThreadGroup::groups(oop java_thread_group) {
1968
oop groups = java_thread_group->obj_field(_groups_offset);
1969
assert(groups == NULL || groups->is_objArray(), "just checking"); // Todo: Add better type checking code
1970
return objArrayOop(groups);
1971
}
1972
1973
ThreadPriority java_lang_ThreadGroup::maxPriority(oop java_thread_group) {
1974
assert(oopDesc::is_oop(java_thread_group), "thread group must be oop");
1975
return (ThreadPriority) java_thread_group->int_field(_maxPriority_offset);
1976
}
1977
1978
bool java_lang_ThreadGroup::is_destroyed(oop java_thread_group) {
1979
assert(oopDesc::is_oop(java_thread_group), "thread group must be oop");
1980
return java_thread_group->bool_field(_destroyed_offset) != 0;
1981
}
1982
1983
bool java_lang_ThreadGroup::is_daemon(oop java_thread_group) {
1984
assert(oopDesc::is_oop(java_thread_group), "thread group must be oop");
1985
return java_thread_group->bool_field(_daemon_offset) != 0;
1986
}
1987
1988
#define THREADGROUP_FIELDS_DO(macro) \
1989
macro(_parent_offset, k, vmSymbols::parent_name(), threadgroup_signature, false); \
1990
macro(_name_offset, k, vmSymbols::name_name(), string_signature, false); \
1991
macro(_threads_offset, k, vmSymbols::threads_name(), thread_array_signature, false); \
1992
macro(_groups_offset, k, vmSymbols::groups_name(), threadgroup_array_signature, false); \
1993
macro(_maxPriority_offset, k, vmSymbols::maxPriority_name(), int_signature, false); \
1994
macro(_destroyed_offset, k, vmSymbols::destroyed_name(), bool_signature, false); \
1995
macro(_daemon_offset, k, vmSymbols::daemon_name(), bool_signature, false); \
1996
macro(_nthreads_offset, k, vmSymbols::nthreads_name(), int_signature, false); \
1997
macro(_ngroups_offset, k, vmSymbols::ngroups_name(), int_signature, false)
1998
1999
void java_lang_ThreadGroup::compute_offsets() {
2000
assert(_parent_offset == 0, "offsets should be initialized only once");
2001
2002
InstanceKlass* k = vmClasses::ThreadGroup_klass();
2003
THREADGROUP_FIELDS_DO(FIELD_COMPUTE_OFFSET);
2004
}
2005
2006
#if INCLUDE_CDS
2007
void java_lang_ThreadGroup::serialize_offsets(SerializeClosure* f) {
2008
THREADGROUP_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
2009
}
2010
#endif
2011
2012
// java_lang_Throwable
2013
2014
int java_lang_Throwable::_backtrace_offset;
2015
int java_lang_Throwable::_detailMessage_offset;
2016
int java_lang_Throwable::_stackTrace_offset;
2017
int java_lang_Throwable::_depth_offset;
2018
int java_lang_Throwable::_cause_offset;
2019
int java_lang_Throwable::_static_unassigned_stacktrace_offset;
2020
2021
#define THROWABLE_FIELDS_DO(macro) \
2022
macro(_backtrace_offset, k, "backtrace", object_signature, false); \
2023
macro(_detailMessage_offset, k, "detailMessage", string_signature, false); \
2024
macro(_stackTrace_offset, k, "stackTrace", java_lang_StackTraceElement_array, false); \
2025
macro(_depth_offset, k, "depth", int_signature, false); \
2026
macro(_cause_offset, k, "cause", throwable_signature, false); \
2027
macro(_static_unassigned_stacktrace_offset, k, "UNASSIGNED_STACK", java_lang_StackTraceElement_array, true)
2028
2029
void java_lang_Throwable::compute_offsets() {
2030
InstanceKlass* k = vmClasses::Throwable_klass();
2031
THROWABLE_FIELDS_DO(FIELD_COMPUTE_OFFSET);
2032
}
2033
2034
#if INCLUDE_CDS
2035
void java_lang_Throwable::serialize_offsets(SerializeClosure* f) {
2036
THROWABLE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
2037
}
2038
#endif
2039
2040
oop java_lang_Throwable::unassigned_stacktrace() {
2041
InstanceKlass* ik = vmClasses::Throwable_klass();
2042
oop base = ik->static_field_base_raw();
2043
return base->obj_field(_static_unassigned_stacktrace_offset);
2044
}
2045
2046
oop java_lang_Throwable::backtrace(oop throwable) {
2047
return throwable->obj_field_acquire(_backtrace_offset);
2048
}
2049
2050
2051
void java_lang_Throwable::set_backtrace(oop throwable, oop value) {
2052
throwable->release_obj_field_put(_backtrace_offset, value);
2053
}
2054
2055
int java_lang_Throwable::depth(oop throwable) {
2056
return throwable->int_field(_depth_offset);
2057
}
2058
2059
void java_lang_Throwable::set_depth(oop throwable, int value) {
2060
throwable->int_field_put(_depth_offset, value);
2061
}
2062
2063
oop java_lang_Throwable::message(oop throwable) {
2064
return throwable->obj_field(_detailMessage_offset);
2065
}
2066
2067
oop java_lang_Throwable::cause(oop throwable) {
2068
return throwable->obj_field(_cause_offset);
2069
}
2070
2071
// Return Symbol for detailed_message or NULL
2072
Symbol* java_lang_Throwable::detail_message(oop throwable) {
2073
PreserveExceptionMark pm(Thread::current());
2074
oop detailed_message = java_lang_Throwable::message(throwable);
2075
if (detailed_message != NULL) {
2076
return java_lang_String::as_symbol(detailed_message);
2077
}
2078
return NULL;
2079
}
2080
2081
void java_lang_Throwable::set_message(oop throwable, oop value) {
2082
throwable->obj_field_put(_detailMessage_offset, value);
2083
}
2084
2085
2086
void java_lang_Throwable::set_stacktrace(oop throwable, oop st_element_array) {
2087
throwable->obj_field_put(_stackTrace_offset, st_element_array);
2088
}
2089
2090
void java_lang_Throwable::clear_stacktrace(oop throwable) {
2091
set_stacktrace(throwable, NULL);
2092
}
2093
2094
2095
void java_lang_Throwable::print(oop throwable, outputStream* st) {
2096
ResourceMark rm;
2097
Klass* k = throwable->klass();
2098
assert(k != NULL, "just checking");
2099
st->print("%s", k->external_name());
2100
oop msg = message(throwable);
2101
if (msg != NULL) {
2102
st->print(": %s", java_lang_String::as_utf8_string(msg));
2103
}
2104
}
2105
2106
// After this many redefines, the stack trace is unreliable.
2107
const int MAX_VERSION = USHRT_MAX;
2108
2109
static inline bool version_matches(Method* method, int version) {
2110
assert(version < MAX_VERSION, "version is too big");
2111
return method != NULL && (method->constants()->version() == version);
2112
}
2113
2114
// This class provides a simple wrapper over the internal structure of
2115
// exception backtrace to insulate users of the backtrace from needing
2116
// to know what it looks like.
2117
// The code of this class is not GC safe. Allocations can only happen
2118
// in expand().
2119
class BacktraceBuilder: public StackObj {
2120
friend class BacktraceIterator;
2121
private:
2122
Handle _backtrace;
2123
objArrayOop _head;
2124
typeArrayOop _methods;
2125
typeArrayOop _bcis;
2126
objArrayOop _mirrors;
2127
typeArrayOop _names; // Needed to insulate method name against redefinition.
2128
// True if the top frame of the backtrace is omitted because it shall be hidden.
2129
bool _has_hidden_top_frame;
2130
int _index;
2131
NoSafepointVerifier _nsv;
2132
2133
enum {
2134
trace_methods_offset = java_lang_Throwable::trace_methods_offset,
2135
trace_bcis_offset = java_lang_Throwable::trace_bcis_offset,
2136
trace_mirrors_offset = java_lang_Throwable::trace_mirrors_offset,
2137
trace_names_offset = java_lang_Throwable::trace_names_offset,
2138
trace_next_offset = java_lang_Throwable::trace_next_offset,
2139
trace_hidden_offset = java_lang_Throwable::trace_hidden_offset,
2140
trace_size = java_lang_Throwable::trace_size,
2141
trace_chunk_size = java_lang_Throwable::trace_chunk_size
2142
};
2143
2144
// get info out of chunks
2145
static typeArrayOop get_methods(objArrayHandle chunk) {
2146
typeArrayOop methods = typeArrayOop(chunk->obj_at(trace_methods_offset));
2147
assert(methods != NULL, "method array should be initialized in backtrace");
2148
return methods;
2149
}
2150
static typeArrayOop get_bcis(objArrayHandle chunk) {
2151
typeArrayOop bcis = typeArrayOop(chunk->obj_at(trace_bcis_offset));
2152
assert(bcis != NULL, "bci array should be initialized in backtrace");
2153
return bcis;
2154
}
2155
static objArrayOop get_mirrors(objArrayHandle chunk) {
2156
objArrayOop mirrors = objArrayOop(chunk->obj_at(trace_mirrors_offset));
2157
assert(mirrors != NULL, "mirror array should be initialized in backtrace");
2158
return mirrors;
2159
}
2160
static typeArrayOop get_names(objArrayHandle chunk) {
2161
typeArrayOop names = typeArrayOop(chunk->obj_at(trace_names_offset));
2162
assert(names != NULL, "names array should be initialized in backtrace");
2163
return names;
2164
}
2165
static bool has_hidden_top_frame(objArrayHandle chunk) {
2166
oop hidden = chunk->obj_at(trace_hidden_offset);
2167
return hidden != NULL;
2168
}
2169
2170
public:
2171
2172
// constructor for new backtrace
2173
BacktraceBuilder(TRAPS): _head(NULL), _methods(NULL), _bcis(NULL), _mirrors(NULL), _names(NULL), _has_hidden_top_frame(false) {
2174
expand(CHECK);
2175
_backtrace = Handle(THREAD, _head);
2176
_index = 0;
2177
}
2178
2179
BacktraceBuilder(Thread* thread, objArrayHandle backtrace) {
2180
_methods = get_methods(backtrace);
2181
_bcis = get_bcis(backtrace);
2182
_mirrors = get_mirrors(backtrace);
2183
_names = get_names(backtrace);
2184
_has_hidden_top_frame = has_hidden_top_frame(backtrace);
2185
assert(_methods->length() == _bcis->length() &&
2186
_methods->length() == _mirrors->length() &&
2187
_mirrors->length() == _names->length(),
2188
"method and source information arrays should match");
2189
2190
// head is the preallocated backtrace
2191
_head = backtrace();
2192
_backtrace = Handle(thread, _head);
2193
_index = 0;
2194
}
2195
2196
void expand(TRAPS) {
2197
objArrayHandle old_head(THREAD, _head);
2198
PauseNoSafepointVerifier pnsv(&_nsv);
2199
2200
objArrayOop head = oopFactory::new_objectArray(trace_size, CHECK);
2201
objArrayHandle new_head(THREAD, head);
2202
2203
typeArrayOop methods = oopFactory::new_shortArray(trace_chunk_size, CHECK);
2204
typeArrayHandle new_methods(THREAD, methods);
2205
2206
typeArrayOop bcis = oopFactory::new_intArray(trace_chunk_size, CHECK);
2207
typeArrayHandle new_bcis(THREAD, bcis);
2208
2209
objArrayOop mirrors = oopFactory::new_objectArray(trace_chunk_size, CHECK);
2210
objArrayHandle new_mirrors(THREAD, mirrors);
2211
2212
typeArrayOop names = oopFactory::new_symbolArray(trace_chunk_size, CHECK);
2213
typeArrayHandle new_names(THREAD, names);
2214
2215
if (!old_head.is_null()) {
2216
old_head->obj_at_put(trace_next_offset, new_head());
2217
}
2218
new_head->obj_at_put(trace_methods_offset, new_methods());
2219
new_head->obj_at_put(trace_bcis_offset, new_bcis());
2220
new_head->obj_at_put(trace_mirrors_offset, new_mirrors());
2221
new_head->obj_at_put(trace_names_offset, new_names());
2222
new_head->obj_at_put(trace_hidden_offset, NULL);
2223
2224
_head = new_head();
2225
_methods = new_methods();
2226
_bcis = new_bcis();
2227
_mirrors = new_mirrors();
2228
_names = new_names();
2229
_index = 0;
2230
}
2231
2232
oop backtrace() {
2233
return _backtrace();
2234
}
2235
2236
inline void push(Method* method, int bci, TRAPS) {
2237
// Smear the -1 bci to 0 since the array only holds unsigned
2238
// shorts. The later line number lookup would just smear the -1
2239
// to a 0 even if it could be recorded.
2240
if (bci == SynchronizationEntryBCI) bci = 0;
2241
2242
if (_index >= trace_chunk_size) {
2243
methodHandle mhandle(THREAD, method);
2244
expand(CHECK);
2245
method = mhandle();
2246
}
2247
2248
_methods->ushort_at_put(_index, method->orig_method_idnum());
2249
_bcis->int_at_put(_index, Backtrace::merge_bci_and_version(bci, method->constants()->version()));
2250
2251
// Note:this doesn't leak symbols because the mirror in the backtrace keeps the
2252
// klass owning the symbols alive so their refcounts aren't decremented.
2253
Symbol* name = method->name();
2254
_names->symbol_at_put(_index, name);
2255
2256
// We need to save the mirrors in the backtrace to keep the class
2257
// from being unloaded while we still have this stack trace.
2258
assert(method->method_holder()->java_mirror() != NULL, "never push null for mirror");
2259
_mirrors->obj_at_put(_index, method->method_holder()->java_mirror());
2260
_index++;
2261
}
2262
2263
void set_has_hidden_top_frame() {
2264
if (!_has_hidden_top_frame) {
2265
// It would be nice to add java/lang/Boolean::TRUE here
2266
// to indicate that this backtrace has a hidden top frame.
2267
// But this code is used before TRUE is allocated.
2268
// Therefore let's just use an arbitrary legal oop
2269
// available right here. _methods is a short[].
2270
assert(_methods != NULL, "we need a legal oop");
2271
_has_hidden_top_frame = true;
2272
_head->obj_at_put(trace_hidden_offset, _methods);
2273
}
2274
}
2275
};
2276
2277
struct BacktraceElement : public StackObj {
2278
int _method_id;
2279
int _bci;
2280
int _version;
2281
Symbol* _name;
2282
Handle _mirror;
2283
BacktraceElement(Handle mirror, int mid, int version, int bci, Symbol* name) :
2284
_method_id(mid), _bci(bci), _version(version), _name(name), _mirror(mirror) {}
2285
};
2286
2287
class BacktraceIterator : public StackObj {
2288
int _index;
2289
objArrayHandle _result;
2290
objArrayHandle _mirrors;
2291
typeArrayHandle _methods;
2292
typeArrayHandle _bcis;
2293
typeArrayHandle _names;
2294
2295
void init(objArrayHandle result, Thread* thread) {
2296
// Get method id, bci, version and mirror from chunk
2297
_result = result;
2298
if (_result.not_null()) {
2299
_methods = typeArrayHandle(thread, BacktraceBuilder::get_methods(_result));
2300
_bcis = typeArrayHandle(thread, BacktraceBuilder::get_bcis(_result));
2301
_mirrors = objArrayHandle(thread, BacktraceBuilder::get_mirrors(_result));
2302
_names = typeArrayHandle(thread, BacktraceBuilder::get_names(_result));
2303
_index = 0;
2304
}
2305
}
2306
public:
2307
BacktraceIterator(objArrayHandle result, Thread* thread) {
2308
init(result, thread);
2309
assert(_methods.is_null() || _methods->length() == java_lang_Throwable::trace_chunk_size, "lengths don't match");
2310
}
2311
2312
BacktraceElement next(Thread* thread) {
2313
BacktraceElement e (Handle(thread, _mirrors->obj_at(_index)),
2314
_methods->ushort_at(_index),
2315
Backtrace::version_at(_bcis->int_at(_index)),
2316
Backtrace::bci_at(_bcis->int_at(_index)),
2317
_names->symbol_at(_index));
2318
_index++;
2319
2320
if (_index >= java_lang_Throwable::trace_chunk_size) {
2321
int next_offset = java_lang_Throwable::trace_next_offset;
2322
// Get next chunk
2323
objArrayHandle result (thread, objArrayOop(_result->obj_at(next_offset)));
2324
init(result, thread);
2325
}
2326
return e;
2327
}
2328
2329
bool repeat() {
2330
return _result.not_null() && _mirrors->obj_at(_index) != NULL;
2331
}
2332
};
2333
2334
2335
// Print stack trace element to resource allocated buffer
2336
static void print_stack_element_to_stream(outputStream* st, Handle mirror, int method_id,
2337
int version, int bci, Symbol* name) {
2338
ResourceMark rm;
2339
2340
// Get strings and string lengths
2341
InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror()));
2342
const char* klass_name = holder->external_name();
2343
int buf_len = (int)strlen(klass_name);
2344
2345
char* method_name = name->as_C_string();
2346
buf_len += (int)strlen(method_name);
2347
2348
char* source_file_name = NULL;
2349
Symbol* source = Backtrace::get_source_file_name(holder, version);
2350
if (source != NULL) {
2351
source_file_name = source->as_C_string();
2352
buf_len += (int)strlen(source_file_name);
2353
}
2354
2355
char *module_name = NULL, *module_version = NULL;
2356
ModuleEntry* module = holder->module();
2357
if (module->is_named()) {
2358
module_name = module->name()->as_C_string();
2359
buf_len += (int)strlen(module_name);
2360
if (module->version() != NULL) {
2361
module_version = module->version()->as_C_string();
2362
buf_len += (int)strlen(module_version);
2363
}
2364
}
2365
2366
// Allocate temporary buffer with extra space for formatting and line number
2367
char* buf = NEW_RESOURCE_ARRAY(char, buf_len + 64);
2368
2369
// Print stack trace line in buffer
2370
sprintf(buf, "\tat %s.%s(", klass_name, method_name);
2371
2372
// Print module information
2373
if (module_name != NULL) {
2374
if (module_version != NULL) {
2375
sprintf(buf + (int)strlen(buf), "%s@%s/", module_name, module_version);
2376
} else {
2377
sprintf(buf + (int)strlen(buf), "%s/", module_name);
2378
}
2379
}
2380
2381
// The method can be NULL if the requested class version is gone
2382
Method* method = holder->method_with_orig_idnum(method_id, version);
2383
if (!version_matches(method, version)) {
2384
strcat(buf, "Redefined)");
2385
} else {
2386
int line_number = Backtrace::get_line_number(method, bci);
2387
if (line_number == -2) {
2388
strcat(buf, "Native Method)");
2389
} else {
2390
if (source_file_name != NULL && (line_number != -1)) {
2391
// Sourcename and linenumber
2392
sprintf(buf + (int)strlen(buf), "%s:%d)", source_file_name, line_number);
2393
} else if (source_file_name != NULL) {
2394
// Just sourcename
2395
sprintf(buf + (int)strlen(buf), "%s)", source_file_name);
2396
} else {
2397
// Neither sourcename nor linenumber
2398
sprintf(buf + (int)strlen(buf), "Unknown Source)");
2399
}
2400
CompiledMethod* nm = method->code();
2401
if (WizardMode && nm != NULL) {
2402
sprintf(buf + (int)strlen(buf), "(nmethod " INTPTR_FORMAT ")", (intptr_t)nm);
2403
}
2404
}
2405
}
2406
2407
st->print_cr("%s", buf);
2408
}
2409
2410
void java_lang_Throwable::print_stack_element(outputStream *st, Method* method, int bci) {
2411
Handle mirror (Thread::current(), method->method_holder()->java_mirror());
2412
int method_id = method->orig_method_idnum();
2413
int version = method->constants()->version();
2414
print_stack_element_to_stream(st, mirror, method_id, version, bci, method->name());
2415
}
2416
2417
/**
2418
* Print the throwable message and its stack trace plus all causes by walking the
2419
* cause chain. The output looks the same as of Throwable.printStackTrace().
2420
*/
2421
void java_lang_Throwable::print_stack_trace(Handle throwable, outputStream* st) {
2422
// First, print the message.
2423
print(throwable(), st);
2424
st->cr();
2425
2426
// Now print the stack trace.
2427
JavaThread* THREAD = JavaThread::current(); // For exception macros.
2428
while (throwable.not_null()) {
2429
objArrayHandle result (THREAD, objArrayOop(backtrace(throwable())));
2430
if (result.is_null()) {
2431
st->print_raw_cr("\t<<no stack trace available>>");
2432
return;
2433
}
2434
BacktraceIterator iter(result, THREAD);
2435
2436
while (iter.repeat()) {
2437
BacktraceElement bte = iter.next(THREAD);
2438
print_stack_element_to_stream(st, bte._mirror, bte._method_id, bte._version, bte._bci, bte._name);
2439
}
2440
{
2441
// Call getCause() which doesn't necessarily return the _cause field.
2442
ExceptionMark em(THREAD);
2443
JavaValue cause(T_OBJECT);
2444
JavaCalls::call_virtual(&cause,
2445
throwable,
2446
throwable->klass(),
2447
vmSymbols::getCause_name(),
2448
vmSymbols::void_throwable_signature(),
2449
THREAD);
2450
// Ignore any exceptions. we are in the middle of exception handling. Same as classic VM.
2451
if (HAS_PENDING_EXCEPTION) {
2452
CLEAR_PENDING_EXCEPTION;
2453
throwable = Handle();
2454
} else {
2455
throwable = Handle(THREAD, cause.get_oop());
2456
if (throwable.not_null()) {
2457
st->print("Caused by: ");
2458
print(throwable(), st);
2459
st->cr();
2460
}
2461
}
2462
}
2463
}
2464
}
2465
2466
/**
2467
* Print the throwable stack trace by calling the Java method java.lang.Throwable.printStackTrace().
2468
*/
2469
void java_lang_Throwable::java_printStackTrace(Handle throwable, TRAPS) {
2470
assert(throwable->is_a(vmClasses::Throwable_klass()), "Throwable instance expected");
2471
JavaValue result(T_VOID);
2472
JavaCalls::call_virtual(&result,
2473
throwable,
2474
vmClasses::Throwable_klass(),
2475
vmSymbols::printStackTrace_name(),
2476
vmSymbols::void_method_signature(),
2477
THREAD);
2478
}
2479
2480
void java_lang_Throwable::fill_in_stack_trace(Handle throwable, const methodHandle& method, TRAPS) {
2481
if (!StackTraceInThrowable) return;
2482
ResourceMark rm(THREAD);
2483
2484
// Start out by clearing the backtrace for this object, in case the VM
2485
// runs out of memory while allocating the stack trace
2486
set_backtrace(throwable(), NULL);
2487
// Clear lazily constructed Java level stacktrace if refilling occurs
2488
// This is unnecessary in 1.7+ but harmless
2489
clear_stacktrace(throwable());
2490
2491
int max_depth = MaxJavaStackTraceDepth;
2492
JavaThread* thread = THREAD;
2493
2494
BacktraceBuilder bt(CHECK);
2495
2496
// If there is no Java frame just return the method that was being called
2497
// with bci 0
2498
if (!thread->has_last_Java_frame()) {
2499
if (max_depth >= 1 && method() != NULL) {
2500
bt.push(method(), 0, CHECK);
2501
log_info(stacktrace)("%s, %d", throwable->klass()->external_name(), 1);
2502
set_depth(throwable(), 1);
2503
set_backtrace(throwable(), bt.backtrace());
2504
}
2505
return;
2506
}
2507
2508
// Instead of using vframe directly, this version of fill_in_stack_trace
2509
// basically handles everything by hand. This significantly improved the
2510
// speed of this method call up to 28.5% on Solaris sparc. 27.1% on Windows.
2511
// See bug 6333838 for more details.
2512
// The "ASSERT" here is to verify this method generates the exactly same stack
2513
// trace as utilizing vframe.
2514
#ifdef ASSERT
2515
vframeStream st(thread, false /* stop_at_java_call_stub */, false /* process_frames */);
2516
#endif
2517
int total_count = 0;
2518
RegisterMap map(thread, false /* update */, false /* process_frames */);
2519
int decode_offset = 0;
2520
CompiledMethod* nm = NULL;
2521
bool skip_fillInStackTrace_check = false;
2522
bool skip_throwableInit_check = false;
2523
bool skip_hidden = !ShowHiddenFrames;
2524
2525
for (frame fr = thread->last_frame(); max_depth == 0 || max_depth != total_count;) {
2526
Method* method = NULL;
2527
int bci = 0;
2528
2529
// Compiled java method case.
2530
if (decode_offset != 0) {
2531
DebugInfoReadStream stream(nm, decode_offset);
2532
decode_offset = stream.read_int();
2533
method = (Method*)nm->metadata_at(stream.read_int());
2534
bci = stream.read_bci();
2535
} else {
2536
if (fr.is_first_frame()) break;
2537
address pc = fr.pc();
2538
if (fr.is_interpreted_frame()) {
2539
address bcp = fr.interpreter_frame_bcp();
2540
method = fr.interpreter_frame_method();
2541
bci = method->bci_from(bcp);
2542
fr = fr.sender(&map);
2543
} else {
2544
CodeBlob* cb = fr.cb();
2545
// HMMM QQQ might be nice to have frame return nm as NULL if cb is non-NULL
2546
// but non nmethod
2547
fr = fr.sender(&map);
2548
if (cb == NULL || !cb->is_compiled()) {
2549
continue;
2550
}
2551
nm = cb->as_compiled_method();
2552
if (nm->method()->is_native()) {
2553
method = nm->method();
2554
bci = 0;
2555
} else {
2556
PcDesc* pd = nm->pc_desc_at(pc);
2557
decode_offset = pd->scope_decode_offset();
2558
// if decode_offset is not equal to 0, it will execute the
2559
// "compiled java method case" at the beginning of the loop.
2560
continue;
2561
}
2562
}
2563
}
2564
#ifdef ASSERT
2565
assert(st.method() == method && st.bci() == bci,
2566
"Wrong stack trace");
2567
st.next();
2568
#endif
2569
2570
// the format of the stacktrace will be:
2571
// - 1 or more fillInStackTrace frames for the exception class (skipped)
2572
// - 0 or more <init> methods for the exception class (skipped)
2573
// - rest of the stack
2574
2575
if (!skip_fillInStackTrace_check) {
2576
if (method->name() == vmSymbols::fillInStackTrace_name() &&
2577
throwable->is_a(method->method_holder())) {
2578
continue;
2579
}
2580
else {
2581
skip_fillInStackTrace_check = true; // gone past them all
2582
}
2583
}
2584
if (!skip_throwableInit_check) {
2585
assert(skip_fillInStackTrace_check, "logic error in backtrace filtering");
2586
2587
// skip <init> methods of the exception class and superclasses
2588
// This is simlar to classic VM.
2589
if (method->name() == vmSymbols::object_initializer_name() &&
2590
throwable->is_a(method->method_holder())) {
2591
continue;
2592
} else {
2593
// there are none or we've seen them all - either way stop checking
2594
skip_throwableInit_check = true;
2595
}
2596
}
2597
if (method->is_hidden()) {
2598
if (skip_hidden) {
2599
if (total_count == 0) {
2600
// The top frame will be hidden from the stack trace.
2601
bt.set_has_hidden_top_frame();
2602
}
2603
continue;
2604
}
2605
}
2606
bt.push(method, bci, CHECK);
2607
total_count++;
2608
}
2609
2610
log_info(stacktrace)("%s, %d", throwable->klass()->external_name(), total_count);
2611
2612
// Put completed stack trace into throwable object
2613
set_backtrace(throwable(), bt.backtrace());
2614
set_depth(throwable(), total_count);
2615
}
2616
2617
void java_lang_Throwable::fill_in_stack_trace(Handle throwable, const methodHandle& method) {
2618
// No-op if stack trace is disabled
2619
if (!StackTraceInThrowable) {
2620
return;
2621
}
2622
2623
// Disable stack traces for some preallocated out of memory errors
2624
if (!Universe::should_fill_in_stack_trace(throwable)) {
2625
return;
2626
}
2627
2628
JavaThread* THREAD = JavaThread::current(); // For exception macros.
2629
PreserveExceptionMark pm(THREAD);
2630
2631
fill_in_stack_trace(throwable, method, THREAD);
2632
// Ignore exceptions thrown during stack trace filling (OOM) and reinstall the
2633
// original exception via the PreserveExceptionMark destructor.
2634
CLEAR_PENDING_EXCEPTION;
2635
}
2636
2637
void java_lang_Throwable::allocate_backtrace(Handle throwable, TRAPS) {
2638
// Allocate stack trace - backtrace is created but not filled in
2639
2640
// No-op if stack trace is disabled
2641
if (!StackTraceInThrowable) return;
2642
BacktraceBuilder bt(CHECK); // creates a backtrace
2643
set_backtrace(throwable(), bt.backtrace());
2644
}
2645
2646
2647
void java_lang_Throwable::fill_in_stack_trace_of_preallocated_backtrace(Handle throwable) {
2648
// Fill in stack trace into preallocated backtrace (no GC)
2649
2650
// No-op if stack trace is disabled
2651
if (!StackTraceInThrowable) return;
2652
2653
assert(throwable->is_a(vmClasses::Throwable_klass()), "sanity check");
2654
2655
JavaThread* THREAD = JavaThread::current(); // For exception macros.
2656
2657
objArrayHandle backtrace (THREAD, (objArrayOop)java_lang_Throwable::backtrace(throwable()));
2658
assert(backtrace.not_null(), "backtrace should have been preallocated");
2659
2660
ResourceMark rm(THREAD);
2661
vframeStream st(THREAD, false /* stop_at_java_call_stub */, false /* process_frames */);
2662
2663
BacktraceBuilder bt(THREAD, backtrace);
2664
2665
// Unlike fill_in_stack_trace we do not skip fillInStackTrace or throwable init
2666
// methods as preallocated errors aren't created by "java" code.
2667
2668
// fill in as much stack trace as possible
2669
int chunk_count = 0;
2670
for (;!st.at_end(); st.next()) {
2671
bt.push(st.method(), st.bci(), CHECK);
2672
chunk_count++;
2673
2674
// Bail-out for deep stacks
2675
if (chunk_count >= trace_chunk_size) break;
2676
}
2677
set_depth(throwable(), chunk_count);
2678
log_info(stacktrace)("%s, %d", throwable->klass()->external_name(), chunk_count);
2679
2680
// We support the Throwable immutability protocol defined for Java 7.
2681
java_lang_Throwable::set_stacktrace(throwable(), java_lang_Throwable::unassigned_stacktrace());
2682
assert(java_lang_Throwable::unassigned_stacktrace() != NULL, "not initialized");
2683
}
2684
2685
void java_lang_Throwable::get_stack_trace_elements(Handle throwable,
2686
objArrayHandle stack_trace_array_h, TRAPS) {
2687
2688
if (throwable.is_null() || stack_trace_array_h.is_null()) {
2689
THROW(vmSymbols::java_lang_NullPointerException());
2690
}
2691
2692
assert(stack_trace_array_h->is_objArray(), "Stack trace array should be an array of StackTraceElenent");
2693
2694
if (stack_trace_array_h->length() != depth(throwable())) {
2695
THROW(vmSymbols::java_lang_IndexOutOfBoundsException());
2696
}
2697
2698
objArrayHandle result(THREAD, objArrayOop(backtrace(throwable())));
2699
BacktraceIterator iter(result, THREAD);
2700
2701
int index = 0;
2702
while (iter.repeat()) {
2703
BacktraceElement bte = iter.next(THREAD);
2704
2705
Handle stack_trace_element(THREAD, stack_trace_array_h->obj_at(index++));
2706
2707
if (stack_trace_element.is_null()) {
2708
THROW(vmSymbols::java_lang_NullPointerException());
2709
}
2710
2711
InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(bte._mirror()));
2712
methodHandle method (THREAD, holder->method_with_orig_idnum(bte._method_id, bte._version));
2713
2714
java_lang_StackTraceElement::fill_in(stack_trace_element, holder,
2715
method,
2716
bte._version,
2717
bte._bci,
2718
bte._name, CHECK);
2719
}
2720
}
2721
2722
bool java_lang_Throwable::get_top_method_and_bci(oop throwable, Method** method, int* bci) {
2723
JavaThread* current = JavaThread::current();
2724
objArrayHandle result(current, objArrayOop(backtrace(throwable)));
2725
BacktraceIterator iter(result, current);
2726
// No backtrace available.
2727
if (!iter.repeat()) return false;
2728
2729
// If the exception happened in a frame that has been hidden, i.e.,
2730
// omitted from the back trace, we can not compute the message.
2731
oop hidden = ((objArrayOop)backtrace(throwable))->obj_at(trace_hidden_offset);
2732
if (hidden != NULL) {
2733
return false;
2734
}
2735
2736
// Get first backtrace element.
2737
BacktraceElement bte = iter.next(current);
2738
2739
InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(bte._mirror()));
2740
assert(holder != NULL, "first element should be non-null");
2741
Method* m = holder->method_with_orig_idnum(bte._method_id, bte._version);
2742
2743
// Original version is no longer available.
2744
if (m == NULL || !version_matches(m, bte._version)) {
2745
return false;
2746
}
2747
2748
*method = m;
2749
*bci = bte._bci;
2750
return true;
2751
}
2752
2753
oop java_lang_StackTraceElement::create(const methodHandle& method, int bci, TRAPS) {
2754
// Allocate java.lang.StackTraceElement instance
2755
InstanceKlass* k = vmClasses::StackTraceElement_klass();
2756
assert(k != NULL, "must be loaded in 1.4+");
2757
if (k->should_be_initialized()) {
2758
k->initialize(CHECK_NULL);
2759
}
2760
2761
Handle element = k->allocate_instance_handle(CHECK_NULL);
2762
2763
int version = method->constants()->version();
2764
fill_in(element, method->method_holder(), method, version, bci, method->name(), CHECK_NULL);
2765
return element();
2766
}
2767
2768
void java_lang_StackTraceElement::fill_in(Handle element,
2769
InstanceKlass* holder, const methodHandle& method,
2770
int version, int bci, Symbol* name, TRAPS) {
2771
assert(element->is_a(vmClasses::StackTraceElement_klass()), "sanity check");
2772
2773
ResourceMark rm(THREAD);
2774
HandleMark hm(THREAD);
2775
2776
// Fill in class name
2777
Handle java_class(THREAD, holder->java_mirror());
2778
oop classname = java_lang_Class::name(java_class, CHECK);
2779
java_lang_StackTraceElement::set_declaringClass(element(), classname);
2780
java_lang_StackTraceElement::set_declaringClassObject(element(), java_class());
2781
2782
oop loader = holder->class_loader();
2783
if (loader != NULL) {
2784
oop loader_name = java_lang_ClassLoader::name(loader);
2785
if (loader_name != NULL)
2786
java_lang_StackTraceElement::set_classLoaderName(element(), loader_name);
2787
}
2788
2789
// Fill in method name
2790
oop methodname = StringTable::intern(name, CHECK);
2791
java_lang_StackTraceElement::set_methodName(element(), methodname);
2792
2793
// Fill in module name and version
2794
ModuleEntry* module = holder->module();
2795
if (module->is_named()) {
2796
oop module_name = StringTable::intern(module->name(), CHECK);
2797
java_lang_StackTraceElement::set_moduleName(element(), module_name);
2798
oop module_version;
2799
if (module->version() != NULL) {
2800
module_version = StringTable::intern(module->version(), CHECK);
2801
} else {
2802
module_version = NULL;
2803
}
2804
java_lang_StackTraceElement::set_moduleVersion(element(), module_version);
2805
}
2806
2807
if (method() == NULL || !version_matches(method(), version)) {
2808
// The method was redefined, accurate line number information isn't available
2809
java_lang_StackTraceElement::set_fileName(element(), NULL);
2810
java_lang_StackTraceElement::set_lineNumber(element(), -1);
2811
} else {
2812
Symbol* source;
2813
oop source_file;
2814
int line_number;
2815
decode_file_and_line(java_class, holder, version, method, bci, source, source_file, line_number, CHECK);
2816
2817
java_lang_StackTraceElement::set_fileName(element(), source_file);
2818
java_lang_StackTraceElement::set_lineNumber(element(), line_number);
2819
}
2820
}
2821
2822
void java_lang_StackTraceElement::decode_file_and_line(Handle java_class,
2823
InstanceKlass* holder,
2824
int version,
2825
const methodHandle& method,
2826
int bci,
2827
Symbol*& source,
2828
oop& source_file,
2829
int& line_number, TRAPS) {
2830
// Fill in source file name and line number.
2831
source = Backtrace::get_source_file_name(holder, version);
2832
source_file = java_lang_Class::source_file(java_class());
2833
if (source != NULL) {
2834
// Class was not redefined. We can trust its cache if set,
2835
// else we have to initialize it.
2836
if (source_file == NULL) {
2837
source_file = StringTable::intern(source, CHECK);
2838
java_lang_Class::set_source_file(java_class(), source_file);
2839
}
2840
} else {
2841
// Class was redefined. Dump the cache if it was set.
2842
if (source_file != NULL) {
2843
source_file = NULL;
2844
java_lang_Class::set_source_file(java_class(), source_file);
2845
}
2846
}
2847
line_number = Backtrace::get_line_number(method(), bci);
2848
}
2849
2850
#if INCLUDE_JVMCI
2851
void java_lang_StackTraceElement::decode(const methodHandle& method, int bci,
2852
Symbol*& filename, int& line_number, TRAPS) {
2853
ResourceMark rm(THREAD);
2854
HandleMark hm(THREAD);
2855
2856
filename = NULL;
2857
line_number = -1;
2858
2859
oop source_file;
2860
int version = method->constants()->version();
2861
InstanceKlass* holder = method->method_holder();
2862
Handle java_class(THREAD, holder->java_mirror());
2863
decode_file_and_line(java_class, holder, version, method, bci, filename, source_file, line_number, CHECK);
2864
}
2865
#endif // INCLUDE_JVMCI
2866
2867
// java_lang_StackFrameInfo
2868
2869
int java_lang_StackFrameInfo::_memberName_offset;
2870
int java_lang_StackFrameInfo::_bci_offset;
2871
int java_lang_StackFrameInfo::_version_offset;
2872
2873
#define STACKFRAMEINFO_FIELDS_DO(macro) \
2874
macro(_memberName_offset, k, "memberName", object_signature, false); \
2875
macro(_bci_offset, k, "bci", int_signature, false)
2876
2877
void java_lang_StackFrameInfo::compute_offsets() {
2878
InstanceKlass* k = vmClasses::StackFrameInfo_klass();
2879
STACKFRAMEINFO_FIELDS_DO(FIELD_COMPUTE_OFFSET);
2880
STACKFRAMEINFO_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
2881
}
2882
2883
#if INCLUDE_CDS
2884
void java_lang_StackFrameInfo::serialize_offsets(SerializeClosure* f) {
2885
STACKFRAMEINFO_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
2886
STACKFRAMEINFO_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET);
2887
}
2888
#endif
2889
2890
Method* java_lang_StackFrameInfo::get_method(Handle stackFrame, InstanceKlass* holder, TRAPS) {
2891
HandleMark hm(THREAD);
2892
Handle mname(THREAD, stackFrame->obj_field(_memberName_offset));
2893
Method* method = (Method*)java_lang_invoke_MemberName::vmtarget(mname());
2894
// we should expand MemberName::name when Throwable uses StackTrace
2895
// MethodHandles::expand_MemberName(mname, MethodHandles::_suppress_defc|MethodHandles::_suppress_type, CHECK_NULL);
2896
return method;
2897
}
2898
2899
void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci, TRAPS) {
2900
// set Method* or mid/cpref
2901
HandleMark hm(THREAD);
2902
Handle mname(THREAD, stackFrame->obj_field(_memberName_offset));
2903
InstanceKlass* ik = method->method_holder();
2904
CallInfo info(method(), ik, CHECK);
2905
MethodHandles::init_method_MemberName(mname, info);
2906
// set bci
2907
java_lang_StackFrameInfo::set_bci(stackFrame(), bci);
2908
// method may be redefined; store the version
2909
int version = method->constants()->version();
2910
assert((jushort)version == version, "version should be short");
2911
java_lang_StackFrameInfo::set_version(stackFrame(), (short)version);
2912
}
2913
2914
void java_lang_StackFrameInfo::to_stack_trace_element(Handle stackFrame, Handle stack_trace_element, TRAPS) {
2915
ResourceMark rm(THREAD);
2916
HandleMark hm(THREAD);
2917
Handle mname(THREAD, stackFrame->obj_field(java_lang_StackFrameInfo::_memberName_offset));
2918
Klass* clazz = java_lang_Class::as_Klass(java_lang_invoke_MemberName::clazz(mname()));
2919
InstanceKlass* holder = InstanceKlass::cast(clazz);
2920
Method* method = java_lang_StackFrameInfo::get_method(stackFrame, holder, CHECK);
2921
2922
short version = stackFrame->short_field(_version_offset);
2923
int bci = stackFrame->int_field(_bci_offset);
2924
Symbol* name = method->name();
2925
java_lang_StackTraceElement::fill_in(stack_trace_element, holder, methodHandle(THREAD, method),
2926
version, bci, name, CHECK);
2927
}
2928
2929
void java_lang_StackFrameInfo::set_version(oop element, short value) {
2930
element->short_field_put(_version_offset, value);
2931
}
2932
2933
void java_lang_StackFrameInfo::set_bci(oop element, int value) {
2934
assert(value >= 0 && value < max_jushort, "must be a valid bci value");
2935
element->int_field_put(_bci_offset, value);
2936
}
2937
2938
int java_lang_LiveStackFrameInfo::_monitors_offset;
2939
int java_lang_LiveStackFrameInfo::_locals_offset;
2940
int java_lang_LiveStackFrameInfo::_operands_offset;
2941
int java_lang_LiveStackFrameInfo::_mode_offset;
2942
2943
#define LIVESTACKFRAMEINFO_FIELDS_DO(macro) \
2944
macro(_monitors_offset, k, "monitors", object_array_signature, false); \
2945
macro(_locals_offset, k, "locals", object_array_signature, false); \
2946
macro(_operands_offset, k, "operands", object_array_signature, false); \
2947
macro(_mode_offset, k, "mode", int_signature, false)
2948
2949
void java_lang_LiveStackFrameInfo::compute_offsets() {
2950
InstanceKlass* k = vmClasses::LiveStackFrameInfo_klass();
2951
LIVESTACKFRAMEINFO_FIELDS_DO(FIELD_COMPUTE_OFFSET);
2952
}
2953
2954
#if INCLUDE_CDS
2955
void java_lang_LiveStackFrameInfo::serialize_offsets(SerializeClosure* f) {
2956
LIVESTACKFRAMEINFO_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
2957
}
2958
#endif
2959
2960
void java_lang_LiveStackFrameInfo::set_monitors(oop element, oop value) {
2961
element->obj_field_put(_monitors_offset, value);
2962
}
2963
2964
void java_lang_LiveStackFrameInfo::set_locals(oop element, oop value) {
2965
element->obj_field_put(_locals_offset, value);
2966
}
2967
2968
void java_lang_LiveStackFrameInfo::set_operands(oop element, oop value) {
2969
element->obj_field_put(_operands_offset, value);
2970
}
2971
2972
void java_lang_LiveStackFrameInfo::set_mode(oop element, int value) {
2973
element->int_field_put(_mode_offset, value);
2974
}
2975
2976
2977
// java_lang_AccessibleObject
2978
2979
int java_lang_reflect_AccessibleObject::_override_offset;
2980
2981
#define ACCESSIBLEOBJECT_FIELDS_DO(macro) \
2982
macro(_override_offset, k, "override", bool_signature, false)
2983
2984
void java_lang_reflect_AccessibleObject::compute_offsets() {
2985
InstanceKlass* k = vmClasses::reflect_AccessibleObject_klass();
2986
ACCESSIBLEOBJECT_FIELDS_DO(FIELD_COMPUTE_OFFSET);
2987
}
2988
2989
#if INCLUDE_CDS
2990
void java_lang_reflect_AccessibleObject::serialize_offsets(SerializeClosure* f) {
2991
ACCESSIBLEOBJECT_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
2992
}
2993
#endif
2994
2995
jboolean java_lang_reflect_AccessibleObject::override(oop reflect) {
2996
return (jboolean) reflect->bool_field(_override_offset);
2997
}
2998
2999
void java_lang_reflect_AccessibleObject::set_override(oop reflect, jboolean value) {
3000
reflect->bool_field_put(_override_offset, (int) value);
3001
}
3002
3003
// java_lang_reflect_Method
3004
3005
int java_lang_reflect_Method::_clazz_offset;
3006
int java_lang_reflect_Method::_name_offset;
3007
int java_lang_reflect_Method::_returnType_offset;
3008
int java_lang_reflect_Method::_parameterTypes_offset;
3009
int java_lang_reflect_Method::_exceptionTypes_offset;
3010
int java_lang_reflect_Method::_slot_offset;
3011
int java_lang_reflect_Method::_modifiers_offset;
3012
int java_lang_reflect_Method::_signature_offset;
3013
int java_lang_reflect_Method::_annotations_offset;
3014
int java_lang_reflect_Method::_parameter_annotations_offset;
3015
int java_lang_reflect_Method::_annotation_default_offset;
3016
3017
#define METHOD_FIELDS_DO(macro) \
3018
macro(_clazz_offset, k, vmSymbols::clazz_name(), class_signature, false); \
3019
macro(_name_offset, k, vmSymbols::name_name(), string_signature, false); \
3020
macro(_returnType_offset, k, vmSymbols::returnType_name(), class_signature, false); \
3021
macro(_parameterTypes_offset, k, vmSymbols::parameterTypes_name(), class_array_signature, false); \
3022
macro(_exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), class_array_signature, false); \
3023
macro(_slot_offset, k, vmSymbols::slot_name(), int_signature, false); \
3024
macro(_modifiers_offset, k, vmSymbols::modifiers_name(), int_signature, false); \
3025
macro(_signature_offset, k, vmSymbols::signature_name(), string_signature, false); \
3026
macro(_annotations_offset, k, vmSymbols::annotations_name(), byte_array_signature, false); \
3027
macro(_parameter_annotations_offset, k, vmSymbols::parameter_annotations_name(), byte_array_signature, false); \
3028
macro(_annotation_default_offset, k, vmSymbols::annotation_default_name(), byte_array_signature, false);
3029
3030
void java_lang_reflect_Method::compute_offsets() {
3031
InstanceKlass* k = vmClasses::reflect_Method_klass();
3032
METHOD_FIELDS_DO(FIELD_COMPUTE_OFFSET);
3033
}
3034
3035
#if INCLUDE_CDS
3036
void java_lang_reflect_Method::serialize_offsets(SerializeClosure* f) {
3037
METHOD_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
3038
}
3039
#endif
3040
3041
Handle java_lang_reflect_Method::create(TRAPS) {
3042
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
3043
Klass* klass = vmClasses::reflect_Method_klass();
3044
// This class is eagerly initialized during VM initialization, since we keep a refence
3045
// to one of the methods
3046
assert(InstanceKlass::cast(klass)->is_initialized(), "must be initialized");
3047
return InstanceKlass::cast(klass)->allocate_instance_handle(THREAD);
3048
}
3049
3050
oop java_lang_reflect_Method::clazz(oop reflect) {
3051
return reflect->obj_field(_clazz_offset);
3052
}
3053
3054
void java_lang_reflect_Method::set_clazz(oop reflect, oop value) {
3055
reflect->obj_field_put(_clazz_offset, value);
3056
}
3057
3058
int java_lang_reflect_Method::slot(oop reflect) {
3059
return reflect->int_field(_slot_offset);
3060
}
3061
3062
void java_lang_reflect_Method::set_slot(oop reflect, int value) {
3063
reflect->int_field_put(_slot_offset, value);
3064
}
3065
3066
void java_lang_reflect_Method::set_name(oop method, oop value) {
3067
method->obj_field_put(_name_offset, value);
3068
}
3069
3070
oop java_lang_reflect_Method::return_type(oop method) {
3071
return method->obj_field(_returnType_offset);
3072
}
3073
3074
void java_lang_reflect_Method::set_return_type(oop method, oop value) {
3075
method->obj_field_put(_returnType_offset, value);
3076
}
3077
3078
oop java_lang_reflect_Method::parameter_types(oop method) {
3079
return method->obj_field(_parameterTypes_offset);
3080
}
3081
3082
void java_lang_reflect_Method::set_parameter_types(oop method, oop value) {
3083
method->obj_field_put(_parameterTypes_offset, value);
3084
}
3085
3086
void java_lang_reflect_Method::set_exception_types(oop method, oop value) {
3087
method->obj_field_put(_exceptionTypes_offset, value);
3088
}
3089
3090
void java_lang_reflect_Method::set_modifiers(oop method, int value) {
3091
method->int_field_put(_modifiers_offset, value);
3092
}
3093
3094
void java_lang_reflect_Method::set_signature(oop method, oop value) {
3095
method->obj_field_put(_signature_offset, value);
3096
}
3097
3098
void java_lang_reflect_Method::set_annotations(oop method, oop value) {
3099
method->obj_field_put(_annotations_offset, value);
3100
}
3101
3102
void java_lang_reflect_Method::set_parameter_annotations(oop method, oop value) {
3103
method->obj_field_put(_parameter_annotations_offset, value);
3104
}
3105
3106
void java_lang_reflect_Method::set_annotation_default(oop method, oop value) {
3107
method->obj_field_put(_annotation_default_offset, value);
3108
}
3109
3110
int java_lang_reflect_Constructor::_clazz_offset;
3111
int java_lang_reflect_Constructor::_parameterTypes_offset;
3112
int java_lang_reflect_Constructor::_exceptionTypes_offset;
3113
int java_lang_reflect_Constructor::_slot_offset;
3114
int java_lang_reflect_Constructor::_modifiers_offset;
3115
int java_lang_reflect_Constructor::_signature_offset;
3116
int java_lang_reflect_Constructor::_annotations_offset;
3117
int java_lang_reflect_Constructor::_parameter_annotations_offset;
3118
3119
#define CONSTRUCTOR_FIELDS_DO(macro) \
3120
macro(_clazz_offset, k, vmSymbols::clazz_name(), class_signature, false); \
3121
macro(_parameterTypes_offset, k, vmSymbols::parameterTypes_name(), class_array_signature, false); \
3122
macro(_exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), class_array_signature, false); \
3123
macro(_slot_offset, k, vmSymbols::slot_name(), int_signature, false); \
3124
macro(_modifiers_offset, k, vmSymbols::modifiers_name(), int_signature, false); \
3125
macro(_signature_offset, k, vmSymbols::signature_name(), string_signature, false); \
3126
macro(_annotations_offset, k, vmSymbols::annotations_name(), byte_array_signature, false); \
3127
macro(_parameter_annotations_offset, k, vmSymbols::parameter_annotations_name(), byte_array_signature, false);
3128
3129
void java_lang_reflect_Constructor::compute_offsets() {
3130
InstanceKlass* k = vmClasses::reflect_Constructor_klass();
3131
CONSTRUCTOR_FIELDS_DO(FIELD_COMPUTE_OFFSET);
3132
}
3133
3134
#if INCLUDE_CDS
3135
void java_lang_reflect_Constructor::serialize_offsets(SerializeClosure* f) {
3136
CONSTRUCTOR_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
3137
}
3138
#endif
3139
3140
Handle java_lang_reflect_Constructor::create(TRAPS) {
3141
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
3142
Symbol* name = vmSymbols::java_lang_reflect_Constructor();
3143
Klass* k = SystemDictionary::resolve_or_fail(name, true, CHECK_NH);
3144
InstanceKlass* ik = InstanceKlass::cast(k);
3145
// Ensure it is initialized
3146
ik->initialize(CHECK_NH);
3147
return ik->allocate_instance_handle(THREAD);
3148
}
3149
3150
oop java_lang_reflect_Constructor::clazz(oop reflect) {
3151
return reflect->obj_field(_clazz_offset);
3152
}
3153
3154
void java_lang_reflect_Constructor::set_clazz(oop reflect, oop value) {
3155
reflect->obj_field_put(_clazz_offset, value);
3156
}
3157
3158
oop java_lang_reflect_Constructor::parameter_types(oop constructor) {
3159
return constructor->obj_field(_parameterTypes_offset);
3160
}
3161
3162
void java_lang_reflect_Constructor::set_parameter_types(oop constructor, oop value) {
3163
constructor->obj_field_put(_parameterTypes_offset, value);
3164
}
3165
3166
void java_lang_reflect_Constructor::set_exception_types(oop constructor, oop value) {
3167
constructor->obj_field_put(_exceptionTypes_offset, value);
3168
}
3169
3170
int java_lang_reflect_Constructor::slot(oop reflect) {
3171
return reflect->int_field(_slot_offset);
3172
}
3173
3174
void java_lang_reflect_Constructor::set_slot(oop reflect, int value) {
3175
reflect->int_field_put(_slot_offset, value);
3176
}
3177
3178
void java_lang_reflect_Constructor::set_modifiers(oop constructor, int value) {
3179
constructor->int_field_put(_modifiers_offset, value);
3180
}
3181
3182
void java_lang_reflect_Constructor::set_signature(oop constructor, oop value) {
3183
constructor->obj_field_put(_signature_offset, value);
3184
}
3185
3186
void java_lang_reflect_Constructor::set_annotations(oop constructor, oop value) {
3187
constructor->obj_field_put(_annotations_offset, value);
3188
}
3189
3190
void java_lang_reflect_Constructor::set_parameter_annotations(oop method, oop value) {
3191
method->obj_field_put(_parameter_annotations_offset, value);
3192
}
3193
3194
int java_lang_reflect_Field::_clazz_offset;
3195
int java_lang_reflect_Field::_name_offset;
3196
int java_lang_reflect_Field::_type_offset;
3197
int java_lang_reflect_Field::_slot_offset;
3198
int java_lang_reflect_Field::_modifiers_offset;
3199
int java_lang_reflect_Field::_trusted_final_offset;
3200
int java_lang_reflect_Field::_signature_offset;
3201
int java_lang_reflect_Field::_annotations_offset;
3202
3203
#define FIELD_FIELDS_DO(macro) \
3204
macro(_clazz_offset, k, vmSymbols::clazz_name(), class_signature, false); \
3205
macro(_name_offset, k, vmSymbols::name_name(), string_signature, false); \
3206
macro(_type_offset, k, vmSymbols::type_name(), class_signature, false); \
3207
macro(_slot_offset, k, vmSymbols::slot_name(), int_signature, false); \
3208
macro(_modifiers_offset, k, vmSymbols::modifiers_name(), int_signature, false); \
3209
macro(_trusted_final_offset, k, vmSymbols::trusted_final_name(), bool_signature, false); \
3210
macro(_signature_offset, k, vmSymbols::signature_name(), string_signature, false); \
3211
macro(_annotations_offset, k, vmSymbols::annotations_name(), byte_array_signature, false);
3212
3213
void java_lang_reflect_Field::compute_offsets() {
3214
InstanceKlass* k = vmClasses::reflect_Field_klass();
3215
FIELD_FIELDS_DO(FIELD_COMPUTE_OFFSET);
3216
}
3217
3218
#if INCLUDE_CDS
3219
void java_lang_reflect_Field::serialize_offsets(SerializeClosure* f) {
3220
FIELD_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
3221
}
3222
#endif
3223
3224
Handle java_lang_reflect_Field::create(TRAPS) {
3225
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
3226
Symbol* name = vmSymbols::java_lang_reflect_Field();
3227
Klass* k = SystemDictionary::resolve_or_fail(name, true, CHECK_NH);
3228
InstanceKlass* ik = InstanceKlass::cast(k);
3229
// Ensure it is initialized
3230
ik->initialize(CHECK_NH);
3231
return ik->allocate_instance_handle(THREAD);
3232
}
3233
3234
oop java_lang_reflect_Field::clazz(oop reflect) {
3235
return reflect->obj_field(_clazz_offset);
3236
}
3237
3238
void java_lang_reflect_Field::set_clazz(oop reflect, oop value) {
3239
reflect->obj_field_put(_clazz_offset, value);
3240
}
3241
3242
oop java_lang_reflect_Field::name(oop field) {
3243
return field->obj_field(_name_offset);
3244
}
3245
3246
void java_lang_reflect_Field::set_name(oop field, oop value) {
3247
field->obj_field_put(_name_offset, value);
3248
}
3249
3250
oop java_lang_reflect_Field::type(oop field) {
3251
return field->obj_field(_type_offset);
3252
}
3253
3254
void java_lang_reflect_Field::set_type(oop field, oop value) {
3255
field->obj_field_put(_type_offset, value);
3256
}
3257
3258
int java_lang_reflect_Field::slot(oop reflect) {
3259
return reflect->int_field(_slot_offset);
3260
}
3261
3262
void java_lang_reflect_Field::set_slot(oop reflect, int value) {
3263
reflect->int_field_put(_slot_offset, value);
3264
}
3265
3266
int java_lang_reflect_Field::modifiers(oop field) {
3267
return field->int_field(_modifiers_offset);
3268
}
3269
3270
void java_lang_reflect_Field::set_modifiers(oop field, int value) {
3271
field->int_field_put(_modifiers_offset, value);
3272
}
3273
3274
void java_lang_reflect_Field::set_trusted_final(oop field) {
3275
field->bool_field_put(_trusted_final_offset, true);
3276
}
3277
3278
void java_lang_reflect_Field::set_signature(oop field, oop value) {
3279
field->obj_field_put(_signature_offset, value);
3280
}
3281
3282
void java_lang_reflect_Field::set_annotations(oop field, oop value) {
3283
field->obj_field_put(_annotations_offset, value);
3284
}
3285
3286
oop java_lang_reflect_RecordComponent::create(InstanceKlass* holder, RecordComponent* component, TRAPS) {
3287
// Allocate java.lang.reflect.RecordComponent instance
3288
HandleMark hm(THREAD);
3289
InstanceKlass* ik = vmClasses::RecordComponent_klass();
3290
assert(ik != NULL, "must be loaded");
3291
ik->initialize(CHECK_NULL);
3292
3293
Handle element = ik->allocate_instance_handle(CHECK_NULL);
3294
3295
Handle decl_class(THREAD, holder->java_mirror());
3296
java_lang_reflect_RecordComponent::set_clazz(element(), decl_class());
3297
3298
Symbol* name = holder->constants()->symbol_at(component->name_index()); // name_index is a utf8
3299
oop component_name = StringTable::intern(name, CHECK_NULL);
3300
java_lang_reflect_RecordComponent::set_name(element(), component_name);
3301
3302
Symbol* type = holder->constants()->symbol_at(component->descriptor_index());
3303
Handle component_type_h =
3304
SystemDictionary::find_java_mirror_for_type(type, holder, SignatureStream::NCDFError, CHECK_NULL);
3305
java_lang_reflect_RecordComponent::set_type(element(), component_type_h());
3306
3307
Method* accessor_method = NULL;
3308
{
3309
// Prepend "()" to type to create the full method signature.
3310
ResourceMark rm(THREAD);
3311
int sig_len = type->utf8_length() + 3; // "()" and null char
3312
char* sig = NEW_RESOURCE_ARRAY(char, sig_len);
3313
jio_snprintf(sig, sig_len, "%c%c%s", JVM_SIGNATURE_FUNC, JVM_SIGNATURE_ENDFUNC, type->as_C_string());
3314
TempNewSymbol full_sig = SymbolTable::new_symbol(sig);
3315
accessor_method = holder->find_instance_method(name, full_sig, Klass::PrivateLookupMode::find);
3316
}
3317
3318
if (accessor_method != NULL) {
3319
methodHandle method(THREAD, accessor_method);
3320
oop m = Reflection::new_method(method, false, CHECK_NULL);
3321
java_lang_reflect_RecordComponent::set_accessor(element(), m);
3322
} else {
3323
java_lang_reflect_RecordComponent::set_accessor(element(), NULL);
3324
}
3325
3326
int sig_index = component->generic_signature_index();
3327
if (sig_index > 0) {
3328
Symbol* sig = holder->constants()->symbol_at(sig_index); // sig_index is a utf8
3329
oop component_sig = StringTable::intern(sig, CHECK_NULL);
3330
java_lang_reflect_RecordComponent::set_signature(element(), component_sig);
3331
} else {
3332
java_lang_reflect_RecordComponent::set_signature(element(), NULL);
3333
}
3334
3335
typeArrayOop annotation_oop = Annotations::make_java_array(component->annotations(), CHECK_NULL);
3336
java_lang_reflect_RecordComponent::set_annotations(element(), annotation_oop);
3337
3338
typeArrayOop type_annotation_oop = Annotations::make_java_array(component->type_annotations(), CHECK_NULL);
3339
java_lang_reflect_RecordComponent::set_typeAnnotations(element(), type_annotation_oop);
3340
3341
return element();
3342
}
3343
3344
int reflect_ConstantPool::_oop_offset;
3345
3346
#define CONSTANTPOOL_FIELDS_DO(macro) \
3347
macro(_oop_offset, k, "constantPoolOop", object_signature, false)
3348
3349
void reflect_ConstantPool::compute_offsets() {
3350
InstanceKlass* k = vmClasses::reflect_ConstantPool_klass();
3351
// The field is called ConstantPool* in the sun.reflect.ConstantPool class.
3352
CONSTANTPOOL_FIELDS_DO(FIELD_COMPUTE_OFFSET);
3353
}
3354
3355
#if INCLUDE_CDS
3356
void reflect_ConstantPool::serialize_offsets(SerializeClosure* f) {
3357
CONSTANTPOOL_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
3358
}
3359
#endif
3360
3361
int java_lang_reflect_Parameter::_name_offset;
3362
int java_lang_reflect_Parameter::_modifiers_offset;
3363
int java_lang_reflect_Parameter::_index_offset;
3364
int java_lang_reflect_Parameter::_executable_offset;
3365
3366
#define PARAMETER_FIELDS_DO(macro) \
3367
macro(_name_offset, k, vmSymbols::name_name(), string_signature, false); \
3368
macro(_modifiers_offset, k, vmSymbols::modifiers_name(), int_signature, false); \
3369
macro(_index_offset, k, vmSymbols::index_name(), int_signature, false); \
3370
macro(_executable_offset, k, vmSymbols::executable_name(), executable_signature, false)
3371
3372
void java_lang_reflect_Parameter::compute_offsets() {
3373
InstanceKlass* k = vmClasses::reflect_Parameter_klass();
3374
PARAMETER_FIELDS_DO(FIELD_COMPUTE_OFFSET);
3375
}
3376
3377
#if INCLUDE_CDS
3378
void java_lang_reflect_Parameter::serialize_offsets(SerializeClosure* f) {
3379
PARAMETER_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
3380
}
3381
#endif
3382
3383
Handle java_lang_reflect_Parameter::create(TRAPS) {
3384
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
3385
Symbol* name = vmSymbols::java_lang_reflect_Parameter();
3386
Klass* k = SystemDictionary::resolve_or_fail(name, true, CHECK_NH);
3387
InstanceKlass* ik = InstanceKlass::cast(k);
3388
// Ensure it is initialized
3389
ik->initialize(CHECK_NH);
3390
return ik->allocate_instance_handle(THREAD);
3391
}
3392
3393
oop java_lang_reflect_Parameter::name(oop param) {
3394
return param->obj_field(_name_offset);
3395
}
3396
3397
void java_lang_reflect_Parameter::set_name(oop param, oop value) {
3398
param->obj_field_put(_name_offset, value);
3399
}
3400
3401
int java_lang_reflect_Parameter::modifiers(oop param) {
3402
return param->int_field(_modifiers_offset);
3403
}
3404
3405
void java_lang_reflect_Parameter::set_modifiers(oop param, int value) {
3406
param->int_field_put(_modifiers_offset, value);
3407
}
3408
3409
int java_lang_reflect_Parameter::index(oop param) {
3410
return param->int_field(_index_offset);
3411
}
3412
3413
void java_lang_reflect_Parameter::set_index(oop param, int value) {
3414
param->int_field_put(_index_offset, value);
3415
}
3416
3417
oop java_lang_reflect_Parameter::executable(oop param) {
3418
return param->obj_field(_executable_offset);
3419
}
3420
3421
void java_lang_reflect_Parameter::set_executable(oop param, oop value) {
3422
param->obj_field_put(_executable_offset, value);
3423
}
3424
3425
// java_lang_Module
3426
3427
int java_lang_Module::_loader_offset;
3428
int java_lang_Module::_name_offset;
3429
int java_lang_Module::_module_entry_offset;
3430
3431
Handle java_lang_Module::create(Handle loader, Handle module_name, TRAPS) {
3432
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
3433
return JavaCalls::construct_new_instance(vmClasses::Module_klass(),
3434
vmSymbols::java_lang_module_init_signature(),
3435
loader, module_name, CHECK_NH);
3436
}
3437
3438
#define MODULE_FIELDS_DO(macro) \
3439
macro(_loader_offset, k, vmSymbols::loader_name(), classloader_signature, false); \
3440
macro(_name_offset, k, vmSymbols::name_name(), string_signature, false)
3441
3442
void java_lang_Module::compute_offsets() {
3443
InstanceKlass* k = vmClasses::Module_klass();
3444
MODULE_FIELDS_DO(FIELD_COMPUTE_OFFSET);
3445
MODULE_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
3446
}
3447
3448
#if INCLUDE_CDS
3449
void java_lang_Module::serialize_offsets(SerializeClosure* f) {
3450
MODULE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
3451
MODULE_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET);
3452
}
3453
#endif
3454
3455
oop java_lang_Module::loader(oop module) {
3456
return module->obj_field(_loader_offset);
3457
}
3458
3459
void java_lang_Module::set_loader(oop module, oop value) {
3460
module->obj_field_put(_loader_offset, value);
3461
}
3462
3463
oop java_lang_Module::name(oop module) {
3464
return module->obj_field(_name_offset);
3465
}
3466
3467
void java_lang_Module::set_name(oop module, oop value) {
3468
module->obj_field_put(_name_offset, value);
3469
}
3470
3471
ModuleEntry* java_lang_Module::module_entry_raw(oop module) {
3472
assert(_module_entry_offset != 0, "Uninitialized module_entry_offset");
3473
assert(module != NULL, "module can't be null");
3474
assert(oopDesc::is_oop(module), "module must be oop");
3475
3476
ModuleEntry* module_entry = (ModuleEntry*)module->address_field(_module_entry_offset);
3477
return module_entry;
3478
}
3479
3480
ModuleEntry* java_lang_Module::module_entry(oop module) {
3481
ModuleEntry* module_entry = module_entry_raw(module);
3482
if (module_entry == NULL) {
3483
// If the inject field containing the ModuleEntry* is null then return the
3484
// class loader's unnamed module.
3485
oop loader = java_lang_Module::loader(module);
3486
Handle h_loader = Handle(Thread::current(), loader);
3487
ClassLoaderData* loader_cld = SystemDictionary::register_loader(h_loader);
3488
return loader_cld->unnamed_module();
3489
}
3490
return module_entry;
3491
}
3492
3493
void java_lang_Module::set_module_entry(oop module, ModuleEntry* module_entry) {
3494
assert(_module_entry_offset != 0, "Uninitialized module_entry_offset");
3495
assert(module != NULL, "module can't be null");
3496
assert(oopDesc::is_oop(module), "module must be oop");
3497
module->address_field_put(_module_entry_offset, (address)module_entry);
3498
}
3499
3500
Handle reflect_ConstantPool::create(TRAPS) {
3501
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
3502
InstanceKlass* k = vmClasses::reflect_ConstantPool_klass();
3503
// Ensure it is initialized
3504
k->initialize(CHECK_NH);
3505
return k->allocate_instance_handle(THREAD);
3506
}
3507
3508
3509
void reflect_ConstantPool::set_cp(oop reflect, ConstantPool* value) {
3510
oop mirror = value->pool_holder()->java_mirror();
3511
// Save the mirror to get back the constant pool.
3512
reflect->obj_field_put(_oop_offset, mirror);
3513
}
3514
3515
ConstantPool* reflect_ConstantPool::get_cp(oop reflect) {
3516
3517
oop mirror = reflect->obj_field(_oop_offset);
3518
Klass* k = java_lang_Class::as_Klass(mirror);
3519
assert(k->is_instance_klass(), "Must be");
3520
3521
// Get the constant pool back from the klass. Since class redefinition
3522
// merges the new constant pool into the old, this is essentially the
3523
// same constant pool as the original. If constant pool merging is
3524
// no longer done in the future, this will have to change to save
3525
// the original.
3526
return InstanceKlass::cast(k)->constants();
3527
}
3528
3529
int reflect_UnsafeStaticFieldAccessorImpl::_base_offset;
3530
3531
#define UNSAFESTATICFIELDACCESSORIMPL_FIELDS_DO(macro) \
3532
macro(_base_offset, k, "base", object_signature, false)
3533
3534
void reflect_UnsafeStaticFieldAccessorImpl::compute_offsets() {
3535
InstanceKlass* k = vmClasses::reflect_UnsafeStaticFieldAccessorImpl_klass();
3536
UNSAFESTATICFIELDACCESSORIMPL_FIELDS_DO(FIELD_COMPUTE_OFFSET);
3537
}
3538
3539
#if INCLUDE_CDS
3540
void reflect_UnsafeStaticFieldAccessorImpl::serialize_offsets(SerializeClosure* f) {
3541
UNSAFESTATICFIELDACCESSORIMPL_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
3542
}
3543
#endif
3544
3545
// Support for java_lang_ref_Reference
3546
3547
bool java_lang_ref_Reference::_offsets_initialized;
3548
3549
int java_lang_ref_Reference::_referent_offset;
3550
int java_lang_ref_Reference::_queue_offset;
3551
int java_lang_ref_Reference::_next_offset;
3552
int java_lang_ref_Reference::_discovered_offset;
3553
3554
#define REFERENCE_FIELDS_DO(macro) \
3555
macro(_referent_offset, k, "referent", object_signature, false); \
3556
macro(_queue_offset, k, "queue", referencequeue_signature, false); \
3557
macro(_next_offset, k, "next", reference_signature, false); \
3558
macro(_discovered_offset, k, "discovered", reference_signature, false);
3559
3560
void java_lang_ref_Reference::compute_offsets() {
3561
if (_offsets_initialized) {
3562
return;
3563
}
3564
_offsets_initialized = true;
3565
InstanceKlass* k = vmClasses::Reference_klass();
3566
REFERENCE_FIELDS_DO(FIELD_COMPUTE_OFFSET);
3567
}
3568
3569
#if INCLUDE_CDS
3570
void java_lang_ref_Reference::serialize_offsets(SerializeClosure* f) {
3571
f->do_bool(&_offsets_initialized);
3572
REFERENCE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
3573
}
3574
#endif
3575
3576
bool java_lang_ref_Reference::is_referent_field(oop obj, ptrdiff_t offset) {
3577
assert(obj != NULL, "sanity");
3578
if (offset != _referent_offset) {
3579
return false;
3580
}
3581
3582
Klass* k = obj->klass();
3583
if (!k->is_instance_klass()) {
3584
return false;
3585
}
3586
3587
InstanceKlass* ik = InstanceKlass::cast(obj->klass());
3588
bool is_reference = ik->reference_type() != REF_NONE;
3589
assert(!is_reference || ik->is_subclass_of(vmClasses::Reference_klass()), "sanity");
3590
return is_reference;
3591
}
3592
3593
int java_lang_boxing_object::_value_offset;
3594
int java_lang_boxing_object::_long_value_offset;
3595
3596
#define BOXING_FIELDS_DO(macro) \
3597
macro(_value_offset, integerKlass, "value", int_signature, false); \
3598
macro(_long_value_offset, longKlass, "value", long_signature, false);
3599
3600
void java_lang_boxing_object::compute_offsets() {
3601
InstanceKlass* integerKlass = vmClasses::Integer_klass();
3602
InstanceKlass* longKlass = vmClasses::Long_klass();
3603
BOXING_FIELDS_DO(FIELD_COMPUTE_OFFSET);
3604
}
3605
3606
#if INCLUDE_CDS
3607
void java_lang_boxing_object::serialize_offsets(SerializeClosure* f) {
3608
BOXING_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
3609
}
3610
#endif
3611
3612
oop java_lang_boxing_object::initialize_and_allocate(BasicType type, TRAPS) {
3613
Klass* k = vmClasses::box_klass(type);
3614
if (k == NULL) return NULL;
3615
InstanceKlass* ik = InstanceKlass::cast(k);
3616
if (!ik->is_initialized()) ik->initialize(CHECK_NULL);
3617
return ik->allocate_instance(THREAD);
3618
}
3619
3620
3621
oop java_lang_boxing_object::create(BasicType type, jvalue* value, TRAPS) {
3622
oop box = initialize_and_allocate(type, CHECK_NULL);
3623
if (box == NULL) return NULL;
3624
switch (type) {
3625
case T_BOOLEAN:
3626
box->bool_field_put(_value_offset, value->z);
3627
break;
3628
case T_CHAR:
3629
box->char_field_put(_value_offset, value->c);
3630
break;
3631
case T_FLOAT:
3632
box->float_field_put(_value_offset, value->f);
3633
break;
3634
case T_DOUBLE:
3635
box->double_field_put(_long_value_offset, value->d);
3636
break;
3637
case T_BYTE:
3638
box->byte_field_put(_value_offset, value->b);
3639
break;
3640
case T_SHORT:
3641
box->short_field_put(_value_offset, value->s);
3642
break;
3643
case T_INT:
3644
box->int_field_put(_value_offset, value->i);
3645
break;
3646
case T_LONG:
3647
box->long_field_put(_long_value_offset, value->j);
3648
break;
3649
default:
3650
return NULL;
3651
}
3652
return box;
3653
}
3654
3655
3656
BasicType java_lang_boxing_object::basic_type(oop box) {
3657
if (box == NULL) return T_ILLEGAL;
3658
BasicType type = vmClasses::box_klass_type(box->klass());
3659
if (type == T_OBJECT) // 'unknown' value returned by SD::bkt
3660
return T_ILLEGAL;
3661
return type;
3662
}
3663
3664
3665
BasicType java_lang_boxing_object::get_value(oop box, jvalue* value) {
3666
BasicType type = vmClasses::box_klass_type(box->klass());
3667
switch (type) {
3668
case T_BOOLEAN:
3669
value->z = box->bool_field(_value_offset);
3670
break;
3671
case T_CHAR:
3672
value->c = box->char_field(_value_offset);
3673
break;
3674
case T_FLOAT:
3675
value->f = box->float_field(_value_offset);
3676
break;
3677
case T_DOUBLE:
3678
value->d = box->double_field(_long_value_offset);
3679
break;
3680
case T_BYTE:
3681
value->b = box->byte_field(_value_offset);
3682
break;
3683
case T_SHORT:
3684
value->s = box->short_field(_value_offset);
3685
break;
3686
case T_INT:
3687
value->i = box->int_field(_value_offset);
3688
break;
3689
case T_LONG:
3690
value->j = box->long_field(_long_value_offset);
3691
break;
3692
default:
3693
return T_ILLEGAL;
3694
} // end switch
3695
return type;
3696
}
3697
3698
3699
BasicType java_lang_boxing_object::set_value(oop box, jvalue* value) {
3700
BasicType type = vmClasses::box_klass_type(box->klass());
3701
switch (type) {
3702
case T_BOOLEAN:
3703
box->bool_field_put(_value_offset, value->z);
3704
break;
3705
case T_CHAR:
3706
box->char_field_put(_value_offset, value->c);
3707
break;
3708
case T_FLOAT:
3709
box->float_field_put(_value_offset, value->f);
3710
break;
3711
case T_DOUBLE:
3712
box->double_field_put(_long_value_offset, value->d);
3713
break;
3714
case T_BYTE:
3715
box->byte_field_put(_value_offset, value->b);
3716
break;
3717
case T_SHORT:
3718
box->short_field_put(_value_offset, value->s);
3719
break;
3720
case T_INT:
3721
box->int_field_put(_value_offset, value->i);
3722
break;
3723
case T_LONG:
3724
box->long_field_put(_long_value_offset, value->j);
3725
break;
3726
default:
3727
return T_ILLEGAL;
3728
} // end switch
3729
return type;
3730
}
3731
3732
3733
void java_lang_boxing_object::print(BasicType type, jvalue* value, outputStream* st) {
3734
switch (type) {
3735
case T_BOOLEAN: st->print("%s", value->z ? "true" : "false"); break;
3736
case T_CHAR: st->print("%d", value->c); break;
3737
case T_BYTE: st->print("%d", value->b); break;
3738
case T_SHORT: st->print("%d", value->s); break;
3739
case T_INT: st->print("%d", value->i); break;
3740
case T_LONG: st->print(JLONG_FORMAT, value->j); break;
3741
case T_FLOAT: st->print("%f", value->f); break;
3742
case T_DOUBLE: st->print("%lf", value->d); break;
3743
default: st->print("type %d?", type); break;
3744
}
3745
}
3746
3747
3748
// Support for java_lang_ref_SoftReference
3749
//
3750
3751
int java_lang_ref_SoftReference::_timestamp_offset;
3752
int java_lang_ref_SoftReference::_static_clock_offset;
3753
3754
#define SOFTREFERENCE_FIELDS_DO(macro) \
3755
macro(_timestamp_offset, k, "timestamp", long_signature, false); \
3756
macro(_static_clock_offset, k, "clock", long_signature, true)
3757
3758
void java_lang_ref_SoftReference::compute_offsets() {
3759
InstanceKlass* k = vmClasses::SoftReference_klass();
3760
SOFTREFERENCE_FIELDS_DO(FIELD_COMPUTE_OFFSET);
3761
}
3762
3763
#if INCLUDE_CDS
3764
void java_lang_ref_SoftReference::serialize_offsets(SerializeClosure* f) {
3765
SOFTREFERENCE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
3766
}
3767
#endif
3768
3769
jlong java_lang_ref_SoftReference::timestamp(oop ref) {
3770
return ref->long_field(_timestamp_offset);
3771
}
3772
3773
jlong java_lang_ref_SoftReference::clock() {
3774
InstanceKlass* ik = vmClasses::SoftReference_klass();
3775
oop base = ik->static_field_base_raw();
3776
return base->long_field(_static_clock_offset);
3777
}
3778
3779
void java_lang_ref_SoftReference::set_clock(jlong value) {
3780
InstanceKlass* ik = vmClasses::SoftReference_klass();
3781
oop base = ik->static_field_base_raw();
3782
base->long_field_put(_static_clock_offset, value);
3783
}
3784
3785
// Support for java_lang_invoke_DirectMethodHandle
3786
3787
int java_lang_invoke_DirectMethodHandle::_member_offset;
3788
3789
oop java_lang_invoke_DirectMethodHandle::member(oop dmh) {
3790
oop member_name = NULL;
3791
assert(oopDesc::is_oop(dmh) && java_lang_invoke_DirectMethodHandle::is_instance(dmh),
3792
"a DirectMethodHandle oop is expected");
3793
return dmh->obj_field(_member_offset);
3794
}
3795
3796
#define DIRECTMETHODHANDLE_FIELDS_DO(macro) \
3797
macro(_member_offset, k, "member", java_lang_invoke_MemberName_signature, false)
3798
3799
void java_lang_invoke_DirectMethodHandle::compute_offsets() {
3800
InstanceKlass* k = vmClasses::DirectMethodHandle_klass();
3801
DIRECTMETHODHANDLE_FIELDS_DO(FIELD_COMPUTE_OFFSET);
3802
}
3803
3804
#if INCLUDE_CDS
3805
void java_lang_invoke_DirectMethodHandle::serialize_offsets(SerializeClosure* f) {
3806
DIRECTMETHODHANDLE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
3807
}
3808
#endif
3809
3810
// Support for java_lang_invoke_MethodHandle
3811
3812
int java_lang_invoke_MethodHandle::_type_offset;
3813
int java_lang_invoke_MethodHandle::_form_offset;
3814
3815
int java_lang_invoke_MemberName::_clazz_offset;
3816
int java_lang_invoke_MemberName::_name_offset;
3817
int java_lang_invoke_MemberName::_type_offset;
3818
int java_lang_invoke_MemberName::_flags_offset;
3819
int java_lang_invoke_MemberName::_method_offset;
3820
int java_lang_invoke_MemberName::_vmindex_offset;
3821
3822
int java_lang_invoke_ResolvedMethodName::_vmtarget_offset;
3823
int java_lang_invoke_ResolvedMethodName::_vmholder_offset;
3824
3825
int java_lang_invoke_LambdaForm::_vmentry_offset;
3826
3827
#define METHODHANDLE_FIELDS_DO(macro) \
3828
macro(_type_offset, k, vmSymbols::type_name(), java_lang_invoke_MethodType_signature, false); \
3829
macro(_form_offset, k, "form", java_lang_invoke_LambdaForm_signature, false)
3830
3831
void java_lang_invoke_MethodHandle::compute_offsets() {
3832
InstanceKlass* k = vmClasses::MethodHandle_klass();
3833
METHODHANDLE_FIELDS_DO(FIELD_COMPUTE_OFFSET);
3834
}
3835
3836
#if INCLUDE_CDS
3837
void java_lang_invoke_MethodHandle::serialize_offsets(SerializeClosure* f) {
3838
METHODHANDLE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
3839
}
3840
#endif
3841
3842
#define MEMBERNAME_FIELDS_DO(macro) \
3843
macro(_clazz_offset, k, vmSymbols::clazz_name(), class_signature, false); \
3844
macro(_name_offset, k, vmSymbols::name_name(), string_signature, false); \
3845
macro(_type_offset, k, vmSymbols::type_name(), object_signature, false); \
3846
macro(_flags_offset, k, vmSymbols::flags_name(), int_signature, false); \
3847
macro(_method_offset, k, vmSymbols::method_name(), java_lang_invoke_ResolvedMethodName_signature, false)
3848
3849
void java_lang_invoke_MemberName::compute_offsets() {
3850
InstanceKlass* k = vmClasses::MemberName_klass();
3851
MEMBERNAME_FIELDS_DO(FIELD_COMPUTE_OFFSET);
3852
MEMBERNAME_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
3853
}
3854
3855
#if INCLUDE_CDS
3856
void java_lang_invoke_MemberName::serialize_offsets(SerializeClosure* f) {
3857
MEMBERNAME_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
3858
MEMBERNAME_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET);
3859
}
3860
#endif
3861
3862
void java_lang_invoke_ResolvedMethodName::compute_offsets() {
3863
InstanceKlass* k = vmClasses::ResolvedMethodName_klass();
3864
assert(k != NULL, "jdk mismatch");
3865
RESOLVEDMETHOD_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
3866
}
3867
3868
#if INCLUDE_CDS
3869
void java_lang_invoke_ResolvedMethodName::serialize_offsets(SerializeClosure* f) {
3870
RESOLVEDMETHOD_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET);
3871
}
3872
#endif
3873
3874
#define LAMBDAFORM_FIELDS_DO(macro) \
3875
macro(_vmentry_offset, k, "vmentry", java_lang_invoke_MemberName_signature, false)
3876
3877
void java_lang_invoke_LambdaForm::compute_offsets() {
3878
InstanceKlass* k = vmClasses::LambdaForm_klass();
3879
assert (k != NULL, "jdk mismatch");
3880
LAMBDAFORM_FIELDS_DO(FIELD_COMPUTE_OFFSET);
3881
}
3882
3883
#if INCLUDE_CDS
3884
void java_lang_invoke_LambdaForm::serialize_offsets(SerializeClosure* f) {
3885
LAMBDAFORM_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
3886
}
3887
#endif
3888
3889
bool java_lang_invoke_LambdaForm::is_instance(oop obj) {
3890
return obj != NULL && is_subclass(obj->klass());
3891
}
3892
3893
int jdk_internal_invoke_NativeEntryPoint::_shadow_space_offset;
3894
int jdk_internal_invoke_NativeEntryPoint::_argMoves_offset;
3895
int jdk_internal_invoke_NativeEntryPoint::_returnMoves_offset;
3896
int jdk_internal_invoke_NativeEntryPoint::_need_transition_offset;
3897
int jdk_internal_invoke_NativeEntryPoint::_method_type_offset;
3898
int jdk_internal_invoke_NativeEntryPoint::_name_offset;
3899
3900
#define NEP_FIELDS_DO(macro) \
3901
macro(_shadow_space_offset, k, "shadowSpace", int_signature, false); \
3902
macro(_argMoves_offset, k, "argMoves", long_array_signature, false); \
3903
macro(_returnMoves_offset, k, "returnMoves", long_array_signature, false); \
3904
macro(_need_transition_offset, k, "needTransition", bool_signature, false); \
3905
macro(_method_type_offset, k, "methodType", java_lang_invoke_MethodType_signature, false); \
3906
macro(_name_offset, k, "name", string_signature, false);
3907
3908
bool jdk_internal_invoke_NativeEntryPoint::is_instance(oop obj) {
3909
return obj != NULL && is_subclass(obj->klass());
3910
}
3911
3912
void jdk_internal_invoke_NativeEntryPoint::compute_offsets() {
3913
InstanceKlass* k = vmClasses::NativeEntryPoint_klass();
3914
NEP_FIELDS_DO(FIELD_COMPUTE_OFFSET);
3915
}
3916
3917
#if INCLUDE_CDS
3918
void jdk_internal_invoke_NativeEntryPoint::serialize_offsets(SerializeClosure* f) {
3919
NEP_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
3920
}
3921
#endif
3922
3923
jint jdk_internal_invoke_NativeEntryPoint::shadow_space(oop entry) {
3924
return entry->int_field(_shadow_space_offset);
3925
}
3926
3927
oop jdk_internal_invoke_NativeEntryPoint::argMoves(oop entry) {
3928
return entry->obj_field(_argMoves_offset);
3929
}
3930
3931
oop jdk_internal_invoke_NativeEntryPoint::returnMoves(oop entry) {
3932
return entry->obj_field(_returnMoves_offset);
3933
}
3934
3935
jboolean jdk_internal_invoke_NativeEntryPoint::need_transition(oop entry) {
3936
return entry->bool_field(_need_transition_offset);
3937
}
3938
3939
oop jdk_internal_invoke_NativeEntryPoint::method_type(oop entry) {
3940
return entry->obj_field(_method_type_offset);
3941
}
3942
3943
oop jdk_internal_invoke_NativeEntryPoint::name(oop entry) {
3944
return entry->obj_field(_name_offset);
3945
}
3946
3947
oop java_lang_invoke_MethodHandle::type(oop mh) {
3948
return mh->obj_field(_type_offset);
3949
}
3950
3951
void java_lang_invoke_MethodHandle::set_type(oop mh, oop mtype) {
3952
mh->obj_field_put(_type_offset, mtype);
3953
}
3954
3955
oop java_lang_invoke_MethodHandle::form(oop mh) {
3956
assert(_form_offset != 0, "");
3957
return mh->obj_field(_form_offset);
3958
}
3959
3960
void java_lang_invoke_MethodHandle::set_form(oop mh, oop lform) {
3961
assert(_form_offset != 0, "");
3962
mh->obj_field_put(_form_offset, lform);
3963
}
3964
3965
/// MemberName accessors
3966
3967
oop java_lang_invoke_MemberName::clazz(oop mname) {
3968
assert(is_instance(mname), "wrong type");
3969
return mname->obj_field(_clazz_offset);
3970
}
3971
3972
void java_lang_invoke_MemberName::set_clazz(oop mname, oop clazz) {
3973
assert(is_instance(mname), "wrong type");
3974
mname->obj_field_put(_clazz_offset, clazz);
3975
}
3976
3977
oop java_lang_invoke_MemberName::name(oop mname) {
3978
assert(is_instance(mname), "wrong type");
3979
return mname->obj_field(_name_offset);
3980
}
3981
3982
void java_lang_invoke_MemberName::set_name(oop mname, oop name) {
3983
assert(is_instance(mname), "wrong type");
3984
mname->obj_field_put(_name_offset, name);
3985
}
3986
3987
oop java_lang_invoke_MemberName::type(oop mname) {
3988
assert(is_instance(mname), "wrong type");
3989
return mname->obj_field(_type_offset);
3990
}
3991
3992
void java_lang_invoke_MemberName::set_type(oop mname, oop type) {
3993
assert(is_instance(mname), "wrong type");
3994
mname->obj_field_put(_type_offset, type);
3995
}
3996
3997
int java_lang_invoke_MemberName::flags(oop mname) {
3998
assert(is_instance(mname), "wrong type");
3999
return mname->int_field(_flags_offset);
4000
}
4001
4002
void java_lang_invoke_MemberName::set_flags(oop mname, int flags) {
4003
assert(is_instance(mname), "wrong type");
4004
mname->int_field_put(_flags_offset, flags);
4005
}
4006
4007
4008
// Return vmtarget from ResolvedMethodName method field through indirection
4009
Method* java_lang_invoke_MemberName::vmtarget(oop mname) {
4010
assert(is_instance(mname), "wrong type");
4011
oop method = mname->obj_field(_method_offset);
4012
return method == NULL ? NULL : java_lang_invoke_ResolvedMethodName::vmtarget(method);
4013
}
4014
4015
bool java_lang_invoke_MemberName::is_method(oop mname) {
4016
assert(is_instance(mname), "must be MemberName");
4017
return (flags(mname) & (MN_IS_METHOD | MN_IS_CONSTRUCTOR)) > 0;
4018
}
4019
4020
void java_lang_invoke_MemberName::set_method(oop mname, oop resolved_method) {
4021
assert(is_instance(mname), "wrong type");
4022
mname->obj_field_put(_method_offset, resolved_method);
4023
}
4024
4025
intptr_t java_lang_invoke_MemberName::vmindex(oop mname) {
4026
assert(is_instance(mname), "wrong type");
4027
return (intptr_t) mname->address_field(_vmindex_offset);
4028
}
4029
4030
void java_lang_invoke_MemberName::set_vmindex(oop mname, intptr_t index) {
4031
assert(is_instance(mname), "wrong type");
4032
mname->address_field_put(_vmindex_offset, (address) index);
4033
}
4034
4035
4036
Method* java_lang_invoke_ResolvedMethodName::vmtarget(oop resolved_method) {
4037
assert(is_instance(resolved_method), "wrong type");
4038
Method* m = (Method*)resolved_method->address_field(_vmtarget_offset);
4039
assert(m->is_method(), "must be");
4040
return m;
4041
}
4042
4043
// Used by redefinition to change Method* to new Method* with same hash (name, signature)
4044
void java_lang_invoke_ResolvedMethodName::set_vmtarget(oop resolved_method, Method* m) {
4045
assert(is_instance(resolved_method), "wrong type");
4046
resolved_method->address_field_put(_vmtarget_offset, (address)m);
4047
}
4048
4049
void java_lang_invoke_ResolvedMethodName::set_vmholder(oop resolved_method, oop holder) {
4050
assert(is_instance(resolved_method), "wrong type");
4051
resolved_method->obj_field_put(_vmholder_offset, holder);
4052
}
4053
4054
oop java_lang_invoke_ResolvedMethodName::find_resolved_method(const methodHandle& m, TRAPS) {
4055
const Method* method = m();
4056
4057
// lookup ResolvedMethod oop in the table, or create a new one and intern it
4058
oop resolved_method = ResolvedMethodTable::find_method(method);
4059
if (resolved_method != NULL) {
4060
return resolved_method;
4061
}
4062
4063
InstanceKlass* k = vmClasses::ResolvedMethodName_klass();
4064
if (!k->is_initialized()) {
4065
k->initialize(CHECK_NULL);
4066
}
4067
4068
oop new_resolved_method = k->allocate_instance(CHECK_NULL);
4069
4070
NoSafepointVerifier nsv;
4071
4072
if (method->is_old()) {
4073
method = (method->is_deleted()) ? Universe::throw_no_such_method_error() :
4074
method->get_new_method();
4075
}
4076
4077
InstanceKlass* holder = method->method_holder();
4078
4079
set_vmtarget(new_resolved_method, const_cast<Method*>(method));
4080
// Add a reference to the loader (actually mirror because hidden classes may not have
4081
// distinct loaders) to ensure the metadata is kept alive.
4082
// This mirror may be different than the one in clazz field.
4083
set_vmholder(new_resolved_method, holder->java_mirror());
4084
4085
// Set flag in class to indicate this InstanceKlass has entries in the table
4086
// to avoid walking table during redefinition if none of the redefined classes
4087
// have any membernames in the table.
4088
holder->set_has_resolved_methods();
4089
4090
return ResolvedMethodTable::add_method(method, Handle(THREAD, new_resolved_method));
4091
}
4092
4093
oop java_lang_invoke_LambdaForm::vmentry(oop lform) {
4094
assert(is_instance(lform), "wrong type");
4095
return lform->obj_field(_vmentry_offset);
4096
}
4097
4098
4099
// Support for java_lang_invoke_MethodType
4100
4101
int java_lang_invoke_MethodType::_rtype_offset;
4102
int java_lang_invoke_MethodType::_ptypes_offset;
4103
4104
#define METHODTYPE_FIELDS_DO(macro) \
4105
macro(_rtype_offset, k, "rtype", class_signature, false); \
4106
macro(_ptypes_offset, k, "ptypes", class_array_signature, false)
4107
4108
void java_lang_invoke_MethodType::compute_offsets() {
4109
InstanceKlass* k = vmClasses::MethodType_klass();
4110
METHODTYPE_FIELDS_DO(FIELD_COMPUTE_OFFSET);
4111
}
4112
4113
#if INCLUDE_CDS
4114
void java_lang_invoke_MethodType::serialize_offsets(SerializeClosure* f) {
4115
METHODTYPE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
4116
}
4117
#endif
4118
4119
void java_lang_invoke_MethodType::print_signature(oop mt, outputStream* st) {
4120
st->print("(");
4121
objArrayOop pts = ptypes(mt);
4122
for (int i = 0, limit = pts->length(); i < limit; i++) {
4123
java_lang_Class::print_signature(pts->obj_at(i), st);
4124
}
4125
st->print(")");
4126
java_lang_Class::print_signature(rtype(mt), st);
4127
}
4128
4129
Symbol* java_lang_invoke_MethodType::as_signature(oop mt, bool intern_if_not_found) {
4130
ResourceMark rm;
4131
stringStream buffer(128);
4132
print_signature(mt, &buffer);
4133
const char* sigstr = buffer.base();
4134
int siglen = (int) buffer.size();
4135
Symbol *name;
4136
if (!intern_if_not_found) {
4137
name = SymbolTable::probe(sigstr, siglen);
4138
} else {
4139
name = SymbolTable::new_symbol(sigstr, siglen);
4140
}
4141
return name;
4142
}
4143
4144
bool java_lang_invoke_MethodType::equals(oop mt1, oop mt2) {
4145
if (mt1 == mt2)
4146
return true;
4147
if (rtype(mt1) != rtype(mt2))
4148
return false;
4149
if (ptype_count(mt1) != ptype_count(mt2))
4150
return false;
4151
for (int i = ptype_count(mt1) - 1; i >= 0; i--) {
4152
if (ptype(mt1, i) != ptype(mt2, i))
4153
return false;
4154
}
4155
return true;
4156
}
4157
4158
oop java_lang_invoke_MethodType::rtype(oop mt) {
4159
assert(is_instance(mt), "must be a MethodType");
4160
return mt->obj_field(_rtype_offset);
4161
}
4162
4163
objArrayOop java_lang_invoke_MethodType::ptypes(oop mt) {
4164
assert(is_instance(mt), "must be a MethodType");
4165
return (objArrayOop) mt->obj_field(_ptypes_offset);
4166
}
4167
4168
oop java_lang_invoke_MethodType::ptype(oop mt, int idx) {
4169
return ptypes(mt)->obj_at(idx);
4170
}
4171
4172
int java_lang_invoke_MethodType::ptype_count(oop mt) {
4173
return ptypes(mt)->length();
4174
}
4175
4176
int java_lang_invoke_MethodType::ptype_slot_count(oop mt) {
4177
objArrayOop pts = ptypes(mt);
4178
int count = pts->length();
4179
int slots = 0;
4180
for (int i = 0; i < count; i++) {
4181
BasicType bt = java_lang_Class::as_BasicType(pts->obj_at(i));
4182
slots += type2size[bt];
4183
}
4184
return slots;
4185
}
4186
4187
int java_lang_invoke_MethodType::rtype_slot_count(oop mt) {
4188
BasicType bt = java_lang_Class::as_BasicType(rtype(mt));
4189
return type2size[bt];
4190
}
4191
4192
4193
// Support for java_lang_invoke_CallSite
4194
4195
int java_lang_invoke_CallSite::_target_offset;
4196
int java_lang_invoke_CallSite::_context_offset;
4197
4198
#define CALLSITE_FIELDS_DO(macro) \
4199
macro(_target_offset, k, "target", java_lang_invoke_MethodHandle_signature, false); \
4200
macro(_context_offset, k, "context", java_lang_invoke_MethodHandleNatives_CallSiteContext_signature, false)
4201
4202
void java_lang_invoke_CallSite::compute_offsets() {
4203
InstanceKlass* k = vmClasses::CallSite_klass();
4204
CALLSITE_FIELDS_DO(FIELD_COMPUTE_OFFSET);
4205
}
4206
4207
#if INCLUDE_CDS
4208
void java_lang_invoke_CallSite::serialize_offsets(SerializeClosure* f) {
4209
CALLSITE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
4210
}
4211
#endif
4212
4213
oop java_lang_invoke_CallSite::context_no_keepalive(oop call_site) {
4214
assert(java_lang_invoke_CallSite::is_instance(call_site), "");
4215
4216
oop dep_oop = call_site->obj_field_access<AS_NO_KEEPALIVE>(_context_offset);
4217
return dep_oop;
4218
}
4219
4220
// Support for java_lang_invoke_ConstantCallSite
4221
4222
int java_lang_invoke_ConstantCallSite::_is_frozen_offset;
4223
4224
#define CONSTANTCALLSITE_FIELDS_DO(macro) \
4225
macro(_is_frozen_offset, k, "isFrozen", bool_signature, false)
4226
4227
void java_lang_invoke_ConstantCallSite::compute_offsets() {
4228
InstanceKlass* k = vmClasses::ConstantCallSite_klass();
4229
CONSTANTCALLSITE_FIELDS_DO(FIELD_COMPUTE_OFFSET);
4230
}
4231
4232
#if INCLUDE_CDS
4233
void java_lang_invoke_ConstantCallSite::serialize_offsets(SerializeClosure* f) {
4234
CONSTANTCALLSITE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
4235
}
4236
#endif
4237
4238
// Support for java_lang_invoke_MethodHandleNatives_CallSiteContext
4239
4240
int java_lang_invoke_MethodHandleNatives_CallSiteContext::_vmdependencies_offset;
4241
int java_lang_invoke_MethodHandleNatives_CallSiteContext::_last_cleanup_offset;
4242
4243
void java_lang_invoke_MethodHandleNatives_CallSiteContext::compute_offsets() {
4244
InstanceKlass* k = vmClasses::Context_klass();
4245
CALLSITECONTEXT_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
4246
}
4247
4248
#if INCLUDE_CDS
4249
void java_lang_invoke_MethodHandleNatives_CallSiteContext::serialize_offsets(SerializeClosure* f) {
4250
CALLSITECONTEXT_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET);
4251
}
4252
#endif
4253
4254
DependencyContext java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(oop call_site) {
4255
assert(java_lang_invoke_MethodHandleNatives_CallSiteContext::is_instance(call_site), "");
4256
nmethodBucket* volatile* vmdeps_addr = (nmethodBucket* volatile*)call_site->field_addr(_vmdependencies_offset);
4257
volatile uint64_t* last_cleanup_addr = (volatile uint64_t*)call_site->field_addr(_last_cleanup_offset);
4258
DependencyContext dep_ctx(vmdeps_addr, last_cleanup_addr);
4259
return dep_ctx;
4260
}
4261
4262
// Support for java_security_AccessControlContext
4263
4264
int java_security_AccessControlContext::_context_offset;
4265
int java_security_AccessControlContext::_privilegedContext_offset;
4266
int java_security_AccessControlContext::_isPrivileged_offset;
4267
int java_security_AccessControlContext::_isAuthorized_offset;
4268
4269
#define ACCESSCONTROLCONTEXT_FIELDS_DO(macro) \
4270
macro(_context_offset, k, "context", protectiondomain_signature, false); \
4271
macro(_privilegedContext_offset, k, "privilegedContext", accesscontrolcontext_signature, false); \
4272
macro(_isPrivileged_offset, k, "isPrivileged", bool_signature, false); \
4273
macro(_isAuthorized_offset, k, "isAuthorized", bool_signature, false)
4274
4275
void java_security_AccessControlContext::compute_offsets() {
4276
assert(_isPrivileged_offset == 0, "offsets should be initialized only once");
4277
InstanceKlass* k = vmClasses::AccessControlContext_klass();
4278
ACCESSCONTROLCONTEXT_FIELDS_DO(FIELD_COMPUTE_OFFSET);
4279
}
4280
4281
#if INCLUDE_CDS
4282
void java_security_AccessControlContext::serialize_offsets(SerializeClosure* f) {
4283
ACCESSCONTROLCONTEXT_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
4284
}
4285
#endif
4286
4287
oop java_security_AccessControlContext::create(objArrayHandle context, bool isPrivileged, Handle privileged_context, TRAPS) {
4288
assert(_isPrivileged_offset != 0, "offsets should have been initialized");
4289
assert(_isAuthorized_offset != 0, "offsets should have been initialized");
4290
// Ensure klass is initialized
4291
vmClasses::AccessControlContext_klass()->initialize(CHECK_NULL);
4292
// Allocate result
4293
oop result = vmClasses::AccessControlContext_klass()->allocate_instance(CHECK_NULL);
4294
// Fill in values
4295
result->obj_field_put(_context_offset, context());
4296
result->obj_field_put(_privilegedContext_offset, privileged_context());
4297
result->bool_field_put(_isPrivileged_offset, isPrivileged);
4298
result->bool_field_put(_isAuthorized_offset, true);
4299
return result;
4300
}
4301
4302
4303
// Support for java_lang_ClassLoader
4304
4305
int java_lang_ClassLoader::_loader_data_offset;
4306
int java_lang_ClassLoader::_parallelCapable_offset;
4307
int java_lang_ClassLoader::_name_offset;
4308
int java_lang_ClassLoader::_nameAndId_offset;
4309
int java_lang_ClassLoader::_unnamedModule_offset;
4310
int java_lang_ClassLoader::_parent_offset;
4311
4312
ClassLoaderData* java_lang_ClassLoader::loader_data_acquire(oop loader) {
4313
assert(loader != NULL, "loader must not be NULL");
4314
assert(oopDesc::is_oop(loader), "loader must be oop");
4315
return HeapAccess<MO_ACQUIRE>::load_at(loader, _loader_data_offset);
4316
}
4317
4318
ClassLoaderData* java_lang_ClassLoader::loader_data_raw(oop loader) {
4319
assert(loader != NULL, "loader must not be NULL");
4320
assert(oopDesc::is_oop(loader), "loader must be oop");
4321
return RawAccess<>::load_at(loader, _loader_data_offset);
4322
}
4323
4324
void java_lang_ClassLoader::release_set_loader_data(oop loader, ClassLoaderData* new_data) {
4325
assert(loader != NULL, "loader must not be NULL");
4326
assert(oopDesc::is_oop(loader), "loader must be oop");
4327
HeapAccess<MO_RELEASE>::store_at(loader, _loader_data_offset, new_data);
4328
}
4329
4330
#define CLASSLOADER_FIELDS_DO(macro) \
4331
macro(_parallelCapable_offset, k1, "parallelLockMap", concurrenthashmap_signature, false); \
4332
macro(_name_offset, k1, vmSymbols::name_name(), string_signature, false); \
4333
macro(_nameAndId_offset, k1, "nameAndId", string_signature, false); \
4334
macro(_unnamedModule_offset, k1, "unnamedModule", module_signature, false); \
4335
macro(_parent_offset, k1, "parent", classloader_signature, false)
4336
4337
void java_lang_ClassLoader::compute_offsets() {
4338
InstanceKlass* k1 = vmClasses::ClassLoader_klass();
4339
CLASSLOADER_FIELDS_DO(FIELD_COMPUTE_OFFSET);
4340
4341
CLASSLOADER_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
4342
}
4343
4344
#if INCLUDE_CDS
4345
void java_lang_ClassLoader::serialize_offsets(SerializeClosure* f) {
4346
CLASSLOADER_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
4347
CLASSLOADER_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET);
4348
}
4349
#endif
4350
4351
oop java_lang_ClassLoader::parent(oop loader) {
4352
assert(is_instance(loader), "loader must be oop");
4353
return loader->obj_field(_parent_offset);
4354
}
4355
4356
// Returns the name field of this class loader. If the name field has not
4357
// been set, null will be returned.
4358
oop java_lang_ClassLoader::name(oop loader) {
4359
assert(is_instance(loader), "loader must be oop");
4360
return loader->obj_field(_name_offset);
4361
}
4362
4363
// Returns the nameAndId field of this class loader. The format is
4364
// as follows:
4365
// If the defining loader has a name explicitly set then '<loader-name>' @<id>
4366
// If the defining loader has no name then <qualified-class-name> @<id>
4367
// If built-in loader, then omit '@<id>' as there is only one instance.
4368
// Use ClassLoader::loader_name_id() to obtain this String as a char*.
4369
oop java_lang_ClassLoader::nameAndId(oop loader) {
4370
assert(is_instance(loader), "loader must be oop");
4371
return loader->obj_field(_nameAndId_offset);
4372
}
4373
4374
bool java_lang_ClassLoader::isAncestor(oop loader, oop cl) {
4375
assert(is_instance(loader), "loader must be oop");
4376
assert(cl == NULL || is_instance(cl), "cl argument must be oop");
4377
oop acl = loader;
4378
debug_only(jint loop_count = 0);
4379
// This loop taken verbatim from ClassLoader.java:
4380
do {
4381
acl = parent(acl);
4382
if (cl == acl) {
4383
return true;
4384
}
4385
assert(++loop_count > 0, "loop_count overflow");
4386
} while (acl != NULL);
4387
return false;
4388
}
4389
4390
bool java_lang_ClassLoader::is_instance(oop obj) {
4391
return obj != NULL && is_subclass(obj->klass());
4392
}
4393
4394
4395
// For class loader classes, parallelCapable defined
4396
// based on non-null field
4397
// Written to by java.lang.ClassLoader, vm only reads this field, doesn't set it
4398
bool java_lang_ClassLoader::parallelCapable(oop class_loader) {
4399
assert(_parallelCapable_offset != 0, "offsets should have been initialized");
4400
return (class_loader->obj_field(_parallelCapable_offset) != NULL);
4401
}
4402
4403
bool java_lang_ClassLoader::is_trusted_loader(oop loader) {
4404
// Fix for 4474172; see evaluation for more details
4405
loader = non_reflection_class_loader(loader);
4406
4407
oop cl = SystemDictionary::java_system_loader();
4408
while(cl != NULL) {
4409
if (cl == loader) return true;
4410
cl = parent(cl);
4411
}
4412
return false;
4413
}
4414
4415
// Return true if this is one of the class loaders associated with
4416
// the generated bytecodes for reflection.
4417
bool java_lang_ClassLoader::is_reflection_class_loader(oop loader) {
4418
if (loader != NULL) {
4419
Klass* delegating_cl_class = vmClasses::reflect_DelegatingClassLoader_klass();
4420
// This might be null in non-1.4 JDKs
4421
return (delegating_cl_class != NULL && loader->is_a(delegating_cl_class));
4422
}
4423
return false;
4424
}
4425
4426
oop java_lang_ClassLoader::non_reflection_class_loader(oop loader) {
4427
// See whether this is one of the class loaders associated with
4428
// the generated bytecodes for reflection, and if so, "magically"
4429
// delegate to its parent to prevent class loading from occurring
4430
// in places where applications using reflection didn't expect it.
4431
if (is_reflection_class_loader(loader)) {
4432
return parent(loader);
4433
}
4434
return loader;
4435
}
4436
4437
oop java_lang_ClassLoader::unnamedModule(oop loader) {
4438
assert(is_instance(loader), "loader must be oop");
4439
return loader->obj_field(_unnamedModule_offset);
4440
}
4441
4442
// Support for java_lang_System
4443
//
4444
4445
int java_lang_System::_static_in_offset;
4446
int java_lang_System::_static_out_offset;
4447
int java_lang_System::_static_err_offset;
4448
int java_lang_System::_static_security_offset;
4449
int java_lang_System::_static_allow_security_offset;
4450
int java_lang_System::_static_never_offset;
4451
4452
#define SYSTEM_FIELDS_DO(macro) \
4453
macro(_static_in_offset, k, "in", input_stream_signature, true); \
4454
macro(_static_out_offset, k, "out", print_stream_signature, true); \
4455
macro(_static_err_offset, k, "err", print_stream_signature, true); \
4456
macro(_static_security_offset, k, "security", security_manager_signature, true); \
4457
macro(_static_allow_security_offset, k, "allowSecurityManager", int_signature, true); \
4458
macro(_static_never_offset, k, "NEVER", int_signature, true)
4459
4460
void java_lang_System::compute_offsets() {
4461
InstanceKlass* k = vmClasses::System_klass();
4462
SYSTEM_FIELDS_DO(FIELD_COMPUTE_OFFSET);
4463
}
4464
4465
// This field tells us that a security manager can never be installed so we
4466
// can completely skip populating the ProtectionDomainCacheTable.
4467
bool java_lang_System::allow_security_manager() {
4468
static int initialized = false;
4469
static bool allowed = true; // default
4470
if (!initialized) {
4471
oop base = vmClasses::System_klass()->static_field_base_raw();
4472
int never = base->int_field(_static_never_offset);
4473
allowed = (base->int_field(_static_allow_security_offset) != never);
4474
}
4475
return allowed;
4476
}
4477
4478
// This field tells us that a security manager is installed.
4479
bool java_lang_System::has_security_manager() {
4480
oop base = vmClasses::System_klass()->static_field_base_raw();
4481
return base->obj_field(_static_security_offset) != NULL;
4482
}
4483
4484
#if INCLUDE_CDS
4485
void java_lang_System::serialize_offsets(SerializeClosure* f) {
4486
SYSTEM_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
4487
}
4488
#endif
4489
4490
// Support for jdk_internal_misc_UnsafeConstants
4491
//
4492
class UnsafeConstantsFixup : public FieldClosure {
4493
private:
4494
int _address_size;
4495
int _page_size;
4496
bool _big_endian;
4497
bool _use_unaligned_access;
4498
int _data_cache_line_flush_size;
4499
public:
4500
UnsafeConstantsFixup() {
4501
// round up values for all static final fields
4502
_address_size = sizeof(void*);
4503
_page_size = os::vm_page_size();
4504
_big_endian = LITTLE_ENDIAN_ONLY(false) BIG_ENDIAN_ONLY(true);
4505
_use_unaligned_access = UseUnalignedAccesses;
4506
_data_cache_line_flush_size = (int)VM_Version::data_cache_line_flush_size();
4507
}
4508
4509
void do_field(fieldDescriptor* fd) {
4510
oop mirror = fd->field_holder()->java_mirror();
4511
assert(mirror != NULL, "UnsafeConstants must have mirror already");
4512
assert(fd->field_holder() == vmClasses::UnsafeConstants_klass(), "Should be UnsafeConstants");
4513
assert(fd->is_final(), "fields of UnsafeConstants must be final");
4514
assert(fd->is_static(), "fields of UnsafeConstants must be static");
4515
if (fd->name() == vmSymbols::address_size_name()) {
4516
mirror->int_field_put(fd->offset(), _address_size);
4517
} else if (fd->name() == vmSymbols::page_size_name()) {
4518
mirror->int_field_put(fd->offset(), _page_size);
4519
} else if (fd->name() == vmSymbols::big_endian_name()) {
4520
mirror->bool_field_put(fd->offset(), _big_endian);
4521
} else if (fd->name() == vmSymbols::use_unaligned_access_name()) {
4522
mirror->bool_field_put(fd->offset(), _use_unaligned_access);
4523
} else if (fd->name() == vmSymbols::data_cache_line_flush_size_name()) {
4524
mirror->int_field_put(fd->offset(), _data_cache_line_flush_size);
4525
} else {
4526
assert(false, "unexpected UnsafeConstants field");
4527
}
4528
}
4529
};
4530
4531
void jdk_internal_misc_UnsafeConstants::set_unsafe_constants() {
4532
UnsafeConstantsFixup fixup;
4533
vmClasses::UnsafeConstants_klass()->do_local_static_fields(&fixup);
4534
}
4535
4536
4537
// java_lang_StackTraceElement
4538
4539
int java_lang_StackTraceElement::_methodName_offset;
4540
int java_lang_StackTraceElement::_fileName_offset;
4541
int java_lang_StackTraceElement::_lineNumber_offset;
4542
int java_lang_StackTraceElement::_moduleName_offset;
4543
int java_lang_StackTraceElement::_moduleVersion_offset;
4544
int java_lang_StackTraceElement::_classLoaderName_offset;
4545
int java_lang_StackTraceElement::_declaringClass_offset;
4546
int java_lang_StackTraceElement::_declaringClassObject_offset;
4547
4548
#define STACKTRACEELEMENT_FIELDS_DO(macro) \
4549
macro(_declaringClassObject_offset, k, "declaringClassObject", class_signature, false); \
4550
macro(_classLoaderName_offset, k, "classLoaderName", string_signature, false); \
4551
macro(_moduleName_offset, k, "moduleName", string_signature, false); \
4552
macro(_moduleVersion_offset, k, "moduleVersion", string_signature, false); \
4553
macro(_declaringClass_offset, k, "declaringClass", string_signature, false); \
4554
macro(_methodName_offset, k, "methodName", string_signature, false); \
4555
macro(_fileName_offset, k, "fileName", string_signature, false); \
4556
macro(_lineNumber_offset, k, "lineNumber", int_signature, false)
4557
4558
// Support for java_lang_StackTraceElement
4559
void java_lang_StackTraceElement::compute_offsets() {
4560
InstanceKlass* k = vmClasses::StackTraceElement_klass();
4561
STACKTRACEELEMENT_FIELDS_DO(FIELD_COMPUTE_OFFSET);
4562
}
4563
4564
#if INCLUDE_CDS
4565
void java_lang_StackTraceElement::serialize_offsets(SerializeClosure* f) {
4566
STACKTRACEELEMENT_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
4567
}
4568
#endif
4569
4570
void java_lang_StackTraceElement::set_fileName(oop element, oop value) {
4571
element->obj_field_put(_fileName_offset, value);
4572
}
4573
4574
void java_lang_StackTraceElement::set_declaringClass(oop element, oop value) {
4575
element->obj_field_put(_declaringClass_offset, value);
4576
}
4577
4578
void java_lang_StackTraceElement::set_methodName(oop element, oop value) {
4579
element->obj_field_put(_methodName_offset, value);
4580
}
4581
4582
void java_lang_StackTraceElement::set_lineNumber(oop element, int value) {
4583
element->int_field_put(_lineNumber_offset, value);
4584
}
4585
4586
void java_lang_StackTraceElement::set_moduleName(oop element, oop value) {
4587
element->obj_field_put(_moduleName_offset, value);
4588
}
4589
4590
void java_lang_StackTraceElement::set_moduleVersion(oop element, oop value) {
4591
element->obj_field_put(_moduleVersion_offset, value);
4592
}
4593
4594
void java_lang_StackTraceElement::set_classLoaderName(oop element, oop value) {
4595
element->obj_field_put(_classLoaderName_offset, value);
4596
}
4597
4598
void java_lang_StackTraceElement::set_declaringClassObject(oop element, oop value) {
4599
element->obj_field_put(_declaringClassObject_offset, value);
4600
}
4601
4602
4603
// java_lang_AssertionStatusDirectives
4604
4605
int java_lang_AssertionStatusDirectives::_classes_offset;
4606
int java_lang_AssertionStatusDirectives::_classEnabled_offset;
4607
int java_lang_AssertionStatusDirectives::_packages_offset;
4608
int java_lang_AssertionStatusDirectives::_packageEnabled_offset;
4609
int java_lang_AssertionStatusDirectives::_deflt_offset;
4610
4611
// Support for java Assertions - java_lang_AssertionStatusDirectives.
4612
#define ASSERTIONSTATUSDIRECTIVES_FIELDS_DO(macro) \
4613
macro(_classes_offset, k, "classes", string_array_signature, false); \
4614
macro(_classEnabled_offset, k, "classEnabled", bool_array_signature, false); \
4615
macro(_packages_offset, k, "packages", string_array_signature, false); \
4616
macro(_packageEnabled_offset, k, "packageEnabled", bool_array_signature, false); \
4617
macro(_deflt_offset, k, "deflt", bool_signature, false)
4618
4619
void java_lang_AssertionStatusDirectives::compute_offsets() {
4620
InstanceKlass* k = vmClasses::AssertionStatusDirectives_klass();
4621
ASSERTIONSTATUSDIRECTIVES_FIELDS_DO(FIELD_COMPUTE_OFFSET);
4622
}
4623
4624
#if INCLUDE_CDS
4625
void java_lang_AssertionStatusDirectives::serialize_offsets(SerializeClosure* f) {
4626
ASSERTIONSTATUSDIRECTIVES_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
4627
}
4628
#endif
4629
4630
void java_lang_AssertionStatusDirectives::set_classes(oop o, oop val) {
4631
o->obj_field_put(_classes_offset, val);
4632
}
4633
4634
void java_lang_AssertionStatusDirectives::set_classEnabled(oop o, oop val) {
4635
o->obj_field_put(_classEnabled_offset, val);
4636
}
4637
4638
void java_lang_AssertionStatusDirectives::set_packages(oop o, oop val) {
4639
o->obj_field_put(_packages_offset, val);
4640
}
4641
4642
void java_lang_AssertionStatusDirectives::set_packageEnabled(oop o, oop val) {
4643
o->obj_field_put(_packageEnabled_offset, val);
4644
}
4645
4646
void java_lang_AssertionStatusDirectives::set_deflt(oop o, bool val) {
4647
o->bool_field_put(_deflt_offset, val);
4648
}
4649
4650
4651
// Support for intrinsification of java.nio.Buffer.checkIndex
4652
4653
int java_nio_Buffer::_limit_offset;
4654
4655
#define BUFFER_FIELDS_DO(macro) \
4656
macro(_limit_offset, k, "limit", int_signature, false)
4657
4658
void java_nio_Buffer::compute_offsets() {
4659
InstanceKlass* k = vmClasses::nio_Buffer_klass();
4660
assert(k != NULL, "must be loaded in 1.4+");
4661
BUFFER_FIELDS_DO(FIELD_COMPUTE_OFFSET);
4662
}
4663
4664
#if INCLUDE_CDS
4665
void java_nio_Buffer::serialize_offsets(SerializeClosure* f) {
4666
BUFFER_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
4667
}
4668
#endif
4669
4670
int java_util_concurrent_locks_AbstractOwnableSynchronizer::_owner_offset;
4671
4672
#define AOS_FIELDS_DO(macro) \
4673
macro(_owner_offset, k, "exclusiveOwnerThread", thread_signature, false)
4674
4675
void java_util_concurrent_locks_AbstractOwnableSynchronizer::compute_offsets() {
4676
InstanceKlass* k = vmClasses::java_util_concurrent_locks_AbstractOwnableSynchronizer_klass();
4677
AOS_FIELDS_DO(FIELD_COMPUTE_OFFSET);
4678
}
4679
4680
oop java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(oop obj) {
4681
assert(_owner_offset != 0, "Must be initialized");
4682
return obj->obj_field(_owner_offset);
4683
}
4684
4685
#if INCLUDE_CDS
4686
void java_util_concurrent_locks_AbstractOwnableSynchronizer::serialize_offsets(SerializeClosure* f) {
4687
AOS_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
4688
}
4689
#endif
4690
4691
int vector_VectorPayload::_payload_offset;
4692
4693
#define VECTORPAYLOAD_FIELDS_DO(macro) \
4694
macro(_payload_offset, k, "payload", object_signature, false)
4695
4696
void vector_VectorPayload::compute_offsets() {
4697
InstanceKlass* k = vmClasses::vector_VectorPayload_klass();
4698
VECTORPAYLOAD_FIELDS_DO(FIELD_COMPUTE_OFFSET);
4699
}
4700
4701
#if INCLUDE_CDS
4702
void vector_VectorPayload::serialize_offsets(SerializeClosure* f) {
4703
VECTORPAYLOAD_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
4704
}
4705
#endif
4706
4707
void vector_VectorPayload::set_payload(oop o, oop val) {
4708
o->obj_field_put(_payload_offset, val);
4709
}
4710
4711
bool vector_VectorPayload::is_instance(oop obj) {
4712
return obj != NULL && is_subclass(obj->klass());
4713
}
4714
4715
int java_lang_Integer_IntegerCache::_static_cache_offset;
4716
int java_lang_Long_LongCache::_static_cache_offset;
4717
int java_lang_Character_CharacterCache::_static_cache_offset;
4718
int java_lang_Short_ShortCache::_static_cache_offset;
4719
int java_lang_Byte_ByteCache::_static_cache_offset;
4720
4721
#define INTEGER_CACHE_FIELDS_DO(macro) \
4722
macro(_static_cache_offset, k, "cache", java_lang_Integer_array_signature, true)
4723
4724
void java_lang_Integer_IntegerCache::compute_offsets(InstanceKlass *k) {
4725
guarantee(k != NULL && k->is_initialized(), "must be loaded and initialized");
4726
INTEGER_CACHE_FIELDS_DO(FIELD_COMPUTE_OFFSET);
4727
}
4728
4729
objArrayOop java_lang_Integer_IntegerCache::cache(InstanceKlass *ik) {
4730
oop base = ik->static_field_base_raw();
4731
return objArrayOop(base->obj_field(_static_cache_offset));
4732
}
4733
4734
Symbol* java_lang_Integer_IntegerCache::symbol() {
4735
return vmSymbols::java_lang_Integer_IntegerCache();
4736
}
4737
4738
#if INCLUDE_CDS
4739
void java_lang_Integer_IntegerCache::serialize_offsets(SerializeClosure* f) {
4740
INTEGER_CACHE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
4741
}
4742
#endif
4743
#undef INTEGER_CACHE_FIELDS_DO
4744
4745
jint java_lang_Integer::value(oop obj) {
4746
jvalue v;
4747
java_lang_boxing_object::get_value(obj, &v);
4748
return v.i;
4749
}
4750
4751
#define LONG_CACHE_FIELDS_DO(macro) \
4752
macro(_static_cache_offset, k, "cache", java_lang_Long_array_signature, true)
4753
4754
void java_lang_Long_LongCache::compute_offsets(InstanceKlass *k) {
4755
guarantee(k != NULL && k->is_initialized(), "must be loaded and initialized");
4756
LONG_CACHE_FIELDS_DO(FIELD_COMPUTE_OFFSET);
4757
}
4758
4759
objArrayOop java_lang_Long_LongCache::cache(InstanceKlass *ik) {
4760
oop base = ik->static_field_base_raw();
4761
return objArrayOop(base->obj_field(_static_cache_offset));
4762
}
4763
4764
Symbol* java_lang_Long_LongCache::symbol() {
4765
return vmSymbols::java_lang_Long_LongCache();
4766
}
4767
4768
#if INCLUDE_CDS
4769
void java_lang_Long_LongCache::serialize_offsets(SerializeClosure* f) {
4770
LONG_CACHE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
4771
}
4772
#endif
4773
#undef LONG_CACHE_FIELDS_DO
4774
4775
jlong java_lang_Long::value(oop obj) {
4776
jvalue v;
4777
java_lang_boxing_object::get_value(obj, &v);
4778
return v.j;
4779
}
4780
4781
#define CHARACTER_CACHE_FIELDS_DO(macro) \
4782
macro(_static_cache_offset, k, "cache", java_lang_Character_array_signature, true)
4783
4784
void java_lang_Character_CharacterCache::compute_offsets(InstanceKlass *k) {
4785
guarantee(k != NULL && k->is_initialized(), "must be loaded and initialized");
4786
CHARACTER_CACHE_FIELDS_DO(FIELD_COMPUTE_OFFSET);
4787
}
4788
4789
objArrayOop java_lang_Character_CharacterCache::cache(InstanceKlass *ik) {
4790
oop base = ik->static_field_base_raw();
4791
return objArrayOop(base->obj_field(_static_cache_offset));
4792
}
4793
4794
Symbol* java_lang_Character_CharacterCache::symbol() {
4795
return vmSymbols::java_lang_Character_CharacterCache();
4796
}
4797
4798
#if INCLUDE_CDS
4799
void java_lang_Character_CharacterCache::serialize_offsets(SerializeClosure* f) {
4800
CHARACTER_CACHE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
4801
}
4802
#endif
4803
#undef CHARACTER_CACHE_FIELDS_DO
4804
4805
jchar java_lang_Character::value(oop obj) {
4806
jvalue v;
4807
java_lang_boxing_object::get_value(obj, &v);
4808
return v.c;
4809
}
4810
4811
#define SHORT_CACHE_FIELDS_DO(macro) \
4812
macro(_static_cache_offset, k, "cache", java_lang_Short_array_signature, true)
4813
4814
void java_lang_Short_ShortCache::compute_offsets(InstanceKlass *k) {
4815
guarantee(k != NULL && k->is_initialized(), "must be loaded and initialized");
4816
SHORT_CACHE_FIELDS_DO(FIELD_COMPUTE_OFFSET);
4817
}
4818
4819
objArrayOop java_lang_Short_ShortCache::cache(InstanceKlass *ik) {
4820
oop base = ik->static_field_base_raw();
4821
return objArrayOop(base->obj_field(_static_cache_offset));
4822
}
4823
4824
Symbol* java_lang_Short_ShortCache::symbol() {
4825
return vmSymbols::java_lang_Short_ShortCache();
4826
}
4827
4828
#if INCLUDE_CDS
4829
void java_lang_Short_ShortCache::serialize_offsets(SerializeClosure* f) {
4830
SHORT_CACHE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
4831
}
4832
#endif
4833
#undef SHORT_CACHE_FIELDS_DO
4834
4835
jshort java_lang_Short::value(oop obj) {
4836
jvalue v;
4837
java_lang_boxing_object::get_value(obj, &v);
4838
return v.s;
4839
}
4840
4841
#define BYTE_CACHE_FIELDS_DO(macro) \
4842
macro(_static_cache_offset, k, "cache", java_lang_Byte_array_signature, true)
4843
4844
void java_lang_Byte_ByteCache::compute_offsets(InstanceKlass *k) {
4845
guarantee(k != NULL && k->is_initialized(), "must be loaded and initialized");
4846
BYTE_CACHE_FIELDS_DO(FIELD_COMPUTE_OFFSET);
4847
}
4848
4849
objArrayOop java_lang_Byte_ByteCache::cache(InstanceKlass *ik) {
4850
oop base = ik->static_field_base_raw();
4851
return objArrayOop(base->obj_field(_static_cache_offset));
4852
}
4853
4854
Symbol* java_lang_Byte_ByteCache::symbol() {
4855
return vmSymbols::java_lang_Byte_ByteCache();
4856
}
4857
4858
#if INCLUDE_CDS
4859
void java_lang_Byte_ByteCache::serialize_offsets(SerializeClosure* f) {
4860
BYTE_CACHE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
4861
}
4862
#endif
4863
#undef BYTE_CACHE_FIELDS_DO
4864
4865
jbyte java_lang_Byte::value(oop obj) {
4866
jvalue v;
4867
java_lang_boxing_object::get_value(obj, &v);
4868
return v.b;
4869
}
4870
4871
int java_lang_Boolean::_static_TRUE_offset;
4872
int java_lang_Boolean::_static_FALSE_offset;
4873
4874
#define BOOLEAN_FIELDS_DO(macro) \
4875
macro(_static_TRUE_offset, k, "TRUE", java_lang_Boolean_signature, true); \
4876
macro(_static_FALSE_offset, k, "FALSE", java_lang_Boolean_signature, true)
4877
4878
4879
void java_lang_Boolean::compute_offsets(InstanceKlass *k) {
4880
guarantee(k != NULL && k->is_initialized(), "must be loaded and initialized");
4881
BOOLEAN_FIELDS_DO(FIELD_COMPUTE_OFFSET);
4882
}
4883
4884
oop java_lang_Boolean::get_TRUE(InstanceKlass *ik) {
4885
oop base = ik->static_field_base_raw();
4886
return base->obj_field(_static_TRUE_offset);
4887
}
4888
4889
oop java_lang_Boolean::get_FALSE(InstanceKlass *ik) {
4890
oop base = ik->static_field_base_raw();
4891
return base->obj_field(_static_FALSE_offset);
4892
}
4893
4894
Symbol* java_lang_Boolean::symbol() {
4895
return vmSymbols::java_lang_Boolean();
4896
}
4897
4898
#if INCLUDE_CDS
4899
void java_lang_Boolean::serialize_offsets(SerializeClosure* f) {
4900
BOOLEAN_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
4901
}
4902
#endif
4903
#undef BOOLEAN_CACHE_FIELDS_DO
4904
4905
jboolean java_lang_Boolean::value(oop obj) {
4906
jvalue v;
4907
java_lang_boxing_object::get_value(obj, &v);
4908
return v.z;
4909
}
4910
4911
// java_lang_reflect_RecordComponent
4912
4913
int java_lang_reflect_RecordComponent::_clazz_offset;
4914
int java_lang_reflect_RecordComponent::_name_offset;
4915
int java_lang_reflect_RecordComponent::_type_offset;
4916
int java_lang_reflect_RecordComponent::_accessor_offset;
4917
int java_lang_reflect_RecordComponent::_signature_offset;
4918
int java_lang_reflect_RecordComponent::_annotations_offset;
4919
int java_lang_reflect_RecordComponent::_typeAnnotations_offset;
4920
4921
#define RECORDCOMPONENT_FIELDS_DO(macro) \
4922
macro(_clazz_offset, k, "clazz", class_signature, false); \
4923
macro(_name_offset, k, "name", string_signature, false); \
4924
macro(_type_offset, k, "type", class_signature, false); \
4925
macro(_accessor_offset, k, "accessor", reflect_method_signature, false); \
4926
macro(_signature_offset, k, "signature", string_signature, false); \
4927
macro(_annotations_offset, k, "annotations", byte_array_signature, false); \
4928
macro(_typeAnnotations_offset, k, "typeAnnotations", byte_array_signature, false);
4929
4930
// Support for java_lang_reflect_RecordComponent
4931
void java_lang_reflect_RecordComponent::compute_offsets() {
4932
InstanceKlass* k = vmClasses::RecordComponent_klass();
4933
RECORDCOMPONENT_FIELDS_DO(FIELD_COMPUTE_OFFSET);
4934
}
4935
4936
#if INCLUDE_CDS
4937
void java_lang_reflect_RecordComponent::serialize_offsets(SerializeClosure* f) {
4938
RECORDCOMPONENT_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
4939
}
4940
#endif
4941
4942
void java_lang_reflect_RecordComponent::set_clazz(oop element, oop value) {
4943
element->obj_field_put(_clazz_offset, value);
4944
}
4945
4946
void java_lang_reflect_RecordComponent::set_name(oop element, oop value) {
4947
element->obj_field_put(_name_offset, value);
4948
}
4949
4950
void java_lang_reflect_RecordComponent::set_type(oop element, oop value) {
4951
element->obj_field_put(_type_offset, value);
4952
}
4953
4954
void java_lang_reflect_RecordComponent::set_accessor(oop element, oop value) {
4955
element->obj_field_put(_accessor_offset, value);
4956
}
4957
4958
void java_lang_reflect_RecordComponent::set_signature(oop element, oop value) {
4959
element->obj_field_put(_signature_offset, value);
4960
}
4961
4962
void java_lang_reflect_RecordComponent::set_annotations(oop element, oop value) {
4963
element->obj_field_put(_annotations_offset, value);
4964
}
4965
4966
void java_lang_reflect_RecordComponent::set_typeAnnotations(oop element, oop value) {
4967
element->obj_field_put(_typeAnnotations_offset, value);
4968
}
4969
4970
// java_lang_InternalError
4971
int java_lang_InternalError::_during_unsafe_access_offset;
4972
4973
void java_lang_InternalError::set_during_unsafe_access(oop internal_error) {
4974
internal_error->bool_field_put(_during_unsafe_access_offset, true);
4975
}
4976
4977
jboolean java_lang_InternalError::during_unsafe_access(oop internal_error) {
4978
return internal_error->bool_field(_during_unsafe_access_offset);
4979
}
4980
4981
void java_lang_InternalError::compute_offsets() {
4982
INTERNALERROR_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
4983
}
4984
4985
#if INCLUDE_CDS
4986
void java_lang_InternalError::serialize_offsets(SerializeClosure* f) {
4987
INTERNALERROR_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET);
4988
}
4989
#endif
4990
4991
#define DO_COMPUTE_OFFSETS(k) k::compute_offsets();
4992
4993
// Compute field offsets of all the classes in this file
4994
void JavaClasses::compute_offsets() {
4995
if (UseSharedSpaces) {
4996
JVMTI_ONLY(assert(JvmtiExport::is_early_phase() && !(JvmtiExport::should_post_class_file_load_hook() &&
4997
JvmtiExport::has_early_class_hook_env()),
4998
"JavaClasses::compute_offsets() must be called in early JVMTI phase."));
4999
// None of the classes used by the rest of this function can be replaced by
5000
// JVMTI ClassFileLoadHook.
5001
// We are safe to use the archived offsets, which have already been restored
5002
// by JavaClasses::serialize_offsets, without computing the offsets again.
5003
return;
5004
}
5005
5006
// We have already called the compute_offsets() of the
5007
// BASIC_JAVA_CLASSES_DO_PART1 classes (java_lang_String, java_lang_Class and
5008
// java_lang_ref_Reference) earlier inside vmClasses::resolve_all()
5009
BASIC_JAVA_CLASSES_DO_PART2(DO_COMPUTE_OFFSETS);
5010
}
5011
5012
#if INCLUDE_CDS
5013
#define DO_SERIALIZE_OFFSETS(k) k::serialize_offsets(soc);
5014
5015
void JavaClasses::serialize_offsets(SerializeClosure* soc) {
5016
BASIC_JAVA_CLASSES_DO(DO_SERIALIZE_OFFSETS);
5017
}
5018
#endif
5019
5020
#if INCLUDE_CDS_JAVA_HEAP
5021
bool JavaClasses::is_supported_for_archiving(oop obj) {
5022
Klass* klass = obj->klass();
5023
5024
if (klass == vmClasses::ClassLoader_klass() || // ClassLoader::loader_data is malloc'ed.
5025
// The next 3 classes are used to implement java.lang.invoke, and are not used directly in
5026
// regular Java code. The implementation of java.lang.invoke uses generated hidden classes
5027
// (e.g., as referenced by ResolvedMethodName::vmholder) that are not yet supported by CDS.
5028
// So for now we cannot not support these classes for archiving.
5029
//
5030
// These objects typically are not referenced by static fields, but rather by resolved
5031
// constant pool entries, so excluding them shouldn't affect the archiving of static fields.
5032
klass == vmClasses::ResolvedMethodName_klass() ||
5033
klass == vmClasses::MemberName_klass() ||
5034
klass == vmClasses::Context_klass()) {
5035
return false;
5036
}
5037
5038
return true;
5039
}
5040
#endif
5041
5042
#ifndef PRODUCT
5043
5044
// These functions exist to assert the validity of de-serialized offsets in boxing object as a sanity check.
5045
5046
bool JavaClasses::check_offset(const char *klass_name, int deserialized_offset, const char *field_name,
5047
const char* field_sig) {
5048
EXCEPTION_MARK;
5049
fieldDescriptor fd;
5050
TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name);
5051
Klass* k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH);
5052
InstanceKlass* ik = InstanceKlass::cast(k);
5053
TempNewSymbol f_name = SymbolTable::new_symbol(field_name);
5054
TempNewSymbol f_sig = SymbolTable::new_symbol(field_sig);
5055
if (!ik->find_local_field(f_name, f_sig, &fd)) {
5056
tty->print_cr("Nonstatic field %s.%s not found", klass_name, field_name);
5057
return false;
5058
}
5059
if (fd.is_static()) {
5060
tty->print_cr("Nonstatic field %s.%s appears to be static", klass_name, field_name);
5061
return false;
5062
}
5063
if (fd.offset() == deserialized_offset ) {
5064
return true;
5065
} else {
5066
tty->print_cr("Offset of nonstatic field %s.%s is deserialized as %d but should really be %d.",
5067
klass_name, field_name, deserialized_offset, fd.offset());
5068
return false;
5069
}
5070
}
5071
5072
void JavaClasses::check_offsets() {
5073
bool valid = true;
5074
5075
#define CHECK_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
5076
valid &= check_offset(klass_name, cpp_klass_name :: _##field_name ## _offset, #field_name, field_sig)
5077
5078
#define CHECK_LONG_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
5079
valid &= check_offset(klass_name, cpp_klass_name :: _##long_ ## field_name ## _offset, #field_name, field_sig)
5080
5081
// Boxed primitive objects (java_lang_boxing_object)
5082
5083
CHECK_OFFSET("java/lang/Boolean", java_lang_boxing_object, value, "Z");
5084
CHECK_OFFSET("java/lang/Character", java_lang_boxing_object, value, "C");
5085
CHECK_OFFSET("java/lang/Float", java_lang_boxing_object, value, "F");
5086
CHECK_LONG_OFFSET("java/lang/Double", java_lang_boxing_object, value, "D");
5087
CHECK_OFFSET("java/lang/Byte", java_lang_boxing_object, value, "B");
5088
CHECK_OFFSET("java/lang/Short", java_lang_boxing_object, value, "S");
5089
CHECK_OFFSET("java/lang/Integer", java_lang_boxing_object, value, "I");
5090
CHECK_LONG_OFFSET("java/lang/Long", java_lang_boxing_object, value, "J");
5091
5092
if (!valid) vm_exit_during_initialization("Field offset verification failed");
5093
}
5094
5095
#endif // PRODUCT
5096
5097
int InjectedField::compute_offset() {
5098
InstanceKlass* ik = InstanceKlass::cast(klass());
5099
for (AllFieldStream fs(ik); !fs.done(); fs.next()) {
5100
if (!may_be_java && !fs.access_flags().is_internal()) {
5101
// Only look at injected fields
5102
continue;
5103
}
5104
if (fs.name() == name() && fs.signature() == signature()) {
5105
return fs.offset();
5106
}
5107
}
5108
ResourceMark rm;
5109
tty->print_cr("Invalid layout of %s at %s/%s%s", ik->external_name(), name()->as_C_string(), signature()->as_C_string(), may_be_java ? " (may_be_java)" : "");
5110
#ifndef PRODUCT
5111
ik->print();
5112
tty->print_cr("all fields:");
5113
for (AllFieldStream fs(ik); !fs.done(); fs.next()) {
5114
tty->print_cr(" name: %s, sig: %s, flags: %08x", fs.name()->as_C_string(), fs.signature()->as_C_string(), fs.access_flags().as_int());
5115
}
5116
#endif //PRODUCT
5117
vm_exit_during_initialization("Invalid layout of well-known class: use -Xlog:class+load=info to see the origin of the problem class");
5118
return -1;
5119
}
5120
5121
void javaClasses_init() {
5122
JavaClasses::compute_offsets();
5123
JavaClasses::check_offsets();
5124
FilteredFieldsMap::initialize(); // must be done after computing offsets.
5125
}
5126
5127