javaClasses.hpp revision 1879:f95d63e2154a
1/*
2 * Copyright (c) 1997, 2010, 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  enum {
56    hc_value_offset  = 0,
57    hc_offset_offset = 1
58    //hc_count_offset = 2  -- not a word-scaled offset
59    //hc_hash_offset  = 3  -- not a word-scaled offset
60  };
61
62  static int value_offset;
63  static int offset_offset;
64  static int count_offset;
65  static int hash_offset;
66
67  static Handle basic_create(int length, bool tenured, TRAPS);
68  static Handle basic_create_from_unicode(jchar* unicode, int length, bool tenured, TRAPS);
69
70  static void set_value( oop string, typeArrayOop buffer) { string->obj_field_put(value_offset,  (oop)buffer); }
71  static void set_offset(oop string, int offset)          { string->int_field_put(offset_offset, offset); }
72  static void set_count( oop string, int count)           { string->int_field_put(count_offset,  count);  }
73
74 public:
75  // Instance creation
76  static Handle create_from_unicode(jchar* unicode, int len, TRAPS);
77  static Handle create_tenured_from_unicode(jchar* unicode, int len, TRAPS);
78  static oop    create_oop_from_unicode(jchar* unicode, int len, TRAPS);
79  static Handle create_from_str(const char* utf8_str, TRAPS);
80  static oop    create_oop_from_str(const char* utf8_str, TRAPS);
81  static Handle create_from_symbol(symbolHandle symbol, TRAPS);
82  static Handle create_from_platform_dependent_str(const char* str, TRAPS);
83  static Handle char_converter(Handle java_string, jchar from_char, jchar to_char, TRAPS);
84
85  static int value_offset_in_bytes()  { return value_offset;  }
86  static int count_offset_in_bytes()  { return count_offset;  }
87  static int offset_offset_in_bytes() { return offset_offset; }
88  static int hash_offset_in_bytes()   { return hash_offset;   }
89
90  // Accessors
91  static typeArrayOop value(oop java_string) {
92    assert(is_instance(java_string), "must be java_string");
93    return (typeArrayOop) java_string->obj_field(value_offset);
94  }
95  static int offset(oop java_string) {
96    assert(is_instance(java_string), "must be java_string");
97    return java_string->int_field(offset_offset);
98  }
99  static int length(oop java_string) {
100    assert(is_instance(java_string), "must be java_string");
101    return java_string->int_field(count_offset);
102  }
103  static int utf8_length(oop java_string);
104
105  // String converters
106  static char*  as_utf8_string(oop java_string);
107  static char*  as_utf8_string(oop java_string, int start, int len);
108  static char*  as_platform_dependent_str(Handle java_string, TRAPS);
109  static jchar* as_unicode_string(oop java_string, int& length);
110
111  static bool equals(oop java_string, jchar* chars, int len);
112
113  // Conversion between '.' and '/' formats
114  static Handle externalize_classname(Handle java_string, TRAPS) { return char_converter(java_string, '/', '.', THREAD); }
115  static Handle internalize_classname(Handle java_string, TRAPS) { return char_converter(java_string, '.', '/', THREAD); }
116
117  // Conversion
118  static symbolHandle as_symbol(Handle java_string, TRAPS);
119  static symbolOop as_symbol_or_null(oop java_string);
120
121  // Testers
122  static bool is_instance(oop obj) {
123    return obj != NULL && obj->klass() == SystemDictionary::String_klass();
124  }
125
126  // Debugging
127  static void print(Handle java_string, outputStream* st);
128  friend class JavaClasses;
129};
130
131
132// Interface to java.lang.Class objects
133
134class java_lang_Class : AllStatic {
135   friend class VMStructs;
136 private:
137  // The fake offsets are added by the class loader when java.lang.Class is loaded
138
139  enum {
140    hc_klass_offset                = 0,
141    hc_array_klass_offset          = 1,
142    hc_resolved_constructor_offset = 2,
143    hc_number_of_fake_oop_fields   = 3
144  };
145
146  static int klass_offset;
147  static int resolved_constructor_offset;
148  static int array_klass_offset;
149  static int number_of_fake_oop_fields;
150
151  static void compute_offsets();
152  static bool offsets_computed;
153  static int classRedefinedCount_offset;
154  static int parallelCapable_offset;
155
156 public:
157  // Instance creation
158  static oop  create_mirror(KlassHandle k, TRAPS);
159  static oop  create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS);
160  // Conversion
161  static klassOop as_klassOop(oop java_class);
162  static BasicType as_BasicType(oop java_class, klassOop* reference_klass = NULL);
163  static BasicType as_BasicType(oop java_class, KlassHandle* reference_klass) {
164    klassOop refk_oop = NULL;
165    BasicType result = as_BasicType(java_class, &refk_oop);
166    (*reference_klass) = KlassHandle(refk_oop);
167    return result;
168  }
169  static symbolOop as_signature(oop java_class, bool intern_if_not_found, TRAPS);
170  static void print_signature(oop java_class, outputStream *st);
171  // Testing
172  static bool is_instance(oop obj) {
173    return obj != NULL && obj->klass() == SystemDictionary::Class_klass();
174  }
175  static bool is_primitive(oop java_class);
176  static BasicType primitive_type(oop java_class);
177  static oop primitive_mirror(BasicType t);
178  // JVM_NewInstance support
179  static methodOop resolved_constructor(oop java_class);
180  static void set_resolved_constructor(oop java_class, methodOop constructor);
181  // JVM_NewArray support
182  static klassOop array_klass(oop java_class);
183  static void set_array_klass(oop java_class, klassOop klass);
184  // compiler support for class operations
185  static int klass_offset_in_bytes() { return klass_offset; }
186  static int resolved_constructor_offset_in_bytes() { return resolved_constructor_offset; }
187  static int array_klass_offset_in_bytes() { return array_klass_offset; }
188  // Support for classRedefinedCount field
189  static int classRedefinedCount(oop the_class_mirror);
190  static void set_classRedefinedCount(oop the_class_mirror, int value);
191  // Support for parallelCapable field
192  static bool parallelCapable(oop the_class_mirror);
193  // Debugging
194  friend class JavaClasses;
195  friend class instanceKlass;   // verification code accesses offsets
196  friend class ClassFileParser; // access to number_of_fake_fields
197};
198
199// Interface to java.lang.Thread objects
200
201class java_lang_Thread : AllStatic {
202 private:
203  // Note that for this class the layout changed between JDK1.2 and JDK1.3,
204  // so we compute the offsets at startup rather than hard-wiring them.
205  static int _name_offset;
206  static int _group_offset;
207  static int _contextClassLoader_offset;
208  static int _inheritedAccessControlContext_offset;
209  static int _priority_offset;
210  static int _eetop_offset;
211  static int _daemon_offset;
212  static int _stillborn_offset;
213  static int _stackSize_offset;
214  static int _tid_offset;
215  static int _thread_status_offset;
216  static int _park_blocker_offset;
217  static int _park_event_offset ;
218
219  static void compute_offsets();
220
221 public:
222  // Instance creation
223  static oop create();
224  // Returns the JavaThread associated with the thread obj
225  static JavaThread* thread(oop java_thread);
226  // Set JavaThread for instance
227  static void set_thread(oop java_thread, JavaThread* thread);
228  // Name
229  static typeArrayOop name(oop java_thread);
230  static void set_name(oop java_thread, typeArrayOop name);
231  // Priority
232  static ThreadPriority priority(oop java_thread);
233  static void set_priority(oop java_thread, ThreadPriority priority);
234  // Thread group
235  static oop  threadGroup(oop java_thread);
236  // Stillborn
237  static bool is_stillborn(oop java_thread);
238  static void set_stillborn(oop java_thread);
239  // Alive (NOTE: this is not really a field, but provides the correct
240  // definition without doing a Java call)
241  static bool is_alive(oop java_thread);
242  // Daemon
243  static bool is_daemon(oop java_thread);
244  static void set_daemon(oop java_thread);
245  // Context ClassLoader
246  static oop context_class_loader(oop java_thread);
247  // Control context
248  static oop inherited_access_control_context(oop java_thread);
249  // Stack size hint
250  static jlong stackSize(oop java_thread);
251  // Thread ID
252  static jlong thread_id(oop java_thread);
253
254  // Blocker object responsible for thread parking
255  static oop park_blocker(oop java_thread);
256
257  // Pointer to type-stable park handler, encoded as jlong.
258  // Should be set when apparently null
259  // For details, see unsafe.cpp Unsafe_Unpark
260  static jlong park_event(oop java_thread);
261  static bool set_park_event(oop java_thread, jlong ptr);
262
263  // Java Thread Status for JVMTI and M&M use.
264  // This thread status info is saved in threadStatus field of
265  // java.lang.Thread java class.
266  enum ThreadStatus {
267    NEW                      = 0,
268    RUNNABLE                 = JVMTI_THREAD_STATE_ALIVE +          // runnable / running
269                               JVMTI_THREAD_STATE_RUNNABLE,
270    SLEEPING                 = JVMTI_THREAD_STATE_ALIVE +          // Thread.sleep()
271                               JVMTI_THREAD_STATE_WAITING +
272                               JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT +
273                               JVMTI_THREAD_STATE_SLEEPING,
274    IN_OBJECT_WAIT           = JVMTI_THREAD_STATE_ALIVE +          // Object.wait()
275                               JVMTI_THREAD_STATE_WAITING +
276                               JVMTI_THREAD_STATE_WAITING_INDEFINITELY +
277                               JVMTI_THREAD_STATE_IN_OBJECT_WAIT,
278    IN_OBJECT_WAIT_TIMED     = JVMTI_THREAD_STATE_ALIVE +          // Object.wait(long)
279                               JVMTI_THREAD_STATE_WAITING +
280                               JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT +
281                               JVMTI_THREAD_STATE_IN_OBJECT_WAIT,
282    PARKED                   = JVMTI_THREAD_STATE_ALIVE +          // LockSupport.park()
283                               JVMTI_THREAD_STATE_WAITING +
284                               JVMTI_THREAD_STATE_WAITING_INDEFINITELY +
285                               JVMTI_THREAD_STATE_PARKED,
286    PARKED_TIMED             = JVMTI_THREAD_STATE_ALIVE +          // LockSupport.park(long)
287                               JVMTI_THREAD_STATE_WAITING +
288                               JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT +
289                               JVMTI_THREAD_STATE_PARKED,
290    BLOCKED_ON_MONITOR_ENTER = JVMTI_THREAD_STATE_ALIVE +          // (re-)entering a synchronization block
291                               JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER,
292    TERMINATED               = JVMTI_THREAD_STATE_TERMINATED
293  };
294  // Write thread status info to threadStatus field of java.lang.Thread.
295  static void set_thread_status(oop java_thread_oop, ThreadStatus status);
296  // Read thread status info from threadStatus field of java.lang.Thread.
297  static ThreadStatus get_thread_status(oop java_thread_oop);
298
299  static const char*  thread_status_name(oop java_thread_oop);
300
301  // Debugging
302  friend class JavaClasses;
303};
304
305// Interface to java.lang.ThreadGroup objects
306
307class java_lang_ThreadGroup : AllStatic {
308 private:
309  static int _parent_offset;
310  static int _name_offset;
311  static int _threads_offset;
312  static int _groups_offset;
313  static int _maxPriority_offset;
314  static int _destroyed_offset;
315  static int _daemon_offset;
316  static int _vmAllowSuspension_offset;
317  static int _nthreads_offset;
318  static int _ngroups_offset;
319
320  static void compute_offsets();
321
322 public:
323  // parent ThreadGroup
324  static oop  parent(oop java_thread_group);
325  // name
326  static typeArrayOop name(oop java_thread_group);
327  // ("name as oop" accessor is not necessary)
328  // Number of threads in group
329  static int nthreads(oop java_thread_group);
330  // threads
331  static objArrayOop threads(oop java_thread_group);
332  // Number of threads in group
333  static int ngroups(oop java_thread_group);
334  // groups
335  static objArrayOop groups(oop java_thread_group);
336  // maxPriority in group
337  static ThreadPriority maxPriority(oop java_thread_group);
338  // Destroyed
339  static bool is_destroyed(oop java_thread_group);
340  // Daemon
341  static bool is_daemon(oop java_thread_group);
342  // vmAllowSuspension
343  static bool is_vmAllowSuspension(oop java_thread_group);
344  // Debugging
345  friend class JavaClasses;
346};
347
348
349
350// Interface to java.lang.Throwable objects
351
352class java_lang_Throwable: AllStatic {
353  friend class BacktraceBuilder;
354
355 private:
356  // Offsets
357  enum {
358    hc_backtrace_offset     =  0,
359    hc_detailMessage_offset =  1,
360    hc_cause_offset         =  2,  // New since 1.4
361    hc_stackTrace_offset    =  3   // New since 1.4
362  };
363  // Trace constants
364  enum {
365    trace_methods_offset = 0,
366    trace_bcis_offset    = 1,
367    trace_next_offset    = 2,
368    trace_size           = 3,
369    trace_chunk_size     = 32
370  };
371
372  static int backtrace_offset;
373  static int detailMessage_offset;
374  static int cause_offset;
375  static int stackTrace_offset;
376
377  // Printing
378  static char* print_stack_element_to_buffer(methodOop method, int bci);
379  static void print_to_stream(Handle stream, const char* str);
380  // StackTrace (programmatic access, new since 1.4)
381  static void clear_stacktrace(oop throwable);
382  // No stack trace available
383  static const char* no_stack_trace_message();
384
385 public:
386  // Backtrace
387  static oop backtrace(oop throwable);
388  static void set_backtrace(oop throwable, oop value);
389  // Needed by JVMTI to filter out this internal field.
390  static int get_backtrace_offset() { return backtrace_offset;}
391  static int get_detailMessage_offset() { return detailMessage_offset;}
392  // Message
393  static oop message(oop throwable);
394  static oop message(Handle throwable);
395  static void set_message(oop throwable, oop value);
396  // Print stack trace stored in exception by call-back to Java
397  // Note: this is no longer used in Merlin, but we still suppport
398  // it for compatibility.
399  static void print_stack_trace(oop throwable, oop print_stream);
400  static void print_stack_element(Handle stream, methodOop method, int bci);
401  static void print_stack_element(outputStream *st, methodOop method, int bci);
402  static void print_stack_usage(Handle stream);
403
404  // Allocate space for backtrace (created but stack trace not filled in)
405  static void allocate_backtrace(Handle throwable, TRAPS);
406  // Fill in current stack trace for throwable with preallocated backtrace (no GC)
407  static void fill_in_stack_trace_of_preallocated_backtrace(Handle throwable);
408
409  // Fill in current stack trace, can cause GC
410  static void fill_in_stack_trace(Handle throwable, TRAPS);
411  static void fill_in_stack_trace(Handle throwable);
412  // Programmatic access to stack trace
413  static oop  get_stack_trace_element(oop throwable, int index, TRAPS);
414  static int  get_stack_trace_depth(oop throwable, TRAPS);
415  // Printing
416  static void print(oop throwable, outputStream* st);
417  static void print(Handle throwable, outputStream* st);
418  static void print_stack_trace(oop throwable, outputStream* st);
419  // Debugging
420  friend class JavaClasses;
421};
422
423
424// Interface to java.lang.reflect.AccessibleObject objects
425
426class java_lang_reflect_AccessibleObject: AllStatic {
427 private:
428  // Note that to reduce dependencies on the JDK we compute these
429  // offsets at run-time.
430  static int override_offset;
431
432  static void compute_offsets();
433
434 public:
435  // Accessors
436  static jboolean override(oop reflect);
437  static void set_override(oop reflect, jboolean value);
438
439  // Debugging
440  friend class JavaClasses;
441};
442
443
444// Interface to java.lang.reflect.Method objects
445
446class java_lang_reflect_Method : public java_lang_reflect_AccessibleObject {
447 private:
448  // Note that to reduce dependencies on the JDK we compute these
449  // offsets at run-time.
450  static int clazz_offset;
451  static int name_offset;
452  static int returnType_offset;
453  static int parameterTypes_offset;
454  static int exceptionTypes_offset;
455  static int slot_offset;
456  static int modifiers_offset;
457  static int signature_offset;
458  static int annotations_offset;
459  static int parameter_annotations_offset;
460  static int annotation_default_offset;
461
462  static void compute_offsets();
463
464 public:
465  // Allocation
466  static Handle create(TRAPS);
467
468  // Accessors
469  static oop clazz(oop reflect);
470  static void set_clazz(oop reflect, oop value);
471
472  static oop name(oop method);
473  static void set_name(oop method, oop value);
474
475  static oop return_type(oop method);
476  static void set_return_type(oop method, oop value);
477
478  static oop parameter_types(oop method);
479  static void set_parameter_types(oop method, oop value);
480
481  static oop exception_types(oop method);
482  static void set_exception_types(oop method, oop value);
483
484  static int slot(oop reflect);
485  static void set_slot(oop reflect, int value);
486
487  static int modifiers(oop method);
488  static void set_modifiers(oop method, int value);
489
490  static bool has_signature_field();
491  static oop signature(oop method);
492  static void set_signature(oop method, oop value);
493
494  static bool has_annotations_field();
495  static oop annotations(oop method);
496  static void set_annotations(oop method, oop value);
497
498  static bool has_parameter_annotations_field();
499  static oop parameter_annotations(oop method);
500  static void set_parameter_annotations(oop method, oop value);
501
502  static bool has_annotation_default_field();
503  static oop annotation_default(oop method);
504  static void set_annotation_default(oop method, oop value);
505
506  // Debugging
507  friend class JavaClasses;
508};
509
510
511// Interface to java.lang.reflect.Constructor objects
512
513class java_lang_reflect_Constructor : public java_lang_reflect_AccessibleObject {
514 private:
515  // Note that to reduce dependencies on the JDK we compute these
516  // offsets at run-time.
517  static int clazz_offset;
518  static int parameterTypes_offset;
519  static int exceptionTypes_offset;
520  static int slot_offset;
521  static int modifiers_offset;
522  static int signature_offset;
523  static int annotations_offset;
524  static int parameter_annotations_offset;
525
526  static void compute_offsets();
527
528 public:
529  // Allocation
530  static Handle create(TRAPS);
531
532  // Accessors
533  static oop clazz(oop reflect);
534  static void set_clazz(oop reflect, oop value);
535
536  static oop parameter_types(oop constructor);
537  static void set_parameter_types(oop constructor, oop value);
538
539  static oop exception_types(oop constructor);
540  static void set_exception_types(oop constructor, oop value);
541
542  static int slot(oop reflect);
543  static void set_slot(oop reflect, int value);
544
545  static int modifiers(oop constructor);
546  static void set_modifiers(oop constructor, int value);
547
548  static bool has_signature_field();
549  static oop signature(oop constructor);
550  static void set_signature(oop constructor, oop value);
551
552  static bool has_annotations_field();
553  static oop annotations(oop constructor);
554  static void set_annotations(oop constructor, oop value);
555
556  static bool has_parameter_annotations_field();
557  static oop parameter_annotations(oop method);
558  static void set_parameter_annotations(oop method, oop value);
559
560  // Debugging
561  friend class JavaClasses;
562};
563
564
565// Interface to java.lang.reflect.Field objects
566
567class java_lang_reflect_Field : public java_lang_reflect_AccessibleObject {
568 private:
569  // Note that to reduce dependencies on the JDK we compute these
570  // offsets at run-time.
571  static int clazz_offset;
572  static int name_offset;
573  static int type_offset;
574  static int slot_offset;
575  static int modifiers_offset;
576  static int signature_offset;
577  static int annotations_offset;
578
579  static void compute_offsets();
580
581 public:
582  // Allocation
583  static Handle create(TRAPS);
584
585  // Accessors
586  static oop clazz(oop reflect);
587  static void set_clazz(oop reflect, oop value);
588
589  static oop name(oop field);
590  static void set_name(oop field, oop value);
591
592  static oop type(oop field);
593  static void set_type(oop field, oop value);
594
595  static int slot(oop reflect);
596  static void set_slot(oop reflect, int value);
597
598  static int modifiers(oop field);
599  static void set_modifiers(oop field, int value);
600
601  static bool has_signature_field();
602  static oop signature(oop constructor);
603  static void set_signature(oop constructor, oop value);
604
605  static bool has_annotations_field();
606  static oop annotations(oop constructor);
607  static void set_annotations(oop constructor, oop value);
608
609  static bool has_parameter_annotations_field();
610  static oop parameter_annotations(oop method);
611  static void set_parameter_annotations(oop method, oop value);
612
613  static bool has_annotation_default_field();
614  static oop annotation_default(oop method);
615  static void set_annotation_default(oop method, oop value);
616
617  // Debugging
618  friend class JavaClasses;
619};
620
621// Interface to sun.reflect.ConstantPool objects
622class sun_reflect_ConstantPool {
623 private:
624  // Note that to reduce dependencies on the JDK we compute these
625  // offsets at run-time.
626  static int _cp_oop_offset;
627
628  static void compute_offsets();
629
630 public:
631  // Allocation
632  static Handle create(TRAPS);
633
634  // Accessors
635  static oop cp_oop(oop reflect);
636  static void set_cp_oop(oop reflect, oop value);
637  static int cp_oop_offset() {
638    return _cp_oop_offset;
639  }
640
641  // Debugging
642  friend class JavaClasses;
643};
644
645// Interface to sun.reflect.UnsafeStaticFieldAccessorImpl objects
646class sun_reflect_UnsafeStaticFieldAccessorImpl {
647 private:
648  static int _base_offset;
649  static void compute_offsets();
650
651 public:
652  static int base_offset() {
653    return _base_offset;
654  }
655
656  // Debugging
657  friend class JavaClasses;
658};
659
660// Interface to java.lang primitive type boxing objects:
661//  - java.lang.Boolean
662//  - java.lang.Character
663//  - java.lang.Float
664//  - java.lang.Double
665//  - java.lang.Byte
666//  - java.lang.Short
667//  - java.lang.Integer
668//  - java.lang.Long
669
670// This could be separated out into 8 individual classes.
671
672class java_lang_boxing_object: AllStatic {
673 private:
674  enum {
675   hc_value_offset = 0
676  };
677  static int value_offset;
678  static int long_value_offset;
679
680  static oop initialize_and_allocate(BasicType type, TRAPS);
681 public:
682  // Allocation. Returns a boxed value, or NULL for invalid type.
683  static oop create(BasicType type, jvalue* value, TRAPS);
684  // Accessors. Returns the basic type being boxed, or T_ILLEGAL for invalid oop.
685  static BasicType get_value(oop box, jvalue* value);
686  static BasicType set_value(oop box, jvalue* value);
687  static BasicType basic_type(oop box);
688  static bool is_instance(oop box)                 { return basic_type(box) != T_ILLEGAL; }
689  static bool is_instance(oop box, BasicType type) { return basic_type(box) == type; }
690  static void print(oop box, outputStream* st)     { jvalue value;  print(get_value(box, &value), &value, st); }
691  static void print(BasicType type, jvalue* value, outputStream* st);
692
693  static int value_offset_in_bytes(BasicType type) {
694    return ( type == T_LONG || type == T_DOUBLE ) ? long_value_offset :
695                                                    value_offset;
696  }
697
698  // Debugging
699  friend class JavaClasses;
700};
701
702
703
704// Interface to java.lang.ref.Reference objects
705
706class java_lang_ref_Reference: AllStatic {
707 public:
708  enum {
709   hc_referent_offset   = 0,
710   hc_queue_offset      = 1,
711   hc_next_offset       = 2,
712   hc_discovered_offset = 3  // Is not last, see SoftRefs.
713  };
714  enum {
715   hc_static_lock_offset    = 0,
716   hc_static_pending_offset = 1
717  };
718
719  static int referent_offset;
720  static int queue_offset;
721  static int next_offset;
722  static int discovered_offset;
723  static int static_lock_offset;
724  static int static_pending_offset;
725  static int number_of_fake_oop_fields;
726
727  // Accessors
728  static oop referent(oop ref) {
729    return ref->obj_field(referent_offset);
730  }
731  static void set_referent(oop ref, oop value) {
732    ref->obj_field_put(referent_offset, value);
733  }
734  static void set_referent_raw(oop ref, oop value) {
735    ref->obj_field_raw_put(referent_offset, value);
736  }
737  static HeapWord* referent_addr(oop ref) {
738    return ref->obj_field_addr<HeapWord>(referent_offset);
739  }
740  static oop next(oop ref) {
741    return ref->obj_field(next_offset);
742  }
743  static void set_next(oop ref, oop value) {
744    ref->obj_field_put(next_offset, value);
745  }
746  static void set_next_raw(oop ref, oop value) {
747    ref->obj_field_raw_put(next_offset, value);
748  }
749  static HeapWord* next_addr(oop ref) {
750    return ref->obj_field_addr<HeapWord>(next_offset);
751  }
752  static oop discovered(oop ref) {
753    return ref->obj_field(discovered_offset);
754  }
755  static void set_discovered(oop ref, oop value) {
756    ref->obj_field_put(discovered_offset, value);
757  }
758  static void set_discovered_raw(oop ref, oop value) {
759    ref->obj_field_raw_put(discovered_offset, value);
760  }
761  static HeapWord* discovered_addr(oop ref) {
762    return ref->obj_field_addr<HeapWord>(discovered_offset);
763  }
764  // Accessors for statics
765  static oop  pending_list_lock();
766  static oop  pending_list();
767
768  static HeapWord*  pending_list_addr();
769};
770
771
772// Interface to java.lang.ref.SoftReference objects
773
774class java_lang_ref_SoftReference: public java_lang_ref_Reference {
775 public:
776  enum {
777   // The timestamp is a long field and may need to be adjusted for alignment.
778   hc_timestamp_offset  = hc_discovered_offset + 1
779  };
780  enum {
781   hc_static_clock_offset = 0
782  };
783
784  static int timestamp_offset;
785  static int static_clock_offset;
786
787  // Accessors
788  static jlong timestamp(oop ref);
789
790  // Accessors for statics
791  static jlong clock();
792  static void set_clock(jlong value);
793};
794
795
796// Interface to java.dyn.MethodHandle objects
797
798class MethodHandleEntry;
799
800class java_dyn_MethodHandle: AllStatic {
801  friend class JavaClasses;
802
803 private:
804  static int _vmentry_offset;           // assembly code trampoline for MH
805  static int _vmtarget_offset;          // class-specific target reference
806  static int _type_offset;              // the MethodType of this MH
807  static int _vmslots_offset;           // OPTIONAL hoisted type.form.vmslots
808
809  static void compute_offsets();
810
811 public:
812  // Accessors
813  static oop            type(oop mh);
814  static void       set_type(oop mh, oop mtype);
815
816  static oop            vmtarget(oop mh);
817  static void       set_vmtarget(oop mh, oop target);
818
819  static MethodHandleEntry* vmentry(oop mh);
820  static void       set_vmentry(oop mh, MethodHandleEntry* data);
821
822  static int            vmslots(oop mh);
823  static void      init_vmslots(oop mh);
824  static int    compute_vmslots(oop mh);
825
826  // Testers
827  static bool is_subclass(klassOop klass) {
828    return Klass::cast(klass)->is_subclass_of(SystemDictionary::MethodHandle_klass());
829  }
830  static bool is_instance(oop obj) {
831    return obj != NULL && is_subclass(obj->klass());
832  }
833
834  // Accessors for code generation:
835  static int type_offset_in_bytes()             { return _type_offset; }
836  static int vmtarget_offset_in_bytes()         { return _vmtarget_offset; }
837  static int vmentry_offset_in_bytes()          { return _vmentry_offset; }
838  static int vmslots_offset_in_bytes()          { return _vmslots_offset; }
839};
840
841class sun_dyn_DirectMethodHandle: public java_dyn_MethodHandle {
842  friend class JavaClasses;
843
844 private:
845  //         _vmtarget_offset;          // method   or class      or interface
846  static int _vmindex_offset;           // negative or vtable idx or itable idx
847  static void compute_offsets();
848
849 public:
850  // Accessors
851  static int            vmindex(oop mh);
852  static void       set_vmindex(oop mh, int index);
853
854  // Testers
855  static bool is_subclass(klassOop klass) {
856    return Klass::cast(klass)->is_subclass_of(SystemDictionary::DirectMethodHandle_klass());
857  }
858  static bool is_instance(oop obj) {
859    return obj != NULL && is_subclass(obj->klass());
860  }
861
862  // Accessors for code generation:
863  static int vmindex_offset_in_bytes()          { return _vmindex_offset; }
864};
865
866class sun_dyn_BoundMethodHandle: public java_dyn_MethodHandle {
867  friend class JavaClasses;
868
869 private:
870  static int _argument_offset;          // argument value bound into this MH
871  static int _vmargslot_offset;         // relevant argument slot (<= vmslots)
872  static void compute_offsets();
873
874public:
875  static oop            argument(oop mh);
876  static void       set_argument(oop mh, oop ref);
877
878  static jint           vmargslot(oop mh);
879  static void       set_vmargslot(oop mh, jint slot);
880
881  // Testers
882  static bool is_subclass(klassOop klass) {
883    return Klass::cast(klass)->is_subclass_of(SystemDictionary::BoundMethodHandle_klass());
884  }
885  static bool is_instance(oop obj) {
886    return obj != NULL && is_subclass(obj->klass());
887  }
888
889  static int argument_offset_in_bytes()         { return _argument_offset; }
890  static int vmargslot_offset_in_bytes()        { return _vmargslot_offset; }
891};
892
893class sun_dyn_AdapterMethodHandle: public sun_dyn_BoundMethodHandle {
894  friend class JavaClasses;
895
896 private:
897  static int _conversion_offset;        // type of conversion to apply
898  static void compute_offsets();
899
900 public:
901  static int            conversion(oop mh);
902  static void       set_conversion(oop mh, int conv);
903
904  // Testers
905  static bool is_subclass(klassOop klass) {
906    return Klass::cast(klass)->is_subclass_of(SystemDictionary::AdapterMethodHandle_klass());
907  }
908  static bool is_instance(oop obj) {
909    return obj != NULL && is_subclass(obj->klass());
910  }
911
912  // Relevant integer codes (keep these in synch. with MethodHandleNatives.Constants):
913  enum {
914    OP_RETYPE_ONLY   = 0x0, // no argument changes; straight retype
915    OP_RETYPE_RAW    = 0x1, // straight retype, trusted (void->int, Object->T)
916    OP_CHECK_CAST    = 0x2, // ref-to-ref conversion; requires a Class argument
917    OP_PRIM_TO_PRIM  = 0x3, // converts from one primitive to another
918    OP_REF_TO_PRIM   = 0x4, // unboxes a wrapper to produce a primitive
919    OP_PRIM_TO_REF   = 0x5, // boxes a primitive into a wrapper (NYI)
920    OP_SWAP_ARGS     = 0x6, // swap arguments (vminfo is 2nd arg)
921    OP_ROT_ARGS      = 0x7, // rotate arguments (vminfo is displaced arg)
922    OP_DUP_ARGS      = 0x8, // duplicates one or more arguments (at TOS)
923    OP_DROP_ARGS     = 0x9, // remove one or more argument slots
924    OP_COLLECT_ARGS  = 0xA, // combine one or more arguments into a varargs (NYI)
925    OP_SPREAD_ARGS   = 0xB, // expand in place a varargs array (of known size)
926    OP_FLYBY         = 0xC, // operate first on reified argument list (NYI)
927    OP_RICOCHET      = 0xD, // run an adapter chain on the return value (NYI)
928    CONV_OP_LIMIT    = 0xE, // limit of CONV_OP enumeration
929
930    CONV_OP_MASK     = 0xF00, // this nybble contains the conversion op field
931    CONV_VMINFO_MASK = 0x0FF, // LSB is reserved for JVM use
932    CONV_VMINFO_SHIFT     =  0, // position of bits in CONV_VMINFO_MASK
933    CONV_OP_SHIFT         =  8, // position of bits in CONV_OP_MASK
934    CONV_DEST_TYPE_SHIFT  = 12, // byte 2 has the adapter BasicType (if needed)
935    CONV_SRC_TYPE_SHIFT   = 16, // byte 2 has the source BasicType (if needed)
936    CONV_STACK_MOVE_SHIFT = 20, // high 12 bits give signed SP change
937    CONV_STACK_MOVE_MASK  = (1 << (32 - CONV_STACK_MOVE_SHIFT)) - 1
938  };
939
940  static int conversion_offset_in_bytes()       { return _conversion_offset; }
941};
942
943
944// Interface to sun.dyn.MemberName objects
945// (These are a private interface for Java code to query the class hierarchy.)
946
947class sun_dyn_MemberName: AllStatic {
948  friend class JavaClasses;
949
950 private:
951  // From java.dyn.MemberName:
952  //    private Class<?>   clazz;       // class in which the method is defined
953  //    private String     name;        // may be null if not yet materialized
954  //    private Object     type;        // may be null if not yet materialized
955  //    private int        flags;       // modifier bits; see reflect.Modifier
956  //    private Object     vmtarget;    // VM-specific target value
957  //    private int        vmindex;     // method index within class or interface
958  static int _clazz_offset;
959  static int _name_offset;
960  static int _type_offset;
961  static int _flags_offset;
962  static int _vmtarget_offset;
963  static int _vmindex_offset;
964
965  static void compute_offsets();
966
967 public:
968  // Accessors
969  static oop            clazz(oop mname);
970  static void       set_clazz(oop mname, oop clazz);
971
972  static oop            type(oop mname);
973  static void       set_type(oop mname, oop type);
974
975  static oop            name(oop mname);
976  static void       set_name(oop mname, oop name);
977
978  static int            flags(oop mname);
979  static void       set_flags(oop mname, int flags);
980
981  static int            modifiers(oop mname) { return (u2) flags(mname); }
982  static void       set_modifiers(oop mname, int mods)
983                                { set_flags(mname, (flags(mname) &~ (u2)-1) | (u2)mods); }
984
985  static oop            vmtarget(oop mname);
986  static void       set_vmtarget(oop mname, oop target);
987
988  static int            vmindex(oop mname);
989  static void       set_vmindex(oop mname, int index);
990
991  // Testers
992  static bool is_subclass(klassOop klass) {
993    return Klass::cast(klass)->is_subclass_of(SystemDictionary::MemberName_klass());
994  }
995  static bool is_instance(oop obj) {
996    return obj != NULL && is_subclass(obj->klass());
997  }
998
999  // Relevant integer codes (keep these in synch. with MethodHandleNatives.Constants):
1000  enum {
1001    MN_IS_METHOD           = 0x00010000, // method (not constructor)
1002    MN_IS_CONSTRUCTOR      = 0x00020000, // constructor
1003    MN_IS_FIELD            = 0x00040000, // field
1004    MN_IS_TYPE             = 0x00080000, // nested type
1005    MN_SEARCH_SUPERCLASSES = 0x00100000, // for MHN.getMembers
1006    MN_SEARCH_INTERFACES   = 0x00200000, // for MHN.getMembers
1007    VM_INDEX_UNINITIALIZED = -99
1008  };
1009
1010  // Accessors for code generation:
1011  static int clazz_offset_in_bytes()            { return _clazz_offset; }
1012  static int type_offset_in_bytes()             { return _type_offset; }
1013  static int name_offset_in_bytes()             { return _name_offset; }
1014  static int flags_offset_in_bytes()            { return _flags_offset; }
1015  static int vmtarget_offset_in_bytes()         { return _vmtarget_offset; }
1016  static int vmindex_offset_in_bytes()          { return _vmindex_offset; }
1017};
1018
1019
1020// Interface to java.dyn.MethodType objects
1021
1022class java_dyn_MethodType: AllStatic {
1023  friend class JavaClasses;
1024
1025 private:
1026  static int _rtype_offset;
1027  static int _ptypes_offset;
1028  static int _form_offset;
1029
1030  static void compute_offsets();
1031
1032 public:
1033  // Accessors
1034  static oop            rtype(oop mt);
1035  static objArrayOop    ptypes(oop mt);
1036  static oop            form(oop mt);
1037
1038  static oop            ptype(oop mt, int index);
1039  static int            ptype_count(oop mt);
1040
1041  static symbolOop      as_signature(oop mt, bool intern_if_not_found, TRAPS);
1042  static void           print_signature(oop mt, outputStream* st);
1043
1044  static bool is_instance(oop obj) {
1045    return obj != NULL && obj->klass() == SystemDictionary::MethodType_klass();
1046  }
1047
1048  // Accessors for code generation:
1049  static int rtype_offset_in_bytes()            { return _rtype_offset; }
1050  static int ptypes_offset_in_bytes()           { return _ptypes_offset; }
1051  static int form_offset_in_bytes()             { return _form_offset; }
1052};
1053
1054class java_dyn_MethodTypeForm: AllStatic {
1055  friend class JavaClasses;
1056
1057 private:
1058  static int _vmslots_offset;           // number of argument slots needed
1059  static int _erasedType_offset;        // erasedType = canonical MethodType
1060  static int _genericInvoker_offset;    // genericInvoker = adapter for invokeGeneric
1061
1062  static void compute_offsets();
1063
1064 public:
1065  // Accessors
1066  static int            vmslots(oop mtform);
1067  static oop            erasedType(oop mtform);
1068  static oop            genericInvoker(oop mtform);
1069
1070  // Accessors for code generation:
1071  static int vmslots_offset_in_bytes()          { return _vmslots_offset; }
1072  static int erasedType_offset_in_bytes()       { return _erasedType_offset; }
1073  static int genericInvoker_offset_in_bytes()   { return _genericInvoker_offset; }
1074};
1075
1076
1077// Interface to java.dyn.CallSite objects
1078
1079class java_dyn_CallSite: AllStatic {
1080  friend class JavaClasses;
1081
1082private:
1083  static int _target_offset;
1084  static int _caller_method_offset;
1085  static int _caller_bci_offset;
1086
1087  static void compute_offsets();
1088
1089public:
1090  // Accessors
1091  static oop            target(oop site);
1092  static void       set_target(oop site, oop target);
1093
1094  static oop            caller_method(oop site);
1095  static void       set_caller_method(oop site, oop ref);
1096
1097  static jint           caller_bci(oop site);
1098  static void       set_caller_bci(oop site, jint bci);
1099
1100  // Testers
1101  static bool is_subclass(klassOop klass) {
1102    return Klass::cast(klass)->is_subclass_of(SystemDictionary::CallSite_klass());
1103  }
1104  static bool is_instance(oop obj) {
1105    return obj != NULL && is_subclass(obj->klass());
1106  }
1107
1108  // Accessors for code generation:
1109  static int target_offset_in_bytes()           { return _target_offset; }
1110  static int caller_method_offset_in_bytes()    { return _caller_method_offset; }
1111  static int caller_bci_offset_in_bytes()       { return _caller_bci_offset; }
1112};
1113
1114
1115// Interface to java.security.AccessControlContext objects
1116
1117class java_security_AccessControlContext: AllStatic {
1118 private:
1119  // Note that for this class the layout changed between JDK1.2 and JDK1.3,
1120  // so we compute the offsets at startup rather than hard-wiring them.
1121  static int _context_offset;
1122  static int _privilegedContext_offset;
1123  static int _isPrivileged_offset;
1124
1125  static void compute_offsets();
1126 public:
1127  static oop create(objArrayHandle context, bool isPrivileged, Handle privileged_context, TRAPS);
1128
1129  // Debugging/initialization
1130  friend class JavaClasses;
1131};
1132
1133
1134// Interface to java.lang.ClassLoader objects
1135
1136class java_lang_ClassLoader : AllStatic {
1137 private:
1138  enum {
1139   hc_parent_offset = 0
1140  };
1141
1142  static int parent_offset;
1143
1144 public:
1145  static oop parent(oop loader);
1146
1147  static bool is_trusted_loader(oop loader);
1148
1149  // Fix for 4474172
1150  static oop  non_reflection_class_loader(oop loader);
1151
1152  // Debugging
1153  friend class JavaClasses;
1154};
1155
1156
1157// Interface to java.lang.System objects
1158
1159class java_lang_System : AllStatic {
1160 private:
1161  enum {
1162   hc_static_in_offset  = 0,
1163   hc_static_out_offset = 1,
1164   hc_static_err_offset = 2
1165  };
1166
1167  static int offset_of_static_fields;
1168  static int  static_in_offset;
1169  static int static_out_offset;
1170  static int static_err_offset;
1171
1172  static void compute_offsets();
1173
1174 public:
1175  static int  in_offset_in_bytes();
1176  static int out_offset_in_bytes();
1177  static int err_offset_in_bytes();
1178
1179  // Debugging
1180  friend class JavaClasses;
1181};
1182
1183
1184// Interface to java.lang.StackTraceElement objects
1185
1186class java_lang_StackTraceElement: AllStatic {
1187 private:
1188  enum {
1189    hc_declaringClass_offset  = 0,
1190    hc_methodName_offset = 1,
1191    hc_fileName_offset   = 2,
1192    hc_lineNumber_offset = 3
1193  };
1194
1195  static int declaringClass_offset;
1196  static int methodName_offset;
1197  static int fileName_offset;
1198  static int lineNumber_offset;
1199
1200 public:
1201  // Setters
1202  static void set_declaringClass(oop element, oop value);
1203  static void set_methodName(oop element, oop value);
1204  static void set_fileName(oop element, oop value);
1205  static void set_lineNumber(oop element, int value);
1206
1207  // Create an instance of StackTraceElement
1208  static oop create(methodHandle m, int bci, TRAPS);
1209
1210  // Debugging
1211  friend class JavaClasses;
1212};
1213
1214
1215// Interface to java.lang.AssertionStatusDirectives objects
1216
1217class java_lang_AssertionStatusDirectives: AllStatic {
1218 private:
1219  enum {
1220    hc_classes_offset,
1221    hc_classEnabled_offset,
1222    hc_packages_offset,
1223    hc_packageEnabled_offset,
1224    hc_deflt_offset
1225  };
1226
1227  static int classes_offset;
1228  static int classEnabled_offset;
1229  static int packages_offset;
1230  static int packageEnabled_offset;
1231  static int deflt_offset;
1232
1233 public:
1234  // Setters
1235  static void set_classes(oop obj, oop val);
1236  static void set_classEnabled(oop obj, oop val);
1237  static void set_packages(oop obj, oop val);
1238  static void set_packageEnabled(oop obj, oop val);
1239  static void set_deflt(oop obj, bool val);
1240  // Debugging
1241  friend class JavaClasses;
1242};
1243
1244
1245class java_nio_Buffer: AllStatic {
1246 private:
1247  static int _limit_offset;
1248
1249 public:
1250  static int  limit_offset();
1251  static void compute_offsets();
1252};
1253
1254class sun_misc_AtomicLongCSImpl: AllStatic {
1255 private:
1256  static int _value_offset;
1257
1258 public:
1259  static int  value_offset();
1260  static void compute_offsets();
1261};
1262
1263class java_util_concurrent_locks_AbstractOwnableSynchronizer : AllStatic {
1264 private:
1265  static int  _owner_offset;
1266 public:
1267  static void initialize(TRAPS);
1268  static oop  get_owner_threadObj(oop obj);
1269};
1270
1271// Interface to hard-coded offset checking
1272
1273class JavaClasses : AllStatic {
1274 private:
1275  static bool check_offset(const char *klass_name, int offset, const char *field_name, const char* field_sig) PRODUCT_RETURN0;
1276  static bool check_static_offset(const char *klass_name, int hardcoded_offset, const char *field_name, const char* field_sig) PRODUCT_RETURN0;
1277  static bool check_constant(const char *klass_name, int constant, const char *field_name, const char* field_sig) PRODUCT_RETURN0;
1278 public:
1279  static void compute_hard_coded_offsets();
1280  static void compute_offsets();
1281  static void check_offsets() PRODUCT_RETURN;
1282};
1283
1284#endif // SHARE_VM_CLASSFILE_JAVACLASSES_HPP
1285