Mercurial > hg > truffle
comparison src/share/vm/classfile/javaClasses.cpp @ 6948:e522a00b91aa
Merge with http://hg.openjdk.java.net/hsx/hsx25/hotspot/ after NPG - C++ build works
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Mon, 12 Nov 2012 23:14:12 +0100 |
parents | 18fb7da42534 |
children | 2cb439954abf |
comparison
equal
deleted
inserted
replaced
6711:ae13cc658b80 | 6948:e522a00b91aa |
---|---|
36 #include "memory/universe.inline.hpp" | 36 #include "memory/universe.inline.hpp" |
37 #include "oops/fieldStreams.hpp" | 37 #include "oops/fieldStreams.hpp" |
38 #include "oops/instanceKlass.hpp" | 38 #include "oops/instanceKlass.hpp" |
39 #include "oops/instanceMirrorKlass.hpp" | 39 #include "oops/instanceMirrorKlass.hpp" |
40 #include "oops/klass.hpp" | 40 #include "oops/klass.hpp" |
41 #include "oops/klassOop.hpp" | 41 #include "oops/method.hpp" |
42 #include "oops/methodOop.hpp" | |
43 #include "oops/symbol.hpp" | 42 #include "oops/symbol.hpp" |
44 #include "oops/typeArrayOop.hpp" | 43 #include "oops/typeArrayOop.hpp" |
45 #include "runtime/fieldDescriptor.hpp" | 44 #include "runtime/fieldDescriptor.hpp" |
46 #include "runtime/handles.inline.hpp" | 45 #include "runtime/handles.inline.hpp" |
47 #include "runtime/interfaceSupport.hpp" | 46 #include "runtime/interfaceSupport.hpp" |
104 } | 103 } |
105 return NULL; | 104 return NULL; |
106 } | 105 } |
107 | 106 |
108 | 107 |
109 static bool find_field(instanceKlass* ik, | 108 static bool find_field(InstanceKlass* ik, |
110 Symbol* name_symbol, Symbol* signature_symbol, | 109 Symbol* name_symbol, Symbol* signature_symbol, |
111 fieldDescriptor* fd, | 110 fieldDescriptor* fd, |
112 bool allow_super = false) { | 111 bool allow_super = false) { |
113 if (allow_super) | 112 if (allow_super) |
114 return ik->find_field(name_symbol, signature_symbol, fd) != NULL; | 113 return ik->find_field(name_symbol, signature_symbol, fd) != NULL; |
117 } | 116 } |
118 | 117 |
119 // Helpful routine for computing field offsets at run time rather than hardcoding them | 118 // Helpful routine for computing field offsets at run time rather than hardcoding them |
120 static void | 119 static void |
121 compute_offset(int &dest_offset, | 120 compute_offset(int &dest_offset, |
122 klassOop klass_oop, Symbol* name_symbol, Symbol* signature_symbol, | 121 Klass* klass_oop, Symbol* name_symbol, Symbol* signature_symbol, |
123 bool allow_super = false) { | 122 bool allow_super = false) { |
124 fieldDescriptor fd; | 123 fieldDescriptor fd; |
125 instanceKlass* ik = instanceKlass::cast(klass_oop); | 124 InstanceKlass* ik = InstanceKlass::cast(klass_oop); |
126 if (!find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) { | 125 if (!find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) { |
127 ResourceMark rm; | 126 ResourceMark rm; |
128 tty->print_cr("Invalid layout of %s at %s", ik->external_name(), name_symbol->as_C_string()); | 127 tty->print_cr("Invalid layout of %s at %s", ik->external_name(), name_symbol->as_C_string()); |
129 #ifndef PRODUCT | 128 #ifndef PRODUCT |
130 klass_oop->print(); | 129 klass_oop->print(); |
131 tty->print_cr("all fields:"); | 130 tty->print_cr("all fields:"); |
132 for (AllFieldStream fs(instanceKlass::cast(klass_oop)); !fs.done(); fs.next()) { | 131 for (AllFieldStream fs(InstanceKlass::cast(klass_oop)); !fs.done(); fs.next()) { |
133 tty->print_cr(" name: %s, sig: %s, flags: %08x", fs.name()->as_C_string(), fs.signature()->as_C_string(), fs.access_flags().as_int()); | 132 tty->print_cr(" name: %s, sig: %s, flags: %08x", fs.name()->as_C_string(), fs.signature()->as_C_string(), fs.access_flags().as_int()); |
134 } | 133 } |
135 #endif //PRODUCT | 134 #endif //PRODUCT |
136 fatal("Invalid layout of preloaded class"); | 135 fatal("Invalid layout of preloaded class"); |
137 } | 136 } |
139 } | 138 } |
140 | 139 |
141 // Same as above but for "optional" offsets that might not be present in certain JDK versions | 140 // Same as above but for "optional" offsets that might not be present in certain JDK versions |
142 static void | 141 static void |
143 compute_optional_offset(int& dest_offset, | 142 compute_optional_offset(int& dest_offset, |
144 klassOop klass_oop, Symbol* name_symbol, Symbol* signature_symbol, | 143 Klass* klass_oop, Symbol* name_symbol, Symbol* signature_symbol, |
145 bool allow_super = false) { | 144 bool allow_super = false) { |
146 fieldDescriptor fd; | 145 fieldDescriptor fd; |
147 instanceKlass* ik = instanceKlass::cast(klass_oop); | 146 InstanceKlass* ik = InstanceKlass::cast(klass_oop); |
148 if (find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) { | 147 if (find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) { |
149 dest_offset = fd.offset(); | 148 dest_offset = fd.offset(); |
150 } | 149 } |
151 } | 150 } |
152 | 151 |
159 bool java_lang_String::initialized = false; | 158 bool java_lang_String::initialized = false; |
160 | 159 |
161 void java_lang_String::compute_offsets() { | 160 void java_lang_String::compute_offsets() { |
162 assert(!initialized, "offsets should be initialized only once"); | 161 assert(!initialized, "offsets should be initialized only once"); |
163 | 162 |
164 klassOop k = SystemDictionary::String_klass(); | 163 Klass* k = SystemDictionary::String_klass(); |
165 compute_offset(value_offset, k, vmSymbols::value_name(), vmSymbols::char_array_signature()); | 164 compute_offset(value_offset, k, vmSymbols::value_name(), vmSymbols::char_array_signature()); |
166 compute_optional_offset(offset_offset, k, vmSymbols::offset_name(), vmSymbols::int_signature()); | 165 compute_optional_offset(offset_offset, k, vmSymbols::offset_name(), vmSymbols::int_signature()); |
167 compute_optional_offset(count_offset, k, vmSymbols::count_name(), vmSymbols::int_signature()); | 166 compute_optional_offset(count_offset, k, vmSymbols::count_name(), vmSymbols::int_signature()); |
168 compute_optional_offset(hash_offset, k, vmSymbols::hash_name(), vmSymbols::int_signature()); | 167 compute_optional_offset(hash_offset, k, vmSymbols::hash_name(), vmSymbols::int_signature()); |
169 | 168 |
170 initialized = true; | 169 initialized = true; |
171 } | 170 } |
172 | 171 |
173 Handle java_lang_String::basic_create(int length, bool tenured, TRAPS) { | 172 Handle java_lang_String::basic_create(int length, TRAPS) { |
174 assert(initialized, "Must be initialized"); | 173 assert(initialized, "Must be initialized"); |
175 // Create the String object first, so there's a chance that the String | 174 // Create the String object first, so there's a chance that the String |
176 // and the char array it points to end up in the same cache line. | 175 // and the char array it points to end up in the same cache line. |
177 oop obj; | 176 oop obj; |
178 if (tenured) { | 177 obj = InstanceKlass::cast(SystemDictionary::String_klass())->allocate_instance(CHECK_NH); |
179 obj = instanceKlass::cast(SystemDictionary::String_klass())->allocate_permanent_instance(CHECK_NH); | |
180 } else { | |
181 obj = instanceKlass::cast(SystemDictionary::String_klass())->allocate_instance(CHECK_NH); | |
182 } | |
183 | 178 |
184 // Create the char array. The String object must be handlized here | 179 // Create the char array. The String object must be handlized here |
185 // because GC can happen as a result of the allocation attempt. | 180 // because GC can happen as a result of the allocation attempt. |
186 Handle h_obj(THREAD, obj); | 181 Handle h_obj(THREAD, obj); |
187 typeArrayOop buffer; | 182 typeArrayOop buffer; |
188 if (tenured) { | |
189 buffer = oopFactory::new_permanent_charArray(length, CHECK_NH); | |
190 } else { | |
191 buffer = oopFactory::new_charArray(length, CHECK_NH); | 183 buffer = oopFactory::new_charArray(length, CHECK_NH); |
192 } | |
193 | 184 |
194 // Point the String at the char array | 185 // Point the String at the char array |
195 obj = h_obj(); | 186 obj = h_obj(); |
196 set_value(obj, buffer); | 187 set_value(obj, buffer); |
197 // No need to zero the offset, allocation zero'ed the entire String object | 188 // No need to zero the offset, allocation zero'ed the entire String object |
200 set_count(obj, length); | 191 set_count(obj, length); |
201 | 192 |
202 return h_obj; | 193 return h_obj; |
203 } | 194 } |
204 | 195 |
205 Handle java_lang_String::basic_create_from_unicode(jchar* unicode, int length, bool tenured, TRAPS) { | 196 Handle java_lang_String::create_from_unicode(jchar* unicode, int length, TRAPS) { |
206 Handle h_obj = basic_create(length, tenured, CHECK_NH); | 197 Handle h_obj = basic_create(length, CHECK_NH); |
207 typeArrayOop buffer = value(h_obj()); | 198 typeArrayOop buffer = value(h_obj()); |
208 for (int index = 0; index < length; index++) { | 199 for (int index = 0; index < length; index++) { |
209 buffer->char_at_put(index, unicode[index]); | 200 buffer->char_at_put(index, unicode[index]); |
210 } | 201 } |
211 return h_obj; | 202 return h_obj; |
212 } | 203 } |
213 | 204 |
214 Handle java_lang_String::create_from_unicode(jchar* unicode, int length, TRAPS) { | |
215 return basic_create_from_unicode(unicode, length, false, CHECK_NH); | |
216 } | |
217 | |
218 Handle java_lang_String::create_tenured_from_unicode(jchar* unicode, int length, TRAPS) { | |
219 return basic_create_from_unicode(unicode, length, JavaObjectsInPerm, CHECK_NH); | |
220 } | |
221 | |
222 oop java_lang_String::create_oop_from_unicode(jchar* unicode, int length, TRAPS) { | 205 oop java_lang_String::create_oop_from_unicode(jchar* unicode, int length, TRAPS) { |
223 Handle h_obj = basic_create_from_unicode(unicode, length, false, CHECK_0); | 206 Handle h_obj = create_from_unicode(unicode, length, CHECK_0); |
224 return h_obj(); | 207 return h_obj(); |
225 } | 208 } |
226 | 209 |
227 Handle java_lang_String::create_from_str(const char* utf8_str, TRAPS) { | 210 Handle java_lang_String::create_from_str(const char* utf8_str, TRAPS) { |
228 if (utf8_str == NULL) { | 211 if (utf8_str == NULL) { |
229 return Handle(); | 212 return Handle(); |
230 } | 213 } |
231 int length = UTF8::unicode_length(utf8_str); | 214 int length = UTF8::unicode_length(utf8_str); |
232 Handle h_obj = basic_create(length, false, CHECK_NH); | 215 Handle h_obj = basic_create(length, CHECK_NH); |
233 if (length > 0) { | 216 if (length > 0) { |
234 UTF8::convert_to_unicode(utf8_str, value(h_obj())->char_at_addr(0), length); | 217 UTF8::convert_to_unicode(utf8_str, value(h_obj())->char_at_addr(0), length); |
235 } | 218 } |
236 return h_obj; | 219 return h_obj; |
237 } | 220 } |
241 return h_obj(); | 224 return h_obj(); |
242 } | 225 } |
243 | 226 |
244 Handle java_lang_String::create_from_symbol(Symbol* symbol, TRAPS) { | 227 Handle java_lang_String::create_from_symbol(Symbol* symbol, TRAPS) { |
245 int length = UTF8::unicode_length((char*)symbol->bytes(), symbol->utf8_length()); | 228 int length = UTF8::unicode_length((char*)symbol->bytes(), symbol->utf8_length()); |
246 Handle h_obj = basic_create(length, false, CHECK_NH); | 229 Handle h_obj = basic_create(length, CHECK_NH); |
247 if (length > 0) { | 230 if (length > 0) { |
248 UTF8::convert_to_unicode((char*)symbol->bytes(), value(h_obj())->char_at_addr(0), length); | 231 UTF8::convert_to_unicode((char*)symbol->bytes(), value(h_obj())->char_at_addr(0), length); |
249 } | 232 } |
250 return h_obj; | 233 return h_obj; |
251 } | 234 } |
325 } | 308 } |
326 | 309 |
327 // Create new UNICODE buffer. Must handlize value because GC | 310 // Create new UNICODE buffer. Must handlize value because GC |
328 // may happen during String and char array creation. | 311 // may happen during String and char array creation. |
329 typeArrayHandle h_value(THREAD, value); | 312 typeArrayHandle h_value(THREAD, value); |
330 Handle string = basic_create(length, false, CHECK_NH); | 313 Handle string = basic_create(length, CHECK_NH); |
331 | 314 |
332 typeArrayOop from_buffer = h_value(); | 315 typeArrayOop from_buffer = h_value(); |
333 typeArrayOop to_buffer = java_lang_String::value(string()); | 316 typeArrayOop to_buffer = java_lang_String::value(string()); |
334 | 317 |
335 // Copy contents | 318 // Copy contents |
428 jchar* position = value->char_at_addr(offset + start); | 411 jchar* position = value->char_at_addr(offset + start); |
429 return UNICODE::as_utf8(position, len); | 412 return UNICODE::as_utf8(position, len); |
430 } | 413 } |
431 | 414 |
432 bool java_lang_String::equals(oop java_string, jchar* chars, int len) { | 415 bool java_lang_String::equals(oop java_string, jchar* chars, int len) { |
433 assert(SharedSkipVerify || | 416 assert(java_string->klass() == SystemDictionary::String_klass(), |
434 java_string->klass() == SystemDictionary::String_klass(), | |
435 "must be java_string"); | 417 "must be java_string"); |
436 typeArrayOop value = java_lang_String::value(java_string); | 418 typeArrayOop value = java_lang_String::value(java_string); |
437 int offset = java_lang_String::offset(java_string); | 419 int offset = java_lang_String::offset(java_string); |
438 int length = java_lang_String::length(java_string); | 420 int length = java_lang_String::length(java_string); |
439 if (length != len) { | 421 if (length != len) { |
515 } | 497 } |
516 } | 498 } |
517 | 499 |
518 | 500 |
519 void java_lang_Class::fixup_mirror(KlassHandle k, TRAPS) { | 501 void java_lang_Class::fixup_mirror(KlassHandle k, TRAPS) { |
520 assert(instanceMirrorKlass::offset_of_static_fields() != 0, "must have been computed already"); | 502 assert(InstanceMirrorKlass::offset_of_static_fields() != 0, "must have been computed already"); |
521 | 503 |
504 // If the offset was read from the shared archive, it was fixed up already | |
505 if (!k->is_shared()) { | |
522 if (k->oop_is_instance()) { | 506 if (k->oop_is_instance()) { |
523 // During bootstrap, java.lang.Class wasn't loaded so static field | 507 // During bootstrap, java.lang.Class wasn't loaded so static field |
524 // offsets were computed without the size added it. Go back and | 508 // offsets were computed without the size added it. Go back and |
525 // update all the static field offsets to included the size. | 509 // update all the static field offsets to included the size. |
526 for (JavaFieldStream fs(instanceKlass::cast(k())); !fs.done(); fs.next()) { | 510 for (JavaFieldStream fs(InstanceKlass::cast(k())); !fs.done(); fs.next()) { |
527 if (fs.access_flags().is_static()) { | 511 if (fs.access_flags().is_static()) { |
528 int real_offset = fs.offset() + instanceMirrorKlass::offset_of_static_fields(); | 512 int real_offset = fs.offset() + InstanceMirrorKlass::offset_of_static_fields(); |
529 fs.set_offset(real_offset); | 513 fs.set_offset(real_offset); |
530 } | 514 } |
531 } | 515 } |
516 } | |
532 } | 517 } |
533 create_mirror(k, CHECK); | 518 create_mirror(k, CHECK); |
534 } | 519 } |
535 | 520 |
536 oop java_lang_Class::create_mirror(KlassHandle k, TRAPS) { | 521 oop java_lang_Class::create_mirror(KlassHandle k, TRAPS) { |
539 // to support Class.getModifiers(). Instance classes recalculate | 524 // to support Class.getModifiers(). Instance classes recalculate |
540 // the cached flags after the class file is parsed, but before the | 525 // the cached flags after the class file is parsed, but before the |
541 // class is put into the system dictionary. | 526 // class is put into the system dictionary. |
542 int computed_modifiers = k->compute_modifier_flags(CHECK_0); | 527 int computed_modifiers = k->compute_modifier_flags(CHECK_0); |
543 k->set_modifier_flags(computed_modifiers); | 528 k->set_modifier_flags(computed_modifiers); |
544 if (SystemDictionary::Class_klass_loaded() && (k->oop_is_instance() || k->oop_is_javaArray())) { | 529 // Class_klass has to be loaded because it is used to allocate |
530 // the mirror. | |
531 if (SystemDictionary::Class_klass_loaded()) { | |
545 // Allocate mirror (java.lang.Class instance) | 532 // Allocate mirror (java.lang.Class instance) |
546 Handle mirror = instanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(k, CHECK_0); | 533 Handle mirror = InstanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(k, CHECK_0); |
547 | 534 |
548 instanceMirrorKlass* mk = instanceMirrorKlass::cast(mirror->klass()); | 535 InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass()); |
549 java_lang_Class::set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror())); | 536 java_lang_Class::set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror())); |
550 | 537 |
551 // It might also have a component mirror. This mirror must already exist. | 538 // It might also have a component mirror. This mirror must already exist. |
552 if (k->oop_is_javaArray()) { | 539 if (k->oop_is_array()) { |
553 Handle comp_mirror; | 540 Handle comp_mirror; |
554 if (k->oop_is_typeArray()) { | 541 if (k->oop_is_typeArray()) { |
555 BasicType type = typeArrayKlass::cast(k->as_klassOop())->element_type(); | 542 BasicType type = TypeArrayKlass::cast(k())->element_type(); |
556 comp_mirror = Universe::java_mirror(type); | 543 comp_mirror = Universe::java_mirror(type); |
557 assert(comp_mirror.not_null(), "must have primitive mirror"); | 544 } else { |
558 } else if (k->oop_is_objArray()) { | 545 assert(k->oop_is_objArray(), "Must be"); |
559 klassOop element_klass = objArrayKlass::cast(k->as_klassOop())->element_klass(); | 546 Klass* element_klass = ObjArrayKlass::cast(k())->element_klass(); |
560 if (element_klass != NULL | 547 assert(element_klass != NULL, "Must have an element klass"); |
561 && (Klass::cast(element_klass)->oop_is_instance() || | |
562 Klass::cast(element_klass)->oop_is_javaArray())) { | |
563 comp_mirror = Klass::cast(element_klass)->java_mirror(); | 548 comp_mirror = Klass::cast(element_klass)->java_mirror(); |
564 assert(comp_mirror.not_null(), "must have element mirror"); | |
565 } | |
566 // else some object array internal to the VM, like systemObjArrayKlassObj | |
567 } | 549 } |
568 if (comp_mirror.not_null()) { | 550 assert(comp_mirror.not_null(), "must have a mirror"); |
551 | |
569 // Two-way link between the array klass and its component mirror: | 552 // Two-way link between the array klass and its component mirror: |
570 arrayKlass::cast(k->as_klassOop())->set_component_mirror(comp_mirror()); | 553 ArrayKlass::cast(k())->set_component_mirror(comp_mirror()); |
571 set_array_klass(comp_mirror(), k->as_klassOop()); | 554 set_array_klass(comp_mirror(), k()); |
572 } | 555 } else { |
573 } else if (k->oop_is_instance()) { | 556 assert(k->oop_is_instance(), "Must be"); |
574 // Initialize static fields | 557 // Initialize static fields |
575 instanceKlass::cast(k())->do_local_static_fields(&initialize_static_field, CHECK_NULL); | 558 InstanceKlass::cast(k())->do_local_static_fields(&initialize_static_field, CHECK_NULL); |
576 } | 559 } |
577 return mirror(); | 560 return mirror(); |
578 } else { | 561 } else { |
562 if (fixup_mirror_list() == NULL) { | |
563 GrowableArray<Klass*>* list = | |
564 new (ResourceObj::C_HEAP, mtClass) GrowableArray<Klass*>(40, true); | |
565 set_fixup_mirror_list(list); | |
566 } | |
567 fixup_mirror_list()->push(k()); | |
579 return NULL; | 568 return NULL; |
580 } | 569 } |
581 } | 570 } |
582 | 571 |
583 | 572 |
600 } | 589 } |
601 | 590 |
602 oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS) { | 591 oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS) { |
603 // This should be improved by adding a field at the Java level or by | 592 // This should be improved by adding a field at the Java level or by |
604 // introducing a new VM klass (see comment in ClassFileParser) | 593 // introducing a new VM klass (see comment in ClassFileParser) |
605 oop java_class = instanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance((oop)NULL, CHECK_0); | 594 oop java_class = InstanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(NULL, CHECK_0); |
606 if (type != T_VOID) { | 595 if (type != T_VOID) { |
607 klassOop aklass = Universe::typeArrayKlassObj(type); | 596 Klass* aklass = Universe::typeArrayKlassObj(type); |
608 assert(aklass != NULL, "correct bootstrap"); | 597 assert(aklass != NULL, "correct bootstrap"); |
609 set_array_klass(java_class, aklass); | 598 set_array_klass(java_class, aklass); |
610 } | 599 } |
611 #ifdef ASSERT | 600 #ifdef ASSERT |
612 instanceMirrorKlass* mk = instanceMirrorKlass::cast(SystemDictionary::Class_klass()); | 601 InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(SystemDictionary::Class_klass()); |
613 assert(java_lang_Class::static_oop_field_count(java_class) == 0, "should have been zeroed by allocation"); | 602 assert(java_lang_Class::static_oop_field_count(java_class) == 0, "should have been zeroed by allocation"); |
614 #endif | 603 #endif |
615 return java_class; | 604 return java_class; |
616 } | 605 } |
617 | 606 |
618 | 607 #ifdef GRAAL |
619 klassOop java_lang_Class::as_klassOop(oop java_class) { | 608 oop java_lang_Class::graal_mirror(oop java_class) { |
609 assert(_graal_mirror_offset != 0, "must be set"); | |
610 return java_class->obj_field(_graal_mirror_offset); | |
611 } | |
612 #endif | |
613 | |
614 Klass* java_lang_Class::as_Klass(oop java_class) { | |
620 //%note memory_2 | 615 //%note memory_2 |
621 assert(java_lang_Class::is_instance(java_class), "must be a Class object"); | 616 assert(java_lang_Class::is_instance(java_class), "must be a Class object"); |
622 klassOop k = klassOop(java_class->obj_field(_klass_offset)); | 617 Klass* k = ((Klass*)java_class->metadata_field(_klass_offset)); |
623 assert(k == NULL || k->is_klass(), "type check"); | 618 assert(k == NULL || k->is_klass(), "type check"); |
624 return k; | 619 return k; |
625 } | 620 } |
626 | 621 |
627 | 622 |
628 void java_lang_Class::set_klass(oop java_class, klassOop klass) { | 623 void java_lang_Class::set_klass(oop java_class, Klass* klass) { |
629 assert(java_lang_Class::is_instance(java_class), "must be a Class object"); | 624 assert(java_lang_Class::is_instance(java_class), "must be a Class object"); |
630 java_class->obj_field_put(_klass_offset, klass); | 625 java_class->metadata_field_put(_klass_offset, klass); |
631 } | 626 } |
632 | 627 |
633 | 628 |
634 void java_lang_Class::print_signature(oop java_class, outputStream* st) { | 629 void java_lang_Class::print_signature(oop java_class, outputStream* st) { |
635 assert(java_lang_Class::is_instance(java_class), "must be a Class object"); | 630 assert(java_lang_Class::is_instance(java_class), "must be a Class object"); |
636 Symbol* name = NULL; | 631 Symbol* name = NULL; |
637 bool is_instance = false; | 632 bool is_instance = false; |
638 if (is_primitive(java_class)) { | 633 if (is_primitive(java_class)) { |
639 name = vmSymbols::type_signature(primitive_type(java_class)); | 634 name = vmSymbols::type_signature(primitive_type(java_class)); |
640 } else { | 635 } else { |
641 klassOop k = as_klassOop(java_class); | 636 Klass* k = as_Klass(java_class); |
642 is_instance = Klass::cast(k)->oop_is_instance(); | 637 is_instance = Klass::cast(k)->oop_is_instance(); |
643 name = Klass::cast(k)->name(); | 638 name = Klass::cast(k)->name(); |
644 } | 639 } |
645 if (name == NULL) { | 640 if (name == NULL) { |
646 st->print("<null>"); | 641 st->print("<null>"); |
659 // Because this can create a new symbol, the caller has to decrement | 654 // Because this can create a new symbol, the caller has to decrement |
660 // the refcount, so make adjustment here and below for symbols returned | 655 // the refcount, so make adjustment here and below for symbols returned |
661 // that are not created or incremented due to a successful lookup. | 656 // that are not created or incremented due to a successful lookup. |
662 name->increment_refcount(); | 657 name->increment_refcount(); |
663 } else { | 658 } else { |
664 klassOop k = as_klassOop(java_class); | 659 Klass* k = as_Klass(java_class); |
665 if (!Klass::cast(k)->oop_is_instance()) { | 660 if (!Klass::cast(k)->oop_is_instance()) { |
666 name = Klass::cast(k)->name(); | 661 name = Klass::cast(k)->name(); |
667 name->increment_refcount(); | 662 name->increment_refcount(); |
668 } else { | 663 } else { |
669 ResourceMark rm; | 664 ResourceMark rm; |
678 } | 673 } |
679 return name; | 674 return name; |
680 } | 675 } |
681 | 676 |
682 | 677 |
683 klassOop java_lang_Class::array_klass(oop java_class) { | 678 Klass* java_lang_Class::array_klass(oop java_class) { |
684 klassOop k = klassOop(java_class->obj_field(_array_klass_offset)); | 679 Klass* k = ((Klass*)java_class->metadata_field(_array_klass_offset)); |
685 assert(k == NULL || k->is_klass() && Klass::cast(k)->oop_is_javaArray(), "should be array klass"); | 680 assert(k == NULL || k->is_klass() && Klass::cast(k)->oop_is_array(), "should be array klass"); |
686 return k; | 681 return k; |
687 } | 682 } |
688 | 683 |
689 | 684 |
690 void java_lang_Class::set_array_klass(oop java_class, klassOop klass) { | 685 void java_lang_Class::set_array_klass(oop java_class, Klass* klass) { |
691 assert(klass->is_klass() && Klass::cast(klass)->oop_is_javaArray(), "should be array klass"); | 686 assert(klass->is_klass() && Klass::cast(klass)->oop_is_array(), "should be array klass"); |
692 java_class->obj_field_put(_array_klass_offset, klass); | 687 java_class->metadata_field_put(_array_klass_offset, klass); |
693 } | 688 } |
694 | 689 |
695 | 690 |
696 methodOop java_lang_Class::resolved_constructor(oop java_class) { | 691 Method* java_lang_Class::resolved_constructor(oop java_class) { |
697 oop constructor = java_class->obj_field(_resolved_constructor_offset); | 692 Metadata* constructor = java_class->metadata_field(_resolved_constructor_offset); |
698 assert(constructor == NULL || constructor->is_method(), "should be method"); | 693 assert(constructor == NULL || constructor->is_method(), "should be method"); |
699 return methodOop(constructor); | 694 return ((Method*)constructor); |
700 } | 695 } |
701 | 696 |
702 | 697 |
703 void java_lang_Class::set_resolved_constructor(oop java_class, methodOop constructor) { | 698 void java_lang_Class::set_resolved_constructor(oop java_class, Method* constructor) { |
704 assert(constructor->is_method(), "should be method"); | 699 assert(constructor->is_method(), "should be method"); |
705 java_class->obj_field_put(_resolved_constructor_offset, constructor); | 700 java_class->metadata_field_put(_resolved_constructor_offset, constructor); |
706 } | 701 } |
707 | 702 |
708 | 703 |
709 bool java_lang_Class::is_primitive(oop java_class) { | 704 bool java_lang_Class::is_primitive(oop java_class) { |
710 // should assert: | 705 // should assert: |
711 //assert(java_lang_Class::is_instance(java_class), "must be a Class object"); | 706 //assert(java_lang_Class::is_instance(java_class), "must be a Class object"); |
712 klassOop k = klassOop(java_class->obj_field(_klass_offset)); | 707 bool is_primitive = (java_class->metadata_field(_klass_offset) == NULL); |
713 return k == NULL; | 708 |
709 #ifdef ASSERT | |
710 if (is_primitive) { | |
711 Klass* k = ((Klass*)java_class->metadata_field(_array_klass_offset)); | |
712 assert(k == NULL || is_java_primitive(ArrayKlass::cast(k)->element_type()), | |
713 "Should be either the T_VOID primitive or a java primitive"); | |
714 } | |
715 #endif | |
716 | |
717 return is_primitive; | |
714 } | 718 } |
715 | 719 |
716 | 720 |
717 BasicType java_lang_Class::primitive_type(oop java_class) { | 721 BasicType java_lang_Class::primitive_type(oop java_class) { |
718 assert(java_lang_Class::is_primitive(java_class), "just checking"); | 722 assert(java_lang_Class::is_primitive(java_class), "just checking"); |
719 klassOop ak = klassOop(java_class->obj_field(_array_klass_offset)); | 723 Klass* ak = ((Klass*)java_class->metadata_field(_array_klass_offset)); |
720 BasicType type = T_VOID; | 724 BasicType type = T_VOID; |
721 if (ak != NULL) { | 725 if (ak != NULL) { |
722 // Note: create_basic_type_mirror above initializes ak to a non-null value. | 726 // Note: create_basic_type_mirror above initializes ak to a non-null value. |
723 type = arrayKlass::cast(ak)->element_type(); | 727 type = ArrayKlass::cast(ak)->element_type(); |
724 } else { | 728 } else { |
725 assert(java_class == Universe::void_mirror(), "only valid non-array primitive"); | 729 assert(java_class == Universe::void_mirror(), "only valid non-array primitive"); |
726 } | 730 } |
727 assert(Universe::java_mirror(type) == java_class, "must be consistent"); | 731 assert(Universe::java_mirror(type) == java_class, "must be consistent"); |
728 return type; | 732 return type; |
729 } | 733 } |
730 | 734 |
731 BasicType java_lang_Class::as_BasicType(oop java_class, klassOop* reference_klass) { | 735 BasicType java_lang_Class::as_BasicType(oop java_class, Klass** reference_klass) { |
732 assert(java_lang_Class::is_instance(java_class), "must be a Class object"); | 736 assert(java_lang_Class::is_instance(java_class), "must be a Class object"); |
733 if (is_primitive(java_class)) { | 737 if (is_primitive(java_class)) { |
734 if (reference_klass != NULL) | 738 if (reference_klass != NULL) |
735 (*reference_klass) = NULL; | 739 (*reference_klass) = NULL; |
736 return primitive_type(java_class); | 740 return primitive_type(java_class); |
737 } else { | 741 } else { |
738 if (reference_klass != NULL) | 742 if (reference_klass != NULL) |
739 (*reference_klass) = as_klassOop(java_class); | 743 (*reference_klass) = as_Klass(java_class); |
740 return T_OBJECT; | 744 return T_OBJECT; |
741 } | 745 } |
742 } | 746 } |
743 | 747 |
744 | 748 |
754 | 758 |
755 void java_lang_Class::compute_offsets() { | 759 void java_lang_Class::compute_offsets() { |
756 assert(!offsets_computed, "offsets should be initialized only once"); | 760 assert(!offsets_computed, "offsets should be initialized only once"); |
757 offsets_computed = true; | 761 offsets_computed = true; |
758 | 762 |
759 klassOop klass_oop = SystemDictionary::Class_klass(); | 763 Klass* klass_oop = SystemDictionary::Class_klass(); |
760 // The classRedefinedCount field is only present starting in 1.5, | 764 // The classRedefinedCount field is only present starting in 1.5, |
761 // so don't go fatal. | 765 // so don't go fatal. |
762 compute_optional_offset(classRedefinedCount_offset, | 766 compute_optional_offset(classRedefinedCount_offset, |
763 klass_oop, vmSymbols::classRedefinedCount_name(), vmSymbols::int_signature()); | 767 klass_oop, vmSymbols::classRedefinedCount_name(), vmSymbols::int_signature()); |
764 | 768 |
812 | 816 |
813 | 817 |
814 void java_lang_Thread::compute_offsets() { | 818 void java_lang_Thread::compute_offsets() { |
815 assert(_group_offset == 0, "offsets should be initialized only once"); | 819 assert(_group_offset == 0, "offsets should be initialized only once"); |
816 | 820 |
817 klassOop k = SystemDictionary::Thread_klass(); | 821 Klass* k = SystemDictionary::Thread_klass(); |
818 compute_offset(_name_offset, k, vmSymbols::name_name(), vmSymbols::char_array_signature()); | 822 compute_offset(_name_offset, k, vmSymbols::name_name(), vmSymbols::char_array_signature()); |
819 compute_offset(_group_offset, k, vmSymbols::group_name(), vmSymbols::threadgroup_signature()); | 823 compute_offset(_group_offset, k, vmSymbols::group_name(), vmSymbols::threadgroup_signature()); |
820 compute_offset(_contextClassLoader_offset, k, vmSymbols::contextClassLoader_name(), vmSymbols::classloader_signature()); | 824 compute_offset(_contextClassLoader_offset, k, vmSymbols::contextClassLoader_name(), vmSymbols::classloader_signature()); |
821 compute_offset(_inheritedAccessControlContext_offset, k, vmSymbols::inheritedAccessControlContext_name(), vmSymbols::accesscontrolcontext_signature()); | 825 compute_offset(_inheritedAccessControlContext_offset, k, vmSymbols::inheritedAccessControlContext_name(), vmSymbols::accesscontrolcontext_signature()); |
822 compute_offset(_priority_offset, k, vmSymbols::priority_name(), vmSymbols::int_signature()); | 826 compute_offset(_priority_offset, k, vmSymbols::priority_name(), vmSymbols::int_signature()); |
845 } | 849 } |
846 | 850 |
847 | 851 |
848 typeArrayOop java_lang_Thread::name(oop java_thread) { | 852 typeArrayOop java_lang_Thread::name(oop java_thread) { |
849 oop name = java_thread->obj_field(_name_offset); | 853 oop name = java_thread->obj_field(_name_offset); |
850 assert(name == NULL || (name->is_typeArray() && typeArrayKlass::cast(name->klass())->element_type() == T_CHAR), "just checking"); | 854 assert(name == NULL || (name->is_typeArray() && TypeArrayKlass::cast(name->klass())->element_type() == T_CHAR), "just checking"); |
851 return typeArrayOop(name); | 855 return typeArrayOop(name); |
852 } | 856 } |
853 | 857 |
854 | 858 |
855 void java_lang_Thread::set_name(oop java_thread, typeArrayOop name) { | 859 void java_lang_Thread::set_name(oop java_thread, typeArrayOop name) { |
1071 } | 1075 } |
1072 | 1076 |
1073 void java_lang_ThreadGroup::compute_offsets() { | 1077 void java_lang_ThreadGroup::compute_offsets() { |
1074 assert(_parent_offset == 0, "offsets should be initialized only once"); | 1078 assert(_parent_offset == 0, "offsets should be initialized only once"); |
1075 | 1079 |
1076 klassOop k = SystemDictionary::ThreadGroup_klass(); | 1080 Klass* k = SystemDictionary::ThreadGroup_klass(); |
1077 | 1081 |
1078 compute_offset(_parent_offset, k, vmSymbols::parent_name(), vmSymbols::threadgroup_signature()); | 1082 compute_offset(_parent_offset, k, vmSymbols::parent_name(), vmSymbols::threadgroup_signature()); |
1079 compute_offset(_name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); | 1083 compute_offset(_name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); |
1080 compute_offset(_threads_offset, k, vmSymbols::threads_name(), vmSymbols::thread_array_signature()); | 1084 compute_offset(_threads_offset, k, vmSymbols::threads_name(), vmSymbols::thread_array_signature()); |
1081 compute_offset(_groups_offset, k, vmSymbols::groups_name(), vmSymbols::threadgroup_array_signature()); | 1085 compute_offset(_groups_offset, k, vmSymbols::groups_name(), vmSymbols::threadgroup_array_signature()); |
1086 compute_offset(_nthreads_offset, k, vmSymbols::nthreads_name(), vmSymbols::int_signature()); | 1090 compute_offset(_nthreads_offset, k, vmSymbols::nthreads_name(), vmSymbols::int_signature()); |
1087 compute_offset(_ngroups_offset, k, vmSymbols::ngroups_name(), vmSymbols::int_signature()); | 1091 compute_offset(_ngroups_offset, k, vmSymbols::ngroups_name(), vmSymbols::int_signature()); |
1088 } | 1092 } |
1089 | 1093 |
1090 oop java_lang_Throwable::unassigned_stacktrace() { | 1094 oop java_lang_Throwable::unassigned_stacktrace() { |
1091 instanceKlass* ik = instanceKlass::cast(SystemDictionary::Throwable_klass()); | 1095 InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::Throwable_klass()); |
1092 address addr = ik->static_field_addr(static_unassigned_stacktrace_offset); | 1096 address addr = ik->static_field_addr(static_unassigned_stacktrace_offset); |
1093 if (UseCompressedOops) { | 1097 if (UseCompressedOops) { |
1094 return oopDesc::load_decode_heap_oop((narrowOop *)addr); | 1098 return oopDesc::load_decode_heap_oop((narrowOop *)addr); |
1095 } else { | 1099 } else { |
1096 return oopDesc::load_decode_heap_oop((oop*)addr); | 1100 return oopDesc::load_decode_heap_oop((oop*)addr); |
1132 } | 1136 } |
1133 | 1137 |
1134 | 1138 |
1135 void java_lang_Throwable::print(oop throwable, outputStream* st) { | 1139 void java_lang_Throwable::print(oop throwable, outputStream* st) { |
1136 ResourceMark rm; | 1140 ResourceMark rm; |
1137 klassOop k = throwable->klass(); | 1141 Klass* k = throwable->klass(); |
1138 assert(k != NULL, "just checking"); | 1142 assert(k != NULL, "just checking"); |
1139 st->print("%s", instanceKlass::cast(k)->external_name()); | 1143 st->print("%s", InstanceKlass::cast(k)->external_name()); |
1140 oop msg = message(throwable); | 1144 oop msg = message(throwable); |
1141 if (msg != NULL) { | 1145 if (msg != NULL) { |
1142 st->print(": %s", java_lang_String::as_utf8_string(msg)); | 1146 st->print(": %s", java_lang_String::as_utf8_string(msg)); |
1143 } | 1147 } |
1144 } | 1148 } |
1145 | 1149 |
1146 | 1150 |
1147 void java_lang_Throwable::print(Handle throwable, outputStream* st) { | 1151 void java_lang_Throwable::print(Handle throwable, outputStream* st) { |
1148 ResourceMark rm; | 1152 ResourceMark rm; |
1149 klassOop k = throwable->klass(); | 1153 Klass* k = throwable->klass(); |
1150 assert(k != NULL, "just checking"); | 1154 assert(k != NULL, "just checking"); |
1151 st->print("%s", instanceKlass::cast(k)->external_name()); | 1155 st->print("%s", InstanceKlass::cast(k)->external_name()); |
1152 oop msg = message(throwable); | 1156 oop msg = message(throwable); |
1153 if (msg != NULL) { | 1157 if (msg != NULL) { |
1154 st->print(": %s", java_lang_String::as_utf8_string(msg)); | 1158 st->print(": %s", java_lang_String::as_utf8_string(msg)); |
1155 } | 1159 } |
1156 } | 1160 } |
1157 | 1161 |
1158 // Print stack trace element to resource allocated buffer | 1162 // Print stack trace element to resource allocated buffer |
1159 char* java_lang_Throwable::print_stack_element_to_buffer(methodOop method, int bci) { | 1163 char* java_lang_Throwable::print_stack_element_to_buffer(Method* method, int bci) { |
1160 // Get strings and string lengths | 1164 // Get strings and string lengths |
1161 instanceKlass* klass = instanceKlass::cast(method->method_holder()); | 1165 InstanceKlass* klass = method->method_holder(); |
1162 const char* klass_name = klass->external_name(); | 1166 const char* klass_name = klass->external_name(); |
1163 int buf_len = (int)strlen(klass_name); | 1167 int buf_len = (int)strlen(klass_name); |
1164 char* source_file_name; | 1168 char* source_file_name; |
1165 if (klass->source_file_name() == NULL) { | 1169 if (klass->source_file_name() == NULL) { |
1166 source_file_name = NULL; | 1170 source_file_name = NULL; |
1198 | 1202 |
1199 return buf; | 1203 return buf; |
1200 } | 1204 } |
1201 | 1205 |
1202 | 1206 |
1203 void java_lang_Throwable::print_stack_element(Handle stream, methodOop method, int bci) { | 1207 void java_lang_Throwable::print_stack_element(Handle stream, Method* method, int bci) { |
1204 ResourceMark rm; | 1208 ResourceMark rm; |
1205 char* buf = print_stack_element_to_buffer(method, bci); | 1209 char* buf = print_stack_element_to_buffer(method, bci); |
1206 print_to_stream(stream, buf); | 1210 print_to_stream(stream, buf); |
1207 } | 1211 } |
1208 | 1212 |
1209 void java_lang_Throwable::print_stack_element(outputStream *st, methodOop method, int bci) { | 1213 void java_lang_Throwable::print_stack_element(outputStream *st, Method* method, int bci) { |
1210 ResourceMark rm; | 1214 ResourceMark rm; |
1211 char* buf = print_stack_element_to_buffer(method, bci); | 1215 char* buf = print_stack_element_to_buffer(method, bci); |
1212 st->print_cr("%s", buf); | 1216 st->print_cr("%s", buf); |
1213 } | 1217 } |
1214 | 1218 |
1250 st->print_cr(no_stack_trace_message()); | 1254 st->print_cr(no_stack_trace_message()); |
1251 return; | 1255 return; |
1252 } | 1256 } |
1253 | 1257 |
1254 while (result.not_null()) { | 1258 while (result.not_null()) { |
1255 objArrayHandle methods (THREAD, | 1259 typeArrayHandle methods (THREAD, |
1256 objArrayOop(result->obj_at(trace_methods_offset))); | 1260 typeArrayOop(result->obj_at(trace_methods_offset))); |
1257 typeArrayHandle bcis (THREAD, | 1261 typeArrayHandle bcis (THREAD, |
1258 typeArrayOop(result->obj_at(trace_bcis_offset))); | 1262 typeArrayOop(result->obj_at(trace_bcis_offset))); |
1259 | 1263 |
1260 if (methods.is_null() || bcis.is_null()) { | 1264 if (methods.is_null() || bcis.is_null()) { |
1261 st->print_cr(no_stack_trace_message()); | 1265 st->print_cr(no_stack_trace_message()); |
1262 return; | 1266 return; |
1263 } | 1267 } |
1264 | 1268 |
1265 int length = methods()->length(); | 1269 int length = methods()->length(); |
1266 for (int index = 0; index < length; index++) { | 1270 for (int index = 0; index < length; index++) { |
1267 methodOop method = methodOop(methods()->obj_at(index)); | 1271 Method* method = ((Method*)methods()->metadata_at(index)); |
1268 if (method == NULL) goto handle_cause; | 1272 if (method == NULL) goto handle_cause; |
1269 int bci = bcis->ushort_at(index); | 1273 int bci = bcis->ushort_at(index); |
1270 print_stack_element(st, method, bci); | 1274 print_stack_element(st, method, bci); |
1271 } | 1275 } |
1272 result = objArrayHandle(THREAD, objArrayOop(result->obj_at(trace_next_offset))); | 1276 result = objArrayHandle(THREAD, objArrayOop(result->obj_at(trace_next_offset))); |
1307 print_to_stream(stream, no_stack_trace_message()); | 1311 print_to_stream(stream, no_stack_trace_message()); |
1308 return; | 1312 return; |
1309 } | 1313 } |
1310 | 1314 |
1311 while (result.not_null()) { | 1315 while (result.not_null()) { |
1312 objArrayHandle methods (thread, | 1316 typeArrayHandle methods(thread, |
1313 objArrayOop(result->obj_at(trace_methods_offset))); | 1317 typeArrayOop(result->obj_at(trace_methods_offset))); |
1314 typeArrayHandle bcis (thread, | 1318 typeArrayHandle bcis (thread, |
1315 typeArrayOop(result->obj_at(trace_bcis_offset))); | 1319 typeArrayOop(result->obj_at(trace_bcis_offset))); |
1316 | 1320 |
1317 if (methods.is_null() || bcis.is_null()) { | 1321 if (methods.is_null() || bcis.is_null()) { |
1318 print_to_stream(stream, no_stack_trace_message()); | 1322 print_to_stream(stream, no_stack_trace_message()); |
1319 return; | 1323 return; |
1320 } | 1324 } |
1321 | 1325 |
1322 int length = methods()->length(); | 1326 int length = methods()->length(); |
1323 for (int index = 0; index < length; index++) { | 1327 for (int index = 0; index < length; index++) { |
1324 methodOop method = methodOop(methods()->obj_at(index)); | 1328 Method* method = ((Method*)methods()->metadata_at(index)); |
1325 if (method == NULL) return; | 1329 if (method == NULL) return; |
1326 int bci = bcis->ushort_at(index); | 1330 int bci = bcis->ushort_at(index); |
1327 print_stack_element(stream, method, bci); | 1331 print_stack_element(stream, method, bci); |
1328 } | 1332 } |
1329 result = objArrayHandle(thread, objArrayOop(result->obj_at(trace_next_offset))); | 1333 result = objArrayHandle(thread, objArrayOop(result->obj_at(trace_next_offset))); |
1335 // to know what it looks like. | 1339 // to know what it looks like. |
1336 class BacktraceBuilder: public StackObj { | 1340 class BacktraceBuilder: public StackObj { |
1337 private: | 1341 private: |
1338 Handle _backtrace; | 1342 Handle _backtrace; |
1339 objArrayOop _head; | 1343 objArrayOop _head; |
1340 objArrayOop _methods; | 1344 typeArrayOop _methods; |
1341 typeArrayOop _bcis; | 1345 typeArrayOop _bcis; |
1346 objArrayOop _mirrors; | |
1342 int _index; | 1347 int _index; |
1343 No_Safepoint_Verifier _nsv; | 1348 No_Safepoint_Verifier _nsv; |
1344 | 1349 |
1345 public: | 1350 public: |
1346 | 1351 |
1347 enum { | 1352 enum { |
1348 trace_methods_offset = java_lang_Throwable::trace_methods_offset, | 1353 trace_methods_offset = java_lang_Throwable::trace_methods_offset, |
1349 trace_bcis_offset = java_lang_Throwable::trace_bcis_offset, | 1354 trace_bcis_offset = java_lang_Throwable::trace_bcis_offset, |
1355 trace_mirrors_offset = java_lang_Throwable::trace_mirrors_offset, | |
1350 trace_next_offset = java_lang_Throwable::trace_next_offset, | 1356 trace_next_offset = java_lang_Throwable::trace_next_offset, |
1351 trace_size = java_lang_Throwable::trace_size, | 1357 trace_size = java_lang_Throwable::trace_size, |
1352 trace_chunk_size = java_lang_Throwable::trace_chunk_size | 1358 trace_chunk_size = java_lang_Throwable::trace_chunk_size |
1353 }; | 1359 }; |
1354 | 1360 |
1355 // constructor for new backtrace | 1361 // constructor for new backtrace |
1356 BacktraceBuilder(TRAPS): _methods(NULL), _bcis(NULL), _head(NULL) { | 1362 BacktraceBuilder(TRAPS): _methods(NULL), _bcis(NULL), _head(NULL), _mirrors(NULL) { |
1357 expand(CHECK); | 1363 expand(CHECK); |
1358 _backtrace = _head; | 1364 _backtrace = _head; |
1359 _index = 0; | 1365 _index = 0; |
1360 } | 1366 } |
1361 | 1367 |
1364 Pause_No_Safepoint_Verifier pnsv(&_nsv); | 1370 Pause_No_Safepoint_Verifier pnsv(&_nsv); |
1365 | 1371 |
1366 objArrayOop head = oopFactory::new_objectArray(trace_size, CHECK); | 1372 objArrayOop head = oopFactory::new_objectArray(trace_size, CHECK); |
1367 objArrayHandle new_head(THREAD, head); | 1373 objArrayHandle new_head(THREAD, head); |
1368 | 1374 |
1369 objArrayOop methods = oopFactory::new_objectArray(trace_chunk_size, CHECK); | 1375 typeArrayOop methods = oopFactory::new_metaDataArray(trace_chunk_size, CHECK); |
1370 objArrayHandle new_methods(THREAD, methods); | 1376 typeArrayHandle new_methods(THREAD, methods); |
1371 | 1377 |
1372 typeArrayOop bcis = oopFactory::new_shortArray(trace_chunk_size, CHECK); | 1378 typeArrayOop bcis = oopFactory::new_shortArray(trace_chunk_size, CHECK); |
1373 typeArrayHandle new_bcis(THREAD, bcis); | 1379 typeArrayHandle new_bcis(THREAD, bcis); |
1374 | 1380 |
1381 objArrayOop mirrors = oopFactory::new_objectArray(trace_chunk_size, CHECK); | |
1382 objArrayHandle new_mirrors(THREAD, mirrors); | |
1383 | |
1375 if (!old_head.is_null()) { | 1384 if (!old_head.is_null()) { |
1376 old_head->obj_at_put(trace_next_offset, new_head()); | 1385 old_head->obj_at_put(trace_next_offset, new_head()); |
1377 } | 1386 } |
1378 new_head->obj_at_put(trace_methods_offset, new_methods()); | 1387 new_head->obj_at_put(trace_methods_offset, new_methods()); |
1379 new_head->obj_at_put(trace_bcis_offset, new_bcis()); | 1388 new_head->obj_at_put(trace_bcis_offset, new_bcis()); |
1389 new_head->obj_at_put(trace_mirrors_offset, new_mirrors()); | |
1380 | 1390 |
1381 _head = new_head(); | 1391 _head = new_head(); |
1382 _methods = new_methods(); | 1392 _methods = new_methods(); |
1383 _bcis = new_bcis(); | 1393 _bcis = new_bcis(); |
1394 _mirrors = new_mirrors(); | |
1384 _index = 0; | 1395 _index = 0; |
1385 } | 1396 } |
1386 | 1397 |
1387 oop backtrace() { | 1398 oop backtrace() { |
1388 return _backtrace(); | 1399 return _backtrace(); |
1389 } | 1400 } |
1390 | 1401 |
1391 inline void push(methodOop method, int bci, TRAPS) { | 1402 inline void push(Method* method, int bci, TRAPS) { |
1392 // Smear the -1 bci to 0 since the array only holds unsigned | 1403 // Smear the -1 bci to 0 since the array only holds unsigned |
1393 // shorts. The later line number lookup would just smear the -1 | 1404 // shorts. The later line number lookup would just smear the -1 |
1394 // to a 0 even if it could be recorded. | 1405 // to a 0 even if it could be recorded. |
1395 if (bci == SynchronizationEntryBCI) bci = 0; | 1406 if (bci == SynchronizationEntryBCI) bci = 0; |
1396 assert(bci == (jushort)bci, "doesn't fit"); | 1407 assert(bci == (jushort)bci, "doesn't fit"); |
1399 methodHandle mhandle(THREAD, method); | 1410 methodHandle mhandle(THREAD, method); |
1400 expand(CHECK); | 1411 expand(CHECK); |
1401 method = mhandle(); | 1412 method = mhandle(); |
1402 } | 1413 } |
1403 | 1414 |
1404 _methods->obj_at_put(_index, method); | 1415 _methods->metadata_at_put(_index, method); |
1405 _bcis->ushort_at_put(_index, bci); | 1416 _bcis->ushort_at_put(_index, bci); |
1417 // we need to save the mirrors in the backtrace to keep the methods from | |
1418 // being unloaded if their class loader is unloaded while we still have | |
1419 // this stack trace. | |
1420 _mirrors->obj_at_put(_index, method->method_holder()->java_mirror()); | |
1406 _index++; | 1421 _index++; |
1407 } | 1422 } |
1408 | 1423 |
1409 methodOop current_method() { | 1424 Method* current_method() { |
1410 assert(_index >= 0 && _index < trace_chunk_size, "out of range"); | 1425 assert(_index >= 0 && _index < trace_chunk_size, "out of range"); |
1411 return methodOop(_methods->obj_at(_index)); | 1426 return ((Method*)_methods->metadata_at(_index)); |
1412 } | 1427 } |
1413 | 1428 |
1414 jushort current_bci() { | 1429 jushort current_bci() { |
1415 assert(_index >= 0 && _index < trace_chunk_size, "out of range"); | 1430 assert(_index >= 0 && _index < trace_chunk_size, "out of range"); |
1416 return _bcis->ushort_at(_index); | 1431 return _bcis->ushort_at(_index); |
1463 bool skip_fillInStackTrace_check = false; | 1478 bool skip_fillInStackTrace_check = false; |
1464 bool skip_throwableInit_check = false; | 1479 bool skip_throwableInit_check = false; |
1465 bool skip_hidden = !ShowHiddenFrames; | 1480 bool skip_hidden = !ShowHiddenFrames; |
1466 | 1481 |
1467 for (frame fr = thread->last_frame(); max_depth != total_count;) { | 1482 for (frame fr = thread->last_frame(); max_depth != total_count;) { |
1468 methodOop method = NULL; | 1483 Method* method = NULL; |
1469 int bci = 0; | 1484 int bci = 0; |
1470 | 1485 |
1471 // Compiled java method case. | 1486 // Compiled java method case. |
1472 if (decode_offset != 0) { | 1487 if (decode_offset != 0) { |
1473 DebugInfoReadStream stream(nm, decode_offset); | 1488 DebugInfoReadStream stream(nm, decode_offset); |
1474 decode_offset = stream.read_int(); | 1489 decode_offset = stream.read_int(); |
1475 method = (methodOop)nm->oop_at(stream.read_int()); | 1490 method = (Method*)nm->metadata_at(stream.read_int()); |
1476 bci = stream.read_bci(); | 1491 bci = stream.read_bci(); |
1477 } else { | 1492 } else { |
1478 if (fr.is_first_frame()) break; | 1493 if (fr.is_first_frame()) break; |
1479 address pc = fr.pc(); | 1494 address pc = fr.pc(); |
1480 if (fr.is_interpreted_frame()) { | 1495 if (fr.is_interpreted_frame()) { |
1506 #ifdef ASSERT | 1521 #ifdef ASSERT |
1507 assert(st_method() == method && st.bci() == bci, | 1522 assert(st_method() == method && st.bci() == bci, |
1508 "Wrong stack trace"); | 1523 "Wrong stack trace"); |
1509 st.next(); | 1524 st.next(); |
1510 // vframeStream::method isn't GC-safe so store off a copy | 1525 // vframeStream::method isn't GC-safe so store off a copy |
1511 // of the methodOop in case we GC. | 1526 // of the Method* in case we GC. |
1512 if (!st.at_end()) { | 1527 if (!st.at_end()) { |
1513 st_method = st.method(); | 1528 st_method = st.method(); |
1514 } | 1529 } |
1515 #endif | 1530 #endif |
1516 | 1531 |
1578 // No-op if stack trace is disabled | 1593 // No-op if stack trace is disabled |
1579 if (!StackTraceInThrowable) return; | 1594 if (!StackTraceInThrowable) return; |
1580 | 1595 |
1581 objArrayOop h_oop = oopFactory::new_objectArray(trace_size, CHECK); | 1596 objArrayOop h_oop = oopFactory::new_objectArray(trace_size, CHECK); |
1582 objArrayHandle backtrace (THREAD, h_oop); | 1597 objArrayHandle backtrace (THREAD, h_oop); |
1583 objArrayOop m_oop = oopFactory::new_objectArray(trace_chunk_size, CHECK); | 1598 typeArrayOop m_oop = oopFactory::new_metaDataArray(trace_chunk_size, CHECK); |
1584 objArrayHandle methods (THREAD, m_oop); | 1599 typeArrayHandle methods (THREAD, m_oop); |
1585 typeArrayOop b = oopFactory::new_shortArray(trace_chunk_size, CHECK); | 1600 typeArrayOop b = oopFactory::new_shortArray(trace_chunk_size, CHECK); |
1586 typeArrayHandle bcis(THREAD, b); | 1601 typeArrayHandle bcis(THREAD, b); |
1602 objArrayOop mirror_oop = oopFactory::new_objectArray(trace_chunk_size, CHECK); | |
1603 objArrayHandle mirrors (THREAD, mirror_oop); | |
1587 | 1604 |
1588 // backtrace has space for one chunk (next is NULL) | 1605 // backtrace has space for one chunk (next is NULL) |
1589 backtrace->obj_at_put(trace_methods_offset, methods()); | 1606 backtrace->obj_at_put(trace_methods_offset, methods()); |
1590 backtrace->obj_at_put(trace_bcis_offset, bcis()); | 1607 backtrace->obj_at_put(trace_bcis_offset, bcis()); |
1608 backtrace->obj_at_put(trace_mirrors_offset, mirrors()); | |
1591 set_backtrace(throwable(), backtrace()); | 1609 set_backtrace(throwable(), backtrace()); |
1592 } | 1610 } |
1593 | 1611 |
1594 | 1612 |
1595 void java_lang_Throwable::fill_in_stack_trace_of_preallocated_backtrace(Handle throwable) { | 1613 void java_lang_Throwable::fill_in_stack_trace_of_preallocated_backtrace(Handle throwable) { |
1598 // No-op if stack trace is disabled | 1616 // No-op if stack trace is disabled |
1599 if (!StackTraceInThrowable) return; | 1617 if (!StackTraceInThrowable) return; |
1600 | 1618 |
1601 assert(throwable->is_a(SystemDictionary::Throwable_klass()), "sanity check"); | 1619 assert(throwable->is_a(SystemDictionary::Throwable_klass()), "sanity check"); |
1602 | 1620 |
1603 oop backtrace = java_lang_Throwable::backtrace(throwable()); | 1621 objArrayOop backtrace = (objArrayOop)java_lang_Throwable::backtrace(throwable()); |
1604 assert(backtrace != NULL, "backtrace not preallocated"); | 1622 assert(backtrace != NULL, "backtrace not preallocated"); |
1605 | 1623 |
1606 oop m = objArrayOop(backtrace)->obj_at(trace_methods_offset); | 1624 oop m = backtrace->obj_at(trace_methods_offset); |
1607 objArrayOop methods = objArrayOop(m); | 1625 typeArrayOop methods = typeArrayOop(m); |
1608 assert(methods != NULL && methods->length() > 0, "method array not preallocated"); | 1626 assert(methods != NULL && methods->length() > 0, "method array not preallocated"); |
1609 | 1627 |
1610 oop b = objArrayOop(backtrace)->obj_at(trace_bcis_offset); | 1628 oop b = backtrace->obj_at(trace_bcis_offset); |
1611 typeArrayOop bcis = typeArrayOop(b); | 1629 typeArrayOop bcis = typeArrayOop(b); |
1612 assert(bcis != NULL, "bci array not preallocated"); | 1630 assert(bcis != NULL, "bci array not preallocated"); |
1613 | 1631 |
1614 assert(methods->length() == bcis->length(), "method and bci arrays should match"); | 1632 oop mr = backtrace->obj_at(trace_mirrors_offset); |
1633 objArrayOop mirrors = objArrayOop(mr); | |
1634 assert(mirrors != NULL, "bci array not preallocated"); | |
1635 | |
1636 assert(methods->length() == bcis->length() && | |
1637 methods->length() == mirrors->length(), | |
1638 "method and bci arrays should match"); | |
1615 | 1639 |
1616 JavaThread* thread = JavaThread::current(); | 1640 JavaThread* thread = JavaThread::current(); |
1617 ResourceMark rm(thread); | 1641 ResourceMark rm(thread); |
1618 vframeStream st(thread); | 1642 vframeStream st(thread); |
1619 | 1643 |
1630 // the -1 to a 0 even if it could be recorded. | 1654 // the -1 to a 0 even if it could be recorded. |
1631 int bci = st.bci(); | 1655 int bci = st.bci(); |
1632 if (bci == SynchronizationEntryBCI) bci = 0; | 1656 if (bci == SynchronizationEntryBCI) bci = 0; |
1633 assert(bci == (jushort)bci, "doesn't fit"); | 1657 assert(bci == (jushort)bci, "doesn't fit"); |
1634 bcis->ushort_at_put(chunk_count, bci); | 1658 bcis->ushort_at_put(chunk_count, bci); |
1635 methods->obj_at_put(chunk_count, st.method()); | 1659 methods->metadata_at_put(chunk_count, st.method()); |
1660 mirrors->obj_at_put(chunk_count, | |
1661 st.method()->method_holder()->java_mirror()); | |
1636 | 1662 |
1637 chunk_count++; | 1663 chunk_count++; |
1638 | 1664 |
1639 // Bail-out for deep stacks | 1665 // Bail-out for deep stacks |
1640 if (chunk_count >= max_chunks) break; | 1666 if (chunk_count >= max_chunks) break; |
1665 depth += trace_chunk_size; | 1691 depth += trace_chunk_size; |
1666 chunk = next; | 1692 chunk = next; |
1667 } | 1693 } |
1668 assert(chunk != NULL && chunk->obj_at(trace_next_offset) == NULL, "sanity check"); | 1694 assert(chunk != NULL && chunk->obj_at(trace_next_offset) == NULL, "sanity check"); |
1669 // Count element in remaining partial chunk | 1695 // Count element in remaining partial chunk |
1670 objArrayOop methods = objArrayOop(chunk->obj_at(trace_methods_offset)); | 1696 typeArrayOop methods = typeArrayOop(chunk->obj_at(trace_methods_offset)); |
1671 typeArrayOop bcis = typeArrayOop(chunk->obj_at(trace_bcis_offset)); | 1697 typeArrayOop bcis = typeArrayOop(chunk->obj_at(trace_bcis_offset)); |
1672 assert(methods != NULL && bcis != NULL, "sanity check"); | 1698 assert(methods != NULL && bcis != NULL, "sanity check"); |
1673 for (int i = 0; i < methods->length(); i++) { | 1699 for (int i = 0; i < methods->length(); i++) { |
1674 if (methods->obj_at(i) == NULL) break; | 1700 if (methods->metadata_at(i) == NULL) break; |
1675 depth++; | 1701 depth++; |
1676 } | 1702 } |
1677 } | 1703 } |
1678 return depth; | 1704 return depth; |
1679 } | 1705 } |
1696 } | 1722 } |
1697 if (chunk == NULL) { | 1723 if (chunk == NULL) { |
1698 THROW_(vmSymbols::java_lang_IndexOutOfBoundsException(), NULL); | 1724 THROW_(vmSymbols::java_lang_IndexOutOfBoundsException(), NULL); |
1699 } | 1725 } |
1700 // Get method,bci from chunk | 1726 // Get method,bci from chunk |
1701 objArrayOop methods = objArrayOop(chunk->obj_at(trace_methods_offset)); | 1727 typeArrayOop methods = typeArrayOop(chunk->obj_at(trace_methods_offset)); |
1702 typeArrayOop bcis = typeArrayOop(chunk->obj_at(trace_bcis_offset)); | 1728 typeArrayOop bcis = typeArrayOop(chunk->obj_at(trace_bcis_offset)); |
1703 assert(methods != NULL && bcis != NULL, "sanity check"); | 1729 assert(methods != NULL && bcis != NULL, "sanity check"); |
1704 methodHandle method(THREAD, methodOop(methods->obj_at(chunk_index))); | 1730 methodHandle method(THREAD, ((Method*)methods->metadata_at(chunk_index))); |
1705 int bci = bcis->ushort_at(chunk_index); | 1731 int bci = bcis->ushort_at(chunk_index); |
1706 // Chunk can be partial full | 1732 // Chunk can be partial full |
1707 if (method.is_null()) { | 1733 if (method.is_null()) { |
1708 THROW_(vmSymbols::java_lang_IndexOutOfBoundsException(), NULL); | 1734 THROW_(vmSymbols::java_lang_IndexOutOfBoundsException(), NULL); |
1709 } | 1735 } |
1715 oop java_lang_StackTraceElement::create(methodHandle method, int bci, TRAPS) { | 1741 oop java_lang_StackTraceElement::create(methodHandle method, int bci, TRAPS) { |
1716 // SystemDictionary::stackTraceElement_klass() will be null for pre-1.4 JDKs | 1742 // SystemDictionary::stackTraceElement_klass() will be null for pre-1.4 JDKs |
1717 assert(JDK_Version::is_gte_jdk14x_version(), "should only be called in >= 1.4"); | 1743 assert(JDK_Version::is_gte_jdk14x_version(), "should only be called in >= 1.4"); |
1718 | 1744 |
1719 // Allocate java.lang.StackTraceElement instance | 1745 // Allocate java.lang.StackTraceElement instance |
1720 klassOop k = SystemDictionary::StackTraceElement_klass(); | 1746 Klass* k = SystemDictionary::StackTraceElement_klass(); |
1721 assert(k != NULL, "must be loaded in 1.4+"); | 1747 assert(k != NULL, "must be loaded in 1.4+"); |
1722 instanceKlassHandle ik (THREAD, k); | 1748 instanceKlassHandle ik (THREAD, k); |
1723 if (ik->should_be_initialized()) { | 1749 if (ik->should_be_initialized()) { |
1724 ik->initialize(CHECK_0); | 1750 ik->initialize(CHECK_0); |
1725 } | 1751 } |
1726 | 1752 |
1727 Handle element = ik->allocate_instance_handle(CHECK_0); | 1753 Handle element = ik->allocate_instance_handle(CHECK_0); |
1728 // Fill in class name | 1754 // Fill in class name |
1729 ResourceMark rm(THREAD); | 1755 ResourceMark rm(THREAD); |
1730 const char* str = instanceKlass::cast(method->method_holder())->external_name(); | 1756 const char* str = method->method_holder()->external_name(); |
1731 oop classname = StringTable::intern((char*) str, CHECK_0); | 1757 oop classname = StringTable::intern((char*) str, CHECK_0); |
1732 java_lang_StackTraceElement::set_declaringClass(element(), classname); | 1758 java_lang_StackTraceElement::set_declaringClass(element(), classname); |
1733 // Fill in method name | 1759 // Fill in method name |
1734 oop methodname = StringTable::intern(method->name(), CHECK_0); | 1760 oop methodname = StringTable::intern(method->name(), CHECK_0); |
1735 java_lang_StackTraceElement::set_methodName(element(), methodname); | 1761 java_lang_StackTraceElement::set_methodName(element(), methodname); |
1736 // Fill in source file name | 1762 // Fill in source file name |
1737 Symbol* source = instanceKlass::cast(method->method_holder())->source_file_name(); | 1763 Symbol* source = method->method_holder()->source_file_name(); |
1738 if (ShowHiddenFrames && source == NULL) | 1764 if (ShowHiddenFrames && source == NULL) |
1739 source = vmSymbols::unknown_class_name(); | 1765 source = vmSymbols::unknown_class_name(); |
1740 oop filename = StringTable::intern(source, CHECK_0); | 1766 oop filename = StringTable::intern(source, CHECK_0); |
1741 java_lang_StackTraceElement::set_fileName(element(), filename); | 1767 java_lang_StackTraceElement::set_fileName(element(), filename); |
1742 // File in source line number | 1768 // File in source line number |
1758 return element(); | 1784 return element(); |
1759 } | 1785 } |
1760 | 1786 |
1761 | 1787 |
1762 void java_lang_reflect_AccessibleObject::compute_offsets() { | 1788 void java_lang_reflect_AccessibleObject::compute_offsets() { |
1763 klassOop k = SystemDictionary::reflect_AccessibleObject_klass(); | 1789 Klass* k = SystemDictionary::reflect_AccessibleObject_klass(); |
1764 compute_offset(override_offset, k, vmSymbols::override_name(), vmSymbols::bool_signature()); | 1790 compute_offset(override_offset, k, vmSymbols::override_name(), vmSymbols::bool_signature()); |
1765 } | 1791 } |
1766 | 1792 |
1767 jboolean java_lang_reflect_AccessibleObject::override(oop reflect) { | 1793 jboolean java_lang_reflect_AccessibleObject::override(oop reflect) { |
1768 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); | 1794 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); |
1773 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); | 1799 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); |
1774 reflect->bool_field_put(override_offset, (int) value); | 1800 reflect->bool_field_put(override_offset, (int) value); |
1775 } | 1801 } |
1776 | 1802 |
1777 void java_lang_reflect_Method::compute_offsets() { | 1803 void java_lang_reflect_Method::compute_offsets() { |
1778 klassOop k = SystemDictionary::reflect_Method_klass(); | 1804 Klass* k = SystemDictionary::reflect_Method_klass(); |
1779 compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature()); | 1805 compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature()); |
1780 compute_offset(name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); | 1806 compute_offset(name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); |
1781 compute_offset(returnType_offset, k, vmSymbols::returnType_name(), vmSymbols::class_signature()); | 1807 compute_offset(returnType_offset, k, vmSymbols::returnType_name(), vmSymbols::class_signature()); |
1782 compute_offset(parameterTypes_offset, k, vmSymbols::parameterTypes_name(), vmSymbols::class_array_signature()); | 1808 compute_offset(parameterTypes_offset, k, vmSymbols::parameterTypes_name(), vmSymbols::class_array_signature()); |
1783 compute_offset(exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), vmSymbols::class_array_signature()); | 1809 compute_offset(exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), vmSymbols::class_array_signature()); |
1794 compute_optional_offset(annotation_default_offset, k, vmSymbols::annotation_default_name(), vmSymbols::byte_array_signature()); | 1820 compute_optional_offset(annotation_default_offset, k, vmSymbols::annotation_default_name(), vmSymbols::byte_array_signature()); |
1795 } | 1821 } |
1796 | 1822 |
1797 Handle java_lang_reflect_Method::create(TRAPS) { | 1823 Handle java_lang_reflect_Method::create(TRAPS) { |
1798 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); | 1824 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); |
1799 klassOop klass = SystemDictionary::reflect_Method_klass(); | 1825 Klass* klass = SystemDictionary::reflect_Method_klass(); |
1800 // This class is eagerly initialized during VM initialization, since we keep a refence | 1826 // This class is eagerly initialized during VM initialization, since we keep a refence |
1801 // to one of the methods | 1827 // to one of the methods |
1802 assert(instanceKlass::cast(klass)->is_initialized(), "must be initialized"); | 1828 assert(InstanceKlass::cast(klass)->is_initialized(), "must be initialized"); |
1803 return instanceKlass::cast(klass)->allocate_instance_handle(CHECK_NH); | 1829 return InstanceKlass::cast(klass)->allocate_instance_handle(CHECK_NH); |
1804 } | 1830 } |
1805 | 1831 |
1806 oop java_lang_reflect_Method::clazz(oop reflect) { | 1832 oop java_lang_reflect_Method::clazz(oop reflect) { |
1807 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); | 1833 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); |
1808 return reflect->obj_field(clazz_offset); | 1834 return reflect->obj_field(clazz_offset); |
1936 assert(has_annotation_default_field(), "annotation default field must be present"); | 1962 assert(has_annotation_default_field(), "annotation default field must be present"); |
1937 method->obj_field_put(annotation_default_offset, value); | 1963 method->obj_field_put(annotation_default_offset, value); |
1938 } | 1964 } |
1939 | 1965 |
1940 void java_lang_reflect_Constructor::compute_offsets() { | 1966 void java_lang_reflect_Constructor::compute_offsets() { |
1941 klassOop k = SystemDictionary::reflect_Constructor_klass(); | 1967 Klass* k = SystemDictionary::reflect_Constructor_klass(); |
1942 compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature()); | 1968 compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature()); |
1943 compute_offset(parameterTypes_offset, k, vmSymbols::parameterTypes_name(), vmSymbols::class_array_signature()); | 1969 compute_offset(parameterTypes_offset, k, vmSymbols::parameterTypes_name(), vmSymbols::class_array_signature()); |
1944 compute_offset(exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), vmSymbols::class_array_signature()); | 1970 compute_offset(exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), vmSymbols::class_array_signature()); |
1945 compute_offset(slot_offset, k, vmSymbols::slot_name(), vmSymbols::int_signature()); | 1971 compute_offset(slot_offset, k, vmSymbols::slot_name(), vmSymbols::int_signature()); |
1946 compute_offset(modifiers_offset, k, vmSymbols::modifiers_name(), vmSymbols::int_signature()); | 1972 compute_offset(modifiers_offset, k, vmSymbols::modifiers_name(), vmSymbols::int_signature()); |
1954 } | 1980 } |
1955 | 1981 |
1956 Handle java_lang_reflect_Constructor::create(TRAPS) { | 1982 Handle java_lang_reflect_Constructor::create(TRAPS) { |
1957 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); | 1983 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); |
1958 Symbol* name = vmSymbols::java_lang_reflect_Constructor(); | 1984 Symbol* name = vmSymbols::java_lang_reflect_Constructor(); |
1959 klassOop k = SystemDictionary::resolve_or_fail(name, true, CHECK_NH); | 1985 Klass* k = SystemDictionary::resolve_or_fail(name, true, CHECK_NH); |
1960 instanceKlassHandle klass (THREAD, k); | 1986 instanceKlassHandle klass (THREAD, k); |
1961 // Ensure it is initialized | 1987 // Ensure it is initialized |
1962 klass->initialize(CHECK_NH); | 1988 klass->initialize(CHECK_NH); |
1963 return klass->allocate_instance_handle(CHECK_NH); | 1989 return klass->allocate_instance_handle(CHECK_NH); |
1964 } | 1990 } |
2060 assert(has_parameter_annotations_field(), "parameter annotations field must be present"); | 2086 assert(has_parameter_annotations_field(), "parameter annotations field must be present"); |
2061 method->obj_field_put(parameter_annotations_offset, value); | 2087 method->obj_field_put(parameter_annotations_offset, value); |
2062 } | 2088 } |
2063 | 2089 |
2064 void java_lang_reflect_Field::compute_offsets() { | 2090 void java_lang_reflect_Field::compute_offsets() { |
2065 klassOop k = SystemDictionary::reflect_Field_klass(); | 2091 Klass* k = SystemDictionary::reflect_Field_klass(); |
2066 compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature()); | 2092 compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature()); |
2067 compute_offset(name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); | 2093 compute_offset(name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); |
2068 compute_offset(type_offset, k, vmSymbols::type_name(), vmSymbols::class_signature()); | 2094 compute_offset(type_offset, k, vmSymbols::type_name(), vmSymbols::class_signature()); |
2069 compute_offset(slot_offset, k, vmSymbols::slot_name(), vmSymbols::int_signature()); | 2095 compute_offset(slot_offset, k, vmSymbols::slot_name(), vmSymbols::int_signature()); |
2070 compute_offset(modifiers_offset, k, vmSymbols::modifiers_name(), vmSymbols::int_signature()); | 2096 compute_offset(modifiers_offset, k, vmSymbols::modifiers_name(), vmSymbols::int_signature()); |
2076 } | 2102 } |
2077 | 2103 |
2078 Handle java_lang_reflect_Field::create(TRAPS) { | 2104 Handle java_lang_reflect_Field::create(TRAPS) { |
2079 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); | 2105 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); |
2080 Symbol* name = vmSymbols::java_lang_reflect_Field(); | 2106 Symbol* name = vmSymbols::java_lang_reflect_Field(); |
2081 klassOop k = SystemDictionary::resolve_or_fail(name, true, CHECK_NH); | 2107 Klass* k = SystemDictionary::resolve_or_fail(name, true, CHECK_NH); |
2082 instanceKlassHandle klass (THREAD, k); | 2108 instanceKlassHandle klass (THREAD, k); |
2083 // Ensure it is initialized | 2109 // Ensure it is initialized |
2084 klass->initialize(CHECK_NH); | 2110 klass->initialize(CHECK_NH); |
2085 return klass->allocate_instance_handle(CHECK_NH); | 2111 return klass->allocate_instance_handle(CHECK_NH); |
2086 } | 2112 } |
2167 field->obj_field_put(annotations_offset, value); | 2193 field->obj_field_put(annotations_offset, value); |
2168 } | 2194 } |
2169 | 2195 |
2170 | 2196 |
2171 void sun_reflect_ConstantPool::compute_offsets() { | 2197 void sun_reflect_ConstantPool::compute_offsets() { |
2172 klassOop k = SystemDictionary::reflect_ConstantPool_klass(); | 2198 Klass* k = SystemDictionary::reflect_ConstantPool_klass(); |
2173 // This null test can be removed post beta | 2199 // This null test can be removed post beta |
2174 if (k != NULL) { | 2200 if (k != NULL) { |
2175 compute_offset(_cp_oop_offset, k, vmSymbols::constantPoolOop_name(), vmSymbols::object_signature()); | 2201 // The field is called ConstantPool* in the sun.reflect.ConstantPool class. |
2202 compute_offset(_oop_offset, k, vmSymbols::ConstantPool_name(), vmSymbols::object_signature()); | |
2176 } | 2203 } |
2177 } | 2204 } |
2178 | 2205 |
2179 | 2206 |
2180 Handle sun_reflect_ConstantPool::create(TRAPS) { | 2207 Handle sun_reflect_ConstantPool::create(TRAPS) { |
2181 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); | 2208 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); |
2182 klassOop k = SystemDictionary::reflect_ConstantPool_klass(); | 2209 Klass* k = SystemDictionary::reflect_ConstantPool_klass(); |
2183 instanceKlassHandle klass (THREAD, k); | 2210 instanceKlassHandle klass (THREAD, k); |
2184 // Ensure it is initialized | 2211 // Ensure it is initialized |
2185 klass->initialize(CHECK_NH); | 2212 klass->initialize(CHECK_NH); |
2186 return klass->allocate_instance_handle(CHECK_NH); | 2213 return klass->allocate_instance_handle(CHECK_NH); |
2187 } | 2214 } |
2188 | 2215 |
2189 | 2216 |
2190 oop sun_reflect_ConstantPool::cp_oop(oop reflect) { | 2217 void sun_reflect_ConstantPool::set_cp(oop reflect, ConstantPool* value) { |
2191 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); | 2218 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); |
2192 return reflect->obj_field(_cp_oop_offset); | 2219 oop mirror = value->pool_holder()->java_mirror(); |
2193 } | 2220 // Save the mirror to get back the constant pool. |
2194 | 2221 reflect->obj_field_put(_oop_offset, mirror); |
2195 | 2222 } |
2196 void sun_reflect_ConstantPool::set_cp_oop(oop reflect, oop value) { | 2223 |
2197 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); | 2224 ConstantPool* sun_reflect_ConstantPool::get_cp(oop reflect) { |
2198 reflect->obj_field_put(_cp_oop_offset, value); | 2225 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); |
2226 | |
2227 oop mirror = reflect->obj_field(_oop_offset); | |
2228 Klass* k = java_lang_Class::as_Klass(mirror); | |
2229 assert(k->oop_is_instance(), "Must be"); | |
2230 | |
2231 // Get the constant pool back from the klass. Since class redefinition | |
2232 // merges the new constant pool into the old, this is essentially the | |
2233 // same constant pool as the original. If constant pool merging is | |
2234 // no longer done in the future, this will have to change to save | |
2235 // the original. | |
2236 return InstanceKlass::cast(k)->constants(); | |
2199 } | 2237 } |
2200 | 2238 |
2201 void sun_reflect_UnsafeStaticFieldAccessorImpl::compute_offsets() { | 2239 void sun_reflect_UnsafeStaticFieldAccessorImpl::compute_offsets() { |
2202 klassOop k = SystemDictionary::reflect_UnsafeStaticFieldAccessorImpl_klass(); | 2240 Klass* k = SystemDictionary::reflect_UnsafeStaticFieldAccessorImpl_klass(); |
2203 // This null test can be removed post beta | 2241 // This null test can be removed post beta |
2204 if (k != NULL) { | 2242 if (k != NULL) { |
2205 compute_offset(_base_offset, k, | 2243 compute_offset(_base_offset, k, |
2206 vmSymbols::base_name(), vmSymbols::object_signature()); | 2244 vmSymbols::base_name(), vmSymbols::object_signature()); |
2207 } | 2245 } |
2208 } | 2246 } |
2209 | 2247 |
2210 oop java_lang_boxing_object::initialize_and_allocate(BasicType type, TRAPS) { | 2248 oop java_lang_boxing_object::initialize_and_allocate(BasicType type, TRAPS) { |
2211 klassOop k = SystemDictionary::box_klass(type); | 2249 Klass* k = SystemDictionary::box_klass(type); |
2212 if (k == NULL) return NULL; | 2250 if (k == NULL) return NULL; |
2213 instanceKlassHandle h (THREAD, k); | 2251 instanceKlassHandle h (THREAD, k); |
2214 if (!h->is_initialized()) h->initialize(CHECK_0); | 2252 if (!h->is_initialized()) h->initialize(CHECK_0); |
2215 return h->allocate_instance(THREAD); | 2253 return h->allocate_instance(THREAD); |
2216 } | 2254 } |
2342 } | 2380 } |
2343 } | 2381 } |
2344 | 2382 |
2345 | 2383 |
2346 // Support for java_lang_ref_Reference | 2384 // Support for java_lang_ref_Reference |
2385 HeapWord *java_lang_ref_Reference::pending_list_lock_addr() { | |
2386 InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::Reference_klass()); | |
2387 address addr = ik->static_field_addr(static_lock_offset); | |
2388 return (HeapWord*) addr; | |
2389 } | |
2390 | |
2347 oop java_lang_ref_Reference::pending_list_lock() { | 2391 oop java_lang_ref_Reference::pending_list_lock() { |
2348 instanceKlass* ik = instanceKlass::cast(SystemDictionary::Reference_klass()); | 2392 InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::Reference_klass()); |
2349 address addr = ik->static_field_addr(static_lock_offset); | 2393 address addr = ik->static_field_addr(static_lock_offset); |
2350 if (UseCompressedOops) { | 2394 if (UseCompressedOops) { |
2351 return oopDesc::load_decode_heap_oop((narrowOop *)addr); | 2395 return oopDesc::load_decode_heap_oop((narrowOop *)addr); |
2352 } else { | 2396 } else { |
2353 return oopDesc::load_decode_heap_oop((oop*)addr); | 2397 return oopDesc::load_decode_heap_oop((oop*)addr); |
2354 } | 2398 } |
2355 } | 2399 } |
2356 | 2400 |
2357 HeapWord *java_lang_ref_Reference::pending_list_addr() { | 2401 HeapWord *java_lang_ref_Reference::pending_list_addr() { |
2358 instanceKlass* ik = instanceKlass::cast(SystemDictionary::Reference_klass()); | 2402 InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::Reference_klass()); |
2359 address addr = ik->static_field_addr(static_pending_offset); | 2403 address addr = ik->static_field_addr(static_pending_offset); |
2360 // XXX This might not be HeapWord aligned, almost rather be char *. | 2404 // XXX This might not be HeapWord aligned, almost rather be char *. |
2361 return (HeapWord*)addr; | 2405 return (HeapWord*)addr; |
2362 } | 2406 } |
2363 | 2407 |
2376 jlong java_lang_ref_SoftReference::timestamp(oop ref) { | 2420 jlong java_lang_ref_SoftReference::timestamp(oop ref) { |
2377 return ref->long_field(timestamp_offset); | 2421 return ref->long_field(timestamp_offset); |
2378 } | 2422 } |
2379 | 2423 |
2380 jlong java_lang_ref_SoftReference::clock() { | 2424 jlong java_lang_ref_SoftReference::clock() { |
2381 instanceKlass* ik = instanceKlass::cast(SystemDictionary::SoftReference_klass()); | 2425 InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::SoftReference_klass()); |
2382 jlong* offset = (jlong*)ik->static_field_addr(static_clock_offset); | 2426 jlong* offset = (jlong*)ik->static_field_addr(static_clock_offset); |
2383 return *offset; | 2427 return *offset; |
2384 } | 2428 } |
2385 | 2429 |
2386 void java_lang_ref_SoftReference::set_clock(jlong value) { | 2430 void java_lang_ref_SoftReference::set_clock(jlong value) { |
2387 instanceKlass* ik = instanceKlass::cast(SystemDictionary::SoftReference_klass()); | 2431 InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::SoftReference_klass()); |
2388 jlong* offset = (jlong*)ik->static_field_addr(static_clock_offset); | 2432 jlong* offset = (jlong*)ik->static_field_addr(static_clock_offset); |
2389 *offset = value; | 2433 *offset = value; |
2390 } | 2434 } |
2391 | 2435 |
2392 | 2436 |
2398 int java_lang_invoke_MemberName::_clazz_offset; | 2442 int java_lang_invoke_MemberName::_clazz_offset; |
2399 int java_lang_invoke_MemberName::_name_offset; | 2443 int java_lang_invoke_MemberName::_name_offset; |
2400 int java_lang_invoke_MemberName::_type_offset; | 2444 int java_lang_invoke_MemberName::_type_offset; |
2401 int java_lang_invoke_MemberName::_flags_offset; | 2445 int java_lang_invoke_MemberName::_flags_offset; |
2402 int java_lang_invoke_MemberName::_vmtarget_offset; | 2446 int java_lang_invoke_MemberName::_vmtarget_offset; |
2447 int java_lang_invoke_MemberName::_vmloader_offset; | |
2403 int java_lang_invoke_MemberName::_vmindex_offset; | 2448 int java_lang_invoke_MemberName::_vmindex_offset; |
2404 | 2449 |
2405 int java_lang_invoke_LambdaForm::_vmentry_offset; | 2450 int java_lang_invoke_LambdaForm::_vmentry_offset; |
2406 | 2451 |
2407 void java_lang_invoke_MethodHandle::compute_offsets() { | 2452 void java_lang_invoke_MethodHandle::compute_offsets() { |
2408 klassOop klass_oop = SystemDictionary::MethodHandle_klass(); | 2453 Klass* klass_oop = SystemDictionary::MethodHandle_klass(); |
2409 if (klass_oop != NULL && EnableInvokeDynamic) { | 2454 if (klass_oop != NULL && EnableInvokeDynamic) { |
2410 compute_offset(_type_offset, klass_oop, vmSymbols::type_name(), vmSymbols::java_lang_invoke_MethodType_signature()); | 2455 compute_offset(_type_offset, klass_oop, vmSymbols::type_name(), vmSymbols::java_lang_invoke_MethodType_signature()); |
2411 compute_optional_offset(_form_offset, klass_oop, vmSymbols::form_name(), vmSymbols::java_lang_invoke_LambdaForm_signature()); | 2456 compute_optional_offset(_form_offset, klass_oop, vmSymbols::form_name(), vmSymbols::java_lang_invoke_LambdaForm_signature()); |
2412 if (_form_offset == 0) { | 2457 if (_form_offset == 0) { |
2413 EnableInvokeDynamic = false; | 2458 EnableInvokeDynamic = false; |
2414 } | 2459 } |
2415 } | 2460 } |
2416 } | 2461 } |
2417 | 2462 |
2418 void java_lang_invoke_MemberName::compute_offsets() { | 2463 void java_lang_invoke_MemberName::compute_offsets() { |
2419 klassOop klass_oop = SystemDictionary::MemberName_klass(); | 2464 Klass* klass_oop = SystemDictionary::MemberName_klass(); |
2420 if (klass_oop != NULL && EnableInvokeDynamic) { | 2465 if (klass_oop != NULL && EnableInvokeDynamic) { |
2421 compute_offset(_clazz_offset, klass_oop, vmSymbols::clazz_name(), vmSymbols::class_signature()); | 2466 compute_offset(_clazz_offset, klass_oop, vmSymbols::clazz_name(), vmSymbols::class_signature()); |
2422 compute_offset(_name_offset, klass_oop, vmSymbols::name_name(), vmSymbols::string_signature()); | 2467 compute_offset(_name_offset, klass_oop, vmSymbols::name_name(), vmSymbols::string_signature()); |
2423 compute_offset(_type_offset, klass_oop, vmSymbols::type_name(), vmSymbols::object_signature()); | 2468 compute_offset(_type_offset, klass_oop, vmSymbols::type_name(), vmSymbols::object_signature()); |
2424 compute_offset(_flags_offset, klass_oop, vmSymbols::flags_name(), vmSymbols::int_signature()); | 2469 compute_offset(_flags_offset, klass_oop, vmSymbols::flags_name(), vmSymbols::int_signature()); |
2425 MEMBERNAME_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET); | 2470 MEMBERNAME_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET); |
2426 } | 2471 } |
2427 } | 2472 } |
2428 | 2473 |
2429 void java_lang_invoke_LambdaForm::compute_offsets() { | 2474 void java_lang_invoke_LambdaForm::compute_offsets() { |
2430 klassOop klass_oop = SystemDictionary::LambdaForm_klass(); | 2475 Klass* klass_oop = SystemDictionary::LambdaForm_klass(); |
2431 if (klass_oop != NULL && EnableInvokeDynamic) { | 2476 if (klass_oop != NULL && EnableInvokeDynamic) { |
2432 compute_offset(_vmentry_offset, klass_oop, vmSymbols::vmentry_name(), vmSymbols::java_lang_invoke_MemberName_signature()); | 2477 compute_offset(_vmentry_offset, klass_oop, vmSymbols::vmentry_name(), vmSymbols::java_lang_invoke_MemberName_signature()); |
2433 } | 2478 } |
2434 } | 2479 } |
2435 | 2480 |
2491 void java_lang_invoke_MemberName::set_flags(oop mname, int flags) { | 2536 void java_lang_invoke_MemberName::set_flags(oop mname, int flags) { |
2492 assert(is_instance(mname), "wrong type"); | 2537 assert(is_instance(mname), "wrong type"); |
2493 mname->int_field_put(_flags_offset, flags); | 2538 mname->int_field_put(_flags_offset, flags); |
2494 } | 2539 } |
2495 | 2540 |
2496 oop java_lang_invoke_MemberName::vmtarget(oop mname) { | 2541 Metadata* java_lang_invoke_MemberName::vmtarget(oop mname) { |
2497 assert(is_instance(mname), "wrong type"); | 2542 assert(is_instance(mname), "wrong type"); |
2498 return mname->obj_field(_vmtarget_offset); | 2543 return (Metadata*)mname->address_field(_vmtarget_offset); |
2499 } | 2544 } |
2500 | 2545 |
2501 void java_lang_invoke_MemberName::set_vmtarget(oop mname, oop ref) { | 2546 void java_lang_invoke_MemberName::set_vmtarget(oop mname, Metadata* ref) { |
2502 assert(is_instance(mname), "wrong type"); | 2547 assert(is_instance(mname), "wrong type"); |
2503 #ifdef ASSERT | 2548 #ifdef ASSERT |
2504 // check the type of the vmtarget | 2549 // check the type of the vmtarget |
2505 if (ref != NULL) { | 2550 if (ref != NULL) { |
2506 switch (flags(mname) & (MN_IS_METHOD | | 2551 switch (flags(mname) & (MN_IS_METHOD | |
2516 default: | 2561 default: |
2517 ShouldNotReachHere(); | 2562 ShouldNotReachHere(); |
2518 } | 2563 } |
2519 } | 2564 } |
2520 #endif //ASSERT | 2565 #endif //ASSERT |
2521 mname->obj_field_put(_vmtarget_offset, ref); | 2566 mname->address_field_put(_vmtarget_offset, (address)ref); |
2567 oop loader = NULL; | |
2568 if (ref != NULL) { | |
2569 if (ref->is_klass()) { | |
2570 loader = ((Klass*)ref)->class_loader(); | |
2571 } else if (ref->is_method()) { | |
2572 loader = ((Method*)ref)->method_holder()->class_loader(); | |
2573 } else { | |
2574 ShouldNotReachHere(); | |
2575 } | |
2576 } | |
2577 // Add a reference to the loader to ensure the metadata is kept alive | |
2578 mname->obj_field_put(_vmloader_offset, loader); | |
2522 } | 2579 } |
2523 | 2580 |
2524 intptr_t java_lang_invoke_MemberName::vmindex(oop mname) { | 2581 intptr_t java_lang_invoke_MemberName::vmindex(oop mname) { |
2525 assert(is_instance(mname), "wrong type"); | 2582 assert(is_instance(mname), "wrong type"); |
2526 return (intptr_t) mname->address_field(_vmindex_offset); | 2583 return (intptr_t) mname->address_field(_vmindex_offset); |
2541 | 2598 |
2542 int java_lang_invoke_MethodType::_rtype_offset; | 2599 int java_lang_invoke_MethodType::_rtype_offset; |
2543 int java_lang_invoke_MethodType::_ptypes_offset; | 2600 int java_lang_invoke_MethodType::_ptypes_offset; |
2544 | 2601 |
2545 void java_lang_invoke_MethodType::compute_offsets() { | 2602 void java_lang_invoke_MethodType::compute_offsets() { |
2546 klassOop k = SystemDictionary::MethodType_klass(); | 2603 Klass* k = SystemDictionary::MethodType_klass(); |
2547 if (k != NULL) { | 2604 if (k != NULL) { |
2548 compute_offset(_rtype_offset, k, vmSymbols::rtype_name(), vmSymbols::class_signature()); | 2605 compute_offset(_rtype_offset, k, vmSymbols::rtype_name(), vmSymbols::class_signature()); |
2549 compute_offset(_ptypes_offset, k, vmSymbols::ptypes_name(), vmSymbols::class_array_signature()); | 2606 compute_offset(_ptypes_offset, k, vmSymbols::ptypes_name(), vmSymbols::class_array_signature()); |
2550 } | 2607 } |
2551 } | 2608 } |
2628 | 2685 |
2629 int java_lang_invoke_CallSite::_target_offset; | 2686 int java_lang_invoke_CallSite::_target_offset; |
2630 | 2687 |
2631 void java_lang_invoke_CallSite::compute_offsets() { | 2688 void java_lang_invoke_CallSite::compute_offsets() { |
2632 if (!EnableInvokeDynamic) return; | 2689 if (!EnableInvokeDynamic) return; |
2633 klassOop k = SystemDictionary::CallSite_klass(); | 2690 Klass* k = SystemDictionary::CallSite_klass(); |
2634 if (k != NULL) { | 2691 if (k != NULL) { |
2635 compute_offset(_target_offset, k, vmSymbols::target_name(), vmSymbols::java_lang_invoke_MethodHandle_signature()); | 2692 compute_offset(_target_offset, k, vmSymbols::target_name(), vmSymbols::java_lang_invoke_MethodHandle_signature()); |
2636 } | 2693 } |
2637 } | 2694 } |
2638 | 2695 |
2644 int java_security_AccessControlContext::_isPrivileged_offset = 0; | 2701 int java_security_AccessControlContext::_isPrivileged_offset = 0; |
2645 | 2702 |
2646 void java_security_AccessControlContext::compute_offsets() { | 2703 void java_security_AccessControlContext::compute_offsets() { |
2647 assert(_isPrivileged_offset == 0, "offsets should be initialized only once"); | 2704 assert(_isPrivileged_offset == 0, "offsets should be initialized only once"); |
2648 fieldDescriptor fd; | 2705 fieldDescriptor fd; |
2649 instanceKlass* ik = instanceKlass::cast(SystemDictionary::AccessControlContext_klass()); | 2706 InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::AccessControlContext_klass()); |
2650 | 2707 |
2651 if (!ik->find_local_field(vmSymbols::context_name(), vmSymbols::protectiondomain_signature(), &fd)) { | 2708 if (!ik->find_local_field(vmSymbols::context_name(), vmSymbols::protectiondomain_signature(), &fd)) { |
2652 fatal("Invalid layout of java.security.AccessControlContext"); | 2709 fatal("Invalid layout of java.security.AccessControlContext"); |
2653 } | 2710 } |
2654 _context_offset = fd.offset(); | 2711 _context_offset = fd.offset(); |
2666 | 2723 |
2667 | 2724 |
2668 oop java_security_AccessControlContext::create(objArrayHandle context, bool isPrivileged, Handle privileged_context, TRAPS) { | 2725 oop java_security_AccessControlContext::create(objArrayHandle context, bool isPrivileged, Handle privileged_context, TRAPS) { |
2669 assert(_isPrivileged_offset != 0, "offsets should have been initialized"); | 2726 assert(_isPrivileged_offset != 0, "offsets should have been initialized"); |
2670 // Ensure klass is initialized | 2727 // Ensure klass is initialized |
2671 instanceKlass::cast(SystemDictionary::AccessControlContext_klass())->initialize(CHECK_0); | 2728 InstanceKlass::cast(SystemDictionary::AccessControlContext_klass())->initialize(CHECK_0); |
2672 // Allocate result | 2729 // Allocate result |
2673 oop result = instanceKlass::cast(SystemDictionary::AccessControlContext_klass())->allocate_instance(CHECK_0); | 2730 oop result = InstanceKlass::cast(SystemDictionary::AccessControlContext_klass())->allocate_instance(CHECK_0); |
2674 // Fill in values | 2731 // Fill in values |
2675 result->obj_field_put(_context_offset, context()); | 2732 result->obj_field_put(_context_offset, context()); |
2676 result->obj_field_put(_privilegedContext_offset, privileged_context()); | 2733 result->obj_field_put(_privilegedContext_offset, privileged_context()); |
2677 result->bool_field_put(_isPrivileged_offset, isPrivileged); | 2734 result->bool_field_put(_isPrivileged_offset, isPrivileged); |
2678 return result; | 2735 return result; |
2679 } | 2736 } |
2680 | 2737 |
2681 | 2738 |
2682 // Support for java_lang_ClassLoader | 2739 // Support for java_lang_ClassLoader |
2740 | |
2683 bool java_lang_ClassLoader::offsets_computed = false; | 2741 bool java_lang_ClassLoader::offsets_computed = false; |
2742 int java_lang_ClassLoader::_loader_data_offset = -1; | |
2743 int java_lang_ClassLoader::_dependencies_offset = -1; | |
2684 int java_lang_ClassLoader::parallelCapable_offset = -1; | 2744 int java_lang_ClassLoader::parallelCapable_offset = -1; |
2745 | |
2746 ClassLoaderData** java_lang_ClassLoader::loader_data_addr(oop loader) { | |
2747 assert(loader != NULL && loader->is_oop(), "loader must be oop"); | |
2748 return (ClassLoaderData**) loader->address_field_addr(_loader_data_offset); | |
2749 } | |
2750 | |
2751 ClassLoaderData* java_lang_ClassLoader::loader_data(oop loader) { | |
2752 return *java_lang_ClassLoader::loader_data_addr(loader); | |
2753 } | |
2754 | |
2755 oop java_lang_ClassLoader::dependencies(oop loader) { | |
2756 return loader->obj_field(_dependencies_offset); | |
2757 } | |
2758 | |
2759 HeapWord* java_lang_ClassLoader::dependencies_addr(oop loader) { | |
2760 if (UseCompressedOops) { | |
2761 return (HeapWord*)loader->obj_field_addr<narrowOop>(_dependencies_offset); | |
2762 } else { | |
2763 return (HeapWord*)loader->obj_field_addr<oop>(_dependencies_offset); | |
2764 } | |
2765 } | |
2685 | 2766 |
2686 void java_lang_ClassLoader::compute_offsets() { | 2767 void java_lang_ClassLoader::compute_offsets() { |
2687 assert(!offsets_computed, "offsets should be initialized only once"); | 2768 assert(!offsets_computed, "offsets should be initialized only once"); |
2688 offsets_computed = true; | 2769 offsets_computed = true; |
2689 | 2770 |
2690 // The field indicating parallelCapable (parallelLockMap) is only present starting in 7, | 2771 // The field indicating parallelCapable (parallelLockMap) is only present starting in 7, |
2691 klassOop k1 = SystemDictionary::ClassLoader_klass(); | 2772 Klass* k1 = SystemDictionary::ClassLoader_klass(); |
2692 compute_optional_offset(parallelCapable_offset, | 2773 compute_optional_offset(parallelCapable_offset, |
2693 k1, vmSymbols::parallelCapable_name(), vmSymbols::concurrenthashmap_signature()); | 2774 k1, vmSymbols::parallelCapable_name(), vmSymbols::concurrenthashmap_signature()); |
2775 | |
2776 CLASSLOADER_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET); | |
2694 } | 2777 } |
2695 | 2778 |
2696 oop java_lang_ClassLoader::parent(oop loader) { | 2779 oop java_lang_ClassLoader::parent(oop loader) { |
2697 assert(is_instance(loader), "loader must be oop"); | 2780 assert(is_instance(loader), "loader must be oop"); |
2698 return loader->obj_field(parent_offset); | 2781 return loader->obj_field(parent_offset); |
2743 if (loader != NULL) { | 2826 if (loader != NULL) { |
2744 // See whether this is one of the class loaders associated with | 2827 // See whether this is one of the class loaders associated with |
2745 // the generated bytecodes for reflection, and if so, "magically" | 2828 // the generated bytecodes for reflection, and if so, "magically" |
2746 // delegate to its parent to prevent class loading from occurring | 2829 // delegate to its parent to prevent class loading from occurring |
2747 // in places where applications using reflection didn't expect it. | 2830 // in places where applications using reflection didn't expect it. |
2748 klassOop delegating_cl_class = SystemDictionary::reflect_DelegatingClassLoader_klass(); | 2831 Klass* delegating_cl_class = SystemDictionary::reflect_DelegatingClassLoader_klass(); |
2749 // This might be null in non-1.4 JDKs | 2832 // This might be null in non-1.4 JDKs |
2750 if (delegating_cl_class != NULL && loader->is_a(delegating_cl_class)) { | 2833 if (delegating_cl_class != NULL && loader->is_a(delegating_cl_class)) { |
2751 return parent(loader); | 2834 return parent(loader); |
2752 } | 2835 } |
2753 } | 2836 } |
2755 } | 2838 } |
2756 | 2839 |
2757 | 2840 |
2758 // Support for java_lang_System | 2841 // Support for java_lang_System |
2759 int java_lang_System::in_offset_in_bytes() { | 2842 int java_lang_System::in_offset_in_bytes() { |
2760 return (instanceMirrorKlass::offset_of_static_fields() + static_in_offset); | 2843 return (InstanceMirrorKlass::offset_of_static_fields() + static_in_offset); |
2761 } | 2844 } |
2762 | 2845 |
2763 | 2846 |
2764 int java_lang_System::out_offset_in_bytes() { | 2847 int java_lang_System::out_offset_in_bytes() { |
2765 return (instanceMirrorKlass::offset_of_static_fields() + static_out_offset); | 2848 return (InstanceMirrorKlass::offset_of_static_fields() + static_out_offset); |
2766 } | 2849 } |
2767 | 2850 |
2768 | 2851 |
2769 int java_lang_System::err_offset_in_bytes() { | 2852 int java_lang_System::err_offset_in_bytes() { |
2770 return (instanceMirrorKlass::offset_of_static_fields() + static_err_offset); | 2853 return (InstanceMirrorKlass::offset_of_static_fields() + static_err_offset); |
2771 } | 2854 } |
2772 | 2855 |
2773 | 2856 |
2774 | 2857 |
2775 int java_lang_Class::_klass_offset; | 2858 int java_lang_Class::_klass_offset; |
2776 int java_lang_Class::_array_klass_offset; | 2859 int java_lang_Class::_array_klass_offset; |
2777 int java_lang_Class::_resolved_constructor_offset; | 2860 int java_lang_Class::_resolved_constructor_offset; |
2778 int java_lang_Class::_oop_size_offset; | 2861 int java_lang_Class::_oop_size_offset; |
2779 int java_lang_Class::_static_oop_field_count_offset; | 2862 int java_lang_Class::_static_oop_field_count_offset; |
2863 #ifdef GRAAL | |
2864 int java_lang_Class::_graal_mirror_offset; | |
2865 #endif | |
2866 GrowableArray<Klass*>* java_lang_Class::_fixup_mirror_list = NULL; | |
2780 int java_lang_Throwable::backtrace_offset; | 2867 int java_lang_Throwable::backtrace_offset; |
2781 int java_lang_Throwable::detailMessage_offset; | 2868 int java_lang_Throwable::detailMessage_offset; |
2782 int java_lang_Throwable::cause_offset; | 2869 int java_lang_Throwable::cause_offset; |
2783 int java_lang_Throwable::stackTrace_offset; | 2870 int java_lang_Throwable::stackTrace_offset; |
2784 int java_lang_Throwable::static_unassigned_stacktrace_offset; | 2871 int java_lang_Throwable::static_unassigned_stacktrace_offset; |
2833 int java_lang_AssertionStatusDirectives::packages_offset; | 2920 int java_lang_AssertionStatusDirectives::packages_offset; |
2834 int java_lang_AssertionStatusDirectives::packageEnabled_offset; | 2921 int java_lang_AssertionStatusDirectives::packageEnabled_offset; |
2835 int java_lang_AssertionStatusDirectives::deflt_offset; | 2922 int java_lang_AssertionStatusDirectives::deflt_offset; |
2836 int java_nio_Buffer::_limit_offset; | 2923 int java_nio_Buffer::_limit_offset; |
2837 int java_util_concurrent_locks_AbstractOwnableSynchronizer::_owner_offset = 0; | 2924 int java_util_concurrent_locks_AbstractOwnableSynchronizer::_owner_offset = 0; |
2838 int sun_reflect_ConstantPool::_cp_oop_offset; | 2925 int sun_reflect_ConstantPool::_oop_offset; |
2839 int sun_reflect_UnsafeStaticFieldAccessorImpl::_base_offset; | 2926 int sun_reflect_UnsafeStaticFieldAccessorImpl::_base_offset; |
2840 | 2927 |
2841 | 2928 |
2842 // Support for java_lang_StackTraceElement | 2929 // Support for java_lang_StackTraceElement |
2843 | 2930 |
2886 return _limit_offset; | 2973 return _limit_offset; |
2887 } | 2974 } |
2888 | 2975 |
2889 | 2976 |
2890 void java_nio_Buffer::compute_offsets() { | 2977 void java_nio_Buffer::compute_offsets() { |
2891 klassOop k = SystemDictionary::nio_Buffer_klass(); | 2978 Klass* k = SystemDictionary::nio_Buffer_klass(); |
2892 assert(k != NULL, "must be loaded in 1.4+"); | 2979 assert(k != NULL, "must be loaded in 1.4+"); |
2893 compute_offset(_limit_offset, k, vmSymbols::limit_name(), vmSymbols::int_signature()); | 2980 compute_offset(_limit_offset, k, vmSymbols::limit_name(), vmSymbols::int_signature()); |
2894 } | 2981 } |
2895 | 2982 |
2896 void java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(TRAPS) { | 2983 void java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(TRAPS) { |
2897 if (_owner_offset != 0) return; | 2984 if (_owner_offset != 0) return; |
2898 | 2985 |
2899 assert(JDK_Version::is_gte_jdk16x_version(), "Must be JDK 1.6 or later"); | 2986 assert(JDK_Version::is_gte_jdk16x_version(), "Must be JDK 1.6 or later"); |
2900 SystemDictionary::load_abstract_ownable_synchronizer_klass(CHECK); | 2987 SystemDictionary::load_abstract_ownable_synchronizer_klass(CHECK); |
2901 klassOop k = SystemDictionary::abstract_ownable_synchronizer_klass(); | 2988 Klass* k = SystemDictionary::abstract_ownable_synchronizer_klass(); |
2902 compute_offset(_owner_offset, k, | 2989 compute_offset(_owner_offset, k, |
2903 vmSymbols::exclusive_owner_thread_name(), vmSymbols::thread_signature()); | 2990 vmSymbols::exclusive_owner_thread_name(), vmSymbols::thread_signature()); |
2904 } | 2991 } |
2905 | 2992 |
2906 oop java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(oop obj) { | 2993 oop java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(oop obj) { |
3005 | 3092 |
3006 bool JavaClasses::check_offset(const char *klass_name, int hardcoded_offset, const char *field_name, const char* field_sig) { | 3093 bool JavaClasses::check_offset(const char *klass_name, int hardcoded_offset, const char *field_name, const char* field_sig) { |
3007 EXCEPTION_MARK; | 3094 EXCEPTION_MARK; |
3008 fieldDescriptor fd; | 3095 fieldDescriptor fd; |
3009 TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH); | 3096 TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH); |
3010 klassOop k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH); | 3097 Klass* k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH); |
3011 instanceKlassHandle h_klass (THREAD, k); | 3098 instanceKlassHandle h_klass (THREAD, k); |
3012 TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH); | 3099 TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH); |
3013 TempNewSymbol f_sig = SymbolTable::new_symbol(field_sig, CATCH); | 3100 TempNewSymbol f_sig = SymbolTable::new_symbol(field_sig, CATCH); |
3014 if (!h_klass->find_local_field(f_name, f_sig, &fd)) { | 3101 if (!h_klass->find_local_field(f_name, f_sig, &fd)) { |
3015 tty->print_cr("Nonstatic field %s.%s not found", klass_name, field_name); | 3102 tty->print_cr("Nonstatic field %s.%s not found", klass_name, field_name); |
3031 | 3118 |
3032 bool JavaClasses::check_static_offset(const char *klass_name, int hardcoded_offset, const char *field_name, const char* field_sig) { | 3119 bool JavaClasses::check_static_offset(const char *klass_name, int hardcoded_offset, const char *field_name, const char* field_sig) { |
3033 EXCEPTION_MARK; | 3120 EXCEPTION_MARK; |
3034 fieldDescriptor fd; | 3121 fieldDescriptor fd; |
3035 TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH); | 3122 TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH); |
3036 klassOop k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH); | 3123 Klass* k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH); |
3037 instanceKlassHandle h_klass (THREAD, k); | 3124 instanceKlassHandle h_klass (THREAD, k); |
3038 TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH); | 3125 TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH); |
3039 TempNewSymbol f_sig = SymbolTable::new_symbol(field_sig, CATCH); | 3126 TempNewSymbol f_sig = SymbolTable::new_symbol(field_sig, CATCH); |
3040 if (!h_klass->find_local_field(f_name, f_sig, &fd)) { | 3127 if (!h_klass->find_local_field(f_name, f_sig, &fd)) { |
3041 tty->print_cr("Static field %s.%s not found", klass_name, field_name); | 3128 tty->print_cr("Static field %s.%s not found", klass_name, field_name); |
3043 } | 3130 } |
3044 if (!fd.is_static()) { | 3131 if (!fd.is_static()) { |
3045 tty->print_cr("Static field %s.%s appears to be nonstatic", klass_name, field_name); | 3132 tty->print_cr("Static field %s.%s appears to be nonstatic", klass_name, field_name); |
3046 return false; | 3133 return false; |
3047 } | 3134 } |
3048 if (fd.offset() == hardcoded_offset + instanceMirrorKlass::offset_of_static_fields()) { | 3135 if (fd.offset() == hardcoded_offset + InstanceMirrorKlass::offset_of_static_fields()) { |
3049 return true; | 3136 return true; |
3050 } else { | 3137 } else { |
3051 tty->print_cr("Offset of static field %s.%s is hardcoded as %d but should really be %d.", klass_name, field_name, hardcoded_offset, fd.offset() - instanceMirrorKlass::offset_of_static_fields()); | 3138 tty->print_cr("Offset of static field %s.%s is hardcoded as %d but should really be %d.", klass_name, field_name, hardcoded_offset, fd.offset() - InstanceMirrorKlass::offset_of_static_fields()); |
3052 return false; | 3139 return false; |
3053 } | 3140 } |
3054 } | 3141 } |
3055 | 3142 |
3056 | 3143 |
3057 bool JavaClasses::check_constant(const char *klass_name, int hardcoded_constant, const char *field_name, const char* field_sig) { | 3144 bool JavaClasses::check_constant(const char *klass_name, int hardcoded_constant, const char *field_name, const char* field_sig) { |
3058 EXCEPTION_MARK; | 3145 EXCEPTION_MARK; |
3059 fieldDescriptor fd; | 3146 fieldDescriptor fd; |
3060 TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH); | 3147 TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH); |
3061 klassOop k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH); | 3148 Klass* k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH); |
3062 instanceKlassHandle h_klass (THREAD, k); | 3149 instanceKlassHandle h_klass (THREAD, k); |
3063 TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH); | 3150 TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH); |
3064 TempNewSymbol f_sig = SymbolTable::new_symbol(field_sig, CATCH); | 3151 TempNewSymbol f_sig = SymbolTable::new_symbol(field_sig, CATCH); |
3065 if (!h_klass->find_local_field(f_name, f_sig, &fd)) { | 3152 if (!h_klass->find_local_field(f_name, f_sig, &fd)) { |
3066 tty->print_cr("Static field %s.%s not found", klass_name, field_name); | 3153 tty->print_cr("Static field %s.%s not found", klass_name, field_name); |
3086 | 3173 |
3087 // Check the hard-coded field offsets of all the classes in this file | 3174 // Check the hard-coded field offsets of all the classes in this file |
3088 | 3175 |
3089 void JavaClasses::check_offsets() { | 3176 void JavaClasses::check_offsets() { |
3090 bool valid = true; | 3177 bool valid = true; |
3178 HandleMark hm; | |
3091 | 3179 |
3092 #define CHECK_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \ | 3180 #define CHECK_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \ |
3093 valid &= check_offset(klass_name, cpp_klass_name :: field_name ## _offset, #field_name, field_sig) | 3181 valid &= check_offset(klass_name, cpp_klass_name :: field_name ## _offset, #field_name, field_sig) |
3094 | 3182 |
3095 #define CHECK_LONG_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \ | 3183 #define CHECK_LONG_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \ |
3190 } | 3278 } |
3191 | 3279 |
3192 #endif // PRODUCT | 3280 #endif // PRODUCT |
3193 | 3281 |
3194 int InjectedField::compute_offset() { | 3282 int InjectedField::compute_offset() { |
3195 klassOop klass_oop = klass(); | 3283 Klass* klass_oop = klass(); |
3196 for (AllFieldStream fs(instanceKlass::cast(klass_oop)); !fs.done(); fs.next()) { | 3284 for (AllFieldStream fs(InstanceKlass::cast(klass_oop)); !fs.done(); fs.next()) { |
3197 if (!may_be_java && !fs.access_flags().is_internal()) { | 3285 if (!may_be_java && !fs.access_flags().is_internal()) { |
3198 // Only look at injected fields | 3286 // Only look at injected fields |
3199 continue; | 3287 continue; |
3200 } | 3288 } |
3201 if (fs.name() == name() && fs.signature() == signature()) { | 3289 if (fs.name() == name() && fs.signature() == signature()) { |
3202 return fs.offset(); | 3290 return fs.offset(); |
3203 } | 3291 } |
3204 } | 3292 } |
3205 ResourceMark rm; | 3293 ResourceMark rm; |
3206 tty->print_cr("Invalid layout of %s at %s/%s%s", instanceKlass::cast(klass_oop)->external_name(), name()->as_C_string(), signature()->as_C_string(), may_be_java ? " (may_be_java)" : ""); | 3294 tty->print_cr("Invalid layout of %s at %s/%s%s", InstanceKlass::cast(klass_oop)->external_name(), name()->as_C_string(), signature()->as_C_string(), may_be_java ? " (may_be_java)" : ""); |
3207 #ifndef PRODUCT | 3295 #ifndef PRODUCT |
3208 klass_oop->print(); | 3296 klass_oop->print(); |
3209 tty->print_cr("all fields:"); | 3297 tty->print_cr("all fields:"); |
3210 for (AllFieldStream fs(instanceKlass::cast(klass_oop)); !fs.done(); fs.next()) { | 3298 for (AllFieldStream fs(InstanceKlass::cast(klass_oop)); !fs.done(); fs.next()) { |
3211 tty->print_cr(" name: %s, sig: %s, flags: %08x", fs.name()->as_C_string(), fs.signature()->as_C_string(), fs.access_flags().as_int()); | 3299 tty->print_cr(" name: %s, sig: %s, flags: %08x", fs.name()->as_C_string(), fs.signature()->as_C_string(), fs.access_flags().as_int()); |
3212 } | 3300 } |
3213 #endif //PRODUCT | 3301 #endif //PRODUCT |
3214 fatal("Invalid layout of preloaded class"); | 3302 fatal("Invalid layout of preloaded class"); |
3215 return -1; | 3303 return -1; |