hotspot/src/share/vm/prims/jni.cpp
author ysr
Thu, 03 Dec 2009 15:01:57 -0800
changeset 4461 c17c526d36ef
parent 4089 14bd2cd13a2c
child 4448 d6ec2737186c
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: 1897
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/_jni.cpp.incl"
489c9b5090e2 Initial load
duke
parents:
diff changeset
    27
489c9b5090e2 Initial load
duke
parents:
diff changeset
    28
static jint CurrentVersion = JNI_VERSION_1_6;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    29
489c9b5090e2 Initial load
duke
parents:
diff changeset
    30
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
// The DT_RETURN_MARK macros create a scoped object to fire the dtrace
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
// '-return' probe regardless of the return path is taken out of the function.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
// Methods that have multiple return paths use this to avoid having to
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
// instrument each return path.  Methods that use CHECK or THROW must use this
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
// since those macros can cause an immedate uninstrumented return.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
// In order to get the return value, a reference to the variable containing
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
// the return value must be passed to the contructor of the object, and
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
// the return value must be set before return (since the mark object has
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
// a reference to it).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
// Example:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
// DT_RETURN_MARK_DECL(SomeFunc, int);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
// JNI_ENTRY(int, SomeFunc, ...)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
//   int return_value = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
//   DT_RETURN_MARK(SomeFunc, int, (const int&)return_value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
//   foo(CHECK_0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
//   return_value = 5;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
//   return return_value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
// JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
#define DT_RETURN_MARK_DECL(name, type)                                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  HS_DTRACE_PROBE_DECL1(hotspot_jni, name##__return, type);                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
  DTRACE_ONLY(                                                             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
    class DTraceReturnProbeMark_##name {                                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
     public:                                                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
      const type& _ret_ref;                                                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
      DTraceReturnProbeMark_##name(const type& v) : _ret_ref(v) {}         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
      ~DTraceReturnProbeMark_##name() {                                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
        HS_DTRACE_PROBE1(hotspot_jni, name##__return, _ret_ref);           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
      }                                                                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
    }                                                                      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  )
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
// Void functions are simpler since there's no return value
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
#define DT_VOID_RETURN_MARK_DECL(name)                                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  HS_DTRACE_PROBE_DECL0(hotspot_jni, name##__return);                      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  DTRACE_ONLY(                                                             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
    class DTraceReturnProbeMark_##name {                                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
     public:                                                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
      ~DTraceReturnProbeMark_##name() {                                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
        HS_DTRACE_PROBE0(hotspot_jni, name##__return);                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
      }                                                                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
    }                                                                      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  )
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
// Place these macros in the function to mark the return.  Non-void
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
// functions need the type and address of the return value.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
#define DT_RETURN_MARK(name, type, ref) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  DTRACE_ONLY( DTraceReturnProbeMark_##name dtrace_return_mark(ref) )
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
#define DT_VOID_RETURN_MARK(name) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  DTRACE_ONLY( DTraceReturnProbeMark_##name dtrace_return_mark )
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
// Use these to select distinct code for floating-point vs. non-floating point
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
// situations.  Used from within common macros where we need slightly
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
// different behavior for Float/Double
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
#define FP_SELECT_Boolean(intcode, fpcode) intcode
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
#define FP_SELECT_Byte(intcode, fpcode)    intcode
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
#define FP_SELECT_Char(intcode, fpcode)    intcode
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
#define FP_SELECT_Short(intcode, fpcode)   intcode
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
#define FP_SELECT_Object(intcode, fpcode)  intcode
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
#define FP_SELECT_Int(intcode, fpcode)     intcode
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
#define FP_SELECT_Long(intcode, fpcode)    intcode
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
#define FP_SELECT_Float(intcode, fpcode)   fpcode
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
#define FP_SELECT_Double(intcode, fpcode)  fpcode
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
#define FP_SELECT(TypeName, intcode, fpcode) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  FP_SELECT_##TypeName(intcode, fpcode)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
#define COMMA ,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
// Choose DT_RETURN_MARK macros  based on the type: float/double -> void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
// (dtrace doesn't do FP yet)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
#define DT_RETURN_MARK_DECL_FOR(TypeName, name, type) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  FP_SELECT(TypeName, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
    DT_RETURN_MARK_DECL(name, type), DT_VOID_RETURN_MARK_DECL(name) )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
#define DT_RETURN_MARK_FOR(TypeName, name, type, ref) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  FP_SELECT(TypeName, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
    DT_RETURN_MARK(name, type, ref), DT_VOID_RETURN_MARK(name) )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
