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