当前位置:   article > 正文

OpenJDK_openjdk 64-bit server vm warning: options -xverify

openjdk 64-bit server vm warning: options -xverify:none and -noverify were d

OpenJDK / lambda / lambda / hotspot

view src/share/vm/classfile/javaClasses.cpp @ 3354:8f972594effc

 

6924259: Remove String.count/String.offset Summary: Allow a version of String class that doesn't have count and offset fields. Reviewed-by: never, coleenp

authorkvn
dateMon, 14 May 2012 09:36:00 -0700 (2012-05-15)
parentsa81f60ddab06
children8b0a4867acf0 e9140bf80b4a

line source                                                                                                               line wrap: on

  1. /*
  2. * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
  3. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4. *
  5. * This code is free software; you can redistribute it and/or modify it
  6. * under the terms of the GNU General Public License version 2 only, as
  7. * published by the Free Software Foundation.
  8. *
  9. * This code is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  12. * version 2 for more details (a copy is included in the LICENSE file that
  13. * accompanied this code).
  14. *
  15. * You should have received a copy of the GNU General Public License version
  16. * 2 along with this work; if not, write to the Free Software Foundation,
  17. * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18. *
  19. * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20. * or visit www.oracle.com if you need additional information or have any
  21. * questions.
  22. *
  23. */
  24. #include "precompiled.hpp"
  25. #include "classfile/javaClasses.hpp"
  26. #include "classfile/symbolTable.hpp"
  27. #include "classfile/vmSymbols.hpp"
  28. #include "code/debugInfo.hpp"
  29. #include "code/pcDesc.hpp"
  30. #include "compiler/compilerOracle.hpp"
  31. #include "interpreter/interpreter.hpp"
  32. #include "memory/oopFactory.hpp"
  33. #include "memory/resourceArea.hpp"
  34. #include "memory/universe.inline.hpp"
  35. #include "oops/fieldStreams.hpp"
  36. #include "oops/instanceKlass.hpp"
  37. #include "oops/instanceMirrorKlass.hpp"
  38. #include "oops/klass.hpp"
  39. #include "oops/klassOop.hpp"
  40. #include "oops/methodOop.hpp"
  41. #include "oops/symbol.hpp"
  42. #include "oops/typeArrayOop.hpp"
  43. #include "runtime/fieldDescriptor.hpp"
  44. #include "runtime/handles.inline.hpp"
  45. #include "runtime/interfaceSupport.hpp"
  46. #include "runtime/java.hpp"
  47. #include "runtime/javaCalls.hpp"
  48. #include "runtime/safepoint.hpp"
  49. #include "runtime/vframe.hpp"
  50. #include "utilities/preserveException.hpp"
  51. #ifdef TARGET_OS_FAMILY_linux
  52. # include "thread_linux.inline.hpp"
  53. #endif
  54. #ifdef TARGET_OS_FAMILY_solaris
  55. # include "thread_solaris.inline.hpp"
  56. #endif
  57. #ifdef TARGET_OS_FAMILY_windows
  58. # include "thread_windows.inline.hpp"
  59. #endif
  60. #ifdef TARGET_OS_FAMILY_bsd
  61. # include "thread_bsd.inline.hpp"
  62. #endif
  63. #define INJECTED_FIELD_COMPUTE_OFFSET(klass, name, signature, may_be_java) \
  64. klass::_##name##_offset = JavaClasses::compute_injected_offset(JavaClasses::klass##_##name##_enum);
  65. #define DECLARE_INJECTED_FIELD(klass, name, signature, may_be_java) \
  66. { SystemDictionary::WK_KLASS_ENUM_NAME(klass), vmSymbols::VM_SYMBOL_ENUM_NAME(name##_name), vmSymbols::VM_SYMBOL_ENUM_NAME(signature), may_be_java },
  67. InjectedField JavaClasses::_injected_fields[] = {
  68. ALL_INJECTED_FIELDS(DECLARE_INJECTED_FIELD)
  69. };
  70. int JavaClasses::compute_injected_offset(InjectedFieldID id) {
  71. return _injected_fields[id].compute_offset();
  72. }
  73. InjectedField* JavaClasses::get_injected(Symbol* class_name, int* field_count) {
  74. *field_count = 0;
  75. vmSymbols::SID sid = vmSymbols::find_sid(class_name);
  76. if (sid == vmSymbols::NO_SID) {
  77. // Only well known classes can inject fields
  78. return NULL;
  79. }
  80. int count = 0;
  81. int start = -1;
  82. #define LOOKUP_INJECTED_FIELD(klass, name, signature, may_be_java) \
  83. if (sid == vmSymbols::VM_SYMBOL_ENUM_NAME(klass)) { \
  84. count++; \
  85. if (start == -1) start = klass##_##name##_enum; \
  86. }
  87. ALL_INJECTED_FIELDS(LOOKUP_INJECTED_FIELD);
  88. #undef LOOKUP_INJECTED_FIELD
  89. if (start != -1) {
  90. *field_count = count;
  91. return _injected_fields + start;
  92. }
  93. return NULL;
  94. }
  95. static bool find_field(instanceKlass* ik,
  96. Symbol* name_symbol, Symbol* signature_symbol,
  97. fieldDescriptor* fd,
  98. bool allow_super = false) {
  99. if (allow_super)
  100. return ik->find_field(name_symbol, signature_symbol, fd) != NULL;
  101. else
  102. return ik->find_local_field(name_symbol, signature_symbol, fd);
  103. }
  104. // Helpful routine for computing field offsets at run time rather than hardcoding them
  105. static void
  106. compute_offset(int &dest_offset,
  107. klassOop klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
  108. bool allow_super = false) {
  109. fieldDescriptor fd;
  110. instanceKlass* ik = instanceKlass::cast(klass_oop);
  111. if (!find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) {
  112. ResourceMark rm;
  113. tty->print_cr("Invalid layout of %s at %s", ik->external_name(), name_symbol->as_C_string());
  114. fatal("Invalid layout of preloaded class");
  115. }
  116. dest_offset = fd.offset();
  117. }
  118. // Same as above but for "optional" offsets that might not be present in certain JDK versions
  119. static void
  120. compute_optional_offset(int& dest_offset,
  121. klassOop klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
  122. bool allow_super = false) {
  123. fieldDescriptor fd;
  124. instanceKlass* ik = instanceKlass::cast(klass_oop);
  125. if (find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) {
  126. dest_offset = fd.offset();
  127. }
  128. }
  129. int java_lang_String::value_offset = 0;
  130. int java_lang_String::offset_offset = 0;
  131. int java_lang_String::count_offset = 0;
  132. int java_lang_String::hash_offset = 0;
  133. bool java_lang_String::initialized = false;
  134. void java_lang_String::compute_offsets() {
  135. assert(!initialized, "offsets should be initialized only once");
  136. klassOop k = SystemDictionary::String_klass();
  137. compute_offset(value_offset, k, vmSymbols::value_name(), vmSymbols::char_array_signature());
  138. compute_optional_offset(offset_offset, k, vmSymbols::offset_name(), vmSymbols::int_signature());
  139. compute_optional_offset(count_offset, k, vmSymbols::count_name(), vmSymbols::int_signature());
  140. compute_optional_offset(hash_offset, k, vmSymbols::hash_name(), vmSymbols::int_signature());
  141. initialized = true;
  142. }
  143. Handle java_lang_String::basic_create(int length, bool tenured, TRAPS) {
  144. assert(initialized, "Must be initialized");
  145. // Create the String object first, so there's a chance that the String
  146. // and the char array it points to end up in the same cache line.
  147. oop obj;
  148. if (tenured) {
  149. obj = instanceKlass::cast(SystemDictionary::String_klass())->allocate_permanent_instance(CHECK_NH);
  150. } else {
  151. obj = instanceKlass::cast(SystemDictionary::String_klass())->allocate_instance(CHECK_NH);
  152. }
  153. // Create the char array. The String object must be handlized here
  154. // because GC can happen as a result of the allocation attempt.
  155. Handle h_obj(THREAD, obj);
  156. typeArrayOop buffer;
  157. if (tenured) {
  158. buffer = oopFactory::new_permanent_charArray(length, CHECK_NH);
  159. } else {
  160. buffer = oopFactory::new_charArray(length, CHECK_NH);
  161. }
  162. // Point the String at the char array
  163. obj = h_obj();
  164. set_value(obj, buffer);
  165. // No need to zero the offset, allocation zero'ed the entire String object
  166. assert(offset(obj) == 0, "initial String offset should be zero");
  167. //set_offset(obj, 0);
  168. set_count(obj, length);
  169. return h_obj;
  170. }
  171. Handle java_lang_String::basic_create_from_unicode(jchar* unicode, int length, bool tenured, TRAPS) {
  172. Handle h_obj = basic_create(length, tenured, CHECK_NH);
  173. typeArrayOop buffer = value(h_obj());
  174. for (int index = 0; index < length; index++) {
  175. buffer->char_at_put(index, unicode[index]);
  176. }
  177. return h_obj;
  178. }
  179. Handle java_lang_String::create_from_unicode(jchar* unicode, int length, TRAPS) {
  180. return basic_create_from_unicode(unicode, length, false, CHECK_NH);
  181. }
  182. Handle java_lang_String::create_tenured_from_unicode(jchar* unicode, int length, TRAPS) {
  183. return basic_create_from_unicode(unicode, length, JavaObjectsInPerm, CHECK_NH);
  184. }
  185. oop java_lang_String::create_oop_from_unicode(jchar* unicode, int length, TRAPS) {
  186. Handle h_obj = basic_create_from_unicode(unicode, length, false, CHECK_0);
  187. return h_obj();
  188. }
  189. Handle java_lang_String::create_from_str(const char* utf8_str, TRAPS) {
  190. if (utf8_str == NULL) {
  191. return Handle();
  192. }
  193. int length = UTF8::unicode_length(utf8_str);
  194. Handle h_obj = basic_create(length, false, CHECK_NH);
  195. if (length > 0) {
  196. UTF8::convert_to_unicode(utf8_str, value(h_obj())->char_at_addr(0), length);
  197. }
  198. return h_obj;
  199. }
  200. oop java_lang_String::create_oop_from_str(const char* utf8_str, TRAPS) {
  201. Handle h_obj = create_from_str(utf8_str, CHECK_0);
  202. return h_obj();
  203. }
  204. Handle java_lang_String::create_from_symbol(Symbol* symbol, TRAPS) {
  205. int length = UTF8::unicode_length((char*)symbol->bytes(), symbol->utf8_length());
  206. Handle h_obj = basic_create(length, false, CHECK_NH);
  207. if (length > 0) {
  208. UTF8::convert_to_unicode((char*)symbol->bytes(), value(h_obj())->char_at_addr(0), length);
  209. }
  210. return h_obj;
  211. }
  212. // Converts a C string to a Java String based on current encoding
  213. Handle java_lang_String::create_from_platform_dependent_str(const char* str, TRAPS) {
  214. assert(str != NULL, "bad arguments");
  215. typedef jstring (*to_java_string_fn_t)(JNIEnv*, const char *);
  216. static to_java_string_fn_t _to_java_string_fn = NULL;
  217. if (_to_java_string_fn == NULL) {
  218. void *lib_handle = os::native_java_library();
  219. _to_java_string_fn = CAST_TO_FN_PTR(to_java_string_fn_t, os::dll_lookup(lib_handle, "NewStringPlatform"));
  220. if (_to_java_string_fn == NULL) {
  221. fatal("NewStringPlatform missing");
  222. }
  223. }
  224. jstring js = NULL;
  225. { JavaThread* thread = (JavaThread*)THREAD;
  226. assert(thread->is_Java_thread(), "must be java thread");
  227. HandleMark hm(thread);
  228. ThreadToNativeFromVM ttn(thread);
  229. js = (_to_java_string_fn)(thread->jni_environment(), str);
  230. }
  231. return Handle(THREAD, JNIHandles::resolve(js));
  232. }
  233. // Converts a Java String to a native C string that can be used for
  234. // native OS calls.
  235. char* java_lang_String::as_platform_dependent_str(Handle java_string, TRAPS) {
  236. typedef char* (*to_platform_string_fn_t)(JNIEnv*, jstring, bool*);
  237. static to_platform_string_fn_t _to_platform_string_fn = NULL;
  238. if (_to_platform_string_fn == NULL) {
  239. void *lib_handle = os::native_java_library();
  240. _to_platform_string_fn = CAST_TO_FN_PTR(to_platform_string_fn_t, os::dll_lookup(lib_handle, "GetStringPlatformChars"));
  241. if (_to_platform_string_fn == NULL) {
  242. fatal("GetStringPlatformChars missing");
  243. }
  244. }
  245. char *native_platform_string;
  246. { JavaThread* thread = (JavaThread*)THREAD;
  247. assert(thread->is_Java_thread(), "must be java thread");
  248. JNIEnv *env = thread->jni_environment();
  249. jstring js = (jstring) JNIHandles::make_local(env, java_string());
  250. bool is_copy;
  251. HandleMark hm(thread);
  252. ThreadToNativeFromVM ttn(thread);
  253. native_platform_string = (_to_platform_string_fn)(env, js, &is_copy);
  254. assert(is_copy == JNI_TRUE, "is_copy value changed");
  255. JNIHandles::destroy_local(js);
  256. }
  257. return native_platform_string;
  258. }
  259. Handle java_lang_String::char_converter(Handle java_string, jchar from_char, jchar to_char, TRAPS) {
  260. oop obj = java_string();
  261. // Typical usage is to convert all '/' to '.' in string.
  262. typeArrayOop value = java_lang_String::value(obj);
  263. int offset = java_lang_String::offset(obj);
  264. int length = java_lang_String::length(obj);
  265. // First check if any from_char exist
  266. int index; // Declared outside, used later
  267. for (index = 0; index < length; index++) {
  268. if (value->char_at(index + offset) == from_char) {
  269. break;
  270. }
  271. }
  272. if (index == length) {
  273. // No from_char, so do not copy.
  274. return java_string;
  275. }
  276. // Create new UNICODE buffer. Must handlize value because GC
  277. // may happen during String and char array creation.
  278. typeArrayHandle h_value(THREAD, value);
  279. Handle string = basic_create(length, false, CHECK_NH);
  280. typeArrayOop from_buffer = h_value();
  281. typeArrayOop to_buffer = java_lang_String::value(string());
  282. // Copy contents
  283. for (index = 0; index < length; index++) {
  284. jchar c = from_buffer->char_at(index + offset);
  285. if (c == from_char) {
  286. c = to_char;
  287. }
  288. to_buffer->char_at_put(index, c);
  289. }
  290. return string;
  291. }
  292. jchar* java_lang_String::as_unicode_string(oop java_string, int& length) {
  293. typeArrayOop value = java_lang_String::value(java_string);
  294. int offset = java_lang_String::offset(java_string);
  295. length = java_lang_String::length(java_string);
  296. jchar* result = NEW_RESOURCE_ARRAY(jchar, length);
  297. for (int index = 0; index < length; index++) {
  298. result[index] = value->char_at(index + offset);
  299. }
  300. return result;
  301. }
  302. unsigned int java_lang_String::hash_string(oop java_string) {
  303. typeArrayOop value = java_lang_String::value(java_string);
  304. int offset = java_lang_String::offset(java_string);
  305. int length = java_lang_String::length(java_string);
  306. if (length == 0) return 0;
  307. return hash_string(value->char_at_addr(offset), length);
  308. }
  309. Symbol* java_lang_String::as_symbol(Handle java_string, TRAPS) {
  310. oop obj = java_string();
  311. typeArrayOop value = java_lang_String::value(obj);
  312. int offset = java_lang_String::offset(obj);
  313. int length = java_lang_String::length(obj);
  314. jchar* base = (length == 0) ? NULL : value->char_at_addr(offset);
  315. Symbol* sym = SymbolTable::lookup_unicode(base, length, THREAD);
  316. return sym;
  317. }
  318. Symbol* java_lang_String::as_symbol_or_null(oop java_string) {
  319. typeArrayOop value = java_lang_String::value(java_string);
  320. int offset = java_lang_String::offset(java_string);
  321. int length = java_lang_String::length(java_string);
  322. jchar* base = (length == 0) ? NULL : value->char_at_addr(offset);
  323. return SymbolTable::probe_unicode(base, length);
  324. }
  325. int java_lang_String::utf8_length(oop java_string) {
  326. typeArrayOop value = java_lang_String::value(java_string);
  327. int offset = java_lang_String::offset(java_string);
  328. int length = java_lang_String::length(java_string);
  329. jchar* position = (length == 0) ? NULL : value->char_at_addr(offset);
  330. return UNICODE::utf8_length(position, length);
  331. }
  332. char* java_lang_String::as_utf8_string(oop java_string) {
  333. typeArrayOop value = java_lang_String::value(java_string);
  334. int offset = java_lang_String::offset(java_string);
  335. int length = java_lang_String::length(java_string);
  336. jchar* position = (length == 0) ? NULL : value->char_at_addr(offset);
  337. return UNICODE::as_utf8(position, length);
  338. }
  339. char* java_lang_String::as_utf8_string(oop java_string, char* buf, int buflen) {
  340. typeArrayOop value = java_lang_String::value(java_string);
  341. int offset = java_lang_String::offset(java_string);
  342. int length = java_lang_String::length(java_string);
  343. jchar* position = (length == 0) ? NULL : value->char_at_addr(offset);
  344. return UNICODE::as_utf8(position, length, buf, buflen);
  345. }
  346. char* java_lang_String::as_utf8_string(oop java_string, int start, int len) {
  347. typeArrayOop value = java_lang_String::value(java_string);
  348. int offset = java_lang_String::offset(java_string);
  349. int length = java_lang_String::length(java_string);
  350. assert(start + len <= length, "just checking");
  351. jchar* position = value->char_at_addr(offset + start);
  352. return UNICODE::as_utf8(position, len);
  353. }
  354. bool java_lang_String::equals(oop java_string, jchar* chars, int len) {
  355. assert(SharedSkipVerify ||
  356. java_string->klass() == SystemDictionary::String_klass(),
  357. "must be java_string");
  358. typeArrayOop value = java_lang_String::value(java_string);
  359. int offset = java_lang_String::offset(java_string);
  360. int length = java_lang_String::length(java_string);
  361. if (length != len) {
  362. return false;
  363. }
  364. for (int i = 0; i < len; i++) {
  365. if (value->char_at(i + offset) != chars[i]) {
  366. return false;
  367. }
  368. }
  369. return true;
  370. }
  371. void java_lang_String::print(Handle java_string, outputStream* st) {
  372. oop obj = java_string();
  373. assert(obj->klass() == SystemDictionary::String_klass(), "must be java_string");
  374. typeArrayOop value = java_lang_String::value(obj);
  375. int offset = java_lang_String::offset(obj);
  376. int length = java_lang_String::length(obj);
  377. int end = MIN2(length, 100);
  378. if (value == NULL) {
  379. // This can happen if, e.g., printing a String
  380. // object before its initializer has been called
  381. st->print_cr("NULL");
  382. } else {
  383. st->print("\"");
  384. for (int index = 0; index < length; index++) {
  385. st->print("%c", value->char_at(index + offset));
  386. }
  387. st->print("\"");
  388. }
  389. }
  390. static void initialize_static_field(fieldDescriptor* fd, TRAPS) {
  391. Handle mirror (THREAD, fd->field_holder()->java_mirror());
  392. assert(mirror.not_null() && fd->is_static(), "just checking");
  393. if (fd->has_initial_value()) {
  394. BasicType t = fd->field_type();
  395. switch (t) {
  396. case T_BYTE:
  397. mirror()->byte_field_put(fd->offset(), fd->int_initial_value());
  398. break;
  399. case T_BOOLEAN:
  400. mirror()->bool_field_put(fd->offset(), fd->int_initial_value());
  401. break;
  402. case T_CHAR:
  403. mirror()->char_field_put(fd->offset(), fd->int_initial_value());
  404. break;
  405. case T_SHORT:
  406. mirror()->short_field_put(fd->offset(), fd->int_initial_value());
  407. break;
  408. case T_INT:
  409. mirror()->int_field_put(fd->offset(), fd->int_initial_value());
  410. break;
  411. case T_FLOAT:
  412. mirror()->float_field_put(fd->offset(), fd->float_initial_value());
  413. break;
  414. case T_DOUBLE:
  415. mirror()->double_field_put(fd->offset(), fd->double_initial_value());
  416. break;
  417. case T_LONG:
  418. mirror()->long_field_put(fd->offset(), fd->long_initial_value());
  419. break;
  420. case T_OBJECT:
  421. {
  422. #ifdef ASSERT
  423. TempNewSymbol sym = SymbolTable::new_symbol("Ljava/lang/String;", CHECK);
  424. assert(fd->signature() == sym, "just checking");
  425. #endif
  426. oop string = fd->string_initial_value(CHECK);
  427. mirror()->obj_field_put(fd->offset(), string);
  428. }
  429. break;
  430. default:
  431. THROW_MSG(vmSymbols::java_lang_ClassFormatError(),
  432. "Illegal ConstantValue attribute in class file");
  433. }
  434. }
  435. }
  436. void java_lang_Class::fixup_mirror(KlassHandle k, TRAPS) {
  437. assert(instanceMirrorKlass::offset_of_static_fields() != 0, "must have been computed already");
  438. if (k->oop_is_instance()) {
  439. // During bootstrap, java.lang.Class wasn't loaded so static field
  440. // offsets were computed without the size added it. Go back and
  441. // update all the static field offsets to included the size.
  442. for (JavaFieldStream fs(instanceKlass::cast(k())); !fs.done(); fs.next()) {
  443. if (fs.access_flags().is_static()) {
  444. int real_offset = fs.offset() + instanceMirrorKlass::offset_of_static_fields();
  445. fs.set_offset(real_offset);
  446. }
  447. }
  448. }
  449. create_mirror(k, CHECK);
  450. }
  451. oop java_lang_Class::create_mirror(KlassHandle k, TRAPS) {
  452. assert(k->java_mirror() == NULL, "should only assign mirror once");
  453. // Use this moment of initialization to cache modifier_flags also,
  454. // to support Class.getModifiers(). Instance classes recalculate
  455. // the cached flags after the class file is parsed, but before the
  456. // class is put into the system dictionary.
  457. int computed_modifiers = k->compute_modifier_flags(CHECK_0);
  458. k->set_modifier_flags(computed_modifiers);
  459. if (SystemDictionary::Class_klass_loaded() && (k->oop_is_instance() || k->oop_is_javaArray())) {
  460. // Allocate mirror (java.lang.Class instance)
  461. Handle mirror = instanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(k, CHECK_0);
  462. instanceMirrorKlass* mk = instanceMirrorKlass::cast(mirror->klass());
  463. java_lang_Class::set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror()));
  464. // It might also have a component mirror. This mirror must already exist.
  465. if (k->oop_is_javaArray()) {
  466. Handle comp_mirror;
  467. if (k->oop_is_typeArray()) {
  468. BasicType type = typeArrayKlass::cast(k->as_klassOop())->element_type();
  469. comp_mirror = Universe::java_mirror(type);
  470. assert(comp_mirror.not_null(), "must have primitive mirror");
  471. } else if (k->oop_is_objArray()) {
  472. klassOop element_klass = objArrayKlass::cast(k->as_klassOop())->element_klass();
  473. if (element_klass != NULL
  474. && (Klass::cast(element_klass)->oop_is_instance() ||
  475. Klass::cast(element_klass)->oop_is_javaArray())) {
  476. comp_mirror = Klass::cast(element_klass)->java_mirror();
  477. assert(comp_mirror.not_null(), "must have element mirror");
  478. }
  479. // else some object array internal to the VM, like systemObjArrayKlassObj
  480. }
  481. if (comp_mirror.not_null()) {
  482. // Two-way link between the array klass and its component mirror:
  483. arrayKlass::cast(k->as_klassOop())->set_component_mirror(comp_mirror());
  484. set_array_klass(comp_mirror(), k->as_klassOop());
  485. }
  486. } else if (k->oop_is_instance()) {
  487. // Initialize static fields
  488. instanceKlass::cast(k())->do_local_static_fields(&initialize_static_field, CHECK_NULL);
  489. }
  490. return mirror();
  491. } else {
  492. return NULL;
  493. }
  494. }
  495. int java_lang_Class::oop_size(oop java_class) {
  496. assert(_oop_size_offset != 0, "must be set");
  497. return java_class->int_field(_oop_size_offset);
  498. }
  499. void java_lang_Class::set_oop_size(oop java_class, int size) {
  500. assert(_oop_size_offset != 0, "must be set");
  501. java_class->int_field_put(_oop_size_offset, size);
  502. }
  503. int java_lang_Class::static_oop_field_count(oop java_class) {
  504. assert(_static_oop_field_count_offset != 0, "must be set");
  505. return java_class->int_field(_static_oop_field_count_offset);
  506. }
  507. void java_lang_Class::set_static_oop_field_count(oop java_class, int size) {
  508. assert(_static_oop_field_count_offset != 0, "must be set");
  509. java_class->int_field_put(_static_oop_field_count_offset, size);
  510. }
  511. oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS) {
  512. // This should be improved by adding a field at the Java level or by
  513. // introducing a new VM klass (see comment in ClassFileParser)
  514. oop java_class = instanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance((oop)NULL, CHECK_0);
  515. if (type != T_VOID) {
  516. klassOop aklass = Universe::typeArrayKlassObj(type);
  517. assert(aklass != NULL, "correct bootstrap");
  518. set_array_klass(java_class, aklass);
  519. }
  520. #ifdef ASSERT
  521. instanceMirrorKlass* mk = instanceMirrorKlass::cast(SystemDictionary::Class_klass());
  522. assert(java_lang_Class::static_oop_field_count(java_class) == 0, "should have been zeroed by allocation");
  523. #endif
  524. return java_class;
  525. }
  526. klassOop java_lang_Class::as_klassOop(oop java_class) {
  527. //%note memory_2
  528. assert(java_lang_Class::is_instance(java_class), "must be a Class object");
  529. klassOop k = klassOop(java_class->obj_field(_klass_offset));
  530. assert(k == NULL || k->is_klass(), "type check");
  531. return k;
  532. }
  533. void java_lang_Class::set_klass(oop java_class, klassOop klass) {
  534. assert(java_lang_Class::is_instance(java_class), "must be a Class object");
  535. java_class->obj_field_put(_klass_offset, klass);
  536. }
  537. void java_lang_Class::print_signature(oop java_class, outputStream* st) {
  538. assert(java_lang_Class::is_instance(java_class), "must be a Class object");
  539. Symbol* name = NULL;
  540. bool is_instance = false;
  541. if (is_primitive(java_class)) {
  542. name = vmSymbols::type_signature(primitive_type(java_class));
  543. } else {
  544. klassOop k = as_klassOop(java_class);
  545. is_instance = Klass::cast(k)->oop_is_instance();
  546. name = Klass::cast(k)->name();
  547. }
  548. if (name == NULL) {
  549. st->print("<null>");
  550. return;
  551. }
  552. if (is_instance) st->print("L");
  553. st->write((char*) name->base(), (int) name->utf8_length());
  554. if (is_instance) st->print(";");
  555. }
  556. Symbol* java_lang_Class::as_signature(oop java_class, bool intern_if_not_found, TRAPS) {
  557. assert(java_lang_Class::is_instance(java_class), "must be a Class object");
  558. Symbol* name;
  559. if (is_primitive(java_class)) {
  560. name = vmSymbols::type_signature(primitive_type(java_class));
  561. // Because this can create a new symbol, the caller has to decrement
  562. // the refcount, so make adjustment here and below for symbols returned
  563. // that are not created or incremented due to a successful lookup.
  564. name->increment_refcount();
  565. } else {
  566. klassOop k = as_klassOop(java_class);
  567. if (!Klass::cast(k)->oop_is_instance()) {
  568. name = Klass::cast(k)->name();
  569. name->increment_refcount();
  570. } else {
  571. ResourceMark rm;
  572. const char* sigstr = Klass::cast(k)->signature_name();
  573. int siglen = (int) strlen(sigstr);
  574. if (!intern_if_not_found) {
  575. name = SymbolTable::probe(sigstr, siglen);
  576. } else {
  577. name = SymbolTable::new_symbol(sigstr, siglen, THREAD);
  578. }
  579. }
  580. }
  581. return name;
  582. }
  583. klassOop java_lang_Class::array_klass(oop java_class) {
  584. klassOop k = klassOop(java_class->obj_field(_array_klass_offset));
  585. assert(k == NULL || k->is_klass() && Klass::cast(k)->oop_is_javaArray(), "should be array klass");
  586. return k;
  587. }
  588. void java_lang_Class::set_array_klass(oop java_class, klassOop klass) {
  589. assert(klass->is_klass() && Klass::cast(klass)->oop_is_javaArray(), "should be array klass");
  590. java_class->obj_field_put(_array_klass_offset, klass);
  591. }
  592. methodOop java_lang_Class::resolved_constructor(oop java_class) {
  593. oop constructor = java_class->obj_field(_resolved_constructor_offset);
  594. assert(constructor == NULL || constructor->is_method(), "should be method");
  595. return methodOop(constructor);
  596. }
  597. void java_lang_Class::set_resolved_constructor(oop java_class, methodOop constructor) {
  598. assert(constructor->is_method(), "should be method");
  599. java_class->obj_field_put(_resolved_constructor_offset, constructor);
  600. }
  601. bool java_lang_Class::is_primitive(oop java_class) {
  602. // should assert:
  603. //assert(java_lang_Class::is_instance(java_class), "must be a Class object");
  604. klassOop k = klassOop(java_class->obj_field(_klass_offset));
  605. return k == NULL;
  606. }
  607. BasicType java_lang_Class::primitive_type(oop java_class) {
  608. assert(java_lang_Class::is_primitive(java_class), "just checking");
  609. klassOop ak = klassOop(java_class->obj_field(_array_klass_offset));
  610. BasicType type = T_VOID;
  611. if (ak != NULL) {
  612. // Note: create_basic_type_mirror above initializes ak to a non-null value.
  613. type = arrayKlass::cast(ak)->element_type();
  614. } else {
  615. assert(java_class == Universe::void_mirror(), "only valid non-array primitive");
  616. }
  617. assert(Universe::java_mirror(type) == java_class, "must be consistent");
  618. return type;
  619. }
  620. BasicType java_lang_Class::as_BasicType(oop java_class, klassOop* reference_klass) {
  621. assert(java_lang_Class::is_instance(java_class), "must be a Class object");
  622. if (is_primitive(java_class)) {
  623. if (reference_klass != NULL)
  624. (*reference_klass) = NULL;
  625. return primitive_type(java_class);
  626. } else {
  627. if (reference_klass != NULL)
  628. (*reference_klass) = as_klassOop(java_class);
  629. return T_OBJECT;
  630. }
  631. }
  632. oop java_lang_Class::primitive_mirror(BasicType t) {
  633. oop mirror = Universe::java_mirror(t);
  634. assert(mirror != NULL && mirror->is_a(SystemDictionary::Class_klass()), "must be a Class");
  635. assert(java_lang_Class::is_primitive(mirror), "must be primitive");
  636. return mirror;
  637. }
  638. bool java_lang_Class::offsets_computed = false;
  639. int java_lang_Class::classRedefinedCount_offset = -1;
  640. void java_lang_Class::compute_offsets() {
  641. assert(!offsets_computed, "offsets should be initialized only once");
  642. offsets_computed = true;
  643. klassOop klass_oop = SystemDictionary::Class_klass();
  644. // The classRedefinedCount field is only present starting in 1.5,
  645. // so don't go fatal.
  646. compute_optional_offset(classRedefinedCount_offset,
  647. klass_oop, vmSymbols::classRedefinedCount_name(), vmSymbols::int_signature());
  648. CLASS_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
  649. }
  650. int java_lang_Class::classRedefinedCount(oop the_class_mirror) {
  651. if (!JDK_Version::is_gte_jdk15x_version()
  652. || classRedefinedCount_offset == -1) {
  653. // The classRedefinedCount field is only present starting in 1.5.
  654. // If we don't have an offset for it then just return -1 as a marker.
  655. return -1;
  656. }
  657. return the_class_mirror->int_field(classRedefinedCount_offset);
  658. }
  659. void java_lang_Class::set_classRedefinedCount(oop the_class_mirror, int value) {
  660. if (!JDK_Version::is_gte_jdk15x_version()
  661. || classRedefinedCount_offset == -1) {
  662. // The classRedefinedCount field is only present starting in 1.5.
  663. // If we don't have an offset for it then nothing to set.
  664. return;
  665. }
  666. the_class_mirror->int_field_put(classRedefinedCount_offset, value);
  667. }
  668. // Note: JDK1.1 and before had a privateInfo_offset field which was used for the
  669. // platform thread structure, and a eetop offset which was used for thread
  670. // local storage (and unused by the HotSpot VM). In JDK1.2 the two structures
  671. // merged, so in the HotSpot VM we just use the eetop field for the thread
  672. // instead of the privateInfo_offset.
  673. //
  674. // Note: The stackSize field is only present starting in 1.4.
  675. int java_lang_Thread::_name_offset = 0;
  676. int java_lang_Thread::_group_offset = 0;
  677. int java_lang_Thread::_contextClassLoader_offset = 0;
  678. int java_lang_Thread::_inheritedAccessControlContext_offset = 0;
  679. int java_lang_Thread::_priority_offset = 0;
  680. int java_lang_Thread::_eetop_offset = 0;
  681. int java_lang_Thread::_daemon_offset = 0;
  682. int java_lang_Thread::_stillborn_offset = 0;
  683. int java_lang_Thread::_stackSize_offset = 0;
  684. int java_lang_Thread::_tid_offset = 0;
  685. int java_lang_Thread::_thread_status_offset = 0;
  686. int java_lang_Thread::_park_blocker_offset = 0;
  687. int java_lang_Thread::_park_event_offset = 0 ;
  688. void java_lang_Thread::compute_offsets() {
  689. assert(_group_offset == 0, "offsets should be initialized only once");
  690. klassOop k = SystemDictionary::Thread_klass();
  691. compute_offset(_name_offset, k, vmSymbols::name_name(), vmSymbols::char_array_signature());
  692. compute_offset(_group_offset, k, vmSymbols::group_name(), vmSymbols::threadgroup_signature());
  693. compute_offset(_contextClassLoader_offset, k, vmSymbols::contextClassLoader_name(), vmSymbols::classloader_signature());
  694. compute_offset(_inheritedAccessControlContext_offset, k, vmSymbols::inheritedAccessControlContext_name(), vmSymbols::accesscontrolcontext_signature());
  695. compute_offset(_priority_offset, k, vmSymbols::priority_name(), vmSymbols::int_signature());
  696. compute_offset(_daemon_offset, k, vmSymbols::daemon_name(), vmSymbols::bool_signature());
  697. compute_offset(_eetop_offset, k, vmSymbols::eetop_name(), vmSymbols::long_signature());
  698. compute_offset(_stillborn_offset, k, vmSymbols::stillborn_name(), vmSymbols::bool_signature());
  699. // The stackSize field is only present starting in 1.4, so don't go fatal.
  700. compute_optional_offset(_stackSize_offset, k, vmSymbols::stackSize_name(), vmSymbols::long_signature());
  701. // The tid and thread_status fields are only present starting in 1.5, so don't go fatal.
  702. compute_optional_offset(_tid_offset, k, vmSymbols::thread_id_name(), vmSymbols::long_signature());
  703. compute_optional_offset(_thread_status_offset, k, vmSymbols::thread_status_name(), vmSymbols::int_signature());
  704. // The parkBlocker field is only present starting in 1.6, so don't go fatal.
  705. compute_optional_offset(_park_blocker_offset, k, vmSymbols::park_blocker_name(), vmSymbols::object_signature());
  706. compute_optional_offset(_park_event_offset, k, vmSymbols::park_event_name(),
  707. vmSymbols::long_signature());
  708. }
  709. JavaThread* java_lang_Thread::thread(oop java_thread) {
  710. return (JavaThread*)java_thread->address_field(_eetop_offset);
  711. }
  712. void java_lang_Thread::set_thread(oop java_thread, JavaThread* thread) {
  713. java_thread->address_field_put(_eetop_offset, (address)thread);
  714. }
  715. typeArrayOop java_lang_Thread::name(oop java_thread) {
  716. oop name = java_thread->obj_field(_name_offset);
  717. assert(name == NULL || (name->is_typeArray() && typeArrayKlass::cast(name->klass())->element_type() == T_CHAR), "just checking");
  718. return typeArrayOop(name);
  719. }
  720. void java_lang_Thread::set_name(oop java_thread, typeArrayOop name) {
  721. assert(java_thread->obj_field(_name_offset) == NULL, "name should be NULL");
  722. java_thread->obj_field_put(_name_offset, name);
  723. }
  724. ThreadPriority java_lang_Thread::priority(oop java_thread) {
  725. return (ThreadPriority)java_thread->int_field(_priority_offset);
  726. }
  727. void java_lang_Thread::set_priority(oop java_thread, ThreadPriority priority) {
  728. java_thread->int_field_put(_priority_offset, priority);
  729. }
  730. oop java_lang_Thread::threadGroup(oop java_thread) {
  731. return java_thread->obj_field(_group_offset);
  732. }
  733. bool java_lang_Thread::is_stillborn(oop java_thread) {
  734. return java_thread->bool_field(_stillborn_offset) != 0;
  735. }
  736. // We never have reason to turn the stillborn bit off
  737. void java_lang_Thread::set_stillborn(oop java_thread) {
  738. java_thread->bool_field_put(_stillborn_offset, true);
  739. }
  740. bool java_lang_Thread::is_alive(oop java_thread) {
  741. JavaThread* thr = java_lang_Thread::thread(java_thread);
  742. return (thr != NULL);
  743. }
  744. bool java_lang_Thread::is_daemon(oop java_thread) {
  745. return java_thread->bool_field(_daemon_offset) != 0;
  746. }
  747. void java_lang_Thread::set_daemon(oop java_thread) {
  748. java_thread->bool_field_put(_daemon_offset, true);
  749. }
  750. oop java_lang_Thread::context_class_loader(oop java_thread) {
  751. return java_thread->obj_field(_contextClassLoader_offset);
  752. }
  753. oop java_lang_Thread::inherited_access_control_context(oop java_thread) {
  754. return java_thread->obj_field(_inheritedAccessControlContext_offset);
  755. }
  756. jlong java_lang_Thread::stackSize(oop java_thread) {
  757. // The stackSize field is only present starting in 1.4
  758. if (_stackSize_offset > 0) {
  759. assert(JDK_Version::is_gte_jdk14x_version(), "sanity check");
  760. return java_thread->long_field(_stackSize_offset);
  761. } else {
  762. return 0;
  763. }
  764. }
  765. // Write the thread status value to threadStatus field in java.lang.Thread java class.
  766. void java_lang_Thread::set_thread_status(oop java_thread,
  767. java_lang_Thread::ThreadStatus status) {
  768. assert(JavaThread::current()->thread_state() == _thread_in_vm, "Java Thread is not running in vm");
  769. // The threadStatus is only present starting in 1.5
  770. if (_thread_status_offset > 0) {
  771. java_thread->int_field_put(_thread_status_offset, status);
  772. }
  773. }
  774. // Read thread status value from threadStatus field in java.lang.Thread java class.
  775. java_lang_Thread::ThreadStatus java_lang_Thread::get_thread_status(oop java_thread) {
  776. assert(Thread::current()->is_VM_thread() ||
  777. JavaThread::current()->thread_state() == _thread_in_vm,
  778. "Java Thread is not running in vm");
  779. // The threadStatus is only present starting in 1.5
  780. if (_thread_status_offset > 0) {
  781. return (java_lang_Thread::ThreadStatus)java_thread->int_field(_thread_status_offset);
  782. } else {
  783. // All we can easily figure out is if it is alive, but that is
  784. // enough info for a valid unknown status.
  785. // These aren't restricted to valid set ThreadStatus values, so
  786. // use JVMTI values and cast.
  787. JavaThread* thr = java_lang_Thread::thread(java_thread);
  788. if (thr == NULL) {
  789. // the thread hasn't run yet or is in the process of exiting
  790. return NEW;
  791. }
  792. return (java_lang_Thread::ThreadStatus)JVMTI_THREAD_STATE_ALIVE;
  793. }
  794. }
  795. jlong java_lang_Thread::thread_id(oop java_thread) {
  796. // The thread ID field is only present starting in 1.5
  797. if (_tid_offset > 0) {
  798. return java_thread->long_field(_tid_offset);
  799. } else {
  800. return 0;
  801. }
  802. }
  803. oop java_lang_Thread::park_blocker(oop java_thread) {
  804. assert(JDK_Version::current().supports_thread_park_blocker() &&
  805. _park_blocker_offset != 0, "Must support parkBlocker field");
  806. if (_park_blocker_offset > 0) {
  807. return java_thread->obj_field(_park_blocker_offset);
  808. }
  809. return NULL;
  810. }
  811. jlong java_lang_Thread::park_event(oop java_thread) {
  812. if (_park_event_offset > 0) {
  813. return java_thread->long_field(_park_event_offset);
  814. }
  815. return 0;
  816. }
  817. bool java_lang_Thread::set_park_event(oop java_thread, jlong ptr) {
  818. if (_park_event_offset > 0) {
  819. java_thread->long_field_put(_park_event_offset, ptr);
  820. return true;
  821. }
  822. return false;
  823. }
  824. const char* java_lang_Thread::thread_status_name(oop java_thread) {
  825. assert(JDK_Version::is_gte_jdk15x_version() && _thread_status_offset != 0, "Must have thread status");
  826. ThreadStatus status = (java_lang_Thread::ThreadStatus)java_thread->int_field(_thread_status_offset);
  827. switch (status) {
  828. case NEW : return "NEW";
  829. case RUNNABLE : return "RUNNABLE";
  830. case SLEEPING : return "TIMED_WAITING (sleeping)";
  831. case IN_OBJECT_WAIT : return "WAITING (on object monitor)";
  832. case IN_OBJECT_WAIT_TIMED : return "TIMED_WAITING (on object monitor)";
  833. case PARKED : return "WAITING (parking)";
  834. case PARKED_TIMED : return "TIMED_WAITING (parking)";
  835. case BLOCKED_ON_MONITOR_ENTER : return "BLOCKED (on object monitor)";
  836. case TERMINATED : return "TERMINATED";
  837. default : return "UNKNOWN";
  838. };
  839. }
  840. int java_lang_ThreadGroup::_parent_offset = 0;
  841. int java_lang_ThreadGroup::_name_offset = 0;
  842. int java_lang_ThreadGroup::_threads_offset = 0;
  843. int java_lang_ThreadGroup::_groups_offset = 0;
  844. int java_lang_ThreadGroup::_maxPriority_offset = 0;
  845. int java_lang_ThreadGroup::_destroyed_offset = 0;
  846. int java_lang_ThreadGroup::_daemon_offset = 0;
  847. int java_lang_ThreadGroup::_vmAllowSuspension_offset = 0;
  848. int java_lang_ThreadGroup::_nthreads_offset = 0;
  849. int java_lang_ThreadGroup::_ngroups_offset = 0;
  850. oop java_lang_ThreadGroup::parent(oop java_thread_group) {
  851. assert(java_thread_group->is_oop(), "thread group must be oop");
  852. return java_thread_group->obj_field(_parent_offset);
  853. }
  854. // ("name as oop" accessor is not necessary)
  855. typeArrayOop java_lang_ThreadGroup::name(oop java_thread_group) {
  856. oop name = java_thread_group->obj_field(_name_offset);
  857. // ThreadGroup.name can be null
  858. return name == NULL ? (typeArrayOop)NULL : java_lang_String::value(name);
  859. }
  860. int java_lang_ThreadGroup::nthreads(oop java_thread_group) {
  861. assert(java_thread_group->is_oop(), "thread group must be oop");
  862. return java_thread_group->int_field(_nthreads_offset);
  863. }
  864. objArrayOop java_lang_ThreadGroup::threads(oop java_thread_group) {
  865. oop threads = java_thread_group->obj_field(_threads_offset);
  866. assert(threads != NULL, "threadgroups should have threads");
  867. assert(threads->is_objArray(), "just checking"); // Todo: Add better type checking code
  868. return objArrayOop(threads);
  869. }
  870. int java_lang_ThreadGroup::ngroups(oop java_thread_group) {
  871. assert(java_thread_group->is_oop(), "thread group must be oop");
  872. return java_thread_group->int_field(_ngroups_offset);
  873. }
  874. objArrayOop java_lang_ThreadGroup::groups(oop java_thread_group) {
  875. oop groups = java_thread_group->obj_field(_groups_offset);
  876. assert(groups == NULL || groups->is_objArray(), "just checking"); // Todo: Add better type checking code
  877. return objArrayOop(groups);
  878. }
  879. ThreadPriority java_lang_ThreadGroup::maxPriority(oop java_thread_group) {
  880. assert(java_thread_group->is_oop(), "thread group must be oop");
  881. return (ThreadPriority) java_thread_group->int_field(_maxPriority_offset);
  882. }
  883. bool java_lang_ThreadGroup::is_destroyed(oop java_thread_group) {
  884. assert(java_thread_group->is_oop(), "thread group must be oop");
  885. return java_thread_group->bool_field(_destroyed_offset) != 0;
  886. }
  887. bool java_lang_ThreadGroup::is_daemon(oop java_thread_group) {
  888. assert(java_thread_group->is_oop(), "thread group must be oop");
  889. return java_thread_group->bool_field(_daemon_offset) != 0;
  890. }
  891. bool java_lang_ThreadGroup::is_vmAllowSuspension(oop java_thread_group) {
  892. assert(java_thread_group->is_oop(), "thread group must be oop");
  893. return java_thread_group->bool_field(_vmAllowSuspension_offset) != 0;
  894. }
  895. void java_lang_ThreadGroup::compute_offsets() {
  896. assert(_parent_offset == 0, "offsets should be initialized only once");
  897. klassOop k = SystemDictionary::ThreadGroup_klass();
  898. compute_offset(_parent_offset, k, vmSymbols::parent_name(), vmSymbols::threadgroup_signature());
  899. compute_offset(_name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature());
  900. compute_offset(_threads_offset, k, vmSymbols::threads_name(), vmSymbols::thread_array_signature());
  901. compute_offset(_groups_offset, k, vmSymbols::groups_name(), vmSymbols::threadgroup_array_signature());
  902. compute_offset(_maxPriority_offset, k, vmSymbols::maxPriority_name(), vmSymbols::int_signature());
  903. compute_offset(_destroyed_offset, k, vmSymbols::destroyed_name(), vmSymbols::bool_signature());
  904. compute_offset(_daemon_offset, k, vmSymbols::daemon_name(), vmSymbols::bool_signature());
  905. compute_offset(_vmAllowSuspension_offset, k, vmSymbols::vmAllowSuspension_name(), vmSymbols::bool_signature());
  906. compute_offset(_nthreads_offset, k, vmSymbols::nthreads_name(), vmSymbols::int_signature());
  907. compute_offset(_ngroups_offset, k, vmSymbols::ngroups_name(), vmSymbols::int_signature());
  908. }
  909. oop java_lang_Throwable::unassigned_stacktrace() {
  910. instanceKlass* ik = instanceKlass::cast(SystemDictionary::Throwable_klass());
  911. address addr = ik->static_field_addr(static_unassigned_stacktrace_offset);
  912. if (UseCompressedOops) {
  913. return oopDesc::load_decode_heap_oop((narrowOop *)addr);
  914. } else {
  915. return oopDesc::load_decode_heap_oop((oop*)addr);
  916. }
  917. }
  918. oop java_lang_Throwable::backtrace(oop throwable) {
  919. return throwable->obj_field_acquire(backtrace_offset);
  920. }
  921. void java_lang_Throwable::set_backtrace(oop throwable, oop value) {
  922. throwable->release_obj_field_put(backtrace_offset, value);
  923. }
  924. oop java_lang_Throwable::message(oop throwable) {
  925. return throwable->obj_field(detailMessage_offset);
  926. }
  927. oop java_lang_Throwable::message(Handle throwable) {
  928. return throwable->obj_field(detailMessage_offset);
  929. }
  930. void java_lang_Throwable::set_message(oop throwable, oop value) {
  931. throwable->obj_field_put(detailMessage_offset, value);
  932. }
  933. void java_lang_Throwable::set_stacktrace(oop throwable, oop st_element_array) {
  934. throwable->obj_field_put(stackTrace_offset, st_element_array);
  935. }
  936. void java_lang_Throwable::clear_stacktrace(oop throwable) {
  937. assert(JDK_Version::is_gte_jdk14x_version(), "should only be called in >= 1.4");
  938. set_stacktrace(throwable, NULL);
  939. }
  940. void java_lang_Throwable::print(oop throwable, outputStream* st) {
  941. ResourceMark rm;
  942. klassOop k = throwable->klass();
  943. assert(k != NULL, "just checking");
  944. st->print("%s", instanceKlass::cast(k)->external_name());
  945. oop msg = message(throwable);
  946. if (msg != NULL) {
  947. st->print(": %s", java_lang_String::as_utf8_string(msg));
  948. }
  949. }
  950. void java_lang_Throwable::print(Handle throwable, outputStream* st) {
  951. ResourceMark rm;
  952. klassOop k = throwable->klass();
  953. assert(k != NULL, "just checking");
  954. st->print("%s", instanceKlass::cast(k)->external_name());
  955. oop msg = message(throwable);
  956. if (msg != NULL) {
  957. st->print(": %s", java_lang_String::as_utf8_string(msg));
  958. }
  959. }
  960. // Print stack trace element to resource allocated buffer
  961. char* java_lang_Throwable::print_stack_element_to_buffer(methodOop method, int bci) {
  962. // Get strings and string lengths
  963. instanceKlass* klass = instanceKlass::cast(method->method_holder());
  964. const char* klass_name = klass->external_name();
  965. int buf_len = (int)strlen(klass_name);
  966. char* source_file_name;
  967. if (klass->source_file_name() == NULL) {
  968. source_file_name = NULL;
  969. } else {
  970. source_file_name = klass->source_file_name()->as_C_string();
  971. buf_len += (int)strlen(source_file_name);
  972. }
  973. char* method_name = method->name()->as_C_string();
  974. buf_len += (int)strlen(method_name);
  975. // Allocate temporary buffer with extra space for formatting and line number
  976. char* buf = NEW_RESOURCE_ARRAY(char, buf_len + 64);
  977. // Print stack trace line in buffer
  978. sprintf(buf, "\tat %s.%s", klass_name, method_name);
  979. if (method->is_native()) {
  980. strcat(buf, "(Native Method)");
  981. } else {
  982. int line_number = method->line_number_from_bci(bci);
  983. if (source_file_name != NULL && (line_number != -1)) {
  984. // Sourcename and linenumber
  985. sprintf(buf + (int)strlen(buf), "(%s:%d)", source_file_name, line_number);
  986. } else if (source_file_name != NULL) {
  987. // Just sourcename
  988. sprintf(buf + (int)strlen(buf), "(%s)", source_file_name);
  989. } else {
  990. // Neither soucename and linenumber
  991. sprintf(buf + (int)strlen(buf), "(Unknown Source)");
  992. }
  993. nmethod* nm = method->code();
  994. if (WizardMode && nm != NULL) {
  995. sprintf(buf + (int)strlen(buf), "(nmethod " INTPTR_FORMAT ")", (intptr_t)nm);
  996. }
  997. }
  998. return buf;
  999. }
  1000. void java_lang_Throwable::print_stack_element(Handle stream, methodOop method, int bci) {
  1001. ResourceMark rm;
  1002. char* buf = print_stack_element_to_buffer(method, bci);
  1003. print_to_stream(stream, buf);
  1004. }
  1005. void java_lang_Throwable::print_stack_element(outputStream *st, methodOop method, int bci) {
  1006. ResourceMark rm;
  1007. char* buf = print_stack_element_to_buffer(method, bci);
  1008. st->print_cr("%s", buf);
  1009. }
  1010. void java_lang_Throwable::print_to_stream(Handle stream, const char* str) {
  1011. if (stream.is_null()) {
  1012. tty->print_cr("%s", str);
  1013. } else {
  1014. EXCEPTION_MARK;
  1015. JavaValue result(T_VOID);
  1016. Handle arg (THREAD, oopFactory::new_charArray(str, THREAD));
  1017. if (!HAS_PENDING_EXCEPTION) {
  1018. JavaCalls::call_virtual(&result,
  1019. stream,
  1020. KlassHandle(THREAD, stream->klass()),
  1021. vmSymbols::println_name(),
  1022. vmSymbols::char_array_void_signature(),
  1023. arg,
  1024. THREAD);
  1025. }
  1026. // Ignore any exceptions. we are in the middle of exception handling. Same as classic VM.
  1027. if (HAS_PENDING_EXCEPTION) CLEAR_PENDING_EXCEPTION;
  1028. }
  1029. }
  1030. const char* java_lang_Throwable::no_stack_trace_message() {
  1031. return "\t<<no stack trace available>>";
  1032. }
  1033. // Currently used only for exceptions occurring during startup
  1034. void java_lang_Throwable::print_stack_trace(oop throwable, outputStream* st) {
  1035. Thread *THREAD = Thread::current();
  1036. Handle h_throwable(THREAD, throwable);
  1037. while (h_throwable.not_null()) {
  1038. objArrayHandle result (THREAD, objArrayOop(backtrace(h_throwable())));
  1039. if (result.is_null()) {
  1040. st->print_cr(no_stack_trace_message());
  1041. return;
  1042. }
  1043. while (result.not_null()) {
  1044. objArrayHandle methods (THREAD,
  1045. objArrayOop(result->obj_at(trace_methods_offset)));
  1046. typeArrayHandle bcis (THREAD,
  1047. typeArrayOop(result->obj_at(trace_bcis_offset)));
  1048. if (methods.is_null() || bcis.is_null()) {
  1049. st->print_cr(no_stack_trace_message());
  1050. return;
  1051. }
  1052. int length = methods()->length();
  1053. for (int index = 0; index < length; index++) {
  1054. methodOop method = methodOop(methods()->obj_at(index));
  1055. if (method == NULL) goto handle_cause;
  1056. int bci = bcis->ushort_at(index);
  1057. print_stack_element(st, method, bci);
  1058. }
  1059. result = objArrayHandle(THREAD, objArrayOop(result->obj_at(trace_next_offset)));
  1060. }
  1061. handle_cause:
  1062. {
  1063. EXCEPTION_MARK;
  1064. JavaValue result(T_OBJECT);
  1065. JavaCalls::call_virtual(&result,
  1066. h_throwable,
  1067. KlassHandle(THREAD, h_throwable->klass()),
  1068. vmSymbols::getCause_name(),
  1069. vmSymbols::void_throwable_signature(),
  1070. THREAD);
  1071. // Ignore any exceptions. we are in the middle of exception handling. Same as classic VM.
  1072. if (HAS_PENDING_EXCEPTION) {
  1073. CLEAR_PENDING_EXCEPTION;
  1074. h_throwable = Handle();
  1075. } else {
  1076. h_throwable = Handle(THREAD, (oop) result.get_jobject());
  1077. if (h_throwable.not_null()) {
  1078. st->print("Caused by: ");
  1079. print(h_throwable, st);
  1080. st->cr();
  1081. }
  1082. }
  1083. }
  1084. }
  1085. }
  1086. void java_lang_Throwable::print_stack_trace(oop throwable, oop print_stream) {
  1087. // Note: this is no longer used in Merlin, but we support it for compatibility.
  1088. Thread *thread = Thread::current();
  1089. Handle stream(thread, print_stream);
  1090. objArrayHandle result (thread, objArrayOop(backtrace(throwable)));
  1091. if (result.is_null()) {
  1092. print_to_stream(stream, no_stack_trace_message());
  1093. return;
  1094. }
  1095. while (result.not_null()) {
  1096. objArrayHandle methods (thread,
  1097. objArrayOop(result->obj_at(trace_methods_offset)));
  1098. typeArrayHandle bcis (thread,
  1099. typeArrayOop(result->obj_at(trace_bcis_offset)));
  1100. if (methods.is_null() || bcis.is_null()) {
  1101. print_to_stream(stream, no_stack_trace_message());
  1102. return;
  1103. }
  1104. int length = methods()->length();
  1105. for (int index = 0; index < length; index++) {
  1106. methodOop method = methodOop(methods()->obj_at(index));
  1107. if (method == NULL) return;
  1108. int bci = bcis->ushort_at(index);
  1109. print_stack_element(stream, method, bci);
  1110. }
  1111. result = objArrayHandle(thread, objArrayOop(result->obj_at(trace_next_offset)));
  1112. }
  1113. }
  1114. // This class provides a simple wrapper over the internal structure of
  1115. // exception backtrace to insulate users of the backtrace from needing
  1116. // to know what it looks like.
  1117. class BacktraceBuilder: public StackObj {
  1118. private:
  1119. Handle _backtrace;
  1120. objArrayOop _head;
  1121. objArrayOop _methods;
  1122. typeArrayOop _bcis;
  1123. int _index;
  1124. No_Safepoint_Verifier _nsv;
  1125. public:
  1126. enum {
  1127. trace_methods_offset = java_lang_Throwable::trace_methods_offset,
  1128. trace_bcis_offset = java_lang_Throwable::trace_bcis_offset,
  1129. trace_next_offset = java_lang_Throwable::trace_next_offset,
  1130. trace_size = java_lang_Throwable::trace_size,
  1131. trace_chunk_size = java_lang_Throwable::trace_chunk_size
  1132. };
  1133. // constructor for new backtrace
  1134. BacktraceBuilder(TRAPS): _methods(NULL), _bcis(NULL), _head(NULL) {
  1135. expand(CHECK);
  1136. _backtrace = _head;
  1137. _index = 0;
  1138. }
  1139. void expand(TRAPS) {
  1140. objArrayHandle old_head(THREAD, _head);
  1141. Pause_No_Safepoint_Verifier pnsv(&_nsv);
  1142. objArrayOop head = oopFactory::new_objectArray(trace_size, CHECK);
  1143. objArrayHandle new_head(THREAD, head);
  1144. objArrayOop methods = oopFactory::new_objectArray(trace_chunk_size, CHECK);
  1145. objArrayHandle new_methods(THREAD, methods);
  1146. typeArrayOop bcis = oopFactory::new_shortArray(trace_chunk_size, CHECK);
  1147. typeArrayHandle new_bcis(THREAD, bcis);
  1148. if (!old_head.is_null()) {
  1149. old_head->obj_at_put(trace_next_offset, new_head());
  1150. }
  1151. new_head->obj_at_put(trace_methods_offset, new_methods());
  1152. new_head->obj_at_put(trace_bcis_offset, new_bcis());
  1153. _head = new_head();
  1154. _methods = new_methods();
  1155. _bcis = new_bcis();
  1156. _index = 0;
  1157. }
  1158. oop backtrace() {
  1159. return _backtrace();
  1160. }
  1161. inline void push(methodOop method, int bci, TRAPS) {
  1162. // Smear the -1 bci to 0 since the array only holds unsigned
  1163. // shorts. The later line number lookup would just smear the -1
  1164. // to a 0 even if it could be recorded.
  1165. if (bci == SynchronizationEntryBCI) bci = 0;
  1166. assert(bci == (jushort)bci, "doesn't fit");
  1167. if (_index >= trace_chunk_size) {
  1168. methodHandle mhandle(THREAD, method);
  1169. expand(CHECK);
  1170. method = mhandle();
  1171. }
  1172. _methods->obj_at_put(_index, method);
  1173. _bcis->ushort_at_put(_index, bci);
  1174. _index++;
  1175. }
  1176. methodOop current_method() {
  1177. assert(_index >= 0 && _index < trace_chunk_size, "out of range");
  1178. return methodOop(_methods->obj_at(_index));
  1179. }
  1180. jushort current_bci() {
  1181. assert(_index >= 0 && _index < trace_chunk_size, "out of range");
  1182. return _bcis->ushort_at(_index);
  1183. }
  1184. };
  1185. void java_lang_Throwable::fill_in_stack_trace(Handle throwable, methodHandle method, TRAPS) {
  1186. if (!StackTraceInThrowable) return;
  1187. ResourceMark rm(THREAD);
  1188. // Start out by clearing the backtrace for this object, in case the VM
  1189. // runs out of memory while allocating the stack trace
  1190. set_backtrace(throwable(), NULL);
  1191. if (JDK_Version::is_gte_jdk14x_version()) {
  1192. // New since 1.4, clear lazily constructed Java level stacktrace if
  1193. // refilling occurs
  1194. // This is unnecessary in 1.7+ but harmless
  1195. clear_stacktrace(throwable());
  1196. }
  1197. int max_depth = MaxJavaStackTraceDepth;
  1198. JavaThread* thread = (JavaThread*)THREAD;
  1199. BacktraceBuilder bt(CHECK);
  1200. // If there is no Java frame just return the method that was being called
  1201. // with bci 0
  1202. if (!thread->has_last_Java_frame()) {
  1203. if (max_depth >= 1 && method() != NULL) {
  1204. bt.push(method(), 0, CHECK);
  1205. set_backtrace(throwable(), bt.backtrace());
  1206. }
  1207. return;
  1208. }
  1209. // Instead of using vframe directly, this version of fill_in_stack_trace
  1210. // basically handles everything by hand. This significantly improved the
  1211. // speed of this method call up to 28.5% on Solaris sparc. 27.1% on Windows.
  1212. // See bug 6333838 for more details.
  1213. // The "ASSERT" here is to verify this method generates the exactly same stack
  1214. // trace as utilizing vframe.
  1215. #ifdef ASSERT
  1216. vframeStream st(thread);
  1217. methodHandle st_method(THREAD, st.method());
  1218. #endif
  1219. int total_count = 0;
  1220. RegisterMap map(thread, false);
  1221. int decode_offset = 0;
  1222. nmethod* nm = NULL;
  1223. bool skip_fillInStackTrace_check = false;
  1224. bool skip_throwableInit_check = false;
  1225. for (frame fr = thread->last_frame(); max_depth != total_count;) {
  1226. methodOop method = NULL;
  1227. int bci = 0;
  1228. // Compiled java method case.
  1229. if (decode_offset != 0) {
  1230. DebugInfoReadStream stream(nm, decode_offset);
  1231. decode_offset = stream.read_int();
  1232. method = (methodOop)nm->oop_at(stream.read_int());
  1233. bci = stream.read_bci();
  1234. } else {
  1235. if (fr.is_first_frame()) break;
  1236. address pc = fr.pc();
  1237. if (fr.is_interpreted_frame()) {
  1238. intptr_t bcx = fr.interpreter_frame_bcx();
  1239. method = fr.interpreter_frame_method();
  1240. bci = fr.is_bci(bcx) ? bcx : method->bci_from((address)bcx);
  1241. fr = fr.sender(&map);
  1242. } else {
  1243. CodeBlob* cb = fr.cb();
  1244. // HMMM QQQ might be nice to have frame return nm as NULL if cb is non-NULL
  1245. // but non nmethod
  1246. fr = fr.sender(&map);
  1247. if (cb == NULL || !cb->is_nmethod()) {
  1248. continue;
  1249. }
  1250. nm = (nmethod*)cb;
  1251. if (nm->method()->is_native()) {
  1252. method = nm->method();
  1253. bci = 0;
  1254. } else {
  1255. PcDesc* pd = nm->pc_desc_at(pc);
  1256. decode_offset = pd->scope_decode_offset();
  1257. // if decode_offset is not equal to 0, it will execute the
  1258. // "compiled java method case" at the beginning of the loop.
  1259. continue;
  1260. }
  1261. }
  1262. }
  1263. #ifdef ASSERT
  1264. assert(st_method() == method && st.bci() == bci,
  1265. "Wrong stack trace");
  1266. st.next();
  1267. // vframeStream::method isn't GC-safe so store off a copy
  1268. // of the methodOop in case we GC.
  1269. if (!st.at_end()) {
  1270. st_method = st.method();
  1271. }
  1272. #endif
  1273. // the format of the stacktrace will be:
  1274. // - 1 or more fillInStackTrace frames for the exception class (skipped)
  1275. // - 0 or more <init> methods for the exception class (skipped)
  1276. // - rest of the stack
  1277. if (!skip_fillInStackTrace_check) {
  1278. if ((method->name() == vmSymbols::fillInStackTrace_name() ||
  1279. method->name() == vmSymbols::fillInStackTrace0_name()) &&
  1280. throwable->is_a(method->method_holder())) {
  1281. continue;
  1282. }
  1283. else {
  1284. skip_fillInStackTrace_check = true; // gone past them all
  1285. }
  1286. }
  1287. if (!skip_throwableInit_check) {
  1288. assert(skip_fillInStackTrace_check, "logic error in backtrace filtering");
  1289. // skip <init> methods of the exception class and superclasses
  1290. // This is simlar to classic VM.
  1291. if (method->name() == vmSymbols::object_initializer_name() &&
  1292. throwable->is_a(method->method_holder())) {
  1293. continue;
  1294. } else {
  1295. // there are none or we've seen them all - either way stop checking
  1296. skip_throwableInit_check = true;
  1297. }
  1298. }
  1299. bt.push(method, bci, CHECK);
  1300. total_count++;
  1301. }
  1302. // Put completed stack trace into throwable object
  1303. set_backtrace(throwable(), bt.backtrace());
  1304. }
  1305. void java_lang_Throwable::fill_in_stack_trace(Handle throwable, methodHandle method) {
  1306. // No-op if stack trace is disabled
  1307. if (!StackTraceInThrowable) {
  1308. return;
  1309. }
  1310. // Disable stack traces for some preallocated out of memory errors
  1311. if (!Universe::should_fill_in_stack_trace(throwable)) {
  1312. return;
  1313. }
  1314. PRESERVE_EXCEPTION_MARK;
  1315. JavaThread* thread = JavaThread::active();
  1316. fill_in_stack_trace(throwable, method, thread);
  1317. // ignore exceptions thrown during stack trace filling
  1318. CLEAR_PENDING_EXCEPTION;
  1319. }
  1320. void java_lang_Throwable::allocate_backtrace(Handle throwable, TRAPS) {
  1321. // Allocate stack trace - backtrace is created but not filled in
  1322. // No-op if stack trace is disabled
  1323. if (!StackTraceInThrowable) return;
  1324. objArrayOop h_oop = oopFactory::new_objectArray(trace_size, CHECK);
  1325. objArrayHandle backtrace (THREAD, h_oop);
  1326. objArrayOop m_oop = oopFactory::new_objectArray(trace_chunk_size, CHECK);
  1327. objArrayHandle methods (THREAD, m_oop);
  1328. typeArrayOop b = oopFactory::new_shortArray(trace_chunk_size, CHECK);
  1329. typeArrayHandle bcis(THREAD, b);
  1330. // backtrace has space for one chunk (next is NULL)
  1331. backtrace->obj_at_put(trace_methods_offset, methods());
  1332. backtrace->obj_at_put(trace_bcis_offset, bcis());
  1333. set_backtrace(throwable(), backtrace());
  1334. }
  1335. void java_lang_Throwable::fill_in_stack_trace_of_preallocated_backtrace(Handle throwable) {
  1336. // Fill in stack trace into preallocated backtrace (no GC)
  1337. // No-op if stack trace is disabled
  1338. if (!StackTraceInThrowable) return;
  1339. assert(throwable->is_a(SystemDictionary::Throwable_klass()), "sanity check");
  1340. oop backtrace = java_lang_Throwable::backtrace(throwable());
  1341. assert(backtrace != NULL, "backtrace not preallocated");
  1342. oop m = objArrayOop(backtrace)->obj_at(trace_methods_offset);
  1343. objArrayOop methods = objArrayOop(m);
  1344. assert(methods != NULL && methods->length() > 0, "method array not preallocated");
  1345. oop b = objArrayOop(backtrace)->obj_at(trace_bcis_offset);
  1346. typeArrayOop bcis = typeArrayOop(b);
  1347. assert(bcis != NULL, "bci array not preallocated");
  1348. assert(methods->length() == bcis->length(), "method and bci arrays should match");
  1349. JavaThread* thread = JavaThread::current();
  1350. ResourceMark rm(thread);
  1351. vframeStream st(thread);
  1352. // Unlike fill_in_stack_trace we do not skip fillInStackTrace or throwable init
  1353. // methods as preallocated errors aren't created by "java" code.
  1354. // fill in as much stack trace as possible
  1355. int max_chunks = MIN2(methods->length(), (int)MaxJavaStackTraceDepth);
  1356. int chunk_count = 0;
  1357. for (;!st.at_end(); st.next()) {
  1358. // Add entry and smear the -1 bci to 0 since the array only holds
  1359. // unsigned shorts. The later line number lookup would just smear
  1360. // the -1 to a 0 even if it could be recorded.
  1361. int bci = st.bci();
  1362. if (bci == SynchronizationEntryBCI) bci = 0;
  1363. assert(bci == (jushort)bci, "doesn't fit");
  1364. bcis->ushort_at_put(chunk_count, bci);
  1365. methods->obj_at_put(chunk_count, st.method());
  1366. chunk_count++;
  1367. // Bail-out for deep stacks
  1368. if (chunk_count >= max_chunks) break;
  1369. }
  1370. // For Java 7+ we support the Throwable immutability protocol defined for Java 7. This support
  1371. // was missing in 7u0 so in 7u0 there is a workaround in the Throwable class. That workaround
  1372. // can be removed in a JDK using this JVM version
  1373. if (JDK_Version::is_gte_jdk17x_version()) {
  1374. java_lang_Throwable::set_stacktrace(throwable(), java_lang_Throwable::unassigned_stacktrace());
  1375. assert(java_lang_Throwable::unassigned_stacktrace() != NULL, "not initialized");
  1376. }
  1377. }
  1378. int java_lang_Throwable::get_stack_trace_depth(oop throwable, TRAPS) {
  1379. if (throwable == NULL) {
  1380. THROW_0(vmSymbols::java_lang_NullPointerException());
  1381. }
  1382. objArrayOop chunk = objArrayOop(backtrace(throwable));
  1383. int depth = 0;
  1384. if (chunk != NULL) {
  1385. // Iterate over chunks and count full ones
  1386. while (true) {
  1387. objArrayOop next = objArrayOop(chunk->obj_at(trace_next_offset));
  1388. if (next == NULL) break;
  1389. depth += trace_chunk_size;
  1390. chunk = next;
  1391. }
  1392. assert(chunk != NULL && chunk->obj_at(trace_next_offset) == NULL, "sanity check");
  1393. // Count element in remaining partial chunk
  1394. objArrayOop methods = objArrayOop(chunk->obj_at(trace_methods_offset));
  1395. typeArrayOop bcis = typeArrayOop(chunk->obj_at(trace_bcis_offset));
  1396. assert(methods != NULL && bcis != NULL, "sanity check");
  1397. for (int i = 0; i < methods->length(); i++) {
  1398. if (methods->obj_at(i) == NULL) break;
  1399. depth++;
  1400. }
  1401. }
  1402. return depth;
  1403. }
  1404. oop java_lang_Throwable::get_stack_trace_element(oop throwable, int index, TRAPS) {
  1405. if (throwable == NULL) {
  1406. THROW_0(vmSymbols::java_lang_NullPointerException());
  1407. }
  1408. if (index < 0) {
  1409. THROW_(vmSymbols::java_lang_IndexOutOfBoundsException(), NULL);
  1410. }
  1411. // Compute how many chunks to skip and index into actual chunk
  1412. objArrayOop chunk = objArrayOop(backtrace(throwable));
  1413. int skip_chunks = index / trace_chunk_size;
  1414. int chunk_index = index % trace_chunk_size;
  1415. while (chunk != NULL && skip_chunks > 0) {
  1416. chunk = objArrayOop(chunk->obj_at(trace_next_offset));
  1417. skip_chunks--;
  1418. }
  1419. if (chunk == NULL) {
  1420. THROW_(vmSymbols::java_lang_IndexOutOfBoundsException(), NULL);
  1421. }
  1422. // Get method,bci from chunk
  1423. objArrayOop methods = objArrayOop(chunk->obj_at(trace_methods_offset));
  1424. typeArrayOop bcis = typeArrayOop(chunk->obj_at(trace_bcis_offset));
  1425. assert(methods != NULL && bcis != NULL, "sanity check");
  1426. methodHandle method(THREAD, methodOop(methods->obj_at(chunk_index)));
  1427. int bci = bcis->ushort_at(chunk_index);
  1428. // Chunk can be partial full
  1429. if (method.is_null()) {
  1430. THROW_(vmSymbols::java_lang_IndexOutOfBoundsException(), NULL);
  1431. }
  1432. oop element = java_lang_StackTraceElement::create(method, bci, CHECK_0);
  1433. return element;
  1434. }
  1435. oop java_lang_StackTraceElement::create(methodHandle method, int bci, TRAPS) {
  1436. // SystemDictionary::stackTraceElement_klass() will be null for pre-1.4 JDKs
  1437. assert(JDK_Version::is_gte_jdk14x_version(), "should only be called in >= 1.4");
  1438. // Allocate java.lang.StackTraceElement instance
  1439. klassOop k = SystemDictionary::StackTraceElement_klass();
  1440. assert(k != NULL, "must be loaded in 1.4+");
  1441. instanceKlassHandle ik (THREAD, k);
  1442. if (ik->should_be_initialized()) {
  1443. ik->initialize(CHECK_0);
  1444. }
  1445. Handle element = ik->allocate_instance_handle(CHECK_0);
  1446. // Fill in class name
  1447. ResourceMark rm(THREAD);
  1448. const char* str = instanceKlass::cast(method->method_holder())->external_name();
  1449. oop classname = StringTable::intern((char*) str, CHECK_0);
  1450. java_lang_StackTraceElement::set_declaringClass(element(), classname);
  1451. // Fill in method name
  1452. oop methodname = StringTable::intern(method->name(), CHECK_0);
  1453. java_lang_StackTraceElement::set_methodName(element(), methodname);
  1454. // Fill in source file name
  1455. Symbol* source = instanceKlass::cast(method->method_holder())->source_file_name();
  1456. oop filename = StringTable::intern(source, CHECK_0);
  1457. java_lang_StackTraceElement::set_fileName(element(), filename);
  1458. // File in source line number
  1459. int line_number;
  1460. if (method->is_native()) {
  1461. // Negative value different from -1 below, enabling Java code in
  1462. // class java.lang.StackTraceElement to distinguish "native" from
  1463. // "no LineNumberTable".
  1464. line_number = -2;
  1465. } else {
  1466. // Returns -1 if no LineNumberTable, and otherwise actual line number
  1467. line_number = method->line_number_from_bci(bci);
  1468. }
  1469. java_lang_StackTraceElement::set_lineNumber(element(), line_number);
  1470. return element();
  1471. }
  1472. void java_lang_reflect_AccessibleObject::compute_offsets() {
  1473. klassOop k = SystemDictionary::reflect_AccessibleObject_klass();
  1474. compute_offset(override_offset, k, vmSymbols::override_name(), vmSymbols::bool_signature());
  1475. }
  1476. jboolean java_lang_reflect_AccessibleObject::override(oop reflect) {
  1477. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1478. return (jboolean) reflect->bool_field(override_offset);
  1479. }
  1480. void java_lang_reflect_AccessibleObject::set_override(oop reflect, jboolean value) {
  1481. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1482. reflect->bool_field_put(override_offset, (int) value);
  1483. }
  1484. void java_lang_reflect_Method::compute_offsets() {
  1485. klassOop k = SystemDictionary::reflect_Method_klass();
  1486. compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature());
  1487. compute_offset(name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature());
  1488. compute_offset(returnType_offset, k, vmSymbols::returnType_name(), vmSymbols::class_signature());
  1489. compute_offset(parameterTypes_offset, k, vmSymbols::parameterTypes_name(), vmSymbols::class_array_signature());
  1490. compute_offset(exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), vmSymbols::class_array_signature());
  1491. compute_offset(slot_offset, k, vmSymbols::slot_name(), vmSymbols::int_signature());
  1492. compute_offset(modifiers_offset, k, vmSymbols::modifiers_name(), vmSymbols::int_signature());
  1493. // The generic signature and annotations fields are only present in 1.5
  1494. signature_offset = -1;
  1495. annotations_offset = -1;
  1496. parameter_annotations_offset = -1;
  1497. annotation_default_offset = -1;
  1498. compute_optional_offset(signature_offset, k, vmSymbols::signature_name(), vmSymbols::string_signature());
  1499. compute_optional_offset(annotations_offset, k, vmSymbols::annotations_name(), vmSymbols::byte_array_signature());
  1500. compute_optional_offset(parameter_annotations_offset, k, vmSymbols::parameter_annotations_name(), vmSymbols::byte_array_signature());
  1501. compute_optional_offset(annotation_default_offset, k, vmSymbols::annotation_default_name(), vmSymbols::byte_array_signature());
  1502. }
  1503. Handle java_lang_reflect_Method::create(TRAPS) {
  1504. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1505. klassOop klass = SystemDictionary::reflect_Method_klass();
  1506. // This class is eagerly initialized during VM initialization, since we keep a refence
  1507. // to one of the methods
  1508. assert(instanceKlass::cast(klass)->is_initialized(), "must be initialized");
  1509. return instanceKlass::cast(klass)->allocate_instance_handle(CHECK_NH);
  1510. }
  1511. oop java_lang_reflect_Method::clazz(oop reflect) {
  1512. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1513. return reflect->obj_field(clazz_offset);
  1514. }
  1515. void java_lang_reflect_Method::set_clazz(oop reflect, oop value) {
  1516. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1517. reflect->obj_field_put(clazz_offset, value);
  1518. }
  1519. int java_lang_reflect_Method::slot(oop reflect) {
  1520. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1521. return reflect->int_field(slot_offset);
  1522. }
  1523. void java_lang_reflect_Method::set_slot(oop reflect, int value) {
  1524. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1525. reflect->int_field_put(slot_offset, value);
  1526. }
  1527. oop java_lang_reflect_Method::name(oop method) {
  1528. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1529. return method->obj_field(name_offset);
  1530. }
  1531. void java_lang_reflect_Method::set_name(oop method, oop value) {
  1532. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1533. method->obj_field_put(name_offset, value);
  1534. }
  1535. oop java_lang_reflect_Method::return_type(oop method) {
  1536. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1537. return method->obj_field(returnType_offset);
  1538. }
  1539. void java_lang_reflect_Method::set_return_type(oop method, oop value) {
  1540. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1541. method->obj_field_put(returnType_offset, value);
  1542. }
  1543. oop java_lang_reflect_Method::parameter_types(oop method) {
  1544. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1545. return method->obj_field(parameterTypes_offset);
  1546. }
  1547. void java_lang_reflect_Method::set_parameter_types(oop method, oop value) {
  1548. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1549. method->obj_field_put(parameterTypes_offset, value);
  1550. }
  1551. oop java_lang_reflect_Method::exception_types(oop method) {
  1552. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1553. return method->obj_field(exceptionTypes_offset);
  1554. }
  1555. void java_lang_reflect_Method::set_exception_types(oop method, oop value) {
  1556. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1557. method->obj_field_put(exceptionTypes_offset, value);
  1558. }
  1559. int java_lang_reflect_Method::modifiers(oop method) {
  1560. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1561. return method->int_field(modifiers_offset);
  1562. }
  1563. void java_lang_reflect_Method::set_modifiers(oop method, int value) {
  1564. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1565. method->int_field_put(modifiers_offset, value);
  1566. }
  1567. bool java_lang_reflect_Method::has_signature_field() {
  1568. return (signature_offset >= 0);
  1569. }
  1570. oop java_lang_reflect_Method::signature(oop method) {
  1571. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1572. assert(has_signature_field(), "signature field must be present");
  1573. return method->obj_field(signature_offset);
  1574. }
  1575. void java_lang_reflect_Method::set_signature(oop method, oop value) {
  1576. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1577. assert(has_signature_field(), "signature field must be present");
  1578. method->obj_field_put(signature_offset, value);
  1579. }
  1580. bool java_lang_reflect_Method::has_annotations_field() {
  1581. return (annotations_offset >= 0);
  1582. }
  1583. oop java_lang_reflect_Method::annotations(oop method) {
  1584. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1585. assert(has_annotations_field(), "annotations field must be present");
  1586. return method->obj_field(annotations_offset);
  1587. }
  1588. void java_lang_reflect_Method::set_annotations(oop method, oop value) {
  1589. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1590. assert(has_annotations_field(), "annotations field must be present");
  1591. method->obj_field_put(annotations_offset, value);
  1592. }
  1593. bool java_lang_reflect_Method::has_parameter_annotations_field() {
  1594. return (parameter_annotations_offset >= 0);
  1595. }
  1596. oop java_lang_reflect_Method::parameter_annotations(oop method) {
  1597. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1598. assert(has_parameter_annotations_field(), "parameter annotations field must be present");
  1599. return method->obj_field(parameter_annotations_offset);
  1600. }
  1601. void java_lang_reflect_Method::set_parameter_annotations(oop method, oop value) {
  1602. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1603. assert(has_parameter_annotations_field(), "parameter annotations field must be present");
  1604. method->obj_field_put(parameter_annotations_offset, value);
  1605. }
  1606. bool java_lang_reflect_Method::has_annotation_default_field() {
  1607. return (annotation_default_offset >= 0);
  1608. }
  1609. oop java_lang_reflect_Method::annotation_default(oop method) {
  1610. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1611. assert(has_annotation_default_field(), "annotation default field must be present");
  1612. return method->obj_field(annotation_default_offset);
  1613. }
  1614. void java_lang_reflect_Method::set_annotation_default(oop method, oop value) {
  1615. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1616. assert(has_annotation_default_field(), "annotation default field must be present");
  1617. method->obj_field_put(annotation_default_offset, value);
  1618. }
  1619. void java_lang_reflect_Constructor::compute_offsets() {
  1620. klassOop k = SystemDictionary::reflect_Constructor_klass();
  1621. compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature());
  1622. compute_offset(parameterTypes_offset, k, vmSymbols::parameterTypes_name(), vmSymbols::class_array_signature());
  1623. compute_offset(exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), vmSymbols::class_array_signature());
  1624. compute_offset(slot_offset, k, vmSymbols::slot_name(), vmSymbols::int_signature());
  1625. compute_offset(modifiers_offset, k, vmSymbols::modifiers_name(), vmSymbols::int_signature());
  1626. // The generic signature and annotations fields are only present in 1.5
  1627. signature_offset = -1;
  1628. annotations_offset = -1;
  1629. parameter_annotations_offset = -1;
  1630. compute_optional_offset(signature_offset, k, vmSymbols::signature_name(), vmSymbols::string_signature());
  1631. compute_optional_offset(annotations_offset, k, vmSymbols::annotations_name(), vmSymbols::byte_array_signature());
  1632. compute_optional_offset(parameter_annotations_offset, k, vmSymbols::parameter_annotations_name(), vmSymbols::byte_array_signature());
  1633. }
  1634. Handle java_lang_reflect_Constructor::create(TRAPS) {
  1635. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1636. Symbol* name = vmSymbols::java_lang_reflect_Constructor();
  1637. klassOop k = SystemDictionary::resolve_or_fail(name, true, CHECK_NH);
  1638. instanceKlassHandle klass (THREAD, k);
  1639. // Ensure it is initialized
  1640. klass->initialize(CHECK_NH);
  1641. return klass->allocate_instance_handle(CHECK_NH);
  1642. }
  1643. oop java_lang_reflect_Constructor::clazz(oop reflect) {
  1644. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1645. return reflect->obj_field(clazz_offset);
  1646. }
  1647. void java_lang_reflect_Constructor::set_clazz(oop reflect, oop value) {
  1648. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1649. reflect->obj_field_put(clazz_offset, value);
  1650. }
  1651. oop java_lang_reflect_Constructor::parameter_types(oop constructor) {
  1652. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1653. return constructor->obj_field(parameterTypes_offset);
  1654. }
  1655. void java_lang_reflect_Constructor::set_parameter_types(oop constructor, oop value) {
  1656. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1657. constructor->obj_field_put(parameterTypes_offset, value);
  1658. }
  1659. oop java_lang_reflect_Constructor::exception_types(oop constructor) {
  1660. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1661. return constructor->obj_field(exceptionTypes_offset);
  1662. }
  1663. void java_lang_reflect_Constructor::set_exception_types(oop constructor, oop value) {
  1664. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1665. constructor->obj_field_put(exceptionTypes_offset, value);
  1666. }
  1667. int java_lang_reflect_Constructor::slot(oop reflect) {
  1668. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1669. return reflect->int_field(slot_offset);
  1670. }
  1671. void java_lang_reflect_Constructor::set_slot(oop reflect, int value) {
  1672. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1673. reflect->int_field_put(slot_offset, value);
  1674. }
  1675. int java_lang_reflect_Constructor::modifiers(oop constructor) {
  1676. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1677. return constructor->int_field(modifiers_offset);
  1678. }
  1679. void java_lang_reflect_Constructor::set_modifiers(oop constructor, int value) {
  1680. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1681. constructor->int_field_put(modifiers_offset, value);
  1682. }
  1683. bool java_lang_reflect_Constructor::has_signature_field() {
  1684. return (signature_offset >= 0);
  1685. }
  1686. oop java_lang_reflect_Constructor::signature(oop constructor) {
  1687. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1688. assert(has_signature_field(), "signature field must be present");
  1689. return constructor->obj_field(signature_offset);
  1690. }
  1691. void java_lang_reflect_Constructor::set_signature(oop constructor, oop value) {
  1692. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1693. assert(has_signature_field(), "signature field must be present");
  1694. constructor->obj_field_put(signature_offset, value);
  1695. }
  1696. bool java_lang_reflect_Constructor::has_annotations_field() {
  1697. return (annotations_offset >= 0);
  1698. }
  1699. oop java_lang_reflect_Constructor::annotations(oop constructor) {
  1700. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1701. assert(has_annotations_field(), "annotations field must be present");
  1702. return constructor->obj_field(annotations_offset);
  1703. }
  1704. void java_lang_reflect_Constructor::set_annotations(oop constructor, oop value) {
  1705. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1706. assert(has_annotations_field(), "annotations field must be present");
  1707. constructor->obj_field_put(annotations_offset, value);
  1708. }
  1709. bool java_lang_reflect_Constructor::has_parameter_annotations_field() {
  1710. return (parameter_annotations_offset >= 0);
  1711. }
  1712. oop java_lang_reflect_Constructor::parameter_annotations(oop method) {
  1713. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1714. assert(has_parameter_annotations_field(), "parameter annotations field must be present");
  1715. return method->obj_field(parameter_annotations_offset);
  1716. }
  1717. void java_lang_reflect_Constructor::set_parameter_annotations(oop method, oop value) {
  1718. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1719. assert(has_parameter_annotations_field(), "parameter annotations field must be present");
  1720. method->obj_field_put(parameter_annotations_offset, value);
  1721. }
  1722. void java_lang_reflect_Field::compute_offsets() {
  1723. klassOop k = SystemDictionary::reflect_Field_klass();
  1724. compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature());
  1725. compute_offset(name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature());
  1726. compute_offset(type_offset, k, vmSymbols::type_name(), vmSymbols::class_signature());
  1727. compute_offset(slot_offset, k, vmSymbols::slot_name(), vmSymbols::int_signature());
  1728. compute_offset(modifiers_offset, k, vmSymbols::modifiers_name(), vmSymbols::int_signature());
  1729. // The generic signature and annotations fields are only present in 1.5
  1730. signature_offset = -1;
  1731. annotations_offset = -1;
  1732. compute_optional_offset(signature_offset, k, vmSymbols::signature_name(), vmSymbols::string_signature());
  1733. compute_optional_offset(annotations_offset, k, vmSymbols::annotations_name(), vmSymbols::byte_array_signature());
  1734. }
  1735. Handle java_lang_reflect_Field::create(TRAPS) {
  1736. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1737. Symbol* name = vmSymbols::java_lang_reflect_Field();
  1738. klassOop k = SystemDictionary::resolve_or_fail(name, true, CHECK_NH);
  1739. instanceKlassHandle klass (THREAD, k);
  1740. // Ensure it is initialized
  1741. klass->initialize(CHECK_NH);
  1742. return klass->allocate_instance_handle(CHECK_NH);
  1743. }
  1744. oop java_lang_reflect_Field::clazz(oop reflect) {
  1745. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1746. return reflect->obj_field(clazz_offset);
  1747. }
  1748. void java_lang_reflect_Field::set_clazz(oop reflect, oop value) {
  1749. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1750. reflect->obj_field_put(clazz_offset, value);
  1751. }
  1752. oop java_lang_reflect_Field::name(oop field) {
  1753. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1754. return field->obj_field(name_offset);
  1755. }
  1756. void java_lang_reflect_Field::set_name(oop field, oop value) {
  1757. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1758. field->obj_field_put(name_offset, value);
  1759. }
  1760. oop java_lang_reflect_Field::type(oop field) {
  1761. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1762. return field->obj_field(type_offset);
  1763. }
  1764. void java_lang_reflect_Field::set_type(oop field, oop value) {
  1765. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1766. field->obj_field_put(type_offset, value);
  1767. }
  1768. int java_lang_reflect_Field::slot(oop reflect) {
  1769. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1770. return reflect->int_field(slot_offset);
  1771. }
  1772. void java_lang_reflect_Field::set_slot(oop reflect, int value) {
  1773. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1774. reflect->int_field_put(slot_offset, value);
  1775. }
  1776. int java_lang_reflect_Field::modifiers(oop field) {
  1777. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1778. return field->int_field(modifiers_offset);
  1779. }
  1780. void java_lang_reflect_Field::set_modifiers(oop field, int value) {
  1781. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1782. field->int_field_put(modifiers_offset, value);
  1783. }
  1784. bool java_lang_reflect_Field::has_signature_field() {
  1785. return (signature_offset >= 0);
  1786. }
  1787. oop java_lang_reflect_Field::signature(oop field) {
  1788. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1789. assert(has_signature_field(), "signature field must be present");
  1790. return field->obj_field(signature_offset);
  1791. }
  1792. void java_lang_reflect_Field::set_signature(oop field, oop value) {
  1793. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1794. assert(has_signature_field(), "signature field must be present");
  1795. field->obj_field_put(signature_offset, value);
  1796. }
  1797. bool java_lang_reflect_Field::has_annotations_field() {
  1798. return (annotations_offset >= 0);
  1799. }
  1800. oop java_lang_reflect_Field::annotations(oop field) {
  1801. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1802. assert(has_annotations_field(), "annotations field must be present");
  1803. return field->obj_field(annotations_offset);
  1804. }
  1805. void java_lang_reflect_Field::set_annotations(oop field, oop value) {
  1806. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1807. assert(has_annotations_field(), "annotations field must be present");
  1808. field->obj_field_put(annotations_offset, value);
  1809. }
  1810. void sun_reflect_ConstantPool::compute_offsets() {
  1811. klassOop k = SystemDictionary::reflect_ConstantPool_klass();
  1812. // This null test can be removed post beta
  1813. if (k != NULL) {
  1814. compute_offset(_cp_oop_offset, k, vmSymbols::constantPoolOop_name(), vmSymbols::object_signature());
  1815. }
  1816. }
  1817. Handle sun_reflect_ConstantPool::create(TRAPS) {
  1818. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1819. klassOop k = SystemDictionary::reflect_ConstantPool_klass();
  1820. instanceKlassHandle klass (THREAD, k);
  1821. // Ensure it is initialized
  1822. klass->initialize(CHECK_NH);
  1823. return klass->allocate_instance_handle(CHECK_NH);
  1824. }
  1825. oop sun_reflect_ConstantPool::cp_oop(oop reflect) {
  1826. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1827. return reflect->obj_field(_cp_oop_offset);
  1828. }
  1829. void sun_reflect_ConstantPool::set_cp_oop(oop reflect, oop value) {
  1830. assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  1831. reflect->obj_field_put(_cp_oop_offset, value);
  1832. }
  1833. void sun_reflect_UnsafeStaticFieldAccessorImpl::compute_offsets() {
  1834. klassOop k = SystemDictionary::reflect_UnsafeStaticFieldAccessorImpl_klass();
  1835. // This null test can be removed post beta
  1836. if (k != NULL) {
  1837. compute_offset(_base_offset, k,
  1838. vmSymbols::base_name(), vmSymbols::object_signature());
  1839. }
  1840. }
  1841. oop java_lang_boxing_object::initialize_and_allocate(BasicType type, TRAPS) {
  1842. klassOop k = SystemDictionary::box_klass(type);
  1843. if (k == NULL) return NULL;
  1844. instanceKlassHandle h (THREAD, k);
  1845. if (!h->is_initialized()) h->initialize(CHECK_0);
  1846. return h->allocate_instance(THREAD);
  1847. }
  1848. oop java_lang_boxing_object::create(BasicType type, jvalue* value, TRAPS) {
  1849. oop box = initialize_and_allocate(type, CHECK_0);
  1850. if (box == NULL) return NULL;
  1851. switch (type) {
  1852. case T_BOOLEAN:
  1853. box->bool_field_put(value_offset, value->z);
  1854. break;
  1855. case T_CHAR:
  1856. box->char_field_put(value_offset, value->c);
  1857. break;
  1858. case T_FLOAT:
  1859. box->float_field_put(value_offset, value->f);
  1860. break;
  1861. case T_DOUBLE:
  1862. box->double_field_put(long_value_offset, value->d);
  1863. break;
  1864. case T_BYTE:
  1865. box->byte_field_put(value_offset, value->b);
  1866. break;
  1867. case T_SHORT:
  1868. box->short_field_put(value_offset, value->s);
  1869. break;
  1870. case T_INT:
  1871. box->int_field_put(value_offset, value->i);
  1872. break;
  1873. case T_LONG:
  1874. box->long_field_put(long_value_offset, value->j);
  1875. break;
  1876. default:
  1877. return NULL;
  1878. }
  1879. return box;
  1880. }
  1881. BasicType java_lang_boxing_object::basic_type(oop box) {
  1882. if (box == NULL) return T_ILLEGAL;
  1883. BasicType type = SystemDictionary::box_klass_type(box->klass());
  1884. if (type == T_OBJECT) // 'unknown' value returned by SD::bkt
  1885. return T_ILLEGAL;
  1886. return type;
  1887. }
  1888. BasicType java_lang_boxing_object::get_value(oop box, jvalue* value) {
  1889. BasicType type = SystemDictionary::box_klass_type(box->klass());
  1890. switch (type) {
  1891. case T_BOOLEAN:
  1892. value->z = box->bool_field(value_offset);
  1893. break;
  1894. case T_CHAR:
  1895. value->c = box->char_field(value_offset);
  1896. break;
  1897. case T_FLOAT:
  1898. value->f = box->float_field(value_offset);
  1899. break;
  1900. case T_DOUBLE:
  1901. value->d = box->double_field(long_value_offset);
  1902. break;
  1903. case T_BYTE:
  1904. value->b = box->byte_field(value_offset);
  1905. break;
  1906. case T_SHORT:
  1907. value->s = box->short_field(value_offset);
  1908. break;
  1909. case T_INT:
  1910. value->i = box->int_field(value_offset);
  1911. break;
  1912. case T_LONG:
  1913. value->j = box->long_field(long_value_offset);
  1914. break;
  1915. default:
  1916. return T_ILLEGAL;
  1917. } // end switch
  1918. return type;
  1919. }
  1920. BasicType java_lang_boxing_object::set_value(oop box, jvalue* value) {
  1921. BasicType type = SystemDictionary::box_klass_type(box->klass());
  1922. switch (type) {
  1923. case T_BOOLEAN:
  1924. box->bool_field_put(value_offset, value->z);
  1925. break;
  1926. case T_CHAR:
  1927. box->char_field_put(value_offset, value->c);
  1928. break;
  1929. case T_FLOAT:
  1930. box->float_field_put(value_offset, value->f);
  1931. break;
  1932. case T_DOUBLE:
  1933. box->double_field_put(long_value_offset, value->d);
  1934. break;
  1935. case T_BYTE:
  1936. box->byte_field_put(value_offset, value->b);
  1937. break;
  1938. case T_SHORT:
  1939. box->short_field_put(value_offset, value->s);
  1940. break;
  1941. case T_INT:
  1942. box->int_field_put(value_offset, value->i);
  1943. break;
  1944. case T_LONG:
  1945. box->long_field_put(long_value_offset, value->j);
  1946. break;
  1947. default:
  1948. return T_ILLEGAL;
  1949. } // end switch
  1950. return type;
  1951. }
  1952. void java_lang_boxing_object::print(BasicType type, jvalue* value, outputStream* st) {
  1953. switch (type) {
  1954. case T_BOOLEAN: st->print("%s", value->z ? "true" : "false"); break;
  1955. case T_CHAR: st->print("%d", value->c); break;
  1956. case T_BYTE: st->print("%d", value->b); break;
  1957. case T_SHORT: st->print("%d", value->s); break;
  1958. case T_INT: st->print("%d", value->i); break;
  1959. case T_LONG: st->print(INT64_FORMAT, value->j); break;
  1960. case T_FLOAT: st->print("%f", value->f); break;
  1961. case T_DOUBLE: st->print("%lf", value->d); break;
  1962. default: st->print("type %d?", type); break;
  1963. }
  1964. }
  1965. // Support for java_lang_ref_Reference
  1966. oop java_lang_ref_Reference::pending_list_lock() {
  1967. instanceKlass* ik = instanceKlass::cast(SystemDictionary::Reference_klass());
  1968. address addr = ik->static_field_addr(static_lock_offset);
  1969. if (UseCompressedOops) {
  1970. return oopDesc::load_decode_heap_oop((narrowOop *)addr);
  1971. } else {
  1972. return oopDesc::load_decode_heap_oop((oop*)addr);
  1973. }
  1974. }
  1975. HeapWord *java_lang_ref_Reference::pending_list_addr() {
  1976. instanceKlass* ik = instanceKlass::cast(SystemDictionary::Reference_klass());
  1977. address addr = ik->static_field_addr(static_pending_offset);
  1978. // XXX This might not be HeapWord aligned, almost rather be char *.
  1979. return (HeapWord*)addr;
  1980. }
  1981. oop java_lang_ref_Reference::pending_list() {
  1982. char *addr = (char *)pending_list_addr();
  1983. if (UseCompressedOops) {
  1984. return oopDesc::load_decode_heap_oop((narrowOop *)addr);
  1985. } else {
  1986. return oopDesc::load_decode_heap_oop((oop*)addr);
  1987. }
  1988. }
  1989. // Support for java_lang_ref_SoftReference
  1990. jlong java_lang_ref_SoftReference::timestamp(oop ref) {
  1991. return ref->long_field(timestamp_offset);
  1992. }
  1993. jlong java_lang_ref_SoftReference::clock() {
  1994. instanceKlass* ik = instanceKlass::cast(SystemDictionary::SoftReference_klass());
  1995. jlong* offset = (jlong*)ik->static_field_addr(static_clock_offset);
  1996. return *offset;
  1997. }
  1998. void java_lang_ref_SoftReference::set_clock(jlong value) {
  1999. instanceKlass* ik = instanceKlass::cast(SystemDictionary::SoftReference_klass());
  2000. jlong* offset = (jlong*)ik->static_field_addr(static_clock_offset);
  2001. *offset = value;
  2002. }
  2003. // Support for java_lang_invoke_MethodHandle
  2004. int java_lang_invoke_MethodHandle::_type_offset;
  2005. int java_lang_invoke_MethodHandle::_vmtarget_offset;
  2006. int java_lang_invoke_MethodHandle::_vmentry_offset;
  2007. int java_lang_invoke_MemberName::_clazz_offset;
  2008. int java_lang_invoke_MemberName::_name_offset;
  2009. int java_lang_invoke_MemberName::_type_offset;
  2010. int java_lang_invoke_MemberName::_flags_offset;
  2011. int java_lang_invoke_MemberName::_vmtarget_offset;
  2012. int java_lang_invoke_MemberName::_vmindex_offset;
  2013. int java_lang_invoke_DirectMethodHandle::_vmindex_offset;
  2014. int java_lang_invoke_BoundMethodHandle::_argument_offset;
  2015. int java_lang_invoke_BoundMethodHandle::_vmargslot_offset;
  2016. int java_lang_invoke_AdapterMethodHandle::_conversion_offset;
  2017. int java_lang_invoke_CountingMethodHandle::_vmcount_offset;
  2018. void java_lang_invoke_MethodHandle::compute_offsets() {
  2019. klassOop klass_oop = SystemDictionary::MethodHandle_klass();
  2020. if (klass_oop != NULL && EnableInvokeDynamic) {
  2021. bool allow_super = false;
  2022. compute_offset(_type_offset, klass_oop, vmSymbols::type_name(), vmSymbols::java_lang_invoke_MethodType_signature(), allow_super);
  2023. METHODHANDLE_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
  2024. }
  2025. }
  2026. void java_lang_invoke_MemberName::compute_offsets() {
  2027. klassOop klass_oop = SystemDictionary::MemberName_klass();
  2028. if (klass_oop != NULL && EnableInvokeDynamic) {
  2029. compute_offset(_clazz_offset, klass_oop, vmSymbols::clazz_name(), vmSymbols::class_signature());
  2030. compute_offset(_name_offset, klass_oop, vmSymbols::name_name(), vmSymbols::string_signature());
  2031. compute_offset(_type_offset, klass_oop, vmSymbols::type_name(), vmSymbols::object_signature());
  2032. compute_offset(_flags_offset, klass_oop, vmSymbols::flags_name(), vmSymbols::int_signature());
  2033. compute_offset(_vmindex_offset, klass_oop, vmSymbols::vmindex_name(), vmSymbols::int_signature());
  2034. MEMBERNAME_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
  2035. }
  2036. }
  2037. void java_lang_invoke_DirectMethodHandle::compute_offsets() {
  2038. klassOop k = SystemDictionary::DirectMethodHandle_klass();
  2039. if (k != NULL && EnableInvokeDynamic) {
  2040. DIRECTMETHODHANDLE_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
  2041. }
  2042. }
  2043. void java_lang_invoke_BoundMethodHandle::compute_offsets() {
  2044. klassOop k = SystemDictionary::BoundMethodHandle_klass();
  2045. if (k != NULL && EnableInvokeDynamic) {
  2046. compute_offset(_vmargslot_offset, k, vmSymbols::vmargslot_name(), vmSymbols::int_signature(), true);
  2047. compute_offset(_argument_offset, k, vmSymbols::argument_name(), vmSymbols::object_signature(), true);
  2048. }
  2049. }
  2050. void java_lang_invoke_AdapterMethodHandle::compute_offsets() {
  2051. klassOop k = SystemDictionary::AdapterMethodHandle_klass();
  2052. if (k != NULL && EnableInvokeDynamic) {
  2053. compute_offset(_conversion_offset, k, vmSymbols::conversion_name(), vmSymbols::int_signature(), true);
  2054. }
  2055. }
  2056. void java_lang_invoke_CountingMethodHandle::compute_offsets() {
  2057. klassOop k = SystemDictionary::CountingMethodHandle_klass();
  2058. if (k != NULL && EnableInvokeDynamic) {
  2059. compute_offset(_vmcount_offset, k, vmSymbols::vmcount_name(), vmSymbols::int_signature(), true);
  2060. }
  2061. }
  2062. int java_lang_invoke_CountingMethodHandle::vmcount(oop mh) {
  2063. assert(is_instance(mh), "CMH only");
  2064. return mh->int_field(_vmcount_offset);
  2065. }
  2066. void java_lang_invoke_CountingMethodHandle::set_vmcount(oop mh, int count) {
  2067. assert(is_instance(mh), "CMH only");
  2068. mh->int_field_put(_vmcount_offset, count);
  2069. }
  2070. oop java_lang_invoke_MethodHandle::type(oop mh) {
  2071. return mh->obj_field(_type_offset);
  2072. }
  2073. void java_lang_invoke_MethodHandle::set_type(oop mh, oop mtype) {
  2074. mh->obj_field_put(_type_offset, mtype);
  2075. }
  2076. // fetch type.form.vmslots, which is the number of JVM stack slots
  2077. // required to carry the arguments of this MH
  2078. int java_lang_invoke_MethodHandle::vmslots(oop mh) {
  2079. oop mtype = type(mh);
  2080. if (mtype == NULL) return 0; // Java code would get NPE
  2081. oop form = java_lang_invoke_MethodType::form(mtype);
  2082. if (form == NULL) return 0; // Java code would get NPE
  2083. return java_lang_invoke_MethodTypeForm::vmslots(form);
  2084. }
  2085. // fetch the low-level entry point for this mh
  2086. MethodHandleEntry* java_lang_invoke_MethodHandle::vmentry(oop mh) {
  2087. return (MethodHandleEntry*) mh->address_field(_vmentry_offset);
  2088. }
  2089. void java_lang_invoke_MethodHandle::set_vmentry(oop mh, MethodHandleEntry* me) {
  2090. assert(_vmentry_offset != 0, "must be present");
  2091. // This is always the final step that initializes a valid method handle:
  2092. mh->release_address_field_put(_vmentry_offset, (address) me);
  2093. // There should be enough memory barriers on exit from native methods
  2094. // to ensure that the MH is fully initialized to all threads before
  2095. // Java code can publish it in global data structures.
  2096. // But just in case, we use release_address_field_put.
  2097. }
  2098. /// MemberName accessors
  2099. oop java_lang_invoke_MemberName::clazz(oop mname) {
  2100. assert(is_instance(mname), "wrong type");
  2101. return mname->obj_field(_clazz_offset);
  2102. }
  2103. void java_lang_invoke_MemberName::set_clazz(oop mname, oop clazz) {
  2104. assert(is_instance(mname), "wrong type");
  2105. mname->obj_field_put(_clazz_offset, clazz);
  2106. }
  2107. oop java_lang_invoke_MemberName::name(oop mname) {
  2108. assert(is_instance(mname), "wrong type");
  2109. return mname->obj_field(_name_offset);
  2110. }
  2111. void java_lang_invoke_MemberName::set_name(oop mname, oop name) {
  2112. assert(is_instance(mname), "wrong type");
  2113. mname->obj_field_put(_name_offset, name);
  2114. }
  2115. oop java_lang_invoke_MemberName::type(oop mname) {
  2116. assert(is_instance(mname), "wrong type");
  2117. return mname->obj_field(_type_offset);
  2118. }
  2119. void java_lang_invoke_MemberName::set_type(oop mname, oop type) {
  2120. assert(is_instance(mname), "wrong type");
  2121. mname->obj_field_put(_type_offset, type);
  2122. }
  2123. int java_lang_invoke_MemberName::flags(oop mname) {
  2124. assert(is_instance(mname), "wrong type");
  2125. return mname->int_field(_flags_offset);
  2126. }
  2127. void java_lang_invoke_MemberName::set_flags(oop mname, int flags) {
  2128. assert(is_instance(mname), "wrong type");
  2129. mname->int_field_put(_flags_offset, flags);
  2130. }
  2131. oop java_lang_invoke_MemberName::vmtarget(oop mname) {
  2132. assert(is_instance(mname), "wrong type");
  2133. return mname->obj_field(_vmtarget_offset);
  2134. }
  2135. void java_lang_invoke_MemberName::set_vmtarget(oop mname, oop ref) {
  2136. assert(is_instance(mname), "wrong type");
  2137. mname->obj_field_put(_vmtarget_offset, ref);
  2138. }
  2139. int java_lang_invoke_MemberName::vmindex(oop mname) {
  2140. assert(is_instance(mname), "wrong type");
  2141. return mname->int_field(_vmindex_offset);
  2142. }
  2143. void java_lang_invoke_MemberName::set_vmindex(oop mname, int index) {
  2144. assert(is_instance(mname), "wrong type");
  2145. mname->int_field_put(_vmindex_offset, index);
  2146. }
  2147. oop java_lang_invoke_MethodHandle::vmtarget(oop mh) {
  2148. assert(is_instance(mh), "MH only");
  2149. return mh->obj_field(_vmtarget_offset);
  2150. }
  2151. void java_lang_invoke_MethodHandle::set_vmtarget(oop mh, oop ref) {
  2152. assert(is_instance(mh), "MH only");
  2153. mh->obj_field_put(_vmtarget_offset, ref);
  2154. }
  2155. int java_lang_invoke_DirectMethodHandle::vmindex(oop mh) {
  2156. assert(is_instance(mh), "DMH only");
  2157. return mh->int_field(_vmindex_offset);
  2158. }
  2159. void java_lang_invoke_DirectMethodHandle::set_vmindex(oop mh, int index) {
  2160. assert(is_instance(mh), "DMH only");
  2161. mh->int_field_put(_vmindex_offset, index);
  2162. }
  2163. int java_lang_invoke_BoundMethodHandle::vmargslot(oop mh) {
  2164. assert(is_instance(mh), "BMH only");
  2165. return mh->int_field(_vmargslot_offset);
  2166. }
  2167. oop java_lang_invoke_BoundMethodHandle::argument(oop mh) {
  2168. assert(is_instance(mh), "BMH only");
  2169. return mh->obj_field(_argument_offset);
  2170. }
  2171. int java_lang_invoke_AdapterMethodHandle::conversion(oop mh) {
  2172. assert(is_instance(mh), "AMH only");
  2173. return mh->int_field(_conversion_offset);
  2174. }
  2175. void java_lang_invoke_AdapterMethodHandle::set_conversion(oop mh, int conv) {
  2176. assert(is_instance(mh), "AMH only");
  2177. mh->int_field_put(_conversion_offset, conv);
  2178. }
  2179. // Support for java_lang_invoke_MethodType
  2180. int java_lang_invoke_MethodType::_rtype_offset;
  2181. int java_lang_invoke_MethodType::_ptypes_offset;
  2182. int java_lang_invoke_MethodType::_form_offset;
  2183. void java_lang_invoke_MethodType::compute_offsets() {
  2184. klassOop k = SystemDictionary::MethodType_klass();
  2185. if (k != NULL) {
  2186. compute_offset(_rtype_offset, k, vmSymbols::rtype_name(), vmSymbols::class_signature());
  2187. compute_offset(_ptypes_offset, k, vmSymbols::ptypes_name(), vmSymbols::class_array_signature());
  2188. compute_offset(_form_offset, k, vmSymbols::form_name(), vmSymbols::java_lang_invoke_MethodTypeForm_signature());
  2189. }
  2190. }
  2191. void java_lang_invoke_MethodType::print_signature(oop mt, outputStream* st) {
  2192. st->print("(");
  2193. objArrayOop pts = ptypes(mt);
  2194. for (int i = 0, limit = pts->length(); i < limit; i++) {
  2195. java_lang_Class::print_signature(pts->obj_at(i), st);
  2196. }
  2197. st->print(")");
  2198. java_lang_Class::print_signature(rtype(mt), st);
  2199. }
  2200. Symbol* java_lang_invoke_MethodType::as_signature(oop mt, bool intern_if_not_found, TRAPS) {
  2201. ResourceMark rm;
  2202. stringStream buffer(128);
  2203. print_signature(mt, &buffer);
  2204. const char* sigstr = buffer.base();
  2205. int siglen = (int) buffer.size();
  2206. Symbol *name;
  2207. if (!intern_if_not_found) {
  2208. name = SymbolTable::probe(sigstr, siglen);
  2209. } else {
  2210. name = SymbolTable::new_symbol(sigstr, siglen, THREAD);
  2211. }
  2212. return name;
  2213. }
  2214. bool java_lang_invoke_MethodType::equals(oop mt1, oop mt2) {
  2215. if (rtype(mt1) != rtype(mt2))
  2216. return false;
  2217. if (ptype_count(mt1) != ptype_count(mt2))
  2218. return false;
  2219. for (int i = ptype_count(mt1) - 1; i >= 0; i--) {
  2220. if (ptype(mt1, i) != ptype(mt2, i))
  2221. return false;
  2222. }
  2223. return true;
  2224. }
  2225. oop java_lang_invoke_MethodType::rtype(oop mt) {
  2226. assert(is_instance(mt), "must be a MethodType");
  2227. return mt->obj_field(_rtype_offset);
  2228. }
  2229. objArrayOop java_lang_invoke_MethodType::ptypes(oop mt) {
  2230. assert(is_instance(mt), "must be a MethodType");
  2231. return (objArrayOop) mt->obj_field(_ptypes_offset);
  2232. }
  2233. oop java_lang_invoke_MethodType::form(oop mt) {
  2234. assert(is_instance(mt), "must be a MethodType");
  2235. return mt->obj_field(_form_offset);
  2236. }
  2237. oop java_lang_invoke_MethodType::ptype(oop mt, int idx) {
  2238. return ptypes(mt)->obj_at(idx);
  2239. }
  2240. int java_lang_invoke_MethodType::ptype_count(oop mt) {
  2241. return ptypes(mt)->length();
  2242. }
  2243. // Support for java_lang_invoke_MethodTypeForm
  2244. int java_lang_invoke_MethodTypeForm::_vmslots_offset;
  2245. int java_lang_invoke_MethodTypeForm::_vmlayout_offset;
  2246. int java_lang_invoke_MethodTypeForm::_erasedType_offset;
  2247. int java_lang_invoke_MethodTypeForm::_genericInvoker_offset;
  2248. void java_lang_invoke_MethodTypeForm::compute_offsets() {
  2249. klassOop k = SystemDictionary::MethodTypeForm_klass();
  2250. if (k != NULL) {
  2251. compute_optional_offset(_vmslots_offset, k, vmSymbols::vmslots_name(), vmSymbols::int_signature(), true);
  2252. compute_optional_offset(_vmlayout_offset, k, vmSymbols::vmlayout_name(), vmSymbols::object_signature());
  2253. compute_optional_offset(_erasedType_offset, k, vmSymbols::erasedType_name(), vmSymbols::java_lang_invoke_MethodType_signature(), true);
  2254. compute_optional_offset(_genericInvoker_offset, k, vmSymbols::genericInvoker_name(), vmSymbols::java_lang_invoke_MethodHandle_signature(), true);
  2255. if (_genericInvoker_offset == 0) _genericInvoker_offset = -1; // set to explicit "empty" value
  2256. METHODTYPEFORM_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
  2257. }
  2258. }
  2259. int java_lang_invoke_MethodTypeForm::vmslots(oop mtform) {
  2260. assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only");
  2261. assert(_vmslots_offset > 0, "");
  2262. return mtform->int_field(_vmslots_offset);
  2263. }
  2264. oop java_lang_invoke_MethodTypeForm::vmlayout(oop mtform) {
  2265. assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only");
  2266. assert(_vmlayout_offset > 0, "");
  2267. return mtform->obj_field(_vmlayout_offset);
  2268. }
  2269. oop java_lang_invoke_MethodTypeForm::init_vmlayout(oop mtform, oop cookie) {
  2270. assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only");
  2271. oop previous = vmlayout(mtform);
  2272. if (previous != NULL) {
  2273. return previous; // someone else beat us to it
  2274. }
  2275. HeapWord* cookie_addr = (HeapWord*) mtform->obj_field_addr<oop>(_vmlayout_offset);
  2276. OrderAccess::storestore(); // make sure our copy is fully committed
  2277. previous = oopDesc::atomic_compare_exchange_oop(cookie, cookie_addr, previous);
  2278. if (previous != NULL) {
  2279. return previous; // someone else beat us to it
  2280. }
  2281. return cookie;
  2282. }
  2283. oop java_lang_invoke_MethodTypeForm::erasedType(oop mtform) {
  2284. assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only");
  2285. return mtform->obj_field(_erasedType_offset);
  2286. }
  2287. oop java_lang_invoke_MethodTypeForm::genericInvoker(oop mtform) {
  2288. assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only");
  2289. return mtform->obj_field(_genericInvoker_offset);
  2290. }
  2291. // Support for java_lang_invoke_CallSite
  2292. int java_lang_invoke_CallSite::_target_offset;
  2293. void java_lang_invoke_CallSite::compute_offsets() {
  2294. if (!EnableInvokeDynamic) return;
  2295. klassOop k = SystemDictionary::CallSite_klass();
  2296. if (k != NULL) {
  2297. compute_offset(_target_offset, k, vmSymbols::target_name(), vmSymbols::java_lang_invoke_MethodHandle_signature());
  2298. }
  2299. // Disallow compilation of CallSite.setTargetNormal and CallSite.setTargetVolatile
  2300. // (For C2: keep this until we have throttling logic for uncommon traps.)
  2301. if (k != NULL) {
  2302. instanceKlass* ik = instanceKlass::cast(k);
  2303. methodOop m_normal = ik->lookup_method(vmSymbols::setTargetNormal_name(), vmSymbols::setTarget_signature());
  2304. methodOop m_volatile = ik->lookup_method(vmSymbols::setTargetVolatile_name(), vmSymbols::setTarget_signature());
  2305. guarantee(m_normal != NULL && m_volatile != NULL, "must exist");
  2306. m_normal->set_not_compilable_quietly();
  2307. m_volatile->set_not_compilable_quietly();
  2308. }
  2309. }
  2310. // Support for java_security_AccessControlContext
  2311. int java_security_AccessControlContext::_context_offset = 0;
  2312. int java_security_AccessControlContext::_privilegedContext_offset = 0;
  2313. int java_security_AccessControlContext::_isPrivileged_offset = 0;
  2314. void java_security_AccessControlContext::compute_offsets() {
  2315. assert(_isPrivileged_offset == 0, "offsets should be initialized only once");
  2316. fieldDescriptor fd;
  2317. instanceKlass* ik = instanceKlass::cast(SystemDictionary::AccessControlContext_klass());
  2318. if (!ik->find_local_field(vmSymbols::context_name(), vmSymbols::protectiondomain_signature(), &fd)) {
  2319. fatal("Invalid layout of java.security.AccessControlContext");
  2320. }
  2321. _context_offset = fd.offset();
  2322. if (!ik->find_local_field(vmSymbols::privilegedContext_name(), vmSymbols::accesscontrolcontext_signature(), &fd)) {
  2323. fatal("Invalid layout of java.security.AccessControlContext");
  2324. }
  2325. _privilegedContext_offset = fd.offset();
  2326. if (!ik->find_local_field(vmSymbols::isPrivileged_name(), vmSymbols::bool_signature(), &fd)) {
  2327. fatal("Invalid layout of java.security.AccessControlContext");
  2328. }
  2329. _isPrivileged_offset = fd.offset();
  2330. }
  2331. oop java_security_AccessControlContext::create(objArrayHandle context, bool isPrivileged, Handle privileged_context, TRAPS) {
  2332. assert(_isPrivileged_offset != 0, "offsets should have been initialized");
  2333. // Ensure klass is initialized
  2334. instanceKlass::cast(SystemDictionary::AccessControlContext_klass())->initialize(CHECK_0);
  2335. // Allocate result
  2336. oop result = instanceKlass::cast(SystemDictionary::AccessControlContext_klass())->allocate_instance(CHECK_0);
  2337. // Fill in values
  2338. result->obj_field_put(_context_offset, context());
  2339. result->obj_field_put(_privilegedContext_offset, privileged_context());
  2340. result->bool_field_put(_isPrivileged_offset, isPrivileged);
  2341. return result;
  2342. }
  2343. // Support for java_lang_ClassLoader
  2344. bool java_lang_ClassLoader::offsets_computed = false;
  2345. int java_lang_ClassLoader::parallelCapable_offset = -1;
  2346. void java_lang_ClassLoader::compute_offsets() {
  2347. assert(!offsets_computed, "offsets should be initialized only once");
  2348. offsets_computed = true;
  2349. // The field indicating parallelCapable (parallelLockMap) is only present starting in 7,
  2350. klassOop k1 = SystemDictionary::ClassLoader_klass();
  2351. compute_optional_offset(parallelCapable_offset,
  2352. k1, vmSymbols::parallelCapable_name(), vmSymbols::concurrenthashmap_signature());
  2353. }
  2354. oop java_lang_ClassLoader::parent(oop loader) {
  2355. assert(loader->is_oop(), "loader must be oop");
  2356. return loader->obj_field(parent_offset);
  2357. }
  2358. // For class loader classes, parallelCapable defined
  2359. // based on non-null field
  2360. // Written to by java.lang.ClassLoader, vm only reads this field, doesn't set it
  2361. bool java_lang_ClassLoader::parallelCapable(oop class_loader) {
  2362. if (!JDK_Version::is_gte_jdk17x_version()
  2363. || parallelCapable_offset == -1) {
  2364. // Default for backward compatibility is false
  2365. return false;
  2366. }
  2367. return (class_loader->obj_field(parallelCapable_offset) != NULL);
  2368. }
  2369. bool java_lang_ClassLoader::is_trusted_loader(oop loader) {
  2370. // Fix for 4474172; see evaluation for more details
  2371. loader = non_reflection_class_loader(loader);
  2372. oop cl = SystemDictionary::java_system_loader();
  2373. while(cl != NULL) {
  2374. if (cl == loader) return true;
  2375. cl = parent(cl);
  2376. }
  2377. return false;
  2378. }
  2379. oop java_lang_ClassLoader::non_reflection_class_loader(oop loader) {
  2380. if (loader != NULL) {
  2381. // See whether this is one of the class loaders associated with
  2382. // the generated bytecodes for reflection, and if so, "magically"
  2383. // delegate to its parent to prevent class loading from occurring
  2384. // in places where applications using reflection didn't expect it.
  2385. klassOop delegating_cl_class = SystemDictionary::reflect_DelegatingClassLoader_klass();
  2386. // This might be null in non-1.4 JDKs
  2387. if (delegating_cl_class != NULL && loader->is_a(delegating_cl_class)) {
  2388. return parent(loader);
  2389. }
  2390. }
  2391. return loader;
  2392. }
  2393. // Support for java_lang_System
  2394. int java_lang_System::in_offset_in_bytes() {
  2395. return (instanceMirrorKlass::offset_of_static_fields() + static_in_offset);
  2396. }
  2397. int java_lang_System::out_offset_in_bytes() {
  2398. return (instanceMirrorKlass::offset_of_static_fields() + static_out_offset);
  2399. }
  2400. int java_lang_System::err_offset_in_bytes() {
  2401. return (instanceMirrorKlass::offset_of_static_fields() + static_err_offset);
  2402. }
  2403. int java_lang_Class::_klass_offset;
  2404. int java_lang_Class::_array_klass_offset;
  2405. int java_lang_Class::_resolved_constructor_offset;
  2406. int java_lang_Class::_oop_size_offset;
  2407. int java_lang_Class::_static_oop_field_count_offset;
  2408. int java_lang_Throwable::backtrace_offset;
  2409. int java_lang_Throwable::detailMessage_offset;
  2410. int java_lang_Throwable::cause_offset;
  2411. int java_lang_Throwable::stackTrace_offset;
  2412. int java_lang_Throwable::static_unassigned_stacktrace_offset;
  2413. int java_lang_reflect_AccessibleObject::override_offset;
  2414. int java_lang_reflect_Method::clazz_offset;
  2415. int java_lang_reflect_Method::name_offset;
  2416. int java_lang_reflect_Method::returnType_offset;
  2417. int java_lang_reflect_Method::parameterTypes_offset;
  2418. int java_lang_reflect_Method::exceptionTypes_offset;
  2419. int java_lang_reflect_Method::slot_offset;
  2420. int java_lang_reflect_Method::modifiers_offset;
  2421. int java_lang_reflect_Method::signature_offset;
  2422. int java_lang_reflect_Method::annotations_offset;
  2423. int java_lang_reflect_Method::parameter_annotations_offset;
  2424. int java_lang_reflect_Method::annotation_default_offset;
  2425. int java_lang_reflect_Constructor::clazz_offset;
  2426. int java_lang_reflect_Constructor::parameterTypes_offset;
  2427. int java_lang_reflect_Constructor::exceptionTypes_offset;
  2428. int java_lang_reflect_Constructor::slot_offset;
  2429. int java_lang_reflect_Constructor::modifiers_offset;
  2430. int java_lang_reflect_Constructor::signature_offset;
  2431. int java_lang_reflect_Constructor::annotations_offset;
  2432. int java_lang_reflect_Constructor::parameter_annotations_offset;
  2433. int java_lang_reflect_Field::clazz_offset;
  2434. int java_lang_reflect_Field::name_offset;
  2435. int java_lang_reflect_Field::type_offset;
  2436. int java_lang_reflect_Field::slot_offset;
  2437. int java_lang_reflect_Field::modifiers_offset;
  2438. int java_lang_reflect_Field::signature_offset;
  2439. int java_lang_reflect_Field::annotations_offset;
  2440. int java_lang_boxing_object::value_offset;
  2441. int java_lang_boxing_object::long_value_offset;
  2442. int java_lang_ref_Reference::referent_offset;
  2443. int java_lang_ref_Reference::queue_offset;
  2444. int java_lang_ref_Reference::next_offset;
  2445. int java_lang_ref_Reference::discovered_offset;
  2446. int java_lang_ref_Reference::static_lock_offset;
  2447. int java_lang_ref_Reference::static_pending_offset;
  2448. int java_lang_ref_Reference::number_of_fake_oop_fields;
  2449. int java_lang_ref_SoftReference::timestamp_offset;
  2450. int java_lang_ref_SoftReference::static_clock_offset;
  2451. int java_lang_ClassLoader::parent_offset;
  2452. int java_lang_System::static_in_offset;
  2453. int java_lang_System::static_out_offset;
  2454. int java_lang_System::static_err_offset;
  2455. int java_lang_StackTraceElement::declaringClass_offset;
  2456. int java_lang_StackTraceElement::methodName_offset;
  2457. int java_lang_StackTraceElement::fileName_offset;
  2458. int java_lang_StackTraceElement::lineNumber_offset;
  2459. int java_lang_AssertionStatusDirectives::classes_offset;
  2460. int java_lang_AssertionStatusDirectives::classEnabled_offset;
  2461. int java_lang_AssertionStatusDirectives::packages_offset;
  2462. int java_lang_AssertionStatusDirectives::packageEnabled_offset;
  2463. int java_lang_AssertionStatusDirectives::deflt_offset;
  2464. int java_nio_Buffer::_limit_offset;
  2465. int sun_misc_AtomicLongCSImpl::_value_offset;
  2466. int java_util_concurrent_locks_AbstractOwnableSynchronizer::_owner_offset = 0;
  2467. int sun_reflect_ConstantPool::_cp_oop_offset;
  2468. int sun_reflect_UnsafeStaticFieldAccessorImpl::_base_offset;
  2469. // Support for java_lang_StackTraceElement
  2470. void java_lang_StackTraceElement::set_fileName(oop element, oop value) {
  2471. element->obj_field_put(fileName_offset, value);
  2472. }
  2473. void java_lang_StackTraceElement::set_declaringClass(oop element, oop value) {
  2474. element->obj_field_put(declaringClass_offset, value);
  2475. }
  2476. void java_lang_StackTraceElement::set_methodName(oop element, oop value) {
  2477. element->obj_field_put(methodName_offset, value);
  2478. }
  2479. void java_lang_StackTraceElement::set_lineNumber(oop element, int value) {
  2480. element->int_field_put(lineNumber_offset, value);
  2481. }
  2482. // Support for java Assertions - java_lang_AssertionStatusDirectives.
  2483. void java_lang_AssertionStatusDirectives::set_classes(oop o, oop val) {
  2484. o->obj_field_put(classes_offset, val);
  2485. }
  2486. void java_lang_AssertionStatusDirectives::set_classEnabled(oop o, oop val) {
  2487. o->obj_field_put(classEnabled_offset, val);
  2488. }
  2489. void java_lang_AssertionStatusDirectives::set_packages(oop o, oop val) {
  2490. o->obj_field_put(packages_offset, val);
  2491. }
  2492. void java_lang_AssertionStatusDirectives::set_packageEnabled(oop o, oop val) {
  2493. o->obj_field_put(packageEnabled_offset, val);
  2494. }
  2495. void java_lang_AssertionStatusDirectives::set_deflt(oop o, bool val) {
  2496. o->bool_field_put(deflt_offset, val);
  2497. }
  2498. // Support for intrinsification of java.nio.Buffer.checkIndex
  2499. int java_nio_Buffer::limit_offset() {
  2500. return _limit_offset;
  2501. }
  2502. void java_nio_Buffer::compute_offsets() {
  2503. klassOop k = SystemDictionary::nio_Buffer_klass();
  2504. assert(k != NULL, "must be loaded in 1.4+");
  2505. compute_offset(_limit_offset, k, vmSymbols::limit_name(), vmSymbols::int_signature());
  2506. }
  2507. // Support for intrinsification of sun.misc.AtomicLongCSImpl.attemptUpdate
  2508. int sun_misc_AtomicLongCSImpl::value_offset() {
  2509. assert(SystemDictionary::AtomicLongCSImpl_klass() != NULL, "can't call this");
  2510. return _value_offset;
  2511. }
  2512. void sun_misc_AtomicLongCSImpl::compute_offsets() {
  2513. klassOop k = SystemDictionary::AtomicLongCSImpl_klass();
  2514. // If this class is not present, its value field offset won't be referenced.
  2515. if (k != NULL) {
  2516. compute_offset(_value_offset, k, vmSymbols::value_name(), vmSymbols::long_signature());
  2517. }
  2518. }
  2519. void java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(TRAPS) {
  2520. if (_owner_offset != 0) return;
  2521. assert(JDK_Version::is_gte_jdk16x_version(), "Must be JDK 1.6 or later");
  2522. SystemDictionary::load_abstract_ownable_synchronizer_klass(CHECK);
  2523. klassOop k = SystemDictionary::abstract_ownable_synchronizer_klass();
  2524. compute_offset(_owner_offset, k,
  2525. vmSymbols::exclusive_owner_thread_name(), vmSymbols::thread_signature());
  2526. }
  2527. oop java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(oop obj) {
  2528. assert(_owner_offset != 0, "Must be initialized");
  2529. return obj->obj_field(_owner_offset);
  2530. }
  2531. // Compute hard-coded offsets
  2532. // Invoked before SystemDictionary::initialize, so pre-loaded classes
  2533. // are not available to determine the offset_of_static_fields.
  2534. void JavaClasses::compute_hard_coded_offsets() {
  2535. const int x = heapOopSize;
  2536. const int header = instanceOopDesc::base_offset_in_bytes();
  2537. // Throwable Class
  2538. java_lang_Throwable::backtrace_offset = java_lang_Throwable::hc_backtrace_offset * x + header;
  2539. java_lang_Throwable::detailMessage_offset = java_lang_Throwable::hc_detailMessage_offset * x + header;
  2540. java_lang_Throwable::cause_offset = java_lang_Throwable::hc_cause_offset * x + header;
  2541. java_lang_Throwable::stackTrace_offset = java_lang_Throwable::hc_stackTrace_offset * x + header;
  2542. java_lang_Throwable::static_unassigned_stacktrace_offset = java_lang_Throwable::hc_static_unassigned_stacktrace_offset * x;
  2543. // java_lang_boxing_object
  2544. java_lang_boxing_object::value_offset = java_lang_boxing_object::hc_value_offset + header;
  2545. java_lang_boxing_object::long_value_offset = align_size_up((java_lang_boxing_object::hc_value_offset + header), BytesPerLong);
  2546. // java_lang_ref_Reference:
  2547. java_lang_ref_Reference::referent_offset = java_lang_ref_Reference::hc_referent_offset * x + header;
  2548. java_lang_ref_Reference::queue_offset = java_lang_ref_Reference::hc_queue_offset * x + header;
  2549. java_lang_ref_Reference::next_offset = java_lang_ref_Reference::hc_next_offset * x + header;
  2550. java_lang_ref_Reference::discovered_offset = java_lang_ref_Reference::hc_discovered_offset * x + header;
  2551. java_lang_ref_Reference::static_lock_offset = java_lang_ref_Reference::hc_static_lock_offset * x;
  2552. java_lang_ref_Reference::static_pending_offset = java_lang_ref_Reference::hc_static_pending_offset * x;
  2553. // Artificial fields for java_lang_ref_Reference
  2554. // The first field is for the discovered field added in 1.4
  2555. java_lang_ref_Reference::number_of_fake_oop_fields = 1;
  2556. // java_lang_ref_SoftReference Class
  2557. java_lang_ref_SoftReference::timestamp_offset = align_size_up((java_lang_ref_SoftReference::hc_timestamp_offset * x + header), BytesPerLong);
  2558. // Don't multiply static fields because they are always in wordSize units
  2559. java_lang_ref_SoftReference::static_clock_offset = java_lang_ref_SoftReference::hc_static_clock_offset * x;
  2560. // java_lang_ClassLoader
  2561. java_lang_ClassLoader::parent_offset = java_lang_ClassLoader::hc_parent_offset * x + header;
  2562. // java_lang_System
  2563. java_lang_System::static_in_offset = java_lang_System::hc_static_in_offset * x;
  2564. java_lang_System::static_out_offset = java_lang_System::hc_static_out_offset * x;
  2565. java_lang_System::static_err_offset = java_lang_System::hc_static_err_offset * x;
  2566. // java_lang_StackTraceElement
  2567. java_lang_StackTraceElement::declaringClass_offset = java_lang_StackTraceElement::hc_declaringClass_offset * x + header;
  2568. java_lang_StackTraceElement::methodName_offset = java_lang_StackTraceElement::hc_methodName_offset * x + header;
  2569. java_lang_StackTraceElement::fileName_offset = java_lang_StackTraceElement::hc_fileName_offset * x + header;
  2570. java_lang_StackTraceElement::lineNumber_offset = java_lang_StackTraceElement::hc_lineNumber_offset * x + header;
  2571. java_lang_AssertionStatusDirectives::classes_offset = java_lang_AssertionStatusDirectives::hc_classes_offset * x + header;
  2572. java_lang_AssertionStatusDirectives::classEnabled_offset = java_lang_AssertionStatusDirectives::hc_classEnabled_offset * x + header;
  2573. java_lang_AssertionStatusDirectives::packages_offset = java_lang_AssertionStatusDirectives::hc_packages_offset * x + header;
  2574. java_lang_AssertionStatusDirectives::packageEnabled_offset = java_lang_AssertionStatusDirectives::hc_packageEnabled_offset * x + header;
  2575. java_lang_AssertionStatusDirectives::deflt_offset = java_lang_AssertionStatusDirectives::hc_deflt_offset * x + header;
  2576. }
  2577. // Compute non-hard-coded field offsets of all the classes in this file
  2578. void JavaClasses::compute_offsets() {
  2579. // java_lang_Class::compute_offsets was called earlier in bootstrap
  2580. java_lang_ClassLoader::compute_offsets();
  2581. java_lang_Thread::compute_offsets();
  2582. java_lang_ThreadGroup::compute_offsets();
  2583. if (EnableInvokeDynamic) {
  2584. java_lang_invoke_MethodHandle::compute_offsets();
  2585. java_lang_invoke_MemberName::compute_offsets();
  2586. java_lang_invoke_DirectMethodHandle::compute_offsets();
  2587. java_lang_invoke_BoundMethodHandle::compute_offsets();
  2588. java_lang_invoke_AdapterMethodHandle::compute_offsets();
  2589. java_lang_invoke_MethodType::compute_offsets();
  2590. java_lang_invoke_MethodTypeForm::compute_offsets();
  2591. java_lang_invoke_CallSite::compute_offsets();
  2592. java_lang_invoke_CountingMethodHandle::compute_offsets();
  2593. }
  2594. java_security_AccessControlContext::compute_offsets();
  2595. // Initialize reflection classes. The layouts of these classes
  2596. // changed with the new reflection implementation in JDK 1.4, and
  2597. // since the Universe doesn't know what JDK version it is until this
  2598. // point we defer computation of these offsets until now.
  2599. java_lang_reflect_AccessibleObject::compute_offsets();
  2600. java_lang_reflect_Method::compute_offsets();
  2601. java_lang_reflect_Constructor::compute_offsets();
  2602. java_lang_reflect_Field::compute_offsets();
  2603. if (JDK_Version::is_gte_jdk14x_version()) {
  2604. java_nio_Buffer::compute_offsets();
  2605. }
  2606. if (JDK_Version::is_gte_jdk15x_version()) {
  2607. sun_reflect_ConstantPool::compute_offsets();
  2608. sun_reflect_UnsafeStaticFieldAccessorImpl::compute_offsets();
  2609. }
  2610. sun_misc_AtomicLongCSImpl::compute_offsets();
  2611. // generated interpreter code wants to know about the offsets we just computed:
  2612. AbstractAssembler::update_delayed_values();
  2613. }
  2614. #ifndef PRODUCT
  2615. // These functions exist to assert the validity of hard-coded field offsets to guard
  2616. // against changes in the class files
  2617. bool JavaClasses::check_offset(const char *klass_name, int hardcoded_offset, const char *field_name, const char* field_sig) {
  2618. EXCEPTION_MARK;
  2619. fieldDescriptor fd;
  2620. TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH);
  2621. klassOop k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH);
  2622. instanceKlassHandle h_klass (THREAD, k);
  2623. TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH);
  2624. TempNewSymbol f_sig = SymbolTable::new_symbol(field_sig, CATCH);
  2625. if (!h_klass->find_local_field(f_name, f_sig, &fd)) {
  2626. tty->print_cr("Nonstatic field %s.%s not found", klass_name, field_name);
  2627. return false;
  2628. }
  2629. if (fd.is_static()) {
  2630. tty->print_cr("Nonstatic field %s.%s appears to be static", klass_name, field_name);
  2631. return false;
  2632. }
  2633. if (fd.offset() == hardcoded_offset ) {
  2634. return true;
  2635. } else {
  2636. tty->print_cr("Offset of nonstatic field %s.%s is hardcoded as %d but should really be %d.",
  2637. klass_name, field_name, hardcoded_offset, fd.offset());
  2638. return false;
  2639. }
  2640. }
  2641. bool JavaClasses::check_static_offset(const char *klass_name, int hardcoded_offset, const char *field_name, const char* field_sig) {
  2642. EXCEPTION_MARK;
  2643. fieldDescriptor fd;
  2644. TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH);
  2645. klassOop k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH);
  2646. instanceKlassHandle h_klass (THREAD, k);
  2647. TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH);
  2648. TempNewSymbol f_sig = SymbolTable::new_symbol(field_sig, CATCH);
  2649. if (!h_klass->find_local_field(f_name, f_sig, &fd)) {
  2650. tty->print_cr("Static field %s.%s not found", klass_name, field_name);
  2651. return false;
  2652. }
  2653. if (!fd.is_static()) {
  2654. tty->print_cr("Static field %s.%s appears to be nonstatic", klass_name, field_name);
  2655. return false;
  2656. }
  2657. if (fd.offset() == hardcoded_offset + instanceMirrorKlass::offset_of_static_fields()) {
  2658. return true;
  2659. } else {
  2660. 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());
  2661. return false;
  2662. }
  2663. }
  2664. bool JavaClasses::check_constant(const char *klass_name, int hardcoded_constant, const char *field_name, const char* field_sig) {
  2665. EXCEPTION_MARK;
  2666. fieldDescriptor fd;
  2667. TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH);
  2668. klassOop k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH);
  2669. instanceKlassHandle h_klass (THREAD, k);
  2670. TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH);
  2671. TempNewSymbol f_sig = SymbolTable::new_symbol(field_sig, CATCH);
  2672. if (!h_klass->find_local_field(f_name, f_sig, &fd)) {
  2673. tty->print_cr("Static field %s.%s not found", klass_name, field_name);
  2674. return false;
  2675. }
  2676. if (!fd.is_static() || !fd.has_initial_value()) {
  2677. tty->print_cr("Static field %s.%s appears to be non-constant", klass_name, field_name);
  2678. return false;
  2679. }
  2680. if (!fd.initial_value_tag().is_int()) {
  2681. tty->print_cr("Static field %s.%s is not an int", klass_name, field_name);
  2682. return false;
  2683. }
  2684. jint field_value = fd.int_initial_value();
  2685. if (field_value == hardcoded_constant) {
  2686. return true;
  2687. } else {
  2688. tty->print_cr("Constant value of static field %s.%s is hardcoded as %d but should really be %d.", klass_name, field_name, hardcoded_constant, field_value);
  2689. return false;
  2690. }
  2691. }
  2692. // Check the hard-coded field offsets of all the classes in this file
  2693. void JavaClasses::check_offsets() {
  2694. bool valid = true;
  2695. #define CHECK_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
  2696. valid &= check_offset(klass_name, cpp_klass_name :: field_name ## _offset, #field_name, field_sig)
  2697. #define CHECK_LONG_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
  2698. valid &= check_offset(klass_name, cpp_klass_name :: long_ ## field_name ## _offset, #field_name, field_sig)
  2699. #define CHECK_STATIC_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
  2700. valid &= check_static_offset(klass_name, cpp_klass_name :: static_ ## field_name ## _offset, #field_name, field_sig)
  2701. #define CHECK_CONSTANT(klass_name, cpp_klass_name, field_name, field_sig) \
  2702. valid &= check_constant(klass_name, cpp_klass_name :: field_name, #field_name, field_sig)
  2703. // java.lang.String
  2704. CHECK_OFFSET("java/lang/String", java_lang_String, value, "[C");
  2705. if (java_lang_String::has_offset_field()) {
  2706. CHECK_OFFSET("java/lang/String", java_lang_String, offset, "I");
  2707. CHECK_OFFSET("java/lang/String", java_lang_String, count, "I");
  2708. }
  2709. if (java_lang_String::has_hash_field()) {
  2710. CHECK_OFFSET("java/lang/String", java_lang_String, hash, "I");
  2711. }
  2712. // java.lang.Class
  2713. // Fake fields
  2714. // CHECK_OFFSET("java/lang/Class", java_lang_Class, klass); // %%% this needs to be checked
  2715. // CHECK_OFFSET("java/lang/Class", java_lang_Class, array_klass); // %%% this needs to be checked
  2716. // CHECK_OFFSET("java/lang/Class", java_lang_Class, resolved_constructor); // %%% this needs to be checked
  2717. // java.lang.Throwable
  2718. CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, backtrace, "Ljava/lang/Object;");
  2719. CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, detailMessage, "Ljava/lang/String;");
  2720. CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, cause, "Ljava/lang/Throwable;");
  2721. CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, stackTrace, "[Ljava/lang/StackTraceElement;");
  2722. // Boxed primitive objects (java_lang_boxing_object)
  2723. CHECK_OFFSET("java/lang/Boolean", java_lang_boxing_object, value, "Z");
  2724. CHECK_OFFSET("java/lang/Character", java_lang_boxing_object, value, "C");
  2725. CHECK_OFFSET("java/lang/Float", java_lang_boxing_object, value, "F");
  2726. CHECK_LONG_OFFSET("java/lang/Double", java_lang_boxing_object, value, "D");
  2727. CHECK_OFFSET("java/lang/Byte", java_lang_boxing_object, value, "B");
  2728. CHECK_OFFSET("java/lang/Short", java_lang_boxing_object, value, "S");
  2729. CHECK_OFFSET("java/lang/Integer", java_lang_boxing_object, value, "I");
  2730. CHECK_LONG_OFFSET("java/lang/Long", java_lang_boxing_object, value, "J");
  2731. // java.lang.ClassLoader
  2732. CHECK_OFFSET("java/lang/ClassLoader", java_lang_ClassLoader, parent, "Ljava/lang/ClassLoader;");
  2733. // java.lang.System
  2734. CHECK_STATIC_OFFSET("java/lang/System", java_lang_System, in, "Ljava/io/InputStream;");
  2735. CHECK_STATIC_OFFSET("java/lang/System", java_lang_System, out, "Ljava/io/PrintStream;");
  2736. CHECK_STATIC_OFFSET("java/lang/System", java_lang_System, err, "Ljava/io/PrintStream;");
  2737. // java.lang.StackTraceElement
  2738. CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, declaringClass, "Ljava/lang/String;");
  2739. CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, methodName, "Ljava/lang/String;");
  2740. CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, fileName, "Ljava/lang/String;");
  2741. CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, lineNumber, "I");
  2742. // java.lang.ref.Reference
  2743. CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, referent, "Ljava/lang/Object;");
  2744. CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, queue, "Ljava/lang/ref/ReferenceQueue;");
  2745. CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, next, "Ljava/lang/ref/Reference;");
  2746. // Fake field
  2747. //CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, discovered, "Ljava/lang/ref/Reference;");
  2748. CHECK_STATIC_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, lock, "Ljava/lang/ref/Reference$Lock;");
  2749. CHECK_STATIC_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, pending, "Ljava/lang/ref/Reference;");
  2750. // java.lang.ref.SoftReference
  2751. CHECK_OFFSET("java/lang/ref/SoftReference", java_lang_ref_SoftReference, timestamp, "J");
  2752. CHECK_STATIC_OFFSET("java/lang/ref/SoftReference", java_lang_ref_SoftReference, clock, "J");
  2753. // java.lang.AssertionStatusDirectives
  2754. //
  2755. // The CheckAssertionStatusDirectives boolean can be removed from here and
  2756. // globals.hpp after the AssertionStatusDirectives class has been integrated
  2757. // into merlin "for some time." Without it, the vm will fail with early
  2758. // merlin builds.
  2759. if (CheckAssertionStatusDirectives && JDK_Version::is_gte_jdk14x_version()) {
  2760. const char* nm = "java/lang/AssertionStatusDirectives";
  2761. const char* sig = "[Ljava/lang/String;";
  2762. CHECK_OFFSET(nm, java_lang_AssertionStatusDirectives, classes, sig);
  2763. CHECK_OFFSET(nm, java_lang_AssertionStatusDirectives, classEnabled, "[Z");
  2764. CHECK_OFFSET(nm, java_lang_AssertionStatusDirectives, packages, sig);
  2765. CHECK_OFFSET(nm, java_lang_AssertionStatusDirectives, packageEnabled, "[Z");
  2766. CHECK_OFFSET(nm, java_lang_AssertionStatusDirectives, deflt, "Z");
  2767. }
  2768. if (!valid) vm_exit_during_initialization("Hard-coded field offset verification failed");
  2769. }
  2770. #endif // PRODUCT
  2771. int InjectedField::compute_offset() {
  2772. klassOop klass_oop = klass();
  2773. for (AllFieldStream fs(instanceKlass::cast(klass_oop)); !fs.done(); fs.next()) {
  2774. if (!may_be_java && !fs.access_flags().is_internal()) {
  2775. // Only look at injected fields
  2776. continue;
  2777. }
  2778. if (fs.name() == name() && fs.signature() == signature()) {
  2779. return fs.offset();
  2780. }
  2781. }
  2782. ResourceMark rm;
  2783. tty->print_cr("Invalid layout of %s at %s", instanceKlass::cast(klass_oop)->external_name(), name()->as_C_string());
  2784. fatal("Invalid layout of preloaded class");
  2785. return -1;
  2786. }
  2787. void javaClasses_init() {
  2788. JavaClasses::compute_offsets();
  2789. JavaClasses::check_offsets();
  2790. FilteredFieldsMap::initialize(); // must be done after computing offsets.
  2791. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/212307?site
推荐阅读
相关标签
  

闽ICP备14008679号