// out-of-line helpers for class jfieldIDWorkaround:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
bool jfieldIDWorkaround::is_valid_jfieldID(klassOop k, jfieldID id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  if (jfieldIDWorkaround::is_instance_jfieldID(k, id)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
    uintptr_t as_uint = (uintptr_t) id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
    intptr_t offset = raw_instance_offset(id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
    if (is_checked_jfieldID(id)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
      if (!klass_hash_ok(k, id)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
        return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
    return instanceKlass::cast(k)->contains_field_offset(offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
    JNIid* result = (JNIid*) id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
    return result != NULL && result->is_static_field_id();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
    return result != NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
intptr_t jfieldIDWorkaround::encode_klass_hash(klassOop k, intptr_t offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  if (offset <= small_offset_mask) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
    klassOop field_klass = k;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
    klassOop super_klass = Klass::cast(field_klass)->super();
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   138
    // With compressed oops the most super class with nonstatic fields would
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   139
    // be the owner of fields embedded in the header.
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   140
    while (instanceKlass::cast(super_klass)->has_nonstatic_fields() &&
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   141
           instanceKlass::cast(super_klass)->contains_field_offset(offset)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
      field_klass = super_klass;   // super contains the field also
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
      super_klass = Klass::cast(field_klass)->super();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
    debug_only(No_Safepoint_Verifier nosafepoint;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
    uintptr_t klass_hash = field_klass->identity_hash();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
    return ((klass_hash & klass_mask) << klass_shift) | checked_mask_in_place;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
#if 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
    #ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
      ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
      warning("VerifyJNIFields: long offset %d in %s", offset, Klass::cast(k)->external_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
    #endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
    return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
bool jfieldIDWorkaround::klass_hash_ok(klassOop k, jfieldID id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  uintptr_t as_uint = (uintptr_t) id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  intptr_t klass_hash = (as_uint >> klass_shift) & klass_mask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
    debug_only(No_Safepoint_Verifier nosafepoint;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
    // Could use a non-blocking query for identity_hash here...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
    if ((k->identity_hash() & klass_mask) == klass_hash)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
    k = Klass::cast(k)->super();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  } while (k != NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
void jfieldIDWorkaround::verify_instance_jfieldID(klassOop k, jfieldID id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  guarantee(jfieldIDWorkaround::is_instance_jfieldID(k, id), "must be an instance field" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  uintptr_t as_uint = (uintptr_t) id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  intptr_t offset = raw_instance_offset(id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  if (VerifyJNIFields) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
    if (is_checked_jfieldID(id)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
      guarantee(klass_hash_ok(k, id),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
    "Bug in native code: jfieldID class must match object");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
#if 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
      #ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
      if (Verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  warning("VerifyJNIFields: unverified offset %d for %s", offset, Klass::cast(k)->external_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
      #endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  guarantee(instanceKlass::cast(k)->contains_field_offset(offset),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
      "Bug in native code: jfieldID offset must address interior of object");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
// Pick a reasonable higher bound for local capacity requested
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
// for EnsureLocalCapacity and PushLocalFrame.  We don't want it too
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
// high because a test (or very unusual application) may try to allocate
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
// that many handles and run out of swap space.  An implementation is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
// permitted to allocate more handles than the ensured capacity, so this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
// value is set high enough to prevent compatibility problems.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
const int MAX_REASONABLE_LOCAL_CAPACITY = 4*K;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
// Wrapper to trace JNI functions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  Histogram* JNIHistogram;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  static volatile jint JNIHistogram_lock = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  class JNITraceWrapper : public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
   public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
    JNITraceWrapper(const char* format, ...) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
      if (TraceJNICalls) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
        va_list ap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
        va_start(ap, format);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
        tty->print("JNI ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
        tty->vprint_cr(format, ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
        va_end(ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  class JNIHistogramElement : public HistogramElement {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
    public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
     JNIHistogramElement(const char* name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  JNIHistogramElement::JNIHistogramElement(const char* elementName) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
    _name = elementName;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
    uintx count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
    while (Atomic::cmpxchg(1, &JNIHistogram_lock, 0) != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
      while (OrderAccess::load_acquire(&JNIHistogram_lock) != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
        count +=1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
        if ( (WarnOnStalledSpinLock > 0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
          && (count % WarnOnStalledSpinLock == 0)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
          warning("JNIHistogram_lock seems to be stalled");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
    if(JNIHistogram == NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
      JNIHistogram = new Histogram("JNI Call Counts",100);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
    JNIHistogram->add_element(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
    Atomic::dec(&JNIHistogram_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  #define JNICountWrapper(arg)                                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
     static JNIHistogramElement* e = new JNIHistogramElement(arg); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
      /* There is a MT-race condition in VC++. So we need to make sure that that e has been initialized */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
     if (e != NULL) e->increment_count()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  #define JNIWrapper(arg) JNICountWrapper(arg); JNITraceWrapper(arg)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  #define JNIWrapper(arg)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
// Implementation of JNI entries
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
DT_RETURN_MARK_DECL(DefineClass, jclass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
JNI_ENTRY(jclass, jni_DefineClass(JNIEnv *env, const char *name, jobject loaderRef,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
                                  const jbyte *buf, jsize bufLen))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  JNIWrapper("DefineClass");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  DTRACE_PROBE5(hotspot_jni, DefineClass__entry,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
    env, name, loaderRef, buf, bufLen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  jclass cls = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  DT_RETURN_MARK(DefineClass, jclass, (const jclass&)cls);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  // Since exceptions can be thrown, class initialization can take place
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  // if name is NULL no check for class name in .class stream has to be made.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  symbolHandle class_name;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  if (name != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
    const int str_len = (int)strlen(name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
    if (str_len > symbolOopDesc::max_length()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
      // It's impossible to create this class;  the name cannot fit
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
      // into the constant pool.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
      THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
    class_name = oopFactory::new_symbol_handle(name, str_len, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  ClassFileStream st((u1*) buf, bufLen, NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  Handle class_loader (THREAD, JNIHandles::resolve(loaderRef));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  if (UsePerfData && !class_loader.is_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
    // check whether the current caller thread holds the lock or not.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
    // If not, increment the corresponding counter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
    if (ObjectSynchronizer::
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
        query_lock_ownership((JavaThread*)THREAD, class_loader) !=
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
        ObjectSynchronizer::owner_self) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
      ClassLoader::sync_JNIDefineClassLockFreeCounter()->inc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  klassOop k = SystemDictionary::resolve_from_stream(class_name, class_loader,
3820
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 2269
diff changeset
   302
                                                     Handle(), &st, true,
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 2269
diff changeset
   303
                                                     CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
2269
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   305
  if (TraceClassResolution && k != NULL) {
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   306
    trace_class_resolution(k);
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   307
  }
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   308
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  cls = (jclass)JNIHandles::make_local(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
    env, Klass::cast(k)->java_mirror());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  return cls;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
static bool first_time_FindClass = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
DT_RETURN_MARK_DECL(FindClass, jclass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
JNI_ENTRY(jclass, jni_FindClass(JNIEnv *env, const char *name))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  JNIWrapper("FindClass");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  DTRACE_PROBE2(hotspot_jni, FindClass__entry, env, name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  jclass result = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  DT_RETURN_MARK(FindClass, jclass, (const jclass&)result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  // Remember if we are the first invocation of jni_FindClass
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
  bool first_time = first_time_FindClass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  first_time_FindClass = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  // Sanity check the name:  it cannot be null or larger than the maximum size
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  // name we can fit in the constant pool.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  if (name == NULL || (int)strlen(name) > symbolOopDesc::max_length()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
    THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  //%note jni_3
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  Handle loader;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  Handle protection_domain;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
  // Find calling class
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
  instanceKlassHandle k (THREAD, thread->security_get_caller_class(0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
  if (k.not_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
    loader = Handle(THREAD, k->class_loader());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
    // Special handling to make sure JNI_OnLoad and JNI_OnUnload are executed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
    // in the correct class context.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
    if (loader.is_null() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
        k->name() == vmSymbols::java_lang_ClassLoader_NativeLibrary()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
      JavaValue result(T_OBJECT);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
      JavaCalls::call_static(&result, k,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
                                      vmSymbolHandles::getFromClass_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
                                      vmSymbolHandles::void_class_signature(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
                                      thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
      if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
        Handle ex(thread, thread->pending_exception());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
        CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
        THROW_HANDLE_0(ex);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
      oop mirror = (oop) result.get_jobject();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
      loader = Handle(THREAD,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
        instanceKlass::cast(java_lang_Class::as_klassOop(mirror))->class_loader());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
      protection_domain = Handle(THREAD,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
        instanceKlass::cast(java_lang_Class::as_klassOop(mirror))->protection_domain());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
    // We call ClassLoader.getSystemClassLoader to obtain the system class loader.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
    loader = Handle(THREAD, SystemDictionary::java_system_loader());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  symbolHandle sym = oopFactory::new_symbol_handle(name, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  result = find_class_from_class_loader(env, sym, true, loader,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
                                        protection_domain, true, thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
2269
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   373
  if (TraceClassResolution && result != NULL) {
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   374
    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
   375
  }
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   376
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
  // If we were the first invocation of jni_FindClass, we enable compilation again
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  // rather than just allowing invocation counter to overflow and decay.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  // Controlled by flag DelayCompilationDuringStartup.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
  if (first_time && !CompileTheWorld)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
    CompilationPolicy::completed_vm_startup();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
DT_RETURN_MARK_DECL(FromReflectedMethod, jmethodID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
JNI_ENTRY(jmethodID, jni_FromReflectedMethod(JNIEnv *env, jobject method))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  JNIWrapper("FromReflectedMethod");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
  DTRACE_PROBE2(hotspot_jni, FromReflectedMethod__entry, env, method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  jmethodID ret = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
  DT_RETURN_MARK(FromReflectedMethod, jmethodID, (const jmethodID&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
  // method is a handle to a java.lang.reflect.Method object
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  oop reflected  = JNIHandles::resolve_non_null(method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
  oop mirror     = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
  int slot       = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  if (reflected->klass() == SystemDictionary::reflect_constructor_klass()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
    mirror = java_lang_reflect_Constructor::clazz(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
    slot   = java_lang_reflect_Constructor::slot(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
    assert(reflected->klass() == SystemDictionary::reflect_method_klass(), "wrong type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
    mirror = java_lang_reflect_Method::clazz(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
    slot   = java_lang_reflect_Method::slot(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  klassOop k     = java_lang_Class::as_klassOop(mirror);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  KlassHandle k1(THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  // Make sure class is initialized before handing id's out to methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
  Klass::cast(k1())->initialize(CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  methodOop m = instanceKlass::cast(k1())->method_with_idnum(slot);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  ret = m==NULL? NULL : m->jmethod_id();  // return NULL if reflected method deleted
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
DT_RETURN_MARK_DECL(FromReflectedField, jfieldID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
JNI_ENTRY(jfieldID, jni_FromReflectedField(JNIEnv *env, jobject field))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
  JNIWrapper("FromReflectedField");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
  DTRACE_PROBE2(hotspot_jni, FromReflectedField__entry, env, field);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  jfieldID ret = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
  DT_RETURN_MARK(FromReflectedField, jfieldID, (const jfieldID&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
  // field is a handle to a java.lang.reflect.Field object
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
  oop reflected   = JNIHandles::resolve_non_null(field);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
  oop mirror      = java_lang_reflect_Field::clazz(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
  klassOop k      = java_lang_Class::as_klassOop(mirror);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  int slot        = java_lang_reflect_Field::slot(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  int modifiers   = java_lang_reflect_Field::modifiers(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  KlassHandle k1(THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
  // Make sure class is initialized before handing id's out to fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
  Klass::cast(k1())->initialize(CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
  // First check if this is a static field
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  if (modifiers & JVM_ACC_STATIC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
    intptr_t offset = instanceKlass::cast(k1())->offset_from_fields( slot );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
    JNIid* id = instanceKlass::cast(k1())->jni_id_for(offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
    assert(id != NULL, "corrupt Field object");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
    debug_only(id->set_is_static_field_id();)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
    // A jfieldID for a static field is a JNIid specifying the field holder and the offset within the klassOop
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
    ret = jfieldIDWorkaround::to_static_jfieldID(id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
    return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  // The slot is the index of the field description in the field-array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
  // The jfieldID is the offset of the field within the object
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  // It may also have hash bits for k, if VerifyJNIFields is turned on.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  intptr_t offset = instanceKlass::cast(k1())->offset_from_fields( slot );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
  assert(instanceKlass::cast(k1())->contains_field_offset(offset), "stay within object");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
  ret = jfieldIDWorkaround::to_instance_jfieldID(k1(), offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
DT_RETURN_MARK_DECL(ToReflectedMethod, jobject);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
JNI_ENTRY(jobject, jni_ToReflectedMethod(JNIEnv *env, jclass cls, jmethodID method_id, jboolean isStatic))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
  JNIWrapper("ToReflectedMethod");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
  DTRACE_PROBE4(hotspot_jni, ToReflectedMethod__entry, env, cls, method_id, isStatic);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
  jobject ret = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
  DT_RETURN_MARK(ToReflectedMethod, jobject, (const jobject&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
  methodHandle m (THREAD, JNIHandles::resolve_jmethod_id(method_id));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
  assert(m->is_static() == (isStatic != 0), "jni_ToReflectedMethod access flags doesn't match");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
  oop reflection_method;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  if (m->is_initializer()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
    reflection_method = Reflection::new_constructor(m, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
    reflection_method = Reflection::new_method(m, UseNewReflection, false, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
  ret = JNIHandles::make_local(env, reflection_method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
DT_RETURN_MARK_DECL(GetSuperclass, jclass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
JNI_ENTRY(jclass, jni_GetSuperclass(JNIEnv *env, jclass sub))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
  JNIWrapper("GetSuperclass");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
  DTRACE_PROBE2(hotspot_jni, GetSuperclass__entry, env, sub);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
  jclass obj = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
  DT_RETURN_MARK(GetSuperclass, jclass, (const jclass&)obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
  oop mirror = JNIHandles::resolve_non_null(sub);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
  // primitive classes return NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
  if (java_lang_Class::is_primitive(mirror)) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
  // Rules of Class.getSuperClass as implemented by KLass::java_super:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
  // arrays return Object
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
  // interfaces return NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
  // proper classes return Klass::super()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
  klassOop k = java_lang_Class::as_klassOop(mirror);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
  if (Klass::cast(k)->is_interface()) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
  // return mirror for superclass
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
  klassOop super = Klass::cast(k)->java_super();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  // super2 is the value computed by the compiler's getSuperClass intrinsic:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  debug_only(klassOop super2 = ( Klass::cast(k)->oop_is_javaArray()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
                                 ? SystemDictionary::object_klass()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
                                 : Klass::cast(k)->super() ) );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
  assert(super == super2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
         "java_super computation depends on interface, array, other super");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
  obj = (super == NULL) ? NULL : (jclass) JNIHandles::make_local(Klass::cast(super)->java_mirror());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
  return obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
JNI_QUICK_ENTRY(jboolean, jni_IsAssignableFrom(JNIEnv *env, jclass sub, jclass super))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
  JNIWrapper("IsSubclassOf");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
  DTRACE_PROBE3(hotspot_jni, IsAssignableFrom__entry, env, sub, super);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
  oop sub_mirror   = JNIHandles::resolve_non_null(sub);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
  oop super_mirror = JNIHandles::resolve_non_null(super);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
  if (java_lang_Class::is_primitive(sub_mirror) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
      java_lang_Class::is_primitive(super_mirror)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
    jboolean ret = (sub_mirror == super_mirror);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
    DTRACE_PROBE1(hotspot_jni, IsAssignableFrom__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
    return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
  klassOop sub_klass   = java_lang_Class::as_klassOop(sub_mirror);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
  klassOop super_klass = java_lang_Class::as_klassOop(super_mirror);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
  assert(sub_klass != NULL && super_klass != NULL, "invalid arguments to jni_IsAssignableFrom");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
  jboolean ret = Klass::cast(sub_klass)->is_subtype_of(super_klass) ?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
                   JNI_TRUE : JNI_FALSE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
  DTRACE_PROBE1(hotspot_jni, IsAssignableFrom__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
DT_RETURN_MARK_DECL(Throw, jint);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
JNI_ENTRY(jint, jni_Throw(JNIEnv *env, jthrowable obj))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  JNIWrapper("Throw");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
  DTRACE_PROBE2(hotspot_jni, Throw__entry, env, obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
  jint ret = JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
  DT_RETURN_MARK(Throw, jint, (const jint&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
  THROW_OOP_(JNIHandles::resolve(obj), JNI_OK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
DT_RETURN_MARK_DECL(ThrowNew, jint);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
JNI_ENTRY(jint, jni_ThrowNew(JNIEnv *env, jclass clazz, const char *message))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
  JNIWrapper("ThrowNew");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
  DTRACE_PROBE3(hotspot_jni, ThrowNew__entry, env, clazz, message);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
  jint ret = JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
  DT_RETURN_MARK(ThrowNew, jint, (const jint&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
  instanceKlass* k = instanceKlass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(clazz)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
  symbolHandle name = symbolHandle(THREAD, k->name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
  Handle class_loader (THREAD,  k->class_loader());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  Handle protection_domain (THREAD, k->protection_domain());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  THROW_MSG_LOADER_(name, (char *)message, class_loader, protection_domain, JNI_OK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
// JNI functions only transform a pending async exception to a synchronous
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
// exception in ExceptionOccurred and ExceptionCheck calls, since
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
// delivering an async exception in other places won't change the native
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
// code's control flow and would be harmful when native code further calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
// JNI functions with a pending exception. Async exception is also checked
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
// during the call, so ExceptionOccurred/ExceptionCheck won't return
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
// false but deliver the async exception at the very end during
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
// state transition.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
static void jni_check_async_exceptions(JavaThread *thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
  assert(thread == Thread::current(), "must be itself");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
  thread->check_and_handle_async_exceptions();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
JNI_ENTRY_NO_PRESERVE(jthrowable, jni_ExceptionOccurred(JNIEnv *env))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
  JNIWrapper("ExceptionOccurred");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
  DTRACE_PROBE1(hotspot_jni, ExceptionOccurred__entry, env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
  jni_check_async_exceptions(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
  oop exception = thread->pending_exception();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
  jthrowable ret = (jthrowable) JNIHandles::make_local(env, exception);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
  DTRACE_PROBE1(hotspot_jni, ExceptionOccurred__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
JNI_ENTRY_NO_PRESERVE(void, jni_ExceptionDescribe(JNIEnv *env))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
  JNIWrapper("ExceptionDescribe");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
  DTRACE_PROBE1(hotspot_jni, ExceptionDescribe__entry, env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
  if (thread->has_pending_exception()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
    Handle ex(thread, thread->pending_exception());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
    thread->clear_pending_exception();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
    if (ex->is_a(SystemDictionary::threaddeath_klass())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
      // Don't print anything if we are being killed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
      jio_fprintf(defaultStream::error_stream(), "Exception ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
      if (thread != NULL && thread->threadObj() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
        ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
        jio_fprintf(defaultStream::error_stream(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
        "in thread \"%s\" ", thread->get_thread_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
      if (ex->is_a(SystemDictionary::throwable_klass())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
        JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
        JavaCalls::call_virtual(&result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
                                ex,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
                                KlassHandle(THREAD,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
                                  SystemDictionary::throwable_klass()),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
                                vmSymbolHandles::printStackTrace_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
                                vmSymbolHandles::void_method_signature(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
                                THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
        // If an exception is thrown in the call it gets thrown away. Not much
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
        // we can do with it. The native code that calls this, does not check
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
        // for the exception - hence, it might still be in the thread when DestroyVM gets
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
        // called, potentially causing a few asserts to trigger - since no pending exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
        // is expected.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
        CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
        ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
        jio_fprintf(defaultStream::error_stream(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
        ". Uncaught exception of type %s.",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
        Klass::cast(ex->klass())->external_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
  DTRACE_PROBE(hotspot_jni, ExceptionDescribe__return);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
JNI_QUICK_ENTRY(void, jni_ExceptionClear(JNIEnv *env))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
  JNIWrapper("ExceptionClear");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
  DTRACE_PROBE1(hotspot_jni, ExceptionClear__entry, env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
  // The jni code might be using this API to clear java thrown exception.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
  // So just mark jvmti thread exception state as exception caught.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
  JvmtiThreadState *state = JavaThread::current()->jvmti_thread_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
  if (state != NULL && state->is_exception_detected()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
    state->set_exception_caught();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
  thread->clear_pending_exception();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
  DTRACE_PROBE(hotspot_jni, ExceptionClear__return);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
JNI_ENTRY(void, jni_FatalError(JNIEnv *env, const char *msg))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
  JNIWrapper("FatalError");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
  DTRACE_PROBE2(hotspot_jni, FatalError__entry, env, msg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
  tty->print_cr("FATAL ERROR in native method: %s", msg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
  thread->print_stack();
773
01daf7c809b1 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 360
diff changeset
   643
  os::abort(); // Dump core and abort
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
JNI_ENTRY(jint, jni_PushLocalFrame(JNIEnv *env, jint capacity))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
  JNIWrapper("PushLocalFrame");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
  DTRACE_PROBE2(hotspot_jni, PushLocalFrame__entry, env, capacity);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
  //%note jni_11
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
  if (capacity < 0 && capacity > MAX_REASONABLE_LOCAL_CAPACITY) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
    DTRACE_PROBE1(hotspot_jni, PushLocalFrame__return, JNI_ERR);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
    return JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
  JNIHandleBlock* old_handles = thread->active_handles();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
  JNIHandleBlock* new_handles = JNIHandleBlock::allocate_block(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
  assert(new_handles != NULL, "should not be NULL");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
  new_handles->set_pop_frame_link(old_handles);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
  thread->set_active_handles(new_handles);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
  jint ret = JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
  DTRACE_PROBE1(hotspot_jni, PushLocalFrame__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
JNI_ENTRY(jobject, jni_PopLocalFrame(JNIEnv *env, jobject result))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
  JNIWrapper("PopLocalFrame");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
  DTRACE_PROBE2(hotspot_jni, PopLocalFrame__entry, env, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
  //%note jni_11
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
  Handle result_handle(thread, JNIHandles::resolve(result));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
  JNIHandleBlock* old_handles = thread->active_handles();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
  JNIHandleBlock* new_handles = old_handles->pop_frame_link();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
  if (new_handles != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
    // As a sanity check we only release the handle blocks if the pop_frame_link is not NULL.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
    // This way code will still work if PopLocalFrame is called without a corresponding
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
    // PushLocalFrame call. Note that we set the pop_frame_link to NULL explicitly, otherwise
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
    // the release_block call will release the blocks.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
    thread->set_active_handles(new_handles);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
    old_handles->set_pop_frame_link(NULL);              // clear link we won't release new_handles below
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
    JNIHandleBlock::release_block(old_handles, thread); // may block
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
    result = JNIHandles::make_local(thread, result_handle());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
  DTRACE_PROBE1(hotspot_jni, PopLocalFrame__return, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
JNI_ENTRY(jobject, jni_NewGlobalRef(JNIEnv *env, jobject ref))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
  JNIWrapper("NewGlobalRef");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
  DTRACE_PROBE2(hotspot_jni, NewGlobalRef__entry, env, ref);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
  Handle ref_handle(thread, JNIHandles::resolve(ref));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
  jobject ret = JNIHandles::make_global(ref_handle);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
  DTRACE_PROBE1(hotspot_jni, NewGlobalRef__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
// Must be JNI_ENTRY (with HandleMark)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
JNI_ENTRY_NO_PRESERVE(void, jni_DeleteGlobalRef(JNIEnv *env, jobject ref))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
  JNIWrapper("DeleteGlobalRef");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
  DTRACE_PROBE2(hotspot_jni, DeleteGlobalRef__entry, env, ref);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
  JNIHandles::destroy_global(ref);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
  DTRACE_PROBE(hotspot_jni, DeleteGlobalRef__return);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
JNI_QUICK_ENTRY(void, jni_DeleteLocalRef(JNIEnv *env, jobject obj))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
  JNIWrapper("DeleteLocalRef");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
  DTRACE_PROBE2(hotspot_jni, DeleteLocalRef__entry, env, obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
  JNIHandles::destroy_local(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
  DTRACE_PROBE(hotspot_jni, DeleteLocalRef__return);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
JNI_QUICK_ENTRY(jboolean, jni_IsSameObject(JNIEnv *env, jobject r1, jobject r2))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
  JNIWrapper("IsSameObject");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
  DTRACE_PROBE3(hotspot_jni, IsSameObject__entry, env, r1, r2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
  oop a = JNIHandles::resolve(r1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
  oop b = JNIHandles::resolve(r2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
  jboolean ret = (a == b) ? JNI_TRUE : JNI_FALSE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
  DTRACE_PROBE1(hotspot_jni, IsSameObject__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
JNI_ENTRY(jobject, jni_NewLocalRef(JNIEnv *env, jobject ref))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
  JNIWrapper("NewLocalRef");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
  DTRACE_PROBE2(hotspot_jni, NewLocalRef__entry, env, ref);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
  jobject ret = JNIHandles::make_local(env, JNIHandles::resolve(ref));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
  DTRACE_PROBE1(hotspot_jni, NewLocalRef__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
JNI_LEAF(jint, jni_EnsureLocalCapacity(JNIEnv *env, jint capacity))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
  JNIWrapper("EnsureLocalCapacity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
  DTRACE_PROBE2(hotspot_jni, EnsureLocalCapacity__entry, env, capacity);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
  jint ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
  if (capacity >= 0 && capacity <= MAX_REASONABLE_LOCAL_CAPACITY) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
    ret = JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
    ret = JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
  DTRACE_PROBE1(hotspot_jni, EnsureLocalCapacity__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
// Return the Handle Type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
JNI_LEAF(jobjectRefType, jni_GetObjectRefType(JNIEnv *env, jobject obj))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
  JNIWrapper("GetObjectRefType");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
  DTRACE_PROBE2(hotspot_jni, GetObjectRefType__entry, env, obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
  jobjectRefType ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
  if (JNIHandles::is_local_handle(thread, obj) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
      JNIHandles::is_frame_handle(thread, obj))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
    ret = JNILocalRefType;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
  else if (JNIHandles::is_global_handle(obj))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
    ret = JNIGlobalRefType;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
  else if (JNIHandles::is_weak_global_handle(obj))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
    ret = JNIWeakGlobalRefType;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
  else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
    ret = JNIInvalidRefType;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
  DTRACE_PROBE1(hotspot_jni, GetObjectRefType__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
class JNI_ArgumentPusher : public SignatureIterator {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
  JavaCallArguments*  _arguments;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
  virtual void get_bool   () = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
  virtual void get_char   () = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
  virtual void get_short  () = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
  virtual void get_byte   () = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
  virtual void get_int    () = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
  virtual void get_long   () = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
  virtual void get_float  () = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
  virtual void get_double () = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
  virtual void get_object () = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
  JNI_ArgumentPusher(Thread *thread, symbolOop signature)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
       : SignatureIterator(thread, signature) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
    this->_return_type = T_ILLEGAL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
    _arguments = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
  virtual void iterate( uint64_t fingerprint ) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
  void set_java_argument_object(JavaCallArguments *arguments) { _arguments = arguments; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
  inline void do_bool()                     { if (!is_return_type()) get_bool();   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
  inline void do_char()                     { if (!is_return_type()) get_char();   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
  inline void do_short()                    { if (!is_return_type()) get_short();  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
  inline void do_byte()                     { if (!is_return_type()) get_byte();   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
  inline void do_int()                      { if (!is_return_type()) get_int();    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
  inline void do_long()                     { if (!is_return_type()) get_long();   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
  inline void do_float()                    { if (!is_return_type()) get_float();  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
  inline void do_double()                   { if (!is_return_type()) get_double(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
  inline void do_object(int begin, int end) { if (!is_return_type()) get_object(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
  inline void do_array(int begin, int end)  { if (!is_return_type()) get_object(); } // do_array uses get_object -- there is no get_array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
  inline void do_void()                     { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
  JavaCallArguments* arguments()     { return _arguments; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
  void push_receiver(Handle h)       { _arguments->push_oop(h); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
class JNI_ArgumentPusherVaArg : public JNI_ArgumentPusher {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
  va_list _ap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
  inline void get_bool()   { _arguments->push_int(va_arg(_ap, jint)); } // bool is coerced to int when using va_arg
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
  inline void get_char()   { _arguments->push_int(va_arg(_ap, jint)); } // char is coerced to int when using va_arg
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
  inline void get_short()  { _arguments->push_int(va_arg(_ap, jint)); } // short is coerced to int when using va_arg
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
  inline void get_byte()   { _arguments->push_int(va_arg(_ap, jint)); } // byte is coerced to int when using va_arg
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
  inline void get_int()    { _arguments->push_int(va_arg(_ap, jint)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
  // each of these paths is exercized by the various jck Call[Static,Nonvirtual,][Void,Int,..]Method[A,V,] tests
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
  inline void get_long()   { _arguments->push_long(va_arg(_ap, jlong)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
  inline void get_float()  { _arguments->push_float((jfloat)va_arg(_ap, jdouble)); } // float is coerced to double w/ va_arg
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
  inline void get_double() { _arguments->push_double(va_arg(_ap, jdouble)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
  inline void get_object() { jobject l = va_arg(_ap, jobject);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
                             _arguments->push_oop(Handle((oop *)l, false)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
  inline void set_ap(va_list rap) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
#ifdef va_copy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
    va_copy(_ap, rap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
#elif defined (__va_copy)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
    __va_copy(_ap, rap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
    _ap = rap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
  JNI_ArgumentPusherVaArg(Thread *thread, symbolOop signature, va_list rap)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
       : JNI_ArgumentPusher(thread, signature) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
    set_ap(rap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
  JNI_ArgumentPusherVaArg(Thread *thread, jmethodID method_id, va_list rap)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
      : JNI_ArgumentPusher(thread, JNIHandles::resolve_jmethod_id(method_id)->signature()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
    set_ap(rap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
  // Optimized path if we have the bitvector form of signature
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
  void iterate( uint64_t fingerprint ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
    if ( fingerprint == UCONST64(-1) ) SignatureIterator::iterate();// Must be too many arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
    else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
      _return_type = (BasicType)((fingerprint >> static_feature_size) &
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
                                  result_feature_mask);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
      assert(fingerprint, "Fingerprint should not be 0");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
      fingerprint = fingerprint >> (static_feature_size + result_feature_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
      while ( 1 ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
        switch ( fingerprint & parameter_feature_mask ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
          case bool_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
          case char_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
          case short_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
          case byte_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
          case int_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
            get_int();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
          case obj_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
            get_object();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
          case long_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
            get_long();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
          case float_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
            get_float();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
          case double_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
            get_double();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
          case done_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
            return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
          default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
            ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
        fingerprint >>= parameter_feature_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
class JNI_ArgumentPusherArray : public JNI_ArgumentPusher {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
  const jvalue *_ap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
  inline void get_bool()   { _arguments->push_int((jint)(_ap++)->z); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
  inline void get_char()   { _arguments->push_int((jint)(_ap++)->c); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
  inline void get_short()  { _arguments->push_int((jint)(_ap++)->s); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
  inline void get_byte()   { _arguments->push_int((jint)(_ap++)->b); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
  inline void get_int()    { _arguments->push_int((jint)(_ap++)->i); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
  inline void get_long()   { _arguments->push_long((_ap++)->j);  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
  inline void get_float()  { _arguments->push_float((_ap++)->f); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
  inline void get_double() { _arguments->push_double((_ap++)->d);}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
  inline void get_object() { _arguments->push_oop(Handle((oop *)(_ap++)->l, false)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
  inline void set_ap(const jvalue *rap) { _ap = rap; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
  JNI_ArgumentPusherArray(Thread *thread, symbolOop signature, const jvalue *rap)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
       : JNI_ArgumentPusher(thread, signature) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
    set_ap(rap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
  JNI_ArgumentPusherArray(Thread *thread, jmethodID method_id, const jvalue *rap)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
      : JNI_ArgumentPusher(thread, JNIHandles::resolve_jmethod_id(method_id)->signature()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
    set_ap(rap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
  // Optimized path if we have the bitvector form of signature
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
  void iterate( uint64_t fingerprint ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
    if ( fingerprint == UCONST64(-1) ) SignatureIterator::iterate(); // Must be too many arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
    else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
      _return_type = (BasicType)((fingerprint >> static_feature_size) &
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
                                  result_feature_mask);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
      assert(fingerprint, "Fingerprint should not be 0");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
      fingerprint = fingerprint >> (static_feature_size + result_feature_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
      while ( 1 ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
        switch ( fingerprint & parameter_feature_mask ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
          case bool_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
            get_bool();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
          case char_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
            get_char();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
          case short_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
            get_short();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
          case byte_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
            get_byte();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
          case int_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
            get_int();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
          case obj_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
            get_object();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
          case long_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
            get_long();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
          case float_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
            get_float();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
          case double_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   949
            get_double();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   950
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
          case done_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
            return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   954
          default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   955
            ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   958
        fingerprint >>= parameter_feature_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   959
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
enum JNICallType {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
  JNI_STATIC,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
  JNI_VIRTUAL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
  JNI_NONVIRTUAL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
static methodHandle jni_resolve_interface_call(Handle recv, methodHandle method, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
  assert(!method.is_null() , "method should not be null");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
  KlassHandle recv_klass; // Default to NULL (use of ?: can confuse gcc)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
  if (recv.not_null()) recv_klass = KlassHandle(THREAD, recv->klass());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
  KlassHandle spec_klass (THREAD, method->method_holder());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
  symbolHandle name (THREAD, method->name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
  symbolHandle signature (THREAD, method->signature());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
  CallInfo info;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
  LinkResolver::resolve_interface_call(info, recv, recv_klass,  spec_klass, name, signature, KlassHandle(), false, true, CHECK_(methodHandle()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
  return info.selected_method();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
static methodHandle jni_resolve_virtual_call(Handle recv, methodHandle method, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
  assert(!method.is_null() , "method should not be null");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
  KlassHandle recv_klass; // Default to NULL (use of ?: can confuse gcc)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
  if (recv.not_null()) recv_klass = KlassHandle(THREAD, recv->klass());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
  KlassHandle spec_klass (THREAD, method->method_holder());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
  symbolHandle name (THREAD, method->name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
  symbolHandle signature (THREAD, method->signature());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
  CallInfo info;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
  LinkResolver::resolve_virtual_call(info, recv, recv_klass,  spec_klass, name, signature, KlassHandle(), false, true, CHECK_(methodHandle()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
  return info.selected_method();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
static void jni_invoke_static(JNIEnv *env, JavaValue* result, jobject receiver, JNICallType call_type, jmethodID method_id, JNI_ArgumentPusher *args, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
  methodHandle method(THREAD, JNIHandles::resolve_jmethod_id(method_id));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
  // Create object to hold arguments for the JavaCall, and associate it with
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
  // the jni parser
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
  int number_of_parameters = method->size_of_parameters();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
  JavaCallArguments java_args(number_of_parameters);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
  args->set_java_argument_object(&java_args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
  assert(method->is_static(), "method should be static");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
  // Fill out JavaCallArguments object
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
  args->iterate( Fingerprinter(THREAD, method).fingerprint() );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
  // Initialize result type
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
  result->set_type(args->get_ret_type());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
  // Invoke the method. Result is returned as oop.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
  JavaCalls::call(result, method, &java_args, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
  // Convert result
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
  if (result->get_type() == T_OBJECT || result->get_type() == T_ARRAY) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
    result->set_jobject(JNIHandles::make_local(env, (oop) result->get_jobject()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
static void jni_invoke_nonstatic(JNIEnv *env, JavaValue* result, jobject receiver, JNICallType call_type, jmethodID method_id, JNI_ArgumentPusher *args, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
  oop recv = JNIHandles::resolve(receiver);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
  if (recv == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
    THROW(vmSymbols::java_lang_NullPointerException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
  Handle h_recv(THREAD, recv);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
  int number_of_parameters;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
  methodOop selected_method;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
    methodOop m = JNIHandles::resolve_jmethod_id(method_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
    number_of_parameters = m->size_of_parameters();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
    klassOop holder = m->method_holder();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
    if (!(Klass::cast(holder))->is_interface()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
      // non-interface call -- for that little speed boost, don't handlize
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
      debug_only(No_Safepoint_Verifier nosafepoint;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
      if (call_type == JNI_VIRTUAL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
        // jni_GetMethodID makes sure class is linked and initialized
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
        // so m should have a valid vtable index.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
        int vtbl_index = m->vtable_index();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
        if (vtbl_index != methodOopDesc::nonvirtual_vtable_index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
          klassOop k = h_recv->klass();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
          // k might be an arrayKlassOop but all vtables start at
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
          // the same place. The cast is to avoid virtual call and assertion.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
          instanceKlass *ik = (instanceKlass*)k->klass_part();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
          selected_method = ik->method_at_vtable(vtbl_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
          // final method
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
          selected_method = m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
        // JNI_NONVIRTUAL call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
        selected_method = m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
      // interface call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
      KlassHandle h_holder(THREAD, holder);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
      int itbl_index = m->cached_itable_index();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
      if (itbl_index == -1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
        itbl_index = klassItable::compute_itable_index(m);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
        m->set_cached_itable_index(itbl_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
        // the above may have grabbed a lock, 'm' and anything non-handlized can't be used again
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
      klassOop k = h_recv->klass();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
      selected_method = instanceKlass::cast(k)->method_at_itable(h_holder(), itbl_index, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
  methodHandle method(THREAD, selected_method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
  // Create object to hold arguments for the JavaCall, and associate it with
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
  // the jni parser
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1080
  JavaCallArguments java_args(number_of_parameters);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
  args->set_java_argument_object(&java_args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1082
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
  // handle arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1084
  assert(!method->is_static(), "method should not be static");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
  args->push_receiver(h_recv); // Push jobject handle
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1086
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
  // Fill out JavaCallArguments object
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
  args->iterate( Fingerprinter(THREAD, method).fingerprint() );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1089
  // Initialize result type
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
  result->set_type(args->get_ret_type());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
  // Invoke the method. Result is returned as oop.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1093
  JavaCalls::call(result, method, &java_args, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
  // Convert result
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
  if (result->get_type() == T_OBJECT || result->get_type() == T_ARRAY) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
    result->set_jobject(JNIHandles::make_local(env, (oop) result->get_jobject()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
static instanceOop alloc_object(jclass clazz, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
  KlassHandle k(THREAD, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(clazz)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
  Klass::cast(k())->check_valid_for_instantiation(false, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
  instanceKlass::cast(k())->initialize(CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
  instanceOop ih = instanceKlass::cast(k())->allocate_instance(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
  return ih;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
DT_RETURN_MARK_DECL(AllocObject, jobject);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
JNI_ENTRY(jobject, jni_AllocObject(JNIEnv *env, jclass clazz))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
  JNIWrapper("AllocObject");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
  DTRACE_PROBE2(hotspot_jni, AllocObject__entry, env, clazz);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
  jobject ret = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
  DT_RETURN_MARK(AllocObject, jobject, (const jobject&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
  instanceOop i = alloc_object(clazz, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
  ret = JNIHandles::make_local(env, i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1122
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1123
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
DT_RETURN_MARK_DECL(NewObjectA, jobject);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
JNI_ENTRY(jobject, jni_NewObjectA(JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
  JNIWrapper("NewObjectA");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
  DTRACE_PROBE3(hotspot_jni, NewObjectA__entry, env, clazz, methodID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
  jobject obj = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
  DT_RETURN_MARK(NewObjectA, jobject, (const jobject)obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
  instanceOop i = alloc_object(clazz, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
  obj = JNIHandles::make_local(env, i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
  JavaValue jvalue(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
  JNI_ArgumentPusherArray ap(THREAD, methodID, args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1136
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
  return obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
DT_RETURN_MARK_DECL(NewObjectV, jobject);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
JNI_ENTRY(jobject, jni_NewObjectV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
  JNIWrapper("NewObjectV");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
  DTRACE_PROBE3(hotspot_jni, NewObjectV__entry, env, clazz, methodID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
  jobject obj = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
  DT_RETURN_MARK(NewObjectV, jobject, (const jobject&)obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1147
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1148
  instanceOop i = alloc_object(clazz, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1149
  obj = JNIHandles::make_local(env, i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
  JavaValue jvalue(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
  JNI_ArgumentPusherVaArg ap(THREAD, methodID, args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
  return obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1156
DT_RETURN_MARK_DECL(NewObject, jobject);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1157
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1158
JNI_ENTRY(jobject, jni_NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1159
  JNIWrapper("NewObject");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1160
  DTRACE_PROBE3(hotspot_jni, NewObject__entry, env, clazz, methodID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1161
  jobject obj = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1162
  DT_RETURN_MARK(NewObject, jobject, (const jobject&)obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1164
  instanceOop i = alloc_object(clazz, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1165
  obj = JNIHandles::make_local(env, i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1166
  va_list args;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
  va_start(args, methodID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
  JavaValue jvalue(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
  JNI_ArgumentPusherVaArg ap(THREAD, methodID, args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
  va_end(args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
  return obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
JNI_ENTRY(jclass, jni_GetObjectClass(JNIEnv *env, jobject obj))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
  JNIWrapper("GetObjectClass");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
  DTRACE_PROBE2(hotspot_jni, GetObjectClass__entry, env, obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
  klassOop k = JNIHandles::resolve_non_null(obj)->klass();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1180
  jclass ret =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1181
    (jclass) JNIHandles::make_local(env, Klass::cast(k)->java_mirror());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
  DTRACE_PROBE1(hotspot_jni, GetObjectClass__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
JNI_QUICK_ENTRY(jboolean, jni_IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
  JNIWrapper("IsInstanceOf");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1188
  DTRACE_PROBE3(hotspot_jni, IsInstanceOf__entry, env, obj, clazz);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
  jboolean ret = JNI_TRUE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1190
  if (obj != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
    ret = JNI_FALSE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
    klassOop k = java_lang_Class::as_klassOop(
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
      JNIHandles::resolve_non_null(clazz));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
    if (k != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
      ret = JNIHandles::resolve_non_null(obj)->is_a(k) ? JNI_TRUE : JNI_FALSE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1197
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
  DTRACE_PROBE1(hotspot_jni, IsInstanceOf__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1201
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1202
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1203
static jmethodID get_method_id(JNIEnv *env, jclass clazz, const char *name_str,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
                               const char *sig, bool is_static, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
  // %%%% This code should probably just call into a method in the LinkResolver
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
  // The class should have been loaded (we have an instance of the class
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1208
  // passed in) so the method and signature should already be in the symbol
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1209
  // table.  If they're not there, the method doesn't exist.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1210
  symbolHandle signature =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1211
           symbolHandle(THREAD, SymbolTable::probe(sig, (int)strlen(sig)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1212
  symbolHandle name;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1213
  if (name_str == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1214
    name = vmSymbolHandles::object_initializer_name();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1215
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1216
    name = symbolHandle(THREAD,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1217
                        SymbolTable::probe(name_str, (int)strlen(name_str)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1218
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1219
  if (name.is_null() || signature.is_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1220
    THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(), name_str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1221
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1222
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1223
  // Throw a NoSuchMethodError exception if we have an instance of a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1224
  // primitive java.lang.Class
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1225
  if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(clazz))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1226
    THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(), name_str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1227
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1228
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1229
  KlassHandle klass(THREAD,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1230
               java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(clazz)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1232
  // Make sure class is linked and initialized before handing id's out to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1233
  // methodOops.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1234
  Klass::cast(klass())->initialize(CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1235
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1236
  methodOop m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1237
  if (name() == vmSymbols::object_initializer_name() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1238
      name() == vmSymbols::class_initializer_name()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1239
    // Never search superclasses for constructors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1240
    if (klass->oop_is_instance()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1241
      m = instanceKlass::cast(klass())->find_method(name(), signature());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1242
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1243
      m = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1244
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1245
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1246
    m = klass->lookup_method(name(), signature());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1247
    // Look up interfaces
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1248
    if (m == NULL && klass->oop_is_instance()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1249
      m = instanceKlass::cast(klass())->lookup_method_in_all_interfaces(name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1250
                                                                   signature());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1251
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1252
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1253
  if (m == NULL || (m->is_static() != is_static)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1254
    THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(), name_str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1255
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1256
  return m->jmethod_id();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1257
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1258
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1259
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1260
JNI_ENTRY(jmethodID, jni_GetMethodID(JNIEnv *env, jclass clazz,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1261
          const char *name, const char *sig))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1262
  JNIWrapper("GetMethodID");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1263
  DTRACE_PROBE4(hotspot_jni, GetMethodID__entry, env, clazz, name, sig);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1264
  jmethodID ret = get_method_id(env, clazz, name, sig, false, thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1265
  DTRACE_PROBE1(hotspot_jni, GetMethodID__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1266
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1267
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1268
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1269
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1270
JNI_ENTRY(jmethodID, jni_GetStaticMethodID(JNIEnv *env, jclass clazz,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1271
          const char *name, const char *sig))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1272
  JNIWrapper("GetStaticMethodID");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1273
  DTRACE_PROBE4(hotspot_jni, GetStaticMethodID__entry, env, clazz, name, sig);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1274
  jmethodID ret = get_method_id(env, clazz, name, sig, true, thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1275
  DTRACE_PROBE1(hotspot_jni, GetStaticMethodID__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1276
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1277
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1278
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1279
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1280
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1281
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1282
// Calling Methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1283
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1284
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1285
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1286
#define DEFINE_CALLMETHOD(ResultType, Result, Tag) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1287
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1288
  DT_RETURN_MARK_DECL_FOR(Result, Call##Result##Method, ResultType);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1289
  DT_RETURN_MARK_DECL_FOR(Result, Call##Result##MethodV, ResultType);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1290
  DT_RETURN_MARK_DECL_FOR(Result, Call##Result##MethodA, ResultType);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1291
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1292
JNI_ENTRY(ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1293
          jni_Call##Result##Method(JNIEnv *env, jobject obj, jmethodID methodID, ...)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1294
  JNIWrapper("Call" XSTR(Result) "Method"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1295
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1296
  DTRACE_PROBE3(hotspot_jni, Call##Result##Method__entry, env, obj, methodID);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1297
  ResultType ret = 0;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1298
  DT_RETURN_MARK_FOR(Result, Call##Result##Method, ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1299
                     (const ResultType&)ret);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1300
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1301
  va_list args; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1302
  va_start(args, methodID); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1303
  JavaValue jvalue(Tag); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1304
  JNI_ArgumentPusherVaArg ap(THREAD, methodID, args); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1305
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1306
  va_end(args); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1307
  ret = jvalue.get_##ResultType(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1308
  return ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1309
JNI_END \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1310
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1311
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1312
JNI_ENTRY(ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1313
          jni_Call##Result##MethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1314
  JNIWrapper("Call" XSTR(Result) "MethodV"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1315
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1316
  DTRACE_PROBE3(hotspot_jni, Call##Result##MethodV__entry, env, obj, methodID);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1317
  ResultType ret = 0;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1318
  DT_RETURN_MARK_FOR(Result, Call##Result##MethodV, ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1319
                     (const ResultType&)ret);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1320
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1321
  JavaValue jvalue(Tag); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1322
  JNI_ArgumentPusherVaArg ap(THREAD, methodID, args); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1323
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1324
  ret = jvalue.get_##ResultType(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1325
  return ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1326
JNI_END \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1327
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1328
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1329
JNI_ENTRY(ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1330
          jni_Call##Result##MethodA(JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1331
  JNIWrapper("Call" XSTR(Result) "MethodA"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1332
  DTRACE_PROBE3(hotspot_jni, Call##Result##MethodA__entry, env, obj, methodID);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1333
  ResultType ret = 0;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1334
  DT_RETURN_MARK_FOR(Result, Call##Result##MethodA, ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1335
                     (const ResultType&)ret);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1336
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1337
  JavaValue jvalue(Tag); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1338
  JNI_ArgumentPusherArray ap(THREAD, methodID, args); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1339
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1340
  ret = jvalue.get_##ResultType(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1341
  return ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1342
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1343
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1344
// the runtime type of subword integral basic types is integer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1345
DEFINE_CALLMETHOD(jboolean, Boolean, T_BOOLEAN)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1346
DEFINE_CALLMETHOD(jbyte,    Byte,    T_BYTE)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1347
DEFINE_CALLMETHOD(jchar,    Char,    T_CHAR)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1348
DEFINE_CALLMETHOD(jshort,   Short,   T_SHORT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1349
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1350
DEFINE_CALLMETHOD(jobject,  Object,  T_OBJECT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1351
DEFINE_CALLMETHOD(jint,     Int,     T_INT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1352
DEFINE_CALLMETHOD(jlong,    Long,    T_LONG)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1353
DEFINE_CALLMETHOD(jfloat,   Float,   T_FLOAT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1354
DEFINE_CALLMETHOD(jdouble,  Double,  T_DOUBLE)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1355
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1356
DT_VOID_RETURN_MARK_DECL(CallVoidMethod);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1357
DT_VOID_RETURN_MARK_DECL(CallVoidMethodV);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1358
DT_VOID_RETURN_MARK_DECL(CallVoidMethodA);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1359
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1360
JNI_ENTRY(void, jni_CallVoidMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1361
  JNIWrapper("CallVoidMethod");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1362
  DTRACE_PROBE3(hotspot_jni, CallVoidMethod__entry, env, obj, methodID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1363
  DT_VOID_RETURN_MARK(CallVoidMethod);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1364
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1365
  va_list args;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1366
  va_start(args, methodID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1367
  JavaValue jvalue(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1368
  JNI_ArgumentPusherVaArg ap(THREAD, methodID, args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1369
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1370
  va_end(args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1371
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1372
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1373
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1374
JNI_ENTRY(void, jni_CallVoidMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1375
  JNIWrapper("CallVoidMethodV");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1376
  DTRACE_PROBE3(hotspot_jni, CallVoidMethodV__entry, env, obj, methodID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1377
  DT_VOID_RETURN_MARK(CallVoidMethodV);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1378
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1379
  JavaValue jvalue(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1380
  JNI_ArgumentPusherVaArg ap(THREAD, methodID, args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1381
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1382
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1383
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1384
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1385
JNI_ENTRY(void, jni_CallVoidMethodA(JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1386
  JNIWrapper("CallVoidMethodA");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1387
  DTRACE_PROBE3(hotspot_jni, CallVoidMethodA__entry, env, obj, methodID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1388
  DT_VOID_RETURN_MARK(CallVoidMethodA);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1389
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1390
  JavaValue jvalue(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1391
  JNI_ArgumentPusherArray ap(THREAD, methodID, args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1392
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1393
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1394
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1395
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1396
#define DEFINE_CALLNONVIRTUALMETHOD(ResultType, Result, Tag) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1397
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1398
  DT_RETURN_MARK_DECL_FOR(Result, CallNonvirtual##Result##Method, ResultType);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1399
  DT_RETURN_MARK_DECL_FOR(Result, CallNonvirtual##Result##MethodV, ResultType);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1400
  DT_RETURN_MARK_DECL_FOR(Result, CallNonvirtual##Result##MethodA, ResultType);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1401
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1402
JNI_ENTRY(ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1403
          jni_CallNonvirtual##Result##Method(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, ...)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1404
  JNIWrapper("CallNonvitual" XSTR(Result) "Method"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1405
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1406
  DTRACE_PROBE4(hotspot_jni, CallNonvirtual##Result##Method__entry, env, obj, cls, methodID);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1407
  ResultType ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1408
  DT_RETURN_MARK_FOR(Result, CallNonvirtual##Result##Method, ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1409
                     (const ResultType&)ret);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1410
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1411
  va_list args; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1412
  va_start(args, methodID); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1413
  JavaValue jvalue(Tag); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1414
  JNI_ArgumentPusherVaArg ap(THREAD, methodID, args); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1415
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1416
  va_end(args); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1417
  ret = jvalue.get_##ResultType(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1418
  return ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1419
JNI_END \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1420
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1421
JNI_ENTRY(ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1422
          jni_CallNonvirtual##Result##MethodV(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, va_list args)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1423
  JNIWrapper("CallNonvitual" XSTR(Result) "#MethodV"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1424
  DTRACE_PROBE4(hotspot_jni, CallNonvirtual##Result##MethodV__entry, env, obj, cls, methodID);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1425
  ResultType ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1426
  DT_RETURN_MARK_FOR(Result, CallNonvirtual##Result##MethodV, ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1427
                     (const ResultType&)ret);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1428
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1429
  JavaValue jvalue(Tag); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1430
  JNI_ArgumentPusherVaArg ap(THREAD, methodID, args); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1431
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1432
  ret = jvalue.get_##ResultType(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1433
  return ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1434
JNI_END \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1435
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1436
JNI_ENTRY(ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1437
          jni_CallNonvirtual##Result##MethodA(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, const jvalue *args)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1438
  JNIWrapper("CallNonvitual" XSTR(Result) "MethodA"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1439
  DTRACE_PROBE4(hotspot_jni, CallNonvirtual##Result##MethodA__entry, env, obj, cls, methodID);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1440
  ResultType ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1441
  DT_RETURN_MARK_FOR(Result, CallNonvirtual##Result##MethodA, ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1442
                     (const ResultType&)ret);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1443
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1444
  JavaValue jvalue(Tag); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1445
  JNI_ArgumentPusherArray ap(THREAD, methodID, args); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1446
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1447
  ret = jvalue.get_##ResultType(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1448
  return ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1449
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1450
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1451
// the runtime type of subword integral basic types is integer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1452
DEFINE_CALLNONVIRTUALMETHOD(jboolean, Boolean, T_BOOLEAN)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1453
DEFINE_CALLNONVIRTUALMETHOD(jbyte,    Byte,    T_BYTE)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1454
DEFINE_CALLNONVIRTUALMETHOD(jchar,    Char,    T_CHAR)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1455
DEFINE_CALLNONVIRTUALMETHOD(jshort,   Short,   T_SHORT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1456
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1457
DEFINE_CALLNONVIRTUALMETHOD(jobject,  Object,  T_OBJECT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1458
DEFINE_CALLNONVIRTUALMETHOD(jint,     Int,     T_INT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1459
DEFINE_CALLNONVIRTUALMETHOD(jlong,    Long,    T_LONG)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1460
DEFINE_CALLNONVIRTUALMETHOD(jfloat,   Float,   T_FLOAT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1461
DEFINE_CALLNONVIRTUALMETHOD(jdouble,  Double,  T_DOUBLE)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1462
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1463
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1464
DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethod);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1465
DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethodV);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1466
DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethodA);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1467
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1468
JNI_ENTRY(void, jni_CallNonvirtualVoidMethod(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, ...))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1469
  JNIWrapper("CallNonvirtualVoidMethod");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1470
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1471
  DTRACE_PROBE4(hotspot_jni, CallNonvirtualVoidMethod__entry,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1472
               env, obj, cls, methodID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1473
  DT_VOID_RETURN_MARK(CallNonvirtualVoidMethod);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1474
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1475
  va_list args;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1476
  va_start(args, methodID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1477
  JavaValue jvalue(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1478
  JNI_ArgumentPusherVaArg ap(THREAD, methodID, args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1479
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1480
  va_end(args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1481
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1482
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1483
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1484
JNI_ENTRY(void, jni_CallNonvirtualVoidMethodV(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, va_list args))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1485
  JNIWrapper("CallNonvirtualVoidMethodV");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1486
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1487
  DTRACE_PROBE4(hotspot_jni, CallNonvirtualVoidMethodV__entry,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1488
               env, obj, cls, methodID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1489
  DT_VOID_RETURN_MARK(CallNonvirtualVoidMethodV);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1490
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1491
  JavaValue jvalue(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1492
  JNI_ArgumentPusherVaArg ap(THREAD, methodID, args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1493
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1494
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1495
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1496
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1497
JNI_ENTRY(void, jni_CallNonvirtualVoidMethodA(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, const jvalue *args))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1498
  JNIWrapper("CallNonvirtualVoidMethodA");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1499
  DTRACE_PROBE4(hotspot_jni, CallNonvirtualVoidMethodA__entry,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1500
                env, obj, cls, methodID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1501
  DT_VOID_RETURN_MARK(CallNonvirtualVoidMethodA);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1502
  JavaValue jvalue(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1503
  JNI_ArgumentPusherArray ap(THREAD, methodID, args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1504
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1505
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1506
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1507
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1508
#define DEFINE_CALLSTATICMETHOD(ResultType, Result, Tag) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1509
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1510
  DT_RETURN_MARK_DECL_FOR(Result, CallStatic##Result##Method, ResultType);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1511
  DT_RETURN_MARK_DECL_FOR(Result, CallStatic##Result##MethodV, ResultType);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1512
  DT_RETURN_MARK_DECL_FOR(Result, CallStatic##Result##MethodA, ResultType);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1513
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1514
JNI_ENTRY(ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1515
          jni_CallStatic##Result##Method(JNIEnv *env, jclass cls, jmethodID methodID, ...)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1516
  JNIWrapper("CallStatic" XSTR(Result) "Method"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1517
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1518
  DTRACE_PROBE3(hotspot_jni, CallStatic##Result##Method__entry, env, cls, methodID);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1519
  ResultType ret = 0;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1520
  DT_RETURN_MARK_FOR(Result, CallStatic##Result##Method, ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1521
                     (const ResultType&)ret);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1522
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1523
  va_list args; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1524
  va_start(args, methodID); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1525
  JavaValue jvalue(Tag); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1526
  JNI_ArgumentPusherVaArg ap(THREAD, methodID, args); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1527
  jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1528
  va_end(args); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1529
  ret = jvalue.get_##ResultType(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1530
  return ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1531
JNI_END \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1532
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1533
JNI_ENTRY(ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1534
          jni_CallStatic##Result##MethodV(JNIEnv *env, jclass cls, jmethodID methodID, va_list args)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1535
  JNIWrapper("CallStatic" XSTR(Result) "MethodV"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1536
  DTRACE_PROBE3(hotspot_jni, CallStatic##Result##MethodV__entry, env, cls, methodID);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1537
  ResultType ret = 0;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1538
  DT_RETURN_MARK_FOR(Result, CallStatic##Result##MethodV, ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1539
                     (const ResultType&)ret);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1540
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1541
  JavaValue jvalue(Tag); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1542
  JNI_ArgumentPusherVaArg ap(THREAD, methodID, args); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1543
  jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1544
  ret = jvalue.get_##ResultType(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1545
  return ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1546
JNI_END \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1547
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1548
JNI_ENTRY(ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1549
          jni_CallStatic##Result##MethodA(JNIEnv *env, jclass cls, jmethodID methodID, const jvalue *args)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1550
  JNIWrapper("CallStatic" XSTR(Result) "MethodA"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1551
  DTRACE_PROBE3(hotspot_jni, CallStatic##Result##MethodA__entry, env, cls, methodID);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1552
  ResultType ret = 0;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1553
  DT_RETURN_MARK_FOR(Result, CallStatic##Result##MethodA, ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1554
                     (const ResultType&)ret);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1555
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1556
  JavaValue jvalue(Tag); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1557
  JNI_ArgumentPusherArray ap(THREAD, methodID, args); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1558
  jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1559
  ret = jvalue.get_##ResultType(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1560
  return ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1561
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1562
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1563
// the runtime type of subword integral basic types is integer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1564
DEFINE_CALLSTATICMETHOD(jboolean, Boolean, T_BOOLEAN)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1565
DEFINE_CALLSTATICMETHOD(jbyte,    Byte,    T_BYTE)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1566
DEFINE_CALLSTATICMETHOD(jchar,    Char,    T_CHAR)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1567
DEFINE_CALLSTATICMETHOD(jshort,   Short,   T_SHORT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1568
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1569
DEFINE_CALLSTATICMETHOD(jobject,  Object,  T_OBJECT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1570
DEFINE_CALLSTATICMETHOD(jint,     Int,     T_INT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1571
DEFINE_CALLSTATICMETHOD(jlong,    Long,    T_LONG)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1572
DEFINE_CALLSTATICMETHOD(jfloat,   Float,   T_FLOAT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1573
DEFINE_CALLSTATICMETHOD(jdouble,  Double,  T_DOUBLE)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1574
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1575
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1576
DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethod);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1577
DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethodV);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1578
DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethodA);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1579
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1580
JNI_ENTRY(void, jni_CallStaticVoidMethod(JNIEnv *env, jclass cls, jmethodID methodID, ...))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1581
  JNIWrapper("CallStaticVoidMethod");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1582
  DTRACE_PROBE3(hotspot_jni, CallStaticVoidMethod__entry, env, cls, methodID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1583
  DT_VOID_RETURN_MARK(CallStaticVoidMethod);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1584
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1585
  va_list args;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1586
  va_start(args, methodID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1587
  JavaValue jvalue(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1588
  JNI_ArgumentPusherVaArg ap(THREAD, methodID, args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1589
  jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1590
  va_end(args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1591
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1592
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1593
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1594
JNI_ENTRY(void, jni_CallStaticVoidMethodV(JNIEnv *env, jclass cls, jmethodID methodID, va_list args))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1595
  JNIWrapper("CallStaticVoidMethodV");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1596
  DTRACE_PROBE3(hotspot_jni, CallStaticVoidMethodV__entry, env, cls, methodID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1597
  DT_VOID_RETURN_MARK(CallStaticVoidMethodV);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1598
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1599
  JavaValue jvalue(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1600
  JNI_ArgumentPusherVaArg ap(THREAD, methodID, args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1601
  jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1602
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1603
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1604
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1605
JNI_ENTRY(void, jni_CallStaticVoidMethodA(JNIEnv *env, jclass cls, jmethodID methodID, const jvalue *args))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1606
  JNIWrapper("CallStaticVoidMethodA");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1607
  DTRACE_PROBE3(hotspot_jni, CallStaticVoidMethodA__entry, env, cls, methodID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1608
  DT_VOID_RETURN_MARK(CallStaticVoidMethodA);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1609
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1610
  JavaValue jvalue(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1611
  JNI_ArgumentPusherArray ap(THREAD, methodID, args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1612
  jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1613
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1614
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1615
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1616
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1617
// Accessing Fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1618
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1619
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1620
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1621
DT_RETURN_MARK_DECL(GetFieldID, jfieldID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1622
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1623
JNI_ENTRY(jfieldID, jni_GetFieldID(JNIEnv *env, jclass clazz,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1624
          const char *name, const char *sig))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1625
  JNIWrapper("GetFieldID");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1626
  DTRACE_PROBE4(hotspot_jni, GetFieldID__entry, env, clazz, name, sig);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1627
  jfieldID ret = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1628
  DT_RETURN_MARK(GetFieldID, jfieldID, (const jfieldID&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1629
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1630
  // The class should have been loaded (we have an instance of the class
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1631
  // passed in) so the field and signature should already be in the symbol
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1632
  // table.  If they're not there, the field doesn't exist.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1633
  symbolHandle fieldname =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1634
            symbolHandle(THREAD, SymbolTable::probe(name, (int)strlen(name)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1635
  symbolHandle signame   =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1636
            symbolHandle(THREAD, SymbolTable::probe(sig, (int)strlen(sig)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1637
  if (fieldname.is_null() || signame.is_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1638
    THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1639
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1640
  KlassHandle k(THREAD,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1641
                java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(clazz)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1642
  // Make sure class is initialized before handing id's out to fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1643
  Klass::cast(k())->initialize(CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1644
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1645
  fieldDescriptor fd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1646
  if (!Klass::cast(k())->oop_is_instance() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1647
      !instanceKlass::cast(k())->find_field(fieldname(), signame(), false, &fd)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1648
    THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1649
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1650
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1651
  // A jfieldID for a non-static field is simply the offset of the field within the instanceOop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1652
  // It may also have hash bits for k, if VerifyJNIFields is turned on.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1653
  ret = jfieldIDWorkaround::to_instance_jfieldID(k(), fd.offset());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1654
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1655
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1656
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1657
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1658
JNI_ENTRY(jobject, jni_GetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1659
  JNIWrapper("GetObjectField");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1660
  DTRACE_PROBE3(hotspot_jni, GetObjectField__entry, env, obj, fieldID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1661
  oop o = JNIHandles::resolve_non_null(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1662
  klassOop k = o->klass();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1663
  int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1664
  // Keep JVMTI addition small and only check enabled flag here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1665
  // jni_GetField_probe() assumes that is okay to create handles.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1666
  if (JvmtiExport::should_post_field_access()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1667
    o = JvmtiExport::jni_GetField_probe(thread, obj, o, k, fieldID, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1668
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1669
  jobject ret = JNIHandles::make_local(env, o->obj_field(offset));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1670
  DTRACE_PROBE1(hotspot_jni, GetObjectField__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1671
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1672
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1673
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1674
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1675
#define DEFINE_GETFIELD(Return,Fieldname,Result) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1676
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1677
  DT_RETURN_MARK_DECL_FOR(Result, Get##Result##Field, Return);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1678
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1679
JNI_QUICK_ENTRY(Return, jni_Get##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1680
  JNIWrapper("Get" XSTR(Result) "Field"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1681
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1682
  DTRACE_PROBE3(hotspot_jni, Get##Result##Field__entry, env, obj, fieldID);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1683
  Return ret = 0;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1684
  DT_RETURN_MARK_FOR(Result, Get##Result##Field, Return, (const Return&)ret);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1685
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1686
  oop o = JNIHandles::resolve_non_null(obj); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1687
  klassOop k = o->klass(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1688
  int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);  \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1689
  /* Keep JVMTI addition small and only check enabled flag here.       */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1690
  /* jni_GetField_probe_nh() assumes that is not okay to create handles */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1691
  /* and creates a ResetNoHandleMark.                                   */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1692
  if (JvmtiExport::should_post_field_access()) { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1693
    o = JvmtiExport::jni_GetField_probe_nh(thread, obj, o, k, fieldID, false); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1694
  } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1695
  ret = o->Fieldname##_field(offset); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1696
  return ret; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1697
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1698
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1699
DEFINE_GETFIELD(jboolean, bool,   Boolean)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1700
DEFINE_GETFIELD(jbyte,    byte,   Byte)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1701
DEFINE_GETFIELD(jchar,    char,   Char)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1702
DEFINE_GETFIELD(jshort,   short,  Short)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1703
DEFINE_GETFIELD(jint,     int,    Int)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1704
DEFINE_GETFIELD(jlong,    long,   Long)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1705
DEFINE_GETFIELD(jfloat,   float,  Float)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1706
DEFINE_GETFIELD(jdouble,  double, Double)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1707
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1708
address jni_GetBooleanField_addr() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1709
  return (address)jni_GetBooleanField;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1710
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1711
address jni_GetByteField_addr() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1712
  return (address)jni_GetByteField;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1713
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1714
address jni_GetCharField_addr() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1715
  return (address)jni_GetCharField;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1716
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1717
address jni_GetShortField_addr() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1718
  return (address)jni_GetShortField;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1719
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1720
address jni_GetIntField_addr() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1721
  return (address)jni_GetIntField;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1722
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1723
address jni_GetLongField_addr() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1724
  return (address)jni_GetLongField;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1725
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1726
address jni_GetFloatField_addr() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1727
  return (address)jni_GetFloatField;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1728
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1729
address jni_GetDoubleField_addr() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1730
  return (address)jni_GetDoubleField;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1731
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1732
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1733
JNI_QUICK_ENTRY(void, jni_SetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID, jobject value))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1734
  JNIWrapper("SetObjectField");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1735
  DTRACE_PROBE4(hotspot_jni, SetObjectField__entry, env, obj, fieldID, value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1736
  oop o = JNIHandles::resolve_non_null(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1737
  klassOop k = o->klass();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1738
  int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1739
  // Keep JVMTI addition small and only check enabled flag here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1740
  // jni_SetField_probe_nh() assumes that is not okay to create handles
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1741
  // and creates a ResetNoHandleMark.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1742
  if (JvmtiExport::should_post_field_modification()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1743
    jvalue field_value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1744
    field_value.l = value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1745
    o = JvmtiExport::jni_SetField_probe_nh(thread, obj, o, k, fieldID, false, 'L', (jvalue *)&field_value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1746
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1747
  o->obj_field_put(offset, JNIHandles::resolve(value));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1748
  DTRACE_PROBE(hotspot_jni, SetObjectField__return);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1749
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1750
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1751
#define DEFINE_SETFIELD(Argument,Fieldname,Result,SigType,unionType) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1752
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1753
JNI_QUICK_ENTRY(void, jni_Set##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID, Argument value)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1754
  JNIWrapper("Set" XSTR(Result) "Field"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1755
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1756
  HS_DTRACE_PROBE_CDECL_N(hotspot_jni, Set##Result##Field__entry, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1757
    ( JNIEnv*, jobject, jfieldID FP_SELECT_##Result(COMMA Argument,/*empty*/) ) ); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1758
  HS_DTRACE_PROBE_N(hotspot_jni, Set##Result##Field__entry, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1759
    ( env, obj, fieldID FP_SELECT_##Result(COMMA value,/*empty*/) ) ); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1760
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1761
  oop o = JNIHandles::resolve_non_null(obj); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1762
  klassOop k = o->klass(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1763
  int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);  \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1764
  /* Keep JVMTI addition small and only check enabled flag here.       */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1765
  /* jni_SetField_probe_nh() assumes that is not okay to create handles */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1766
  /* and creates a ResetNoHandleMark.                                   */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1767
  if (JvmtiExport::should_post_field_modification()) { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1768
    jvalue field_value; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1769
    field_value.unionType = value; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1770
    o = JvmtiExport::jni_SetField_probe_nh(thread, obj, o, k, fieldID, false, SigType, (jvalue *)&field_value); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1771
  } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1772
  o->Fieldname##_field_put(offset, value); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1773
  DTRACE_PROBE(hotspot_jni, Set##Result##Field__return);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1774
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1775
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1776
DEFINE_SETFIELD(jboolean, bool,   Boolean, 'Z', z)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1777
DEFINE_SETFIELD(jbyte,    byte,   Byte,    'B', b)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1778
DEFINE_SETFIELD(jchar,    char,   Char,    'C', c)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1779
DEFINE_SETFIELD(jshort,   short,  Short,   'S', s)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1780
DEFINE_SETFIELD(jint,     int,    Int,     'I', i)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1781
DEFINE_SETFIELD(jlong,    long,   Long,    'J', j)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1782
DEFINE_SETFIELD(jfloat,   float,  Float,   'F', f)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1783
DEFINE_SETFIELD(jdouble,  double, Double,  'D', d)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1784
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1785
DT_RETURN_MARK_DECL(ToReflectedField, jobject);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1786
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1787
JNI_ENTRY(jobject, jni_ToReflectedField(JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1788
  JNIWrapper("ToReflectedField");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1789
  DTRACE_PROBE4(hotspot_jni, ToReflectedField__entry,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1790
                env, cls, fieldID, isStatic);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1791
  jobject ret = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1792
  DT_RETURN_MARK(ToReflectedField, jobject, (const jobject&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1793
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1794
  fieldDescriptor fd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1795
  bool found = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1796
  klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1797
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1798
  assert(jfieldIDWorkaround::is_static_jfieldID(fieldID) == (isStatic != 0), "invalid fieldID");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1799
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1800
  if (isStatic) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1801
    // Static field. The fieldID a JNIid specifying the field holder and the offset within the klassOop.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1802
    JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1803
    assert(id->is_static_field_id(), "invalid static field id");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1804
    found = instanceKlass::cast(id->holder())->find_local_field_from_offset(id->offset(), true, &fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1805
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1806
    // Non-static field. The fieldID is really the offset of the field within the instanceOop.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1807
    int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1808
    found = instanceKlass::cast(k)->find_field_from_offset(offset, false, &fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1809
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1810
  assert(found, "bad fieldID passed into jni_ToReflectedField");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1811
  oop reflected = Reflection::new_field(&fd, UseNewReflection, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1812
  ret = JNIHandles::make_local(env, reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1813
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1814
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1815
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1816
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1817
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1818
// Accessing Static Fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1819
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1820
DT_RETURN_MARK_DECL(GetStaticFieldID, jfieldID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1821
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1822
JNI_ENTRY(jfieldID, jni_GetStaticFieldID(JNIEnv *env, jclass clazz,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1823
          const char *name, const char *sig))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1824
  JNIWrapper("GetStaticFieldID");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1825
  DTRACE_PROBE4(hotspot_jni, GetStaticFieldID__entry, env, clazz, name, sig);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1826
  jfieldID ret = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1827
  DT_RETURN_MARK(GetStaticFieldID, jfieldID, (const jfieldID&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1828
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1829
  // The class should have been loaded (we have an instance of the class
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1830
  // passed in) so the field and signature should already be in the symbol
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1831
  // table.  If they're not there, the field doesn't exist.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1832
  symbolHandle fieldname =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1833
           symbolHandle(THREAD, SymbolTable::probe(name, (int)strlen(name)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1834
  symbolHandle signame   =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1835
           symbolHandle(THREAD, SymbolTable::probe(sig, (int)strlen(sig)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1836
  if (fieldname.is_null() || signame.is_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1837
    THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1838
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1839
  KlassHandle k(THREAD,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1840
                java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(clazz)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1841
  // Make sure class is initialized before handing id's out to static fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1842
  Klass::cast(k())->initialize(CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1843
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1844
  fieldDescriptor fd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1845
  if (!Klass::cast(k())->oop_is_instance() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1846
      !instanceKlass::cast(k())->find_field(fieldname(), signame(), true, &fd)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1847
    THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1848
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1849
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1850
  // A jfieldID for a static field is a JNIid specifying the field holder and the offset within the klassOop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1851
  JNIid* id = instanceKlass::cast(fd.field_holder())->jni_id_for(fd.offset());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1852
  debug_only(id->set_is_static_field_id();)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1853
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1854
  debug_only(int first_offset = instanceKlass::cast(fd.field_holder())->offset_of_static_fields();)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1855
  debug_only(int end_offset = first_offset + (instanceKlass::cast(fd.field_holder())->static_field_size() * wordSize);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1856
  assert(id->offset() >= first_offset && id->offset() < end_offset, "invalid static field offset");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1857
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1858
  ret = jfieldIDWorkaround::to_static_jfieldID(id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1859
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1860
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1861
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1862
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1863
JNI_ENTRY(jobject, jni_GetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1864
  JNIWrapper("GetStaticObjectField");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1865
  DTRACE_PROBE3(hotspot_jni, GetStaticObjectField__entry, env, clazz, fieldID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1866
#ifndef JNICHECK_KERNEL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1867
  DEBUG_ONLY(klassOop param_k = jniCheck::validate_class(thread, clazz);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1868
#endif // JNICHECK_KERNEL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1869
  JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1870
  assert(id->is_static_field_id(), "invalid static field id");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1871
  // Keep JVMTI addition small and only check enabled flag here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1872
  // jni_GetField_probe() assumes that is okay to create handles.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1873
  if (JvmtiExport::should_post_field_access()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1874
    JvmtiExport::jni_GetField_probe(thread, NULL, NULL, id->holder(), fieldID, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1875
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1876
  jobject ret = JNIHandles::make_local(id->holder()->obj_field(id->offset()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1877
  DTRACE_PROBE1(hotspot_jni, GetStaticObjectField__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1878
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1879
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1880
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1881
#define DEFINE_GETSTATICFIELD(Return,Fieldname,Result) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1882
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1883
  DT_RETURN_MARK_DECL_FOR(Result, GetStatic##Result##Field, Return);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1884
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1885
JNI_ENTRY(Return, jni_GetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1886
  JNIWrapper("GetStatic" XSTR(Result) "Field"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1887
  DTRACE_PROBE3(hotspot_jni, GetStatic##Result##Field__entry, env, clazz, fieldID);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1888
  Return ret = 0;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1889
  DT_RETURN_MARK_FOR(Result, GetStatic##Result##Field, Return, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1890
                     (const Return&)ret);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1891
  JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1892
  assert(id->is_static_field_id(), "invalid static field id"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1893
  /* Keep JVMTI addition small and only check enabled flag here. */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1894
  /* jni_GetField_probe() assumes that is okay to create handles. */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1895
  if (JvmtiExport::should_post_field_access()) { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1896
    JvmtiExport::jni_GetField_probe(thread, NULL, NULL, id->holder(), fieldID, true); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1897
  } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1898
  ret = id->holder()-> Fieldname##_field (id->offset()); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1899
  return ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1900
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1901
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1902
DEFINE_GETSTATICFIELD(jboolean, bool,   Boolean)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1903
DEFINE_GETSTATICFIELD(jbyte,    byte,   Byte)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1904
DEFINE_GETSTATICFIELD(jchar,    char,   Char)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1905
DEFINE_GETSTATICFIELD(jshort,   short,  Short)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1906
DEFINE_GETSTATICFIELD(jint,     int,    Int)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1907
DEFINE_GETSTATICFIELD(jlong,    long,   Long)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1908
DEFINE_GETSTATICFIELD(jfloat,   float,  Float)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1909
DEFINE_GETSTATICFIELD(jdouble,  double, Double)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1910
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1911
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1912
JNI_ENTRY(void, jni_SetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1913
  JNIWrapper("SetStaticObjectField");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1914
  DTRACE_PROBE4(hotspot_jni, SetStaticObjectField__entry, env, clazz, fieldID, value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1915
  JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1916
  assert(id->is_static_field_id(), "invalid static field id");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1917
  // Keep JVMTI addition small and only check enabled flag here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1918
  // jni_SetField_probe() assumes that is okay to create handles.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1919
  if (JvmtiExport::should_post_field_modification()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1920
    jvalue field_value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1921
    field_value.l = value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1922
    JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, 'L', (jvalue *)&field_value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1923
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1924
  id->holder()->obj_field_put(id->offset(), JNIHandles::resolve(value));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1925
  DTRACE_PROBE(hotspot_jni, SetStaticObjectField__return);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1926
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1927
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1928
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1929
#define DEFINE_SETSTATICFIELD(Argument,Fieldname,Result,SigType,unionType) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1930
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1931
JNI_ENTRY(void, jni_SetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID, Argument value)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1932
  JNIWrapper("SetStatic" XSTR(Result) "Field"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1933
  HS_DTRACE_PROBE_CDECL_N(hotspot_jni, SetStatic##Result##Field__entry,\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1934
    ( JNIEnv*, jclass, jfieldID FP_SELECT_##Result(COMMA Argument,/*empty*/) ) ); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1935
  HS_DTRACE_PROBE_N(hotspot_jni, SetStatic##Result##Field__entry, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1936
    ( env, clazz, fieldID FP_SELECT_##Result(COMMA value,/*empty*/) ) ); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1937
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1938
  JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1939
  assert(id->is_static_field_id(), "invalid static field id"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1940
  /* Keep JVMTI addition small and only check enabled flag here. */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1941
  /* jni_SetField_probe() assumes that is okay to create handles. */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1942
  if (JvmtiExport::should_post_field_modification()) { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1943
    jvalue field_value; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1944
    field_value.unionType = value; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1945
    JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, SigType, (jvalue *)&field_value); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1946
  } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1947
  id->holder()-> Fieldname##_field_put (id->offset(), value); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1948
  DTRACE_PROBE(hotspot_jni, SetStatic##Result##Field__return);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1949
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1950
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1951
DEFINE_SETSTATICFIELD(jboolean, bool,   Boolean, 'Z', z)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1952
DEFINE_SETSTATICFIELD(jbyte,    byte,   Byte,    'B', b)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1953
DEFINE_SETSTATICFIELD(jchar,    char,   Char,    'C', c)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1954
DEFINE_SETSTATICFIELD(jshort,   short,  Short,   'S', s)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1955
DEFINE_SETSTATICFIELD(jint,     int,    Int,     'I', i)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1956
DEFINE_SETSTATICFIELD(jlong,    long,   Long,    'J', j)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1957
DEFINE_SETSTATICFIELD(jfloat,   float,  Float,   'F', f)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1958
DEFINE_SETSTATICFIELD(jdouble,  double, Double,  'D', d)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1959
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1960
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1961
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1962
// String Operations
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1963
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1964
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1965
// Unicode Interface
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1966
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1967
DT_RETURN_MARK_DECL(NewString, jstring);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1968
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1969
JNI_ENTRY(jstring, jni_NewString(JNIEnv *env, const jchar *unicodeChars, jsize len))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1970
  JNIWrapper("NewString");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1971
  DTRACE_PROBE3(hotspot_jni, NewString__entry, env, unicodeChars, len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1972
  jstring ret = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1973
  DT_RETURN_MARK(NewString, jstring, (const jstring&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1974
  oop string=java_lang_String::create_oop_from_unicode((jchar*) unicodeChars, len, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1975
  ret = (jstring) JNIHandles::make_local(env, string);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1976
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1977
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1978
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1979
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1980
JNI_QUICK_ENTRY(jsize, jni_GetStringLength(JNIEnv *env, jstring string))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1981
  JNIWrapper("GetStringLength");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1982
  DTRACE_PROBE2(hotspot_jni, GetStringLength__entry, env, string);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1983
  jsize ret = java_lang_String::length(JNIHandles::resolve_non_null(string));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1984
  DTRACE_PROBE1(hotspot_jni, GetStringLength__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1985
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1986
JNI_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
JNI_QUICK_ENTRY(const jchar*, jni_GetStringChars(
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1990
  JNIEnv *env, jstring string, jboolean *isCopy))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1991
  JNIWrapper("GetStringChars");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1992
  DTRACE_PROBE3(hotspot_jni, GetStringChars__entry, env, string, isCopy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1993
  //%note jni_5
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1994
  if (isCopy != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1995
    *isCopy = JNI_TRUE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1996
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1997
  oop s = JNIHandles::resolve_non_null(string);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1998
  int s_len = java_lang_String::length(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1999
  typeArrayOop s_value = java_lang_String::value(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2000
  int s_offset = java_lang_String::offset(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2001
  jchar* buf = NEW_C_HEAP_ARRAY(jchar, s_len + 1);  // add one for zero termination
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2002
  if (s_len > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2003
    memcpy(buf, s_value->char_at_addr(s_offset), sizeof(jchar)*s_len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2004
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2005
  buf[s_len] = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2006
  DTRACE_PROBE1(hotspot_jni, GetStringChars__return, buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2007
  return buf;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2008
JNI_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
JNI_QUICK_ENTRY(void, jni_ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2012
  JNIWrapper("ReleaseStringChars");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2013
  DTRACE_PROBE3(hotspot_jni, ReleaseStringChars__entry, env, str, chars);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2014
  //%note jni_6
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2015
  if (chars != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2016
    // Since String objects are supposed to be immutable, don't copy any
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2017
    // new data back.  A bad user will have to go after the char array.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2018
    FreeHeap((void*) chars);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2019
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2020
  DTRACE_PROBE(hotspot_jni, ReleaseStringChars__return);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2021
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2022
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2023
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2024
// UTF Interface
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2025
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2026
DT_RETURN_MARK_DECL(NewStringUTF, jstring);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2027
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2028
JNI_ENTRY(jstring, jni_NewStringUTF(JNIEnv *env, const char *bytes))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2029
  JNIWrapper("NewStringUTF");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2030
  DTRACE_PROBE2(hotspot_jni, NewStringUTF__entry, env, bytes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2031
  jstring ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2032
  DT_RETURN_MARK(NewStringUTF, jstring, (const jstring&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2033
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2034
  oop result = java_lang_String::create_oop_from_str((char*) bytes, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2035
  ret = (jstring) JNIHandles::make_local(env, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2036
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2037
JNI_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
JNI_ENTRY(jsize, jni_GetStringUTFLength(JNIEnv *env, jstring string))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2041
  JNIWrapper("GetStringUTFLength");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2042
  DTRACE_PROBE2(hotspot_jni, GetStringUTFLength__entry, env, string);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2043
  jsize ret = java_lang_String::utf8_length(JNIHandles::resolve_non_null(string));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2044
  DTRACE_PROBE1(hotspot_jni, GetStringUTFLength__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2045
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2046
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2047
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2048
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2049
JNI_ENTRY(const char*, jni_GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2050
  JNIWrapper("GetStringUTFChars");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2051
  DTRACE_PROBE3(hotspot_jni, GetStringUTFChars__entry, env, string, isCopy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2052
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2053
  char* str = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(string));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2054
  int length = (int)strlen(str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2055
  char* result = AllocateHeap(length+1, "GetStringUTFChars");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2056
  strcpy(result, str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2057
  if (isCopy != NULL) *isCopy = JNI_TRUE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2058
  DTRACE_PROBE1(hotspot_jni, GetStringUTFChars__return, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2059
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2060
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2061
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2062
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2063
JNI_LEAF(void, jni_ReleaseStringUTFChars(JNIEnv *env, jstring str, const char *chars))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2064
  JNIWrapper("ReleaseStringUTFChars");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2065
  DTRACE_PROBE3(hotspot_jni, ReleaseStringUTFChars__entry, env, str, chars);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2066
  if (chars != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2067
    FreeHeap((char*) chars);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2068
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2069
  DTRACE_PROBE(hotspot_jni, ReleaseStringUTFChars__return);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2070
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2071
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2072
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2073
JNI_QUICK_ENTRY(jsize, jni_GetArrayLength(JNIEnv *env, jarray array))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2074
  JNIWrapper("GetArrayLength");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2075
  DTRACE_PROBE2(hotspot_jni, GetArrayLength__entry, env, array);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2076
  arrayOop a = arrayOop(JNIHandles::resolve_non_null(array));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2077
  assert(a->is_array(), "must be array");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2078
  jsize ret = a->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2079
  DTRACE_PROBE1(hotspot_jni, GetArrayLength__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2080
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2081
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2082
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2083
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2084
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2085
// Object Array Operations
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2086
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2087
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2088
DT_RETURN_MARK_DECL(NewObjectArray, jobjectArray);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2089
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2090
JNI_ENTRY(jobjectArray, jni_NewObjectArray(JNIEnv *env, jsize length, jclass elementClass, jobject initialElement))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2091
  JNIWrapper("NewObjectArray");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2092
  DTRACE_PROBE4(hotspot_jni, NewObjectArray__entry, env, length, elementClass, initialElement);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2093
  jobjectArray ret = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2094
  DT_RETURN_MARK(NewObjectArray, jobjectArray, (const jobjectArray&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2095
  KlassHandle ek(THREAD, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(elementClass)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2096
  klassOop ako = Klass::cast(ek())->array_klass(CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2097
  KlassHandle ak = KlassHandle(THREAD, ako);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2098
  objArrayKlass::cast(ak())->initialize(CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2099
  objArrayOop result = objArrayKlass::cast(ak())->allocate(length, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2100
  oop initial_value = JNIHandles::resolve(initialElement);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2101
  if (initial_value != NULL) {  // array already initialized with NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2102
    for (int index = 0; index < length; index++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2103
      result->obj_at_put(index, initial_value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2104
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2105
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2106
  ret = (jobjectArray) JNIHandles::make_local(env, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2107
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2108
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2109
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2110
DT_RETURN_MARK_DECL(GetObjectArrayElement, jobject);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2111
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2112
JNI_ENTRY(jobject, jni_GetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2113
  JNIWrapper("GetObjectArrayElement");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2114
  DTRACE_PROBE3(hotspot_jni, GetObjectArrayElement__entry, env, array, index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2115
  jobject ret = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2116
  DT_RETURN_MARK(GetObjectArrayElement, jobject, (const jobject&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2117
  objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(array));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2118
  if (a->is_within_bounds(index)) {
4089
14bd2cd13a2c 6893483: DTrace probe return values for a couple JNI methods are wrong
kamg
parents: 3820
diff changeset
  2119
    ret = JNIHandles::make_local(env, a->obj_at(index));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2120
    return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2121
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2122
    char buf[jintAsStringSize];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2123
    sprintf(buf, "%d", index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2124
    THROW_MSG_0(vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2125
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2126
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2127
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2128
DT_VOID_RETURN_MARK_DECL(SetObjectArrayElement);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2129
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2130
JNI_ENTRY(void, jni_SetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index, jobject value))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2131
  JNIWrapper("SetObjectArrayElement");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2132
  DTRACE_PROBE4(hotspot_jni, SetObjectArrayElement__entry, env, array, index, value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2133
  DT_VOID_RETURN_MARK(SetObjectArrayElement);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2134
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2135
  objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(array));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2136
  oop v = JNIHandles::resolve(value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2137
  if (a->is_within_bounds(index)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2138
    if (v == NULL || v->is_a(objArrayKlass::cast(a->klass())->element_klass())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2139
      a->obj_at_put(index, v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2140
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2141
      THROW(vmSymbols::java_lang_ArrayStoreException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2142
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2143
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2144
    char buf[jintAsStringSize];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2145
    sprintf(buf, "%d", index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2146
    THROW_MSG(vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2147
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2148
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2149
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2150
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2151
#define DEFINE_NEWSCALARARRAY(Return,Allocator,Result) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2152
\
4089
14bd2cd13a2c 6893483: DTrace probe return values for a couple JNI methods are wrong
kamg
parents: 3820
diff changeset
  2153
  DT_RETURN_MARK_DECL(New##Result##Array, Return);\
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2154
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2155
JNI_ENTRY(Return, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2156
          jni_New##Result##Array(JNIEnv *env, jsize len)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2157
  JNIWrapper("New" XSTR(Result) "Array"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2158
  DTRACE_PROBE2(hotspot_jni, New##Result##Array__entry, env, len);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2159
  Return ret = NULL;\
4089
14bd2cd13a2c 6893483: DTrace probe return values for a couple JNI methods are wrong
kamg
parents: 3820
diff changeset
  2160
  DT_RETURN_MARK(New##Result##Array, Return, (const Return&)ret);\
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2161
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2162
  oop obj= oopFactory::Allocator(len, CHECK_0); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2163
  ret = (Return) JNIHandles::make_local(env, obj); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2164
  return ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2165
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2166
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2167
DEFINE_NEWSCALARARRAY(jbooleanArray, new_boolArray,   Boolean)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2168
DEFINE_NEWSCALARARRAY(jbyteArray,    new_byteArray,   Byte)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2169
DEFINE_NEWSCALARARRAY(jshortArray,   new_shortArray,  Short)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2170
DEFINE_NEWSCALARARRAY(jcharArray,    new_charArray,   Char)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2171
DEFINE_NEWSCALARARRAY(jintArray,     new_intArray,    Int)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2172
DEFINE_NEWSCALARARRAY(jlongArray,    new_longArray,   Long)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2173
DEFINE_NEWSCALARARRAY(jfloatArray,   new_singleArray, Float)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2174
DEFINE_NEWSCALARARRAY(jdoubleArray,  new_doubleArray, Double)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2175
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2176
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2177
// Return an address which will fault if the caller writes to it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2178
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2179
static char* get_bad_address() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2180
  static char* bad_address = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2181
  if (bad_address == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2182
    size_t size = os::vm_allocation_granularity();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2183
    bad_address = os::reserve_memory(size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2184
    if (bad_address != NULL) {
1664
fc9ed50498fb 6727377: VM stack guard pages on Windows should PAGE_READWRITE not PAGE_EXECUTE_READWRITE
coleenp
parents: 823
diff changeset
  2185
      os::protect_memory(bad_address, size, os::MEM_PROT_READ,
fc9ed50498fb 6727377: VM stack guard pages on Windows should PAGE_READWRITE not PAGE_EXECUTE_READWRITE
coleenp
parents: 823
diff changeset
  2186
                         /*is_committed*/false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2187
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2188
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2189
  return bad_address;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2190
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2191
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2192
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2193
#define DEFINE_GETSCALARARRAYELEMENTS(ElementTag,ElementType,Result, Tag) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2194
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2195
JNI_QUICK_ENTRY(ElementType*, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2196
          jni_Get##Result##ArrayElements(JNIEnv *env, ElementType##Array array, jboolean *isCopy)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2197
  JNIWrapper("Get" XSTR(Result) "ArrayElements"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2198
  DTRACE_PROBE3(hotspot_jni, Get##Result##ArrayElements__entry, env, array, isCopy);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2199
  /* allocate an chunk of memory in c land */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2200
  typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2201
  ElementType* result; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2202
  int len = a->length(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2203
  if (len == 0) { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2204
    /* Empty array: legal but useless, can't return NULL. \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2205
     * Return a pointer to something useless. \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2206
     * Avoid asserts in typeArrayOop. */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2207
    result = (ElementType*)get_bad_address(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2208
  } else { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2209
    result = NEW_C_HEAP_ARRAY(ElementType, len); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2210
    /* copy the array to the c chunk */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2211
    memcpy(result, a->Tag##_at_addr(0), sizeof(ElementType)*len); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2212
  } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2213
  if (isCopy) *isCopy = JNI_TRUE; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2214
  DTRACE_PROBE1(hotspot_jni, Get##Result##ArrayElements__return, result);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2215
  return result; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2216
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2217
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2218
DEFINE_GETSCALARARRAYELEMENTS(T_BOOLEAN, jboolean, Boolean, bool)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2219
DEFINE_GETSCALARARRAYELEMENTS(T_BYTE,    jbyte,    Byte,    byte)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2220
DEFINE_GETSCALARARRAYELEMENTS(T_SHORT,   jshort,   Short,   short)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2221
DEFINE_GETSCALARARRAYELEMENTS(T_CHAR,    jchar,    Char,    char)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2222
DEFINE_GETSCALARARRAYELEMENTS(T_INT,     jint,     Int,     int)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2223
DEFINE_GETSCALARARRAYELEMENTS(T_LONG,    jlong,    Long,    long)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2224
DEFINE_GETSCALARARRAYELEMENTS(T_FLOAT,   jfloat,   Float,   float)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2225
DEFINE_GETSCALARARRAYELEMENTS(T_DOUBLE,  jdouble,  Double,  double)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2226
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2227
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2228
#define DEFINE_RELEASESCALARARRAYELEMENTS(ElementTag,ElementType,Result,Tag) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2229
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2230
JNI_QUICK_ENTRY(void, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2231
          jni_Release##Result##ArrayElements(JNIEnv *env, ElementType##Array array, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2232
                                             ElementType *buf, jint mode)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2233
  JNIWrapper("Release" XSTR(Result) "ArrayElements"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2234
  DTRACE_PROBE4(hotspot_jni, Release##Result##ArrayElements__entry, env, array, buf, mode);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2235
  typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2236
  int len = a->length(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2237
  if (len != 0) {   /* Empty array:  nothing to free or copy. */  \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2238
    if ((mode == 0) || (mode == JNI_COMMIT)) { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2239
      memcpy(a->Tag##_at_addr(0), buf, sizeof(ElementType)*len); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2240
    } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2241
    if ((mode == 0) || (mode == JNI_ABORT)) { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2242
      FreeHeap(buf); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2243
    } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2244
  } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2245
  DTRACE_PROBE(hotspot_jni, Release##Result##ArrayElements__return);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2246
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2247
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2248
DEFINE_RELEASESCALARARRAYELEMENTS(T_BOOLEAN, jboolean, Boolean, bool)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2249
DEFINE_RELEASESCALARARRAYELEMENTS(T_BYTE,    jbyte,    Byte,    byte)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2250
DEFINE_RELEASESCALARARRAYELEMENTS(T_SHORT,   jshort,   Short,   short)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2251
DEFINE_RELEASESCALARARRAYELEMENTS(T_CHAR,    jchar,    Char,    char)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2252
DEFINE_RELEASESCALARARRAYELEMENTS(T_INT,     jint,     Int,     int)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2253
DEFINE_RELEASESCALARARRAYELEMENTS(T_LONG,    jlong,    Long,    long)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2254
DEFINE_RELEASESCALARARRAYELEMENTS(T_FLOAT,   jfloat,   Float,   float)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2255
DEFINE_RELEASESCALARARRAYELEMENTS(T_DOUBLE,  jdouble,  Double,  double)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2256
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2257
#define DEFINE_GETSCALARARRAYREGION(ElementTag,ElementType,Result, Tag) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2258
  DT_VOID_RETURN_MARK_DECL(Get##Result##ArrayRegion);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2259
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2260
JNI_ENTRY(void, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2261
jni_Get##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2262
             jsize len, ElementType *buf)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2263
  JNIWrapper("Get" XSTR(Result) "ArrayRegion"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2264
  DTRACE_PROBE5(hotspot_jni, Get##Result##ArrayRegion__entry, env, array, start, len, buf);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2265
  DT_VOID_RETURN_MARK(Get##Result##ArrayRegion); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2266
  typeArrayOop src = typeArrayOop(JNIHandles::resolve_non_null(array)); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2267
  if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)src->length())) { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2268
    THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2269
  } else { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2270
    if (len > 0) { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2271
      int sc = typeArrayKlass::cast(src->klass())->log2_element_size(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2272
      memcpy((u_char*) buf, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2273
             (u_char*) src->Tag##_at_addr(start), \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2274
             len << sc);                          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2275
    } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2276
  } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2277
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2278
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2279
DEFINE_GETSCALARARRAYREGION(T_BOOLEAN, jboolean,Boolean, bool)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2280
DEFINE_GETSCALARARRAYREGION(T_BYTE,    jbyte,   Byte,    byte)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2281
DEFINE_GETSCALARARRAYREGION(T_SHORT,   jshort,  Short,   short)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2282
DEFINE_GETSCALARARRAYREGION(T_CHAR,    jchar,   Char,    char)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2283
DEFINE_GETSCALARARRAYREGION(T_INT,     jint,    Int,     int)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2284
DEFINE_GETSCALARARRAYREGION(T_LONG,    jlong,   Long,    long)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2285
DEFINE_GETSCALARARRAYREGION(T_FLOAT,   jfloat,  Float,   float)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2286
DEFINE_GETSCALARARRAYREGION(T_DOUBLE,  jdouble, Double,  double)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2287
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2288
#define DEFINE_SETSCALARARRAYREGION(ElementTag,ElementType,Result, Tag) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2289
  DT_VOID_RETURN_MARK_DECL(Set##Result##ArrayRegion);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2290
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2291
JNI_ENTRY(void, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2292
jni_Set##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2293
             jsize len, const ElementType *buf)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2294
  JNIWrapper("Set" XSTR(Result) "ArrayRegion"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2295
  DTRACE_PROBE5(hotspot_jni, Set##Result##ArrayRegion__entry, env, array, start, len, buf);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2296
  DT_VOID_RETURN_MARK(Set##Result##ArrayRegion); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2297
  typeArrayOop dst = typeArrayOop(JNIHandles::resolve_non_null(array)); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2298
  if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)dst->length())) { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2299
    THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2300
  } else { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2301
    if (len > 0) { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2302
      int sc = typeArrayKlass::cast(dst->klass())->log2_element_size(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2303
      memcpy((u_char*) dst->Tag##_at_addr(start), \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2304
             (u_char*) buf, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2305
             len << sc);    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2306
    } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2307
  } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2308
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2309
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2310
DEFINE_SETSCALARARRAYREGION(T_BOOLEAN, jboolean, Boolean, bool)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2311
DEFINE_SETSCALARARRAYREGION(T_BYTE,    jbyte,    Byte,    byte)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2312
DEFINE_SETSCALARARRAYREGION(T_SHORT,   jshort,   Short,   short)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2313
DEFINE_SETSCALARARRAYREGION(T_CHAR,    jchar,    Char,    char)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2314
DEFINE_SETSCALARARRAYREGION(T_INT,     jint,     Int,     int)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2315
DEFINE_SETSCALARARRAYREGION(T_LONG,    jlong,    Long,    long)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2316
DEFINE_SETSCALARARRAYREGION(T_FLOAT,   jfloat,   Float,   float)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2317
DEFINE_SETSCALARARRAYREGION(T_DOUBLE,  jdouble,  Double,  double)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2318
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2319
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2320
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2321
// Interception of natives
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2322
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2323
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2324
// The RegisterNatives call being attempted tried to register with a method that
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2325
// is not native.  Ask JVM TI what prefixes have been specified.  Then check
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2326
// to see if the native method is now wrapped with the prefixes.  See the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2327
// SetNativeMethodPrefix(es) functions in the JVM TI Spec for details.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2328
static methodOop find_prefixed_native(KlassHandle k,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2329
                                      symbolHandle name, symbolHandle signature, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2330
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2331
  methodOop method;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2332
  int name_len = name->utf8_length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2333
  char* name_str = name->as_utf8();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2334
  int prefix_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2335
  char** prefixes = JvmtiExport::get_all_native_method_prefixes(&prefix_count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2336
  for (int i = 0; i < prefix_count; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2337
    char* prefix = prefixes[i];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2338
    int prefix_len = (int)strlen(prefix);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2339
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2340
    // try adding this prefix to the method name and see if it matches another method name
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2341
    int trial_len = name_len + prefix_len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2342
    char* trial_name_str = NEW_RESOURCE_ARRAY(char, trial_len + 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2343
    strcpy(trial_name_str, prefix);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2344
    strcat(trial_name_str, name_str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2345
    symbolHandle trial_name(THREAD, SymbolTable::probe(trial_name_str, trial_len));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2346
    if (trial_name.is_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2347
      continue; // no such symbol, so this prefix wasn't used, try the next prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2348
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2349
    method = Klass::cast(k())->lookup_method(trial_name(), signature());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2350
    if (method == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2351
      continue; // signature doesn't match, try the next prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2352
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2353
    if (method->is_native()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2354
      method->set_is_prefixed_native();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2355
      return method; // wahoo, we found a prefixed version of the method, return it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2356
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2357
    // found as non-native, so prefix is good, add it, probably just need more prefixes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2358
    name_len = trial_len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2359
    name_str = trial_name_str;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2360
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2361
  return NULL; // not found
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2362
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2363
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2364
static bool register_native(KlassHandle k, symbolHandle name, symbolHandle signature, address entry, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2365
  methodOop method = Klass::cast(k())->lookup_method(name(), signature());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2366
  if (method == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2367
    ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2368
    stringStream st;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2369
    st.print("Method %s name or signature does not match",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2370
             methodOopDesc::name_and_sig_as_C_string(Klass::cast(k()), name(), signature()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2371
    THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2372
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2373
  if (!method->is_native()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2374
    // trying to register to a non-native method, see if a JVM TI agent has added prefix(es)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2375
    method = find_prefixed_native(k, name, signature, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2376
    if (method == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2377
      ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2378
      stringStream st;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2379
      st.print("Method %s is not declared as native",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2380
               methodOopDesc::name_and_sig_as_C_string(Klass::cast(k()), name(), signature()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2381
      THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2382
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2383
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2384
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2385
  if (entry != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2386
    method->set_native_function(entry,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2387
      methodOopDesc::native_bind_event_is_interesting);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2388
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2389
    method->clear_native_function();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2390
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2391
  if (PrintJNIResolving) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2392
    ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2393
    tty->print_cr("[Registering JNI native method %s.%s]",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2394
      Klass::cast(method->method_holder())->external_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2395
      method->name()->as_C_string());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2396
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2397
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2398
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2399
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2400
DT_RETURN_MARK_DECL(RegisterNatives, jint);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2401
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2402
JNI_ENTRY(jint, jni_RegisterNatives(JNIEnv *env, jclass clazz,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2403
                                    const JNINativeMethod *methods,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2404
                                    jint nMethods))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2405
  JNIWrapper("RegisterNatives");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2406
  DTRACE_PROBE4(hotspot_jni, RegisterNatives__entry, env, clazz, methods, nMethods);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2407
  jint ret = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2408
  DT_RETURN_MARK(RegisterNatives, jint, (const jint&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2409
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2410
  KlassHandle h_k(thread, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(clazz)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2411
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2412
  for (int index = 0; index < nMethods; index++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2413
    const char* meth_name = methods[index].name;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2414
    const char* meth_sig = methods[index].signature;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2415
    int meth_name_len = (int)strlen(meth_name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2416
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2417
    // The class should have been loaded (we have an instance of the class
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2418
    // passed in) so the method and signature should already be in the symbol
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2419
    // table.  If they're not there, the method doesn't exist.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2420
    symbolHandle name(THREAD, SymbolTable::probe(meth_name, meth_name_len));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2421
    symbolHandle signature(THREAD, SymbolTable::probe(meth_sig, (int)strlen(meth_sig)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2422
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2423
    if (name.is_null() || signature.is_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2424
      ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2425
      stringStream st;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2426
      st.print("Method %s.%s%s not found", Klass::cast(h_k())->external_name(), meth_name, meth_sig);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2427
      // Must return negative value on failure
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2428
      THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2429
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2430
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2431
    bool res = register_native(h_k, name, signature,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2432
                               (address) methods[index].fnPtr, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2433
    if (!res) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2434
      ret = -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2435
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2436
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2437
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2438
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2439
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2440
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2441
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2442
JNI_ENTRY(jint, jni_UnregisterNatives(JNIEnv *env, jclass clazz))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2443
  JNIWrapper("UnregisterNatives");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2444
  DTRACE_PROBE2(hotspot_jni, UnregisterNatives__entry, env, clazz);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2445
  klassOop k   = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(clazz));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2446
  //%note jni_2
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2447
  if (Klass::cast(k)->oop_is_instance()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2448
    for (int index = 0; index < instanceKlass::cast(k)->methods()->length(); index++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2449
      methodOop m = methodOop(instanceKlass::cast(k)->methods()->obj_at(index));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2450
      if (m->is_native()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2451
        m->clear_native_function();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2452
        m->set_signature_handler(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2453
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2454
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2455
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2456
  DTRACE_PROBE1(hotspot_jni, UnregisterNatives__return, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2457
  return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2458
JNI_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
// Monitor functions
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2462
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2463
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2464
DT_RETURN_MARK_DECL(MonitorEnter, jint);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2465
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2466
JNI_ENTRY(jint, jni_MonitorEnter(JNIEnv *env, jobject jobj))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2467
  DTRACE_PROBE2(hotspot_jni, MonitorEnter__entry, env, jobj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2468
  jint ret = JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2469
  DT_RETURN_MARK(MonitorEnter, jint, (const jint&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2470
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2471
  // If the object is null, we can't do anything with it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2472
  if (jobj == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2473
    THROW_(vmSymbols::java_lang_NullPointerException(), JNI_ERR);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2474
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2475
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2476
  Handle obj(thread, JNIHandles::resolve_non_null(jobj));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2477
  ObjectSynchronizer::jni_enter(obj, CHECK_(JNI_ERR));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2478
  ret = JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2479
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2480
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2481
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2482
DT_RETURN_MARK_DECL(MonitorExit, jint);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2483
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2484
JNI_ENTRY(jint, jni_MonitorExit(JNIEnv *env, jobject jobj))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2485
  DTRACE_PROBE2(hotspot_jni, MonitorExit__entry, env, jobj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2486
  jint ret = JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2487
  DT_RETURN_MARK(MonitorExit, jint, (const jint&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2488
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2489
  // Don't do anything with a null object
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2490
  if (jobj == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2491
    THROW_(vmSymbols::java_lang_NullPointerException(), JNI_ERR);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2492
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2493
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2494
  Handle obj(THREAD, JNIHandles::resolve_non_null(jobj));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2495
  ObjectSynchronizer::jni_exit(obj(), CHECK_(JNI_ERR));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2496
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2497
  ret = JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2498
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2499
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2500
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2501
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2502
// Extensions
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2503
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2504
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2505
DT_VOID_RETURN_MARK_DECL(GetStringRegion);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2506
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2507
JNI_ENTRY(void, jni_GetStringRegion(JNIEnv *env, jstring string, jsize start, jsize len, jchar *buf))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2508
  JNIWrapper("GetStringRegion");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2509
  DTRACE_PROBE5(hotspot_jni, GetStringRegion__entry, env, string, start, len, buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2510
  DT_VOID_RETURN_MARK(GetStringRegion);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2511
  oop s = JNIHandles::resolve_non_null(string);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2512
  int s_len = java_lang_String::length(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2513
  if (start < 0 || len < 0 || start + len > s_len) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2514
    THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2515
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2516
    if (len > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2517
      int s_offset = java_lang_String::offset(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2518
      typeArrayOop s_value = java_lang_String::value(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2519
      memcpy(buf, s_value->char_at_addr(s_offset+start), sizeof(jchar)*len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2520
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2521
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2522
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2523
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2524
DT_VOID_RETURN_MARK_DECL(GetStringUTFRegion);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2525
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2526
JNI_ENTRY(void, jni_GetStringUTFRegion(JNIEnv *env, jstring string, jsize start, jsize len, char *buf))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2527
  JNIWrapper("GetStringUTFRegion");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2528
  DTRACE_PROBE5(hotspot_jni, GetStringUTFRegion__entry, env, string, start, len, buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2529
  DT_VOID_RETURN_MARK(GetStringUTFRegion);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2530
  oop s = JNIHandles::resolve_non_null(string);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2531
  int s_len = java_lang_String::length(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2532
  if (start < 0 || len < 0 || start + len > s_len) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2533
    THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2534
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2535
    //%note jni_7
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2536
    if (len > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2537
      ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2538
      char *utf_region = java_lang_String::as_utf8_string(s, start, len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2539
      int utf_len = (int)strlen(utf_region);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2540
      memcpy(buf, utf_region, utf_len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2541
      buf[utf_len] = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2542
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2543
      // JDK null-terminates the buffer even in len is zero
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2544
      if (buf != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2545
        buf[0] = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2546
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2547
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2548
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2549
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2550
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2551
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2552
JNI_ENTRY(void*, jni_GetPrimitiveArrayCritical(JNIEnv *env, jarray array, jboolean *isCopy))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2553
  JNIWrapper("GetPrimitiveArrayCritical");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2554
  DTRACE_PROBE3(hotspot_jni, GetPrimitiveArrayCritical__entry, env, array, isCopy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2555
  GC_locker::lock_critical(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2556
  if (isCopy != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2557
    *isCopy = JNI_FALSE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2558
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2559
  oop a = JNIHandles::resolve_non_null(array);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2560
  assert(a->is_array(), "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2561
  BasicType type;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2562
  if (a->is_objArray()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2563
    type = T_OBJECT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2564
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2565
    type = typeArrayKlass::cast(a->klass())->element_type();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2566
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2567
  void* ret = arrayOop(a)->base(type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2568
  DTRACE_PROBE1(hotspot_jni, GetPrimitiveArrayCritical__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2569
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2570
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2571
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2572
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2573
JNI_ENTRY(void, jni_ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray, jint mode))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2574
  JNIWrapper("ReleasePrimitiveArrayCritical");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2575
  DTRACE_PROBE4(hotspot_jni, ReleasePrimitiveArrayCritical__entry, env, array, carray, mode);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2576
  // The array, carray and mode arguments are ignored
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2577
  GC_locker::unlock_critical(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2578
  DTRACE_PROBE(hotspot_jni, ReleasePrimitiveArrayCritical__return);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2579
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2580
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2581
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2582
JNI_ENTRY(const jchar*, jni_GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2583
  JNIWrapper("GetStringCritical");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2584
  DTRACE_PROBE3(hotspot_jni, GetStringCritical__entry, env, string, isCopy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2585
  GC_locker::lock_critical(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2586
  if (isCopy != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2587
    *isCopy = JNI_FALSE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2588
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2589
  oop s = JNIHandles::resolve_non_null(string);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2590
  int s_len = java_lang_String::length(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2591
  typeArrayOop s_value = java_lang_String::value(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2592
  int s_offset = java_lang_String::offset(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2593
  const jchar* ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2594
  if (s_len > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2595
    ret = s_value->char_at_addr(s_offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2596
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2597
    ret = (jchar*) s_value->base(T_CHAR);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2598
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2599
  DTRACE_PROBE1(hotspot_jni, GetStringCritical__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2600
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2601
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2602
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2603
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2604
JNI_ENTRY(void, jni_ReleaseStringCritical(JNIEnv *env, jstring str, const jchar *chars))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2605
  JNIWrapper("ReleaseStringCritical");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2606
  DTRACE_PROBE3(hotspot_jni, ReleaseStringCritical__entry, env, str, chars);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2607
  // The str and chars arguments are ignored
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2608
  GC_locker::unlock_critical(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2609
  DTRACE_PROBE(hotspot_jni, ReleaseStringCritical__return);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2610
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2611
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2612
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2613
JNI_ENTRY(jweak, jni_NewWeakGlobalRef(JNIEnv *env, jobject ref))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2614
  JNIWrapper("jni_NewWeakGlobalRef");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2615
  DTRACE_PROBE2(hotspot_jni, NewWeakGlobalRef__entry, env, ref);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2616
  Handle ref_handle(thread, JNIHandles::resolve(ref));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2617
  jweak ret = JNIHandles::make_weak_global(ref_handle);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2618
  DTRACE_PROBE1(hotspot_jni, NewWeakGlobalRef__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2619
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2620
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2621
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2622
// Must be JNI_ENTRY (with HandleMark)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2623
JNI_ENTRY(void, jni_DeleteWeakGlobalRef(JNIEnv *env, jweak ref))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2624
  JNIWrapper("jni_DeleteWeakGlobalRef");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2625
  DTRACE_PROBE2(hotspot_jni, DeleteWeakGlobalRef__entry, env, ref);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2626
  JNIHandles::destroy_weak_global(ref);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2627
  DTRACE_PROBE(hotspot_jni, DeleteWeakGlobalRef__return);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2628
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2629
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2630
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2631
JNI_QUICK_ENTRY(jboolean, jni_ExceptionCheck(JNIEnv *env))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2632
  JNIWrapper("jni_ExceptionCheck");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2633
  DTRACE_PROBE1(hotspot_jni, ExceptionCheck__entry, env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2634
  jni_check_async_exceptions(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2635
  jboolean ret = (thread->has_pending_exception()) ? JNI_TRUE : JNI_FALSE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2636
  DTRACE_PROBE1(hotspot_jni, ExceptionCheck__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2637
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2638
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2639
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2640
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2641
// Initialization state for three routines below relating to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2642
// java.nio.DirectBuffers
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2643
static          jint directBufferSupportInitializeStarted = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2644
static volatile jint directBufferSupportInitializeEnded   = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2645
static volatile jint directBufferSupportInitializeFailed  = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2646
static jclass    bufferClass                 = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2647
static jclass    directBufferClass           = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2648
static jclass    directByteBufferClass       = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2649
static jmethodID directByteBufferConstructor = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2650
static jfieldID  directBufferAddressField    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2651
static jfieldID  bufferCapacityField         = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2652
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2653
static jclass lookupOne(JNIEnv* env, const char* name, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2654
  Handle loader;            // null (bootstrap) loader
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2655
  Handle protection_domain; // null protection domain
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2656
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2657
  symbolHandle sym = oopFactory::new_symbol_handle(name, CHECK_NULL);
2269
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
  2658
  jclass result =  find_class_from_class_loader(env, sym, true, loader, protection_domain, true, CHECK_NULL);
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
  2659
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
  2660
  if (TraceClassResolution && result != NULL) {
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
  2661
    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
  2662
  }
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
  2663
  return result;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2664
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2665
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2666
// These lookups are done with the NULL (bootstrap) ClassLoader to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2667
// circumvent any security checks that would be done by jni_FindClass.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2668
JNI_ENTRY(bool, lookupDirectBufferClasses(JNIEnv* env))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2669
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2670
  if ((bufferClass           = lookupOne(env, "java/nio/Buffer", thread))           == NULL) { return false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2671
  if ((directBufferClass     = lookupOne(env, "sun/nio/ch/DirectBuffer", thread))   == NULL) { return false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2672
  if ((directByteBufferClass = lookupOne(env, "java/nio/DirectByteBuffer", thread)) == NULL) { return false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2673
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2674
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2675
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2676
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2677
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2678
static bool initializeDirectBufferSupport(JNIEnv* env, JavaThread* thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2679
  if (directBufferSupportInitializeFailed) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2680
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2681
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2682
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2683
  if (Atomic::cmpxchg(1, &directBufferSupportInitializeStarted, 0) == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2684
    if (!lookupDirectBufferClasses(env)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2685
      directBufferSupportInitializeFailed = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2686
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2687
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2688
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2689
    // Make global references for these
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2690
    bufferClass           = (jclass) env->NewGlobalRef(bufferClass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2691
    directBufferClass     = (jclass) env->NewGlobalRef(directBufferClass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2692
    directByteBufferClass = (jclass) env->NewGlobalRef(directByteBufferClass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2693
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2694
    // Get needed field and method IDs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2695
    directByteBufferConstructor = env->GetMethodID(directByteBufferClass, "<init>", "(JI)V");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2696
    directBufferAddressField    = env->GetFieldID(bufferClass, "address", "J");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2697
    bufferCapacityField         = env->GetFieldID(bufferClass, "capacity", "I");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2698
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2699
    if ((directByteBufferConstructor == NULL) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2700
        (directBufferAddressField    == NULL) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2701
        (bufferCapacityField         == NULL)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2702
      directBufferSupportInitializeFailed = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2703
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2704
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2705
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2706
    directBufferSupportInitializeEnded = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2707
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2708
    while (!directBufferSupportInitializeEnded && !directBufferSupportInitializeFailed) {
1897
d49193ae5111 6791815: Fix for 6471657 can cause deadlock on non-Solaris platforms when initializing direct buffer support
xlu
parents: 1664
diff changeset
  2709
      // Set state as yield_all can call os:sleep. On Solaris, yield_all calls
d49193ae5111 6791815: Fix for 6471657 can cause deadlock on non-Solaris platforms when initializing direct buffer support
xlu
parents: 1664
diff changeset
  2710
      // os::sleep which requires the VM state transition. On other platforms, it
d49193ae5111 6791815: Fix for 6471657 can cause deadlock on non-Solaris platforms when initializing direct buffer support
xlu
parents: 1664
diff changeset
  2711
      // is not necessary. The following call to change the VM state is purposely
d49193ae5111 6791815: Fix for 6471657 can cause deadlock on non-Solaris platforms when initializing direct buffer support
xlu
parents: 1664
diff changeset
  2712
      // put inside the loop to avoid potential deadlock when multiple threads
d49193ae5111 6791815: Fix for 6471657 can cause deadlock on non-Solaris platforms when initializing direct buffer support
xlu
parents: 1664
diff changeset
  2713
      // try to call this method. See 6791815 for more details.
d49193ae5111 6791815: Fix for 6471657 can cause deadlock on non-Solaris platforms when initializing direct buffer support
xlu
parents: 1664
diff changeset
  2714
      ThreadInVMfromNative tivn(thread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2715
      os::yield_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2716
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2717
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2718
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2719
  return !directBufferSupportInitializeFailed;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2720
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2721
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2722
extern "C" jobject JNICALL jni_NewDirectByteBuffer(JNIEnv *env, void* address, jlong capacity)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2723
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2724
  // thread_from_jni_environment() will block if VM is gone.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2725
  JavaThread* thread = JavaThread::thread_from_jni_environment(env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2726
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2727
  JNIWrapper("jni_NewDirectByteBuffer");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2728
  DTRACE_PROBE3(hotspot_jni, NewDirectByteBuffer__entry, env, address, capacity);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2729
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2730
  if (!directBufferSupportInitializeEnded) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2731
    if (!initializeDirectBufferSupport(env, thread)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2732
      DTRACE_PROBE1(hotspot_jni, NewDirectByteBuffer__return, NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2733
      return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2734
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2735
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2736
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2737
  // Being paranoid about accidental sign extension on address
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2738
  jlong addr = (jlong) ((uintptr_t) address);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2739
  // NOTE that package-private DirectByteBuffer constructor currently
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2740
  // takes int capacity
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2741
  jint  cap  = (jint)  capacity;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2742
  jobject ret = env->NewObject(directByteBufferClass, directByteBufferConstructor, addr, cap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2743
  DTRACE_PROBE1(hotspot_jni, NewDirectByteBuffer__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2744
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2745
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2746
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2747
DT_RETURN_MARK_DECL(GetDirectBufferAddress, void*);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2748
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2749
extern "C" void* JNICALL jni_GetDirectBufferAddress(JNIEnv *env, jobject buf)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2750
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2751
  // thread_from_jni_environment() will block if VM is gone.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2752
  JavaThread* thread = JavaThread::thread_from_jni_environment(env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2753
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2754
  JNIWrapper("jni_GetDirectBufferAddress");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2755
  DTRACE_PROBE2(hotspot_jni, GetDirectBufferAddress__entry, env, buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2756
  void* ret = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2757
  DT_RETURN_MARK(GetDirectBufferAddress, void*, (const void*&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2758
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2759
  if (!directBufferSupportInitializeEnded) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2760
    if (!initializeDirectBufferSupport(env, thread)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2761
      return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2762
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2763
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2764
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2765
  if ((buf != NULL) && (!env->IsInstanceOf(buf, directBufferClass))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2766
    return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2767
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2768
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2769
  ret = (void*)(intptr_t)env->GetLongField(buf, directBufferAddressField);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2770
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2771
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2772
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2773
DT_RETURN_MARK_DECL(GetDirectBufferCapacity, jlong);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2774
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2775
extern "C" jlong JNICALL jni_GetDirectBufferCapacity(JNIEnv *env, jobject buf)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2776
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2777
  // thread_from_jni_environment() will block if VM is gone.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2778
  JavaThread* thread = JavaThread::thread_from_jni_environment(env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2779
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2780
  JNIWrapper("jni_GetDirectBufferCapacity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2781
  DTRACE_PROBE2(hotspot_jni, GetDirectBufferCapacity__entry, env, buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2782
  jlong ret = -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2783
  DT_RETURN_MARK(GetDirectBufferCapacity, jlong, (const jlong&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2784
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2785
  if (!directBufferSupportInitializeEnded) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2786
    if (!initializeDirectBufferSupport(env, thread)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2787
      ret = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2788
      return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2789
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2790
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2791
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2792
  if (buf == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2793
    return -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2794
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2795
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2796
  if (!env->IsInstanceOf(buf, directBufferClass)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2797
    return -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2798
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2799
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2800
  // NOTE that capacity is currently an int in the implementation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2801
  ret = env->GetIntField(buf, bufferCapacityField);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2802
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2803
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2804
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2805
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2806
JNI_LEAF(jint, jni_GetVersion(JNIEnv *env))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2807
  JNIWrapper("GetVersion");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2808
  DTRACE_PROBE1(hotspot_jni, GetVersion__entry, env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2809
  DTRACE_PROBE1(hotspot_jni, GetVersion__return, CurrentVersion);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2810
  return CurrentVersion;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2811
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2812
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2813
extern struct JavaVM_ main_vm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2814
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2815
JNI_LEAF(jint, jni_GetJavaVM(JNIEnv *env, JavaVM **vm))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2816
  JNIWrapper("jni_GetJavaVM");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2817
  DTRACE_PROBE2(hotspot_jni, GetJavaVM__entry, env, vm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2818
  *vm  = (JavaVM *)(&main_vm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2819
  DTRACE_PROBE1(hotspot_jni, GetJavaVM__return, JNI_OK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2820
  return JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2821
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2822
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2823
// Structure containing all jni functions
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2824
struct JNINativeInterface_ jni_NativeInterface = {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2825
    NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2826
    NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2827
    NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2828
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2829
    NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2830
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2831
    jni_GetVersion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2832
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2833
    jni_DefineClass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2834
    jni_FindClass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2835
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2836
    jni_FromReflectedMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2837
    jni_FromReflectedField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2838
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2839
    jni_ToReflectedMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2840
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2841
    jni_GetSuperclass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2842
    jni_IsAssignableFrom,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2843
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2844
    jni_ToReflectedField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2845
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2846
    jni_Throw,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2847
    jni_ThrowNew,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2848
    jni_ExceptionOccurred,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2849
    jni_ExceptionDescribe,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2850
    jni_ExceptionClear,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2851
    jni_FatalError,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2852
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2853
    jni_PushLocalFrame,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2854
    jni_PopLocalFrame,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2855
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2856
    jni_NewGlobalRef,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2857
    jni_DeleteGlobalRef,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2858
    jni_DeleteLocalRef,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2859
    jni_IsSameObject,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2860
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2861
    jni_NewLocalRef,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2862
    jni_EnsureLocalCapacity,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2863
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2864
    jni_AllocObject,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2865
    jni_NewObject,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2866
    jni_NewObjectV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2867
    jni_NewObjectA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2868
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2869
    jni_GetObjectClass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2870
    jni_IsInstanceOf,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2871
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2872
    jni_GetMethodID,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2873
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2874
    jni_CallObjectMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2875
    jni_CallObjectMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2876
    jni_CallObjectMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2877
    jni_CallBooleanMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2878
    jni_CallBooleanMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2879
    jni_CallBooleanMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2880
    jni_CallByteMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2881
    jni_CallByteMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2882
    jni_CallByteMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2883
    jni_CallCharMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2884
    jni_CallCharMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2885
    jni_CallCharMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2886
    jni_CallShortMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2887
    jni_CallShortMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2888
    jni_CallShortMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2889
    jni_CallIntMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2890
    jni_CallIntMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2891
    jni_CallIntMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2892
    jni_CallLongMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2893
    jni_CallLongMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2894
    jni_CallLongMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2895
    jni_CallFloatMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2896
    jni_CallFloatMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2897
    jni_CallFloatMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2898
    jni_CallDoubleMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2899
    jni_CallDoubleMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2900
    jni_CallDoubleMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2901
    jni_CallVoidMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2902
    jni_CallVoidMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2903
    jni_CallVoidMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2904
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2905
    jni_CallNonvirtualObjectMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2906
    jni_CallNonvirtualObjectMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2907
    jni_CallNonvirtualObjectMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2908
    jni_CallNonvirtualBooleanMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2909
    jni_CallNonvirtualBooleanMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2910
    jni_CallNonvirtualBooleanMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2911
    jni_CallNonvirtualByteMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2912
    jni_CallNonvirtualByteMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2913
    jni_CallNonvirtualByteMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2914
    jni_CallNonvirtualCharMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2915
    jni_CallNonvirtualCharMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2916
    jni_CallNonvirtualCharMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2917
    jni_CallNonvirtualShortMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2918
    jni_CallNonvirtualShortMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2919
    jni_CallNonvirtualShortMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2920
    jni_CallNonvirtualIntMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2921
    jni_CallNonvirtualIntMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2922
    jni_CallNonvirtualIntMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2923
    jni_CallNonvirtualLongMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2924
    jni_CallNonvirtualLongMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2925
    jni_CallNonvirtualLongMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2926
    jni_CallNonvirtualFloatMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2927
    jni_CallNonvirtualFloatMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2928
    jni_CallNonvirtualFloatMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2929
    jni_CallNonvirtualDoubleMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2930
    jni_CallNonvirtualDoubleMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2931
    jni_CallNonvirtualDoubleMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2932
    jni_CallNonvirtualVoidMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2933
    jni_CallNonvirtualVoidMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2934
    jni_CallNonvirtualVoidMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2935
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2936
    jni_GetFieldID,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2937
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2938
    jni_GetObjectField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2939
    jni_GetBooleanField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2940
    jni_GetByteField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2941
    jni_GetCharField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2942
    jni_GetShortField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2943
    jni_GetIntField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2944
    jni_GetLongField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2945
    jni_GetFloatField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2946
    jni_GetDoubleField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2947
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2948
    jni_SetObjectField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2949
    jni_SetBooleanField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2950
    jni_SetByteField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2951
    jni_SetCharField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2952
    jni_SetShortField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2953
    jni_SetIntField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2954
    jni_SetLongField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2955
    jni_SetFloatField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2956
    jni_SetDoubleField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2957
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2958
    jni_GetStaticMethodID,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2959
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2960
    jni_CallStaticObjectMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2961
    jni_CallStaticObjectMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2962
    jni_CallStaticObjectMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2963
    jni_CallStaticBooleanMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2964
    jni_CallStaticBooleanMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2965
    jni_CallStaticBooleanMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2966
    jni_CallStaticByteMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2967
    jni_CallStaticByteMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2968
    jni_CallStaticByteMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2969
    jni_CallStaticCharMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2970
    jni_CallStaticCharMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2971
    jni_CallStaticCharMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2972
    jni_CallStaticShortMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2973
    jni_CallStaticShortMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2974
    jni_CallStaticShortMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2975
    jni_CallStaticIntMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2976
    jni_CallStaticIntMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2977
    jni_CallStaticIntMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2978
    jni_CallStaticLongMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2979
    jni_CallStaticLongMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2980
    jni_CallStaticLongMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2981
    jni_CallStaticFloatMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2982
    jni_CallStaticFloatMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2983
    jni_CallStaticFloatMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2984
    jni_CallStaticDoubleMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2985
    jni_CallStaticDoubleMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2986
    jni_CallStaticDoubleMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2987
    jni_CallStaticVoidMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2988
    jni_CallStaticVoidMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2989
    jni_CallStaticVoidMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2990
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2991
    jni_GetStaticFieldID,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2992
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2993
    jni_GetStaticObjectField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2994
    jni_GetStaticBooleanField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2995
    jni_GetStaticByteField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2996
    jni_GetStaticCharField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2997
    jni_GetStaticShortField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2998
    jni_GetStaticIntField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2999
    jni_GetStaticLongField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3000
    jni_GetStaticFloatField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3001
    jni_GetStaticDoubleField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3002
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3003
    jni_SetStaticObjectField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3004
    jni_SetStaticBooleanField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3005
    jni_SetStaticByteField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3006
    jni_SetStaticCharField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3007
    jni_SetStaticShortField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3008
    jni_SetStaticIntField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3009
    jni_SetStaticLongField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3010
    jni_SetStaticFloatField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3011
    jni_SetStaticDoubleField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3012
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3013
    jni_NewString,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3014
    jni_GetStringLength,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3015
    jni_GetStringChars,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3016
    jni_ReleaseStringChars,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3017
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3018
    jni_NewStringUTF,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3019
    jni_GetStringUTFLength,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3020
    jni_GetStringUTFChars,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3021
    jni_ReleaseStringUTFChars,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3022
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3023
    jni_GetArrayLength,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3024
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3025
    jni_NewObjectArray,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3026
    jni_GetObjectArrayElement,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3027
    jni_SetObjectArrayElement,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3028
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3029
    jni_NewBooleanArray,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3030
    jni_NewByteArray,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3031
    jni_NewCharArray,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3032
    jni_NewShortArray,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3033
    jni_NewIntArray,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3034
    jni_NewLongArray,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3035
    jni_NewFloatArray,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3036
    jni_NewDoubleArray,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3037
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3038
    jni_GetBooleanArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3039
    jni_GetByteArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3040
    jni_GetCharArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3041
    jni_GetShortArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3042
    jni_GetIntArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3043
    jni_GetLongArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3044
    jni_GetFloatArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3045
    jni_GetDoubleArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3046
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3047
    jni_ReleaseBooleanArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3048
    jni_ReleaseByteArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3049
    jni_ReleaseCharArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3050
    jni_ReleaseShortArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3051
    jni_ReleaseIntArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3052
    jni_ReleaseLongArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3053
    jni_ReleaseFloatArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3054
    jni_ReleaseDoubleArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3055
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3056
    jni_GetBooleanArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3057
    jni_GetByteArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3058
    jni_GetCharArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3059
    jni_GetShortArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3060
    jni_GetIntArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3061
    jni_GetLongArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3062
    jni_GetFloatArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3063
    jni_GetDoubleArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3064
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3065
    jni_SetBooleanArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3066
    jni_SetByteArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3067
    jni_SetCharArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3068
    jni_SetShortArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3069
    jni_SetIntArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3070
    jni_SetLongArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3071
    jni_SetFloatArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3072
    jni_SetDoubleArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3073
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3074
    jni_RegisterNatives,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3075
    jni_UnregisterNatives,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3076
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3077
    jni_MonitorEnter,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3078
    jni_MonitorExit,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3079
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3080
    jni_GetJavaVM,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3081
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3082
    jni_GetStringRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3083
    jni_GetStringUTFRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3084
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3085
    jni_GetPrimitiveArrayCritical,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3086
    jni_ReleasePrimitiveArrayCritical,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3087
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3088
    jni_GetStringCritical,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3089
    jni_ReleaseStringCritical,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3090
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3091
    jni_NewWeakGlobalRef,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3092
    jni_DeleteWeakGlobalRef,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3093
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3094
    jni_ExceptionCheck,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3095
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3096
    jni_NewDirectByteBuffer,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3097
    jni_GetDirectBufferAddress,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3098
    jni_GetDirectBufferCapacity,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3099
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3100
    // New 1_6 features
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3101
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3102
    jni_GetObjectRefType
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3103
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3104
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3105
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3106
// For jvmti use to modify jni function table.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3107
// Java threads in native contiues to run until it is transitioned
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3108
// to VM at safepoint. Before the transition or before it is blocked
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3109
// for safepoint it may access jni function table. VM could crash if
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3110
// any java thread access the jni function table in the middle of memcpy.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3111
// To avoid this each function pointers are copied automically.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3112
void copy_jni_function_table(const struct JNINativeInterface_ *new_jni_NativeInterface) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3113
  assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3114
  intptr_t *a = (intptr_t *) jni_functions();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3115
  intptr_t *b = (intptr_t *) new_jni_NativeInterface;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3116
  for (uint i=0; i <  sizeof(struct JNINativeInterface_)/sizeof(void *); i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3117
    Atomic::store_ptr(*b++, a++);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3118
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3119
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3120
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3121
void quicken_jni_functions() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3122
  // Replace Get<Primitive>Field with fast versions
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3123
  if (UseFastJNIAccessors && !JvmtiExport::can_post_field_access()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3124
      && !VerifyJNIFields && !TraceJNICalls && !CountJNICalls && !CheckJNICalls
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3125
#if defined(_WINDOWS) && defined(IA32) && defined(COMPILER2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3126
      // windows x86 currently needs SEH wrapper and the gain of the fast
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3127
      // versions currently isn't certain for server vm on uniprocessor.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3128
      && os::is_MP()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3129
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3130
  ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3131
    address func;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3132
    func = JNI_FastGetField::generate_fast_get_boolean_field();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3133
    if (func != (address)-1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3134
      jni_NativeInterface.GetBooleanField = (GetBooleanField_t)func;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3135
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3136
    func = JNI_FastGetField::generate_fast_get_byte_field();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3137
    if (func != (address)-1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3138
      jni_NativeInterface.GetByteField = (GetByteField_t)func;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3139
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3140
    func = JNI_FastGetField::generate_fast_get_char_field();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3141
    if (func != (address)-1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3142
      jni_NativeInterface.GetCharField = (GetCharField_t)func;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3143
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3144
    func = JNI_FastGetField::generate_fast_get_short_field();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3145
    if (func != (address)-1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3146
      jni_NativeInterface.GetShortField = (GetShortField_t)func;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3147
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3148
    func = JNI_FastGetField::generate_fast_get_int_field();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3149
    if (func != (address)-1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3150
      jni_NativeInterface.GetIntField = (GetIntField_t)func;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3151
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3152
    func = JNI_FastGetField::generate_fast_get_long_field();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3153
    if (func != (address)-1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3154
      jni_NativeInterface.GetLongField = (GetLongField_t)func;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3155
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3156
    func = JNI_FastGetField::generate_fast_get_float_field();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3157
    if (func != (address)-1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3158
      jni_NativeInterface.GetFloatField = (GetFloatField_t)func;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3159
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3160
    func = JNI_FastGetField::generate_fast_get_double_field();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3161
    if (func != (address)-1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3162
      jni_NativeInterface.GetDoubleField = (GetDoubleField_t)func;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3163
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3164
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3165
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3166
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3167
// Returns the function structure
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3168
struct JNINativeInterface_* jni_functions() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3169
#ifndef JNICHECK_KERNEL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3170
  if (CheckJNICalls) return jni_functions_check();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3171
#else  // JNICHECK_KERNEL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3172
  if (CheckJNICalls) warning("-Xcheck:jni is not supported in kernel vm.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3173
#endif // JNICHECK_KERNEL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3174
  return &jni_NativeInterface;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3175
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3176
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3177
// Returns the function structure
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3178
struct JNINativeInterface_* jni_functions_nocheck() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3179
  return &jni_NativeInterface;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3180
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3181
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3182
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3183
// Invocation API
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3184
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3185
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3186
// Forward declaration
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3187
extern const struct JNIInvokeInterface_ jni_InvokeInterface;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3188
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3189
// Global invocation API vars
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3190
volatile jint vm_created = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3191
// Indicate whether it is safe to recreate VM
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3192
volatile jint safe_to_recreate_vm = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3193
struct JavaVM_ main_vm = {&jni_InvokeInterface};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3194
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3195
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3196
#define JAVASTACKSIZE (400 * 1024)    /* Default size of a thread java stack */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3197
#define PROCSTACKSIZE 0               /* 0 means default size in HPI */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3198
enum { VERIFY_NONE, VERIFY_REMOTE, VERIFY_ALL };
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3199
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3200
HS_DTRACE_PROBE_DECL1(hotspot_jni, GetDefaultJavaVMInitArgs__entry, void*);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3201
DT_RETURN_MARK_DECL(GetDefaultJavaVMInitArgs, jint);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3202
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3203
_JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_GetDefaultJavaVMInitArgs(void *args_) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3204
  HS_DTRACE_PROBE1(hotspot_jni, GetDefaultJavaVMInitArgs__entry, args_);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3205
  JDK1_1InitArgs *args = (JDK1_1InitArgs *)args_;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3206
  jint ret = JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3207
  DT_RETURN_MARK(GetDefaultJavaVMInitArgs, jint, (const jint&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3208
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3209
  if (Threads::is_supported_jni_version(args->version)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3210
    ret = JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3211
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3212
  // 1.1 style no longer supported in hotspot.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3213
  // According the JNI spec, we should update args->version on return.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3214
  // We also use the structure to communicate with launcher about default
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3215
  // stack size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3216
  if (args->version == JNI_VERSION_1_1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3217
    args->version = JNI_VERSION_1_2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3218
    // javaStackSize is int in arguments structure
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3219
    assert(jlong(ThreadStackSize) * K < INT_MAX, "integer overflow");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3220
    args->javaStackSize = (jint)(ThreadStackSize * K);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3221
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3222
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3223
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3224
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3225
HS_DTRACE_PROBE_DECL3(hotspot_jni, CreateJavaVM__entry, vm, penv, args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3226
DT_RETURN_MARK_DECL(CreateJavaVM, jint);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3227
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3228
_JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_CreateJavaVM(JavaVM **vm, void **penv, void *args) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3229
  HS_DTRACE_PROBE3(hotspot_jni, CreateJavaVM__entry, vm, penv, args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3230
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3231
  jint result = JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3232
  DT_RETURN_MARK(CreateJavaVM, jint, (const jint&)result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3233
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3234
  // At the moment it's only possible to have one Java VM,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3235
  // since some of the runtime state is in global variables.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3236
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3237
  // We cannot use our mutex locks here, since they only work on
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3238
  // Threads. We do an atomic compare and exchange to ensure only
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3239
  // one thread can call this method at a time
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3240
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3241
  // We use Atomic::xchg rather than Atomic::add/dec since on some platforms
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3242
  // the add/dec implementations are dependent on whether we are running
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3243
  // on a multiprocessor, and at this stage of initialization the os::is_MP
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3244
  // function used to determine this will always return false. Atomic::xchg
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3245
  // does not have this problem.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3246
  if (Atomic::xchg(1, &vm_created) == 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3247
    return JNI_ERR;   // already created, or create attempt in progress
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3248
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3249
  if (Atomic::xchg(0, &safe_to_recreate_vm) == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3250
    return JNI_ERR;  // someone tried and failed and retry not allowed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3251
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3252
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3253
  assert(vm_created == 1, "vm_created is true during the creation");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3254
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3255
  /**
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3256
   * Certain errors during initialization are recoverable and do not
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3257
   * prevent this method from being called again at a later time
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3258
   * (perhaps with different arguments).  However, at a certain
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3259
   * point during initialization if an error occurs we cannot allow
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3260
   * this function to be called again (or it will crash).  In those
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3261
   * situations, the 'canTryAgain' flag is set to false, which atomically
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3262
   * sets safe_to_recreate_vm to 1, such that any new call to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3263
   * JNI_CreateJavaVM will immediately fail using the above logic.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3264
   */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3265
  bool can_try_again = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3266
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3267
  result = Threads::create_vm((JavaVMInitArgs*) args, &can_try_again);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3268
  if (result == JNI_OK) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3269
    JavaThread *thread = JavaThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3270
    /* thread is thread_in_vm here */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3271
    *vm = (JavaVM *)(&main_vm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3272
    *(JNIEnv**)penv = thread->jni_environment();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3273
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3274
    // Tracks the time application was running before GC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3275
    RuntimeService::record_application_start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3276
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3277
    // Notify JVMTI
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3278
    if (JvmtiExport::should_post_thread_life()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3279
       JvmtiExport::post_thread_start(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3280
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3281
    // Check if we should compile all classes on bootclasspath
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3282
    NOT_PRODUCT(if (CompileTheWorld) ClassLoader::compile_the_world();)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3283
    // Since this is not a JVM_ENTRY we have to set the thread state manually before leaving.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3284
    ThreadStateTransition::transition_and_fence(thread, _thread_in_vm, _thread_in_native);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3285
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3286
    if (can_try_again) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3287
      // reset safe_to_recreate_vm to 1 so that retrial would be possible
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3288
      safe_to_recreate_vm = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3289
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3290
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3291
    // Creation failed. We must reset vm_created
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3292
    *vm = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3293
    *(JNIEnv**)penv = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3294
    // reset vm_created last to avoid race condition. Use OrderAccess to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3295
    // control both compiler and architectural-based reordering.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3296
    OrderAccess::release_store(&vm_created, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3297
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3298
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3299
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3300
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3301
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3302
HS_DTRACE_PROBE_DECL3(hotspot_jni, GetCreatedJavaVMs__entry, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3303
  JavaVM**, jsize, jsize*);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3304
HS_DTRACE_PROBE_DECL1(hotspot_jni, GetCreatedJavaVMs__return, jint);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3305
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3306
_JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_GetCreatedJavaVMs(JavaVM **vm_buf, jsize bufLen, jsize *numVMs) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3307
  // See bug 4367188, the wrapper can sometimes cause VM crashes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3308
  // JNIWrapper("GetCreatedJavaVMs");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3309
  HS_DTRACE_PROBE3(hotspot_jni, GetCreatedJavaVMs__entry, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3310
    vm_buf, bufLen, numVMs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3311
  if (vm_created) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3312
    if (numVMs != NULL) *numVMs = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3313
    if (bufLen > 0)     *vm_buf = (JavaVM *)(&main_vm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3314
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3315
    if (numVMs != NULL) *numVMs = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3316
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3317
  HS_DTRACE_PROBE1(hotspot_jni, GetCreatedJavaVMs__return, JNI_OK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3318
  return JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3319
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3320
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3321
extern "C" {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3322
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3323
DT_RETURN_MARK_DECL(DestroyJavaVM, jint);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3324
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3325
jint JNICALL jni_DestroyJavaVM(JavaVM *vm) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3326
  DTRACE_PROBE1(hotspot_jni, DestroyJavaVM__entry, vm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3327
  jint res = JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3328
  DT_RETURN_MARK(DestroyJavaVM, jint, (const jint&)res);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3329
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3330
  if (!vm_created) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3331
    res = JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3332
    return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3333
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3334
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3335
  JNIWrapper("DestroyJavaVM");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3336
  JNIEnv *env;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3337
  JavaVMAttachArgs destroyargs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3338
  destroyargs.version = CurrentVersion;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3339
  destroyargs.name = (char *)"DestroyJavaVM";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3340
  destroyargs.group = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3341
  res = vm->AttachCurrentThread((void **)&env, (void *)&destroyargs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3342
  if (res != JNI_OK) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3343
    return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3344
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3345
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3346
  // Since this is not a JVM_ENTRY we have to set the thread state manually before entering.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3347
  JavaThread* thread = JavaThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3348
  ThreadStateTransition::transition_from_native(thread, _thread_in_vm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3349
  if (Threads::destroy_vm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3350
    // Should not change thread state, VM is gone
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3351
    vm_created = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3352
    res = JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3353
    return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3354
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3355
    ThreadStateTransition::transition_and_fence(thread, _thread_in_vm, _thread_in_native);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3356
    res = JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3357
    return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3358
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3359
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3360
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3361
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3362
static jint attach_current_thread(JavaVM *vm, void **penv, void *_args, bool daemon) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3363
  JavaVMAttachArgs *args = (JavaVMAttachArgs *) _args;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3364
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3365
  // Check below commented out from JDK1.2fcs as well
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3366
  /*
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3367
  if (args && (args->version != JNI_VERSION_1_1 || args->version != JNI_VERSION_1_2)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3368
    return JNI_EVERSION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3369
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3370
  */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3371
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3372
  Thread* t = ThreadLocalStorage::get_thread_slow();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3373
  if (t != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3374
    // If the thread has been attached this operation is a no-op
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3375
    *(JNIEnv**)penv = ((JavaThread*) t)->jni_environment();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3376
    return JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3377
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3378
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3379
  // Create a thread and mark it as attaching so it will be skipped by the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3380
  // ThreadsListEnumerator - see CR 6404306
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3381
  JavaThread* thread = new JavaThread(true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3382
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3383
  // Set correct safepoint info. The thread is going to call into Java when
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3384
  // initializing the Java level thread object. Hence, the correct state must
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3385
  // be set in order for the Safepoint code to deal with it correctly.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3386
  thread->set_thread_state(_thread_in_vm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3387
  // Must do this before initialize_thread_local_storage
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3388
  thread->record_stack_base_and_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3389
  thread->initialize_thread_local_storage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3390
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3391
  if (!os::create_attached_thread(thread)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3392
    delete thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3393
    return JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3394
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3395
  thread->initialize_tlab();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3396
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3397
  // Crucial that we do not have a safepoint check for this thread, since it has
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3398
  // not been added to the Thread list yet.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3399
  { Threads_lock->lock_without_safepoint_check();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3400
    // This must be inside this lock in order to get FullGCALot to work properly, i.e., to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3401
    // avoid this thread trying to do a GC before it is added to the thread-list
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3402
    thread->set_active_handles(JNIHandleBlock::allocate_block());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3403
    Threads::add(thread, daemon);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3404
    Threads_lock->unlock();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3405
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3406
  // Create thread group and name info from attach arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3407
  oop group = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3408
  char* thread_name = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3409
  if (args != NULL && Threads::is_supported_jni_version(args->version)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3410
    group = JNIHandles::resolve(args->group);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3411
    thread_name = args->name; // may be NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3412
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3413
  if (group == NULL) group = Universe::main_thread_group();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3414
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3415
  // Create Java level thread object and attach it to this thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3416
  bool attach_failed = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3417
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3418
    EXCEPTION_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3419
    HandleMark hm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3420
    Handle thread_group(THREAD, group);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3421
    thread->allocate_threadObj(thread_group, thread_name, daemon, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3422
    if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3423
      CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3424
      // cleanup outside the handle mark.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3425
      attach_failed = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3426
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3427
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3428
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3429
  if (attach_failed) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3430
    // Added missing cleanup
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3431
    thread->cleanup_failed_attach_current_thread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3432
    return JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3433
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3434
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3435
  // mark the thread as no longer attaching
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3436
  // this uses a fence to push the change through so we don't have
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3437
  // to regrab the threads_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3438
  thread->set_attached();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3439
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3440
  // Enable stack overflow checks
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3441
  thread->create_stack_guard_pages();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3442
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3443
  // Set java thread status.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3444
  java_lang_Thread::set_thread_status(thread->threadObj(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3445
              java_lang_Thread::RUNNABLE);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3446
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3447
  // Notify the debugger
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3448
  if (JvmtiExport::should_post_thread_life()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3449
    JvmtiExport::post_thread_start(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3450
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3451
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3452
  *(JNIEnv**)penv = thread->jni_environment();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3453
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3454
  // Now leaving the VM, so change thread_state. This is normally automatically taken care
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3455
  // of in the JVM_ENTRY. But in this situation we have to do it manually. Notice, that by
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3456
  // using ThreadStateTransition::transition, we do a callback to the safepoint code if
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3457
  // needed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3458
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3459
  ThreadStateTransition::transition_and_fence(thread, _thread_in_vm, _thread_in_native);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3460
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3461
  // Perform any platform dependent FPU setup
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3462
  os::setup_fpu();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3463
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3464
  return JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3465
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3466
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3467
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3468
jint JNICALL jni_AttachCurrentThread(JavaVM *vm, void **penv, void *_args) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3469
  DTRACE_PROBE3(hotspot_jni, AttachCurrentThread__entry, vm, penv, _args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3470
  if (!vm_created) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3471
    DTRACE_PROBE1(hotspot_jni, AttachCurrentThread__return, JNI_ERR);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3472
    return JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3473
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3474
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3475
  JNIWrapper("AttachCurrentThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3476
  jint ret = attach_current_thread(vm, penv, _args, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3477
  DTRACE_PROBE1(hotspot_jni, AttachCurrentThread__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3478
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3479
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3480
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3481
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3482
jint JNICALL jni_DetachCurrentThread(JavaVM *vm)  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3483
  DTRACE_PROBE1(hotspot_jni, DetachCurrentThread__entry, vm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3484
  VM_Exit::block_if_vm_exited();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3485
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3486
  JNIWrapper("DetachCurrentThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3487
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3488
  // If the thread has been deattacted the operations is a no-op
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3489
  if (ThreadLocalStorage::thread() == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3490
    DTRACE_PROBE1(hotspot_jni, DetachCurrentThread__return, JNI_OK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3491
    return JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3492
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3493
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3494
  JavaThread* thread = JavaThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3495
  if (thread->has_last_Java_frame()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3496
    DTRACE_PROBE1(hotspot_jni, DetachCurrentThread__return, JNI_ERR);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3497
    // Can't detach a thread that's running java, that can't work.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3498
    return JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3499
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3500
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3501
  // Safepoint support. Have to do call-back to safepoint code, if in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3502
  // middel of a safepoint operation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3503
  ThreadStateTransition::transition_from_native(thread, _thread_in_vm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3504
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3505
  // XXX: Note that JavaThread::exit() call below removes the guards on the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3506
  // stack pages set up via enable_stack_{red,yellow}_zone() calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3507
  // above in jni_AttachCurrentThread. Unfortunately, while the setting
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3508
  // of the guards is visible in jni_AttachCurrentThread above,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3509
  // the removal of the guards is buried below in JavaThread::exit()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3510
  // here. The abstraction should be more symmetrically either exposed
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3511
  // or hidden (e.g. it could probably be hidden in the same
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3512
  // (platform-dependent) methods where we do alternate stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3513
  // maintenance work?)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3514
  thread->exit(false, JavaThread::jni_detach);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3515
  delete thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3516
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3517
  DTRACE_PROBE1(hotspot_jni, DetachCurrentThread__return, JNI_OK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3518
  return JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3519
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3520
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3521
DT_RETURN_MARK_DECL(GetEnv, jint);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3522
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3523
jint JNICALL jni_GetEnv(JavaVM *vm, void **penv, jint version) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3524
  DTRACE_PROBE3(hotspot_jni, GetEnv__entry, vm, penv, version);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3525
  jint ret = JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3526
  DT_RETURN_MARK(GetEnv, jint, (const jint&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3527
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3528
  if (!vm_created) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3529
    *penv = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3530
    ret = JNI_EDETACHED;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3531
    return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3532
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3533
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3534
  if (JvmtiExport::is_jvmti_version(version)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3535
    ret = JvmtiExport::get_jvmti_interface(vm, penv, version);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3536
    return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3537
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3538
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3539
#ifndef JVMPI_VERSION_1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3540
// need these in order to be polite about older agents
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3541
#define JVMPI_VERSION_1   ((jint)0x10000001)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3542
#define JVMPI_VERSION_1_1 ((jint)0x10000002)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3543
#define JVMPI_VERSION_1_2 ((jint)0x10000003)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3544
#endif // !JVMPI_VERSION_1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3545
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3546
  Thread* thread = ThreadLocalStorage::thread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3547
  if (thread != NULL && thread->is_Java_thread()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3548
    if (Threads::is_supported_jni_version_including_1_1(version)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3549
      *(JNIEnv**)penv = ((JavaThread*) thread)->jni_environment();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3550
      ret = JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3551
      return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3552
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3553
    } else if (version == JVMPI_VERSION_1 ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3554
               version == JVMPI_VERSION_1_1 ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3555
               version == JVMPI_VERSION_1_2) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3556
      tty->print_cr("ERROR: JVMPI, an experimental interface, is no longer supported.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3557
      tty->print_cr("Please use the supported interface: the JVM Tool Interface (JVM TI).");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3558
      ret = JNI_EVERSION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3559
      return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3560
    } else if (JvmtiExport::is_jvmdi_version(version)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3561
      tty->print_cr("FATAL ERROR: JVMDI is no longer supported.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3562
      tty->print_cr("Please use the supported interface: the JVM Tool Interface (JVM TI).");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3563
      ret = JNI_EVERSION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3564
      return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3565
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3566
      *penv = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3567
      ret = JNI_EVERSION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3568
      return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3569
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3570
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3571
    *penv = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3572
    ret = JNI_EDETACHED;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3573
    return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3574
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3575
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3576
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3577
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3578
jint JNICALL jni_AttachCurrentThreadAsDaemon(JavaVM *vm, void **penv, void *_args) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3579
  DTRACE_PROBE3(hotspot_jni, AttachCurrentThreadAsDaemon__entry, vm, penv, _args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3580
  if (!vm_created) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3581
    DTRACE_PROBE1(hotspot_jni, AttachCurrentThreadAsDaemon__return, JNI_ERR);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3582
    return JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3583
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3584
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3585
  JNIWrapper("AttachCurrentThreadAsDaemon");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3586
  jint ret = attach_current_thread(vm, penv, _args, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3587
  DTRACE_PROBE1(hotspot_jni, AttachCurrentThreadAsDaemon__return, ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3588
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3589
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3590
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3591
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3592
} // End extern "C"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3593
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3594
const struct JNIInvokeInterface_ jni_InvokeInterface = {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3595
    NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3596
    NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3597
    NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3598
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3599
    jni_DestroyJavaVM,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3600
    jni_AttachCurrentThread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3601
    jni_DetachCurrentThread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3602
    jni_GetEnv,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3603
    jni_AttachCurrentThreadAsDaemon
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3604
};