hotspot/src/share/vm/oops/constMethod.hpp
author coleenp
Mon, 14 Jan 2013 11:01:39 -0500
changeset 15194 a35093d73168
parent 15102 0a86564e5f61
child 15437 eabd4555d072
permissions -rw-r--r--
8006005: Fix constant pool index validation and alignment trap for method parameter reflection Summary: This patch addresses an alignment trap due to the storage format of method parameters data in constMethod. It also adds code to validate constant pool indexes for method parameters data. Reviewed-by: jrose, dholmes Contributed-by: eric.mccorkle@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
12937
0032fb2caff6 7172967: Eliminate constMethod's _method backpointer to methodOop.
jiangli
parents: 7397
diff changeset
     2
 * Copyright (c) 2003, 2012, 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: 4567
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4567
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: 4567
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: 5547
diff changeset
    25
#ifndef SHARE_VM_OOPS_CONSTMETHODOOP_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    26
#define SHARE_VM_OOPS_CONSTMETHODOOP_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    28
#include "oops/oop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    29
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
    30
// An ConstMethod* represents portions of a Java method which
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
// do not vary.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
// Memory layout (each line represents a word). Note that most
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
// applications load thousands of methods, so keeping the size of this
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
// structure small has a big impact on footprint.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
// |------------------------------------------------------|
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
// | header                                               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
// | klass                                                |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
// |------------------------------------------------------|
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
// | fingerprint 1                                        |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
// | fingerprint 2                                        |
12937
0032fb2caff6 7172967: Eliminate constMethod's _method backpointer to methodOop.
jiangli
parents: 7397
diff changeset
    43
// | constants                      (oop)                 |
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
// | stackmap_data                  (oop)                 |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
// | constMethod_size                                     |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
// | interp_kind  | flags    | code_size                  |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
// | name index              | signature index            |
14586
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
    48
// | method_idnum            | max_stack                  |
14745
03904dd8649b 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 14586
diff changeset
    49
// | max_locals              | size_of_parameters         |
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
// |------------------------------------------------------|
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
// |                                                      |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
// | byte codes                                           |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
// |                                                      |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
// |------------------------------------------------------|
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
// | compressed linenumber table                          |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
// |  (see class CompressedLineNumberReadStream)          |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
// |  (note that length is unknown until decompressed)    |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
// |  (access flags bit tells whether table is present)   |
14586
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
    59
// |  (indexed from start of ConstMethod*)                |
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
// |  (elements not necessarily sorted!)                  |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
// |------------------------------------------------------|
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
// | localvariable table elements + length (length last)  |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
// |  (length is u2, elements are 6-tuples of u2)         |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
// |  (see class LocalVariableTableElement)               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
// |  (access flags bit tells whether table is present)   |
14586
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
    66
// |  (indexed from end of ConstMethod*)                  |
13282
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
    67
// |------------------------------------------------------|
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
    68
// | exception table + length (length last)               |
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
    69
// |  (length is u2, elements are 4-tuples of u2)         |
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
    70
// |  (see class ExceptionTableElement)                   |
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
    71
// |  (access flags bit tells whether table is present)   |
14586
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
    72
// |  (indexed from end of ConstMethod*)                  |
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
// |------------------------------------------------------|
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
// | checked exceptions elements + length (length last)   |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
// |  (length is u2, elements are u2)                     |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
// |  (see class CheckedExceptionElement)                 |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
// |  (access flags bit tells whether table is present)   |
14586
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
    78
// |  (indexed from end of ConstMethod*)                  |
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
    79
// |------------------------------------------------------|
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
    80
// | method parameters elements + length (length last)    |
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
    81
// |  (length is u2, elements are u2, u4 structures)      |
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
    82
// |  (see class MethodParametersElement)                 |
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
    83
// |  (access flags bit tells whether table is present)   |
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
    84
// |  (indexed from end of ConstMethod*)                  |
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
    85
// |------------------------------------------------------|
14586
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
    86
// | generic signature index (u2)                         |
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
    87
// |  (indexed from start of constMethodOop)              |
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
// |------------------------------------------------------|
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
    89
//
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
    90
// IMPORTANT: If anything gets added here, there need to be changes to
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
    91
// ensure that ServicabilityAgent doesn't get broken as a result!
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
    94
