src/share/vm/oops/constMethod.hpp

Thu, 04 Apr 2019 17:56:29 +0800

author
aoqi
date
Thu, 04 Apr 2019 17:56:29 +0800
changeset 9572
624a0741915c
parent 8604
04d83ba48607
permissions
-rw-r--r--

Merge

aoqi@0 1 /*
kevinw@8368 2 * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation.
aoqi@0 8 *
aoqi@0 9 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 12 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 13 * accompanied this code).
aoqi@0 14 *
aoqi@0 15 * You should have received a copy of the GNU General Public License version
aoqi@0 16 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 18 *
aoqi@0 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 20 * or visit www.oracle.com if you need additional information or have any
aoqi@0 21 * questions.
aoqi@0 22 *
aoqi@0 23 */
aoqi@0 24
aoqi@0 25 #ifndef SHARE_VM_OOPS_CONSTMETHODOOP_HPP
aoqi@0 26 #define SHARE_VM_OOPS_CONSTMETHODOOP_HPP
aoqi@0 27
aoqi@0 28 #include "oops/oop.hpp"
aoqi@0 29
aoqi@0 30 // An ConstMethod* represents portions of a Java method which
aoqi@0 31 // do not vary.
aoqi@0 32 //
aoqi@0 33 // Memory layout (each line represents a word). Note that most
aoqi@0 34 // applications load thousands of methods, so keeping the size of this
aoqi@0 35 // structure small has a big impact on footprint.
aoqi@0 36 //
aoqi@0 37 // |------------------------------------------------------|
aoqi@0 38 // | header |
aoqi@0 39 // | klass |
aoqi@0 40 // |------------------------------------------------------|
aoqi@0 41 // | fingerprint 1 |
aoqi@0 42 // | fingerprint 2 |
aoqi@0 43 // | constants (oop) |
aoqi@0 44 // | stackmap_data (oop) |
aoqi@0 45 // | constMethod_size |
aoqi@0 46 // | interp_kind | flags | code_size |
aoqi@0 47 // | name index | signature index |
aoqi@0 48 // | method_idnum | max_stack |
aoqi@0 49 // | max_locals | size_of_parameters |
aoqi@0 50 // |------------------------------------------------------|
aoqi@0 51 // | |
aoqi@0 52 // | byte codes |
aoqi@0 53 // | |
aoqi@0 54 // |------------------------------------------------------|
aoqi@0 55 // | compressed linenumber table |
aoqi@0 56 // | (see class CompressedLineNumberReadStream) |
aoqi@0 57 // | (note that length is unknown until decompressed) |
aoqi@0 58 // | (access flags bit tells whether table is present) |
aoqi@0 59 // | (indexed from start of ConstMethod*) |
aoqi@0 60 // | (elements not necessarily sorted!) |
aoqi@0 61 // |------------------------------------------------------|
aoqi@0 62 // | localvariable table elements + length (length last) |
aoqi@0 63 // | (length is u2, elements are 6-tuples of u2) |
aoqi@0 64 // | (see class LocalVariableTableElement) |
aoqi@0 65 // | (access flags bit tells whether table is present) |
aoqi@0 66 // | (indexed from end of ConstMethod*) |
aoqi@0 67 // |------------------------------------------------------|
aoqi@0 68 // | exception table + length (length last) |
aoqi@0 69 // | (length is u2, elements are 4-tuples of u2) |
aoqi@0 70 // | (see class ExceptionTableElement) |
aoqi@0 71 // | (access flags bit tells whether table is present) |
aoqi@0 72 // | (indexed from end of ConstMethod*) |
aoqi@0 73 // |------------------------------------------------------|
aoqi@0 74 // | checked exceptions elements + length (length last) |
aoqi@0 75 // | (length is u2, elements are u2) |
aoqi@0 76 // | (see class CheckedExceptionElement) |
aoqi@0 77 // | (access flags bit tells whether table is present) |
aoqi@0 78 // | (indexed from end of ConstMethod*) |
aoqi@0 79 // |------------------------------------------------------|
aoqi@0 80 // | method parameters elements + length (length last) |
aoqi@0 81 // | (length is u2, elements are u2, u4 structures) |
aoqi@0 82 // | (see class MethodParametersElement) |
aoqi@0 83 // | (access flags bit tells whether table is present) |
aoqi@0 84 // | (indexed from end of ConstMethod*) |
aoqi@0 85 // |------------------------------------------------------|
aoqi@0 86 // | generic signature index (u2) |
aoqi@0 87 // | (indexed from start of constMethodOop) |
aoqi@0 88 // |------------------------------------------------------|
aoqi@0 89 // | annotations arrays - method, parameter, type, default|
aoqi@0 90 // | pointer to Array<u1> if annotation is present |
aoqi@0 91 // |------------------------------------------------------|
aoqi@0 92 //
aoqi@0 93 // IMPORTANT: If anything gets added here, there need to be changes to
aoqi@0 94 // ensure that ServicabilityAgent doesn't get broken as a result!
aoqi@0 95
aoqi@0 96
aoqi@0 97 // Utility class describing elements in checked exceptions table inlined in Method*.
aoqi@0 98 class CheckedExceptionElement VALUE_OBJ_CLASS_SPEC {
aoqi@0 99 public:
aoqi@0 100 u2 class_cp_index;
aoqi@0 101 };
aoqi@0 102
aoqi@0 103
aoqi@0 104 // Utility class describing elements in local variable table inlined in Method*.
aoqi@0 105 class LocalVariableTableElement VALUE_OBJ_CLASS_SPEC {
aoqi@0 106 public:
aoqi@0 107 u2 start_bci;
aoqi@0 108 u2 length;
aoqi@0 109 u2 name_cp_index;
aoqi@0 110 u2 descriptor_cp_index;
aoqi@0 111 u2 signature_cp_index;
aoqi@0 112 u2 slot;
aoqi@0 113 };
aoqi@0 114
aoqi@0 115 // Utility class describing elements in exception table
aoqi@0 116 class ExceptionTableElement VALUE_OBJ_CLASS_SPEC {
aoqi@0 117 public:
aoqi@0 118 u2 start_pc;
aoqi@0 119 u2 end_pc;
aoqi@0 120 u2 handler_pc;
aoqi@0 121 u2 catch_type_index;
aoqi@0 122 };
aoqi@0 123
aoqi@0 124 // Utility class describing elements in method parameters
aoqi@0 125 class MethodParametersElement VALUE_OBJ_CLASS_SPEC {
aoqi@0 126 public:
aoqi@0 127 u2 name_cp_index;
aoqi@0 128 u2 flags;
aoqi@0 129 };
aoqi@0 130
aoqi@0 131 class KlassSizeStats;
aoqi@0 132
aoqi@0 133 // Class to collect the sizes of ConstMethod inline tables
aoqi@0 134 #define INLINE_TABLES_DO(do_element) \
aoqi@0 135 do_element(localvariable_table_length) \
aoqi@0 136 do_element(compressed_linenumber_size) \
aoqi@0 137 do_element(exception_table_length) \
aoqi@0 138 do_element(checked_exceptions_length) \
aoqi@0 139 do_element(method_parameters_length) \
aoqi@0 140 do_element(generic_signature_index) \
aoqi@0 141 do_element(method_annotations_length) \
aoqi@0 142 do_element(parameter_annotations_length) \
aoqi@0 143 do_element(type_annotations_length) \
aoqi@0 144 do_element(default_annotations_length)
aoqi@0 145
aoqi@0 146 #define INLINE_TABLE_DECLARE(sym) int _##sym;
aoqi@0 147 #define INLINE_TABLE_PARAM(sym) int sym,
aoqi@0 148 #define INLINE_TABLE_INIT(sym) _##sym(sym),
aoqi@0 149 #define INLINE_TABLE_NULL(sym) _##sym(0),
aoqi@0 150 #define INLINE_TABLE_ACCESSOR(sym) int sym() const { return _##sym; }
aoqi@0 151
aoqi@0 152 class InlineTableSizes : StackObj {
aoqi@0 153 // declarations
aoqi@0 154 INLINE_TABLES_DO(INLINE_TABLE_DECLARE)
aoqi@0 155 int _end;
aoqi@0 156 public:
aoqi@0 157 InlineTableSizes(
aoqi@0 158 INLINE_TABLES_DO(INLINE_TABLE_PARAM)
aoqi@0 159 int end) :
aoqi@0 160 INLINE_TABLES_DO(INLINE_TABLE_INIT)
aoqi@0 161 _end(end) {}
aoqi@0 162
aoqi@0 163 // Default constructor for no inlined tables
aoqi@0 164 InlineTableSizes() :
aoqi@0 165 INLINE_TABLES_DO(INLINE_TABLE_NULL)
aoqi@0 166 _end(0) {}
aoqi@0 167
aoqi@0 168 // Accessors
aoqi@0 169 INLINE_TABLES_DO(INLINE_TABLE_ACCESSOR)
aoqi@0 170 };
aoqi@0 171 #undef INLINE_TABLE_ACCESSOR
aoqi@0 172 #undef INLINE_TABLE_NULL
aoqi@0 173 #undef INLINE_TABLE_INIT
aoqi@0 174 #undef INLINE_TABLE_PARAM
aoqi@0 175 #undef INLINE_TABLE_DECLARE
aoqi@0 176
aoqi@0 177
aoqi@0 178 class ConstMethod : public MetaspaceObj {
aoqi@0 179 friend class VMStructs;
aoqi@0 180
aoqi@0 181 public:
aoqi@0 182 typedef enum { NORMAL, OVERPASS } MethodType;
aoqi@0 183
aoqi@0 184 private:
aoqi@0 185 enum {
aoqi@0 186 _has_linenumber_table = 0x0001,
aoqi@0 187 _has_checked_exceptions = 0x0002,
aoqi@0 188 _has_localvariable_table = 0x0004,
aoqi@0 189 _has_exception_table = 0x0008,
aoqi@0 190 _has_generic_signature = 0x0010,
aoqi@0 191 _has_method_parameters = 0x0020,
aoqi@0 192 _is_overpass = 0x0040,
aoqi@0 193 _has_method_annotations = 0x0080,
aoqi@0 194 _has_parameter_annotations = 0x0100,
aoqi@0 195 _has_type_annotations = 0x0200,
aoqi@0 196 _has_default_annotations = 0x0400
aoqi@0 197 };
aoqi@0 198
aoqi@0 199 // Bit vector of signature
aoqi@0 200 // Callers interpret 0=not initialized yet and
aoqi@0 201 // -1=too many args to fix, must parse the slow way.
aoqi@0 202 // The real initial value is special to account for nonatomicity of 64 bit
aoqi@0 203 // loads and stores. This value may updated and read without a lock by
aoqi@0 204 // multiple threads, so is volatile.
aoqi@0 205 volatile uint64_t _fingerprint;
aoqi@0 206
aoqi@0 207 ConstantPool* _constants; // Constant pool
aoqi@0 208
aoqi@0 209 // Raw stackmap data for the method
aoqi@0 210 Array<u1>* _stackmap_data;
aoqi@0 211
aoqi@0 212 int _constMethod_size;
aoqi@0 213 u2 _flags;
kevinw@8368 214 u1 _result_type; // BasicType of result
aoqi@0 215
aoqi@0 216 // Size of Java bytecodes allocated immediately after Method*.
aoqi@0 217 u2 _code_size;
aoqi@0 218 u2 _name_index; // Method name (index in constant pool)
aoqi@0 219 u2 _signature_index; // Method signature (index in constant pool)
aoqi@0 220 u2 _method_idnum; // unique identification number for the method within the class
aoqi@0 221 // initially corresponds to the index into the methods array.
aoqi@0 222 // but this may change with redefinition
aoqi@0 223 u2 _max_stack; // Maximum number of entries on the expression stack
aoqi@0 224 u2 _max_locals; // Number of local variables used by this method
aoqi@0 225 u2 _size_of_parameters; // size of the parameter block (receiver + arguments) in words
sspitsyn@7636 226 u2 _orig_method_idnum; // Original unique identification number for the method
aoqi@0 227
aoqi@0 228 // Constructor
aoqi@0 229 ConstMethod(int byte_code_size,
aoqi@0 230 InlineTableSizes* sizes,
aoqi@0 231 MethodType is_overpass,
aoqi@0 232 int size);
aoqi@0 233 public:
aoqi@0 234
aoqi@0 235 static ConstMethod* allocate(ClassLoaderData* loader_data,
aoqi@0 236 int byte_code_size,
aoqi@0 237 InlineTableSizes* sizes,
aoqi@0 238 MethodType mt,
aoqi@0 239 TRAPS);
aoqi@0 240
aoqi@0 241 bool is_constMethod() const { return true; }
aoqi@0 242
aoqi@0 243 // Inlined tables
aoqi@0 244 void set_inlined_tables_length(InlineTableSizes* sizes);
aoqi@0 245
aoqi@0 246 bool has_generic_signature() const
aoqi@0 247 { return (_flags & _has_generic_signature) != 0; }
aoqi@0 248
aoqi@0 249 bool has_linenumber_table() const
aoqi@0 250 { return (_flags & _has_linenumber_table) != 0; }
aoqi@0 251
aoqi@0 252 bool has_checked_exceptions() const
aoqi@0 253 { return (_flags & _has_checked_exceptions) != 0; }
aoqi@0 254
aoqi@0 255 bool has_localvariable_table() const
aoqi@0 256 { return (_flags & _has_localvariable_table) != 0; }
aoqi@0 257
aoqi@0 258 bool has_exception_handler() const
aoqi@0 259 { return (_flags & _has_exception_table) != 0; }
aoqi@0 260
aoqi@0 261 bool has_method_parameters() const
aoqi@0 262 { return (_flags & _has_method_parameters) != 0; }
aoqi@0 263
aoqi@0 264 MethodType method_type() const {
aoqi@0 265 return ((_flags & _is_overpass) == 0) ? NORMAL : OVERPASS;
aoqi@0 266 }
aoqi@0 267
aoqi@0 268 void set_method_type(MethodType mt) {
aoqi@0 269 if (mt == NORMAL) {
aoqi@0 270 _flags &= ~(_is_overpass);
aoqi@0 271 } else {
aoqi@0 272 _flags |= _is_overpass;
aoqi@0 273 }
aoqi@0 274 }
aoqi@0 275
aoqi@0 276 // constant pool
aoqi@0 277 ConstantPool* constants() const { return _constants; }
aoqi@0 278 void set_constants(ConstantPool* c) { _constants = c; }
aoqi@0 279
aoqi@0 280 Method* method() const;
aoqi@0 281
aoqi@0 282 // stackmap table data
aoqi@0 283 Array<u1>* stackmap_data() const { return _stackmap_data; }
aoqi@0 284 void set_stackmap_data(Array<u1>* sd) { _stackmap_data = sd; }
aoqi@0 285 void copy_stackmap_data(ClassLoaderData* loader_data, u1* sd, int length, TRAPS);
aoqi@0 286 bool has_stackmap_table() const { return _stackmap_data != NULL; }
aoqi@0 287
aoqi@0 288 void init_fingerprint() {
aoqi@0 289 const uint64_t initval = CONST64(0x8000000000000000);
aoqi@0 290 _fingerprint = initval;
aoqi@0 291 }
aoqi@0 292
aoqi@0 293 uint64_t fingerprint() const {
aoqi@0 294 // Since reads aren't atomic for 64 bits, if any of the high or low order
aoqi@0 295 // word is the initial value, return 0. See init_fingerprint for initval.
aoqi@0 296 uint high_fp = (uint)(_fingerprint >> 32);
aoqi@0 297 if ((int) _fingerprint == 0 || high_fp == 0x80000000) {
aoqi@0 298 return 0L;
aoqi@0 299 } else {
aoqi@0 300 return _fingerprint;
aoqi@0 301 }
aoqi@0 302 }
aoqi@0 303
aoqi@0 304 uint64_t set_fingerprint(uint64_t new_fingerprint) {
aoqi@0 305 #ifdef ASSERT
aoqi@0 306 // Assert only valid if complete/valid 64 bit _fingerprint value is read.
aoqi@0 307 uint64_t oldfp = fingerprint();
aoqi@0 308 #endif // ASSERT
aoqi@0 309 _fingerprint = new_fingerprint;
aoqi@0 310 assert(oldfp == 0L || new_fingerprint == oldfp,
aoqi@0 311 "fingerprint cannot change");
aoqi@0 312 assert(((new_fingerprint >> 32) != 0x80000000) && (int)new_fingerprint !=0,
aoqi@0 313 "fingerprint should call init to set initial value");
aoqi@0 314 return new_fingerprint;
aoqi@0 315 }
aoqi@0 316
aoqi@0 317 // name
aoqi@0 318 int name_index() const { return _name_index; }
aoqi@0 319 void set_name_index(int index) { _name_index = index; }
aoqi@0 320
aoqi@0 321 // signature
aoqi@0 322 int signature_index() const { return _signature_index; }
aoqi@0 323 void set_signature_index(int index) { _signature_index = index; }
aoqi@0 324
aoqi@0 325 // generics support
aoqi@0 326 int generic_signature_index() const {
aoqi@0 327 if (has_generic_signature()) {
aoqi@0 328 return *generic_signature_index_addr();
aoqi@0 329 } else {
aoqi@0 330 return 0;
aoqi@0 331 }
aoqi@0 332 }
aoqi@0 333 void set_generic_signature_index(u2 index) {
aoqi@0 334 assert(has_generic_signature(), "");
aoqi@0 335 u2* addr = generic_signature_index_addr();
aoqi@0 336 *addr = index;
aoqi@0 337 }
aoqi@0 338
aoqi@0 339 // Sizing
aoqi@0 340 static int header_size() {
aoqi@0 341 return sizeof(ConstMethod)/HeapWordSize;
aoqi@0 342 }
aoqi@0 343
aoqi@0 344 // Size needed
aoqi@0 345 static int size(int code_size, InlineTableSizes* sizes);
aoqi@0 346
aoqi@0 347 int size() const { return _constMethod_size;}
aoqi@0 348 void set_constMethod_size(int size) { _constMethod_size = size; }
aoqi@0 349 #if INCLUDE_SERVICES
aoqi@0 350 void collect_statistics(KlassSizeStats *sz) const;
aoqi@0 351 #endif
aoqi@0 352
aoqi@0 353 // code size
aoqi@0 354 int code_size() const { return _code_size; }
aoqi@0 355 void set_code_size(int size) {
aoqi@0 356 assert(max_method_code_size < (1 << 16),
aoqi@0 357 "u2 is too small to hold method code size in general");
aoqi@0 358 assert(0 <= size && size <= max_method_code_size, "invalid code size");
aoqi@0 359 _code_size = size;
aoqi@0 360 }
aoqi@0 361
aoqi@0 362 // linenumber table - note that length is unknown until decompression,
aoqi@0 363 // see class CompressedLineNumberReadStream.
aoqi@0 364 u_char* compressed_linenumber_table() const; // not preserved by gc
aoqi@0 365 u2* generic_signature_index_addr() const;
aoqi@0 366 u2* checked_exceptions_length_addr() const;
aoqi@0 367 u2* localvariable_table_length_addr() const;
aoqi@0 368 u2* exception_table_length_addr() const;
aoqi@0 369 u2* method_parameters_length_addr() const;
aoqi@0 370
aoqi@0 371 // checked exceptions
aoqi@0 372 int checked_exceptions_length() const;
aoqi@0 373 CheckedExceptionElement* checked_exceptions_start() const;
aoqi@0 374
aoqi@0 375 // localvariable table
aoqi@0 376 int localvariable_table_length() const;
aoqi@0 377 LocalVariableTableElement* localvariable_table_start() const;
aoqi@0 378
aoqi@0 379 // exception table
aoqi@0 380 int exception_table_length() const;
aoqi@0 381 ExceptionTableElement* exception_table_start() const;
aoqi@0 382
aoqi@0 383 // method parameters table
aoqi@0 384 int method_parameters_length() const;
aoqi@0 385 MethodParametersElement* method_parameters_start() const;
aoqi@0 386
aoqi@0 387 // method annotations
aoqi@0 388 bool has_method_annotations() const
aoqi@0 389 { return (_flags & _has_method_annotations) != 0; }
aoqi@0 390
aoqi@0 391 bool has_parameter_annotations() const
aoqi@0 392 { return (_flags & _has_parameter_annotations) != 0; }
aoqi@0 393
aoqi@0 394 bool has_type_annotations() const
aoqi@0 395 { return (_flags & _has_type_annotations) != 0; }
aoqi@0 396
aoqi@0 397 bool has_default_annotations() const
aoqi@0 398 { return (_flags & _has_default_annotations) != 0; }
aoqi@0 399
aoqi@0 400
aoqi@0 401 AnnotationArray** method_annotations_addr() const;
aoqi@0 402 AnnotationArray* method_annotations() const {
aoqi@0 403 return has_method_annotations() ? *(method_annotations_addr()) : NULL;
aoqi@0 404 }
aoqi@0 405 void set_method_annotations(AnnotationArray* anno) {
aoqi@0 406 *(method_annotations_addr()) = anno;
aoqi@0 407 }
aoqi@0 408
aoqi@0 409 AnnotationArray** parameter_annotations_addr() const;
aoqi@0 410 AnnotationArray* parameter_annotations() const {
aoqi@0 411 return has_parameter_annotations() ? *(parameter_annotations_addr()) : NULL;
aoqi@0 412 }
aoqi@0 413 void set_parameter_annotations(AnnotationArray* anno) {
aoqi@0 414 *(parameter_annotations_addr()) = anno;
aoqi@0 415 }
aoqi@0 416
aoqi@0 417 AnnotationArray** type_annotations_addr() const;
aoqi@0 418 AnnotationArray* type_annotations() const {
aoqi@0 419 return has_type_annotations() ? *(type_annotations_addr()) : NULL;
aoqi@0 420 }
aoqi@0 421 void set_type_annotations(AnnotationArray* anno) {
aoqi@0 422 *(type_annotations_addr()) = anno;
aoqi@0 423 }
aoqi@0 424
aoqi@0 425 AnnotationArray** default_annotations_addr() const;
aoqi@0 426 AnnotationArray* default_annotations() const {
aoqi@0 427 return has_default_annotations() ? *(default_annotations_addr()) : NULL;
aoqi@0 428 }
aoqi@0 429 void set_default_annotations(AnnotationArray* anno) {
aoqi@0 430 *(default_annotations_addr()) = anno;
aoqi@0 431 }
aoqi@0 432
aoqi@0 433 int method_annotations_length() const {
aoqi@0 434 return has_method_annotations() ? method_annotations()->length() : 0;
aoqi@0 435 }
aoqi@0 436 int parameter_annotations_length() const {
aoqi@0 437 return has_parameter_annotations() ? parameter_annotations()->length() : 0;
aoqi@0 438 }
aoqi@0 439 int type_annotations_length() const {
aoqi@0 440 return has_type_annotations() ? type_annotations()->length() : 0;
aoqi@0 441 }
aoqi@0 442 int default_annotations_length() const {
aoqi@0 443 return has_default_annotations() ? default_annotations()->length() : 0;
aoqi@0 444 }
aoqi@0 445
aoqi@0 446 // Copy annotations from other ConstMethod
aoqi@0 447 void copy_annotations_from(ConstMethod* cm);
aoqi@0 448
aoqi@0 449 // byte codes
aoqi@0 450 void set_code(address code) {
aoqi@0 451 if (code_size() > 0) {
aoqi@0 452 memcpy(code_base(), code, code_size());
aoqi@0 453 }
aoqi@0 454 }
aoqi@0 455 address code_base() const { return (address) (this+1); }
aoqi@0 456 address code_end() const { return code_base() + code_size(); }
aoqi@0 457 bool contains(address bcp) const { return code_base() <= bcp
aoqi@0 458 && bcp < code_end(); }
aoqi@0 459 // Offset to bytecodes
aoqi@0 460 static ByteSize codes_offset()
aoqi@0 461 { return in_ByteSize(sizeof(ConstMethod)); }
aoqi@0 462
aoqi@0 463 static ByteSize constants_offset()
aoqi@0 464 { return byte_offset_of(ConstMethod, _constants); }
aoqi@0 465
aoqi@0 466 static ByteSize max_stack_offset()
aoqi@0 467 { return byte_offset_of(ConstMethod, _max_stack); }
aoqi@0 468 static ByteSize size_of_locals_offset()
aoqi@0 469 { return byte_offset_of(ConstMethod, _max_locals); }
aoqi@0 470 static ByteSize size_of_parameters_offset()
aoqi@0 471 { return byte_offset_of(ConstMethod, _size_of_parameters); }
aoqi@0 472
kevinw@8368 473 static ByteSize result_type_offset()
kevinw@8368 474 { return byte_offset_of(ConstMethod, _result_type); }
aoqi@0 475
aoqi@0 476 // Unique id for the method
aoqi@0 477 static const u2 MAX_IDNUM;
aoqi@0 478 static const u2 UNSET_IDNUM;
aoqi@0 479 u2 method_idnum() const { return _method_idnum; }
aoqi@0 480 void set_method_idnum(u2 idnum) { _method_idnum = idnum; }
aoqi@0 481
sspitsyn@7636 482 u2 orig_method_idnum() const { return _orig_method_idnum; }
sspitsyn@7636 483 void set_orig_method_idnum(u2 idnum) { _orig_method_idnum = idnum; }
sspitsyn@7636 484
aoqi@0 485 // max stack
aoqi@0 486 int max_stack() const { return _max_stack; }
aoqi@0 487 void set_max_stack(int size) { _max_stack = size; }
aoqi@0 488
aoqi@0 489 // max locals
aoqi@0 490 int max_locals() const { return _max_locals; }
aoqi@0 491 void set_max_locals(int size) { _max_locals = size; }
aoqi@0 492
aoqi@0 493 // size of parameters
aoqi@0 494 int size_of_parameters() const { return _size_of_parameters; }
aoqi@0 495 void set_size_of_parameters(int size) { _size_of_parameters = size; }
aoqi@0 496
kevinw@8368 497 void set_result_type(BasicType rt) { assert(rt < 16, "result type too large");
kevinw@8368 498 _result_type = (u1)rt; }
aoqi@0 499 // Deallocation for RedefineClasses
aoqi@0 500 void deallocate_contents(ClassLoaderData* loader_data);
aoqi@0 501 bool is_klass() const { return false; }
aoqi@0 502 DEBUG_ONLY(bool on_stack() { return false; })
aoqi@0 503
aoqi@0 504 private:
aoqi@0 505 // Since the size of the compressed line number table is unknown, the
aoqi@0 506 // offsets of the other variable sized sections are computed backwards
aoqi@0 507 // from the end of the ConstMethod*.
aoqi@0 508
aoqi@0 509 // First byte after ConstMethod*
aoqi@0 510 address constMethod_end() const
aoqi@0 511 { return (address)((intptr_t*)this + _constMethod_size); }
aoqi@0 512
aoqi@0 513 // Last short in ConstMethod*
aoqi@0 514 u2* last_u2_element() const;
aoqi@0 515
aoqi@0 516 public:
aoqi@0 517 // Printing
aoqi@0 518 void print_on (outputStream* st) const;
aoqi@0 519 void print_value_on(outputStream* st) const;
aoqi@0 520
aoqi@0 521 const char* internal_name() const { return "{constMethod}"; }
aoqi@0 522
aoqi@0 523 // Verify
aoqi@0 524 void verify_on(outputStream* st);
aoqi@0 525 };
aoqi@0 526
aoqi@0 527 #endif // SHARE_VM_OOPS_CONSTMETHODOOP_HPP

mercurial