hotspot/src/share/vm/prims/jvm.cpp
author coleenp
Mon, 14 Jan 2013 11:01:39 -0500
changeset 15194 a35093d73168
parent 15102 0a86564e5f61
child 15229 5341188db763
child 15221 83925f427779
permissions -rw-r--r--
8006005: Fix constant pool index validation and alignment trap for method parameter reflection Summary: This patch addresses an alignment trap due to the storage format of method parameters data in constMethod. It also adds code to validate constant pool indexes for method parameters data. Reviewed-by: jrose, dholmes Contributed-by: eric.mccorkle@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11256
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: 5089
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5089
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: 5089
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    26
#include "classfile/classLoader.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    27
#include "classfile/javaAssertions.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    28
#include "classfile/javaClasses.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    29
#include "classfile/symbolTable.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    30
#include "classfile/systemDictionary.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    31
#include "classfile/vmSymbols.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    32
#include "gc_interface/collectedHeap.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    33
#include "memory/oopFactory.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    34
#include "memory/universe.inline.hpp"
10546
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10504
diff changeset
    35
#include "oops/fieldStreams.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    36
#include "oops/instanceKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    37
#include "oops/objArrayKlass.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
    38
#include "oops/method.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    39
#include "prims/jvm.h"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    40
#include "prims/jvm_misc.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    41
#include "prims/jvmtiExport.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    42
#include "prims/jvmtiThreadState.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    43
#include "prims/nativeLookup.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    44
#include "prims/privilegedStack.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    45
#include "runtime/arguments.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    46
#include "runtime/dtraceJSDT.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    47
#include "runtime/handles.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    48
#include "runtime/init.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    49
#include "runtime/interfaceSupport.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    50
#include "runtime/java.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    51
#include "runtime/javaCalls.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    52
#include "runtime/jfieldIDWorkaround.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    53
#include "runtime/os.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    54
#include "runtime/perfData.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    55
#include "runtime/reflection.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    56
#include "runtime/vframe.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    57
#include "runtime/vm_operations.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    58
#include "services/attachListener.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    59
#include "services/management.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    60
#include "services/threadService.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    61
#include "utilities/copy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    62
#include "utilities/defaultStream.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    63
#include "utilities/dtrace.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    64
#include "utilities/events.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    65
#include "utilities/histogram.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    66
#include "utilities/top.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    67
#include "utilities/utf8.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    68
#ifdef TARGET_OS_FAMILY_linux
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    69
# include "jvm_linux.h"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    70
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    71
#ifdef TARGET_OS_FAMILY_solaris
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    72
# include "jvm_solaris.h"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    73
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    74
#ifdef TARGET_OS_FAMILY_windows
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    75
# include "jvm_windows.h"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    76
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10546
diff changeset
    77
#ifdef TARGET_OS_FAMILY_bsd
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10546
diff changeset
    78
# include "jvm_bsd.h"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10546
diff changeset
    79
#endif
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    80
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
#include <errno.h>
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
    83
#ifndef USDT2
5089
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4573
diff changeset
    84
HS_DTRACE_PROBE_DECL1(hotspot, thread__sleep__begin, long long);
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4573
diff changeset
    85
HS_DTRACE_PROBE_DECL1(hotspot, thread__sleep__end, int);
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4573
diff changeset
    86
HS_DTRACE_PROBE_DECL0(hotspot, thread__yield);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
    87
