hotspot/src/share/vm/oops/instanceKlass.hpp
author johnc
Thu, 07 Apr 2011 09:53:20 -0700
changeset 9176 42d9d1010f38
parent 8725 8c1e3dd5fe1b
child 9179 6db9c9dffe1f
permissions -rw-r--r--
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer. Reviewed-by: kvn, iveresov, never, tonyp, dholmes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
8297
f05d10c1c4b8 7014851: Remove unused parallel compaction code
stefank
parents: 8076
diff changeset
     2
 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4584
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4584
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4584
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    25
#ifndef SHARE_VM_OOPS_INSTANCEKLASS_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    26
#define SHARE_VM_OOPS_INSTANCEKLASS_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    28
#include "oops/constMethodOop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    29
#include "oops/constantPoolOop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    30
#include "oops/instanceOop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    31
#include "oops/klassOop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    32
#include "oops/klassVtable.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    33
#include "oops/objArrayOop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    34
#include "runtime/handles.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    35
#include "runtime/os.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    36
#include "utilities/accessFlags.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    37
#include "utilities/bitMap.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    38
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
// An instanceKlass is the VM level representation of a Java class.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
// It contains all information needed for at class at execution runtime.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
//  instanceKlass layout:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
//    [header                     ] klassOop
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
//    [klass pointer              ] klassOop
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
//    [C++ vtbl pointer           ] Klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
//    [subtype cache              ] Klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
//    [instance size              ] Klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
//    [java mirror                ] Klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
//    [super                      ] Klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
//    [access_flags               ] Klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
//    [name                       ] Klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
//    [first subklass             ] Klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
//    [next sibling               ] Klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
//    [array klasses              ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
//    [methods                    ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
//    [local interfaces           ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
//    [transitive interfaces      ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
//    [number of implementors     ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
//    [implementors               ] klassOop[2]
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
//    [fields                     ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
//    [constants                  ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
//    [class loader               ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
//    [protection domain          ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
//    [signers                    ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
//    [source file name           ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
//    [inner classes              ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
//    [static field size          ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
//    [nonstatic field size       ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
//    [static oop fields size     ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
//    [nonstatic oop maps size    ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
//    [has finalize method        ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
//    [deoptimization mark bit    ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
//    [initialization state       ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
//    [initializing thread        ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
//    [Java vtable length         ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
//    [oop map cache (stack maps) ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
//    [EMBEDDED Java vtable             ] size in words = vtable_len
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
//    [EMBEDDED nonstatic oop-map blocks] size in words = nonstatic_oop_map_size
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
//    The embedded nonstatic oop-map blocks are short pairs (offset, length) indicating
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
//    where oops are located in instances of this klass.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
// forward declaration for class -- see below for definition
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
class SuperTypeClosure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
class JNIid;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
class jniIdMapBase;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
class BreakpointInfo;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
class fieldDescriptor;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
class DepChange;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
class nmethodBucket;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
class PreviousVersionNode;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
class JvmtiCachedClassFieldMap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
// This is used in iterators below.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
class FieldClosure: public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  virtual void do_field(fieldDescriptor* fd) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
// Print fields.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
// If "obj" argument to constructor is NULL, prints static fields, otherwise prints non-static fields.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
class FieldPrinter: public FieldClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
   oop _obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
   outputStream* _st;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
   FieldPrinter(outputStream* st, oop obj = NULL) : _obj(obj), _st(st) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
   void do_field(fieldDescriptor* fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
#endif  // !PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
3693
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   113
// ValueObjs embedded in klass. Describes where oops are located in instances of
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   114
// this klass.
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   115
class OopMapBlock VALUE_OBJ_CLASS_SPEC {
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   116
 public:
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   117
  // Byte offset of the first oop mapped by this block.
3694
942b7bc7f28c 6845368: large objects cause a crash or unexpected exception
jcoomes
parents: 3693
diff changeset
   118
  int offset() const          { return _offset; }
942b7bc7f28c 6845368: large objects cause a crash or unexpected exception
jcoomes
parents: 3693
diff changeset
   119
  void set_offset(int offset) { _offset = offset; }
3693
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   120
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   121
  // Number of oops in this block.
3694
942b7bc7f28c 6845368: large objects cause a crash or unexpected exception
jcoomes
parents: 3693
diff changeset
   122
  uint count() const         { return _count; }
942b7bc7f28c 6845368: large objects cause a crash or unexpected exception
jcoomes
parents: 3693
diff changeset
   123
  void set_count(uint count) { _count = count; }
3693
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   124
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   125
  // sizeof(OopMapBlock) in HeapWords.
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   126
  static const int size_in_words() {
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   127
    return align_size_up(int(sizeof(OopMapBlock)), HeapWordSize) >>
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   128
      LogHeapWordSize;
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   129
  }
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   130
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   131
 private:
3694
942b7bc7f28c 6845368: large objects cause a crash or unexpected exception
jcoomes
parents: 3693
diff changeset
   132
  int  _offset;
942b7bc7f28c 6845368: large objects cause a crash or unexpected exception
jcoomes
parents: 3693
diff changeset
   133
  uint _count;
3693
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   134
};
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   135
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
class instanceKlass: public Klass {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  friend class VMStructs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  // See "The Java Virtual Machine Specification" section 2.16.2-5 for a detailed description
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  // of the class loading & initialization procedure, and the use of the states.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  enum ClassState {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
    unparsable_by_gc = 0,               // object is not yet parsable by gc. Value of _init_state at object allocation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
    allocated,                          // allocated (but not yet linked)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
    loaded,                             // loaded and inserted in class hierarchy (but not linked yet)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
    linked,                             // successfully linked/verified (but not initialized yet)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
    being_initialized,                  // currently running class initializer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
    fully_initialized,                  // initialized (successfull final state)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
    initialization_error                // error happened during initialization
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  oop* oop_block_beg() const { return adr_array_klasses(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  oop* oop_block_end() const { return adr_methods_default_annotations() + 1; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  enum {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
    implementors_limit = 2              // how many implems can we track?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  // The oop block.  See comment in klass.hpp before making changes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  // Array classes holding elements of this class.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  klassOop        _array_klasses;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  // Method array.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  objArrayOop     _methods;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  // Int array containing the original order of method in the class file (for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  // JVMTI).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  typeArrayOop    _method_ordering;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  // Interface (klassOops) this class declares locally to implement.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  objArrayOop     _local_interfaces;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  // Interface (klassOops) this class implements transitively.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  objArrayOop     _transitive_interfaces;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  // Instance and static variable information, 5-tuples of shorts [access, name
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  // index, sig index, initval index, offset].
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  typeArrayOop    _fields;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  // Constant pool for this class.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  constantPoolOop _constants;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  // Class loader used to load this class, NULL if VM loader used.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  oop             _class_loader;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  // Protection domain.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  oop             _protection_domain;
1550
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   184
  // Host class, which grants its access privileges to this class also.
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   185
  // This is only non-null for an anonymous class (AnonymousClasses enabled).
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   186
  // The host class is either named, or a previously loaded anonymous class.
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   187
  klassOop        _host_klass;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  // Class signers.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  objArrayOop     _signers;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  // inner_classes attribute.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  typeArrayOop    _inner_classes;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  // Implementors of this interface (not valid if it overflows)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  klassOop        _implementors[implementors_limit];
8676
9098d4e927e1 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 8675
diff changeset
   194
  // invokedynamic bootstrap method (a java.lang.invoke.MethodHandle)
8675
e9fef2a9bef7 6839872: remove implementation inheritance from JSR 292 APIs
jrose
parents: 8297
diff changeset
   195
  oop             _bootstrap_method;  // AllowTransitionalJSR292 ONLY
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  // Annotations for this class, or null if none.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  typeArrayOop    _class_annotations;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  // Annotation objects (byte arrays) for fields, or null if no annotations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  // Indices correspond to entries (not indices) in fields array.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  objArrayOop     _fields_annotations;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  // Annotation objects (byte arrays) for methods, or null if no annotations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  // Index is the idnum, which is initially the same as the methods array index.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  objArrayOop     _methods_annotations;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  // Annotation objects (byte arrays) for methods' parameters, or null if no
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  // such annotations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  // Index is the idnum, which is initially the same as the methods array index.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  objArrayOop     _methods_parameter_annotations;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  // Annotation objects (byte arrays) for methods' default values, or null if no
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  // such annotations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  // Index is the idnum, which is initially the same as the methods array index.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  objArrayOop     _methods_default_annotations;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  // End of the oop block.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   217
  // Name of source file containing this klass, NULL if not specified.
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   218
  Symbol*         _source_file_name;
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   219
  // the source debug extension for this klass, NULL if not specified.
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   220
  Symbol*         _source_debug_extension;
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   221
  // Generic signature, or null if none.
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   222
  Symbol*         _generic_signature;
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   223
  // Array name derived from this class which needs unreferencing
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   224
  // if this class is unloaded.
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   225
  Symbol*         _array_name;
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   226
591
04d2e26e6d69 6703888: Compressed Oops: use the 32-bits gap after klass in a object
kvn
parents: 360
diff changeset
   227
  // Number of heapOopSize words used by non-static fields in this klass
04d2e26e6d69 6703888: Compressed Oops: use the 32-bits gap after klass in a object
kvn
parents: 360
diff changeset
   228
  // (including inherited fields but after header_size()).
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 222
diff changeset
   229
  int             _nonstatic_field_size;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 222
diff changeset
   230
  int             _static_field_size;    // number words used by static fields (oop and non-oop) in this klass
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8676
diff changeset
   231
  int             _static_oop_field_count;// number of static oop fields in this klass
3693
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   232
  int             _nonstatic_oop_map_size;// size in words of nonstatic oop map blocks
3822
388b0393a042 6879572: SA fails _is_marked_dependent not found
acorn
parents: 3821
diff changeset
   233
  bool            _is_marked_dependent;  // used for marking during flushing and deoptimization
388b0393a042 6879572: SA fails _is_marked_dependent not found
acorn
parents: 3821
diff changeset
   234
  bool            _rewritten;            // methods rewritten.
388b0393a042 6879572: SA fails _is_marked_dependent not found
acorn
parents: 3821
diff changeset
   235
  bool            _has_nonstatic_fields; // for sizing with UseCompressedOops
388b0393a042 6879572: SA fails _is_marked_dependent not found
acorn
parents: 3821
diff changeset
   236
  bool            _should_verify_class;  // allow caching of preverification
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  u2              _minor_version;        // minor version number of class file
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  u2              _major_version;        // major version number of class file
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  ClassState      _init_state;           // state of class
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  Thread*         _init_thread;          // Pointer to current thread doing initialization (to handle recusive initialization)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  int             _vtable_len;           // length of Java vtable (in words)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  int             _itable_len;           // length of Java itable (in words)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  ReferenceType   _reference_type;       // reference type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  OopMapCache*    volatile _oop_map_cache;   // OopMapCache for all methods in the klass (allocated lazily)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  JNIid*          _jni_ids;              // First JNI identifier for static fields in this class
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  jmethodID*      _methods_jmethod_ids;  // jmethodIDs corresponding to method_idnum, or NULL if none
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  int*            _methods_cached_itable_indices;  // itable_index cache for JNI invoke corresponding to methods idnum, or NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  nmethodBucket*  _dependencies;         // list of dependent nmethods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  nmethod*        _osr_nmethods_head;    // Head of list of on-stack replacement nmethods for this class
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  BreakpointInfo* _breakpoints;          // bpt lists, managed by methodOop
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  int             _nof_implementors;     // No of implementors of this interface (zero if not an interface)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  // Array of interesting part(s) of the previous version(s) of this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  // instanceKlass. See PreviousVersionWalker below.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  GrowableArray<PreviousVersionNode *>* _previous_versions;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  u2              _enclosing_method_class_index;  // Constant pool index for class of enclosing method, or 0 if none
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  u2              _enclosing_method_method_index; // Constant pool index for name and type of enclosing method, or 0 if none
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  // JVMTI fields can be moved to their own structure - see 6315920
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  unsigned char * _cached_class_file_bytes;       // JVMTI: cached class file, before retransformable agent modified it in CFLH
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  jint            _cached_class_file_len;         // JVMTI: length of above
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  JvmtiCachedClassFieldMap* _jvmti_cached_class_field_map;  // JVMTI: used during heap iteration
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  volatile u2     _idnum_allocated_count;         // JNI/JVMTI: increments with the addition of methods, old ids don't change
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  // embedded Java vtable follows here
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  // embedded Java itables follows here
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  // embedded static fields follows here
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  // embedded nonstatic oop-map blocks follows here
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  friend class instanceKlassKlass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  friend class SystemDictionary;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
 public:
3822
388b0393a042 6879572: SA fails _is_marked_dependent not found
acorn
parents: 3821
diff changeset
   272
  bool has_nonstatic_fields() const        { return _has_nonstatic_fields; }
388b0393a042 6879572: SA fails _is_marked_dependent not found
acorn
parents: 3821
diff changeset
   273
  void set_has_nonstatic_fields(bool b)    { _has_nonstatic_fields = b; }
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 222
diff changeset
   274
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  // field sizes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  int nonstatic_field_size() const         { return _nonstatic_field_size; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  void set_nonstatic_field_size(int size)  { _nonstatic_field_size = size; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  int static_field_size() const            { return _static_field_size; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  void set_static_field_size(int size)     { _static_field_size = size; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8676
diff changeset
   282
  int static_oop_field_count() const        { return _static_oop_field_count; }
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8676
diff changeset
   283
  void set_static_oop_field_count(int size) { _static_oop_field_count = size; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  // Java vtable
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  int  vtable_length() const               { return _vtable_len; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  void set_vtable_length(int len)          { _vtable_len = len; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  // Java itable
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  int  itable_length() const               { return _itable_len; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  void set_itable_length(int len)          { _itable_len = len; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  // array klasses
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  klassOop array_klasses() const           { return _array_klasses; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  void set_array_klasses(klassOop k)       { oop_store_without_check((oop*) &_array_klasses, (oop) k); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  // methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  objArrayOop methods() const              { return _methods; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  void set_methods(objArrayOop a)          { oop_store_without_check((oop*) &_methods, (oop) a); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  methodOop method_with_idnum(int idnum);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  // method ordering
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  typeArrayOop method_ordering() const     { return _method_ordering; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  void set_method_ordering(typeArrayOop m) { oop_store_without_check((oop*) &_method_ordering, (oop) m); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  // interfaces
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  objArrayOop local_interfaces() const          { return _local_interfaces; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  void set_local_interfaces(objArrayOop a)      { oop_store_without_check((oop*) &_local_interfaces, (oop) a); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  objArrayOop transitive_interfaces() const     { return _transitive_interfaces; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  void set_transitive_interfaces(objArrayOop a) { oop_store_without_check((oop*) &_transitive_interfaces, (oop) a); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  // fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  // Field info extracted from the class file and stored
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
  // as an array of 7 shorts
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
  enum FieldOffset {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
    access_flags_offset    = 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
    name_index_offset      = 1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
    signature_index_offset = 2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
    initval_index_offset   = 3,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
    low_offset             = 4,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
    high_offset            = 5,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
    generic_signature_offset = 6,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
    next_offset            = 7
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  typeArrayOop fields() const              { return _fields; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  int offset_from_fields( int index ) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
    return build_int_from_shorts( fields()->ushort_at(index + low_offset),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
                                  fields()->ushort_at(index + high_offset) );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  void set_fields(typeArrayOop f)          { oop_store_without_check((oop*) &_fields, (oop) f); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
  // inner classes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
  typeArrayOop inner_classes() const       { return _inner_classes; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
  void set_inner_classes(typeArrayOop f)   { oop_store_without_check((oop*) &_inner_classes, (oop) f); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  enum InnerClassAttributeOffset {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
    // From http://mirror.eng/products/jdk/1.1/docs/guide/innerclasses/spec/innerclasses.doc10.html#18814
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
    inner_class_inner_class_info_offset = 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
    inner_class_outer_class_info_offset = 1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
    inner_class_inner_name_offset = 2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
    inner_class_access_flags_offset = 3,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
    inner_class_next_offset = 4
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
2264
55d0115a54fe 4766230: Hotspot vtable inconsistencies cause core dumps. 6579515. 6582242.
acorn
parents: 1550
diff changeset
   347
  // method override check
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   348
  bool is_override(methodHandle super_method, Handle targetclassloader, Symbol* targetclassname, TRAPS);
2264
55d0115a54fe 4766230: Hotspot vtable inconsistencies cause core dumps. 6579515. 6582242.
acorn
parents: 1550
diff changeset
   349
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
  // package
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  bool is_same_class_package(klassOop class2);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   352
  bool is_same_class_package(oop classloader2, Symbol* classname2);
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   353
  static bool is_same_class_package(oop class_loader1, Symbol* class_name1, oop class_loader2, Symbol* class_name2);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 1550
diff changeset
   355
  // find an enclosing class (defined where original code was, in jvm.cpp!)
4496
c5a0b15a8e7d 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 4094
diff changeset
   356
  klassOop compute_enclosing_class(bool* inner_is_member, TRAPS) {
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 1550
diff changeset
   357
    instanceKlassHandle self(THREAD, this->as_klassOop());
4496
c5a0b15a8e7d 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 4094
diff changeset
   358
    return compute_enclosing_class_impl(self, inner_is_member, THREAD);
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 1550
diff changeset
   359
  }
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 1550
diff changeset
   360
  static klassOop compute_enclosing_class_impl(instanceKlassHandle self,
4496
c5a0b15a8e7d 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 4094
diff changeset
   361
                                               bool* inner_is_member, TRAPS);
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 1550
diff changeset
   362
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 1550
diff changeset
   363
  // tell if two classes have the same enclosing class (at package level)
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 1550
diff changeset
   364
  bool is_same_package_member(klassOop class2, TRAPS) {
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 1550
diff changeset
   365
    instanceKlassHandle self(THREAD, this->as_klassOop());
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 1550
diff changeset
   366
    return is_same_package_member_impl(self, class2, THREAD);
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 1550
diff changeset
   367
  }
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 1550
diff changeset
   368
  static bool is_same_package_member_impl(instanceKlassHandle self,
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 1550
diff changeset
   369
                                          klassOop class2, TRAPS);
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 1550
diff changeset
   370
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  // initialization state
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
  bool is_loaded() const                   { return _init_state >= loaded; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  bool is_linked() const                   { return _init_state >= linked; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
  bool is_initialized() const              { return _init_state == fully_initialized; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
  bool is_not_initialized() const          { return _init_state <  being_initialized; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
  bool is_being_initialized() const        { return _init_state == being_initialized; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
  bool is_in_error_state() const           { return _init_state == initialization_error; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  bool is_reentrant_initialization(Thread *thread)  { return thread == _init_thread; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  int  get_init_state()                    { return _init_state; } // Useful for debugging
3822
388b0393a042 6879572: SA fails _is_marked_dependent not found
acorn
parents: 3821
diff changeset
   380
  bool is_rewritten() const                { return _rewritten; }
3820
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 2570
diff changeset
   381
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 2570
diff changeset
   382
  // defineClass specified verification
3822
388b0393a042 6879572: SA fails _is_marked_dependent not found
acorn
parents: 3821
diff changeset
   383
  bool should_verify_class() const         { return _should_verify_class; }
388b0393a042 6879572: SA fails _is_marked_dependent not found
acorn
parents: 3821
diff changeset
   384
  void set_should_verify_class(bool value) { _should_verify_class = value; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  // marking
3822
388b0393a042 6879572: SA fails _is_marked_dependent not found
acorn
parents: 3821
diff changeset
   387
  bool is_marked_dependent() const         { return _is_marked_dependent; }
388b0393a042 6879572: SA fails _is_marked_dependent not found
acorn
parents: 3821
diff changeset
   388
  void set_is_marked_dependent(bool value) { _is_marked_dependent = value; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
  // initialization (virtuals from Klass)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  bool should_be_initialized() const;  // means that initialize should be called
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
  void initialize(TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
  void link_class(TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
  bool link_class_or_fail(TRAPS); // returns false on failure
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  void unlink_class();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
  void rewrite_class(TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
  methodOop class_initializer();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  // set the class to initialized if no static initializer is present
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  void eager_initialize(Thread *thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  // reference type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
  ReferenceType reference_type() const     { return _reference_type; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  void set_reference_type(ReferenceType t) { _reference_type = t; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
9176
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   406
  static int reference_type_offset_in_bytes() { return offset_of(instanceKlass, _reference_type); }
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   407
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  // find local field, returns true if found
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   409
  bool find_local_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  // find field in direct superinterfaces, returns the interface in which the field is defined
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   411
  klassOop find_interface_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  // find field according to JVM spec 5.4.3.2, returns the klass in which the field is defined
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   413
  klassOop find_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
  // find instance or static fields according to JVM spec 5.4.3.2, returns the klass in which the field is defined
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   415
  klassOop find_field(Symbol* name, Symbol* sig, bool is_static, fieldDescriptor* fd) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  // find a non-static or static field given its offset within the class.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  bool contains_field_offset(int offset) {
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 222
diff changeset
   419
    return instanceOopDesc::contains_field_offset(offset, nonstatic_field_size());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  bool find_local_field_from_offset(int offset, bool is_static, fieldDescriptor* fd) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
  bool find_field_from_offset(int offset, bool is_static, fieldDescriptor* fd) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
  // find a local method (returns NULL if not found)
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   426
  methodOop find_method(Symbol* name, Symbol* signature) const;
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   427
  static methodOop find_method(objArrayOop methods, Symbol* name, Symbol* signature);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  // lookup operation (returns NULL if not found)
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   430
  methodOop uncached_lookup_method(Symbol* name, Symbol* signature) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  // lookup a method in all the interfaces that this class implements
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
  // (returns NULL if not found)
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   434
  methodOop lookup_method_in_all_interfaces(Symbol* name, Symbol* signature) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
  // constant pool
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  constantPoolOop constants() const        { return _constants; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
  void set_constants(constantPoolOop c)    { oop_store_without_check((oop*) &_constants, (oop) c); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
  // class loader
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  oop class_loader() const                 { return _class_loader; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
  void set_class_loader(oop l)             { oop_store((oop*) &_class_loader, l); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
  // protection domain
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  oop protection_domain()                  { return _protection_domain; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  void set_protection_domain(oop pd)       { oop_store((oop*) &_protection_domain, pd); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
1550
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   448
  // host class
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   449
  oop host_klass() const                   { return _host_klass; }
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   450
  void set_host_klass(oop host)            { oop_store((oop*) &_host_klass, host); }
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   451
  bool is_anonymous() const                { return _host_klass != NULL; }
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   452
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
  // signers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
  objArrayOop signers() const              { return _signers; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
  void set_signers(objArrayOop s)          { oop_store((oop*) &_signers, oop(s)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
  // source file name
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   458
  Symbol* source_file_name() const         { return _source_file_name; }
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   459
  void set_source_file_name(Symbol* n);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
  // minor and major version numbers of class file
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
  u2 minor_version() const                 { return _minor_version; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
  void set_minor_version(u2 minor_version) { _minor_version = minor_version; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
  u2 major_version() const                 { return _major_version; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
  void set_major_version(u2 major_version) { _major_version = major_version; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  // source debug extension
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   468
  Symbol* source_debug_extension() const   { return _source_debug_extension; }
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   469
  void set_source_debug_extension(Symbol* n);
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   470
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   471
  // symbol unloading support (refcount already added)
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   472
  Symbol* array_name()                     { return _array_name; }
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   473
  void set_array_name(Symbol* name)        { assert(_array_name == NULL, "name already created"); _array_name = name; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
  // nonstatic oop-map blocks
3694
942b7bc7f28c 6845368: large objects cause a crash or unexpected exception
jcoomes
parents: 3693
diff changeset
   476
  static int nonstatic_oop_map_size(unsigned int oop_map_count) {
3693
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   477
    return oop_map_count * OopMapBlock::size_in_words();
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   478
  }
3694
942b7bc7f28c 6845368: large objects cause a crash or unexpected exception
jcoomes
parents: 3693
diff changeset
   479
  unsigned int nonstatic_oop_map_count() const {
3693
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   480
    return _nonstatic_oop_map_size / OopMapBlock::size_in_words();
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   481
  }
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   482
  int nonstatic_oop_map_size() const { return _nonstatic_oop_map_size; }
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   483
  void set_nonstatic_oop_map_size(int words) {
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   484
    _nonstatic_oop_map_size = words;
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2570
diff changeset
   485
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
  // RedefineClasses() support for previous versions:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
  void add_previous_version(instanceKlassHandle ikh, BitMap *emcp_methods,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
         int emcp_method_count);
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3822
diff changeset
   490
  // If the _previous_versions array is non-NULL, then this klass
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3822
diff changeset
   491
  // has been redefined at least once even if we aren't currently
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3822
diff changeset
   492
  // tracking a previous version.
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3822
diff changeset
   493
  bool has_been_redefined() const { return _previous_versions != NULL; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
  bool has_previous_version() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
  void init_previous_versions() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
    _previous_versions = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  GrowableArray<PreviousVersionNode *>* previous_versions() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
    return _previous_versions;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
  // JVMTI: Support for caching a class file before it is modified by an agent that can do retransformation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
  void set_cached_class_file(unsigned char *class_file_bytes,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
                             jint class_file_len)     { _cached_class_file_len = class_file_len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
                                                        _cached_class_file_bytes = class_file_bytes; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
  jint get_cached_class_file_len()                    { return _cached_class_file_len; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
  unsigned char * get_cached_class_file_bytes()       { return _cached_class_file_bytes; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
  // JVMTI: Support for caching of field indices, types, and offsets
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
  void set_jvmti_cached_class_field_map(JvmtiCachedClassFieldMap* descriptor) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
    _jvmti_cached_class_field_map = descriptor;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
  JvmtiCachedClassFieldMap* jvmti_cached_class_field_map() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
    return _jvmti_cached_class_field_map;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
  // for adding methods, constMethodOopDesc::UNSET_IDNUM means no more ids available
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
  inline u2 next_method_idnum();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
  void set_initial_method_idnum(u2 value)             { _idnum_allocated_count = value; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
  // generics support
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   522
  Symbol* generic_signature() const                   { return _generic_signature; }
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   523
  void set_generic_signature(Symbol* sig)             { _generic_signature = sig; }
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   524
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
  u2 enclosing_method_class_index() const             { return _enclosing_method_class_index; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
  u2 enclosing_method_method_index() const            { return _enclosing_method_method_index; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
  void set_enclosing_method_indices(u2 class_index,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
                                    u2 method_index)  { _enclosing_method_class_index  = class_index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
                                                        _enclosing_method_method_index = method_index; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2343
diff changeset
   531
  // JSR 292 support
8675
e9fef2a9bef7 6839872: remove implementation inheritance from JSR 292 APIs
jrose
parents: 8297
diff changeset
   532
  oop bootstrap_method() const                        { return _bootstrap_method; }  // AllowTransitionalJSR292 ONLY
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2343
diff changeset
   533
  void set_bootstrap_method(oop mh)                   { oop_store(&_bootstrap_method, mh); }
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2343
diff changeset
   534
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
  // jmethodID support
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3822
diff changeset
   536
  static jmethodID get_jmethod_id(instanceKlassHandle ik_h,
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3822
diff changeset
   537
                     methodHandle method_h);
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3822
diff changeset
   538
  static jmethodID get_jmethod_id_fetch_or_update(instanceKlassHandle ik_h,
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3822
diff changeset
   539
                     size_t idnum, jmethodID new_id, jmethodID* new_jmeths,
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3822
diff changeset
   540
                     jmethodID* to_dealloc_id_p,
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3822
diff changeset
   541
                     jmethodID** to_dealloc_jmeths_p);
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3822
diff changeset
   542
  static void get_jmethod_id_length_value(jmethodID* cache, size_t idnum,
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3822
diff changeset
   543
                size_t *length_p, jmethodID* id_p);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
  jmethodID jmethod_id_or_null(methodOop method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
  // cached itable index support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
  void set_cached_itable_index(size_t idnum, int index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
  int cached_itable_index(size_t idnum);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  // annotations support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  typeArrayOop class_annotations() const              { return _class_annotations; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  objArrayOop fields_annotations() const              { return _fields_annotations; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
  objArrayOop methods_annotations() const             { return _methods_annotations; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
  objArrayOop methods_parameter_annotations() const   { return _methods_parameter_annotations; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
  objArrayOop methods_default_annotations() const     { return _methods_default_annotations; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
  void set_class_annotations(typeArrayOop md)            { oop_store_without_check((oop*)&_class_annotations, (oop)md); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
  void set_fields_annotations(objArrayOop md)            { set_annotations(md, &_fields_annotations); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
  void set_methods_annotations(objArrayOop md)           { set_annotations(md, &_methods_annotations); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
  void set_methods_parameter_annotations(objArrayOop md) { set_annotations(md, &_methods_parameter_annotations); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
  void set_methods_default_annotations(objArrayOop md)   { set_annotations(md, &_methods_default_annotations); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
  typeArrayOop get_method_annotations_of(int idnum)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
                                                { return get_method_annotations_from(idnum, _methods_annotations); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
  typeArrayOop get_method_parameter_annotations_of(int idnum)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
                                                { return get_method_annotations_from(idnum, _methods_parameter_annotations); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
  typeArrayOop get_method_default_annotations_of(int idnum)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
                                                { return get_method_annotations_from(idnum, _methods_default_annotations); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
  void set_method_annotations_of(int idnum, typeArrayOop anno)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
                                                { set_methods_annotations_of(idnum, anno, &_methods_annotations); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
  void set_method_parameter_annotations_of(int idnum, typeArrayOop anno)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
                                                { set_methods_annotations_of(idnum, anno, &_methods_annotations); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
  void set_method_default_annotations_of(int idnum, typeArrayOop anno)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
                                                { set_methods_annotations_of(idnum, anno, &_methods_annotations); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
  // allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
  DEFINE_ALLOCATE_PERMANENT(instanceKlass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
  instanceOop allocate_instance(TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
  instanceOop allocate_permanent_instance(TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
  // additional member function to return a handle
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
  instanceHandle allocate_instance_handle(TRAPS)      { return instanceHandle(THREAD, allocate_instance(THREAD)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
  objArrayOop allocate_objArray(int n, int length, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
  // Helper function
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
  static instanceOop register_finalizer(instanceOop i, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
  // Check whether reflection/jni/jvm code is allowed to instantiate this class;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
  // if not, throw either an Error or an Exception.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
  virtual void check_valid_for_instantiation(bool throwError, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
  // initialization
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
  void call_class_initializer(TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
  void set_initialization_state_and_notify(ClassState state, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
  // OopMapCache support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
  OopMapCache* oop_map_cache()               { return _oop_map_cache; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
  void set_oop_map_cache(OopMapCache *cache) { _oop_map_cache = cache; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
  void mask_for(methodHandle method, int bci, InterpreterOopMap* entry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
  // JNI identifier support (for static fields - for jni performance)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
  JNIid* jni_ids()                               { return _jni_ids; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
  void set_jni_ids(JNIid* ids)                   { _jni_ids = ids; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
  JNIid* jni_id_for(int offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
  // maintenance of deoptimization dependencies
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
  int mark_dependent_nmethods(DepChange& changes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
  void add_dependent_nmethod(nmethod* nm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
  void remove_dependent_nmethod(nmethod* nm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
  // On-stack replacement support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
  nmethod* osr_nmethods_head() const         { return _osr_nmethods_head; };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
  void set_osr_nmethods_head(nmethod* h)     { _osr_nmethods_head = h; };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
  void add_osr_nmethod(nmethod* n);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
  void remove_osr_nmethod(nmethod* n);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6248
diff changeset
   614
  nmethod* lookup_osr_nmethod(const methodOop m, int bci, int level, bool match_level) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
  // Breakpoint support (see methods on methodOop for details)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
  BreakpointInfo* breakpoints() const       { return _breakpoints; };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
  void set_breakpoints(BreakpointInfo* bps) { _breakpoints = bps; };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
  // support for stub routines
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
  static int init_state_offset_in_bytes()    { return offset_of(instanceKlass, _init_state); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
  static int init_thread_offset_in_bytes()   { return offset_of(instanceKlass, _init_thread); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
  // subclass/subinterface checks
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
  bool implements_interface(klassOop k) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
  // Access to implementors of an interface. We only store the count
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
  // of implementors, and in case, there are only a few
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
  // implementors, we store them in a short list.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
  // This accessor returns NULL if we walk off the end of the list.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
  klassOop implementor(int i) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
    return (i < implementors_limit)? _implementors[i]: (klassOop) NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
  int  nof_implementors() const       { return _nof_implementors; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
  void add_implementor(klassOop k);  // k is a new class that implements this interface
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
  void init_implementor();           // initialize
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
  // link this class into the implementors list of every interface it implements
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
  void process_interfaces(Thread *thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
  // virtual operations from Klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
  bool is_leaf_class() const               { return _subklass == NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
  objArrayOop compute_secondary_supers(int num_extra_slots, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
  bool compute_is_subtype_of(klassOop k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
  bool can_be_primary_super_slow() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
  klassOop java_super() const              { return super(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
  int oop_size(oop obj)  const             { return size_helper(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
  int klass_oop_size() const               { return object_size(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
  bool oop_is_instance_slow() const        { return true; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
  // Iterators
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
  void do_local_static_fields(FieldClosure* cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
  void do_nonstatic_fields(FieldClosure* cl); // including inherited fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
  void do_local_static_fields(void f(fieldDescriptor*, TRAPS), TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
  void methods_do(void f(methodOop method));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
  void array_klasses_do(void f(klassOop k));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
  void with_array_klasses_do(void f(klassOop k));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
  bool super_types_do(SuperTypeClosure* blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
  // Casting from klassOop
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
  static instanceKlass* cast(klassOop k) {
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8676
diff changeset
   663
    assert(k->is_klass(), "must be");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
    Klass* kp = k->klass_part();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
    assert(kp->null_vtbl() || kp->oop_is_instance_slow(), "cast to instanceKlass");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
    return (instanceKlass*) kp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
  // Sizing (in words)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
  static int header_size()            { return align_object_offset(oopDesc::header_size() + sizeof(instanceKlass)/HeapWordSize); }
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8676
diff changeset
   671
  int object_size() const             { return object_size(align_object_offset(vtable_length()) + align_object_offset(itable_length()) + nonstatic_oop_map_size()); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
  static int vtable_start_offset()    { return header_size(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
  static int vtable_length_offset()   { return oopDesc::header_size() + offset_of(instanceKlass, _vtable_len) / HeapWordSize; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
  static int object_size(int extra)   { return align_object_size(header_size() + extra); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
  intptr_t* start_of_vtable() const        { return ((intptr_t*)as_klassOop()) + vtable_start_offset(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
  intptr_t* start_of_itable() const        { return start_of_vtable() + align_object_offset(vtable_length()); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
  int  itable_offset_in_words() const { return start_of_itable() - (intptr_t*)as_klassOop(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
  intptr_t* end_of_itable() const          { return start_of_itable() + itable_length(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8676
diff changeset
   682
  address static_field_addr(int offset);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 222
diff changeset
   683
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 222
diff changeset
   684
  OopMapBlock* start_of_nonstatic_oop_maps() const {
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8676
diff changeset
   685
    return (OopMapBlock*)(start_of_itable() + align_object_offset(itable_length()));
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 222
diff changeset
   686
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
  // Allocation profiling support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
  juint alloc_size() const            { return _alloc_count * size_helper(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
  void set_alloc_size(juint n)        {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
  // Use this to return the size of an instance in heap words:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
  int size_helper() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
    return layout_helper_to_size_helper(layout_helper());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
  // This bit is initialized in classFileParser.cpp.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
  // It is false under any of the following conditions:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
  //  - the class is abstract (including any interface)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
  //  - the class has a finalizer (if !RegisterFinalizersAtInit)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
  //  - the class size is larger than FastAllocateSizeLimit
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
  //  - the class is java/lang/Class, which cannot be allocated directly
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
  bool can_be_fastpath_allocated() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
    return !layout_helper_needs_slow_path(layout_helper());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
  // Java vtable/itable
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
  klassVtable* vtable() const;        // return new klassVtable wrapper
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
  inline methodOop method_at_vtable(int index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
  klassItable* itable() const;        // return new klassItable wrapper
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
  methodOop method_at_itable(klassOop holder, int index, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
  // Garbage collection
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
  void oop_follow_contents(oop obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
  int  oop_adjust_pointers(oop obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
  bool object_is_parsable() const { return _init_state != unparsable_by_gc; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
       // Value of _init_state must be zero (unparsable_by_gc) when klass field is set.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
  void follow_weak_klass_links(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
    BoolObjectClosure* is_alive, OopClosure* keep_alive);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
  void release_C_heap_structures();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
  // Parallel Scavenge and Parallel Old
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
  PARALLEL_GC_DECLS
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
  // Naming
4094
1f424b2b2171 6815692: method handle code needs some cleanup (post-6655638)
jrose
parents: 3824
diff changeset
   727
  const char* signature_name() const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
  // Iterators
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
  int oop_oop_iterate(oop obj, OopClosure* blk) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
    return oop_oop_iterate_v(obj, blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
  int oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
    return oop_oop_iterate_v_m(obj, blk, mr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   738
#define InstanceKlass_OOP_OOP_ITERATE_DECL(OopClosureType, nv_suffix)      \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   739
  int  oop_oop_iterate##nv_suffix(oop obj, OopClosureType* blk);           \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   740
  int  oop_oop_iterate##nv_suffix##_m(oop obj, OopClosureType* blk,        \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
                                      MemRegion mr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
  ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceKlass_OOP_OOP_ITERATE_DECL)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   744
  ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceKlass_OOP_OOP_ITERATE_DECL)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   745
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   746
#ifndef SERIALGC
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   747
#define InstanceKlass_OOP_OOP_ITERATE_BACKWARDS_DECL(OopClosureType, nv_suffix) \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   748
  int  oop_oop_iterate_backwards##nv_suffix(oop obj, OopClosureType* blk);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   749
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   750
  ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceKlass_OOP_OOP_ITERATE_BACKWARDS_DECL)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   751
  ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceKlass_OOP_OOP_ITERATE_BACKWARDS_DECL)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   752
#endif // !SERIALGC
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
  // initialization state
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
  void set_init_state(ClassState state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
  void set_init_state(ClassState state) { _init_state = state; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
#endif
3822
388b0393a042 6879572: SA fails _is_marked_dependent not found
acorn
parents: 3821
diff changeset
   761
  void set_rewritten()                  { _rewritten = true; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
  void set_init_thread(Thread *thread)  { _init_thread = thread; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
  u2 idnum_allocated_count() const      { return _idnum_allocated_count; }
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3822
diff changeset
   765
  // The RedefineClasses() API can cause new method idnums to be needed
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3822
diff changeset
   766
  // which will cause the caches to grow. Safety requires different
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3822
diff changeset
   767
  // cache management logic if the caches can grow instead of just
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3822
diff changeset
   768
  // going from NULL to non-NULL.
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3822
diff changeset
   769
  bool idnum_can_increment() const      { return has_been_redefined(); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
  jmethodID* methods_jmethod_ids_acquire() const
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
         { return (jmethodID*)OrderAccess::load_ptr_acquire(&_methods_jmethod_ids); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
  void release_set_methods_jmethod_ids(jmethodID* jmeths)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
         { OrderAccess::release_store_ptr(&_methods_jmethod_ids, jmeths); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
  int* methods_cached_itable_indices_acquire() const
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
         { return (int*)OrderAccess::load_ptr_acquire(&_methods_cached_itable_indices); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
  void release_set_methods_cached_itable_indices(int* indices)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
         { OrderAccess::release_store_ptr(&_methods_cached_itable_indices, indices); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
  inline typeArrayOop get_method_annotations_from(int idnum, objArrayOop annos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
  void set_annotations(objArrayOop md, objArrayOop* md_p)  { oop_store_without_check((oop*)md_p, (oop)md); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
  void set_methods_annotations_of(int idnum, typeArrayOop anno, objArrayOop* md_p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
  // Offsets for memory management
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
  oop* adr_array_klasses() const     { return (oop*)&this->_array_klasses;}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
  oop* adr_methods() const           { return (oop*)&this->_methods;}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
  oop* adr_method_ordering() const   { return (oop*)&this->_method_ordering;}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
  oop* adr_local_interfaces() const  { return (oop*)&this->_local_interfaces;}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
  oop* adr_transitive_interfaces() const  { return (oop*)&this->_transitive_interfaces;}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
  oop* adr_fields() const            { return (oop*)&this->_fields;}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
  oop* adr_constants() const         { return (oop*)&this->_constants;}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
  oop* adr_class_loader() const      { return (oop*)&this->_class_loader;}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
  oop* adr_protection_domain() const { return (oop*)&this->_protection_domain;}
1550
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   794
  oop* adr_host_klass() const        { return (oop*)&this->_host_klass;}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
  oop* adr_signers() const           { return (oop*)&this->_signers;}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
  oop* adr_inner_classes() const     { return (oop*)&this->_inner_classes;}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
  oop* adr_implementors() const      { return (oop*)&this->_implementors[0];}
8675
e9fef2a9bef7 6839872: remove implementation inheritance from JSR 292 APIs
jrose
parents: 8297
diff changeset
   798
  oop* adr_bootstrap_method() const  { return (oop*)&this->_bootstrap_method;}  // AllowTransitionalJSR292 ONLY
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
  oop* adr_methods_jmethod_ids() const             { return (oop*)&this->_methods_jmethod_ids;}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
  oop* adr_methods_cached_itable_indices() const   { return (oop*)&this->_methods_cached_itable_indices;}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
  oop* adr_class_annotations() const   { return (oop*)&this->_class_annotations;}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
  oop* adr_fields_annotations() const  { return (oop*)&this->_fields_annotations;}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
  oop* adr_methods_annotations() const { return (oop*)&this->_methods_annotations;}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
  oop* adr_methods_parameter_annotations() const { return (oop*)&this->_methods_parameter_annotations;}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
  oop* adr_methods_default_annotations() const { return (oop*)&this->_methods_default_annotations;}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
  // Static methods that are used to implement member methods where an exposed this pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
  // is needed due to possible GCs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
  static bool link_class_impl                           (instanceKlassHandle this_oop, bool throw_verifyerror, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
  static bool verify_code                               (instanceKlassHandle this_oop, bool throw_verifyerror, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
  static void initialize_impl                           (instanceKlassHandle this_oop, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
  static void eager_initialize_impl                     (instanceKlassHandle this_oop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
  static void set_initialization_state_and_notify_impl  (instanceKlassHandle this_oop, ClassState state, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
  static void call_class_initializer_impl               (instanceKlassHandle this_oop, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
  static klassOop array_klass_impl                      (instanceKlassHandle this_oop, bool or_null, int n, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
  static void do_local_static_fields_impl               (instanceKlassHandle this_oop, void f(fieldDescriptor* fd, TRAPS), TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
  /* jni_id_for_impl for jfieldID only */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
  static JNIid* jni_id_for_impl                         (instanceKlassHandle this_oop, int offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
  // Returns the array class for the n'th dimension
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
  klassOop array_klass_impl(bool or_null, int n, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
  // Returns the array class with this class as element type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
  klassOop array_klass_impl(bool or_null, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
  // sharing support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
  virtual void remove_unshareable_info();
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   829
  virtual void shared_symbols_iterate(SymbolClosure* closure);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
  // jvm support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
  jint compute_modifier_flags(TRAPS) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
  // JVMTI support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
  jint jvmti_class_status() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
  // Printing
4584
e2a449e8cc6f 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 4496
diff changeset
   840
  void oop_print_value_on(oop obj, outputStream* st);
e2a449e8cc6f 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 4496
diff changeset
   841
#ifndef PRODUCT
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
  void oop_print_on      (oop obj, outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
  void print_dependent_nmethods(bool verbose = false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
  bool is_dependent_nmethod(nmethod* nm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
  // Verification
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
  const char* internal_name() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
  void oop_verify_on(oop obj, outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
  static void verify_class_klass_nonstatic_oop_maps(klassOop k) PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
inline methodOop instanceKlass::method_at_vtable(int index)  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
  assert(index >= 0, "valid vtable index");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
  if (DebugVtables) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
    verify_vtable_index(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
  vtableEntry* ve = (vtableEntry*)start_of_vtable();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
  return ve[index].method();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
inline typeArrayOop instanceKlass::get_method_annotations_from(int idnum, objArrayOop annos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
  if (annos == NULL || annos->length() <= idnum) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
  return typeArrayOop(annos->obj_at(idnum));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
// for adding methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
// UNSET_IDNUM return means no more ids available
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
inline u2 instanceKlass::next_method_idnum() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
  if (_idnum_allocated_count == constMethodOopDesc::MAX_IDNUM) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
    return constMethodOopDesc::UNSET_IDNUM; // no more ids available
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
    return _idnum_allocated_count++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
/* JNIid class for jfieldIDs only */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
class JNIid: public CHeapObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
  friend class VMStructs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
  klassOop           _holder;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
  JNIid*             _next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
  int                _offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
  bool               _is_static_field_id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
  // Accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
  klassOop holder() const         { return _holder; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
  int offset() const              { return _offset; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
  JNIid* next()                   { return _next; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
  // Constructor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
  JNIid(klassOop holder, int offset, JNIid* next);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
  // Identifier lookup
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
  JNIid* find(int offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8676
diff changeset
   907
  bool find_local_field(fieldDescriptor* fd) {
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8676
diff changeset
   908
    return instanceKlass::cast(holder())->find_local_field_from_offset(offset(), true, fd);
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8676
diff changeset
   909
  }
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8676
diff changeset
   910
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
  // Garbage collection support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
  oop* holder_addr() { return (oop*)&_holder; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
  void oops_do(OopClosure* f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
  static void deallocate(JNIid* id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
  // Debugging
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
  bool is_static_field_id() const { return _is_static_field_id; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
  void set_is_static_field_id()   { _is_static_field_id = true; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
  void verify(klassOop holder);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
// If breakpoints are more numerous than just JVMTI breakpoints,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
// consider compressing this data structure.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
// It is currently a simple linked list defined in methodOop.hpp.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
class BreakpointInfo;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
// A collection point for interesting information about the previous
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
// version(s) of an instanceKlass. This class uses weak references to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
// the information so that the information may be collected as needed
220
e6ef4818c49d 6497639: 4/3 Profiling Swing application caused JVM crash
dcubed
parents: 1
diff changeset
   934
// by the system. If the information is shared, then a regular
e6ef4818c49d 6497639: 4/3 Profiling Swing application caused JVM crash
dcubed
parents: 1
diff changeset
   935
// reference must be used because a weak reference would be seen as
e6ef4818c49d 6497639: 4/3 Profiling Swing application caused JVM crash
dcubed
parents: 1
diff changeset
   936
// collectible. A GrowableArray of PreviousVersionNodes is attached
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
// to the instanceKlass as needed. See PreviousVersionWalker below.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
class PreviousVersionNode : public CHeapObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
 private:
220
e6ef4818c49d 6497639: 4/3 Profiling Swing application caused JVM crash
dcubed
parents: 1
diff changeset
   940
  // A shared ConstantPool is never collected so we'll always have
e6ef4818c49d 6497639: 4/3 Profiling Swing application caused JVM crash
dcubed
parents: 1
diff changeset
   941
  // a reference to it so we can update items in the cache. We'll
e6ef4818c49d 6497639: 4/3 Profiling Swing application caused JVM crash
dcubed
parents: 1
diff changeset
   942
  // have a weak reference to a non-shared ConstantPool until all
e6ef4818c49d 6497639: 4/3 Profiling Swing application caused JVM crash
dcubed
parents: 1
diff changeset
   943
  // of the methods (EMCP or obsolete) have been collected; the
e6ef4818c49d 6497639: 4/3 Profiling Swing application caused JVM crash
dcubed
parents: 1
diff changeset
   944
  // non-shared ConstantPool becomes collectible at that point.
e6ef4818c49d 6497639: 4/3 Profiling Swing application caused JVM crash
dcubed
parents: 1
diff changeset
   945
  jobject _prev_constant_pool;  // regular or weak reference
e6ef4818c49d 6497639: 4/3 Profiling Swing application caused JVM crash
dcubed
parents: 1
diff changeset
   946
  bool    _prev_cp_is_weak;     // true if not a shared ConstantPool
e6ef4818c49d 6497639: 4/3 Profiling Swing application caused JVM crash
dcubed
parents: 1
diff changeset
   947
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
  // If the previous version of the instanceKlass doesn't have any
489c9b5090e2 Initial load
duke
parents:
diff changeset
   949
  // EMCP methods, then _prev_EMCP_methods will be NULL. If all the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   950
  // EMCP methods have been collected, then _prev_EMCP_methods can
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
  // have a length of zero.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
  GrowableArray<jweak>* _prev_EMCP_methods;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
489c9b5090e2 Initial load
duke
parents:
diff changeset
   954
public:
220
e6ef4818c49d 6497639: 4/3 Profiling Swing application caused JVM crash
dcubed
parents: 1
diff changeset
   955
  PreviousVersionNode(jobject prev_constant_pool, bool prev_cp_is_weak,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
    GrowableArray<jweak>* prev_EMCP_methods);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
  ~PreviousVersionNode();
220
e6ef4818c49d 6497639: 4/3 Profiling Swing application caused JVM crash
dcubed
parents: 1
diff changeset
   958
  jobject prev_constant_pool() const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   959
    return _prev_constant_pool;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
  GrowableArray<jweak>* prev_EMCP_methods() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
    return _prev_EMCP_methods;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
// A Handle-ized version of PreviousVersionNode.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
class PreviousVersionInfo : public ResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
  constantPoolHandle   _prev_constant_pool_handle;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
  // If the previous version of the instanceKlass doesn't have any
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
  // EMCP methods, then _prev_EMCP_methods will be NULL. Since the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
  // methods cannot be collected while we hold a handle,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
  // _prev_EMCP_methods should never have a length of zero.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
  GrowableArray<methodHandle>* _prev_EMCP_method_handles;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
  PreviousVersionInfo(PreviousVersionNode *pv_node);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
  ~PreviousVersionInfo();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
  constantPoolHandle prev_constant_pool_handle() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
    return _prev_constant_pool_handle;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
  GrowableArray<methodHandle>* prev_EMCP_method_handles() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
    return _prev_EMCP_method_handles;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
// Helper object for walking previous versions. This helper cleans up
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
// the Handles that it allocates when the helper object is destroyed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
// The PreviousVersionInfo object returned by next_previous_version()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
// is only valid until a subsequent call to next_previous_version() or
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
// the helper object is destroyed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
class PreviousVersionWalker : public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
  GrowableArray<PreviousVersionNode *>* _previous_versions;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
  int                                   _current_index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
  // Fields for cleaning up when we are done walking the previous versions:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
  // A HandleMark for the PreviousVersionInfo handles:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
  HandleMark                            _hm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
  // It would be nice to have a ResourceMark field in this helper also,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
  // but the ResourceMark code says to be careful to delete handles held
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
  // in GrowableArrays _before_ deleting the GrowableArray. Since we
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
  // can't guarantee the order in which the fields are destroyed, we
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
  // have to let the creator of the PreviousVersionWalker object do
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
  // the right thing. Also, adding a ResourceMark here causes an
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
  // include loop.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
  // A pointer to the current info object so we can handle the deletes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
  PreviousVersionInfo *                 _current_p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
  PreviousVersionWalker(instanceKlass *ik);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
  ~PreviousVersionWalker();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
  // Return the interesting information for the next previous version
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
  // of the klass. Returns NULL if there are no more previous versions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
  PreviousVersionInfo* next_previous_version();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
  1021
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
  1022
#endif // SHARE_VM_OOPS_INSTANCEKLASS_HPP