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