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;