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