// Utitily class decribing elements in checked exceptions table inlined in Method*.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
class CheckedExceptionElement VALUE_OBJ_CLASS_SPEC {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  u2 class_cp_index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   101
// Utitily class decribing elements in local variable table inlined in Method*.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
class LocalVariableTableElement VALUE_OBJ_CLASS_SPEC {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  u2 start_bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  u2 length;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  u2 name_cp_index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  u2 descriptor_cp_index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  u2 signature_cp_index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  u2 slot;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
13282
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
   112
// Utitily class describing elements in exception table
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
   113
class ExceptionTableElement VALUE_OBJ_CLASS_SPEC {
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
   114
 public:
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
   115
  u2 start_pc;
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
   116
  u2 end_pc;
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
   117
  u2 handler_pc;
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
   118
  u2 catch_type_index;
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
   119
};
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
   120
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   121
// Utility class describing elements in method parameters
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   122
class MethodParametersElement VALUE_OBJ_CLASS_SPEC {
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   123
 public:
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   124
  u2 name_cp_index;
15194
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
   125
  // This has to happen, otherwise it will cause SIGBUS from a
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
   126
  // misaligned u4 on some architectures (ie SPARC)
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
   127
  // because MethodParametersElements are only aligned mod 2
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
   128
  // within the ConstMethod container  u2 flags_hi;
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
   129
  u2 flags_hi;
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
   130
  u2 flags_lo;
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   131
};
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   132
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   133
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   134
class ConstMethod : public MetaspaceObj {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  friend class VMStructs;
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   136
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   137
public:
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   138
  typedef enum { NORMAL, OVERPASS } MethodType;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   139
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  enum {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
    _has_linenumber_table = 1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
    _has_checked_exceptions = 2,
13282
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
   144
    _has_localvariable_table = 4,
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   145
    _has_exception_table = 8,
14586
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   146
    _has_generic_signature = 16,
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   147
    _has_method_parameters = 32,
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   148
    _is_overpass = 64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  // Bit vector of signature
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  // Callers interpret 0=not initialized yet and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  // -1=too many args to fix, must parse the slow way.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  // The real initial value is special to account for nonatomicity of 64 bit
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  // loads and stores.  This value may updated and read without a lock by
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  // multiple threads, so is volatile.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  volatile uint64_t _fingerprint;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   159
  ConstantPool*     _constants;                  // Constant pool
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  // Raw stackmap data for the method
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   162
  Array<u1>*        _stackmap_data;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  int               _constMethod_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  jbyte             _interpreter_kind;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  jbyte             _flags;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   168
  // Size of Java bytecodes allocated immediately after Method*.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  u2                _code_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  u2                _name_index;                 // Method name (index in constant pool)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  u2                _signature_index;            // Method signature (index in constant pool)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  u2                _method_idnum;               // unique identification number for the method within the class
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
                                                 // initially corresponds to the index into the methods array.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
                                                 // but this may change with redefinition
14586
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   175
  u2                _max_stack;                  // Maximum number of entries on the expression stack
14745
03904dd8649b 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 14586
diff changeset
   176
  u2                _max_locals;                 // Number of local variables used by this method
03904dd8649b 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 14586
diff changeset
   177
  u2                _size_of_parameters;         // size of the parameter block (receiver + arguments) in words
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   178
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   179
  // Constructor
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   180
  ConstMethod(int byte_code_size,
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   181
              int compressed_line_number_size,
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   182
              int localvariable_table_length,
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   183
              int exception_table_length,
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   184
              int checked_exceptions_length,
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   185
              int method_parameters_length,
14586
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   186
              u2  generic_signature_index,
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   187
              MethodType is_overpass,
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   188
              int size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
public:
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   190
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   191
  static ConstMethod* allocate(ClassLoaderData* loader_data,
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   192
                               int byte_code_size,
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   193
                               int compressed_line_number_size,
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   194
                               int localvariable_table_length,
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   195
                               int exception_table_length,
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   196
                               int checked_exceptions_length,
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   197
                               int method_parameters_length,
14586
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   198
                               u2  generic_signature_index,
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   199
                               MethodType mt,
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   200
                               TRAPS);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   201
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   202
  bool is_constMethod() const { return true; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   203
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  // Inlined tables
14586
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   205
  void set_inlined_tables_length(u2  generic_signature_index,
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   206
                                 int checked_exceptions_len,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
                                 int compressed_line_number_size,
13282
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
   208
                                 int localvariable_table_len,
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   209
                                 int exception_table_len,
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   210
                                 int method_parameters_length);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
14586
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   212
  bool has_generic_signature() const
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   213
    { return (_flags & _has_generic_signature) != 0; }
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   214
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  bool has_linenumber_table() const
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
    { return (_flags & _has_linenumber_table) != 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  bool has_checked_exceptions() const
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
    { return (_flags & _has_checked_exceptions) != 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  bool has_localvariable_table() const
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
    { return (_flags & _has_localvariable_table) != 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
13282
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
   224
  bool has_exception_handler() const
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
   225
    { return (_flags & _has_exception_table) != 0; }
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
   226
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   227
  bool has_method_parameters() const
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   228
    { return (_flags & _has_method_parameters) != 0; }
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   229
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   230
  MethodType method_type() const {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   231
    return ((_flags & _is_overpass) == 0) ? NORMAL : OVERPASS;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   232
  }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   233
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   234
  void set_method_type(MethodType mt) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   235
    if (mt == NORMAL) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   236
      _flags &= ~(_is_overpass);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   237
    } else {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   238
      _flags |= _is_overpass;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   239
    }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   240
  }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   241
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13728
diff changeset
   242
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  void set_interpreter_kind(int kind)      { _interpreter_kind = kind; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  int  interpreter_kind(void) const        { return _interpreter_kind; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
12937
0032fb2caff6 7172967: Eliminate constMethod's _method backpointer to methodOop.
jiangli
parents: 7397
diff changeset
   246
  // constant pool
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   247
  ConstantPool* constants() const        { return _constants; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   248
  void set_constants(ConstantPool* c)    { _constants = c; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   250
  Method* method() const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  // stackmap table data
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   253
  Array<u1>* stackmap_data() const { return _stackmap_data; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   254
  void set_stackmap_data(Array<u1>* sd) { _stackmap_data = sd; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  bool has_stackmap_table() const { return _stackmap_data != NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  void init_fingerprint() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
    const uint64_t initval = CONST64(0x8000000000000000);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
    _fingerprint = initval;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  uint64_t fingerprint() const                   {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
    // Since reads aren't atomic for 64 bits, if any of the high or low order
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
    // word is the initial value, return 0.  See init_fingerprint for initval.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
    uint high_fp = (uint)(_fingerprint >> 32);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
    if ((int) _fingerprint == 0 || high_fp == 0x80000000) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
      return 0L;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
      return _fingerprint;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  uint64_t set_fingerprint(uint64_t new_fingerprint) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
    // Assert only valid if complete/valid 64 bit _fingerprint value is read.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
    uint64_t oldfp = fingerprint();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
#endif // ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
    _fingerprint = new_fingerprint;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
    assert(oldfp == 0L || new_fingerprint == oldfp,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
           "fingerprint cannot change");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
    assert(((new_fingerprint >> 32) != 0x80000000) && (int)new_fingerprint !=0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
           "fingerprint should call init to set initial value");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
    return new_fingerprint;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  // name
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  int name_index() const                         { return _name_index; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  void set_name_index(int index)                 { _name_index = index; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  // signature
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  int signature_index() const                    { return _signature_index; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  void set_signature_index(int index)            { _signature_index = index; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  // generics support
14586
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   295
  int generic_signature_index() const            {
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   296
    if (has_generic_signature()) {
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   297
      return *generic_signature_index_addr();
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   298
    } else {
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   299
      return 0;
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   300
    }
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   301
  }
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   302
  void set_generic_signature_index(u2 index)    {
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   303
    assert(has_generic_signature(), "");
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   304
    u2* addr = generic_signature_index_addr();
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   305
    *addr = index;
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   306
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  // Sizing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  static int header_size() {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   310
    return sizeof(ConstMethod)/HeapWordSize;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   313
  // Size needed
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   314
  static int size(int code_size, int compressed_line_number_size,
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   315
                  int local_variable_table_length,
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   316
                  int exception_table_length,
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   317
                  int checked_exceptions_length,
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   318
                  int method_parameters_length,
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   319
                  u2  generic_signature_index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   321
  int size() const                    { return _constMethod_size;}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  void set_constMethod_size(int size)     { _constMethod_size = size; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  // code size
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  int code_size() const                          { return _code_size; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  void set_code_size(int size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
    assert(max_method_code_size < (1 << 16),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
           "u2 is too small to hold method code size in general");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
    assert(0 <= size && size <= max_method_code_size, "invalid code size");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
    _code_size = size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  // linenumber table - note that length is unknown until decompression,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
  // see class CompressedLineNumberReadStream.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
  u_char* compressed_linenumber_table() const;         // not preserved by gc
14586
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   336
  u2* generic_signature_index_addr() const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  u2* checked_exceptions_length_addr() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  u2* localvariable_table_length_addr() const;
13282
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
   339
  u2* exception_table_length_addr() const;
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   340
  u2* method_parameters_length_addr() const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
  // checked exceptions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  int checked_exceptions_length() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
  CheckedExceptionElement* checked_exceptions_start() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  // localvariable table
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
  int localvariable_table_length() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  LocalVariableTableElement* localvariable_table_start() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
13282
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
   350
  // exception table
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
   351
  int exception_table_length() const;
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
   352
  ExceptionTableElement* exception_table_start() const;
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12937
diff changeset
   353
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   354
  // method parameters table
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   355
  int method_parameters_length() const;
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   356
  MethodParametersElement* method_parameters_start() const;
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 14745
diff changeset
   357
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  // byte codes
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 2105
diff changeset
   359
  void    set_code(address code) {
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 2105
diff changeset
   360
    if (code_size() > 0) {
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 2105
diff changeset
   361
      memcpy(code_base(), code, code_size());
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 2105
diff changeset
   362
    }
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 2105
diff changeset
   363
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
  address code_base() const            { return (address) (this+1); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  address code_end() const             { return code_base() + code_size(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  bool    contains(address bcp) const  { return code_base() <= bcp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
                                                     && bcp < code_end(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  // Offset to bytecodes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  static ByteSize codes_offset()
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   370
                            { return in_ByteSize(sizeof(ConstMethod)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   372
  static ByteSize constants_offset()
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   373
                            { return byte_offset_of(ConstMethod, _constants); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
14586
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   375
  static ByteSize max_stack_offset()
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   376
                            { return byte_offset_of(ConstMethod, _max_stack); }
14745
03904dd8649b 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 14586
diff changeset
   377
  static ByteSize size_of_locals_offset()
03904dd8649b 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 14586
diff changeset
   378
                            { return byte_offset_of(ConstMethod, _max_locals); }
03904dd8649b 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 14586
diff changeset
   379
  static ByteSize size_of_parameters_offset()
03904dd8649b 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 14586
diff changeset
   380
                            { return byte_offset_of(ConstMethod, _size_of_parameters); }
03904dd8649b 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 14586
diff changeset
   381
14586
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   382
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  // Unique id for the method
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
  static const u2 MAX_IDNUM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
  static const u2 UNSET_IDNUM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  u2 method_idnum() const                        { return _method_idnum; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
  void set_method_idnum(u2 idnum)                { _method_idnum = idnum; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
14586
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   389
  // max stack
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   390
  int  max_stack() const                         { return _max_stack; }
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   391
  void set_max_stack(int size)                   { _max_stack = size; }
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14385
diff changeset
   392
14745
03904dd8649b 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 14586
diff changeset
   393
  // max locals
03904dd8649b 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 14586
diff changeset
   394
  int  max_locals() const                        { return _max_locals; }
03904dd8649b 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 14586
diff changeset
   395
  void set_max_locals(int size)                  { _max_locals = size; }
03904dd8649b 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 14586
diff changeset
   396
03904dd8649b 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 14586
diff changeset
   397
  // size of parameters
03904dd8649b 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 14586
diff changeset
   398
  int  size_of_parameters() const                { return _size_of_parameters; }
03904dd8649b 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 14586
diff changeset
   399
  void set_size_of_parameters(int size)          { _size_of_parameters = size; }
03904dd8649b 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 14586
diff changeset
   400
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   401
  // Deallocation for RedefineClasses
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   402
  void deallocate_contents(ClassLoaderData* loader_data);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   403
  bool is_klass() const { return false; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   404
  DEBUG_ONLY(bool on_stack() { return false; })
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   405
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  // Since the size of the compressed line number table is unknown, the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  // offsets of the other variable sized sections are computed backwards
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   409
  // from the end of the ConstMethod*.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   411
  // First byte after ConstMethod*
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  address constMethod_end() const
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
                          { return (address)((oop*)this + _constMethod_size); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   415
  // Last short in ConstMethod*
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  u2* last_u2_element() const
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
                                         { return (u2*)constMethod_end() - 1; }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   418
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   419
 public:
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   420
  // Printing
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   421
  void print_on      (outputStream* st) const;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   422
  void print_value_on(outputStream* st) const;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   423
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   424
  const char* internal_name() const { return "{constMethod}"; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   425
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   426
  // Verify
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13282
diff changeset
   427
  void verify_on(outputStream* st);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   429
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   430
#endif // SHARE_VM_OOPS_CONSTMETHODOOP_HPP