#endif /* !USDT2 */
5089
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4573
diff changeset
    88
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  NOTE about use of any ctor or function call that can trigger a safepoint/GC:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  such ctors and calls MUST NOT come between an oop declaration/init and its
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  usage because if objects are move this may cause various memory stomps, bus
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  errors and segfaults. Here is a cookbook for causing so called "naked oop
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  failures":
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
      JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredFields<etc> {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
          JVMWrapper("JVM_GetClassDeclaredFields");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
          // Object address to be held directly in mirror & not visible to GC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
          oop mirror = JNIHandles::resolve_non_null(ofClass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
          // If this ctor can hit a safepoint, moving objects around, then
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
          ComplexConstructor foo;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
          // Boom! mirror may point to JUNK instead of the intended object
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
          (some dereference of mirror)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
          // Here's another call that may block for GC, making mirror stale
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
          MutexLocker ml(some_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
          // And here's an initializer that can result in a stale oop
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
          // all in one step.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
          oop o = call_that_can_throw_exception(TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  The solution is to keep the oop declaration BELOW the ctor or function
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  call that might cause a GC, do another resolve to reassign the oop, or
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  consider use of a Handle instead of an oop so there is immunity from object
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  motion. But note that the "QUICK" entries below do not have a handlemark
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  and thus can only support use of handles passed in.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
*/
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   123
static void trace_class_resolution_impl(Klass* to_class, TRAPS) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  int line_number = -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  const char * source_file = NULL;
2269
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   127
  const char * trace = "explicit";
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13952
diff changeset
   128
  InstanceKlass* caller = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  JavaThread* jthread = JavaThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  if (jthread->has_last_Java_frame()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
    vframeStream vfst(jthread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
    // scan up the stack skipping ClassLoader, AccessController and PrivilegedAction frames
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
   134
    TempNewSymbol access_controller = SymbolTable::new_symbol("java/security/AccessController", CHECK);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   135
    Klass* access_controller_klass = SystemDictionary::resolve_or_fail(access_controller, false, CHECK);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
   136
    TempNewSymbol privileged_action = SymbolTable::new_symbol("java/security/PrivilegedAction", CHECK);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   137
    Klass* privileged_action_klass = SystemDictionary::resolve_or_fail(privileged_action, false, CHECK);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   138
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   139
    Method* last_caller = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
    while (!vfst.at_end()) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   142
      Method* m = vfst.method();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   143
      if (!vfst.method()->method_holder()->is_subclass_of(SystemDictionary::ClassLoader_klass())&&
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   144
          !vfst.method()->method_holder()->is_subclass_of(access_controller_klass) &&
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   145
          !vfst.method()->method_holder()->is_subclass_of(privileged_action_klass)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
      last_caller = m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
      vfst.next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
    // if this is called from Class.forName0 and that is called from Class.forName,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
    // then print the caller of Class.forName.  If this is Class.loadClass, then print
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
    // that caller, otherwise keep quiet since this should be picked up elsewhere.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
    bool found_it = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
    if (!vfst.at_end() &&
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13952
diff changeset
   156
        vfst.method()->method_holder()->name() == vmSymbols::java_lang_Class() &&
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
        vfst.method()->name() == vmSymbols::forName0_name()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
      vfst.next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
      if (!vfst.at_end() &&
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13952
diff changeset
   160
          vfst.method()->method_holder()->name() == vmSymbols::java_lang_Class() &&
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
          vfst.method()->name() == vmSymbols::forName_name()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
        vfst.next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
        found_it = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
    } else if (last_caller != NULL &&
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13952
diff changeset
   166
               last_caller->method_holder()->name() ==
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
               vmSymbols::java_lang_ClassLoader() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
               (last_caller->name() == vmSymbols::loadClassInternal_name() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
                last_caller->name() == vmSymbols::loadClass_name())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
      found_it = true;
2269
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   171
    } else if (!vfst.at_end()) {
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   172
      if (vfst.method()->is_native()) {
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   173
        // JNI call
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   174
        found_it = true;
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   175
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
    if (found_it && !vfst.at_end()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
      // found the caller
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
      caller = vfst.method()->method_holder();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
      line_number = vfst.method()->line_number_from_bci(vfst.bci());
2269
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   181
      if (line_number == -1) {
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   182
        // show method name if it's a native method
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   183
        trace = vfst.method()->name_and_sig_as_C_string();
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   184
      }
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13952
diff changeset
   185
      Symbol* s = caller->source_file_name();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
      if (s != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
        source_file = s->as_C_string();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  if (caller != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
    if (to_class != caller) {
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13952
diff changeset
   193
      const char * from = caller->external_name();
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13952
diff changeset
   194
      const char * to = to_class->external_name();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
      // print in a single call to reduce interleaving between threads
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
      if (source_file != NULL) {
2269
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   197
        tty->print("RESOLVE %s %s %s:%d (%s)\n", from, to, source_file, line_number, trace);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
      } else {
2269
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   199
        tty->print("RESOLVE %s %s (%s)\n", from, to, trace);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   205
void trace_class_resolution(Klass* to_class) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  EXCEPTION_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  trace_class_resolution_impl(to_class, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
    CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
// Wrapper to trace JVM functions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  class JVMTraceWrapper : public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
   public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
    JVMTraceWrapper(const char* format, ...) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
      if (TraceJVMCalls) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
        va_list ap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
        va_start(ap, format);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
        tty->print("JVM ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
        tty->vprint_cr(format, ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
        va_end(ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  Histogram* JVMHistogram;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  volatile jint JVMHistogram_lock = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  class JVMHistogramElement : public HistogramElement {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
    public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
     JVMHistogramElement(const char* name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  JVMHistogramElement::JVMHistogramElement(const char* elementName) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
    _name = elementName;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
    uintx count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
    while (Atomic::cmpxchg(1, &JVMHistogram_lock, 0) != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
      while (OrderAccess::load_acquire(&JVMHistogram_lock) != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
        count +=1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
        if ( (WarnOnStalledSpinLock > 0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
          && (count % WarnOnStalledSpinLock == 0)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
          warning("JVMHistogram_lock seems to be stalled");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
    if(JVMHistogram == NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
      JVMHistogram = new Histogram("JVM Call Counts",100);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
    JVMHistogram->add_element(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
    Atomic::dec(&JVMHistogram_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  #define JVMCountWrapper(arg) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
      static JVMHistogramElement* e = new JVMHistogramElement(arg); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
      if (e != NULL) e->increment_count();  // Due to bug in VC++, we need a NULL check here eventhough it should never happen!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  #define JVMWrapper(arg1)                    JVMCountWrapper(arg1); JVMTraceWrapper(arg1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  #define JVMWrapper2(arg1, arg2)             JVMCountWrapper(arg1); JVMTraceWrapper(arg1, arg2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  #define JVMWrapper3(arg1, arg2, arg3)       JVMCountWrapper(arg1); JVMTraceWrapper(arg1, arg2, arg3)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  #define JVMWrapper4(arg1, arg2, arg3, arg4) JVMCountWrapper(arg1); JVMTraceWrapper(arg1, arg2, arg3, arg4)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  #define JVMWrapper(arg1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  #define JVMWrapper2(arg1, arg2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  #define JVMWrapper3(arg1, arg2, arg3)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  #define JVMWrapper4(arg1, arg2, arg3, arg4)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
// Interface version /////////////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
JVM_LEAF(jint, JVM_GetInterfaceVersion())
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  return JVM_INTERFACE_VERSION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
// java.lang.System //////////////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
JVM_LEAF(jlong, JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  JVMWrapper("JVM_CurrentTimeMillis");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  return os::javaTimeMillis();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
JVM_LEAF(jlong, JVM_NanoTime(JNIEnv *env, jclass ignored))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  JVMWrapper("JVM_NanoTime");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  return os::javaTimeNanos();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
JVM_ENTRY(void, JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
                               jobject dst, jint dst_pos, jint length))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  JVMWrapper("JVM_ArrayCopy");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  // Check if we have null pointers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  if (src == NULL || dst == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
    THROW(vmSymbols::java_lang_NullPointerException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  arrayOop s = arrayOop(JNIHandles::resolve_non_null(src));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  arrayOop d = arrayOop(JNIHandles::resolve_non_null(dst));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  assert(s->is_oop(), "JVM_ArrayCopy: src not an oop");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  assert(d->is_oop(), "JVM_ArrayCopy: dst not an oop");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  // Do copy
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
   308
  s->klass()->copy_array(s, src_pos, d, dst_pos, length, thread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
static void set_property(Handle props, const char* key, const char* value, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  JavaValue r(T_OBJECT);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
  // public synchronized Object put(Object key, Object value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
  HandleMark hm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  Handle key_str    = java_lang_String::create_from_platform_dependent_str(key, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  Handle value_str  = java_lang_String::create_from_platform_dependent_str((value != NULL ? value : ""), CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  JavaCalls::call_virtual(&r,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
                          props,
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
   320
                          KlassHandle(THREAD, SystemDictionary::Properties_klass()),
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
   321
                          vmSymbols::put_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
   322
                          vmSymbols::object_object_object_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
                          key_str,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
                          value_str,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
                          THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
#define PUTPROP(props, name, value) set_property((props), (name), (value), CHECK_(properties));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
JVM_ENTRY(jobject, JVM_InitProperties(JNIEnv *env, jobject properties))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  JVMWrapper("JVM_InitProperties");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
  Handle props(THREAD, JNIHandles::resolve_non_null(properties));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  // System property list includes both user set via -D option and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  // jvm system specific properties.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
  for (SystemProperty* p = Arguments::system_properties(); p != NULL; p = p->next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
    PUTPROP(props, p->key(), p->value());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
  // Convert the -XX:MaxDirectMemorySize= command line flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
  // to the sun.nio.MaxDirectMemorySize property.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  // Do this after setting user properties to prevent people
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
  // from setting the value with a -D option, as requested.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  {
13197
b552dfeffb3c 7179383: MaxDirectMemorySize argument parsing is broken for values >2G
dholmes
parents: 12231
diff changeset
   349
    if (FLAG_IS_DEFAULT(MaxDirectMemorySize)) {
b552dfeffb3c 7179383: MaxDirectMemorySize argument parsing is broken for values >2G
dholmes
parents: 12231
diff changeset
   350
      PUTPROP(props, "sun.nio.MaxDirectMemorySize", "-1");
b552dfeffb3c 7179383: MaxDirectMemorySize argument parsing is broken for values >2G
dholmes
parents: 12231
diff changeset
   351
    } else {
b552dfeffb3c 7179383: MaxDirectMemorySize argument parsing is broken for values >2G
dholmes
parents: 12231
diff changeset
   352
      char as_chars[256];
b552dfeffb3c 7179383: MaxDirectMemorySize argument parsing is broken for values >2G
dholmes
parents: 12231
diff changeset
   353
      jio_snprintf(as_chars, sizeof(as_chars), UINTX_FORMAT, MaxDirectMemorySize);
b552dfeffb3c 7179383: MaxDirectMemorySize argument parsing is broken for values >2G
dholmes
parents: 12231
diff changeset
   354
      PUTPROP(props, "sun.nio.MaxDirectMemorySize", as_chars);
b552dfeffb3c 7179383: MaxDirectMemorySize argument parsing is broken for values >2G
dholmes
parents: 12231
diff changeset
   355
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  // JVM monitoring and management support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
  // Add the sun.management.compiler property for the compiler's name
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
#undef CSIZE
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
#if defined(_LP64) || defined(_WIN64)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  #define CSIZE "64-Bit "
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  #define CSIZE
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
#endif // 64bit
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
#ifdef TIERED
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
    const char* compiler_name = "HotSpot " CSIZE "Tiered Compilers";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
#if defined(COMPILER1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
    const char* compiler_name = "HotSpot " CSIZE "Client Compiler";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
#elif defined(COMPILER2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
    const char* compiler_name = "HotSpot " CSIZE "Server Compiler";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
    const char* compiler_name = "";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
#endif // compilers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
#endif // TIERED
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
    if (*compiler_name != '\0' &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
        (Arguments::mode() != Arguments::_int)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
      PUTPROP(props, "sun.management.compiler", compiler_name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  return properties;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
// java.lang.Runtime /////////////////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
extern volatile jint vm_created;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
JVM_ENTRY_NO_ENV(void, JVM_Exit(jint code))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  if (vm_created != 0 && (code == 0)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
    // The VM is about to exit. We call back into Java to check whether finalizers should be run
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
    Universe::run_finalizers_on_exit();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  before_exit(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  vm_exit(code);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
JVM_ENTRY_NO_ENV(void, JVM_Halt(jint code))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
  before_exit(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  vm_exit(code);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
JVM_LEAF(void, JVM_OnExit(void (*func)(void)))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
  register_on_exit_function(func);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
JVM_ENTRY_NO_ENV(void, JVM_GC(void))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  JVMWrapper("JVM_GC");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  if (!DisableExplicitGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
    Universe::heap()->collect(GCCause::_java_lang_system_gc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
JVM_LEAF(jlong, JVM_MaxObjectInspectionAge(void))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
  JVMWrapper("JVM_MaxObjectInspectionAge");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
  return Universe::heap()->millis_since_last_gc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
JVM_LEAF(void, JVM_TraceInstructions(jboolean on))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  if (PrintJVMWarnings) warning("JVM_TraceInstructions not supported");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
JVM_LEAF(void, JVM_TraceMethodCalls(jboolean on))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
  if (PrintJVMWarnings) warning("JVM_TraceMethodCalls not supported");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
static inline jlong convert_size_t_to_jlong(size_t val) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
  // In the 64-bit vm, a size_t can overflow a jlong (which is signed).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
  NOT_LP64 (return (jlong)val;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  LP64_ONLY(return (jlong)MIN2(val, (size_t)max_jlong);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
JVM_ENTRY_NO_ENV(jlong, JVM_TotalMemory(void))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  JVMWrapper("JVM_TotalMemory");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  size_t n = Universe::heap()->capacity();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  return convert_size_t_to_jlong(n);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
JVM_ENTRY_NO_ENV(jlong, JVM_FreeMemory(void))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
  JVMWrapper("JVM_FreeMemory");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
  CollectedHeap* ch = Universe::heap();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 363
diff changeset
   454
  size_t n;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 363
diff changeset
   455
  {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 363
diff changeset
   456
     MutexLocker x(Heap_lock);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 363
diff changeset
   457
     n = ch->capacity() - ch->used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 363
diff changeset
   458
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
  return convert_size_t_to_jlong(n);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
JVM_ENTRY_NO_ENV(jlong, JVM_MaxMemory(void))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
  JVMWrapper("JVM_MaxMemory");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
  size_t n = Universe::heap()->max_capacity();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
  return convert_size_t_to_jlong(n);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
JVM_ENTRY_NO_ENV(jint, JVM_ActiveProcessorCount(void))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
  JVMWrapper("JVM_ActiveProcessorCount");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
  return os::active_processor_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
// java.lang.Throwable //////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
JVM_ENTRY(void, JVM_FillInStackTrace(JNIEnv *env, jobject receiver))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
  JVMWrapper("JVM_FillInStackTrace");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
  Handle exception(thread, JNIHandles::resolve_non_null(receiver));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
  java_lang_Throwable::fill_in_stack_trace(exception);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
JVM_ENTRY(void, JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
  JVMWrapper("JVM_PrintStackTrace");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
  // Note: This is no longer used in Merlin, but we still support it for compatibility.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
  oop exception = JNIHandles::resolve_non_null(receiver);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
  oop stream    = JNIHandles::resolve_non_null(printable);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
  java_lang_Throwable::print_stack_trace(exception, stream);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
JVM_ENTRY(jint, JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  JVMWrapper("JVM_GetStackTraceDepth");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  oop exception = JNIHandles::resolve(throwable);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
  return java_lang_Throwable::get_stack_trace_depth(exception, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
JVM_ENTRY(jobject, JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
  JVMWrapper("JVM_GetStackTraceElement");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
  JvmtiVMObjectAllocEventCollector oam; // This ctor (throughout this module) may trigger a safepoint/GC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
  oop exception = JNIHandles::resolve(throwable);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
  oop element = java_lang_Throwable::get_stack_trace_element(exception, index, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
  return JNIHandles::make_local(env, element);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
// java.lang.Object ///////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
JVM_ENTRY(jint, JVM_IHashCode(JNIEnv* env, jobject handle))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
  JVMWrapper("JVM_IHashCode");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
  // as implemented in the classic virtual machine; return 0 if object is NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
  return handle == NULL ? 0 : ObjectSynchronizer::FastHashCode (THREAD, JNIHandles::resolve_non_null(handle)) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
JVM_ENTRY(void, JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
  JVMWrapper("JVM_MonitorWait");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
  JavaThreadInObjectWaitState jtiows(thread, ms != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
  if (JvmtiExport::should_post_monitor_wait()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
    JvmtiExport::post_monitor_wait((JavaThread *)THREAD, (oop)obj(), ms);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
  ObjectSynchronizer::wait(obj, ms, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
JVM_ENTRY(void, JVM_MonitorNotify(JNIEnv* env, jobject handle))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
  JVMWrapper("JVM_MonitorNotify");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
  Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
  ObjectSynchronizer::notify(obj, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
JVM_ENTRY(void, JVM_MonitorNotifyAll(JNIEnv* env, jobject handle))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
  JVMWrapper("JVM_MonitorNotifyAll");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
  Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
  ObjectSynchronizer::notifyall(obj, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
JVM_ENTRY(jobject, JVM_Clone(JNIEnv* env, jobject handle))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
  JVMWrapper("JVM_Clone");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
  Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  const KlassHandle klass (THREAD, obj->klass());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
  // Just checking that the cloneable flag is set correct
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   555
  if (obj->is_array()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
    guarantee(klass->is_cloneable(), "all arrays are cloneable");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
    guarantee(obj->is_instance(), "should be instanceOop");
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
   559
    bool cloneable = klass->is_subtype_of(SystemDictionary::Cloneable_klass());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
    guarantee(cloneable == klass->is_cloneable(), "incorrect cloneable flag");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
  // Check if class of obj supports the Cloneable interface.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
  // All arrays are considered to be cloneable (See JLS 20.1.5)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
  if (!klass->is_cloneable()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
    ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
    THROW_MSG_0(vmSymbols::java_lang_CloneNotSupportedException(), klass->external_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
  // Make shallow object copy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
  const int size = obj->size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
  oop new_obj = NULL;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   574
  if (obj->is_array()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
    const int length = ((arrayOop)obj())->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
    new_obj = CollectedHeap::array_allocate(klass, size, length, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
    new_obj = CollectedHeap::obj_allocate(klass, size, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
  // 4839641 (4840070): We must do an oop-atomic copy, because if another thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
  // is modifying a reference field in the clonee, a non-oop-atomic copy might
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
  // be suspended in the middle of copying the pointer and end up with parts
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
  // of two different pointers in the field.  Subsequent dereferences will crash.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
  // 4846409: an oop-copy of objects with long or double fields or arrays of same
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
  // won't copy the longs/doubles atomically in 32-bit vm's, so we copy jlongs instead
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
  // of oops.  We know objects are aligned on a minimum of an jlong boundary.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
  // The same is true of StubRoutines::object_copy and the various oop_copy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
  // variants, and of the code generated by the inline_native_clone intrinsic.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
  assert(MinObjAlignmentInBytes >= BytesPerLong, "objects misaligned");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
  Copy::conjoint_jlongs_atomic((jlong*)obj(), (jlong*)new_obj,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
                               (size_t)align_object_size(size) / HeapWordsPerLong);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
  // Clear the header
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
  new_obj->init_mark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
  // Store check (mark entire object and let gc sort it out)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
  BarrierSet* bs = Universe::heap()->barrier_set();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
  assert(bs->has_write_region_opt(), "Barrier set does not have write_region");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
  bs->write_region(MemRegion((HeapWord*)new_obj, size));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
  // Caution: this involves a java upcall, so the clone should be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
  // "gc-robust" by this stage.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
  if (klass->has_finalizer()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
    assert(obj->is_instance(), "should be instanceOop");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   604
    new_obj = InstanceKlass::register_finalizer(instanceOop(new_obj), CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
  return JNIHandles::make_local(env, oop(new_obj));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
// java.lang.Compiler ////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
// The initial cuts of the HotSpot VM will not support JITs, and all existing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
// JITs would need extensive changes to work with HotSpot.  The JIT-related JVM
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
// functions are all silently ignored unless JVM warnings are printed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
JVM_LEAF(void, JVM_InitializeCompiler (JNIEnv *env, jclass compCls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
  if (PrintJVMWarnings) warning("JVM_InitializeCompiler not supported");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
JVM_LEAF(jboolean, JVM_IsSilentCompiler(JNIEnv *env, jclass compCls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
  if (PrintJVMWarnings) warning("JVM_IsSilentCompiler not supported");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
  return JNI_FALSE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
JVM_LEAF(jboolean, JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
  if (PrintJVMWarnings) warning("JVM_CompileClass not supported");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
  return JNI_FALSE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
JVM_LEAF(jboolean, JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
  if (PrintJVMWarnings) warning("JVM_CompileClasses not supported");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
  return JNI_FALSE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
JVM_LEAF(jobject, JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
  if (PrintJVMWarnings) warning("JVM_CompilerCommand not supported");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
JVM_LEAF(void, JVM_EnableCompiler(JNIEnv *env, jclass compCls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
  if (PrintJVMWarnings) warning("JVM_EnableCompiler not supported");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
JVM_LEAF(void, JVM_DisableCompiler(JNIEnv *env, jclass compCls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
  if (PrintJVMWarnings) warning("JVM_DisableCompiler not supported");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
// Error message support //////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
JVM_LEAF(jint, JVM_GetLastErrorString(char *buf, int len))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
  JVMWrapper("JVM_GetLastErrorString");
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   660
  return (jint)os::lasterror(buf, len);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
// java.io.File ///////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
JVM_LEAF(char*, JVM_NativePath(char* path))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
  JVMWrapper2("JVM_NativePath (%s)", path);
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
   668
  return os::native_path(path);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
// Misc. class handling ///////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
JVM_ENTRY(jclass, JVM_GetCallerClass(JNIEnv* env, int depth))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
  JVMWrapper("JVM_GetCallerClass");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   677
  Klass* k = thread->security_get_caller_class(depth);
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
   678
  return (k == NULL) ? NULL : (jclass) JNIHandles::make_local(env, k->java_mirror());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
JVM_ENTRY(jclass, JVM_FindPrimitiveClass(JNIEnv* env, const char* utf))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
  JVMWrapper("JVM_FindPrimitiveClass");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
  oop mirror = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
  BasicType t = name2type(utf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
  if (t != T_ILLEGAL && t != T_OBJECT && t != T_ARRAY) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
    mirror = Universe::java_mirror(t);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
  if (mirror == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
    THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), (char*) utf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
    return (jclass) JNIHandles::make_local(env, mirror);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
JVM_ENTRY(void, JVM_ResolveClass(JNIEnv* env, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
  JVMWrapper("JVM_ResolveClass");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
  if (PrintJVMWarnings) warning("JVM_ResolveClass not implemented");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
3578
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   702
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   703
// Returns a class loaded by the bootstrap class loader; or null
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   704
// if not found.  ClassNotFoundException is not thrown.
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   705
//
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   706
// Rationale behind JVM_FindClassFromBootLoader
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   707
// a> JVM_FindClassFromClassLoader was never exported in the export tables.
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   708
// b> because of (a) java.dll has a direct dependecy on the  unexported
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   709
//    private symbol "_JVM_FindClassFromClassLoader@20".
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   710
// c> the launcher cannot use the private symbol as it dynamically opens
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   711
//    the entry point, so if something changes, the launcher will fail
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   712
//    unexpectedly at runtime, it is safest for the launcher to dlopen a
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   713
//    stable exported interface.
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   714
// d> re-exporting JVM_FindClassFromClassLoader as public, will cause its
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   715
//    signature to change from _JVM_FindClassFromClassLoader@20 to
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   716
//    JVM_FindClassFromClassLoader and will not be backward compatible
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   717
//    with older JDKs.
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   718
// Thus a public/stable exported entry point is the right solution,
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   719
// public here means public in linker semantics, and is exported only
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   720
// to the JDK, and is not intended to be a public API.
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   721
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   722
JVM_ENTRY(jclass, JVM_FindClassFromBootLoader(JNIEnv* env,
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   723
                                              const char* name))
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   724
  JVMWrapper2("JVM_FindClassFromBootLoader %s", name);
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   725
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   726
  // Java libraries should ensure that name is never null...
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
   727
  if (name == NULL || (int)strlen(name) > Symbol::max_length()) {
3578
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   728
    // It's impossible to create this class;  the name cannot fit
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   729
    // into the constant pool.
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   730
    return NULL;
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   731
  }
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   732
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
   733
  TempNewSymbol h_name = SymbolTable::new_symbol(name, CHECK_NULL);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   734
  Klass* k = SystemDictionary::resolve_or_null(h_name, CHECK_NULL);
3578
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   735
  if (k == NULL) {
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   736
    return NULL;
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   737
  }
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   738
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   739
  if (TraceClassResolution) {
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   740
    trace_class_resolution(k);
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   741
  }
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
   742
  return (jclass) JNIHandles::make_local(env, k->java_mirror());
3578
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   743
JVM_END
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   744
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   745
JVM_ENTRY(jclass, JVM_FindClassFromClassLoader(JNIEnv* env, const char* name,
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   746
                                               jboolean init, jobject loader,
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   747
                                               jboolean throwError))
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   748
  JVMWrapper3("JVM_FindClassFromClassLoader %s throw %s", name,
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
   749
               throwError ? "error" : "exception");
1420
d116726a4ca4 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 1388
diff changeset
   750
  // Java libraries should ensure that name is never null...
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
   751
  if (name == NULL || (int)strlen(name) > Symbol::max_length()) {
1420
d116726a4ca4 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 1388
diff changeset
   752
    // It's impossible to create this class;  the name cannot fit
d116726a4ca4 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 1388
diff changeset
   753
    // into the constant pool.
d116726a4ca4 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 1388
diff changeset
   754
    if (throwError) {
d116726a4ca4 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 1388
diff changeset
   755
      THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
d116726a4ca4 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 1388
diff changeset
   756
    } else {
d116726a4ca4 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 1388
diff changeset
   757
      THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), name);
d116726a4ca4 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 1388
diff changeset
   758
    }
d116726a4ca4 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 1388
diff changeset
   759
  }
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
   760
  TempNewSymbol h_name = SymbolTable::new_symbol(name, CHECK_NULL);
1420
d116726a4ca4 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 1388
diff changeset
   761
  Handle h_loader(THREAD, JNIHandles::resolve(loader));
d116726a4ca4 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 1388
diff changeset
   762
  jclass result = find_class_from_class_loader(env, h_name, init, h_loader,
d116726a4ca4 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 1388
diff changeset
   763
                                               Handle(), throwError, THREAD);
d116726a4ca4 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 1388
diff changeset
   764
d116726a4ca4 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 1388
diff changeset
   765
  if (TraceClassResolution && result != NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   766
    trace_class_resolution(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(result)));
1420
d116726a4ca4 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 1388
diff changeset
   767
  }
d116726a4ca4 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 1388
diff changeset
   768
  return result;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
JVM_ENTRY(jclass, JVM_FindClassFromClass(JNIEnv *env, const char *name,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
                                         jboolean init, jclass from))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
  JVMWrapper2("JVM_FindClassFromClass %s", name);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
   775
  if (name == NULL || (int)strlen(name) > Symbol::max_length()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
    // It's impossible to create this class;  the name cannot fit
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
    // into the constant pool.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
    THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
  }
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
   780
  TempNewSymbol h_name = SymbolTable::new_symbol(name, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
  oop from_class_oop = JNIHandles::resolve(from);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   782
  Klass* from_class = (from_class_oop == NULL)
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   783
                           ? (Klass*)NULL
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   784
                           : java_lang_Class::as_Klass(from_class_oop);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
  oop class_loader = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
  oop protection_domain = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
  if (from_class != NULL) {
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
   788
    class_loader = from_class->class_loader();
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
   789
    protection_domain = from_class->protection_domain();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
  Handle h_loader(THREAD, class_loader);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
  Handle h_prot  (THREAD, protection_domain);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
  jclass result = find_class_from_class_loader(env, h_name, init, h_loader,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
                                               h_prot, true, thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
  if (TraceClassResolution && result != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
    // this function is generally only used for class loading during verification.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
    ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
    oop from_mirror = JNIHandles::resolve_non_null(from);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   800
    Klass* from_class = java_lang_Class::as_Klass(from_mirror);
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
   801
    const char * from_name = from_class->external_name();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
    oop mirror = JNIHandles::resolve_non_null(result);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   804
    Klass* to_class = java_lang_Class::as_Klass(mirror);
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
   805
    const char * to = to_class->external_name();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
    tty->print("RESOLVE %s %s (verification)\n", from_name, to);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
static void is_lock_held_by_thread(Handle loader, PerfCounter* counter, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
  if (loader.is_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
  // check whether the current caller thread holds the lock or not.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
  // If not, increment the corresponding counter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
  if (ObjectSynchronizer::query_lock_ownership((JavaThread*)THREAD, loader) !=
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
      ObjectSynchronizer::owner_self) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
    counter->inc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
// common code for JVM_DefineClass() and JVM_DefineClassWithSource()
3820
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 3578
diff changeset
   826
// and JVM_DefineClassWithSourceCond()
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 3578
diff changeset
   827
static jclass jvm_define_class_common(JNIEnv *env, const char *name,
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 3578
diff changeset
   828
                                      jobject loader, const jbyte *buf,
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 3578
diff changeset
   829
                                      jsize len, jobject pd, const char *source,
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 3578
diff changeset
   830
                                      jboolean verify, TRAPS) {
1550
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1420
diff changeset
   831
  if (source == NULL)  source = "__JVM_DefineClass__";
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
3575
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2570
diff changeset
   833
  assert(THREAD->is_Java_thread(), "must be a JavaThread");
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2570
diff changeset
   834
  JavaThread* jt = (JavaThread*) THREAD;
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2570
diff changeset
   835
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2570
diff changeset
   836
  PerfClassTraceTime vmtimer(ClassLoader::perf_define_appclass_time(),
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2570
diff changeset
   837
                             ClassLoader::perf_define_appclass_selftime(),
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2570
diff changeset
   838
                             ClassLoader::perf_define_appclasses(),
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2570
diff changeset
   839
                             jt->get_thread_stat()->perf_recursion_counts_addr(),
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2570
diff changeset
   840
                             jt->get_thread_stat()->perf_timers_addr(),
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2570
diff changeset
   841
                             PerfClassTraceTime::DEFINE_CLASS);
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2570
diff changeset
   842
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2570
diff changeset
   843
  if (UsePerfData) {
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2570
diff changeset
   844
    ClassLoader::perf_app_classfile_bytes_read()->inc(len);
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2570
diff changeset
   845
  }
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2570
diff changeset
   846
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
  // Since exceptions can be thrown, class initialization can take place
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
  // if name is NULL no check for class name in .class stream has to be made.
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
   849
  TempNewSymbol class_name = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
  if (name != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
    const int str_len = (int)strlen(name);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
   852
    if (str_len > Symbol::max_length()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
      // It's impossible to create this class;  the name cannot fit
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
      // into the constant pool.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
      THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
    }
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
   857
    class_name = SymbolTable::new_symbol(name, str_len, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
  ClassFileStream st((u1*) buf, len, (char *)source);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
  Handle class_loader (THREAD, JNIHandles::resolve(loader));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
  if (UsePerfData) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
    is_lock_held_by_thread(class_loader,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
                           ClassLoader::sync_JVMDefineClassLockFreeCounter(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
                           THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
  Handle protection_domain (THREAD, JNIHandles::resolve(pd));
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   869
  Klass* k = SystemDictionary::resolve_from_stream(class_name, class_loader,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
                                                     protection_domain, &st,
3820
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 3578
diff changeset
   871
                                                     verify != 0,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
                                                     CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
  if (TraceClassResolution && k != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
    trace_class_resolution(k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
   878
  return (jclass) JNIHandles::make_local(env, k->java_mirror());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
JVM_ENTRY(jclass, JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
  JVMWrapper2("JVM_DefineClass %s", name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
3820
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 3578
diff changeset
   885
  return jvm_define_class_common(env, name, loader, buf, len, pd, NULL, true, THREAD);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
JVM_ENTRY(jclass, JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
  JVMWrapper2("JVM_DefineClassWithSource %s", name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
3820
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 3578
diff changeset
   892
  return jvm_define_class_common(env, name, loader, buf, len, pd, source, true, THREAD);
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 3578
diff changeset
   893
JVM_END
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 3578
diff changeset
   894
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 3578
diff changeset
   895
JVM_ENTRY(jclass, JVM_DefineClassWithSourceCond(JNIEnv *env, const char *name,
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 3578
diff changeset
   896
                                                jobject loader, const jbyte *buf,
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 3578
diff changeset
   897
                                                jsize len, jobject pd,
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 3578
diff changeset
   898
                                                const char *source, jboolean verify))
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 3578
diff changeset
   899
  JVMWrapper2("JVM_DefineClassWithSourceCond %s", name);
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 3578
diff changeset
   900
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 3578
diff changeset
   901
  return jvm_define_class_common(env, name, loader, buf, len, pd, source, verify, THREAD);
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 3578
diff changeset
   902
JVM_END
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
JVM_ENTRY(jclass, JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
  JVMWrapper("JVM_FindLoadedClass");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
  Handle h_name (THREAD, JNIHandles::resolve_non_null(name));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
  Handle string = java_lang_String::internalize_classname(h_name, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
  const char* str   = java_lang_String::as_utf8_string(string());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
  // Sanity check, don't expect null
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
  if (str == NULL) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
  const int str_len = (int)strlen(str);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
   916
  if (str_len > Symbol::max_length()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
    // It's impossible to create this class;  the name cannot fit
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
    // into the constant pool.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
  }
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
   921
  TempNewSymbol klass_name = SymbolTable::new_symbol(str, str_len, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
  // Security Note:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
  //   The Java level wrapper will perform the necessary security check allowing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
  //   us to pass the NULL as the initiating class loader.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
  Handle h_loader(THREAD, JNIHandles::resolve(loader));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
  if (UsePerfData) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
    is_lock_held_by_thread(h_loader,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
                           ClassLoader::sync_JVMFindLoadedClassLockFreeCounter(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
                           THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   933
  Klass* k = SystemDictionary::find_instance_or_array_klass(klass_name,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
                                                              h_loader,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
                                                              Handle(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
                                                              CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
  return (k == NULL) ? NULL :
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
   939
            (jclass) JNIHandles::make_local(env, k->java_mirror());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
// Reflection support //////////////////////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
JVM_ENTRY(jstring, JVM_GetClassName(JNIEnv *env, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
  assert (cls != NULL, "illegal class");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
  JVMWrapper("JVM_GetClassName");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   949
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   950
  const char* name;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
  if (java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
    name = type2name(java_lang_Class::primitive_type(JNIHandles::resolve(cls)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   954
    // Consider caching interned string in Klass
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   955
    Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
    assert(k->is_klass(), "just checking");
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
   957
    name = k->external_name();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   958
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   959
  oop result = StringTable::intern((char*) name, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
  return (jstring) JNIHandles::make_local(env, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
JVM_ENTRY(jobjectArray, JVM_GetClassInterfaces(JNIEnv *env, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
  JVMWrapper("JVM_GetClassInterfaces");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
  oop mirror = JNIHandles::resolve_non_null(cls);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
  // Special handling for primitive objects
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
  if (java_lang_Class::is_primitive(mirror)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
    // Primitive objects does not have any interfaces
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
   972
    objArrayOop r = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
    return (jobjectArray) JNIHandles::make_local(env, r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   976
  KlassHandle klass(thread, java_lang_Class::as_Klass(mirror));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
  // Figure size of result array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
  int size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
  if (klass->oop_is_instance()) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   980
    size = InstanceKlass::cast(klass())->local_interfaces()->length();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
    assert(klass->oop_is_objArray() || klass->oop_is_typeArray(), "Illegal mirror klass");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
    size = 2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
  // Allocate result array
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
   987
  objArrayOop r = oopFactory::new_objArray(SystemDictionary::Class_klass(), size, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
  objArrayHandle result (THREAD, r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
  // Fill in result
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
  if (klass->oop_is_instance()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
    // Regular instance klass, fill in all local interfaces
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
    for (int index = 0; index < size; index++) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   993
      Klass* k = InstanceKlass::cast(klass())->local_interfaces()->at(index);
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
   994
      result->obj_at_put(index, k->java_mirror());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
    // All arrays implement java.lang.Cloneable and java.io.Serializable
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
   998
    result->obj_at_put(0, SystemDictionary::Cloneable_klass()->java_mirror());
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
   999
    result->obj_at_put(1, SystemDictionary::Serializable_klass()->java_mirror());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
  return (jobjectArray) JNIHandles::make_local(env, result());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
JVM_ENTRY(jobject, JVM_GetClassLoader(JNIEnv *env, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
  JVMWrapper("JVM_GetClassLoader");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
  if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1010
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  1011
  oop loader = k->class_loader();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
  return JNIHandles::make_local(env, loader);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
JVM_QUICK_ENTRY(jboolean, JVM_IsInterface(JNIEnv *env, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
  JVMWrapper("JVM_IsInterface");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
  oop mirror = JNIHandles::resolve_non_null(cls);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
  if (java_lang_Class::is_primitive(mirror)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
    return JNI_FALSE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1022
  Klass* k = java_lang_Class::as_Klass(mirror);
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  1023
  jboolean result = k->is_interface();
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  1024
  assert(!result || k->oop_is_instance(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
         "all interfaces are instance types");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
  // The compiler intrinsic for isInterface tests the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
  // Klass::_access_flags bits in the same way.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
JVM_ENTRY(jobjectArray, JVM_GetClassSigners(JNIEnv *env, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
  JVMWrapper("JVM_GetClassSigners");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
  if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
    // There are no signers for primitive types
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1040
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
  objArrayOop signers = NULL;
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  1042
  if (k->oop_is_instance()) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1043
    signers = InstanceKlass::cast(k)->signers();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
  // If there are no signers set in the class, or if the class
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
  // is an array, return NULL.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
  if (signers == NULL) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
  // copy of the signers array
13952
e3cf184080bc 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 13728
diff changeset
  1051
  Klass* element = ObjArrayKlass::cast(signers->klass())->element_klass();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
  objArrayOop signers_copy = oopFactory::new_objArray(element, signers->length(), CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
  for (int index = 0; index < signers->length(); index++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
    signers_copy->obj_at_put(index, signers->obj_at(index));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
  // return the copy
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
  return (jobjectArray) JNIHandles::make_local(env, signers_copy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
JVM_ENTRY(void, JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
  JVMWrapper("JVM_SetClassSigners");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
  if (!java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
    // This call is ignored for primitive types and arrays.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
    // Signers are only set once, ClassLoader.java, and thus shouldn't
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
    // be called with an array.  Only the bootstrap loader creates arrays.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1068
    Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  1069
    if (k->oop_is_instance()) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1070
      InstanceKlass::cast(k)->set_signers(objArrayOop(JNIHandles::resolve(signers)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
JVM_ENTRY(jobject, JVM_GetProtectionDomain(JNIEnv *env, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
  JVMWrapper("JVM_GetProtectionDomain");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
  if (JNIHandles::resolve(cls) == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
    THROW_(vmSymbols::java_lang_NullPointerException(), NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1080
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1082
  if (java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
    // Primitive types does not have a protection domain.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1084
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1086
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1087
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  1088
  return (jobject) JNIHandles::make_local(env, k->protection_domain());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1089
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
// Obsolete since 1.2 (Class.setProtectionDomain removed), although
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1093
// still defined in core libraries as of 1.5.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
JVM_ENTRY(void, JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
  JVMWrapper("JVM_SetProtectionDomain");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
  if (JNIHandles::resolve(cls) == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
    THROW(vmSymbols::java_lang_NullPointerException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
  if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
    // Call is ignored for primitive types
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1101
    Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
    // cls won't be an array, as this called only from ClassLoader.defineClass
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  1104
    if (k->oop_is_instance()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
      oop pd = JNIHandles::resolve(protection_domain);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
      assert(pd == NULL || pd->is_oop(), "just checking");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1107
      InstanceKlass::cast(k)->set_protection_domain(pd);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
JVM_ENTRY(jobject, JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
  JVMWrapper("JVM_DoPrivileged");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
  if (action == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
    THROW_MSG_0(vmSymbols::java_lang_NullPointerException(), "Null action");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
  // Stack allocated list of privileged stack elements
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
  PrivilegedElement pi;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1122
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1123
  // Check that action object understands "Object run()"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
  Handle object (THREAD, JNIHandles::resolve(action));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
  // get run() method
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  1127
  Method* m_oop = object->klass()->uncached_lookup_method(
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
                                           vmSymbols::run_method_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
                                           vmSymbols::void_object_signature());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
  methodHandle m (THREAD, m_oop);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1131
  if (m.is_null() || !m->is_method() || !m()->is_public() || m()->is_static()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
    THROW_MSG_0(vmSymbols::java_lang_InternalError(), "No run method");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
  // Compute the frame initiating the do privileged operation and setup the privileged stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1136
  vframeStream vfst(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
  vfst.security_get_caller_frame(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
  if (!vfst.at_end()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
    pi.initialize(&vfst, JNIHandles::resolve(context), thread->privileged_stack_top(), CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
    thread->set_privileged_stack_top(&pi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
  // invoke the Object run() in the action object. We cannot use call_interface here, since the static type
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
  // is not really known - it is either java.security.PrivilegedAction or java.security.PrivilegedExceptionAction
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1147
  Handle pending_exception;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1148
  JavaValue result(T_OBJECT);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1149
  JavaCallArguments args(object);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
  JavaCalls::call(&result, m, &args, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
  // done with action, remove ourselves from the list
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
  if (!vfst.at_end()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
    assert(thread->privileged_stack_top() != NULL && thread->privileged_stack_top() == &pi, "wrong top element");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
    thread->set_privileged_stack_top(thread->privileged_stack_top()->next());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1156
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1157
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1158
  if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1159
    pending_exception = Handle(THREAD, PENDING_EXCEPTION);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1160
    CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1161
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  1162
    if ( pending_exception->is_a(SystemDictionary::Exception_klass()) &&
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  1163
        !pending_exception->is_a(SystemDictionary::RuntimeException_klass())) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1164
      // Throw a java.security.PrivilegedActionException(Exception e) exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1165
      JavaCallArguments args(pending_exception);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1166
      THROW_ARG_0(vmSymbols::java_security_PrivilegedActionException(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1167
                  vmSymbols::exception_void_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
                  &args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
  if (pending_exception.not_null()) THROW_OOP_0(pending_exception());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
  return JNIHandles::make_local(env, (oop) result.get_jobject());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
// Returns the inherited_access_control_context field of the running thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
JVM_ENTRY(jobject, JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
  JVMWrapper("JVM_GetInheritedAccessControlContext");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1180
  oop result = java_lang_Thread::inherited_access_control_context(thread->threadObj());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1181
  return JNIHandles::make_local(env, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
class RegisterArrayForGC {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
  JavaThread *_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1188
  RegisterArrayForGC(JavaThread *thread, GrowableArray<oop>* array)  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
    _thread = thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1190
    _thread->register_array_for_gc(array);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
  ~RegisterArrayForGC() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
    _thread->register_array_for_gc(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1197
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
JVM_ENTRY(jobject, JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
  JVMWrapper("JVM_GetStackAccessControlContext");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1201
  if (!UsePrivilegedStack) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1202
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1203
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
  GrowableArray<oop>* local_array = new GrowableArray<oop>(12);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
  // count the protection domains on the execution stack. We collapse
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1208
  // duplicate consecutive protection domains into a single one, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1209
  // well as stopping when we hit a privileged frame.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1210
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1211
  // Use vframeStream to iterate through Java frames
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1212
  vframeStream vfst(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1213
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1214
  oop previous_protection_domain = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1215
  Handle privileged_context(thread, NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1216
  bool is_privileged = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1217
  oop protection_domain = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1218
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1219
  for(; !vfst.at_end(); vfst.next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1220
    // get method of frame
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1221
    Method* method = vfst.method();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1222
    intptr_t* frame_id   = vfst.frame_id();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1223
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1224
    // check the privileged frames to see if we have a match
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1225
    if (thread->privileged_stack_top() && thread->privileged_stack_top()->frame_id() == frame_id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1226
      // this frame is privileged
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1227
      is_privileged = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1228
      privileged_context = Handle(thread, thread->privileged_stack_top()->privileged_context());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1229
      protection_domain  = thread->privileged_stack_top()->protection_domain();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1230
    } else {
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13952
diff changeset
  1231
      protection_domain = method->method_holder()->protection_domain();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1232
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1233
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1234
    if ((previous_protection_domain != protection_domain) && (protection_domain != NULL)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1235
      local_array->push(protection_domain);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1236
      previous_protection_domain = protection_domain;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1237
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1238
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1239
    if (is_privileged) break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1240
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1241
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1242
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1243
  // either all the domains on the stack were system domains, or
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1244
  // we had a privileged system domain
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1245
  if (local_array->is_empty()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1246
    if (is_privileged && privileged_context.is_null()) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1247
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1248
    oop result = java_security_AccessControlContext::create(objArrayHandle(), is_privileged, privileged_context, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1249
    return JNIHandles::make_local(env, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1250
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1251
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1252
  // the resource area must be registered in case of a gc
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1253
  RegisterArrayForGC ragc(thread, local_array);
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  1254
  objArrayOop context = oopFactory::new_objArray(SystemDictionary::ProtectionDomain_klass(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1255
                                                 local_array->length(), CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1256
  objArrayHandle h_context(thread, context);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1257
  for (int index = 0; index < local_array->length(); index++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1258
    h_context->obj_at_put(index, local_array->at(index));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1259
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1260
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1261
  oop result = java_security_AccessControlContext::create(h_context, is_privileged, privileged_context, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1262
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1263
  return JNIHandles::make_local(env, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1264
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1265
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1266
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1267
JVM_QUICK_ENTRY(jboolean, JVM_IsArrayClass(JNIEnv *env, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1268
  JVMWrapper("JVM_IsArrayClass");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1269
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  1270
  return (k != NULL) && k->oop_is_array() ? true : false;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1271
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1272
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1273
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1274
JVM_QUICK_ENTRY(jboolean, JVM_IsPrimitiveClass(JNIEnv *env, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1275
  JVMWrapper("JVM_IsPrimitiveClass");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1276
  oop mirror = JNIHandles::resolve_non_null(cls);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1277
  return (jboolean) java_lang_Class::is_primitive(mirror);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1278
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1279
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1280
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1281
JVM_ENTRY(jclass, JVM_GetComponentType(JNIEnv *env, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1282
  JVMWrapper("JVM_GetComponentType");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1283
  oop mirror = JNIHandles::resolve_non_null(cls);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1284
  oop result = Reflection::array_component_type(mirror, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1285
  return (jclass) JNIHandles::make_local(env, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1286
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1287
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1288
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1289
JVM_ENTRY(jint, JVM_GetClassModifiers(JNIEnv *env, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1290
  JVMWrapper("JVM_GetClassModifiers");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1291
  if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1292
    // Primitive type
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1293
    return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1294
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1295
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  1296
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1297
  debug_only(int computed_modifiers = k->compute_modifier_flags(CHECK_0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1298
  assert(k->modifier_flags() == computed_modifiers, "modifiers cache is OK");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1299
  return k->modifier_flags();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1300
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1301
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1302
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1303
// Inner class reflection ///////////////////////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1304
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1305
JVM_ENTRY(jobjectArray, JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1306
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1307
  // ofClass is a reference to a java_lang_Class object. The mirror object
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1308
  // of an InstanceKlass
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1309
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1310
  if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) ||
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  1311
      ! java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->oop_is_instance()) {
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  1312
    oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1313
    return (jobjectArray)JNIHandles::make_local(env, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1314
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1315
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1316
  instanceKlassHandle k(thread, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)));
12231
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11636
diff changeset
  1317
  InnerClassesIterator iter(k);
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11636
diff changeset
  1318
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11636
diff changeset
  1319
  if (iter.length() == 0) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1320
    // Neither an inner nor outer class
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  1321
    oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1322
    return (jobjectArray)JNIHandles::make_local(env, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1323
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1324
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1325
  // find inner class info
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1326
  constantPoolHandle cp(thread, k->constants());
12231
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11636
diff changeset
  1327
  int length = iter.length();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1328
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1329
  // Allocate temp. result array
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  1330
  objArrayOop r = oopFactory::new_objArray(SystemDictionary::Class_klass(), length/4, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1331
  objArrayHandle result (THREAD, r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1332
  int members = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1333
12231
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11636
diff changeset
  1334
  for (; !iter.done(); iter.next()) {
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11636
diff changeset
  1335
    int ioff = iter.inner_class_info_index();
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11636
diff changeset
  1336
    int ooff = iter.outer_class_info_index();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1337
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1338
    if (ioff != 0 && ooff != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1339
      // Check to see if the name matches the class we're looking for
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1340
      // before attempting to find the class.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1341
      if (cp->klass_name_at_matches(k, ooff)) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1342
        Klass* outer_klass = cp->klass_at(ooff, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1343
        if (outer_klass == k()) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1344
           Klass* ik = cp->klass_at(ioff, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1345
           instanceKlassHandle inner_klass (THREAD, ik);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1346
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1347
           // Throws an exception if outer klass has not declared k as
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1348
           // an inner klass
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1349
           Reflection::check_for_inner_class(k, inner_klass, true, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1350
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1351
           result->obj_at_put(members, inner_klass->java_mirror());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1352
           members++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1353
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1354
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1355
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1356
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1357
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1358
  if (members != length) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1359
    // Return array of right length
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  1360
    objArrayOop res = oopFactory::new_objArray(SystemDictionary::Class_klass(), members, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1361
    for(int i = 0; i < members; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1362
      res->obj_at_put(i, result->obj_at(i));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1363
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1364
    return (jobjectArray)JNIHandles::make_local(env, res);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1365
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1366
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1367
  return (jobjectArray)JNIHandles::make_local(env, result());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1368
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1369
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1370
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1371
JVM_ENTRY(jclass, JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass))
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1372
{
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1373
  // ofClass is a reference to a java_lang_Class object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1374
  if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) ||
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  1375
      ! java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->oop_is_instance()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1376
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1377
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1378
4496
c5a0b15a8e7d 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 4429
diff changeset
  1379
  bool inner_is_member = false;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1380
  Klass* outer_klass
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1381
    = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))
4496
c5a0b15a8e7d 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 4429
diff changeset
  1382
                          )->compute_enclosing_class(&inner_is_member, CHECK_NULL);
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1383
  if (outer_klass == NULL)  return NULL;  // already a top-level class
4496
c5a0b15a8e7d 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 4429
diff changeset
  1384
  if (!inner_is_member)  return NULL;     // an anonymous class (inside a method)
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  1385
  return (jclass) JNIHandles::make_local(env, outer_klass->java_mirror());
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1386
}
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1387
JVM_END
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1388
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1389
// should be in InstanceKlass.cpp, but is here for historical reasons
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1390
Klass* InstanceKlass::compute_enclosing_class_impl(instanceKlassHandle k,
4496
c5a0b15a8e7d 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 4429
diff changeset
  1391
                                                     bool* inner_is_member,
c5a0b15a8e7d 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 4429
diff changeset
  1392
                                                     TRAPS) {
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1393
  Thread* thread = THREAD;
12231
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11636
diff changeset
  1394
  InnerClassesIterator iter(k);
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11636
diff changeset
  1395
  if (iter.length() == 0) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1396
    // No inner class info => no declaring class
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1397
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1398
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1399
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1400
  constantPoolHandle i_cp(thread, k->constants());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1401
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1402
  bool found = false;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1403
  Klass* ok;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1404
  instanceKlassHandle outer_klass;
4496
c5a0b15a8e7d 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 4429
diff changeset
  1405
  *inner_is_member = false;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1406
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1407
  // Find inner_klass attribute
12231
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11636
diff changeset
  1408
  for (; !iter.done() && !found; iter.next()) {
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11636
diff changeset
  1409
    int ioff = iter.inner_class_info_index();
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11636
diff changeset
  1410
    int ooff = iter.outer_class_info_index();
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11636
diff changeset
  1411
    int noff = iter.inner_name_index();
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1412
    if (ioff != 0) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1413
      // Check to see if the name matches the class we're looking for
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1414
      // before attempting to find the class.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1415
      if (i_cp->klass_name_at_matches(k, ioff)) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1416
        Klass* inner_klass = i_cp->klass_at(ioff, CHECK_NULL);
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1417
        found = (k() == inner_klass);
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1418
        if (found && ooff != 0) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1419
          ok = i_cp->klass_at(ooff, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1420
          outer_klass = instanceKlassHandle(thread, ok);
4496
c5a0b15a8e7d 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 4429
diff changeset
  1421
          *inner_is_member = true;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1422
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1423
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1424
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1425
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1426
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1427
  if (found && outer_klass.is_null()) {
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1428
    // It may be anonymous; try for that.
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1429
    int encl_method_class_idx = k->enclosing_method_class_index();
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1430
    if (encl_method_class_idx != 0) {
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1431
      ok = i_cp->klass_at(encl_method_class_idx, CHECK_NULL);
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1432
      outer_klass = instanceKlassHandle(thread, ok);
4496
c5a0b15a8e7d 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 4429
diff changeset
  1433
      *inner_is_member = false;
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1434
    }
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1435
  }
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1436
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1437
  // If no inner class attribute found for this class.
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1438
  if (outer_klass.is_null())  return NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1439
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1440
  // Throws an exception if outer klass has not declared k as an inner klass
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1441
  // We need evidence that each klass knows about the other, or else
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1442
  // the system could allow a spoof of an inner class to gain access rights.
4496
c5a0b15a8e7d 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 4429
diff changeset
  1443
  Reflection::check_for_inner_class(outer_klass, k, *inner_is_member, CHECK_NULL);
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1444
  return outer_klass();
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2105
diff changeset
  1445
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1446
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1447
JVM_ENTRY(jstring, JVM_GetClassSignature(JNIEnv *env, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1448
  assert (cls != NULL, "illegal class");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1449
  JVMWrapper("JVM_GetClassSignature");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1450
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1451
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1452
  // Return null for arrays and primatives
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1453
  if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1454
    Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  1455
    if (k->oop_is_instance()) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1456
      Symbol* sym = InstanceKlass::cast(k)->generic_signature();
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1457
      if (sym == NULL) return NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1458
      Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1459
      return (jstring) JNIHandles::make_local(env, str());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1460
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1461
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1462
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1463
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1464
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1465
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1466
JVM_ENTRY(jbyteArray, JVM_GetClassAnnotations(JNIEnv *env, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1467
  assert (cls != NULL, "illegal class");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1468
  JVMWrapper("JVM_GetClassAnnotations");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1469
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1470
  // Return null for arrays and primitives
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1471
  if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1472
    Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  1473
    if (k->oop_is_instance()) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1474
      typeArrayOop a = Annotations::make_java_array(InstanceKlass::cast(k)->class_annotations(), CHECK_NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1475
      return (jbyteArray) JNIHandles::make_local(env, a);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1476
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1477
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1478
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1479
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1480
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1481
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1482
JVM_ENTRY(jbyteArray, JVM_GetFieldAnnotations(JNIEnv *env, jobject field))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1483
  assert(field != NULL, "illegal field");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1484
  JVMWrapper("JVM_GetFieldAnnotations");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1485
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1486
  // some of this code was adapted from from jni_FromReflectedField
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1487
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1488
  // field is a handle to a java.lang.reflect.Field object
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1489
  oop reflected = JNIHandles::resolve_non_null(field);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1490
  oop mirror    = java_lang_reflect_Field::clazz(reflected);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1491
  Klass* k    = java_lang_Class::as_Klass(mirror);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1492
  int slot      = java_lang_reflect_Field::slot(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1493
  int modifiers = java_lang_reflect_Field::modifiers(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1494
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1495
  fieldDescriptor fd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1496
  KlassHandle kh(THREAD, k);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1497
  intptr_t offset = InstanceKlass::cast(kh())->field_offset(slot);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1498
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1499
  if (modifiers & JVM_ACC_STATIC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1500
    // for static fields we only look in the current class
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1501
    if (!InstanceKlass::cast(kh())->find_local_field_from_offset(offset, true, &fd)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1502
      assert(false, "cannot find static field");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1503
      return NULL;  // robustness
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1504
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1505
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1506
    // for instance fields we start with the current class and work
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1507
    // our way up through the superclass chain
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1508
    if (!InstanceKlass::cast(kh())->find_field_from_offset(offset, false, &fd)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1509
      assert(false, "cannot find instance field");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1510
      return NULL;  // robustness
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1511
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1512
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1513
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1514
  return (jbyteArray) JNIHandles::make_local(env, Annotations::make_java_array(fd.annotations(), THREAD));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1515
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1516
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1517
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1518
static Method* jvm_get_method_common(jobject method) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1519
  // some of this code was adapted from from jni_FromReflectedMethod
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1520
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1521
  oop reflected = JNIHandles::resolve_non_null(method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1522
  oop mirror    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1523
  int slot      = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1524
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  1525
  if (reflected->klass() == SystemDictionary::reflect_Constructor_klass()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1526
    mirror = java_lang_reflect_Constructor::clazz(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1527
    slot   = java_lang_reflect_Constructor::slot(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1528
  } else {
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  1529
    assert(reflected->klass() == SystemDictionary::reflect_Method_klass(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1530
           "wrong type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1531
    mirror = java_lang_reflect_Method::clazz(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1532
    slot   = java_lang_reflect_Method::slot(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1533
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1534
  Klass* k = java_lang_Class::as_Klass(mirror);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1535
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1536
  Method* m = InstanceKlass::cast(k)->method_with_idnum(slot);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1537
  if (m == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1538
    assert(false, "cannot find method");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1539
    return NULL;  // robustness
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1540
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1541
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1542
  return m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1543
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1544
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1545
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1546
JVM_ENTRY(jbyteArray, JVM_GetMethodAnnotations(JNIEnv *env, jobject method))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1547
  JVMWrapper("JVM_GetMethodAnnotations");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1548
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1549
  // method is a handle to a java.lang.reflect.Method object
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1550
  Method* m = jvm_get_method_common(method);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1551
  return (jbyteArray) JNIHandles::make_local(env,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1552
    Annotations::make_java_array(m->annotations(), THREAD));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1553
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1554
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1555
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1556
JVM_ENTRY(jbyteArray, JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1557
  JVMWrapper("JVM_GetMethodDefaultAnnotationValue");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1558
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1559
  // method is a handle to a java.lang.reflect.Method object
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1560
  Method* m = jvm_get_method_common(method);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1561
  return (jbyteArray) JNIHandles::make_local(env,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1562
    Annotations::make_java_array(m->annotation_default(), THREAD));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1563
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1564
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1565
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1566
JVM_ENTRY(jbyteArray, JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1567
  JVMWrapper("JVM_GetMethodParameterAnnotations");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1568
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1569
  // method is a handle to a java.lang.reflect.Method object
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1570
  Method* m = jvm_get_method_common(method);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1571
  return (jbyteArray) JNIHandles::make_local(env,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1572
    Annotations::make_java_array(m->parameter_annotations(), THREAD));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1573
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1574
15097
9db149412e0e 8004823: Add VM support for type annotation reflection
stefank
parents: 14488
diff changeset
  1575
/* Type use annotations support (JDK 1.8) */
9db149412e0e 8004823: Add VM support for type annotation reflection
stefank
parents: 14488
diff changeset
  1576
9db149412e0e 8004823: Add VM support for type annotation reflection
stefank
parents: 14488
diff changeset
  1577
JVM_ENTRY(jbyteArray, JVM_GetClassTypeAnnotations(JNIEnv *env, jclass cls))
9db149412e0e 8004823: Add VM support for type annotation reflection
stefank
parents: 14488
diff changeset
  1578
  assert (cls != NULL, "illegal class");
9db149412e0e 8004823: Add VM support for type annotation reflection
stefank
parents: 14488
diff changeset
  1579
  JVMWrapper("JVM_GetClassTypeAnnotations");
9db149412e0e 8004823: Add VM support for type annotation reflection
stefank
parents: 14488
diff changeset
  1580
  ResourceMark rm(THREAD);
9db149412e0e 8004823: Add VM support for type annotation reflection
stefank
parents: 14488
diff changeset
  1581
  // Return null for arrays and primitives
9db149412e0e 8004823: Add VM support for type annotation reflection
stefank
parents: 14488
diff changeset
  1582
  if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
9db149412e0e 8004823: Add VM support for type annotation reflection
stefank
parents: 14488
diff changeset
  1583
    Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
9db149412e0e 8004823: Add VM support for type annotation reflection
stefank
parents: 14488
diff changeset
  1584
    if (k->oop_is_instance()) {
9db149412e0e 8004823: Add VM support for type annotation reflection
stefank
parents: 14488
diff changeset
  1585
      typeArrayOop a = Annotations::make_java_array(InstanceKlass::cast(k)->type_annotations()->class_annotations(), CHECK_NULL);
9db149412e0e 8004823: Add VM support for type annotation reflection
stefank
parents: 14488
diff changeset
  1586
      return (jbyteArray) JNIHandles::make_local(env, a);
9db149412e0e 8004823: Add VM support for type annotation reflection
stefank
parents: 14488
diff changeset
  1587
    }
9db149412e0e 8004823: Add VM support for type annotation reflection
stefank
parents: 14488
diff changeset
  1588
  }
9db149412e0e 8004823: Add VM support for type annotation reflection
stefank
parents: 14488
diff changeset
  1589
  return NULL;
9db149412e0e 8004823: Add VM support for type annotation reflection
stefank
parents: 14488
diff changeset
  1590
JVM_END
9db149412e0e 8004823: Add VM support for type annotation reflection
stefank
parents: 14488
diff changeset
  1591
15194
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1592
static void bounds_check(constantPoolHandle cp, jint index, TRAPS) {
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1593
  if (!cp->is_within_bounds(index)) {
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1594
    THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "Constant pool index out of bounds");
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1595
  }
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1596
}
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1597
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1598
JVM_ENTRY(jobjectArray, JVM_GetMethodParameters(JNIEnv *env, jobject method))
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1599
{
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1600
  JVMWrapper("JVM_GetMethodParameters");
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1601
  // method is a handle to a java.lang.reflect.Method object
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1602
  Method* method_ptr = jvm_get_method_common(method);
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1603
  methodHandle mh (THREAD, method_ptr);
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1604
  Handle reflected_method (THREAD, JNIHandles::resolve_non_null(method));
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1605
  const int num_params = mh->method_parameters_length();
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1606
15194
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1607
  if (0 != num_params) {
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1608
    // make sure all the symbols are properly formatted
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1609
    for (int i = 0; i < num_params; i++) {
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1610
      MethodParametersElement* params = mh->method_parameters_start();
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1611
      int index = params[i].name_cp_index;
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1612
      bounds_check(mh->constants(), index, CHECK_NULL);
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1613
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1614
      if (0 != index && !mh->constants()->tag_at(index).is_utf8()) {
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1615
        THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1616
                    "Wrong type at constant pool index");
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1617
      }
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1618
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1619
    }
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1620
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1621
    objArrayOop result_oop = oopFactory::new_objArray(SystemDictionary::reflect_Parameter_klass(), num_params, CHECK_NULL);
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1622
    objArrayHandle result (THREAD, result_oop);
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1623
15194
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1624
    for (int i = 0; i < num_params; i++) {
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1625
      MethodParametersElement* params = mh->method_parameters_start();
15194
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1626
      // For a 0 index, give a NULL symbol
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1627
      Symbol* const sym = 0 != params[i].name_cp_index ?
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1628
        mh->constants()->symbol_at(params[i].name_cp_index) : NULL;
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1629
      int flags = build_int_from_shorts(params[i].flags_lo, params[i].flags_hi);
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1630
      oop param = Reflection::new_parameter(reflected_method, i, sym,
15194
a35093d73168 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 15102
diff changeset
  1631
                                            flags, CHECK_NULL);
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1632
      result->obj_at_put(i, param);
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1633
    }
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1634
    return (jobjectArray)JNIHandles::make_local(env, result());
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1635
  } else {
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1636
    return (jobjectArray)NULL;
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1637
  }
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1638
}
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1639
JVM_END
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1640
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1641
// New (JDK 1.4) reflection implementation /////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1642
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1643
JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1644
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1645
  JVMWrapper("JVM_GetClassDeclaredFields");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1646
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1647
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1648
  // Exclude primitive types and array types
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1649
  if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) ||
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  1650
      java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->oop_is_array()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1651
    // Return empty array
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  1652
    oop res = oopFactory::new_objArray(SystemDictionary::reflect_Field_klass(), 0, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1653
    return (jobjectArray) JNIHandles::make_local(env, res);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1654
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1655
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1656
  instanceKlassHandle k(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1657
  constantPoolHandle cp(THREAD, k->constants());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1658
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1659
  // Ensure class is linked
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1660
  k->link_class(CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1661
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1662
  // 4496456 We need to filter out java.lang.Throwable.backtrace
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1663
  bool skip_backtrace = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1664
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1665
  // Allocate result
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1666
  int num_fields;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1667
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1668
  if (publicOnly) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1669
    num_fields = 0;
10546
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10504
diff changeset
  1670
    for (JavaFieldStream fs(k()); !fs.done(); fs.next()) {
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10504
diff changeset
  1671
      if (fs.access_flags().is_public()) ++num_fields;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1672
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1673
  } else {
10546
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10504
diff changeset
  1674
    num_fields = k->java_fields_count();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1675
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  1676
    if (k() == SystemDictionary::Throwable_klass()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1677
      num_fields--;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1678
      skip_backtrace = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1679
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1680
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1681
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  1682
  objArrayOop r = oopFactory::new_objArray(SystemDictionary::reflect_Field_klass(), num_fields, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1683
  objArrayHandle result (THREAD, r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1684
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1685
  int out_idx = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1686
  fieldDescriptor fd;
10546
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10504
diff changeset
  1687
  for (JavaFieldStream fs(k); !fs.done(); fs.next()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1688
    if (skip_backtrace) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1689
      // 4496456 skip java.lang.Throwable.backtrace
10546
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10504
diff changeset
  1690
      int offset = fs.offset();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1691
      if (offset == java_lang_Throwable::get_backtrace_offset()) continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1692
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1693
10546
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10504
diff changeset
  1694
    if (!publicOnly || fs.access_flags().is_public()) {
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10504
diff changeset
  1695
      fd.initialize(k(), fs.index());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1696
      oop field = Reflection::new_field(&fd, UseNewReflection, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1697
      result->obj_at_put(out_idx, field);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1698
      ++out_idx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1699
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1700
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1701
  assert(out_idx == num_fields, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1702
  return (jobjectArray) JNIHandles::make_local(env, result());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1703
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1704
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1705
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1706
JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1707
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1708
  JVMWrapper("JVM_GetClassDeclaredMethods");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1709
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1710
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1711
  // Exclude primitive types and array types
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1712
  if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass))
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  1713
      || java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->oop_is_array()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1714
    // Return empty array
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  1715
    oop res = oopFactory::new_objArray(SystemDictionary::reflect_Method_klass(), 0, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1716
    return (jobjectArray) JNIHandles::make_local(env, res);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1717
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1718
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1719
  instanceKlassHandle k(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1720
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1721
  // Ensure class is linked
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1722
  k->link_class(CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1723
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1724
  Array<Method*>* methods = k->methods();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1725
  int methods_length = methods->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1726
  int num_methods = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1727
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1728
  int i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1729
  for (i = 0; i < methods_length; i++) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1730
    methodHandle method(THREAD, methods->at(i));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1731
    if (!method->is_initializer()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1732
      if (!publicOnly || method->is_public()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1733
        ++num_methods;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1734
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1735
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1736
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1737
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1738
  // Allocate result
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  1739
  objArrayOop r = oopFactory::new_objArray(SystemDictionary::reflect_Method_klass(), num_methods, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1740
  objArrayHandle result (THREAD, r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1741
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1742
  int out_idx = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1743
  for (i = 0; i < methods_length; i++) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1744
    methodHandle method(THREAD, methods->at(i));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1745
    if (!method->is_initializer()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1746
      if (!publicOnly || method->is_public()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1747
        oop m = Reflection::new_method(method, UseNewReflection, false, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1748
        result->obj_at_put(out_idx, m);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1749
        ++out_idx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1750
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1751
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1752
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1753
  assert(out_idx == num_methods, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1754
  return (jobjectArray) JNIHandles::make_local(env, result());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1755
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1756
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1757
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1758
JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1759
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1760
  JVMWrapper("JVM_GetClassDeclaredConstructors");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1761
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1762
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1763
  // Exclude primitive types and array types
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1764
  if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass))
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  1765
      || java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->oop_is_array()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1766
    // Return empty array
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  1767
    oop res = oopFactory::new_objArray(SystemDictionary::reflect_Constructor_klass(), 0 , CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1768
    return (jobjectArray) JNIHandles::make_local(env, res);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1769
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1770
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1771
  instanceKlassHandle k(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1772
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1773
  // Ensure class is linked
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1774
  k->link_class(CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1775
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1776
  Array<Method*>* methods = k->methods();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1777
  int methods_length = methods->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1778
  int num_constructors = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1779
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1780
  int i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1781
  for (i = 0; i < methods_length; i++) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1782
    methodHandle method(THREAD, methods->at(i));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1783
    if (method->is_initializer() && !method->is_static()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1784
      if (!publicOnly || method->is_public()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1785
        ++num_constructors;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1786
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1787
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1788
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1789
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1790
  // Allocate result
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  1791
  objArrayOop r = oopFactory::new_objArray(SystemDictionary::reflect_Constructor_klass(), num_constructors, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1792
  objArrayHandle result(THREAD, r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1793
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1794
  int out_idx = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1795
  for (i = 0; i < methods_length; i++) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1796
    methodHandle method(THREAD, methods->at(i));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1797
    if (method->is_initializer() && !method->is_static()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1798
      if (!publicOnly || method->is_public()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1799
        oop m = Reflection::new_constructor(method, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1800
        result->obj_at_put(out_idx, m);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1801
        ++out_idx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1802
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1803
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1804
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1805
  assert(out_idx == num_constructors, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1806
  return (jobjectArray) JNIHandles::make_local(env, result());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1807
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1808
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1809
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1810
JVM_ENTRY(jint, JVM_GetClassAccessFlags(JNIEnv *env, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1811
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1812
  JVMWrapper("JVM_GetClassAccessFlags");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1813
  if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1814
    // Primitive type
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1815
    return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1816
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1817
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  1818
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1819
  return k->access_flags().as_int() & JVM_ACC_WRITTEN_FLAGS;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1820
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1821
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1822
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1823
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1824
// Constant pool access //////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1825
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1826
JVM_ENTRY(jobject, JVM_GetClassConstantPool(JNIEnv *env, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1827
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1828
  JVMWrapper("JVM_GetClassConstantPool");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1829
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1830
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1831
  // Return null for primitives and arrays
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1832
  if (!java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1833
    Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  1834
    if (k->oop_is_instance()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1835
      instanceKlassHandle k_h(THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1836
      Handle jcp = sun_reflect_ConstantPool::create(CHECK_NULL);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1837
      sun_reflect_ConstantPool::set_cp(jcp(), k_h->constants());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1838
      return JNIHandles::make_local(jcp());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1839
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1840
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1841
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1842
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1843
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1844
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1845
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1846
JVM_ENTRY(jint, JVM_ConstantPoolGetSize(JNIEnv *env, jobject obj, jobject unused))
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1847
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1848
  JVMWrapper("JVM_ConstantPoolGetSize");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1849
  constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1850
  return cp->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1851
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1852
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1853
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1854
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1855
JVM_ENTRY(jclass, JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject obj, jobject unused, jint index))
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1856
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1857
  JVMWrapper("JVM_ConstantPoolGetClassAt");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1858
  constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1859
  bounds_check(cp, index, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1860
  constantTag tag = cp->tag_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1861
  if (!tag.is_klass() && !tag.is_unresolved_klass()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1862
    THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1863
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1864
  Klass* k = cp->klass_at(index, CHECK_NULL);
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8106
diff changeset
  1865
  return (jclass) JNIHandles::make_local(k->java_mirror());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1866
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1867
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1868
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1869
JVM_ENTRY(jclass, JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject obj, jobject unused, jint index))
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1870
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1871
  JVMWrapper("JVM_ConstantPoolGetClassAtIfLoaded");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1872
  constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1873
  bounds_check(cp, index, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1874
  constantTag tag = cp->tag_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1875
  if (!tag.is_klass() && !tag.is_unresolved_klass()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1876
    THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1877
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1878
  Klass* k = ConstantPool::klass_at_if_loaded(cp, index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1879
  if (k == NULL) return NULL;
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8106
diff changeset
  1880
  return (jclass) JNIHandles::make_local(k->java_mirror());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1881
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1882
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1883
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1884
static jobject get_method_at_helper(constantPoolHandle cp, jint index, bool force_resolution, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1885
  constantTag tag = cp->tag_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1886
  if (!tag.is_method() && !tag.is_interface_method()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1887
    THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1888
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1889
  int klass_ref  = cp->uncached_klass_ref_index_at(index);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1890
  Klass* k_o;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1891
  if (force_resolution) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1892
    k_o = cp->klass_at(klass_ref, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1893
  } else {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1894
    k_o = ConstantPool::klass_at_if_loaded(cp, klass_ref);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1895
    if (k_o == NULL) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1896
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1897
  instanceKlassHandle k(THREAD, k_o);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1898
  Symbol* name = cp->uncached_name_ref_at(index);
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1899
  Symbol* sig  = cp->uncached_signature_ref_at(index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1900
  methodHandle m (THREAD, k->find_method(name, sig));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1901
  if (m.is_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1902
    THROW_MSG_0(vmSymbols::java_lang_RuntimeException(), "Unable to look up method in target class");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1903
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1904
  oop method;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1905
  if (!m->is_initializer() || m->is_static()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1906
    method = Reflection::new_method(m, true, true, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1907
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1908
    method = Reflection::new_constructor(m, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1909
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1910
  return JNIHandles::make_local(method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1911
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1912
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1913
JVM_ENTRY(jobject, JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject obj, jobject unused, jint index))
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1914
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1915
  JVMWrapper("JVM_ConstantPoolGetMethodAt");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1916
  JvmtiVMObjectAllocEventCollector oam;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1917
  constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1918
  bounds_check(cp, index, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1919
  jobject res = get_method_at_helper(cp, index, true, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1920
  return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1921
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1922
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1923
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1924
JVM_ENTRY(jobject, JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject obj, jobject unused, jint index))
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1925
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1926
  JVMWrapper("JVM_ConstantPoolGetMethodAtIfLoaded");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1927
  JvmtiVMObjectAllocEventCollector oam;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1928
  constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1929
  bounds_check(cp, index, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1930
  jobject res = get_method_at_helper(cp, index, false, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1931
  return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1932
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1933
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1934
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1935
static jobject get_field_at_helper(constantPoolHandle cp, jint index, bool force_resolution, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1936
  constantTag tag = cp->tag_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1937
  if (!tag.is_field()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1938
    THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1939
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1940
  int klass_ref  = cp->uncached_klass_ref_index_at(index);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1941
  Klass* k_o;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1942
  if (force_resolution) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1943
    k_o = cp->klass_at(klass_ref, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1944
  } else {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1945
    k_o = ConstantPool::klass_at_if_loaded(cp, klass_ref);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1946
    if (k_o == NULL) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1947
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1948
  instanceKlassHandle k(THREAD, k_o);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1949
  Symbol* name = cp->uncached_name_ref_at(index);
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1950
  Symbol* sig  = cp->uncached_signature_ref_at(index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1951
  fieldDescriptor fd;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1952
  Klass* target_klass = k->find_field(name, sig, &fd);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1953
  if (target_klass == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1954
    THROW_MSG_0(vmSymbols::java_lang_RuntimeException(), "Unable to look up field in target class");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1955
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1956
  oop field = Reflection::new_field(&fd, true, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1957
  return JNIHandles::make_local(field);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1958
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1959
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1960
JVM_ENTRY(jobject, JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject obj, jobject unusedl, jint index))
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1961
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1962
  JVMWrapper("JVM_ConstantPoolGetFieldAt");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1963
  JvmtiVMObjectAllocEventCollector oam;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1964
  constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1965
  bounds_check(cp, index, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1966
  jobject res = get_field_at_helper(cp, index, true, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1967
  return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1968
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1969
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1970
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1971
JVM_ENTRY(jobject, JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject obj, jobject unused, jint index))
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1972
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1973
  JVMWrapper("JVM_ConstantPoolGetFieldAtIfLoaded");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1974
  JvmtiVMObjectAllocEventCollector oam;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1975
  constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1976
  bounds_check(cp, index, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1977
  jobject res = get_field_at_helper(cp, index, false, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1978
  return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1979
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1980
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1981
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1982
JVM_ENTRY(jobjectArray, JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject obj, jobject unused, jint index))
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1983
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1984
  JVMWrapper("JVM_ConstantPoolGetMemberRefInfoAt");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1985
  JvmtiVMObjectAllocEventCollector oam;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1986
  constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1987
  bounds_check(cp, index, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1988
  constantTag tag = cp->tag_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1989
  if (!tag.is_field_or_method()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1990
    THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1991
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1992
  int klass_ref = cp->uncached_klass_ref_index_at(index);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1993
  Symbol*  klass_name  = cp->klass_name_at(klass_ref);
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1994
  Symbol*  member_name = cp->uncached_name_ref_at(index);
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  1995
  Symbol*  member_sig  = cp->uncached_signature_ref_at(index);
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  1996
  objArrayOop  dest_o = oopFactory::new_objArray(SystemDictionary::String_klass(), 3, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1997
  objArrayHandle dest(THREAD, dest_o);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1998
  Handle str = java_lang_String::create_from_symbol(klass_name, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1999
  dest->obj_at_put(0, str());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2000
  str = java_lang_String::create_from_symbol(member_name, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2001
  dest->obj_at_put(1, str());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2002
  str = java_lang_String::create_from_symbol(member_sig, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2003
  dest->obj_at_put(2, str());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2004
  return (jobjectArray) JNIHandles::make_local(dest());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2005
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2006
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2007
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2008
JVM_ENTRY(jint, JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject obj, jobject unused, jint index))
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2009
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2010
  JVMWrapper("JVM_ConstantPoolGetIntAt");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2011
  constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2012
  bounds_check(cp, index, CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2013
  constantTag tag = cp->tag_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2014
  if (!tag.is_int()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2015
    THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2016
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2017
  return cp->int_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2018
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2019
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2020
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2021
JVM_ENTRY(jlong, JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject obj, jobject unused, jint index))
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2022
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2023
  JVMWrapper("JVM_ConstantPoolGetLongAt");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2024
  constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2025
  bounds_check(cp, index, CHECK_(0L));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2026
  constantTag tag = cp->tag_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2027
  if (!tag.is_long()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2028
    THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2029
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2030
  return cp->long_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2031
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2032
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2033
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2034
JVM_ENTRY(jfloat, JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject obj, jobject unused, jint index))
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2035
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2036
  JVMWrapper("JVM_ConstantPoolGetFloatAt");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2037
  constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2038
  bounds_check(cp, index, CHECK_(0.0f));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2039
  constantTag tag = cp->tag_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2040
  if (!tag.is_float()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2041
    THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2042
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2043
  return cp->float_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2044
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2045
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2046
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2047
JVM_ENTRY(jdouble, JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject obj, jobject unused, jint index))
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2048
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2049
  JVMWrapper("JVM_ConstantPoolGetDoubleAt");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2050
  constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2051
  bounds_check(cp, index, CHECK_(0.0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2052
  constantTag tag = cp->tag_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2053
  if (!tag.is_double()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2054
    THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2055
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2056
  return cp->double_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2057
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2058
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2059
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2060
JVM_ENTRY(jstring, JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject obj, jobject unused, jint index))
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2061
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2062
  JVMWrapper("JVM_ConstantPoolGetStringAt");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2063
  constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2064
  bounds_check(cp, index, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2065
  constantTag tag = cp->tag_at(index);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2066
  if (!tag.is_string()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2067
    THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2068
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2069
  oop str = cp->string_at(index, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2070
  return (jstring) JNIHandles::make_local(str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2071
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2072
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2073
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2074
JVM_ENTRY(jstring, JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject obj, jobject unused, jint index))
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2075
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2076
  JVMWrapper("JVM_ConstantPoolGetUTF8At");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2077
  JvmtiVMObjectAllocEventCollector oam;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2078
  constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2079
  bounds_check(cp, index, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2080
  constantTag tag = cp->tag_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2081
  if (!tag.is_symbol()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2082
    THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2083
  }
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  2084
  Symbol* sym = cp->symbol_at(index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2085
  Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2086
  return (jstring) JNIHandles::make_local(str());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2087
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2088
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2089
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2090
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2091
// Assertion support. //////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2092
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2093
JVM_ENTRY(jboolean, JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2094
  JVMWrapper("JVM_DesiredAssertionStatus");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2095
  assert(cls != NULL, "bad class");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2096
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2097
  oop r = JNIHandles::resolve(cls);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2098
  assert(! java_lang_Class::is_primitive(r), "primitive classes not allowed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2099
  if (java_lang_Class::is_primitive(r)) return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2100
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2101
  Klass* k = java_lang_Class::as_Klass(r);
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  2102
  assert(k->oop_is_instance(), "must be an instance klass");
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  2103
  if (! k->oop_is_instance()) return false;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2104
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2105
  ResourceMark rm(THREAD);
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  2106
  const char* name = k->name()->as_C_string();
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  2107
  bool system_class = k->class_loader() == NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2108
  return JavaAssertions::enabled(name, system_class);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2109
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2110
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2111
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2112
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2113
// Return a new AssertionStatusDirectives object with the fields filled in with
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2114
// command-line assertion arguments (i.e., -ea, -da).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2115
JVM_ENTRY(jobject, JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2116
  JVMWrapper("JVM_AssertionStatusDirectives");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2117
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2118
  oop asd = JavaAssertions::createAssertionStatusDirectives(CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2119
  return JNIHandles::make_local(env, asd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2120
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2121
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2122
// Verification ////////////////////////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2123
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2124
// Reflection for the verifier /////////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2125
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2126
// RedefineClasses support: bug 6214132 caused verification to fail.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2127
// All functions from this section should call the jvmtiThreadSate function:
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2128
//   Klass* class_to_verify_considering_redefinition(Klass* klass).
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2129
// The function returns a Klass* of the _scratch_class if the verifier
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2130
// was invoked in the middle of the class redefinition.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2131
// Otherwise it returns its argument value which is the _the_class Klass*.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2132
// Please, refer to the description in the jvmtiThreadSate.hpp.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2133
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2134
JVM_ENTRY(const char*, JVM_GetClassNameUTF(JNIEnv *env, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2135
  JVMWrapper("JVM_GetClassNameUTF");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2136
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2137
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  2138
  return k->name()->as_utf8();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2139
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2140
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2141
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2142
JVM_QUICK_ENTRY(void, JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2143
  JVMWrapper("JVM_GetClassCPTypes");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2144
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2145
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2146
  // types will have length zero if this is not an InstanceKlass
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2147
  // (length is determined by call to JVM_GetClassCPEntriesCount)
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  2148
  if (k->oop_is_instance()) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2149
    ConstantPool* cp = InstanceKlass::cast(k)->constants();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2150
    for (int index = cp->length() - 1; index >= 0; index--) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2151
      constantTag tag = cp->tag_at(index);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2152
      types[index] = (tag.is_unresolved_klass()) ? JVM_CONSTANT_Class : tag.value();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2153
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2154
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2155
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2156
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2157
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2158
JVM_QUICK_ENTRY(jint, JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2159
  JVMWrapper("JVM_GetClassCPEntriesCount");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2160
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2161
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  2162
  if (!k->oop_is_instance())
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2163
    return 0;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2164
  return InstanceKlass::cast(k)->constants()->length();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2165
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2166
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2167
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2168
JVM_QUICK_ENTRY(jint, JVM_GetClassFieldsCount(JNIEnv *env, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2169
  JVMWrapper("JVM_GetClassFieldsCount");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2170
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2171
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  2172
  if (!k->oop_is_instance())
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2173
    return 0;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2174
  return InstanceKlass::cast(k)->java_fields_count();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2175
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2176
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2177
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2178
JVM_QUICK_ENTRY(jint, JVM_GetClassMethodsCount(JNIEnv *env, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2179
  JVMWrapper("JVM_GetClassMethodsCount");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2180
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2181
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  2182
  if (!k->oop_is_instance())
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2183
    return 0;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2184
  return InstanceKlass::cast(k)->methods()->length();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2185
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2186
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2187
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2188
// The following methods, used for the verifier, are never called with
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2189
// array klasses, so a direct cast to InstanceKlass is safe.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2190
// Typically, these methods are called in a loop with bounds determined
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2191
// by the results of JVM_GetClass{Fields,Methods}Count, which return
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2192
// zero for arrays.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2193
JVM_QUICK_ENTRY(void, JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2194
  JVMWrapper("JVM_GetMethodIxExceptionIndexes");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2195
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2196
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2197
  Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2198
  int length = method->checked_exceptions_length();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2199
  if (length > 0) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2200
    CheckedExceptionElement* table= method->checked_exceptions_start();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2201
    for (int i = 0; i < length; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2202
      exceptions[i] = table[i].class_cp_index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2203
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2204
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2205
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2206
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2207
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2208
JVM_QUICK_ENTRY(jint, JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2209
  JVMWrapper("JVM_GetMethodIxExceptionsCount");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2210
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2211
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2212
  Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2213
  return method->checked_exceptions_length();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2214
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2215
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2216
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2217
JVM_QUICK_ENTRY(void, JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2218
  JVMWrapper("JVM_GetMethodIxByteCode");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2219
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2220
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2221
  Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2222
  memcpy(code, method->code_base(), method->code_size());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2223
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2224
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2225
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2226
JVM_QUICK_ENTRY(jint, JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2227
  JVMWrapper("JVM_GetMethodIxByteCodeLength");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2228
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2229
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2230
  Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2231
  return method->code_size();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2232
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2233
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2234
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2235
JVM_QUICK_ENTRY(void, JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2236
  JVMWrapper("JVM_GetMethodIxExceptionTableEntry");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2237
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2238
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2239
  Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2240
  ExceptionTable extable(method);
13282
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12231
diff changeset
  2241
  entry->start_pc   = extable.start_pc(entry_index);
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12231
diff changeset
  2242
  entry->end_pc     = extable.end_pc(entry_index);
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12231
diff changeset
  2243
  entry->handler_pc = extable.handler_pc(entry_index);
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12231
diff changeset
  2244
  entry->catchType  = extable.catch_type_index(entry_index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2245
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2246
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2247
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2248
JVM_QUICK_ENTRY(jint, JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2249
  JVMWrapper("JVM_GetMethodIxExceptionTableLength");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2250
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2251
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2252
  Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2253
  return method->exception_table_length();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2254
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2255
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2256
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2257
JVM_QUICK_ENTRY(jint, JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2258
  JVMWrapper("JVM_GetMethodIxModifiers");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2259
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2260
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2261
  Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2262
  return method->access_flags().as_int() & JVM_RECOGNIZED_METHOD_MODIFIERS;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2263
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2264
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2265
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2266
JVM_QUICK_ENTRY(jint, JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2267
  JVMWrapper("JVM_GetFieldIxModifiers");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2268
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2269
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2270
  return InstanceKlass::cast(k)->field_access_flags(field_index) & JVM_RECOGNIZED_FIELD_MODIFIERS;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2271
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2272
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2273
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2274
JVM_QUICK_ENTRY(jint, JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2275
  JVMWrapper("JVM_GetMethodIxLocalsCount");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2276
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2277
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2278
  Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2279
  return method->max_locals();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2280
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2281
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2282
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2283
JVM_QUICK_ENTRY(jint, JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2284
  JVMWrapper("JVM_GetMethodIxArgsSize");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2285
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2286
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2287
  Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2288
  return method->size_of_parameters();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2289
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2290
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2291
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2292
JVM_QUICK_ENTRY(jint, JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2293
  JVMWrapper("JVM_GetMethodIxMaxStack");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2294
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2295
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2296
  Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2297
  return method->verifier_max_stack();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2298
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2299
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2300
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2301
JVM_QUICK_ENTRY(jboolean, JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2302
  JVMWrapper("JVM_IsConstructorIx");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2303
  ResourceMark rm(THREAD);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2304
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2305
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2306
  Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2307
  return method->name() == vmSymbols::object_initializer_name();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2308
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2309
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2310
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2311
JVM_ENTRY(const char*, JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2312
  JVMWrapper("JVM_GetMethodIxIxUTF");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2313
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2314
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2315
  Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2316
  return method->name()->as_utf8();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2317
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2318
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2319
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2320
JVM_ENTRY(const char*, JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2321
  JVMWrapper("JVM_GetMethodIxSignatureUTF");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2322
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2323
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2324
  Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2325
  return method->signature()->as_utf8();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2326
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2327
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2328
/**
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2329
 * All of these JVM_GetCP-xxx methods are used by the old verifier to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2330
 * read entries in the constant pool.  Since the old verifier always
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2331
 * works on a copy of the code, it will not see any rewriting that
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2332
 * may possibly occur in the middle of verification.  So it is important
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2333
 * that nothing it calls tries to use the cpCache instead of the raw
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2334
 * constant pool, so we must use cp->uncached_x methods when appropriate.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2335
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2336
JVM_ENTRY(const char*, JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2337
  JVMWrapper("JVM_GetCPFieldNameUTF");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2338
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2339
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2340
  ConstantPool* cp = InstanceKlass::cast(k)->constants();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2341
  switch (cp->tag_at(cp_index).value()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2342
    case JVM_CONSTANT_Fieldref:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2343
      return cp->uncached_name_ref_at(cp_index)->as_utf8();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2344
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2345
      fatal("JVM_GetCPFieldNameUTF: illegal constant");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2346
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2347
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2348
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2349
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2350
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2351
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2352
JVM_ENTRY(const char*, JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2353
  JVMWrapper("JVM_GetCPMethodNameUTF");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2354
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2355
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2356
  ConstantPool* cp = InstanceKlass::cast(k)->constants();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2357
  switch (cp->tag_at(cp_index).value()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2358
    case JVM_CONSTANT_InterfaceMethodref:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2359
    case JVM_CONSTANT_Methodref:
4429
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3820
diff changeset
  2360
    case JVM_CONSTANT_NameAndType:  // for invokedynamic
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2361
      return cp->uncached_name_ref_at(cp_index)->as_utf8();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2362
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2363
      fatal("JVM_GetCPMethodNameUTF: illegal constant");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2364
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2365
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2366
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2367
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2368
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2369
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2370
JVM_ENTRY(const char*, JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2371
  JVMWrapper("JVM_GetCPMethodSignatureUTF");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2372
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2373
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2374
  ConstantPool* cp = InstanceKlass::cast(k)->constants();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2375
  switch (cp->tag_at(cp_index).value()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2376
    case JVM_CONSTANT_InterfaceMethodref:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2377
    case JVM_CONSTANT_Methodref:
4429
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3820
diff changeset
  2378
    case JVM_CONSTANT_NameAndType:  // for invokedynamic
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2379
      return cp->uncached_signature_ref_at(cp_index)->as_utf8();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2380
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2381
      fatal("JVM_GetCPMethodSignatureUTF: illegal constant");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2382
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2383
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2384
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2385
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2386
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2387
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2388
JVM_ENTRY(const char*, JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2389
  JVMWrapper("JVM_GetCPFieldSignatureUTF");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2390
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2391
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2392
  ConstantPool* cp = InstanceKlass::cast(k)->constants();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2393
  switch (cp->tag_at(cp_index).value()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2394
    case JVM_CONSTANT_Fieldref:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2395
      return cp->uncached_signature_ref_at(cp_index)->as_utf8();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2396
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2397
      fatal("JVM_GetCPFieldSignatureUTF: illegal constant");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2398
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2399
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2400
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2401
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2402
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2403
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2404
JVM_ENTRY(const char*, JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2405
  JVMWrapper("JVM_GetCPClassNameUTF");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2406
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2407
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2408
  ConstantPool* cp = InstanceKlass::cast(k)->constants();
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  2409
  Symbol* classname = cp->klass_name_at(cp_index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2410
  return classname->as_utf8();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2411
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2412
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2413
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2414
JVM_ENTRY(const char*, JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2415
  JVMWrapper("JVM_GetCPFieldClassNameUTF");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2416
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2417
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2418
  ConstantPool* cp = InstanceKlass::cast(k)->constants();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2419
  switch (cp->tag_at(cp_index).value()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2420
    case JVM_CONSTANT_Fieldref: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2421
      int class_index = cp->uncached_klass_ref_index_at(cp_index);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  2422
      Symbol* classname = cp->klass_name_at(class_index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2423
      return classname->as_utf8();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2424
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2425
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2426
      fatal("JVM_GetCPFieldClassNameUTF: illegal constant");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2427
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2428
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2429
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2430
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2431
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2432
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2433
JVM_ENTRY(const char*, JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2434
  JVMWrapper("JVM_GetCPMethodClassNameUTF");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2435
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2436
  k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2437
  ConstantPool* cp = InstanceKlass::cast(k)->constants();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2438
  switch (cp->tag_at(cp_index).value()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2439
    case JVM_CONSTANT_Methodref:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2440
    case JVM_CONSTANT_InterfaceMethodref: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2441
      int class_index = cp->uncached_klass_ref_index_at(cp_index);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  2442
      Symbol* classname = cp->klass_name_at(class_index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2443
      return classname->as_utf8();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2444
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2445
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2446
      fatal("JVM_GetCPMethodClassNameUTF: illegal constant");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2447
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2448
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2449
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2450
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2451
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2452
10546
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10504
diff changeset
  2453
JVM_ENTRY(jint, JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls))
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2454
  JVMWrapper("JVM_GetCPFieldModifiers");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2455
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2456
  Klass* k_called = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(called_cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2457
  k        = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2458
  k_called = JvmtiThreadState::class_to_verify_considering_redefinition(k_called, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2459
  ConstantPool* cp = InstanceKlass::cast(k)->constants();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2460
  ConstantPool* cp_called = InstanceKlass::cast(k_called)->constants();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2461
  switch (cp->tag_at(cp_index).value()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2462
    case JVM_CONSTANT_Fieldref: {
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  2463
      Symbol* name      = cp->uncached_name_ref_at(cp_index);
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  2464
      Symbol* signature = cp->uncached_signature_ref_at(cp_index);
10546
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10504
diff changeset
  2465
      for (JavaFieldStream fs(k_called); !fs.done(); fs.next()) {
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10504
diff changeset
  2466
        if (fs.name() == name && fs.signature() == signature) {
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10504
diff changeset
  2467
          return fs.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2468
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2469
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2470
      return -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2471
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2472
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2473
      fatal("JVM_GetCPFieldModifiers: illegal constant");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2474
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2475
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2476
  return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2477
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2478
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2479
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2480
JVM_QUICK_ENTRY(jint, JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2481
  JVMWrapper("JVM_GetCPMethodModifiers");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2482
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2483
  Klass* k_called = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(called_cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2484
  k        = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2485
  k_called = JvmtiThreadState::class_to_verify_considering_redefinition(k_called, thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2486
  ConstantPool* cp = InstanceKlass::cast(k)->constants();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2487
  switch (cp->tag_at(cp_index).value()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2488
    case JVM_CONSTANT_Methodref:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2489
    case JVM_CONSTANT_InterfaceMethodref: {
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  2490
      Symbol* name      = cp->uncached_name_ref_at(cp_index);
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  2491
      Symbol* signature = cp->uncached_signature_ref_at(cp_index);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2492
      Array<Method*>* methods = InstanceKlass::cast(k_called)->methods();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2493
      int methods_count = methods->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2494
      for (int i = 0; i < methods_count; i++) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2495
        Method* method = methods->at(i);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2496
        if (method->name() == name && method->signature() == signature) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2497
            return method->access_flags().as_int() & JVM_RECOGNIZED_METHOD_MODIFIERS;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2498
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2499
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2500
      return -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2501
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2502
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2503
      fatal("JVM_GetCPMethodModifiers: illegal constant");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2504
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2505
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2506
  return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2507
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2508
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2509
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2510
// Misc //////////////////////////////////////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2511
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2512
JVM_LEAF(void, JVM_ReleaseUTF(const char *utf))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2513
  // So long as UTF8::convert_to_utf8 returns resource strings, we don't have to do anything
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2514
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2515
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2516
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2517
JVM_ENTRY(jboolean, JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2518
  JVMWrapper("JVM_IsSameClassPackage");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2519
  oop class1_mirror = JNIHandles::resolve_non_null(class1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2520
  oop class2_mirror = JNIHandles::resolve_non_null(class2);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2521
  Klass* klass1 = java_lang_Class::as_Klass(class1_mirror);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  2522
  Klass* klass2 = java_lang_Class::as_Klass(class2_mirror);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2523
  return (jboolean) Reflection::is_same_class_package(klass1, klass2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2524
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2525
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2526
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2527
// IO functions ////////////////////////////////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2528
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2529
JVM_LEAF(jint, JVM_Open(const char *fname, jint flags, jint mode))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2530
  JVMWrapper2("JVM_Open (%s)", fname);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2531
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2532
  //%note jvm_r6
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
  2533
  int result = os::open(fname, flags, mode);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2534
  if (result >= 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2535
    return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2536
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2537
    switch(errno) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2538
      case EEXIST:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2539
        return JVM_EEXIST;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2540
      default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2541
        return -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2542
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2543
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2544
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2545
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2546
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2547
JVM_LEAF(jint, JVM_Close(jint fd))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2548
  JVMWrapper2("JVM_Close (0x%x)", fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2549
  //%note jvm_r6
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
  2550
  return os::close(fd);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2551
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2552
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2553
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2554
JVM_LEAF(jint, JVM_Read(jint fd, char *buf, jint nbytes))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2555
  JVMWrapper2("JVM_Read (0x%x)", fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2556
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2557
  //%note jvm_r6
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
  2558
  return (jint)os::restartable_read(fd, buf, nbytes);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2559
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2560
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2561
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2562
JVM_LEAF(jint, JVM_Write(jint fd, char *buf, jint nbytes))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2563
  JVMWrapper2("JVM_Write (0x%x)", fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2564
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2565
  //%note jvm_r6
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
  2566
  return (jint)os::write(fd, buf, nbytes);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2567
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2568
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2569
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2570
JVM_LEAF(jint, JVM_Available(jint fd, jlong *pbytes))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2571
  JVMWrapper2("JVM_Available (0x%x)", fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2572
  //%note jvm_r6
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
  2573
  return os::available(fd, pbytes);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2574
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2575
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2576
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2577
JVM_LEAF(jlong, JVM_Lseek(jint fd, jlong offset, jint whence))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2578
  JVMWrapper4("JVM_Lseek (0x%x, %Ld, %d)", fd, offset, whence);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2579
  //%note jvm_r6
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
  2580
  return os::lseek(fd, offset, whence);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2581
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2582
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2583
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2584
JVM_LEAF(jint, JVM_SetLength(jint fd, jlong length))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2585
  JVMWrapper3("JVM_SetLength (0x%x, %Ld)", fd, length);
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
  2586
  return os::ftruncate(fd, length);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2587
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2588
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2589
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2590
JVM_LEAF(jint, JVM_Sync(jint fd))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2591
  JVMWrapper2("JVM_Sync (0x%x)", fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2592
  //%note jvm_r6
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
  2593
  return os::fsync(fd);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2594
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2595
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2596
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2597
// Printing support //////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2598
extern "C" {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2599
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2600
int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2601
  // see bug 4399518, 4417214
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2602
  if ((intptr_t)count <= 0) return -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2603
  return vsnprintf(str, count, fmt, args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2604
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2605
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2606
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2607
int jio_snprintf(char *str, size_t count, const char *fmt, ...) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2608
  va_list args;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2609
  int len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2610
  va_start(args, fmt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2611
  len = jio_vsnprintf(str, count, fmt, args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2612
  va_end(args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2613
  return len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2614
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2615
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2616
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2617
int jio_fprintf(FILE* f, const char *fmt, ...) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2618
  int len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2619
  va_list args;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2620
  va_start(args, fmt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2621
  len = jio_vfprintf(f, fmt, args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2622
  va_end(args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2623
  return len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2624
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2625
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2626
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2627
int jio_vfprintf(FILE* f, const char *fmt, va_list args) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2628
  if (Arguments::vfprintf_hook() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2629
     return Arguments::vfprintf_hook()(f, fmt, args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2630
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2631
    return vfprintf(f, fmt, args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2632
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2633
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2634
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2635
8106
19106a0203fb 6588413: Use -fvisibility=hidden for gcc compiles
coleenp
parents: 8076
diff changeset
  2636
JNIEXPORT int jio_printf(const char *fmt, ...) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2637
  int len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2638
  va_list args;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2639
  va_start(args, fmt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2640
  len = jio_vfprintf(defaultStream::output_stream(), fmt, args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2641
  va_end(args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2642
  return len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2643
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2644
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2645
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2646
// HotSpot specific jio method
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2647
void jio_print(const char* s) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2648
  // Try to make this function as atomic as possible.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2649
  if (Arguments::vfprintf_hook() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2650
    jio_fprintf(defaultStream::output_stream(), "%s", s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2651
  } else {
1889
24b003a6fe46 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 1550
diff changeset
  2652
    // Make an unused local variable to avoid warning from gcc 4.x compiler.
24b003a6fe46 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 1550
diff changeset
  2653
    size_t count = ::write(defaultStream::output_fd(), s, (int)strlen(s));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2654
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2655
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2656
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2657
} // Extern C
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2658
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2659
// java.lang.Thread //////////////////////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2660
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2661
// In most of the JVM Thread support functions we need to be sure to lock the Threads_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2662
// to prevent the target thread from exiting after we have a pointer to the C++ Thread or
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2663
// OSThread objects.  The exception to this rule is when the target object is the thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2664
// doing the operation, in which case we know that the thread won't exit until the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2665
// operation is done (all exits being voluntary).  There are a few cases where it is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2666
// rather silly to do operations on yourself, like resuming yourself or asking whether
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2667
// you are alive.  While these can still happen, they are not subject to deadlocks if
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2668
// the lock is held while the operation occurs (this is not the case for suspend, for
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2669
// instance), and are very unlikely.  Because IsAlive needs to be fast and its
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2670
// implementation is local to this file, we always lock Threads_lock for that one.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2671
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2672
static void thread_entry(JavaThread* thread, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2673
  HandleMark hm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2674
  Handle obj(THREAD, thread->threadObj());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2675
  JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2676
  JavaCalls::call_virtual(&result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2677
                          obj,
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  2678
                          KlassHandle(THREAD, SystemDictionary::Thread_klass()),
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  2679
                          vmSymbols::run_method_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  2680
                          vmSymbols::void_method_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2681
                          THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2682
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2683
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2684
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2685
JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2686
  JVMWrapper("JVM_StartThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2687
  JavaThread *native_thread = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2688
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2689
  // We cannot hold the Threads_lock when we throw an exception,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2690
  // due to rank ordering issues. Example:  we might need to grab the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2691
  // Heap_lock while we construct the exception.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2692
  bool throw_illegal_thread_state = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2693
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2694
  // We must release the Threads_lock before we can post a jvmti event
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2695
  // in Thread::start.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2696
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2697
    // Ensure that the C++ Thread and OSThread structures aren't freed before
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2698
    // we operate.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2699
    MutexLocker mu(Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2700
8061
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7405
diff changeset
  2701
    // Since JDK 5 the java.lang.Thread threadStatus is used to prevent
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7405
diff changeset
  2702
    // re-starting an already started thread, so we should usually find
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7405
diff changeset
  2703
    // that the JavaThread is null. However for a JNI attached thread
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7405
diff changeset
  2704
    // there is a small window between the Thread object being created
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7405
diff changeset
  2705
    // (with its JavaThread set) and the update to its threadStatus, so we
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7405
diff changeset
  2706
    // have to check for this
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7405
diff changeset
  2707
    if (java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread)) != NULL) {
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7405
diff changeset
  2708
      throw_illegal_thread_state = true;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2709
    } else {
8061
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7405
diff changeset
  2710
      // We could also check the stillborn flag to see if this thread was already stopped, but
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7405
diff changeset
  2711
      // for historical reasons we let the thread detect that itself when it starts running
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7405
diff changeset
  2712
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2713
      jlong size =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2714
             java_lang_Thread::stackSize(JNIHandles::resolve_non_null(jthread));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2715
      // Allocate the C++ Thread structure and create the native thread.  The
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2716
      // stack size retrieved from java is signed, but the constructor takes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2717
      // size_t (an unsigned type), so avoid passing negative values which would
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2718
      // result in really large stacks.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2719
      size_t sz = size > 0 ? (size_t) size : 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2720
      native_thread = new JavaThread(&thread_entry, sz);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2721
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2722
      // At this point it may be possible that no osthread was created for the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2723
      // JavaThread due to lack of memory. Check for this situation and throw
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2724
      // an exception if necessary. Eventually we may want to change this so
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2725
      // that we only grab the lock if the thread was created successfully -
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2726
      // then we can also do this check and throw the exception in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2727
      // JavaThread constructor.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2728
      if (native_thread->osthread() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2729
        // Note: the current thread is not being used within "prepare".
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2730
        native_thread->prepare(jthread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2731
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2732
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2733
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2734
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2735
  if (throw_illegal_thread_state) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2736
    THROW(vmSymbols::java_lang_IllegalThreadStateException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2737
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2738
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2739
  assert(native_thread != NULL, "Starting null thread?");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2740
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2741
  if (native_thread->osthread() == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2742
    // No one should hold a reference to the 'native_thread'.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2743
    delete native_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2744
    if (JvmtiExport::should_post_resource_exhausted()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2745
      JvmtiExport::post_resource_exhausted(
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2746
        JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR | JVMTI_RESOURCE_EXHAUSTED_THREADS,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2747
        "unable to create new native thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2748
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2749
    THROW_MSG(vmSymbols::java_lang_OutOfMemoryError(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2750
              "unable to create new native thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2751
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2752
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2753
  Thread::start(native_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2754
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2755
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2756
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2757
// JVM_Stop is implemented using a VM_Operation, so threads are forced to safepoints
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2758
// before the quasi-asynchronous exception is delivered.  This is a little obtrusive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2759
// but is thought to be reliable and simple. In the case, where the receiver is the
8061
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7405
diff changeset
  2760
// same thread as the sender, no safepoint is needed.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2761
JVM_ENTRY(void, JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2762
  JVMWrapper("JVM_StopThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2763
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2764
  oop java_throwable = JNIHandles::resolve(throwable);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2765
  if (java_throwable == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2766
    THROW(vmSymbols::java_lang_NullPointerException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2767
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2768
  oop java_thread = JNIHandles::resolve_non_null(jthread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2769
  JavaThread* receiver = java_lang_Thread::thread(java_thread);
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11256
diff changeset
  2770
  Events::log_exception(JavaThread::current(),
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11256
diff changeset
  2771
                        "JVM_StopThread thread JavaThread " INTPTR_FORMAT " as oop " INTPTR_FORMAT " [exception " INTPTR_FORMAT "]",
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11256
diff changeset
  2772
                        receiver, (address)java_thread, throwable);
8061
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7405
diff changeset
  2773
  // First check if thread is alive
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2774
  if (receiver != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2775
    // Check if exception is getting thrown at self (use oop equality, since the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2776
    // target object might exit)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2777
    if (java_thread == thread->threadObj()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2778
      THROW_OOP(java_throwable);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2779
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2780
      // Enques a VM_Operation to stop all threads and then deliver the exception...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2781
      Thread::send_async_exception(java_thread, JNIHandles::resolve(throwable));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2782
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2783
  }
8061
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7405
diff changeset
  2784
  else {
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7405
diff changeset
  2785
    // Either:
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7405
diff changeset
  2786
    // - target thread has not been started before being stopped, or
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7405
diff changeset
  2787
    // - target thread already terminated
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7405
diff changeset
  2788
    // We could read the threadStatus to determine which case it is
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7405
diff changeset
  2789
    // but that is overkill as it doesn't matter. We must set the
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7405
diff changeset
  2790
    // stillborn flag for the first case, and if the thread has already
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7405
diff changeset
  2791
    // exited setting this flag has no affect
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7405
diff changeset
  2792
    java_lang_Thread::set_stillborn(java_thread);
07585870d15f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 7405
diff changeset
  2793
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2794
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2795
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2796
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2797
JVM_ENTRY(jboolean, JVM_IsThreadAlive(JNIEnv* env, jobject jthread))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2798
  JVMWrapper("JVM_IsThreadAlive");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2799
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2800
  oop thread_oop = JNIHandles::resolve_non_null(jthread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2801
  return java_lang_Thread::is_alive(thread_oop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2802
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2803
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2804
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2805
JVM_ENTRY(void, JVM_SuspendThread(JNIEnv* env, jobject jthread))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2806
  JVMWrapper("JVM_SuspendThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2807
  oop java_thread = JNIHandles::resolve_non_null(jthread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2808
  JavaThread* receiver = java_lang_Thread::thread(java_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2809
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2810
  if (receiver != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2811
    // thread has run and has not exited (still on threads list)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2812
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2813
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2814
      MutexLockerEx ml(receiver->SR_lock(), Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2815
      if (receiver->is_external_suspend()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2816
        // Don't allow nested external suspend requests. We can't return
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2817
        // an error from this interface so just ignore the problem.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2818
        return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2819
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2820
      if (receiver->is_exiting()) { // thread is in the process of exiting
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2821
        return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2822
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2823
      receiver->set_external_suspend();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2824
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2825
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2826
    // java_suspend() will catch threads in the process of exiting
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2827
    // and will ignore them.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2828
    receiver->java_suspend();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2829
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2830
    // It would be nice to have the following assertion in all the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2831
    // time, but it is possible for a racing resume request to have
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2832
    // resumed this thread right after we suspended it. Temporarily
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2833
    // enable this assertion if you are chasing a different kind of
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2834
    // bug.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2835
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2836
    // assert(java_lang_Thread::thread(receiver->threadObj()) == NULL ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2837
    //   receiver->is_being_ext_suspended(), "thread is not suspended");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2838
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2839
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2840
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2841
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2842
JVM_ENTRY(void, JVM_ResumeThread(JNIEnv* env, jobject jthread))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2843
  JVMWrapper("JVM_ResumeThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2844
  // Ensure that the C++ Thread and OSThread structures aren't freed before we operate.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2845
  // We need to *always* get the threads lock here, since this operation cannot be allowed during
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2846
  // a safepoint. The safepoint code relies on suspending a thread to examine its state. If other
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2847
  // threads randomly resumes threads, then a thread might not be suspended when the safepoint code
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2848
  // looks at it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2849
  MutexLocker ml(Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2850
  JavaThread* thr = java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2851
  if (thr != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2852
    // the thread has run and is not in the process of exiting
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2853
    thr->java_resume();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2854
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2855
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2856
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2857
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2858
JVM_ENTRY(void, JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2859
  JVMWrapper("JVM_SetThreadPriority");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2860
  // Ensure that the C++ Thread and OSThread structures aren't freed before we operate
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2861
  MutexLocker ml(Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2862
  oop java_thread = JNIHandles::resolve_non_null(jthread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2863
  java_lang_Thread::set_priority(java_thread, (ThreadPriority)prio);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2864
  JavaThread* thr = java_lang_Thread::thread(java_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2865
  if (thr != NULL) {                  // Thread not yet started; priority pushed down when it is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2866
    Thread::set_priority(thr, (ThreadPriority)prio);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2867
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2868
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2869
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2870
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2871
JVM_ENTRY(void, JVM_Yield(JNIEnv *env, jclass threadClass))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2872
  JVMWrapper("JVM_Yield");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2873
  if (os::dont_yield()) return;
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2874
#ifndef USDT2
5089
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4573
diff changeset
  2875
  HS_DTRACE_PROBE0(hotspot, thread__yield);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2876
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2877
  HOTSPOT_THREAD_YIELD();
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2878
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2879
  // When ConvertYieldToSleep is off (default), this matches the classic VM use of yield.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2880
  // Critical for similar threading behaviour
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2881
  if (ConvertYieldToSleep) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2882
    os::sleep(thread, MinSleepInterval, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2883
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2884
    os::yield();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2885
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2886
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2887
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2888
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2889
JVM_ENTRY(void, JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2890
  JVMWrapper("JVM_Sleep");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2891
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2892
  if (millis < 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2893
    THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "timeout value is negative");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2894
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2895
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2896
  if (Thread::is_interrupted (THREAD, true) && !HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2897
    THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2898
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2899
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2900
  // Save current thread state and restore it at the end of this block.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2901
  // And set new thread state to SLEEPING.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2902
  JavaThreadSleepState jtss(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2903
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2904
#ifndef USDT2
5089
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4573
diff changeset
  2905
  HS_DTRACE_PROBE1(hotspot, thread__sleep__begin, millis);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2906
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2907
  HOTSPOT_THREAD_SLEEP_BEGIN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2908
                             millis);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2909
#endif /* USDT2 */
5089
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4573
diff changeset
  2910
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2911
  if (millis == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2912
    // When ConvertSleepToYield is on, this matches the classic VM implementation of
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2913
    // JVM_Sleep. Critical for similar threading behaviour (Win32)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2914
    // It appears that in certain GUI contexts, it may be beneficial to do a short sleep
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2915
    // for SOLARIS
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2916
    if (ConvertSleepToYield) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2917
      os::yield();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2918
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2919
      ThreadState old_state = thread->osthread()->get_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2920
      thread->osthread()->set_state(SLEEPING);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2921
      os::sleep(thread, MinSleepInterval, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2922
      thread->osthread()->set_state(old_state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2923
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2924
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2925
    ThreadState old_state = thread->osthread()->get_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2926
    thread->osthread()->set_state(SLEEPING);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2927
    if (os::sleep(thread, millis, true) == OS_INTRPT) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2928
      // An asynchronous exception (e.g., ThreadDeathException) could have been thrown on
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2929
      // us while we were sleeping. We do not overwrite those.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2930
      if (!HAS_PENDING_EXCEPTION) {
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2931
#ifndef USDT2
5089
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4573
diff changeset
  2932
        HS_DTRACE_PROBE1(hotspot, thread__sleep__end,1);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2933
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2934
        HOTSPOT_THREAD_SLEEP_END(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2935
                                 1);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2936
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2937
        // TODO-FIXME: THROW_MSG returns which means we will not call set_state()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2938
        // to properly restore the thread state.  That's likely wrong.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2939
        THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2940
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2941
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2942
    thread->osthread()->set_state(old_state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2943
  }
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2944
#ifndef USDT2
5089
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4573
diff changeset
  2945
  HS_DTRACE_PROBE1(hotspot, thread__sleep__end,0);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2946
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2947
  HOTSPOT_THREAD_SLEEP_END(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2948
                           0);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2949
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2950
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2951
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2952
JVM_ENTRY(jobject, JVM_CurrentThread(JNIEnv* env, jclass threadClass))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2953
  JVMWrapper("JVM_CurrentThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2954
  oop jthread = thread->threadObj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2955
  assert (thread != NULL, "no current thread!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2956
  return JNIHandles::make_local(env, jthread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2957
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2958
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2959
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2960
JVM_ENTRY(jint, JVM_CountStackFrames(JNIEnv* env, jobject jthread))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2961
  JVMWrapper("JVM_CountStackFrames");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2962
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2963
  // Ensure that the C++ Thread and OSThread structures aren't freed before we operate
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2964
  oop java_thread = JNIHandles::resolve_non_null(jthread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2965
  bool throw_illegal_thread_state = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2966
  int count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2967
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2968
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2969
    MutexLockerEx ml(thread->threadObj() == java_thread ? NULL : Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2970
    // We need to re-resolve the java_thread, since a GC might have happened during the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2971
    // acquire of the lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2972
    JavaThread* thr = java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2973
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2974
    if (thr == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2975
      // do nothing
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2976
    } else if(! thr->is_external_suspend() || ! thr->frame_anchor()->walkable()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2977
      // Check whether this java thread has been suspended already. If not, throws
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2978
      // IllegalThreadStateException. We defer to throw that exception until
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2979
      // Threads_lock is released since loading exception class has to leave VM.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2980
      // The correct way to test a thread is actually suspended is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2981
      // wait_for_ext_suspend_completion(), but we can't call that while holding
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2982
      // the Threads_lock. The above tests are sufficient for our purposes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2983
      // provided the walkability of the stack is stable - which it isn't
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2984
      // 100% but close enough for most practical purposes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2985
      throw_illegal_thread_state = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2986
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2987
      // Count all java activation, i.e., number of vframes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2988
      for(vframeStream vfst(thr); !vfst.at_end(); vfst.next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2989
        // Native frames are not counted
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2990
        if (!vfst.method()->is_native()) count++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2991
       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2992
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2993
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2994
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2995
  if (throw_illegal_thread_state) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2996
    THROW_MSG_0(vmSymbols::java_lang_IllegalThreadStateException(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2997
                "this thread is not suspended");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2998
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2999
  return count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3000
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3001
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3002
// Consider: A better way to implement JVM_Interrupt() is to acquire
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3003
// Threads_lock to resolve the jthread into a Thread pointer, fetch
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3004
// Thread->platformevent, Thread->native_thr, Thread->parker, etc.,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3005
// drop Threads_lock, and the perform the unpark() and thr_kill() operations
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3006
// outside the critical section.  Threads_lock is hot so we want to minimize
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3007
// the hold-time.  A cleaner interface would be to decompose interrupt into
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3008
// two steps.  The 1st phase, performed under Threads_lock, would return
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3009
// a closure that'd be invoked after Threads_lock was dropped.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3010
// This tactic is safe as PlatformEvent and Parkers are type-stable (TSM) and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3011
// admit spurious wakeups.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3012
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3013
JVM_ENTRY(void, JVM_Interrupt(JNIEnv* env, jobject jthread))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3014
  JVMWrapper("JVM_Interrupt");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3015
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3016
  // Ensure that the C++ Thread and OSThread structures aren't freed before we operate
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3017
  oop java_thread = JNIHandles::resolve_non_null(jthread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3018
  MutexLockerEx ml(thread->threadObj() == java_thread ? NULL : Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3019
  // We need to re-resolve the java_thread, since a GC might have happened during the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3020
  // acquire of the lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3021
  JavaThread* thr = java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3022
  if (thr != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3023
    Thread::interrupt(thr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3024
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3025
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3026
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3027
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3028
JVM_QUICK_ENTRY(jboolean, JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3029
  JVMWrapper("JVM_IsInterrupted");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3030
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3031
  // Ensure that the C++ Thread and OSThread structures aren't freed before we operate
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3032
  oop java_thread = JNIHandles::resolve_non_null(jthread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3033
  MutexLockerEx ml(thread->threadObj() == java_thread ? NULL : Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3034
  // We need to re-resolve the java_thread, since a GC might have happened during the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3035
  // acquire of the lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3036
  JavaThread* thr = java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3037
  if (thr == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3038
    return JNI_FALSE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3039
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3040
    return (jboolean) Thread::is_interrupted(thr, clear_interrupted != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3041
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3042
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3043
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3044
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3045
// Return true iff the current thread has locked the object passed in
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3046
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3047
JVM_ENTRY(jboolean, JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3048
  JVMWrapper("JVM_HoldsLock");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3049
  assert(THREAD->is_Java_thread(), "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3050
  if (obj == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3051
    THROW_(vmSymbols::java_lang_NullPointerException(), JNI_FALSE);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3052
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3053
  Handle h_obj(THREAD, JNIHandles::resolve(obj));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3054
  return ObjectSynchronizer::current_thread_holds_lock((JavaThread*)THREAD, h_obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3055
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3056
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3057
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3058
JVM_ENTRY(void, JVM_DumpAllStacks(JNIEnv* env, jclass))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3059
  JVMWrapper("JVM_DumpAllStacks");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3060
  VM_PrintThreads op;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3061
  VMThread::execute(&op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3062
  if (JvmtiExport::should_post_data_dump()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3063
    JvmtiExport::post_data_dump();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3064
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3065
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3066
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3067
JVM_ENTRY(void, JVM_SetNativeThreadName(JNIEnv* env, jobject jthread, jstring name))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3068
  JVMWrapper("JVM_SetNativeThreadName");
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3069
  ResourceMark rm(THREAD);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3070
  oop java_thread = JNIHandles::resolve_non_null(jthread);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3071
  JavaThread* thr = java_lang_Thread::thread(java_thread);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3072
  // Thread naming only supported for the current thread, doesn't work for
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3073
  // target threads.
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3074
  if (Thread::current() == thr && !thr->has_attached_via_jni()) {
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3075
    // we don't set the name of an attached thread to avoid stepping
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3076
    // on other programs
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3077
    const char *thread_name = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(name));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3078
    os::set_native_thread_name(thread_name);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3079
  }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3080
JVM_END
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3081
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3082
// java.lang.SecurityManager ///////////////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3083
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3084
static bool is_trusted_frame(JavaThread* jthread, vframeStream* vfst) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3085
  assert(jthread->is_Java_thread(), "must be a Java thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3086
  if (jthread->privileged_stack_top() == NULL) return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3087
  if (jthread->privileged_stack_top()->frame_id() == vfst->frame_id()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3088
    oop loader = jthread->privileged_stack_top()->class_loader();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3089
    if (loader == NULL) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3090
    bool trusted = java_lang_ClassLoader::is_trusted_loader(loader);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3091
    if (trusted) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3092
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3093
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3094
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3095
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3096
JVM_ENTRY(jclass, JVM_CurrentLoadedClass(JNIEnv *env))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3097
  JVMWrapper("JVM_CurrentLoadedClass");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3098
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3099
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3100
  for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3101
    // if a method in a class in a trusted loader is in a doPrivileged, return NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3102
    bool trusted = is_trusted_frame(thread, &vfst);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3103
    if (trusted) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3104
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  3105
    Method* m = vfst.method();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3106
    if (!m->is_native()) {
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13952
diff changeset
  3107
      InstanceKlass* holder = m->method_holder();
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13952
diff changeset
  3108
      oop loader = holder->class_loader();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3109
      if (loader != NULL && !java_lang_ClassLoader::is_trusted_loader(loader)) {
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13952
diff changeset
  3110
        return (jclass) JNIHandles::make_local(env, holder->java_mirror());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3111
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3112
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3113
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3114
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3115
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3116
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3117
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3118
JVM_ENTRY(jobject, JVM_CurrentClassLoader(JNIEnv *env))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3119
  JVMWrapper("JVM_CurrentClassLoader");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3120
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3121
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3122
  for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3123
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3124
    // if a method in a class in a trusted loader is in a doPrivileged, return NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3125
    bool trusted = is_trusted_frame(thread, &vfst);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3126
    if (trusted) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3127
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  3128
    Method* m = vfst.method();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3129
    if (!m->is_native()) {
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13952
diff changeset
  3130
      InstanceKlass* holder = m->method_holder();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3131
      assert(holder->is_klass(), "just checking");
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13952
diff changeset
  3132
      oop loader = holder->class_loader();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3133
      if (loader != NULL && !java_lang_ClassLoader::is_trusted_loader(loader)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3134
        return JNIHandles::make_local(env, loader);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3135
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3136
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3137
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3138
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3139
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3140
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3141
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3142
// Utility object for collecting method holders walking down the stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3143
class KlassLink: public ResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3144
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3145
  KlassHandle klass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3146
  KlassLink*  next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3147
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3148
  KlassLink(KlassHandle k) { klass = k; next = NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3149
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3150
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3151
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3152
JVM_ENTRY(jobjectArray, JVM_GetClassContext(JNIEnv *env))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3153
  JVMWrapper("JVM_GetClassContext");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3154
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3155
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3156
  // Collect linked list of (handles to) method holders
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3157
  KlassLink* first = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3158
  KlassLink* last  = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3159
  int depth = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3160
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3161
  for(vframeStream vfst(thread); !vfst.at_end(); vfst.security_get_caller_frame(1)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3162
    // Native frames are not returned
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3163
    if (!vfst.method()->is_native()) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  3164
      Klass* holder = vfst.method()->method_holder();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3165
      assert(holder->is_klass(), "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3166
      depth++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3167
      KlassLink* l = new KlassLink(KlassHandle(thread, holder));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3168
      if (first == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3169
        first = last = l;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3170
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3171
        last->next = l;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3172
        last = l;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3173
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3174
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3175
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3176
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3177
  // Create result array of type [Ljava/lang/Class;
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  3178
  objArrayOop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), depth, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3179
  // Fill in mirrors corresponding to method holders
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3180
  int index = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3181
  while (first != NULL) {
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  3182
    result->obj_at_put(index++, first->klass()->java_mirror());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3183
    first = first->next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3184
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3185
  assert(index == depth, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3186
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3187
  return (jobjectArray) JNIHandles::make_local(env, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3188
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3189
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3190
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3191
JVM_ENTRY(jint, JVM_ClassDepth(JNIEnv *env, jstring name))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3192
  JVMWrapper("JVM_ClassDepth");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3193
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3194
  Handle h_name (THREAD, JNIHandles::resolve_non_null(name));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3195
  Handle class_name_str = java_lang_String::internalize_classname(h_name, CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3196
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3197
  const char* str = java_lang_String::as_utf8_string(class_name_str());
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  3198
  TempNewSymbol class_name_sym = SymbolTable::probe(str, (int)strlen(str));
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  3199
  if (class_name_sym == NULL) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3200
    return -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3201
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3202
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3203
  int depth = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3204
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3205
  for(vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3206
    if (!vfst.method()->is_native()) {
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13952
diff changeset
  3207
      InstanceKlass* holder = vfst.method()->method_holder();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3208
      assert(holder->is_klass(), "just checking");
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13952
diff changeset
  3209
      if (holder->name() == class_name_sym) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3210
        return depth;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3211
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3212
      depth++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3213
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3214
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3215
  return -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3216
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3217
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3218
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3219
JVM_ENTRY(jint, JVM_ClassLoaderDepth(JNIEnv *env))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3220
  JVMWrapper("JVM_ClassLoaderDepth");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3221
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3222
  int depth = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3223
  for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3224
    // if a method in a class in a trusted loader is in a doPrivileged, return -1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3225
    bool trusted = is_trusted_frame(thread, &vfst);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3226
    if (trusted) return -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3227
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  3228
    Method* m = vfst.method();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3229
    if (!m->is_native()) {
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13952
diff changeset
  3230
      InstanceKlass* holder = m->method_holder();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3231
      assert(holder->is_klass(), "just checking");
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13952
diff changeset
  3232
      oop loader = holder->class_loader();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3233
      if (loader != NULL && !java_lang_ClassLoader::is_trusted_loader(loader)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3234
        return depth;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3235
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3236
      depth++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3237
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3238
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3239
  return -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3240
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3241
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3242
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3243
// java.lang.Package ////////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3244
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3245
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3246
JVM_ENTRY(jstring, JVM_GetSystemPackage(JNIEnv *env, jstring name))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3247
  JVMWrapper("JVM_GetSystemPackage");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3248
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3249
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3250
  char* str = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(name));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3251
  oop result = ClassLoader::get_system_package(str, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3252
  return (jstring) JNIHandles::make_local(result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3253
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3254
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3255
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3256
JVM_ENTRY(jobjectArray, JVM_GetSystemPackages(JNIEnv *env))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3257
  JVMWrapper("JVM_GetSystemPackages");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3258
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3259
  objArrayOop result = ClassLoader::get_system_packages(CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3260
  return (jobjectArray) JNIHandles::make_local(result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3261
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3262
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3263
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3264
// ObjectInputStream ///////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3265
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  3266
bool force_verify_field_access(Klass* current_class, Klass* field_class, AccessFlags access, bool classloader_only) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3267
  if (current_class == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3268
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3269
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3270
  if ((current_class == field_class) || access.is_public()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3271
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3272
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3273
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3274
  if (access.is_protected()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3275
    // See if current_class is a subclass of field_class
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  3276
    if (current_class->is_subclass_of(field_class)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3277
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3278
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3279
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3280
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  3281
  return (!access.is_private() && InstanceKlass::cast(current_class)->is_same_class_package(field_class));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3282
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3283
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3284
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3285
// JVM_AllocateNewObject and JVM_AllocateNewArray are unused as of 1.4
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3286
JVM_ENTRY(jobject, JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3287
  JVMWrapper("JVM_AllocateNewObject");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3288
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3289
  // Receiver is not used
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3290
  oop curr_mirror = JNIHandles::resolve_non_null(currClass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3291
  oop init_mirror = JNIHandles::resolve_non_null(initClass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3292
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3293
  // Cannot instantiate primitive types
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3294
  if (java_lang_Class::is_primitive(curr_mirror) || java_lang_Class::is_primitive(init_mirror)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3295
    ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3296
    THROW_0(vmSymbols::java_lang_InvalidClassException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3297
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3298
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3299
  // Arrays not allowed here, must use JVM_AllocateNewArray
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  3300
  if (java_lang_Class::as_Klass(curr_mirror)->oop_is_array() ||
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  3301
      java_lang_Class::as_Klass(init_mirror)->oop_is_array()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3302
    ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3303
    THROW_0(vmSymbols::java_lang_InvalidClassException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3304
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3305
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  3306
  instanceKlassHandle curr_klass (THREAD, java_lang_Class::as_Klass(curr_mirror));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  3307
  instanceKlassHandle init_klass (THREAD, java_lang_Class::as_Klass(init_mirror));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3308
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3309
  assert(curr_klass->is_subclass_of(init_klass()), "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3310
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3311
  // Interfaces, abstract classes, and java.lang.Class classes cannot be instantiated directly.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3312
  curr_klass->check_valid_for_instantiation(false, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3313
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3314
  // Make sure klass is initialized, since we are about to instantiate one of them.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3315
  curr_klass->initialize(CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3316
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3317
 methodHandle m (THREAD,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3318
                 init_klass->find_method(vmSymbols::object_initializer_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3319
                                         vmSymbols::void_method_signature()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3320
  if (m.is_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3321
    ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3322
    THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(),
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  3323
                Method::name_and_sig_as_C_string(init_klass(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3324
                                          vmSymbols::object_initializer_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3325
                                          vmSymbols::void_method_signature()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3326
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3327
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3328
  if (curr_klass ==  init_klass && !m->is_public()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3329
    // Calling the constructor for class 'curr_klass'.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3330
    // Only allow calls to a public no-arg constructor.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3331
    // This path corresponds to creating an Externalizable object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3332
    THROW_0(vmSymbols::java_lang_IllegalAccessException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3333
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3334
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3335
  if (!force_verify_field_access(curr_klass(), init_klass(), m->access_flags(), false)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3336
    // subclass 'curr_klass' does not have access to no-arg constructor of 'initcb'
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3337
    THROW_0(vmSymbols::java_lang_IllegalAccessException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3338
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3339
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3340
  Handle obj = curr_klass->allocate_instance_handle(CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3341
  // Call constructor m. This might call a constructor higher up in the hierachy
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3342
  JavaCalls::call_default_constructor(thread, m, obj, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3343
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3344
  return JNIHandles::make_local(obj());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3345
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3346
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3347
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3348
JVM_ENTRY(jobject, JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3349
  JVMWrapper("JVM_AllocateNewArray");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3350
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3351
  oop mirror = JNIHandles::resolve_non_null(currClass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3352
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3353
  if (java_lang_Class::is_primitive(mirror)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3354
    THROW_0(vmSymbols::java_lang_InvalidClassException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3355
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  3356
  Klass* k = java_lang_Class::as_Klass(mirror);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3357
  oop result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3358
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  3359
  if (k->oop_is_typeArray()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3360
    // typeArray
13952
e3cf184080bc 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 13728
diff changeset
  3361
    result = TypeArrayKlass::cast(k)->allocate(length, CHECK_NULL);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  3362
  } else if (k->oop_is_objArray()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3363
    // objArray
13952
e3cf184080bc 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 13728
diff changeset
  3364
    ObjArrayKlass* oak = ObjArrayKlass::cast(k);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3365
    oak->initialize(CHECK_NULL); // make sure class is initialized (matches Classic VM behavior)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3366
    result = oak->allocate(length, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3367
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3368
    THROW_0(vmSymbols::java_lang_InvalidClassException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3369
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3370
  return JNIHandles::make_local(env, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3371
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3372
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3373
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3374
// Return the first non-null class loader up the execution stack, or null
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3375
// if only code from the null class loader is on the stack.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3376
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3377
JVM_ENTRY(jobject, JVM_LatestUserDefinedLoader(JNIEnv *env))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3378
  for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3379
    // UseNewReflection
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3380
    vfst.skip_reflection_related_frames(); // Only needed for 1.4 reflection
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13952
diff changeset
  3381
    oop loader = vfst.method()->method_holder()->class_loader();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3382
    if (loader != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3383
      return JNIHandles::make_local(env, loader);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3384
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3385
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3386
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3387
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3388
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3389
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3390
// Load a class relative to the most recent class on the stack  with a non-null
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3391
// classloader.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3392
// This function has been deprecated and should not be considered part of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3393
// specified JVM interface.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3394
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3395
JVM_ENTRY(jclass, JVM_LoadClass0(JNIEnv *env, jobject receiver,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3396
                                 jclass currClass, jstring currClassName))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3397
  JVMWrapper("JVM_LoadClass0");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3398
  // Receiver is not used
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3399
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3400
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3401
  // Class name argument is not guaranteed to be in internal format
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3402
  Handle classname (THREAD, JNIHandles::resolve_non_null(currClassName));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3403
  Handle string = java_lang_String::internalize_classname(classname, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3404
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3405
  const char* str = java_lang_String::as_utf8_string(string());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3406
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  3407
  if (str == NULL || (int)strlen(str) > Symbol::max_length()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3408
    // It's impossible to create this class;  the name cannot fit
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3409
    // into the constant pool.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3410
    THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3411
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3412
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  3413
  TempNewSymbol name = SymbolTable::new_symbol(str, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3414
  Handle curr_klass (THREAD, JNIHandles::resolve(currClass));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3415
  // Find the most recent class on the stack with a non-null classloader
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3416
  oop loader = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3417
  oop protection_domain = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3418
  if (curr_klass.is_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3419
    for (vframeStream vfst(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3420
         !vfst.at_end() && loader == NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3421
         vfst.next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3422
      if (!vfst.method()->is_native()) {
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13952
diff changeset
  3423
        InstanceKlass* holder = vfst.method()->method_holder();
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13952
diff changeset
  3424
        loader             = holder->class_loader();
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13952
diff changeset
  3425
        protection_domain  = holder->protection_domain();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3426
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3427
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3428
  } else {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  3429
    Klass* curr_klass_oop = java_lang_Class::as_Klass(curr_klass());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  3430
    loader            = InstanceKlass::cast(curr_klass_oop)->class_loader();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  3431
    protection_domain = InstanceKlass::cast(curr_klass_oop)->protection_domain();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3432
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3433
  Handle h_loader(THREAD, loader);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3434
  Handle h_prot  (THREAD, protection_domain);
2269
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
  3435
  jclass result =  find_class_from_class_loader(env, name, true, h_loader, h_prot,
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
  3436
                                                false, thread);
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
  3437
  if (TraceClassResolution && result != NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  3438
    trace_class_resolution(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(result)));
2269
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
  3439
  }
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
  3440
  return result;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3441
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3442
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3443
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3444
// Array ///////////////////////////////////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3445
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3446
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3447
// resolve array handle and check arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3448
static inline arrayOop check_array(JNIEnv *env, jobject arr, bool type_array_only, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3449
  if (arr == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3450
    THROW_0(vmSymbols::java_lang_NullPointerException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3451
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3452
  oop a = JNIHandles::resolve_non_null(arr);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  3453
  if (!a->is_array() || (type_array_only && !a->is_typeArray())) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3454
    THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Argument is not an array");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3455
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3456
  return arrayOop(a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3457
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3458
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3459
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3460
JVM_ENTRY(jint, JVM_GetArrayLength(JNIEnv *env, jobject arr))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3461
  JVMWrapper("JVM_GetArrayLength");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3462
  arrayOop a = check_array(env, arr, false, CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3463
  return a->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3464
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3465
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3466
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3467
JVM_ENTRY(jobject, JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3468
  JVMWrapper("JVM_Array_Get");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3469
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3470
  arrayOop a = check_array(env, arr, false, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3471
  jvalue value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3472
  BasicType type = Reflection::array_get(&value, a, index, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3473
  oop box = Reflection::box(&value, type, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3474
  return JNIHandles::make_local(env, box);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3475
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3476
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3477
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3478
JVM_ENTRY(jvalue, JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3479
  JVMWrapper("JVM_GetPrimitiveArrayElement");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3480
  jvalue value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3481
  value.i = 0; // to initialize value before getting used in CHECK
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3482
  arrayOop a = check_array(env, arr, true, CHECK_(value));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3483
  assert(a->is_typeArray(), "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3484
  BasicType type = Reflection::array_get(&value, a, index, CHECK_(value));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3485
  BasicType wide_type = (BasicType) wCode;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3486
  if (type != wide_type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3487
    Reflection::widen(&value, type, wide_type, CHECK_(value));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3488
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3489
  return value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3490
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3491
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3492
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3493
JVM_ENTRY(void, JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3494
  JVMWrapper("JVM_SetArrayElement");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3495
  arrayOop a = check_array(env, arr, false, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3496
  oop box = JNIHandles::resolve(val);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3497
  jvalue value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3498
  value.i = 0; // to initialize value before getting used in CHECK
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3499
  BasicType value_type;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3500
  if (a->is_objArray()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3501
    // Make sure we do no unbox e.g. java/lang/Integer instances when storing into an object array
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3502
    value_type = Reflection::unbox_for_regular_object(box, &value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3503
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3504
    value_type = Reflection::unbox_for_primitive(box, &value, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3505
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3506
  Reflection::array_set(&value, a, index, value_type, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3507
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3508
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3509
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3510
JVM_ENTRY(void, JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3511
  JVMWrapper("JVM_SetPrimitiveArrayElement");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3512
  arrayOop a = check_array(env, arr, true, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3513
  assert(a->is_typeArray(), "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3514
  BasicType value_type = (BasicType) vCode;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3515
  Reflection::array_set(&v, a, index, value_type, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3516
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3517
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3518
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3519
JVM_ENTRY(jobject, JVM_NewArray(JNIEnv *env, jclass eltClass, jint length))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3520
  JVMWrapper("JVM_NewArray");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3521
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3522
  oop element_mirror = JNIHandles::resolve(eltClass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3523
  oop result = Reflection::reflect_new_array(element_mirror, length, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3524
  return JNIHandles::make_local(env, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3525
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3526
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3527
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3528
JVM_ENTRY(jobject, JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3529
  JVMWrapper("JVM_NewMultiArray");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3530
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3531
  arrayOop dim_array = check_array(env, dim, true, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3532
  oop element_mirror = JNIHandles::resolve(eltClass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3533
  assert(dim_array->is_typeArray(), "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3534
  oop result = Reflection::reflect_new_multi_array(element_mirror, typeArrayOop(dim_array), CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3535
  return JNIHandles::make_local(env, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3536
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3537
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3538
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3539
// Networking library support ////////////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3540
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3541
JVM_LEAF(jint, JVM_InitializeSocketLibrary())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3542
  JVMWrapper("JVM_InitializeSocketLibrary");
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
  3543
  return 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3544
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3545
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3546
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3547
JVM_LEAF(jint, JVM_Socket(jint domain, jint type, jint protocol))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3548
  JVMWrapper("JVM_Socket");
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
  3549
  return os::socket(domain, type, protocol);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3550
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3551
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3552
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3553
JVM_LEAF(jint, JVM_SocketClose(jint fd))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3554
  JVMWrapper2("JVM_SocketClose (0x%x)", fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3555
  //%note jvm_r6
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
  3556
  return os::socket_close(fd);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3557
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3558
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3559
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3560
JVM_LEAF(jint, JVM_SocketShutdown(jint fd, jint howto))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3561
  JVMWrapper2("JVM_SocketShutdown (0x%x)", fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3562
  //%note jvm_r6
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
  3563
  return os::socket_shutdown(fd, howto);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3564
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3565
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3566
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3567
JVM_LEAF(jint, JVM_Recv(jint fd, char *buf, jint nBytes, jint flags))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3568
  JVMWrapper2("JVM_Recv (0x%x)", fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3569
  //%note jvm_r6
11256
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3570
  return os::recv(fd, buf, (size_t)nBytes, (uint)flags);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3571
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3572
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3573
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3574
JVM_LEAF(jint, JVM_Send(jint fd, char *buf, jint nBytes, jint flags))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3575
  JVMWrapper2("JVM_Send (0x%x)", fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3576
  //%note jvm_r6
11256
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3577
  return os::send(fd, buf, (size_t)nBytes, (uint)flags);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3578
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3579
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3580
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3581
JVM_LEAF(jint, JVM_Timeout(int fd, long timeout))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3582
  JVMWrapper2("JVM_Timeout (0x%x)", fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3583
  //%note jvm_r6
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
  3584
  return os::timeout(fd, timeout);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3585
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3586
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3587
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3588
JVM_LEAF(jint, JVM_Listen(jint fd, jint count))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3589
  JVMWrapper2("JVM_Listen (0x%x)", fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3590
  //%note jvm_r6
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
  3591
  return os::listen(fd, count);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3592
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3593
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3594
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3595
JVM_LEAF(jint, JVM_Connect(jint fd, struct sockaddr *him, jint len))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3596
  JVMWrapper2("JVM_Connect (0x%x)", fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3597
  //%note jvm_r6
11256
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3598
  return os::connect(fd, him, (socklen_t)len);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3599
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3600
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3601
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3602
JVM_LEAF(jint, JVM_Bind(jint fd, struct sockaddr *him, jint len))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3603
  JVMWrapper2("JVM_Bind (0x%x)", fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3604
  //%note jvm_r6
11256
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3605
  return os::bind(fd, him, (socklen_t)len);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3606
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3607
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3608
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3609
JVM_LEAF(jint, JVM_Accept(jint fd, struct sockaddr *him, jint *len))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3610
  JVMWrapper2("JVM_Accept (0x%x)", fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3611
  //%note jvm_r6
11256
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3612
  socklen_t socklen = (socklen_t)(*len);
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3613
  jint result = os::accept(fd, him, &socklen);
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3614
  *len = (jint)socklen;
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3615
  return result;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3616
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3617
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3618
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3619
JVM_LEAF(jint, JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3620
  JVMWrapper2("JVM_RecvFrom (0x%x)", fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3621
  //%note jvm_r6
11256
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3622
  socklen_t socklen = (socklen_t)(*fromlen);
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3623
  jint result = os::recvfrom(fd, buf, (size_t)nBytes, (uint)flags, from, &socklen);
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3624
  *fromlen = (int)socklen;
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3625
  return result;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3626
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3627
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3628
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3629
JVM_LEAF(jint, JVM_GetSockName(jint fd, struct sockaddr *him, int *len))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3630
  JVMWrapper2("JVM_GetSockName (0x%x)", fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3631
  //%note jvm_r6
11256
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3632
  socklen_t socklen = (socklen_t)(*len);
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3633
  jint result = os::get_sock_name(fd, him, &socklen);
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3634
  *len = (int)socklen;
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3635
  return result;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3636
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3637
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3638
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3639
JVM_LEAF(jint, JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3640
  JVMWrapper2("JVM_SendTo (0x%x)", fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3641
  //%note jvm_r6
11256
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3642
  return os::sendto(fd, buf, (size_t)len, (uint)flags, to, (socklen_t)tolen);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3643
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3644
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3645
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3646
JVM_LEAF(jint, JVM_SocketAvailable(jint fd, jint *pbytes))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3647
  JVMWrapper2("JVM_SocketAvailable (0x%x)", fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3648
  //%note jvm_r6
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
  3649
  return os::socket_available(fd, pbytes);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3650
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3651
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3652
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3653
JVM_LEAF(jint, JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3654
  JVMWrapper2("JVM_GetSockOpt (0x%x)", fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3655
  //%note jvm_r6
11256
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3656
  socklen_t socklen = (socklen_t)(*optlen);
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3657
  jint result = os::get_sock_opt(fd, level, optname, optval, &socklen);
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3658
  *optlen = (int)socklen;
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3659
  return result;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3660
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3661
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3662
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3663
JVM_LEAF(jint, JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3664
  JVMWrapper2("JVM_GetSockOpt (0x%x)", fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3665
  //%note jvm_r6
11256
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3666
  return os::set_sock_opt(fd, level, optname, optval, (socklen_t)optlen);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3667
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3668
11256
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3669
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3670
JVM_LEAF(int, JVM_GetHostName(char* name, int namelen))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3671
  JVMWrapper("JVM_GetHostName");
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
  3672
  return os::get_host_name(name, namelen);
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
  3673
JVM_END
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3674
11256
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3675
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3676
// Library support ///////////////////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3677
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3678
JVM_ENTRY_NO_ENV(void*, JVM_LoadLibrary(const char* name))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3679
  //%note jvm_ct
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3680
  JVMWrapper2("JVM_LoadLibrary (%s)", name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3681
  char ebuf[1024];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3682
  void *load_result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3683
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3684
    ThreadToNativeFromVM ttnfvm(thread);
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
  3685
    load_result = os::dll_load(name, ebuf, sizeof ebuf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3686
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3687
  if (load_result == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3688
    char msg[1024];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3689
    jio_snprintf(msg, sizeof msg, "%s: %s", name, ebuf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3690
    // Since 'ebuf' may contain a string encoded using
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3691
    // platform encoding scheme, we need to pass
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3692
    // Exceptions::unsafe_to_utf8 to the new_exception method
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3693
    // as the last argument. See bug 6367357.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3694
    Handle h_exception =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3695
      Exceptions::new_exception(thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3696
                                vmSymbols::java_lang_UnsatisfiedLinkError(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3697
                                msg, Exceptions::unsafe_to_utf8);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3698
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3699
    THROW_HANDLE_0(h_exception);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3700
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3701
  return load_result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3702
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3703
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3704
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3705
JVM_LEAF(void, JVM_UnloadLibrary(void* handle))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3706
  JVMWrapper("JVM_UnloadLibrary");
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
  3707
  os::dll_unload(handle);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3708
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3709
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3710
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3711
JVM_LEAF(void*, JVM_FindLibraryEntry(void* handle, const char* name))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3712
  JVMWrapper2("JVM_FindLibraryEntry (%s)", name);
7405
e6fc8d3926f8 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 7397
diff changeset
  3713
  return os::dll_lookup(handle, name);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3714
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3715
11256
025cd1741566 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 10739
diff changeset
  3716
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3717
// Floating point support ////////////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3718
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3719
JVM_LEAF(jboolean, JVM_IsNaN(jdouble a))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3720
  JVMWrapper("JVM_IsNaN");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3721
  return g_isnan(a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3722
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3723
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3724
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3725
// JNI version ///////////////////////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3726
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3727
JVM_LEAF(jboolean, JVM_IsSupportedJNIVersion(jint version))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3728
  JVMWrapper2("JVM_IsSupportedJNIVersion (%d)", version);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3729
  return Threads::is_supported_jni_version_including_1_1(version);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3730
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3731
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3732
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3733
// String support ///////////////////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3734
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3735
JVM_ENTRY(jstring, JVM_InternString(JNIEnv *env, jstring str))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3736
  JVMWrapper("JVM_InternString");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3737
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3738
  if (str == NULL) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3739
  oop string = JNIHandles::resolve_non_null(str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3740
  oop result = StringTable::intern(string, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3741
  return (jstring) JNIHandles::make_local(env, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3742
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3743
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3744
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3745
// Raw monitor support //////////////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3746
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3747
// The lock routine below calls lock_without_safepoint_check in order to get a raw lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3748
// without interfering with the safepoint mechanism. The routines are not JVM_LEAF because
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3749
// they might be called by non-java threads. The JVM_LEAF installs a NoHandleMark check
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3750
// that only works with java threads.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3751
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3752
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3753
JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3754
  VM_Exit::block_if_vm_exited();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3755
  JVMWrapper("JVM_RawMonitorCreate");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3756
  return new Mutex(Mutex::native, "JVM_RawMonitorCreate");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3757
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3758
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3759
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3760
JNIEXPORT void JNICALL  JVM_RawMonitorDestroy(void *mon) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3761
  VM_Exit::block_if_vm_exited();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3762
  JVMWrapper("JVM_RawMonitorDestroy");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3763
  delete ((Mutex*) mon);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3764
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3765
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3766
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3767
JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3768
  VM_Exit::block_if_vm_exited();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3769
  JVMWrapper("JVM_RawMonitorEnter");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3770
  ((Mutex*) mon)->jvm_raw_lock();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3771
  return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3772
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3773
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3774
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3775
JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3776
  VM_Exit::block_if_vm_exited();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3777
  JVMWrapper("JVM_RawMonitorExit");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3778
  ((Mutex*) mon)->jvm_raw_unlock();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3779
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3780
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3781
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3782
// Support for Serialization
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3783
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3784
typedef jfloat  (JNICALL *IntBitsToFloatFn  )(JNIEnv* env, jclass cb, jint    value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3785
typedef jdouble (JNICALL *LongBitsToDoubleFn)(JNIEnv* env, jclass cb, jlong   value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3786
typedef jint    (JNICALL *FloatToIntBitsFn  )(JNIEnv* env, jclass cb, jfloat  value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3787
typedef jlong   (JNICALL *DoubleToLongBitsFn)(JNIEnv* env, jclass cb, jdouble value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3788
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3789
static IntBitsToFloatFn   int_bits_to_float_fn   = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3790
static LongBitsToDoubleFn long_bits_to_double_fn = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3791
static FloatToIntBitsFn   float_to_int_bits_fn   = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3792
static DoubleToLongBitsFn double_to_long_bits_fn = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3793
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3794
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3795
void initialize_converter_functions() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3796
  if (JDK_Version::is_gte_jdk14x_version()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3797
    // These functions only exist for compatibility with 1.3.1 and earlier
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3798
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3799
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3800
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3801
  // called from universe_post_init()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3802
  assert(
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3803
    int_bits_to_float_fn   == NULL &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3804
    long_bits_to_double_fn == NULL &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3805
    float_to_int_bits_fn   == NULL &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3806
    double_to_long_bits_fn == NULL ,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3807
    "initialization done twice"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3808
  );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3809
  // initialize
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3810
  int_bits_to_float_fn   = CAST_TO_FN_PTR(IntBitsToFloatFn  , NativeLookup::base_library_lookup("java/lang/Float" , "intBitsToFloat"  , "(I)F"));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3811
  long_bits_to_double_fn = CAST_TO_FN_PTR(LongBitsToDoubleFn, NativeLookup::base_library_lookup("java/lang/Double", "longBitsToDouble", "(J)D"));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3812
  float_to_int_bits_fn   = CAST_TO_FN_PTR(FloatToIntBitsFn  , NativeLookup::base_library_lookup("java/lang/Float" , "floatToIntBits"  , "(F)I"));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3813
  double_to_long_bits_fn = CAST_TO_FN_PTR(DoubleToLongBitsFn, NativeLookup::base_library_lookup("java/lang/Double", "doubleToLongBits", "(D)J"));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3814
  // verify
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3815
  assert(
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3816
    int_bits_to_float_fn   != NULL &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3817
    long_bits_to_double_fn != NULL &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3818
    float_to_int_bits_fn   != NULL &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3819
    double_to_long_bits_fn != NULL ,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3820
    "initialization failed"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3821
  );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3822
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3823
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3824
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3825
// Serialization
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3826
JVM_ENTRY(void, JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3827
                                            jlongArray fieldIDs, jcharArray typecodes, jbyteArray data))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3828
  assert(!JDK_Version::is_gte_jdk14x_version(), "should only be used in 1.3.1 and earlier");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3829
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3830
  typeArrayOop tcodes = typeArrayOop(JNIHandles::resolve(typecodes));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3831
  typeArrayOop dbuf   = typeArrayOop(JNIHandles::resolve(data));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3832
  typeArrayOop fids   = typeArrayOop(JNIHandles::resolve(fieldIDs));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3833
  oop          o      = JNIHandles::resolve(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3834
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3835
  if (o == NULL || fids == NULL  || dbuf == NULL  || tcodes == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3836
    THROW(vmSymbols::java_lang_NullPointerException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3837
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3838
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3839
  jsize nfids = fids->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3840
  if (nfids == 0) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3841
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3842
  if (tcodes->length() < nfids) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3843
    THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3844
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3845
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3846
  jsize off = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3847
  /* loop through fields, setting values */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3848
  for (jsize i = 0; i < nfids; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3849
    jfieldID fid = (jfieldID)(intptr_t) fids->long_at(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3850
    int field_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3851
    if (fid != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3852
      // NULL is a legal value for fid, but retrieving the field offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3853
      // trigger assertion in that case
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3854
      field_offset = jfieldIDWorkaround::from_instance_jfieldID(o->klass(), fid);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3855
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3856
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3857
    switch (tcodes->char_at(i)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3858
      case 'Z':
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3859
        if (fid != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3860
          jboolean val = (dbuf->byte_at(off) != 0) ? JNI_TRUE : JNI_FALSE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3861
          o->bool_field_put(field_offset, val);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3862
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3863
        off++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3864
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3865
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3866
      case 'B':
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3867
        if (fid != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3868
          o->byte_field_put(field_offset, dbuf->byte_at(off));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3869
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3870
        off++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3871
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3872
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3873
      case 'C':
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3874
        if (fid != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3875
          jchar val = ((dbuf->byte_at(off + 0) & 0xFF) << 8)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3876
                    + ((dbuf->byte_at(off + 1) & 0xFF) << 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3877
          o->char_field_put(field_offset, val);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3878
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3879
        off += 2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3880
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3881
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3882
      case 'S':
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3883
        if (fid != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3884
          jshort val = ((dbuf->byte_at(off + 0) & 0xFF) << 8)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3885
                     + ((dbuf->byte_at(off + 1) & 0xFF) << 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3886
          o->short_field_put(field_offset, val);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3887
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3888
        off += 2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3889
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3890
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3891
      case 'I':
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3892
        if (fid != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3893
          jint ival = ((dbuf->byte_at(off + 0) & 0xFF) << 24)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3894
                    + ((dbuf->byte_at(off + 1) & 0xFF) << 16)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3895
                    + ((dbuf->byte_at(off + 2) & 0xFF) << 8)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3896
                    + ((dbuf->byte_at(off + 3) & 0xFF) << 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3897
          o->int_field_put(field_offset, ival);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3898
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3899
        off += 4;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3900
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3901
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3902
      case 'F':
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3903
        if (fid != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3904
          jint ival = ((dbuf->byte_at(off + 0) & 0xFF) << 24)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3905
                    + ((dbuf->byte_at(off + 1) & 0xFF) << 16)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3906
                    + ((dbuf->byte_at(off + 2) & 0xFF) << 8)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3907
                    + ((dbuf->byte_at(off + 3) & 0xFF) << 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3908
          jfloat fval = (*int_bits_to_float_fn)(env, NULL, ival);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3909
          o->float_field_put(field_offset, fval);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3910
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3911
        off += 4;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3912
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3913
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3914
      case 'J':
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3915
        if (fid != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3916
          jlong lval = (((jlong) dbuf->byte_at(off + 0) & 0xFF) << 56)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3917
                     + (((jlong) dbuf->byte_at(off + 1) & 0xFF) << 48)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3918
                     + (((jlong) dbuf->byte_at(off + 2) & 0xFF) << 40)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3919
                     + (((jlong) dbuf->byte_at(off + 3) & 0xFF) << 32)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3920
                     + (((jlong) dbuf->byte_at(off + 4) & 0xFF) << 24)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3921
                     + (((jlong) dbuf->byte_at(off + 5) & 0xFF) << 16)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3922
                     + (((jlong) dbuf->byte_at(off + 6) & 0xFF) << 8)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3923
                     + (((jlong) dbuf->byte_at(off + 7) & 0xFF) << 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3924
          o->long_field_put(field_offset, lval);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3925
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3926
        off += 8;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3927
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3928
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3929
      case 'D':
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3930
        if (fid != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3931
          jlong lval = (((jlong) dbuf->byte_at(off + 0) & 0xFF) << 56)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3932
                     + (((jlong) dbuf->byte_at(off + 1) & 0xFF) << 48)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3933
                     + (((jlong) dbuf->byte_at(off + 2) & 0xFF) << 40)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3934
                     + (((jlong) dbuf->byte_at(off + 3) & 0xFF) << 32)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3935
                     + (((jlong) dbuf->byte_at(off + 4) & 0xFF) << 24)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3936
                     + (((jlong) dbuf->byte_at(off + 5) & 0xFF) << 16)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3937
                     + (((jlong) dbuf->byte_at(off + 6) & 0xFF) << 8)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3938
                     + (((jlong) dbuf->byte_at(off + 7) & 0xFF) << 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3939
          jdouble dval = (*long_bits_to_double_fn)(env, NULL, lval);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3940
          o->double_field_put(field_offset, dval);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3941
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3942
        off += 8;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3943
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3944
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3945
      default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3946
        // Illegal typecode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3947
        THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "illegal typecode");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3948
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3949
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3950
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3951
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3952
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3953
JVM_ENTRY(void, JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3954
                            jlongArray fieldIDs, jcharArray typecodes, jbyteArray data))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3955
  assert(!JDK_Version::is_gte_jdk14x_version(), "should only be used in 1.3.1 and earlier");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3956
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3957
  typeArrayOop tcodes = typeArrayOop(JNIHandles::resolve(typecodes));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3958
  typeArrayOop dbuf   = typeArrayOop(JNIHandles::resolve(data));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3959
  typeArrayOop fids   = typeArrayOop(JNIHandles::resolve(fieldIDs));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3960
  oop          o      = JNIHandles::resolve(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3961
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3962
  if (o == NULL || fids == NULL  || dbuf == NULL  || tcodes == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3963
    THROW(vmSymbols::java_lang_NullPointerException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3964
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3965
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3966
  jsize nfids = fids->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3967
  if (nfids == 0) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3968
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3969
  if (tcodes->length() < nfids) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3970
    THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3971
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3972
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3973
  /* loop through fields, fetching values */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3974
  jsize off = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3975
  for (jsize i = 0; i < nfids; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3976
    jfieldID fid = (jfieldID)(intptr_t) fids->long_at(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3977
    if (fid == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3978
      THROW(vmSymbols::java_lang_NullPointerException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3979
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3980
    int field_offset = jfieldIDWorkaround::from_instance_jfieldID(o->klass(), fid);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3981
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3982
     switch (tcodes->char_at(i)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3983
       case 'Z':
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3984
         {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3985
           jboolean val = o->bool_field(field_offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3986
           dbuf->byte_at_put(off++, (val != 0) ? 1 : 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3987
         }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3988
         break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3989
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3990
       case 'B':
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3991
         dbuf->byte_at_put(off++, o->byte_field(field_offset));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3992
         break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3993
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3994
       case 'C':
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3995
         {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3996
           jchar val = o->char_field(field_offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3997
           dbuf->byte_at_put(off++, (val >> 8) & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3998
           dbuf->byte_at_put(off++, (val >> 0) & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3999
         }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4000
         break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4001
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4002
       case 'S':
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4003
         {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4004
           jshort val = o->short_field(field_offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4005
           dbuf->byte_at_put(off++, (val >> 8) & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4006
           dbuf->byte_at_put(off++, (val >> 0) & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4007
         }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4008
         break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4009
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4010
       case 'I':
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4011
         {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4012
           jint val = o->int_field(field_offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4013
           dbuf->byte_at_put(off++, (val >> 24) & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4014
           dbuf->byte_at_put(off++, (val >> 16) & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4015
           dbuf->byte_at_put(off++, (val >> 8)  & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4016
           dbuf->byte_at_put(off++, (val >> 0)  & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4017
         }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4018
         break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4019
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4020
       case 'F':
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4021
         {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4022
           jfloat fval = o->float_field(field_offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4023
           jint ival = (*float_to_int_bits_fn)(env, NULL, fval);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4024
           dbuf->byte_at_put(off++, (ival >> 24) & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4025
           dbuf->byte_at_put(off++, (ival >> 16) & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4026
           dbuf->byte_at_put(off++, (ival >> 8)  & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4027
           dbuf->byte_at_put(off++, (ival >> 0)  & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4028
         }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4029
         break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4030
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4031
       case 'J':
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4032
         {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4033
           jlong val = o->long_field(field_offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4034
           dbuf->byte_at_put(off++, (val >> 56) & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4035
           dbuf->byte_at_put(off++, (val >> 48) & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4036
           dbuf->byte_at_put(off++, (val >> 40) & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4037
           dbuf->byte_at_put(off++, (val >> 32) & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4038
           dbuf->byte_at_put(off++, (val >> 24) & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4039
           dbuf->byte_at_put(off++, (val >> 16) & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4040
           dbuf->byte_at_put(off++, (val >> 8)  & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4041
           dbuf->byte_at_put(off++, (val >> 0)  & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4042
         }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4043
         break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4044
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4045
       case 'D':
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4046
         {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4047
           jdouble dval = o->double_field(field_offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4048
           jlong lval = (*double_to_long_bits_fn)(env, NULL, dval);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4049
           dbuf->byte_at_put(off++, (lval >> 56) & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4050
           dbuf->byte_at_put(off++, (lval >> 48) & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4051
           dbuf->byte_at_put(off++, (lval >> 40) & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4052
           dbuf->byte_at_put(off++, (lval >> 32) & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4053
           dbuf->byte_at_put(off++, (lval >> 24) & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4054
           dbuf->byte_at_put(off++, (lval >> 16) & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4055
           dbuf->byte_at_put(off++, (lval >> 8)  & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4056
           dbuf->byte_at_put(off++, (lval >> 0)  & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4057
         }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4058
         break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4059
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4060
       default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4061
         // Illegal typecode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4062
         THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "illegal typecode");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4063
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4064
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4065
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4066
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4067
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4068
// Shared JNI/JVM entry points //////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4069
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  4070
jclass find_class_from_class_loader(JNIEnv* env, Symbol* name, jboolean init, Handle loader, Handle protection_domain, jboolean throwError, TRAPS) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4071
  // Security Note:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4072
  //   The Java level wrapper will perform the necessary security check allowing
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4073
  //   us to pass the NULL as the initiating class loader.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  4074
  Klass* klass = SystemDictionary::resolve_or_fail(name, loader, protection_domain, throwError != 0, CHECK_NULL);
3578
411436f0a4a2 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 3575
diff changeset
  4075
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4076
  KlassHandle klass_handle(THREAD, klass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4077
  // Check if we should initialize the class
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4078
  if (init && klass_handle->oop_is_instance()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4079
    klass_handle->initialize(CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4080
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4081
  return (jclass) JNIHandles::make_local(env, klass_handle->java_mirror());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4082
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4083
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4084
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4085
// Internal SQE debugging support ///////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4086
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4087
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4088
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4089
extern "C" {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4090
  JNIEXPORT jboolean JNICALL JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4091
  JNIEXPORT jboolean JNICALL JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4092
  JNIEXPORT void JNICALL JVM_VMBreakPoint(JNIEnv *env, jobject obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4093
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4094
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4095
JVM_LEAF(jboolean, JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4096
  JVMWrapper("JVM_AccessBoolVMFlag");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4097
  return is_get ? CommandLineFlags::boolAt((char*) name, (bool*) value) : CommandLineFlags::boolAtPut((char*) name, (bool*) value, INTERNAL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4098
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4099
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4100
JVM_LEAF(jboolean, JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4101
  JVMWrapper("JVM_AccessVMIntFlag");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4102
  intx v;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4103
  jboolean result = is_get ? CommandLineFlags::intxAt((char*) name, &v) : CommandLineFlags::intxAtPut((char*) name, &v, INTERNAL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4104
  *value = (jint)v;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4105
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4106
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4107
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4108
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4109
JVM_ENTRY(void, JVM_VMBreakPoint(JNIEnv *env, jobject obj))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4110
  JVMWrapper("JVM_VMBreakPoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4111
  oop the_obj = JNIHandles::resolve(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4112
  BREAKPOINT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4113
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4114
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4115
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4116
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4117
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4118
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4119
// Method ///////////////////////////////////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4120
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4121
JVM_ENTRY(jobject, JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4122
  JVMWrapper("JVM_InvokeMethod");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4123
  Handle method_handle;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4124
  if (thread->stack_available((address) &method_handle) >= JVMInvokeMethodSlack) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4125
    method_handle = Handle(THREAD, JNIHandles::resolve(method));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4126
    Handle receiver(THREAD, JNIHandles::resolve(obj));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4127
    objArrayHandle args(THREAD, objArrayOop(JNIHandles::resolve(args0)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4128
    oop result = Reflection::invoke_method(method_handle(), receiver, args, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4129
    jobject res = JNIHandles::make_local(env, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4130
    if (JvmtiExport::should_post_vm_object_alloc()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4131
      oop ret_type = java_lang_reflect_Method::return_type(method_handle());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4132
      assert(ret_type != NULL, "sanity check: ret_type oop must not be NULL!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4133
      if (java_lang_Class::is_primitive(ret_type)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4134
        // Only for primitive type vm allocates memory for java object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4135
        // See box() method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4136
        JvmtiExport::post_vm_object_alloc(JavaThread::current(), result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4137
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4138
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4139
    return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4140
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4141
    THROW_0(vmSymbols::java_lang_StackOverflowError());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4142
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4143
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4144
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4145
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4146
JVM_ENTRY(jobject, JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjectArray args0))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4147
  JVMWrapper("JVM_NewInstanceFromConstructor");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4148
  oop constructor_mirror = JNIHandles::resolve(c);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4149
  objArrayHandle args(THREAD, objArrayOop(JNIHandles::resolve(args0)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4150
  oop result = Reflection::invoke_constructor(constructor_mirror, args, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4151
  jobject res = JNIHandles::make_local(env, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4152
  if (JvmtiExport::should_post_vm_object_alloc()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4153
    JvmtiExport::post_vm_object_alloc(JavaThread::current(), result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4154
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4155
  return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4156
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4157
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4158
// Atomic ///////////////////////////////////////////////////////////////////////////////////////////
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4159
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4160
JVM_LEAF(jboolean, JVM_SupportsCX8())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4161
  JVMWrapper("JVM_SupportsCX8");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4162
  return VM_Version::supports_cx8();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4163
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4164
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4165
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4166
JVM_ENTRY(jboolean, JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4167
  JVMWrapper("JVM_CX8Field");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4168
  jlong res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4169
  oop             o       = JNIHandles::resolve(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4170
  intptr_t        fldOffs = jfieldIDWorkaround::from_instance_jfieldID(o->klass(), fid);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4171
  volatile jlong* addr    = (volatile jlong*)((address)o + fldOffs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4172
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4173
  assert(VM_Version::supports_cx8(), "cx8 not supported");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4174
  res = Atomic::cmpxchg(newVal, addr, oldVal);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4175
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4176
  return res == oldVal;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4177
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4178
363
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4179
// DTrace ///////////////////////////////////////////////////////////////////
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4180
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4181
JVM_ENTRY(jint, JVM_DTraceGetVersion(JNIEnv* env))
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4182
  JVMWrapper("JVM_DTraceGetVersion");
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4183
  return (jint)JVM_TRACING_DTRACE_VERSION;
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4184
JVM_END
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4185
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4186
JVM_ENTRY(jlong,JVM_DTraceActivate(
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4187
    JNIEnv* env, jint version, jstring module_name, jint providers_count,
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4188
    JVM_DTraceProvider* providers))
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4189
  JVMWrapper("JVM_DTraceActivate");
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4190
  return DTraceJSDT::activate(
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4191
    version, module_name, providers_count, providers, CHECK_0);
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4192
JVM_END
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4193
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4194
JVM_ENTRY(jboolean,JVM_DTraceIsProbeEnabled(JNIEnv* env, jmethodID method))
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4195
  JVMWrapper("JVM_DTraceIsProbeEnabled");
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4196
  return DTraceJSDT::is_probe_enabled(method);
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4197
JVM_END
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4198
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4199
JVM_ENTRY(void,JVM_DTraceDispose(JNIEnv* env, jlong handle))
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4200
  JVMWrapper("JVM_DTraceDispose");
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4201
  DTraceJSDT::dispose(handle);
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4202
JVM_END
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4203
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4204
JVM_ENTRY(jboolean,JVM_DTraceIsSupported(JNIEnv* env))
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4205
  JVMWrapper("JVM_DTraceIsSupported");
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4206
  return DTraceJSDT::is_supported();
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4207
JVM_END
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 1
diff changeset
  4208
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4209
// Returns an array of all live Thread objects (VM internal JavaThreads,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4210
// jvmti agent threads, and JNI attaching threads  are skipped)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4211
// See CR 6404306 regarding JNI attaching threads
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4212
JVM_ENTRY(jobjectArray, JVM_GetAllThreads(JNIEnv *env, jclass dummy))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4213
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4214
  ThreadsListEnumerator tle(THREAD, false, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4215
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4216
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4217
  int num_threads = tle.num_threads();
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  4218
  objArrayOop r = oopFactory::new_objArray(SystemDictionary::Thread_klass(), num_threads, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4219
  objArrayHandle threads_ah(THREAD, r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4220
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4221
  for (int i = 0; i < num_threads; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4222
    Handle h = tle.get_threadObj(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4223
    threads_ah->obj_at_put(i, h());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4224
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4225
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4226
  return (jobjectArray) JNIHandles::make_local(env, threads_ah());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4227
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4228
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4229
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4230
// Support for java.lang.Thread.getStackTrace() and getAllStackTraces() methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4231
// Return StackTraceElement[][], each element is the stack trace of a thread in
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4232
// the corresponding entry in the given threads array
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4233
JVM_ENTRY(jobjectArray, JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4234
  JVMWrapper("JVM_DumpThreads");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4235
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4236
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4237
  // Check if threads is null
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4238
  if (threads == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4239
    THROW_(vmSymbols::java_lang_NullPointerException(), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4240
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4241
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4242
  objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(threads));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4243
  objArrayHandle ah(THREAD, a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4244
  int num_threads = ah->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4245
  // check if threads is non-empty array
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4246
  if (num_threads == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4247
    THROW_(vmSymbols::java_lang_IllegalArgumentException(), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4248
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4249
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4250
  // check if threads is not an array of objects of Thread class
13952
e3cf184080bc 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 13728
diff changeset
  4251
  Klass* k = ObjArrayKlass::cast(ah->klass())->element_klass();
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  4252
  if (k != SystemDictionary::Thread_klass()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4253
    THROW_(vmSymbols::java_lang_IllegalArgumentException(), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4254
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4255
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4256
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4257
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4258
  GrowableArray<instanceHandle>* thread_handle_array = new GrowableArray<instanceHandle>(num_threads);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4259
  for (int i = 0; i < num_threads; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4260
    oop thread_obj = ah->obj_at(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4261
    instanceHandle h(THREAD, (instanceOop) thread_obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4262
    thread_handle_array->append(h);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4263
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4264
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4265
  Handle stacktraces = ThreadService::dump_stack_traces(thread_handle_array, num_threads, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4266
  return (jobjectArray)JNIHandles::make_local(env, stacktraces());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4267
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4268
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4269
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4270
// JVM monitoring and management support
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4271
JVM_ENTRY_NO_ENV(void*, JVM_GetManagement(jint version))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4272
  return Management::get_jmm_interface(version);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4273
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4274
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4275
// com.sun.tools.attach.VirtualMachine agent properties support
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4276
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4277
// Initialize the agent properties with the properties maintained in the VM
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4278
JVM_ENTRY(jobject, JVM_InitAgentProperties(JNIEnv *env, jobject properties))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4279
  JVMWrapper("JVM_InitAgentProperties");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4280
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4281
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4282
  Handle props(THREAD, JNIHandles::resolve_non_null(properties));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4283
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4284
  PUTPROP(props, "sun.java.command", Arguments::java_command());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4285
  PUTPROP(props, "sun.jvm.flags", Arguments::jvm_flags());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4286
  PUTPROP(props, "sun.jvm.args", Arguments::jvm_args());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4287
  return properties;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4288
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4289
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4290
JVM_ENTRY(jobjectArray, JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4291
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4292
  JVMWrapper("JVM_GetEnclosingMethodInfo");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4293
  JvmtiVMObjectAllocEventCollector oam;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4294
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4295
  if (ofClass == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4296
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4297
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4298
  Handle mirror(THREAD, JNIHandles::resolve_non_null(ofClass));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4299
  // Special handling for primitive objects
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4300
  if (java_lang_Class::is_primitive(mirror())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4301
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4302
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  4303
  Klass* k = java_lang_Class::as_Klass(mirror());
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  4304
  if (!k->oop_is_instance()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4305
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4306
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4307
  instanceKlassHandle ik_h(THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4308
  int encl_method_class_idx = ik_h->enclosing_method_class_index();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4309
  if (encl_method_class_idx == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4310
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4311
  }
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  4312
  objArrayOop dest_o = oopFactory::new_objArray(SystemDictionary::Object_klass(), 3, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4313
  objArrayHandle dest(THREAD, dest_o);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  4314
  Klass* enc_k = ik_h->constants()->klass_at(encl_method_class_idx, CHECK_NULL);
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  4315
  dest->obj_at_put(0, enc_k->java_mirror());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4316
  int encl_method_method_idx = ik_h->enclosing_method_method_index();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4317
  if (encl_method_method_idx != 0) {
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  4318
    Symbol* sym = ik_h->constants()->symbol_at(
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4319
                        extract_low_short_from_int(
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4320
                          ik_h->constants()->name_and_type_at(encl_method_method_idx)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4321
    Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4322
    dest->obj_at_put(1, str());
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 8061
diff changeset
  4323
    sym = ik_h->constants()->symbol_at(
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4324
              extract_high_short_from_int(
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4325
                ik_h->constants()->name_and_type_at(encl_method_method_idx)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4326
    str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4327
    dest->obj_at_put(2, str());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4328
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4329
  return (jobjectArray) JNIHandles::make_local(dest());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4330
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4331
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4332
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4333
JVM_ENTRY(jintArray, JVM_GetThreadStateValues(JNIEnv* env,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4334
                                              jint javaThreadState))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4335
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4336
  // If new thread states are added in future JDK and VM versions,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4337
  // this should check if the JDK version is compatible with thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4338
  // states supported by the VM.  Return NULL if not compatible.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4339
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4340
  // This function must map the VM java_lang_Thread::ThreadStatus
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4341
  // to the Java thread state that the JDK supports.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4342
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4343
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4344
  typeArrayHandle values_h;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4345
  switch (javaThreadState) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4346
    case JAVA_THREAD_STATE_NEW : {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4347
      typeArrayOop r = oopFactory::new_typeArray(T_INT, 1, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4348
      values_h = typeArrayHandle(THREAD, r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4349
      values_h->int_at_put(0, java_lang_Thread::NEW);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4350
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4351
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4352
    case JAVA_THREAD_STATE_RUNNABLE : {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4353
      typeArrayOop r = oopFactory::new_typeArray(T_INT, 1, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4354
      values_h = typeArrayHandle(THREAD, r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4355
      values_h->int_at_put(0, java_lang_Thread::RUNNABLE);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4356
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4357
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4358
    case JAVA_THREAD_STATE_BLOCKED : {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4359
      typeArrayOop r = oopFactory::new_typeArray(T_INT, 1, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4360
      values_h = typeArrayHandle(THREAD, r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4361
      values_h->int_at_put(0, java_lang_Thread::BLOCKED_ON_MONITOR_ENTER);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4362
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4363
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4364
    case JAVA_THREAD_STATE_WAITING : {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4365
      typeArrayOop r = oopFactory::new_typeArray(T_INT, 2, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4366
      values_h = typeArrayHandle(THREAD, r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4367
      values_h->int_at_put(0, java_lang_Thread::IN_OBJECT_WAIT);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4368
      values_h->int_at_put(1, java_lang_Thread::PARKED);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4369
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4370
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4371
    case JAVA_THREAD_STATE_TIMED_WAITING : {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4372
      typeArrayOop r = oopFactory::new_typeArray(T_INT, 3, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4373
      values_h = typeArrayHandle(THREAD, r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4374
      values_h->int_at_put(0, java_lang_Thread::SLEEPING);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4375
      values_h->int_at_put(1, java_lang_Thread::IN_OBJECT_WAIT_TIMED);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4376
      values_h->int_at_put(2, java_lang_Thread::PARKED_TIMED);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4377
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4378
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4379
    case JAVA_THREAD_STATE_TERMINATED : {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4380
      typeArrayOop r = oopFactory::new_typeArray(T_INT, 1, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4381
      values_h = typeArrayHandle(THREAD, r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4382
      values_h->int_at_put(0, java_lang_Thread::TERMINATED);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4383
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4384
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4385
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4386
      // Unknown state - probably incompatible JDK version
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4387
      return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4388
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4389
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4390
  return (jintArray) JNIHandles::make_local(env, values_h());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4391
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4392
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4393
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4394
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4395
JVM_ENTRY(jobjectArray, JVM_GetThreadStateNames(JNIEnv* env,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4396
                                                jint javaThreadState,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4397
                                                jintArray values))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4398
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4399
  // If new thread states are added in future JDK and VM versions,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4400
  // this should check if the JDK version is compatible with thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4401
  // states supported by the VM.  Return NULL if not compatible.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4402
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4403
  // This function must map the VM java_lang_Thread::ThreadStatus
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4404
  // to the Java thread state that the JDK supports.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4405
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4406
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4407
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4408
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4409
  // Check if threads is null
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4410
  if (values == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4411
    THROW_(vmSymbols::java_lang_NullPointerException(), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4412
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4413
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4414
  typeArrayOop v = typeArrayOop(JNIHandles::resolve_non_null(values));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4415
  typeArrayHandle values_h(THREAD, v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4416
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4417
  objArrayHandle names_h;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4418
  switch (javaThreadState) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4419
    case JAVA_THREAD_STATE_NEW : {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4420
      assert(values_h->length() == 1 &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4421
               values_h->int_at(0) == java_lang_Thread::NEW,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4422
             "Invalid threadStatus value");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4423
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  4424
      objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4425
                                               1, /* only 1 substate */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4426
                                               CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4427
      names_h = objArrayHandle(THREAD, r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4428
      Handle name = java_lang_String::create_from_str("NEW", CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4429
      names_h->obj_at_put(0, name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4430
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4431
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4432
    case JAVA_THREAD_STATE_RUNNABLE : {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4433
      assert(values_h->length() == 1 &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4434
               values_h->int_at(0) == java_lang_Thread::RUNNABLE,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4435
             "Invalid threadStatus value");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4436
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  4437
      objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4438
                                               1, /* only 1 substate */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4439
                                               CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4440
      names_h = objArrayHandle(THREAD, r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4441
      Handle name = java_lang_String::create_from_str("RUNNABLE", CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4442
      names_h->obj_at_put(0, name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4443
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4444
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4445
    case JAVA_THREAD_STATE_BLOCKED : {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4446
      assert(values_h->length() == 1 &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4447
               values_h->int_at(0) == java_lang_Thread::BLOCKED_ON_MONITOR_ENTER,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4448
             "Invalid threadStatus value");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4449
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  4450
      objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4451
                                               1, /* only 1 substate */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4452
                                               CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4453
      names_h = objArrayHandle(THREAD, r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4454
      Handle name = java_lang_String::create_from_str("BLOCKED", CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4455
      names_h->obj_at_put(0, name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4456
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4457
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4458
    case JAVA_THREAD_STATE_WAITING : {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4459
      assert(values_h->length() == 2 &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4460
               values_h->int_at(0) == java_lang_Thread::IN_OBJECT_WAIT &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4461
               values_h->int_at(1) == java_lang_Thread::PARKED,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4462
             "Invalid threadStatus value");
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  4463
      objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4464
                                               2, /* number of substates */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4465
                                               CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4466
      names_h = objArrayHandle(THREAD, r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4467
      Handle name0 = java_lang_String::create_from_str("WAITING.OBJECT_WAIT",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4468
                                                       CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4469
      Handle name1 = java_lang_String::create_from_str("WAITING.PARKED",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4470
                                                       CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4471
      names_h->obj_at_put(0, name0());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4472
      names_h->obj_at_put(1, name1());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4473
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4474
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4475
    case JAVA_THREAD_STATE_TIMED_WAITING : {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4476
      assert(values_h->length() == 3 &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4477
               values_h->int_at(0) == java_lang_Thread::SLEEPING &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4478
               values_h->int_at(1) == java_lang_Thread::IN_OBJECT_WAIT_TIMED &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4479
               values_h->int_at(2) == java_lang_Thread::PARKED_TIMED,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4480
             "Invalid threadStatus value");
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  4481
      objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4482
                                               3, /* number of substates */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4483
                                               CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4484
      names_h = objArrayHandle(THREAD, r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4485
      Handle name0 = java_lang_String::create_from_str("TIMED_WAITING.SLEEPING",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4486
                                                       CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4487
      Handle name1 = java_lang_String::create_from_str("TIMED_WAITING.OBJECT_WAIT",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4488
                                                       CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4489
      Handle name2 = java_lang_String::create_from_str("TIMED_WAITING.PARKED",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4490
                                                       CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4491
      names_h->obj_at_put(0, name0());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4492
      names_h->obj_at_put(1, name1());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4493
      names_h->obj_at_put(2, name2());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4494
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4495
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4496
    case JAVA_THREAD_STATE_TERMINATED : {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4497
      assert(values_h->length() == 1 &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4498
               values_h->int_at(0) == java_lang_Thread::TERMINATED,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4499
             "Invalid threadStatus value");
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4429
diff changeset
  4500
      objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4501
                                               1, /* only 1 substate */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4502
                                               CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4503
      names_h = objArrayHandle(THREAD, r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4504
      Handle name = java_lang_String::create_from_str("TERMINATED", CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4505
      names_h->obj_at_put(0, name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4506
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4507
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4508
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4509
      // Unknown state - probably incompatible JDK version
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4510
      return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4511
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4512
  return (jobjectArray) JNIHandles::make_local(env, names_h());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4513
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4514
JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4515
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4516
JVM_ENTRY(void, JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4517
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4518
  memset(info, 0, sizeof(info_size));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4519
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4520
  info->jvm_version = Abstract_VM_Version::jvm_version();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4521
  info->update_version = 0;          /* 0 in HotSpot Express VM */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4522
  info->special_update_version = 0;  /* 0 in HotSpot Express VM */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4523
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4524
  // when we add a new capability in the jvm_version_info struct, we should also
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4525
  // consider to expose this new capability in the sun.rt.jvmCapabilities jvmstat
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4526
  // counter defined in runtimeService.cpp.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4527
  info->is_attachable = AttachListener::is_attach_supported();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4528
#ifdef KERNEL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4529
  info->is_kernel_jvm = 1; // true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4530
#else  // KERNEL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4531
  info->is_kernel_jvm = 0; // false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4532
#endif // KERNEL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4533
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4534
JVM_END