javaClasses.hpp revision 3602:da91efe96a93
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
25#ifndef SHARE_VM_CLASSFILE_JAVACLASSES_HPP
26#define SHARE_VM_CLASSFILE_JAVACLASSES_HPP
27
28#include "classfile/systemDictionary.hpp"
29#include "jvmtifiles/jvmti.h"
30#include "oops/oop.hpp"
31#include "runtime/os.hpp"
32#include "utilities/utf8.hpp"
33
34// Interface for manipulating the basic Java classes.
35//
36// All dependencies on layout of actual Java classes should be kept here.
37// If the layout of any of the classes above changes the offsets must be adjusted.
38//
39// For most classes we hardwire the offsets for performance reasons. In certain
40// cases (e.g. java.security.AccessControlContext) we compute the offsets at
41// startup since the layout here differs between JDK1.2 and JDK1.3.
42//
43// Note that fields (static and non-static) are arranged with oops before non-oops
44// on a per class basis. The offsets below have to reflect this ordering.
45//
46// When editing the layouts please update the check_offset verification code
47// correspondingly. The names in the enums must be identical to the actual field
48// names in order for the verification code to work.
49
50
51// Interface to java.lang.String objects
52
53class java_lang_String : AllStatic {
54 private:
55  static int value_offset;
56  static int offset_offset;
57  static int count_offset;
58  static int hash_offset;
59
60  static bool initialized;
61
62  static Handle basic_create(int length, TRAPS);
63
64  static void set_value( oop string, typeArrayOop buffer) {
65    assert(initialized, "Must be initialized");
66    string->obj_field_put(value_offset,  (oop)buffer);
67  }
68  static void set_offset(oop string, int offset) {
69    assert(initialized, "Must be initialized");
70    if (offset_offset > 0) {
71      string->int_field_put(offset_offset, offset);
72    }
73  }
74  static void set_count( oop string, int count) {
75    assert(initialized, "Must be initialized");
76    if (count_offset > 0) {
77      string->int_field_put(count_offset,  count);
78    }
79  }
80
81 public:
82  static void compute_offsets();
83
84  // Instance creation
85  static Handle create_from_unicode(jchar* unicode, int len, TRAPS);
86  static oop    create_oop_from_unicode(jchar* unicode, int len, TRAPS);
87  static Handle create_from_str(const char* utf8_str, TRAPS);
88  static oop    create_oop_from_str(const char* utf8_str, TRAPS);
89  static Handle create_from_symbol(Symbol* symbol, TRAPS);
90  static Handle create_from_platform_dependent_str(const char* str, TRAPS);
91  static Handle char_converter(Handle java_string, jchar from_char, jchar to_char, TRAPS);
92
93  static bool has_offset_field()  {
94    assert(initialized, "Must be initialized");
95    return (offset_offset > 0);
96  }
97
98  static bool has_count_field()  {
99    assert(initialized, "Must be initialized");
100    return (count_offset > 0);
101  }
102
103  static bool has_hash_field()  {
104    assert(initialized, "Must be initialized");
105    return (hash_offset > 0);
106  }
107
108  static int value_offset_in_bytes()  {
109    assert(initialized && (value_offset > 0), "Must be initialized");
110    return value_offset;
111  }
112  static int count_offset_in_bytes()  {
113    assert(initialized && (count_offset > 0), "Must be initialized");
114    return count_offset;
115  }
116  static int offset_offset_in_bytes() {
117    assert(initialized && (offset_offset > 0), "Must be initialized");
118    return offset_offset;
119  }
120  static int hash_offset_in_bytes()   {
121    assert(initialized && (hash_offset > 0), "Must be initialized");
122    return hash_offset;
123  }
124
125  // Accessors
126  static typeArrayOop value(oop java_string) {
127    assert(initialized && (value_offset > 0), "Must be initialized");
128    assert(is_instance(java_string), "must be java_string");
129    return (typeArrayOop) java_string->obj_field(value_offset);
130  }
131  static int offset(oop java_string) {
132    assert(initialized, "Must be initialized");
133    assert(is_instance(java_string), "must be java_string");
134    if (offset_offset > 0) {
135      return java_string->int_field(offset_offset);
136    } else {
137      return 0;
138    }
139  }
140  static int length(oop java_string) {
141    assert(initialized, "Must be initialized");
142    assert(is_instance(java_string), "must be java_string");
143    if (count_offset > 0) {
144      return java_string->int_field(count_offset);
145    } else {
146      return ((typeArrayOop)java_string->obj_field(value_offset))->length();
147    }
148  }
149  static int utf8_length(oop java_string);
150
151  // String converters
152  static char*  as_utf8_string(oop java_string);
153  static char*  as_utf8_string(oop java_string, char* buf, int buflen);
154  static char*  as_utf8_string(oop java_string, int start, int len);
155  static char*  as_platform_dependent_str(Handle java_string, TRAPS);
156  static jchar* as_unicode_string(oop java_string, int& length);
157
158  // Compute the hash value for a java.lang.String object which would
159  // contain the characters passed in.
160  //
161  // As the hash value used by the String object itself, in
162  // String.hashCode().  This value is normally calculated in Java code
163  // in the String.hashCode method(), but is precomputed for String
164  // objects in the shared archive file.
165  // hash P(31) from Kernighan & Ritchie
166  //
167  // For this reason, THIS ALGORITHM MUST MATCH String.toHash().
168  template <typename T> static unsigned int to_hash(T* s, int len) {
169    unsigned int h = 0;
170    while (len-- > 0) {
171      h = 31*h + (unsigned int) *s;
172      s++;
173    }
174    return h;
175  }
176  static unsigned int to_hash(oop java_string);
177
178  // This is the string hash code used by the StringTable, which may be
179  // the same as String.toHash or an alternate hash code.
180  static unsigned int hash_string(oop java_string);
181
182  static bool equals(oop java_string, jchar* chars, int len);
183
184  // Conversion between '.' and '/' formats
185  static Handle externalize_classname(Handle java_string, TRAPS) { return char_converter(java_string, '/', '.', THREAD); }
186  static Handle internalize_classname(Handle java_string, TRAPS) { return char_converter(java_string, '.', '/', THREAD); }
187
188  // Conversion
189  static Symbol* as_symbol(Handle java_string, TRAPS);
190  static Symbol* as_symbol_or_null(oop java_string);
191
192  // Testers
193  static bool is_instance(oop obj) {
194    return obj != NULL && obj->klass() == SystemDictionary::String_klass();
195  }
196
197  // Debugging
198  static void print(Handle java_string, outputStream* st);
199  friend class JavaClasses;
200};
201
202
203// Interface to java.lang.Class objects
204
205#define CLASS_INJECTED_FIELDS(macro)                                       \
206  macro(java_lang_Class, klass,                  intptr_signature,  false) \
207  macro(java_lang_Class, resolved_constructor,   intptr_signature,  false) \
208  macro(java_lang_Class, array_klass,            intptr_signature,  false) \
209  macro(java_lang_Class, oop_size,               int_signature,     false) \
210  macro(java_lang_Class, static_oop_field_count, int_signature,     false)
211
212class java_lang_Class : AllStatic {
213  friend class VMStructs;
214
215 private:
216  // The fake offsets are added by the class loader when java.lang.Class is loaded
217
218  static int _klass_offset;
219  static int _resolved_constructor_offset;
220  static int _array_klass_offset;
221
222  static int _oop_size_offset;
223  static int _static_oop_field_count_offset;
224
225  static bool offsets_computed;
226  static int classRedefinedCount_offset;
227  static GrowableArray<Klass*>* _fixup_mirror_list;
228
229 public:
230  static void compute_offsets();
231
232  // Instance creation
233  static oop  create_mirror(KlassHandle k, TRAPS);
234  static void fixup_mirror(KlassHandle k, TRAPS);
235  static oop  create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS);
236  // Conversion
237  static Klass* as_Klass(oop java_class);
238  static void set_klass(oop java_class, Klass* klass);
239  static BasicType as_BasicType(oop java_class, Klass** reference_klass = NULL);
240  static BasicType as_BasicType(oop java_class, KlassHandle* reference_klass) {
241    Klass* refk_oop = NULL;
242    BasicType result = as_BasicType(java_class, &refk_oop);
243    (*reference_klass) = KlassHandle(refk_oop);
244    return result;
245  }
246  static Symbol* as_signature(oop java_class, bool intern_if_not_found, TRAPS);
247  static void print_signature(oop java_class, outputStream *st);
248  // Testing
249  static bool is_instance(oop obj) {
250    return obj != NULL && obj->klass() == SystemDictionary::Class_klass();
251  }
252  static bool is_primitive(oop java_class);
253  static BasicType primitive_type(oop java_class);
254  static oop primitive_mirror(BasicType t);
255  // JVM_NewInstance support
256  static Method* resolved_constructor(oop java_class);
257  static void set_resolved_constructor(oop java_class, Method* constructor);
258  // JVM_NewArray support
259  static Klass* array_klass(oop java_class);
260  static void set_array_klass(oop java_class, Klass* klass);
261  // compiler support for class operations
262  static int klass_offset_in_bytes()                { return _klass_offset; }
263  static int resolved_constructor_offset_in_bytes() { return _resolved_constructor_offset; }
264  static int array_klass_offset_in_bytes()          { return _array_klass_offset; }
265  // Support for classRedefinedCount field
266  static int classRedefinedCount(oop the_class_mirror);
267  static void set_classRedefinedCount(oop the_class_mirror, int value);
268
269  static int oop_size(oop java_class);
270  static void set_oop_size(oop java_class, int size);
271  static int static_oop_field_count(oop java_class);
272  static void set_static_oop_field_count(oop java_class, int size);
273
274  static GrowableArray<Klass*>* fixup_mirror_list() {
275    return _fixup_mirror_list;
276  }
277  static void set_fixup_mirror_list(GrowableArray<Klass*>* v) {
278    _fixup_mirror_list = v;
279  }
280  // Debugging
281  friend class JavaClasses;
282  friend class InstanceKlass;   // verification code accesses offsets
283  friend class ClassFileParser; // access to number_of_fake_fields
284};
285
286// Interface to java.lang.Thread objects
287
288class java_lang_Thread : AllStatic {
289 private:
290  // Note that for this class the layout changed between JDK1.2 and JDK1.3,
291  // so we compute the offsets at startup rather than hard-wiring them.
292  static int _name_offset;
293  static int _group_offset;
294  static int _contextClassLoader_offset;
295  static int _inheritedAccessControlContext_offset;
296  static int _priority_offset;
297  static int _eetop_offset;
298  static int _daemon_offset;
299  static int _stillborn_offset;
300  static int _stackSize_offset;
301  static int _tid_offset;
302  static int _thread_status_offset;
303  static int _park_blocker_offset;
304  static int _park_event_offset ;
305
306  static void compute_offsets();
307
308 public:
309  // Instance creation
310  static oop create();
311  // Returns the JavaThread associated with the thread obj
312  static JavaThread* thread(oop java_thread);
313  // Set JavaThread for instance
314  static void set_thread(oop java_thread, JavaThread* thread);
315  // Name
316  static typeArrayOop name(oop java_thread);
317  static void set_name(oop java_thread, typeArrayOop name);
318  // Priority
319  static ThreadPriority priority(oop java_thread);
320  static void set_priority(oop java_thread, ThreadPriority priority);
321  // Thread group
322  static oop  threadGroup(oop java_thread);
323  // Stillborn
324  static bool is_stillborn(oop java_thread);
325  static void set_stillborn(oop java_thread);
326  // Alive (NOTE: this is not really a field, but provides the correct
327  // definition without doing a Java call)
328  static bool is_alive(oop java_thread);
329  // Daemon
330  static bool is_daemon(oop java_thread);
331  static void set_daemon(oop java_thread);
332  // Context ClassLoader
333  static oop context_class_loader(oop java_thread);
334  // Control context
335  static oop inherited_access_control_context(oop java_thread);
336  // Stack size hint
337  static jlong stackSize(oop java_thread);
338  // Thread ID
339  static jlong thread_id(oop java_thread);
340
341  // Blocker object responsible for thread parking
342  static oop park_blocker(oop java_thread);
343
344  // Pointer to type-stable park handler, encoded as jlong.
345  // Should be set when apparently null
346  // For details, see unsafe.cpp Unsafe_Unpark
347  static jlong park_event(oop java_thread);
348  static bool set_park_event(oop java_thread, jlong ptr);
349
350  // Java Thread Status for JVMTI and M&M use.
351  // This thread status info is saved in threadStatus field of
352  // java.lang.Thread java class.
353  enum ThreadStatus {
354    NEW                      = 0,
355    RUNNABLE                 = JVMTI_THREAD_STATE_ALIVE +          // runnable / running
356                               JVMTI_THREAD_STATE_RUNNABLE,
357    SLEEPING                 = JVMTI_THREAD_STATE_ALIVE +          // Thread.sleep()
358                               JVMTI_THREAD_STATE_WAITING +
359                               JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT +
360                               JVMTI_THREAD_STATE_SLEEPING,
361    IN_OBJECT_WAIT           = JVMTI_THREAD_STATE_ALIVE +          // Object.wait()
362                               JVMTI_THREAD_STATE_WAITING +
363                               JVMTI_THREAD_STATE_WAITING_INDEFINITELY +
364                               JVMTI_THREAD_STATE_IN_OBJECT_WAIT,
365    IN_OBJECT_WAIT_TIMED     = JVMTI_THREAD_STATE_ALIVE +          // Object.wait(long)
366                               JVMTI_THREAD_STATE_WAITING +
367                               JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT +
368                               JVMTI_THREAD_STATE_IN_OBJECT_WAIT,
369    PARKED                   = JVMTI_THREAD_STATE_ALIVE +          // LockSupport.park()
370                               JVMTI_THREAD_STATE_WAITING +
371                               JVMTI_THREAD_STATE_WAITING_INDEFINITELY +
372                               JVMTI_THREAD_STATE_PARKED,
373    PARKED_TIMED             = JVMTI_THREAD_STATE_ALIVE +          // LockSupport.park(long)
374                               JVMTI_THREAD_STATE_WAITING +
375                               JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT +
376                               JVMTI_THREAD_STATE_PARKED,
377    BLOCKED_ON_MONITOR_ENTER = JVMTI_THREAD_STATE_ALIVE +          // (re-)entering a synchronization block
378                               JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER,
379    TERMINATED               = JVMTI_THREAD_STATE_TERMINATED
380  };
381  // Write thread status info to threadStatus field of java.lang.Thread.
382  static void set_thread_status(oop java_thread_oop, ThreadStatus status);
383  // Read thread status info from threadStatus field of java.lang.Thread.
384  static ThreadStatus get_thread_status(oop java_thread_oop);
385
386  static const char*  thread_status_name(oop java_thread_oop);
387
388  // Debugging
389  friend class JavaClasses;
390};
391
392// Interface to java.lang.ThreadGroup objects
393
394class java_lang_ThreadGroup : AllStatic {
395 private:
396  static int _parent_offset;
397  static int _name_offset;
398  static int _threads_offset;
399  static int _groups_offset;
400  static int _maxPriority_offset;
401  static int _destroyed_offset;
402  static int _daemon_offset;
403  static int _vmAllowSuspension_offset;
404  static int _nthreads_offset;
405  static int _ngroups_offset;
406
407  static void compute_offsets();
408
409 public:
410  // parent ThreadGroup
411  static oop  parent(oop java_thread_group);
412  // name
413  static typeArrayOop name(oop java_thread_group);
414  // ("name as oop" accessor is not necessary)
415  // Number of threads in group
416  static int nthreads(oop java_thread_group);
417  // threads
418  static objArrayOop threads(oop java_thread_group);
419  // Number of threads in group
420  static int ngroups(oop java_thread_group);
421  // groups
422  static objArrayOop groups(oop java_thread_group);
423  // maxPriority in group
424  static ThreadPriority maxPriority(oop java_thread_group);
425  // Destroyed
426  static bool is_destroyed(oop java_thread_group);
427  // Daemon
428  static bool is_daemon(oop java_thread_group);
429  // vmAllowSuspension
430  static bool is_vmAllowSuspension(oop java_thread_group);
431  // Debugging
432  friend class JavaClasses;
433};
434
435
436
437// Interface to java.lang.Throwable objects
438
439class java_lang_Throwable: AllStatic {
440  friend class BacktraceBuilder;
441
442 private:
443  // Offsets
444  enum {
445    hc_backtrace_offset     =  0,
446    hc_detailMessage_offset =  1,
447    hc_cause_offset         =  2,  // New since 1.4
448    hc_stackTrace_offset    =  3   // New since 1.4
449  };
450  enum {
451      hc_static_unassigned_stacktrace_offset = 0  // New since 1.7
452  };
453  // Trace constants
454  enum {
455    trace_methods_offset = 0,
456    trace_bcis_offset    = 1,
457    trace_mirrors_offset = 2,
458    trace_next_offset    = 3,
459    trace_size           = 4,
460    trace_chunk_size     = 32
461  };
462
463  static int backtrace_offset;
464  static int detailMessage_offset;
465  static int cause_offset;
466  static int stackTrace_offset;
467  static int static_unassigned_stacktrace_offset;
468
469  // Printing
470  static char* print_stack_element_to_buffer(Method* method, int bci);
471  static void print_to_stream(Handle stream, const char* str);
472  // StackTrace (programmatic access, new since 1.4)
473  static void clear_stacktrace(oop throwable);
474  // No stack trace available
475  static const char* no_stack_trace_message();
476  // Stacktrace (post JDK 1.7.0 to allow immutability protocol to be followed)
477  static void set_stacktrace(oop throwable, oop st_element_array);
478  static oop unassigned_stacktrace();
479
480 public:
481  // Backtrace
482  static oop backtrace(oop throwable);
483  static void set_backtrace(oop throwable, oop value);
484  // Needed by JVMTI to filter out this internal field.
485  static int get_backtrace_offset() { return backtrace_offset;}
486  static int get_detailMessage_offset() { return detailMessage_offset;}
487  // Message
488  static oop message(oop throwable);
489  static oop message(Handle throwable);
490  static void set_message(oop throwable, oop value);
491  // Print stack trace stored in exception by call-back to Java
492  // Note: this is no longer used in Merlin, but we still suppport
493  // it for compatibility.
494  static void print_stack_trace(oop throwable, oop print_stream);
495  static void print_stack_element(Handle stream, Method* method, int bci);
496  static void print_stack_element(outputStream *st, Method* method, int bci);
497  static void print_stack_usage(Handle stream);
498
499  // Allocate space for backtrace (created but stack trace not filled in)
500  static void allocate_backtrace(Handle throwable, TRAPS);
501  // Fill in current stack trace for throwable with preallocated backtrace (no GC)
502  static void fill_in_stack_trace_of_preallocated_backtrace(Handle throwable);
503  // Fill in current stack trace, can cause GC
504  static void fill_in_stack_trace(Handle throwable, methodHandle method, TRAPS);
505  static void fill_in_stack_trace(Handle throwable, methodHandle method = methodHandle());
506  // Programmatic access to stack trace
507  static oop  get_stack_trace_element(oop throwable, int index, TRAPS);
508  static int  get_stack_trace_depth(oop throwable, TRAPS);
509  // Printing
510  static void print(oop throwable, outputStream* st);
511  static void print(Handle throwable, outputStream* st);
512  static void print_stack_trace(oop throwable, outputStream* st);
513  // Debugging
514  friend class JavaClasses;
515};
516
517
518// Interface to java.lang.reflect.AccessibleObject objects
519
520class java_lang_reflect_AccessibleObject: AllStatic {
521 private:
522  // Note that to reduce dependencies on the JDK we compute these
523  // offsets at run-time.
524  static int override_offset;
525
526  static void compute_offsets();
527
528 public:
529  // Accessors
530  static jboolean override(oop reflect);
531  static void set_override(oop reflect, jboolean value);
532
533  // Debugging
534  friend class JavaClasses;
535};
536
537
538// Interface to java.lang.reflect.Method objects
539
540class java_lang_reflect_Method : public java_lang_reflect_AccessibleObject {
541 private:
542  // Note that to reduce dependencies on the JDK we compute these
543  // offsets at run-time.
544  static int clazz_offset;
545  static int name_offset;
546  static int returnType_offset;
547  static int parameterTypes_offset;
548  static int exceptionTypes_offset;
549  static int slot_offset;
550  static int modifiers_offset;
551  static int signature_offset;
552  static int annotations_offset;
553  static int parameter_annotations_offset;
554  static int annotation_default_offset;
555
556  static void compute_offsets();
557
558 public:
559  // Allocation
560  static Handle create(TRAPS);
561
562  // Accessors
563  static oop clazz(oop reflect);
564  static void set_clazz(oop reflect, oop value);
565
566  static oop name(oop method);
567  static void set_name(oop method, oop value);
568
569  static oop return_type(oop method);
570  static void set_return_type(oop method, oop value);
571
572  static oop parameter_types(oop method);
573  static void set_parameter_types(oop method, oop value);
574
575  static oop exception_types(oop method);
576  static void set_exception_types(oop method, oop value);
577
578  static int slot(oop reflect);
579  static void set_slot(oop reflect, int value);
580
581  static int modifiers(oop method);
582  static void set_modifiers(oop method, int value);
583
584  static bool has_signature_field();
585  static oop signature(oop method);
586  static void set_signature(oop method, oop value);
587
588  static bool has_annotations_field();
589  static oop annotations(oop method);
590  static void set_annotations(oop method, oop value);
591
592  static bool has_parameter_annotations_field();
593  static oop parameter_annotations(oop method);
594  static void set_parameter_annotations(oop method, oop value);
595
596  static bool has_annotation_default_field();
597  static oop annotation_default(oop method);
598  static void set_annotation_default(oop method, oop value);
599
600  // Debugging
601  friend class JavaClasses;
602};
603
604
605// Interface to java.lang.reflect.Constructor objects
606
607class java_lang_reflect_Constructor : public java_lang_reflect_AccessibleObject {
608 private:
609  // Note that to reduce dependencies on the JDK we compute these
610  // offsets at run-time.
611  static int clazz_offset;
612  static int parameterTypes_offset;
613  static int exceptionTypes_offset;
614  static int slot_offset;
615  static int modifiers_offset;
616  static int signature_offset;
617  static int annotations_offset;
618  static int parameter_annotations_offset;
619
620  static void compute_offsets();
621
622 public:
623  // Allocation
624  static Handle create(TRAPS);
625
626  // Accessors
627  static oop clazz(oop reflect);
628  static void set_clazz(oop reflect, oop value);
629
630  static oop parameter_types(oop constructor);
631  static void set_parameter_types(oop constructor, oop value);
632
633  static oop exception_types(oop constructor);
634  static void set_exception_types(oop constructor, oop value);
635
636  static int slot(oop reflect);
637  static void set_slot(oop reflect, int value);
638
639  static int modifiers(oop constructor);
640  static void set_modifiers(oop constructor, int value);
641
642  static bool has_signature_field();
643  static oop signature(oop constructor);
644  static void set_signature(oop constructor, oop value);
645
646  static bool has_annotations_field();
647  static oop annotations(oop constructor);
648  static void set_annotations(oop constructor, oop value);
649
650  static bool has_parameter_annotations_field();
651  static oop parameter_annotations(oop method);
652  static void set_parameter_annotations(oop method, oop value);
653
654  // Debugging
655  friend class JavaClasses;
656};
657
658
659// Interface to java.lang.reflect.Field objects
660
661class java_lang_reflect_Field : public java_lang_reflect_AccessibleObject {
662 private:
663  // Note that to reduce dependencies on the JDK we compute these
664  // offsets at run-time.
665  static int clazz_offset;
666  static int name_offset;
667  static int type_offset;
668  static int slot_offset;
669  static int modifiers_offset;
670  static int signature_offset;
671  static int annotations_offset;
672
673  static void compute_offsets();
674
675 public:
676  // Allocation
677  static Handle create(TRAPS);
678
679  // Accessors
680  static oop clazz(oop reflect);
681  static void set_clazz(oop reflect, oop value);
682
683  static oop name(oop field);
684  static void set_name(oop field, oop value);
685
686  static oop type(oop field);
687  static void set_type(oop field, oop value);
688
689  static int slot(oop reflect);
690  static void set_slot(oop reflect, int value);
691
692  static int modifiers(oop field);
693  static void set_modifiers(oop field, int value);
694
695  static bool has_signature_field();
696  static oop signature(oop constructor);
697  static void set_signature(oop constructor, oop value);
698
699  static bool has_annotations_field();
700  static oop annotations(oop constructor);
701  static void set_annotations(oop constructor, oop value);
702
703  static bool has_parameter_annotations_field();
704  static oop parameter_annotations(oop method);
705  static void set_parameter_annotations(oop method, oop value);
706
707  static bool has_annotation_default_field();
708  static oop annotation_default(oop method);
709  static void set_annotation_default(oop method, oop value);
710
711  // Debugging
712  friend class JavaClasses;
713};
714
715// Interface to sun.reflect.ConstantPool objects
716class sun_reflect_ConstantPool {
717 private:
718  // Note that to reduce dependencies on the JDK we compute these
719  // offsets at run-time.
720  static int _oop_offset;
721
722  static void compute_offsets();
723
724 public:
725  // Allocation
726  static Handle create(TRAPS);
727
728  // Accessors
729  static void set_cp(oop reflect, ConstantPool* value);
730  static int oop_offset() {
731    return _oop_offset;
732  }
733
734  static ConstantPool* get_cp(oop reflect);
735
736  // Debugging
737  friend class JavaClasses;
738};
739
740// Interface to sun.reflect.UnsafeStaticFieldAccessorImpl objects
741class sun_reflect_UnsafeStaticFieldAccessorImpl {
742 private:
743  static int _base_offset;
744  static void compute_offsets();
745
746 public:
747  static int base_offset() {
748    return _base_offset;
749  }
750
751  // Debugging
752  friend class JavaClasses;
753};
754
755// Interface to java.lang primitive type boxing objects:
756//  - java.lang.Boolean
757//  - java.lang.Character
758//  - java.lang.Float
759//  - java.lang.Double
760//  - java.lang.Byte
761//  - java.lang.Short
762//  - java.lang.Integer
763//  - java.lang.Long
764
765// This could be separated out into 8 individual classes.
766
767class java_lang_boxing_object: AllStatic {
768 private:
769  enum {
770   hc_value_offset = 0
771  };
772  static int value_offset;
773  static int long_value_offset;
774
775  static oop initialize_and_allocate(BasicType type, TRAPS);
776 public:
777  // Allocation. Returns a boxed value, or NULL for invalid type.
778  static oop create(BasicType type, jvalue* value, TRAPS);
779  // Accessors. Returns the basic type being boxed, or T_ILLEGAL for invalid oop.
780  static BasicType get_value(oop box, jvalue* value);
781  static BasicType set_value(oop box, jvalue* value);
782  static BasicType basic_type(oop box);
783  static bool is_instance(oop box)                 { return basic_type(box) != T_ILLEGAL; }
784  static bool is_instance(oop box, BasicType type) { return basic_type(box) == type; }
785  static void print(oop box, outputStream* st)     { jvalue value;  print(get_value(box, &value), &value, st); }
786  static void print(BasicType type, jvalue* value, outputStream* st);
787
788  static int value_offset_in_bytes(BasicType type) {
789    return ( type == T_LONG || type == T_DOUBLE ) ? long_value_offset :
790                                                    value_offset;
791  }
792
793  // Debugging
794  friend class JavaClasses;
795};
796
797
798
799// Interface to java.lang.ref.Reference objects
800
801class java_lang_ref_Reference: AllStatic {
802 public:
803  enum {
804   hc_referent_offset   = 0,
805   hc_queue_offset      = 1,
806   hc_next_offset       = 2,
807   hc_discovered_offset = 3  // Is not last, see SoftRefs.
808  };
809  enum {
810   hc_static_lock_offset    = 0,
811   hc_static_pending_offset = 1
812  };
813
814  static int referent_offset;
815  static int queue_offset;
816  static int next_offset;
817  static int discovered_offset;
818  static int static_lock_offset;
819  static int static_pending_offset;
820  static int number_of_fake_oop_fields;
821
822  // Accessors
823  static oop referent(oop ref) {
824    return ref->obj_field(referent_offset);
825  }
826  static void set_referent(oop ref, oop value) {
827    ref->obj_field_put(referent_offset, value);
828  }
829  static void set_referent_raw(oop ref, oop value) {
830    ref->obj_field_put_raw(referent_offset, value);
831  }
832  static HeapWord* referent_addr(oop ref) {
833    return ref->obj_field_addr<HeapWord>(referent_offset);
834  }
835  static oop next(oop ref) {
836    return ref->obj_field(next_offset);
837  }
838  static void set_next(oop ref, oop value) {
839    ref->obj_field_put(next_offset, value);
840  }
841  static void set_next_raw(oop ref, oop value) {
842    ref->obj_field_put_raw(next_offset, value);
843  }
844  static HeapWord* next_addr(oop ref) {
845    return ref->obj_field_addr<HeapWord>(next_offset);
846  }
847  static oop discovered(oop ref) {
848    return ref->obj_field(discovered_offset);
849  }
850  static void set_discovered(oop ref, oop value) {
851    ref->obj_field_put(discovered_offset, value);
852  }
853  static void set_discovered_raw(oop ref, oop value) {
854    ref->obj_field_put_raw(discovered_offset, value);
855  }
856  static HeapWord* discovered_addr(oop ref) {
857    return ref->obj_field_addr<HeapWord>(discovered_offset);
858  }
859  // Accessors for statics
860  static oop  pending_list_lock();
861  static oop  pending_list();
862
863  static HeapWord*  pending_list_lock_addr();
864  static HeapWord*  pending_list_addr();
865};
866
867
868// Interface to java.lang.ref.SoftReference objects
869
870class java_lang_ref_SoftReference: public java_lang_ref_Reference {
871 public:
872  enum {
873   // The timestamp is a long field and may need to be adjusted for alignment.
874   hc_timestamp_offset  = hc_discovered_offset + 1
875  };
876  enum {
877   hc_static_clock_offset = 0
878  };
879
880  static int timestamp_offset;
881  static int static_clock_offset;
882
883  // Accessors
884  static jlong timestamp(oop ref);
885
886  // Accessors for statics
887  static jlong clock();
888  static void set_clock(jlong value);
889};
890
891
892// Interface to java.lang.invoke.MethodHandle objects
893
894class MethodHandleEntry;
895
896class java_lang_invoke_MethodHandle: AllStatic {
897  friend class JavaClasses;
898
899 private:
900  static int _type_offset;               // the MethodType of this MH
901  static int _form_offset;               // the LambdaForm of this MH
902
903  static void compute_offsets();
904
905 public:
906  // Accessors
907  static oop            type(oop mh);
908  static void       set_type(oop mh, oop mtype);
909
910  static oop            form(oop mh);
911  static void       set_form(oop mh, oop lform);
912
913  // Testers
914  static bool is_subclass(Klass* klass) {
915    return Klass::cast(klass)->is_subclass_of(SystemDictionary::MethodHandle_klass());
916  }
917  static bool is_instance(oop obj) {
918    return obj != NULL && is_subclass(obj->klass());
919  }
920
921  // Accessors for code generation:
922  static int type_offset_in_bytes()             { return _type_offset; }
923  static int form_offset_in_bytes()             { return _form_offset; }
924};
925
926// Interface to java.lang.invoke.LambdaForm objects
927// (These are a private interface for managing adapter code generation.)
928
929class java_lang_invoke_LambdaForm: AllStatic {
930  friend class JavaClasses;
931
932 private:
933  static int _vmentry_offset;  // type is MemberName
934
935  static void compute_offsets();
936
937 public:
938  // Accessors
939  static oop            vmentry(oop lform);
940  static void       set_vmentry(oop lform, oop invoker);
941
942  // Testers
943  static bool is_subclass(Klass* klass) {
944    return SystemDictionary::LambdaForm_klass() != NULL &&
945      Klass::cast(klass)->is_subclass_of(SystemDictionary::LambdaForm_klass());
946  }
947  static bool is_instance(oop obj) {
948    return obj != NULL && is_subclass(obj->klass());
949  }
950
951  // Accessors for code generation:
952  static int vmentry_offset_in_bytes()          { return _vmentry_offset; }
953};
954
955
956// Interface to java.lang.invoke.MemberName objects
957// (These are a private interface for Java code to query the class hierarchy.)
958
959#define MEMBERNAME_INJECTED_FIELDS(macro)                               \
960  macro(java_lang_invoke_MemberName, vmloader, object_signature, false) \
961  macro(java_lang_invoke_MemberName, vmindex,  intptr_signature, false) \
962  macro(java_lang_invoke_MemberName, vmtarget, intptr_signature, false)
963
964class java_lang_invoke_MemberName: AllStatic {
965  friend class JavaClasses;
966
967 private:
968  // From java.lang.invoke.MemberName:
969  //    private Class<?>   clazz;       // class in which the method is defined
970  //    private String     name;        // may be null if not yet materialized
971  //    private Object     type;        // may be null if not yet materialized
972  //    private int        flags;       // modifier bits; see reflect.Modifier
973  //    private intptr     vmtarget;    // VM-specific target value
974  //    private intptr_t   vmindex;     // member index within class or interface
975  static int _clazz_offset;
976  static int _name_offset;
977  static int _type_offset;
978  static int _flags_offset;
979  static int _vmtarget_offset;
980  static int _vmloader_offset;
981  static int _vmindex_offset;
982
983  static void compute_offsets();
984
985 public:
986  // Accessors
987  static oop            clazz(oop mname);
988  static void       set_clazz(oop mname, oop clazz);
989
990  static oop            type(oop mname);
991  static void       set_type(oop mname, oop type);
992
993  static oop            name(oop mname);
994  static void       set_name(oop mname, oop name);
995
996  static int            flags(oop mname);
997  static void       set_flags(oop mname, int flags);
998
999  static Metadata*      vmtarget(oop mname);
1000  static void       set_vmtarget(oop mname, Metadata* target);
1001
1002  static intptr_t       vmindex(oop mname);
1003  static void       set_vmindex(oop mname, intptr_t index);
1004
1005  // Testers
1006  static bool is_subclass(Klass* klass) {
1007    return Klass::cast(klass)->is_subclass_of(SystemDictionary::MemberName_klass());
1008  }
1009  static bool is_instance(oop obj) {
1010    return obj != NULL && is_subclass(obj->klass());
1011  }
1012
1013  // Relevant integer codes (keep these in synch. with MethodHandleNatives.Constants):
1014  enum {
1015    MN_IS_METHOD           = 0x00010000, // method (not constructor)
1016    MN_IS_CONSTRUCTOR      = 0x00020000, // constructor
1017    MN_IS_FIELD            = 0x00040000, // field
1018    MN_IS_TYPE             = 0x00080000, // nested type
1019    MN_REFERENCE_KIND_SHIFT = 24, // refKind
1020    MN_REFERENCE_KIND_MASK = 0x0F000000 >> MN_REFERENCE_KIND_SHIFT,
1021    // The SEARCH_* bits are not for MN.flags but for the matchFlags argument of MHN.getMembers:
1022    MN_SEARCH_SUPERCLASSES = 0x00100000, // walk super classes
1023    MN_SEARCH_INTERFACES   = 0x00200000  // walk implemented interfaces
1024  };
1025
1026  // Accessors for code generation:
1027  static int clazz_offset_in_bytes()            { return _clazz_offset; }
1028  static int type_offset_in_bytes()             { return _type_offset; }
1029  static int name_offset_in_bytes()             { return _name_offset; }
1030  static int flags_offset_in_bytes()            { return _flags_offset; }
1031  static int vmtarget_offset_in_bytes()         { return _vmtarget_offset; }
1032  static int vmindex_offset_in_bytes()          { return _vmindex_offset; }
1033};
1034
1035
1036// Interface to java.lang.invoke.MethodType objects
1037
1038class java_lang_invoke_MethodType: AllStatic {
1039  friend class JavaClasses;
1040
1041 private:
1042  static int _rtype_offset;
1043  static int _ptypes_offset;
1044
1045  static void compute_offsets();
1046
1047 public:
1048  // Accessors
1049  static oop            rtype(oop mt);
1050  static objArrayOop    ptypes(oop mt);
1051
1052  static oop            ptype(oop mt, int index);
1053  static int            ptype_count(oop mt);
1054
1055  static int            ptype_slot_count(oop mt);  // extra counts for long/double
1056  static int            rtype_slot_count(oop mt);  // extra counts for long/double
1057
1058  static Symbol*        as_signature(oop mt, bool intern_if_not_found, TRAPS);
1059  static void           print_signature(oop mt, outputStream* st);
1060
1061  static bool is_instance(oop obj) {
1062    return obj != NULL && obj->klass() == SystemDictionary::MethodType_klass();
1063  }
1064
1065  static bool equals(oop mt1, oop mt2);
1066
1067  // Accessors for code generation:
1068  static int rtype_offset_in_bytes()            { return _rtype_offset; }
1069  static int ptypes_offset_in_bytes()           { return _ptypes_offset; }
1070};
1071
1072
1073// Interface to java.lang.invoke.CallSite objects
1074
1075class java_lang_invoke_CallSite: AllStatic {
1076  friend class JavaClasses;
1077
1078private:
1079  static int _target_offset;
1080
1081  static void compute_offsets();
1082
1083public:
1084  // Accessors
1085  static oop              target(         oop site)             { return site->obj_field(             _target_offset);         }
1086  static void         set_target(         oop site, oop target) {        site->obj_field_put(         _target_offset, target); }
1087
1088  static volatile oop     target_volatile(oop site)             { return site->obj_field_volatile(    _target_offset);         }
1089  static void         set_target_volatile(oop site, oop target) {        site->obj_field_put_volatile(_target_offset, target); }
1090
1091  // Testers
1092  static bool is_subclass(Klass* klass) {
1093    return Klass::cast(klass)->is_subclass_of(SystemDictionary::CallSite_klass());
1094  }
1095  static bool is_instance(oop obj) {
1096    return obj != NULL && is_subclass(obj->klass());
1097  }
1098
1099  // Accessors for code generation:
1100  static int target_offset_in_bytes()           { return _target_offset; }
1101};
1102
1103
1104// Interface to java.security.AccessControlContext objects
1105
1106class java_security_AccessControlContext: AllStatic {
1107 private:
1108  // Note that for this class the layout changed between JDK1.2 and JDK1.3,
1109  // so we compute the offsets at startup rather than hard-wiring them.
1110  static int _context_offset;
1111  static int _privilegedContext_offset;
1112  static int _isPrivileged_offset;
1113
1114  static void compute_offsets();
1115 public:
1116  static oop create(objArrayHandle context, bool isPrivileged, Handle privileged_context, TRAPS);
1117
1118  // Debugging/initialization
1119  friend class JavaClasses;
1120};
1121
1122
1123// Interface to java.lang.ClassLoader objects
1124
1125#define CLASSLOADER_INJECTED_FIELDS(macro)                            \
1126  macro(java_lang_ClassLoader, loader_data,  intptr_signature, false) \
1127  macro(java_lang_ClassLoader, dependencies, object_signature, false)
1128
1129class java_lang_ClassLoader : AllStatic {
1130 private:
1131  // The fake offsets are added by the class loader when java.lang.Class is loaded
1132  enum {
1133   hc_parent_offset = 0
1134  };
1135  static int _loader_data_offset;
1136  static int _dependencies_offset;
1137  static bool offsets_computed;
1138  static int parent_offset;
1139  static int parallelCapable_offset;
1140
1141 public:
1142  static void compute_offsets();
1143
1144  static ClassLoaderData** loader_data_addr(oop loader);
1145  static ClassLoaderData* loader_data(oop loader);
1146
1147  static oop  dependencies(oop loader);
1148  static HeapWord* dependencies_addr(oop loader);
1149
1150  static oop parent(oop loader);
1151  static bool isAncestor(oop loader, oop cl);
1152
1153  // Support for parallelCapable field
1154  static bool parallelCapable(oop the_class_mirror);
1155
1156  static bool is_trusted_loader(oop loader);
1157
1158  // Fix for 4474172
1159  static oop  non_reflection_class_loader(oop loader);
1160
1161  // Testers
1162  static bool is_subclass(Klass* klass) {
1163    return Klass::cast(klass)->is_subclass_of(SystemDictionary::ClassLoader_klass());
1164  }
1165  static bool is_instance(oop obj) {
1166    return obj != NULL && is_subclass(obj->klass());
1167  }
1168
1169  // Debugging
1170  friend class JavaClasses;
1171  friend class ClassFileParser; // access to number_of_fake_fields
1172};
1173
1174
1175// Interface to java.lang.System objects
1176
1177class java_lang_System : AllStatic {
1178 private:
1179  enum {
1180   hc_static_in_offset  = 0,
1181   hc_static_out_offset = 1,
1182   hc_static_err_offset = 2
1183  };
1184
1185  static int  static_in_offset;
1186  static int static_out_offset;
1187  static int static_err_offset;
1188
1189 public:
1190  static int  in_offset_in_bytes();
1191  static int out_offset_in_bytes();
1192  static int err_offset_in_bytes();
1193
1194  // Debugging
1195  friend class JavaClasses;
1196};
1197
1198
1199// Interface to java.lang.StackTraceElement objects
1200
1201class java_lang_StackTraceElement: AllStatic {
1202 private:
1203  enum {
1204    hc_declaringClass_offset  = 0,
1205    hc_methodName_offset = 1,
1206    hc_fileName_offset   = 2,
1207    hc_lineNumber_offset = 3
1208  };
1209
1210  static int declaringClass_offset;
1211  static int methodName_offset;
1212  static int fileName_offset;
1213  static int lineNumber_offset;
1214
1215 public:
1216  // Setters
1217  static void set_declaringClass(oop element, oop value);
1218  static void set_methodName(oop element, oop value);
1219  static void set_fileName(oop element, oop value);
1220  static void set_lineNumber(oop element, int value);
1221
1222  // Create an instance of StackTraceElement
1223  static oop create(methodHandle m, int bci, TRAPS);
1224
1225  // Debugging
1226  friend class JavaClasses;
1227};
1228
1229
1230// Interface to java.lang.AssertionStatusDirectives objects
1231
1232class java_lang_AssertionStatusDirectives: AllStatic {
1233 private:
1234  enum {
1235    hc_classes_offset,
1236    hc_classEnabled_offset,
1237    hc_packages_offset,
1238    hc_packageEnabled_offset,
1239    hc_deflt_offset
1240  };
1241
1242  static int classes_offset;
1243  static int classEnabled_offset;
1244  static int packages_offset;
1245  static int packageEnabled_offset;
1246  static int deflt_offset;
1247
1248 public:
1249  // Setters
1250  static void set_classes(oop obj, oop val);
1251  static void set_classEnabled(oop obj, oop val);
1252  static void set_packages(oop obj, oop val);
1253  static void set_packageEnabled(oop obj, oop val);
1254  static void set_deflt(oop obj, bool val);
1255  // Debugging
1256  friend class JavaClasses;
1257};
1258
1259
1260class java_nio_Buffer: AllStatic {
1261 private:
1262  static int _limit_offset;
1263
1264 public:
1265  static int  limit_offset();
1266  static void compute_offsets();
1267};
1268
1269class java_util_concurrent_locks_AbstractOwnableSynchronizer : AllStatic {
1270 private:
1271  static int  _owner_offset;
1272 public:
1273  static void initialize(TRAPS);
1274  static oop  get_owner_threadObj(oop obj);
1275};
1276
1277// Use to declare fields that need to be injected into Java classes
1278// for the JVM to use.  The name_index and signature_index are
1279// declared in vmSymbols.  The may_be_java flag is used to declare
1280// fields that might already exist in Java but should be injected if
1281// they don't.  Otherwise the field is unconditionally injected and
1282// the JVM uses the injected one.  This is to ensure that name
1283// collisions don't occur.  In general may_be_java should be false
1284// unless there's a good reason.
1285
1286class InjectedField {
1287 public:
1288  const SystemDictionary::WKID klass_id;
1289  const vmSymbols::SID name_index;
1290  const vmSymbols::SID signature_index;
1291  const bool           may_be_java;
1292
1293
1294  Klass* klass() const    { return SystemDictionary::well_known_klass(klass_id); }
1295  Symbol* name() const      { return lookup_symbol(name_index); }
1296  Symbol* signature() const { return lookup_symbol(signature_index); }
1297
1298  int compute_offset();
1299
1300  // Find the Symbol for this index
1301  static Symbol* lookup_symbol(int symbol_index) {
1302    return vmSymbols::symbol_at((vmSymbols::SID)symbol_index);
1303  }
1304};
1305
1306#define DECLARE_INJECTED_FIELD_ENUM(klass, name, signature, may_be_java) \
1307  klass##_##name##_enum,
1308
1309#define ALL_INJECTED_FIELDS(macro)          \
1310  CLASS_INJECTED_FIELDS(macro)              \
1311  CLASSLOADER_INJECTED_FIELDS(macro)        \
1312  MEMBERNAME_INJECTED_FIELDS(macro)
1313
1314// Interface to hard-coded offset checking
1315
1316class JavaClasses : AllStatic {
1317 private:
1318
1319  static InjectedField _injected_fields[];
1320
1321  static bool check_offset(const char *klass_name, int offset, const char *field_name, const char* field_sig) PRODUCT_RETURN0;
1322  static bool check_static_offset(const char *klass_name, int hardcoded_offset, const char *field_name, const char* field_sig) PRODUCT_RETURN0;
1323  static bool check_constant(const char *klass_name, int constant, const char *field_name, const char* field_sig) PRODUCT_RETURN0;
1324
1325 public:
1326  enum InjectedFieldID {
1327    ALL_INJECTED_FIELDS(DECLARE_INJECTED_FIELD_ENUM)
1328    MAX_enum
1329  };
1330
1331  static int compute_injected_offset(InjectedFieldID id);
1332
1333  static void compute_hard_coded_offsets();
1334  static void compute_offsets();
1335  static void check_offsets() PRODUCT_RETURN;
1336
1337  static InjectedField* get_injected(Symbol* class_name, int* field_count);
1338};
1339
1340#undef DECLARE_INJECTED_FIELD_ENUM
1341
1342#endif // SHARE_VM_CLASSFILE_JAVACLASSES_HPP
1343