hotspot/src/share/vm/prims/jni.cpp
author minqi
Mon, 12 Nov 2012 14:03:53 -0800
changeset 14477 95e66ea71f71
parent 14391 df0a1573d5bd
child 14490 5bb45ed999ee
permissions -rw-r--r--
6830717: replay of compilations would help with debugging Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method. Reviewed-by: kvn, twisti, sspitsyn Contributed-by: yumin.qi@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
12939
c0a910665895 7171703: JNI DefineClass crashes client VM when first parameter is NULL
fparain
parents: 11480
diff changeset
     2
 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
13958
f5598a86c223 7170638: Use DTRACE_PROBE[N] in JNI Set and SetStatic Field.
coleenp
parents: 13952
diff changeset
     3
 * Copyright (c) 2012 Red Hat, Inc.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    19
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5403
diff changeset
    20
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5403
diff changeset
    21
 * 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
    22
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    25
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    26
#include "precompiled.hpp"
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
    27
#include "ci/ciReplay.hpp"
13087
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 12939
diff changeset
    28
#include "classfile/altHashing.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    29
#include "classfile/classLoader.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    30
#include "classfile/javaClasses.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    31
#include "classfile/symbolTable.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    32
#include "classfile/systemDictionary.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    33
#include "classfile/vmSymbols.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    34
#include "interpreter/linkResolver.hpp"
9176
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
    35
#ifndef SERIALGC
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
    36
#include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
    37
#endif // SERIALGC
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13087
diff changeset
    38
#include "memory/allocation.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    39
#include "memory/allocation.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    40
#include "memory/gcLocker.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    41
#include "memory/oopFactory.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    42
#include "memory/universe.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    43
#include "oops/instanceKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    44
#include "oops/instanceOop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    45
#include "oops/markOop.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
    46
#include "oops/method.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    47
#include "oops/objArrayKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    48
#include "oops/objArrayOop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    49
#include "oops/oop.inline.hpp"
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
    50
#include "oops/symbol.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    51
#include "oops/typeArrayKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    52
#include "oops/typeArrayOop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    53
#include "prims/jni.h"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    54
#include "prims/jniCheck.hpp"
11480
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 11247
diff changeset
    55
#include "prims/jniExport.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    56
#include "prims/jniFastGetField.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    57
#include "prims/jvm.h"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    58
#include "prims/jvm_misc.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    59
#include "prims/jvmtiExport.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    60
#include "prims/jvmtiThreadState.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    61
#include "runtime/compilationPolicy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    62
#include "runtime/fieldDescriptor.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    63
#include "runtime/fprofiler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    64
#include "runtime/handles.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    65
#include "runtime/interfaceSupport.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    66
#include "runtime/java.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    67
#include "runtime/javaCalls.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    68
#include "runtime/jfieldIDWorkaround.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    69
#include "runtime/reflection.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    70
#include "runtime/sharedRuntime.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    71
#include "runtime/signature.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    72
#include "runtime/vm_operations.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    73
#include "services/runtimeService.hpp"
11480
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 11247
diff changeset
    74
#include "trace/tracing.hpp"
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 11247
diff changeset
    75
#include "trace/traceEventTypes.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    76
#include "utilities/defaultStream.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    77
#include "utilities/dtrace.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    78
#include "utilities/events.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    79
#include "utilities/histogram.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    80
#ifdef TARGET_OS_FAMILY_linux
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    81
# include "os_linux.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    82
# include "thread_linux.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    83
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    84
#ifdef TARGET_OS_FAMILY_solaris
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    85
# include "os_solaris.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    86
# include "thread_solaris.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    87
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    88
#ifdef TARGET_OS_FAMILY_windows
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    89
# include "os_windows.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    90
# include "thread_windows.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    91
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10546
diff changeset
    92
#ifdef TARGET_OS_FAMILY_bsd
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10546
diff changeset
    93
# include "os_bsd.inline.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10546
diff changeset
    94
# include "thread_bsd.inline.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10546
diff changeset
    95
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
static jint CurrentVersion = JNI_VERSION_1_6;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
// The DT_RETURN_MARK macros create a scoped object to fire the dtrace
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
// '-return' probe regardless of the return path is taken out of the function.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
// Methods that have multiple return paths use this to avoid having to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
// instrument each return path.  Methods that use CHECK or THROW must use this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
// since those macros can cause an immedate uninstrumented return.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
// In order to get the return value, a reference to the variable containing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
// the return value must be passed to the contructor of the object, and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
// the return value must be set before return (since the mark object has
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
// a reference to it).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
// Example:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
// DT_RETURN_MARK_DECL(SomeFunc, int);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
// JNI_ENTRY(int, SomeFunc, ...)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
//   int return_value = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
//   DT_RETURN_MARK(SomeFunc, int, (const int&)return_value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
//   foo(CHECK_0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
//   return_value = 5;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
//   return return_value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
// JNI_END
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   120
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
#define DT_RETURN_MARK_DECL(name, type)                                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  HS_DTRACE_PROBE_DECL1(hotspot_jni, name##__return, type);                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  DTRACE_ONLY(                                                             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
    class DTraceReturnProbeMark_##name {                                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
     public:                                                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
      const type& _ret_ref;                                                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
      DTraceReturnProbeMark_##name(const type& v) : _ret_ref(v) {}         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
      ~DTraceReturnProbeMark_##name() {                                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
        HS_DTRACE_PROBE1(hotspot_jni, name##__return, _ret_ref);           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
      }                                                                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
    }                                                                      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
// Void functions are simpler since there's no return value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
#define DT_VOID_RETURN_MARK_DECL(name)                                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  HS_DTRACE_PROBE_DECL0(hotspot_jni, name##__return);                      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  DTRACE_ONLY(                                                             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
    class DTraceReturnProbeMark_##name {                                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
     public:                                                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
      ~DTraceReturnProbeMark_##name() {                                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
        HS_DTRACE_PROBE0(hotspot_jni, name##__return);                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
      }                                                                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
    }                                                                      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   145
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   146
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   147
#define DT_RETURN_MARK_DECL(name, type, probe)                             \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   148
  DTRACE_ONLY(                                                             \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   149
    class DTraceReturnProbeMark_##name {                                   \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   150
     public:                                                               \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   151
      const type& _ret_ref;                                                \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   152
      DTraceReturnProbeMark_##name(const type& v) : _ret_ref(v) {}         \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   153
      ~DTraceReturnProbeMark_##name() {                                    \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   154
        probe;                                                             \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   155
      }                                                                    \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   156
    }                                                                      \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   157
  )
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   158
// Void functions are simpler since there's no return value
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   159
#define DT_VOID_RETURN_MARK_DECL(name, probe)                              \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   160
  DTRACE_ONLY(                                                             \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   161
    class DTraceReturnProbeMark_##name {                                   \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   162
     public:                                                               \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   163
      ~DTraceReturnProbeMark_##name() {                                    \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   164
        probe;                                                             \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   165
      }                                                                    \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   166
    }                                                                      \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   167
  )
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   168
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
// Place these macros in the function to mark the return.  Non-void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
// functions need the type and address of the return value.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
#define DT_RETURN_MARK(name, type, ref) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  DTRACE_ONLY( DTraceReturnProbeMark_##name dtrace_return_mark(ref) )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
#define DT_VOID_RETURN_MARK(name) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  DTRACE_ONLY( DTraceReturnProbeMark_##name dtrace_return_mark )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
// Use these to select distinct code for floating-point vs. non-floating point
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
// situations.  Used from within common macros where we need slightly
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
// different behavior for Float/Double
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
#define FP_SELECT_Boolean(intcode, fpcode) intcode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
#define FP_SELECT_Byte(intcode, fpcode)    intcode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
#define FP_SELECT_Char(intcode, fpcode)    intcode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
#define FP_SELECT_Short(intcode, fpcode)   intcode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
#define FP_SELECT_Object(intcode, fpcode)  intcode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
#define FP_SELECT_Int(intcode, fpcode)     intcode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
#define FP_SELECT_Long(intcode, fpcode)    intcode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
#define FP_SELECT_Float(intcode, fpcode)   fpcode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
#define FP_SELECT_Double(intcode, fpcode)  fpcode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
#define FP_SELECT(TypeName, intcode, fpcode) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  FP_SELECT_##TypeName(intcode, fpcode)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
#define COMMA ,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
// Choose DT_RETURN_MARK macros  based on the type: float/double -> void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
// (dtrace doesn't do FP yet)
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   197
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
#define DT_RETURN_MARK_DECL_FOR(TypeName, name, type) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  FP_SELECT(TypeName, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
    DT_RETURN_MARK_DECL(name, type), DT_VOID_RETURN_MARK_DECL(name) )
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   201
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   202
#define DT_RETURN_MARK_DECL_FOR(TypeName, name, type, probe)    \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   203
  FP_SELECT(TypeName, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   204
    DT_RETURN_MARK_DECL(name, type, probe), DT_VOID_RETURN_MARK_DECL(name, probe) )
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   205
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
#define DT_RETURN_MARK_FOR(TypeName, name, type, ref) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  FP_SELECT(TypeName, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
    DT_RETURN_MARK(name, type, ref), DT_VOID_RETURN_MARK(name) )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
// out-of-line helpers for class jfieldIDWorkaround:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   213
bool jfieldIDWorkaround::is_valid_jfieldID(Klass* k, jfieldID id) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  if (jfieldIDWorkaround::is_instance_jfieldID(k, id)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
    uintptr_t as_uint = (uintptr_t) id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
    intptr_t offset = raw_instance_offset(id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
    if (is_checked_jfieldID(id)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
      if (!klass_hash_ok(k, id)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
        return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
    }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   222
    return InstanceKlass::cast(k)->contains_field_offset(offset);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
    JNIid* result = (JNIid*) id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
    return result != NULL && result->is_static_field_id();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
    return result != NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   234
intptr_t jfieldIDWorkaround::encode_klass_hash(Klass* k, intptr_t offset) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  if (offset <= small_offset_mask) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   236
    Klass* field_klass = k;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   237
    Klass* 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
   238
    // 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
   239
    // be the owner of fields embedded in the header.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   240
    while (InstanceKlass::cast(super_klass)->has_nonstatic_fields() &&
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   241
           InstanceKlass::cast(super_klass)->contains_field_offset(offset)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
      field_klass = super_klass;   // super contains the field also
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
      super_klass = Klass::cast(field_klass)->super();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
    debug_only(No_Safepoint_Verifier nosafepoint;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
    uintptr_t klass_hash = field_klass->identity_hash();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
    return ((klass_hash & klass_mask) << klass_shift) | checked_mask_in_place;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
#if 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
    #ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
      ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
      warning("VerifyJNIFields: long offset %d in %s", offset, Klass::cast(k)->external_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
    #endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
    return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   261
bool jfieldIDWorkaround::klass_hash_ok(Klass* k, jfieldID id) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  uintptr_t as_uint = (uintptr_t) id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  intptr_t klass_hash = (as_uint >> klass_shift) & klass_mask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
    debug_only(No_Safepoint_Verifier nosafepoint;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
    // Could use a non-blocking query for identity_hash here...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
    if ((k->identity_hash() & klass_mask) == klass_hash)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
    k = Klass::cast(k)->super();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  } while (k != NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   274
void jfieldIDWorkaround::verify_instance_jfieldID(Klass* k, jfieldID id) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  guarantee(jfieldIDWorkaround::is_instance_jfieldID(k, id), "must be an instance field" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  uintptr_t as_uint = (uintptr_t) id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  intptr_t offset = raw_instance_offset(id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  if (VerifyJNIFields) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
    if (is_checked_jfieldID(id)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
      guarantee(klass_hash_ok(k, id),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
    "Bug in native code: jfieldID class must match object");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
#if 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
      #ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
      if (Verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  warning("VerifyJNIFields: unverified offset %d for %s", offset, Klass::cast(k)->external_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
      #endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   293
  guarantee(InstanceKlass::cast(k)->contains_field_offset(offset),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
      "Bug in native code: jfieldID offset must address interior of object");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
// Pick a reasonable higher bound for local capacity requested
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
// for EnsureLocalCapacity and PushLocalFrame.  We don't want it too
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
// high because a test (or very unusual application) may try to allocate
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
// that many handles and run out of swap space.  An implementation is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
// permitted to allocate more handles than the ensured capacity, so this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
// value is set high enough to prevent compatibility problems.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
const int MAX_REASONABLE_LOCAL_CAPACITY = 4*K;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
// Wrapper to trace JNI functions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  Histogram* JNIHistogram;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  static volatile jint JNIHistogram_lock = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  class JNITraceWrapper : public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
   public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
    JNITraceWrapper(const char* format, ...) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
      if (TraceJNICalls) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
        va_list ap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
        va_start(ap, format);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
        tty->print("JNI ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
        tty->vprint_cr(format, ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
        va_end(ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  class JNIHistogramElement : public HistogramElement {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
    public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
     JNIHistogramElement(const char* name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
  JNIHistogramElement::JNIHistogramElement(const char* elementName) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
    _name = elementName;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
    uintx count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
    while (Atomic::cmpxchg(1, &JNIHistogram_lock, 0) != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
      while (OrderAccess::load_acquire(&JNIHistogram_lock) != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
        count +=1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
        if ( (WarnOnStalledSpinLock > 0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
          && (count % WarnOnStalledSpinLock == 0)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
          warning("JNIHistogram_lock seems to be stalled");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
    if(JNIHistogram == NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
      JNIHistogram = new Histogram("JNI Call Counts",100);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
    JNIHistogram->add_element(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
    Atomic::dec(&JNIHistogram_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  #define JNICountWrapper(arg)                                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
     static JNIHistogramElement* e = new JNIHistogramElement(arg); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
      /* 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
   355
     if (e != NULL) e->increment_count()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  #define JNIWrapper(arg) JNICountWrapper(arg); JNITraceWrapper(arg)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  #define JNIWrapper(arg)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
// Implementation of JNI entries
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   364
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
DT_RETURN_MARK_DECL(DefineClass, jclass);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   366
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   367
DT_RETURN_MARK_DECL(DefineClass, jclass
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   368
                    , HOTSPOT_JNI_DEFINECLASS_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   369
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
JNI_ENTRY(jclass, jni_DefineClass(JNIEnv *env, const char *name, jobject loaderRef,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
                                  const jbyte *buf, jsize bufLen))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  JNIWrapper("DefineClass");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   375
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
  DTRACE_PROBE5(hotspot_jni, DefineClass__entry,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
    env, name, loaderRef, buf, bufLen);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   378
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   379
  HOTSPOT_JNI_DEFINECLASS_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   380
    env, (char*) name, loaderRef, (char*) buf, bufLen);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   381
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  jclass cls = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  DT_RETURN_MARK(DefineClass, jclass, (const jclass&)cls);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
12939
c0a910665895 7171703: JNI DefineClass crashes client VM when first parameter is NULL
fparain
parents: 11480
diff changeset
   385
  TempNewSymbol class_name = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  // Since exceptions can be thrown, class initialization can take place
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
  // if name is NULL no check for class name in .class stream has to be made.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
  if (name != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
    const int str_len = (int)strlen(name);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
   390
    if (str_len > Symbol::max_length()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
      // It's impossible to create this class;  the name cannot fit
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
      // into the constant pool.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
      THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
    }
12939
c0a910665895 7171703: JNI DefineClass crashes client VM when first parameter is NULL
fparain
parents: 11480
diff changeset
   395
    class_name = SymbolTable::new_symbol(name, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  ClassFileStream st((u1*) buf, bufLen, NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  Handle class_loader (THREAD, JNIHandles::resolve(loaderRef));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  if (UsePerfData && !class_loader.is_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
    // check whether the current caller thread holds the lock or not.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
    // If not, increment the corresponding counter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
    if (ObjectSynchronizer::
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
        query_lock_ownership((JavaThread*)THREAD, class_loader) !=
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
        ObjectSynchronizer::owner_self) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
      ClassLoader::sync_JNIDefineClassLockFreeCounter()->inc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   410
  Klass* k = SystemDictionary::resolve_from_stream(class_name, class_loader,
3820
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 2269
diff changeset
   411
                                                     Handle(), &st, true,
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 2269
diff changeset
   412
                                                     CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
2269
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   414
  if (TraceClassResolution && k != NULL) {
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   415
    trace_class_resolution(k);
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   416
  }
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   417
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  cls = (jclass)JNIHandles::make_local(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
    env, Klass::cast(k)->java_mirror());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
  return cls;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
static bool first_time_FindClass = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   427
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
DT_RETURN_MARK_DECL(FindClass, jclass);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   429
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   430
DT_RETURN_MARK_DECL(FindClass, jclass
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   431
                    , HOTSPOT_JNI_FINDCLASS_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   432
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
JNI_ENTRY(jclass, jni_FindClass(JNIEnv *env, const char *name))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
  JNIWrapper("FindClass");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   436
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  DTRACE_PROBE2(hotspot_jni, FindClass__entry, env, name);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   438
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   439
  HOTSPOT_JNI_FINDCLASS_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   440
                              env, (char *)name);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   441
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  jclass result = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
  DT_RETURN_MARK(FindClass, jclass, (const jclass&)result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  // Remember if we are the first invocation of jni_FindClass
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  bool first_time = first_time_FindClass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
  first_time_FindClass = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  // Sanity check the name:  it cannot be null or larger than the maximum size
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
  // 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
   452
  if (name == NULL || (int)strlen(name) > Symbol::max_length()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
    THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  //%note jni_3
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
  Handle loader;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  Handle protection_domain;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
  // Find calling class
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
  instanceKlassHandle k (THREAD, thread->security_get_caller_class(0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
  if (k.not_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
    loader = Handle(THREAD, k->class_loader());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
    // Special handling to make sure JNI_OnLoad and JNI_OnUnload are executed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
    // in the correct class context.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
    if (loader.is_null() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
        k->name() == vmSymbols::java_lang_ClassLoader_NativeLibrary()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
      JavaValue result(T_OBJECT);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
      JavaCalls::call_static(&result, k,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
   469
                                      vmSymbols::getFromClass_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
   470
                                      vmSymbols::void_class_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
                                      thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
      if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
        Handle ex(thread, thread->pending_exception());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
        CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
        THROW_HANDLE_0(ex);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
      oop mirror = (oop) result.get_jobject();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
      loader = Handle(THREAD,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   479
        InstanceKlass::cast(java_lang_Class::as_Klass(mirror))->class_loader());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
      protection_domain = Handle(THREAD,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   481
        InstanceKlass::cast(java_lang_Class::as_Klass(mirror))->protection_domain());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
    // We call ClassLoader.getSystemClassLoader to obtain the system class loader.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
    loader = Handle(THREAD, SystemDictionary::java_system_loader());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
   488
  TempNewSymbol sym = SymbolTable::new_symbol(name, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
  result = find_class_from_class_loader(env, sym, true, loader,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
                                        protection_domain, true, thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
2269
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   492
  if (TraceClassResolution && result != NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   493
    trace_class_resolution(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(result)));
2269
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   494
  }
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
   495
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
  // If we were the first invocation of jni_FindClass, we enable compilation again
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  // rather than just allowing invocation counter to overflow and decay.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  // Controlled by flag DelayCompilationDuringStartup.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
  if (first_time && !CompileTheWorld)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
    CompilationPolicy::completed_vm_startup();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   505
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
DT_RETURN_MARK_DECL(FromReflectedMethod, jmethodID);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   507
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   508
DT_RETURN_MARK_DECL(FromReflectedMethod, jmethodID
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   509
                    , HOTSPOT_JNI_FROMREFLECTEDMETHOD_RETURN((uintptr_t)_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   510
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
JNI_ENTRY(jmethodID, jni_FromReflectedMethod(JNIEnv *env, jobject method))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
  JNIWrapper("FromReflectedMethod");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   514
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
  DTRACE_PROBE2(hotspot_jni, FromReflectedMethod__entry, env, method);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   516
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   517
  HOTSPOT_JNI_FROMREFLECTEDMETHOD_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   518
                                        env, method);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   519
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
  jmethodID ret = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
  DT_RETURN_MARK(FromReflectedMethod, jmethodID, (const jmethodID&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
  // method is a handle to a java.lang.reflect.Method object
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  oop reflected  = JNIHandles::resolve_non_null(method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
  oop mirror     = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
  int slot       = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4561
diff changeset
   528
  if (reflected->klass() == SystemDictionary::reflect_Constructor_klass()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
    mirror = java_lang_reflect_Constructor::clazz(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
    slot   = java_lang_reflect_Constructor::slot(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
  } else {
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4561
diff changeset
   532
    assert(reflected->klass() == SystemDictionary::reflect_Method_klass(), "wrong type");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
    mirror = java_lang_reflect_Method::clazz(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
    slot   = java_lang_reflect_Method::slot(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   536
  Klass* k     = java_lang_Class::as_Klass(mirror);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
  KlassHandle k1(THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  // Make sure class is initialized before handing id's out to methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  Klass::cast(k1())->initialize(CHECK_NULL);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   541
  Method* m = InstanceKlass::cast(k1())->method_with_idnum(slot);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
  ret = m==NULL? NULL : m->jmethod_id();  // return NULL if reflected method deleted
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   546
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
DT_RETURN_MARK_DECL(FromReflectedField, jfieldID);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   548
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   549
DT_RETURN_MARK_DECL(FromReflectedField, jfieldID
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   550
                    , HOTSPOT_JNI_FROMREFLECTEDFIELD_RETURN((uintptr_t)_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   551
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
JNI_ENTRY(jfieldID, jni_FromReflectedField(JNIEnv *env, jobject field))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
  JNIWrapper("FromReflectedField");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   555
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
  DTRACE_PROBE2(hotspot_jni, FromReflectedField__entry, env, field);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   557
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   558
  HOTSPOT_JNI_FROMREFLECTEDFIELD_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   559
                                       env, field);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   560
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
  jfieldID ret = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
  DT_RETURN_MARK(FromReflectedField, jfieldID, (const jfieldID&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
  // field is a handle to a java.lang.reflect.Field object
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
  oop reflected   = JNIHandles::resolve_non_null(field);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
  oop mirror      = java_lang_reflect_Field::clazz(reflected);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   567
  Klass* k      = java_lang_Class::as_Klass(mirror);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
  int slot        = java_lang_reflect_Field::slot(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
  int modifiers   = java_lang_reflect_Field::modifiers(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
  KlassHandle k1(THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
  // Make sure class is initialized before handing id's out to fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
  Klass::cast(k1())->initialize(CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
  // First check if this is a static field
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
  if (modifiers & JVM_ACC_STATIC) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   577
    intptr_t offset = InstanceKlass::cast(k1())->field_offset( slot );
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   578
    JNIid* id = InstanceKlass::cast(k1())->jni_id_for(offset);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
    assert(id != NULL, "corrupt Field object");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
    debug_only(id->set_is_static_field_id();)
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   581
    // A jfieldID for a static field is a JNIid specifying the field holder and the offset within the Klass*
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
    ret = jfieldIDWorkaround::to_static_jfieldID(id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
    return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
  // The slot is the index of the field description in the field-array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
  // The jfieldID is the offset of the field within the object
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
  // It may also have hash bits for k, if VerifyJNIFields is turned on.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   589
  intptr_t offset = InstanceKlass::cast(k1())->field_offset( slot );
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   590
  assert(InstanceKlass::cast(k1())->contains_field_offset(offset), "stay within object");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
  ret = jfieldIDWorkaround::to_instance_jfieldID(k1(), offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   595
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
DT_RETURN_MARK_DECL(ToReflectedMethod, jobject);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   597
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   598
DT_RETURN_MARK_DECL(ToReflectedMethod, jobject
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   599
                    , HOTSPOT_JNI_TOREFLECTEDMETHOD_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   600
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
JNI_ENTRY(jobject, jni_ToReflectedMethod(JNIEnv *env, jclass cls, jmethodID method_id, jboolean isStatic))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
  JNIWrapper("ToReflectedMethod");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   604
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
  DTRACE_PROBE4(hotspot_jni, ToReflectedMethod__entry, env, cls, method_id, isStatic);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   606
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   607
  HOTSPOT_JNI_TOREFLECTEDMETHOD_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   608
                                      env, cls, (uintptr_t) method_id, isStatic);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   609
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
  jobject ret = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
  DT_RETURN_MARK(ToReflectedMethod, jobject, (const jobject&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   613
  methodHandle m (THREAD, Method::resolve_jmethod_id(method_id));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
  assert(m->is_static() == (isStatic != 0), "jni_ToReflectedMethod access flags doesn't match");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
  oop reflection_method;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
  if (m->is_initializer()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
    reflection_method = Reflection::new_constructor(m, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
    reflection_method = Reflection::new_method(m, UseNewReflection, false, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
  ret = JNIHandles::make_local(env, reflection_method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   625
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
DT_RETURN_MARK_DECL(GetSuperclass, jclass);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   627
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   628
DT_RETURN_MARK_DECL(GetSuperclass, jclass
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   629
                    , HOTSPOT_JNI_GETSUPERCLASS_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   630
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
JNI_ENTRY(jclass, jni_GetSuperclass(JNIEnv *env, jclass sub))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
  JNIWrapper("GetSuperclass");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   634
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
  DTRACE_PROBE2(hotspot_jni, GetSuperclass__entry, env, sub);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   636
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   637
  HOTSPOT_JNI_GETSUPERCLASS_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   638
                                  env, sub);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   639
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
  jclass obj = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
  DT_RETURN_MARK(GetSuperclass, jclass, (const jclass&)obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
  oop mirror = JNIHandles::resolve_non_null(sub);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
  // primitive classes return NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
  if (java_lang_Class::is_primitive(mirror)) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
  // Rules of Class.getSuperClass as implemented by KLass::java_super:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
  // arrays return Object
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
  // interfaces return NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
  // proper classes return Klass::super()
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   651
  Klass* k = java_lang_Class::as_Klass(mirror);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
  if (Klass::cast(k)->is_interface()) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
  // return mirror for superclass
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   655
  Klass* super = Klass::cast(k)->java_super();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
  // super2 is the value computed by the compiler's getSuperClass intrinsic:
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   657
  debug_only(Klass* super2 = ( Klass::cast(k)->oop_is_array()
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4561
diff changeset
   658
                                 ? SystemDictionary::Object_klass()
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
                                 : Klass::cast(k)->super() ) );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
  assert(super == super2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
         "java_super computation depends on interface, array, other super");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
  obj = (super == NULL) ? NULL : (jclass) JNIHandles::make_local(Klass::cast(super)->java_mirror());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
  return obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
JNI_QUICK_ENTRY(jboolean, jni_IsAssignableFrom(JNIEnv *env, jclass sub, jclass super))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
  JNIWrapper("IsSubclassOf");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   668
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
  DTRACE_PROBE3(hotspot_jni, IsAssignableFrom__entry, env, sub, super);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   670
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   671
  HOTSPOT_JNI_ISASSIGNABLEFROM_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   672
                                     env, sub, super);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   673
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
  oop sub_mirror   = JNIHandles::resolve_non_null(sub);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
  oop super_mirror = JNIHandles::resolve_non_null(super);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
  if (java_lang_Class::is_primitive(sub_mirror) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
      java_lang_Class::is_primitive(super_mirror)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
    jboolean ret = (sub_mirror == super_mirror);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   679
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
    DTRACE_PROBE1(hotspot_jni, IsAssignableFrom__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   681
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   682
    HOTSPOT_JNI_ISASSIGNABLEFROM_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   683
                                        ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   684
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
    return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   687
  Klass* sub_klass   = java_lang_Class::as_Klass(sub_mirror);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   688
  Klass* super_klass = java_lang_Class::as_Klass(super_mirror);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
  assert(sub_klass != NULL && super_klass != NULL, "invalid arguments to jni_IsAssignableFrom");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
  jboolean ret = Klass::cast(sub_klass)->is_subtype_of(super_klass) ?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
                   JNI_TRUE : JNI_FALSE;
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   692
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
  DTRACE_PROBE1(hotspot_jni, IsAssignableFrom__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   694
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   695
  HOTSPOT_JNI_ISASSIGNABLEFROM_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   696
                                      ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   697
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   701
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
DT_RETURN_MARK_DECL(Throw, jint);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   703
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   704
DT_RETURN_MARK_DECL(Throw, jint
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   705
                    , HOTSPOT_JNI_THROW_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   706
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
JNI_ENTRY(jint, jni_Throw(JNIEnv *env, jthrowable obj))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
  JNIWrapper("Throw");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   710
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
  DTRACE_PROBE2(hotspot_jni, Throw__entry, env, obj);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   712
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   713
  HOTSPOT_JNI_THROW_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   714
 env, obj);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   715
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
  jint ret = JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
  DT_RETURN_MARK(Throw, jint, (const jint&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
  THROW_OOP_(JNIHandles::resolve(obj), JNI_OK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   723
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
DT_RETURN_MARK_DECL(ThrowNew, jint);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   725
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   726
DT_RETURN_MARK_DECL(ThrowNew, jint
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   727
                    , HOTSPOT_JNI_THROWNEW_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   728
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
JNI_ENTRY(jint, jni_ThrowNew(JNIEnv *env, jclass clazz, const char *message))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
  JNIWrapper("ThrowNew");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   732
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
  DTRACE_PROBE3(hotspot_jni, ThrowNew__entry, env, clazz, message);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   734
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   735
  HOTSPOT_JNI_THROWNEW_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   736
                             env, clazz, (char *) message);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   737
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
  jint ret = JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
  DT_RETURN_MARK(ThrowNew, jint, (const jint&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   741
  InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
   742
  Symbol*  name = k->name();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
  Handle class_loader (THREAD,  k->class_loader());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
  Handle protection_domain (THREAD, k->protection_domain());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
  THROW_MSG_LOADER_(name, (char *)message, class_loader, protection_domain, JNI_OK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
// JNI functions only transform a pending async exception to a synchronous
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
// exception in ExceptionOccurred and ExceptionCheck calls, since
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
// delivering an async exception in other places won't change the native
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
// code's control flow and would be harmful when native code further calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
// JNI functions with a pending exception. Async exception is also checked
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
// during the call, so ExceptionOccurred/ExceptionCheck won't return
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
// false but deliver the async exception at the very end during
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
// state transition.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
static void jni_check_async_exceptions(JavaThread *thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
  assert(thread == Thread::current(), "must be itself");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
  thread->check_and_handle_async_exceptions();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
JNI_ENTRY_NO_PRESERVE(jthrowable, jni_ExceptionOccurred(JNIEnv *env))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
  JNIWrapper("ExceptionOccurred");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   766
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
  DTRACE_PROBE1(hotspot_jni, ExceptionOccurred__entry, env);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   768
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   769
  HOTSPOT_JNI_EXCEPTIONOCCURRED_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   770
                                      env);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   771
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
  jni_check_async_exceptions(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
  oop exception = thread->pending_exception();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
  jthrowable ret = (jthrowable) JNIHandles::make_local(env, exception);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   775
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
  DTRACE_PROBE1(hotspot_jni, ExceptionOccurred__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   777
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   778
  HOTSPOT_JNI_EXCEPTIONOCCURRED_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   779
                                       ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   780
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
JNI_ENTRY_NO_PRESERVE(void, jni_ExceptionDescribe(JNIEnv *env))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
  JNIWrapper("ExceptionDescribe");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   787
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
  DTRACE_PROBE1(hotspot_jni, ExceptionDescribe__entry, env);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   789
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   790
  HOTSPOT_JNI_EXCEPTIONDESCRIBE_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   791
                                      env);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   792
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
  if (thread->has_pending_exception()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
    Handle ex(thread, thread->pending_exception());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
    thread->clear_pending_exception();
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4561
diff changeset
   796
    if (ex->is_a(SystemDictionary::ThreadDeath_klass())) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
      // Don't print anything if we are being killed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
      jio_fprintf(defaultStream::error_stream(), "Exception ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
      if (thread != NULL && thread->threadObj() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
        ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
        jio_fprintf(defaultStream::error_stream(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
        "in thread \"%s\" ", thread->get_thread_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
      }
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4561
diff changeset
   805
      if (ex->is_a(SystemDictionary::Throwable_klass())) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
        JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
        JavaCalls::call_virtual(&result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
                                ex,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
                                KlassHandle(THREAD,
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4561
diff changeset
   810
                                  SystemDictionary::Throwable_klass()),
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
   811
                                vmSymbols::printStackTrace_name(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
   812
                                vmSymbols::void_method_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
                                THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
        // If an exception is thrown in the call it gets thrown away. Not much
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
        // we can do with it. The native code that calls this, does not check
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
        // for the exception - hence, it might still be in the thread when DestroyVM gets
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
        // called, potentially causing a few asserts to trigger - since no pending exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
        // is expected.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
        CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
        ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
        jio_fprintf(defaultStream::error_stream(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
        ". Uncaught exception of type %s.",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
        Klass::cast(ex->klass())->external_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
  }
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   828
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
  DTRACE_PROBE(hotspot_jni, ExceptionDescribe__return);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   830
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   831
  HOTSPOT_JNI_EXCEPTIONDESCRIBE_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   832
                                       );
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   833
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
JNI_QUICK_ENTRY(void, jni_ExceptionClear(JNIEnv *env))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
  JNIWrapper("ExceptionClear");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   839
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
  DTRACE_PROBE1(hotspot_jni, ExceptionClear__entry, env);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   841
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   842
  HOTSPOT_JNI_EXCEPTIONCLEAR_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   843
                                   env);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   844
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
  // The jni code might be using this API to clear java thrown exception.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
  // So just mark jvmti thread exception state as exception caught.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
  JvmtiThreadState *state = JavaThread::current()->jvmti_thread_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
  if (state != NULL && state->is_exception_detected()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
    state->set_exception_caught();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
  thread->clear_pending_exception();
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   853
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
  DTRACE_PROBE(hotspot_jni, ExceptionClear__return);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   855
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   856
  HOTSPOT_JNI_EXCEPTIONCLEAR_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   857
                                    );
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   858
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
JNI_ENTRY(void, jni_FatalError(JNIEnv *env, const char *msg))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
  JNIWrapper("FatalError");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   864
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
  DTRACE_PROBE2(hotspot_jni, FatalError__entry, env, msg);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   866
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   867
  HOTSPOT_JNI_FATALERROR_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   868
                               env, (char *) msg);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   869
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
  tty->print_cr("FATAL ERROR in native method: %s", msg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
  thread->print_stack();
773
01daf7c809b1 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 360
diff changeset
   872
  os::abort(); // Dump core and abort
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
JNI_ENTRY(jint, jni_PushLocalFrame(JNIEnv *env, jint capacity))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
  JNIWrapper("PushLocalFrame");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   878
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
  DTRACE_PROBE2(hotspot_jni, PushLocalFrame__entry, env, capacity);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   880
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   881
  HOTSPOT_JNI_PUSHLOCALFRAME_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   882
                                   env, capacity);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   883
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
  //%note jni_11
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
  if (capacity < 0 && capacity > MAX_REASONABLE_LOCAL_CAPACITY) {
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   886
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
    DTRACE_PROBE1(hotspot_jni, PushLocalFrame__return, JNI_ERR);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   888
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   889
    HOTSPOT_JNI_PUSHLOCALFRAME_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   890
                                      (uint32_t)JNI_ERR);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   891
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
    return JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
  JNIHandleBlock* old_handles = thread->active_handles();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
  JNIHandleBlock* new_handles = JNIHandleBlock::allocate_block(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
  assert(new_handles != NULL, "should not be NULL");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
  new_handles->set_pop_frame_link(old_handles);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
  thread->set_active_handles(new_handles);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
  jint ret = JNI_OK;
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   900
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
  DTRACE_PROBE1(hotspot_jni, PushLocalFrame__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   902
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   903
  HOTSPOT_JNI_PUSHLOCALFRAME_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   904
                                    ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   905
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
JNI_ENTRY(jobject, jni_PopLocalFrame(JNIEnv *env, jobject result))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
  JNIWrapper("PopLocalFrame");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   912
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
  DTRACE_PROBE2(hotspot_jni, PopLocalFrame__entry, env, result);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   914
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   915
  HOTSPOT_JNI_POPLOCALFRAME_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   916
                                  env, result);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   917
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
  //%note jni_11
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
  Handle result_handle(thread, JNIHandles::resolve(result));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
  JNIHandleBlock* old_handles = thread->active_handles();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
  JNIHandleBlock* new_handles = old_handles->pop_frame_link();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
  if (new_handles != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
    // 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
   924
    // This way code will still work if PopLocalFrame is called without a corresponding
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
    // PushLocalFrame call. Note that we set the pop_frame_link to NULL explicitly, otherwise
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
    // the release_block call will release the blocks.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
    thread->set_active_handles(new_handles);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
    old_handles->set_pop_frame_link(NULL);              // clear link we won't release new_handles below
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
    JNIHandleBlock::release_block(old_handles, thread); // may block
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
    result = JNIHandles::make_local(thread, result_handle());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
  }
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   932
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
  DTRACE_PROBE1(hotspot_jni, PopLocalFrame__return, result);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   934
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   935
  HOTSPOT_JNI_POPLOCALFRAME_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   936
                                   result);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   937
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
JNI_ENTRY(jobject, jni_NewGlobalRef(JNIEnv *env, jobject ref))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
  JNIWrapper("NewGlobalRef");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   944
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
  DTRACE_PROBE2(hotspot_jni, NewGlobalRef__entry, env, ref);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   946
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   947
  HOTSPOT_JNI_NEWGLOBALREF_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   948
                                 env, ref);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   949
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   950
  Handle ref_handle(thread, JNIHandles::resolve(ref));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
  jobject ret = JNIHandles::make_global(ref_handle);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   952
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
  DTRACE_PROBE1(hotspot_jni, NewGlobalRef__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   954
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   955
  HOTSPOT_JNI_NEWGLOBALREF_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   956
                                  ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   957
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   958
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   959
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
// Must be JNI_ENTRY (with HandleMark)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
JNI_ENTRY_NO_PRESERVE(void, jni_DeleteGlobalRef(JNIEnv *env, jobject ref))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
  JNIWrapper("DeleteGlobalRef");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   964
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
  DTRACE_PROBE2(hotspot_jni, DeleteGlobalRef__entry, env, ref);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   966
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   967
  HOTSPOT_JNI_DELETEGLOBALREF_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   968
                                    env, ref);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   969
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
  JNIHandles::destroy_global(ref);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   971
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
  DTRACE_PROBE(hotspot_jni, DeleteGlobalRef__return);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   973
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   974
  HOTSPOT_JNI_DELETEGLOBALREF_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   975
                                     );
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   976
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
JNI_QUICK_ENTRY(void, jni_DeleteLocalRef(JNIEnv *env, jobject obj))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
  JNIWrapper("DeleteLocalRef");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   981
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
  DTRACE_PROBE2(hotspot_jni, DeleteLocalRef__entry, env, obj);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   983
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   984
  HOTSPOT_JNI_DELETELOCALREF_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   985
                                   env, obj);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   986
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
  JNIHandles::destroy_local(obj);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   988
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
  DTRACE_PROBE(hotspot_jni, DeleteLocalRef__return);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   990
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   991
  HOTSPOT_JNI_DELETELOCALREF_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   992
                                    );
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   993
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
JNI_QUICK_ENTRY(jboolean, jni_IsSameObject(JNIEnv *env, jobject r1, jobject r2))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
  JNIWrapper("IsSameObject");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   998
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
  DTRACE_PROBE3(hotspot_jni, IsSameObject__entry, env, r1, r2);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1000
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1001
  HOTSPOT_JNI_ISSAMEOBJECT_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1002
                                 env, r1, r2);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1003
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
  oop a = JNIHandles::resolve(r1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
  oop b = JNIHandles::resolve(r2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
  jboolean ret = (a == b) ? JNI_TRUE : JNI_FALSE;
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1007
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
  DTRACE_PROBE1(hotspot_jni, IsSameObject__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1009
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1010
  HOTSPOT_JNI_ISSAMEOBJECT_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1011
                                  ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1012
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
JNI_ENTRY(jobject, jni_NewLocalRef(JNIEnv *env, jobject ref))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
  JNIWrapper("NewLocalRef");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1019
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
  DTRACE_PROBE2(hotspot_jni, NewLocalRef__entry, env, ref);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1021
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1022
  HOTSPOT_JNI_NEWLOCALREF_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1023
                                env, ref);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1024
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
  jobject ret = JNIHandles::make_local(env, JNIHandles::resolve(ref));
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1026
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
  DTRACE_PROBE1(hotspot_jni, NewLocalRef__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1028
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1029
  HOTSPOT_JNI_NEWLOCALREF_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1030
                                 ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1031
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
JNI_LEAF(jint, jni_EnsureLocalCapacity(JNIEnv *env, jint capacity))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
  JNIWrapper("EnsureLocalCapacity");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1037
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
  DTRACE_PROBE2(hotspot_jni, EnsureLocalCapacity__entry, env, capacity);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1039
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1040
  HOTSPOT_JNI_ENSURELOCALCAPACITY_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1041
                                        env, capacity);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1042
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
  jint ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
  if (capacity >= 0 && capacity <= MAX_REASONABLE_LOCAL_CAPACITY) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
    ret = JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
    ret = JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
  }
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1049
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
  DTRACE_PROBE1(hotspot_jni, EnsureLocalCapacity__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1051
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1052
  HOTSPOT_JNI_ENSURELOCALCAPACITY_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1053
                                         ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1054
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
// Return the Handle Type
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
JNI_LEAF(jobjectRefType, jni_GetObjectRefType(JNIEnv *env, jobject obj))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
  JNIWrapper("GetObjectRefType");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1061
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
  DTRACE_PROBE2(hotspot_jni, GetObjectRefType__entry, env, obj);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1063
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1064
  HOTSPOT_JNI_GETOBJECTREFTYPE_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1065
                                     env, obj);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1066
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
  jobjectRefType ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
  if (JNIHandles::is_local_handle(thread, obj) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
      JNIHandles::is_frame_handle(thread, obj))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
    ret = JNILocalRefType;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
  else if (JNIHandles::is_global_handle(obj))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
    ret = JNIGlobalRefType;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
  else if (JNIHandles::is_weak_global_handle(obj))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
    ret = JNIWeakGlobalRefType;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
  else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
    ret = JNIInvalidRefType;
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1077
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
  DTRACE_PROBE1(hotspot_jni, GetObjectRefType__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1079
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1080
  HOTSPOT_JNI_GETOBJECTREFTYPE_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1081
                                      (void *) ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1082
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1084
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1086
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
class JNI_ArgumentPusher : public SignatureIterator {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1089
  JavaCallArguments*  _arguments;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
  virtual void get_bool   () = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
  virtual void get_char   () = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1093
  virtual void get_short  () = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
  virtual void get_byte   () = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
  virtual void get_int    () = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
  virtual void get_long   () = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
  virtual void get_float  () = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
  virtual void get_double () = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
  virtual void get_object () = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1101
  JNI_ArgumentPusher(Symbol* signature) : SignatureIterator(signature) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
    this->_return_type = T_ILLEGAL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
    _arguments = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
  virtual void iterate( uint64_t fingerprint ) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
  void set_java_argument_object(JavaCallArguments *arguments) { _arguments = arguments; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
  inline void do_bool()                     { if (!is_return_type()) get_bool();   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
  inline void do_char()                     { if (!is_return_type()) get_char();   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
  inline void do_short()                    { if (!is_return_type()) get_short();  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
  inline void do_byte()                     { if (!is_return_type()) get_byte();   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
  inline void do_int()                      { if (!is_return_type()) get_int();    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
  inline void do_long()                     { if (!is_return_type()) get_long();   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
  inline void do_float()                    { if (!is_return_type()) get_float();  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
  inline void do_double()                   { if (!is_return_type()) get_double(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
  inline void do_object(int begin, int end) { if (!is_return_type()) get_object(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
  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
  1121
  inline void do_void()                     { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1122
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1123
  JavaCallArguments* arguments()     { return _arguments; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
  void push_receiver(Handle h)       { _arguments->push_oop(h); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
class JNI_ArgumentPusherVaArg : public JNI_ArgumentPusher {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
  va_list _ap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
  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
  1133
  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
  1134
  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
  1135
  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
  1136
  inline void get_int()    { _arguments->push_int(va_arg(_ap, jint)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
  // 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
  1139
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
  inline void get_long()   { _arguments->push_long(va_arg(_ap, jlong)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
  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
  1142
  inline void get_double() { _arguments->push_double(va_arg(_ap, jdouble)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
  inline void get_object() { jobject l = va_arg(_ap, jobject);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
                             _arguments->push_oop(Handle((oop *)l, false)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
  inline void set_ap(va_list rap) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1147
#ifdef va_copy
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1148
    va_copy(_ap, rap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1149
#elif defined (__va_copy)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
    __va_copy(_ap, rap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
    _ap = rap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1156
 public:
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1157
  JNI_ArgumentPusherVaArg(Symbol* signature, va_list rap)
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1158
       : JNI_ArgumentPusher(signature) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1159
    set_ap(rap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1160
  }
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1161
  JNI_ArgumentPusherVaArg(jmethodID method_id, va_list rap)
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1162
      : JNI_ArgumentPusher(Method::resolve_jmethod_id(method_id)->signature()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
    set_ap(rap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1164
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1165
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1166
  // Optimized path if we have the bitvector form of signature
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
  void iterate( uint64_t fingerprint ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
    if ( fingerprint == UCONST64(-1) ) SignatureIterator::iterate();// Must be too many arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
    else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
      _return_type = (BasicType)((fingerprint >> static_feature_size) &
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
                                  result_feature_mask);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
      assert(fingerprint, "Fingerprint should not be 0");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
      fingerprint = fingerprint >> (static_feature_size + result_feature_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
      while ( 1 ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
        switch ( fingerprint & parameter_feature_mask ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
          case bool_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
          case char_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
          case short_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1180
          case byte_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1181
          case int_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
            get_int();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
          case obj_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
            get_object();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
          case long_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1188
            get_long();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1190
          case float_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
            get_float();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
          case double_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
            get_double();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
          case done_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1197
            return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
          default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
            ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1201
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1202
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1203
        fingerprint >>= parameter_feature_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1208
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1209
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1210
class JNI_ArgumentPusherArray : public JNI_ArgumentPusher {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1211
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1212
  const jvalue *_ap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1213
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1214
  inline void get_bool()   { _arguments->push_int((jint)(_ap++)->z); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1215
  inline void get_char()   { _arguments->push_int((jint)(_ap++)->c); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1216
  inline void get_short()  { _arguments->push_int((jint)(_ap++)->s); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1217
  inline void get_byte()   { _arguments->push_int((jint)(_ap++)->b); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1218
  inline void get_int()    { _arguments->push_int((jint)(_ap++)->i); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1219
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1220
  inline void get_long()   { _arguments->push_long((_ap++)->j);  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1221
  inline void get_float()  { _arguments->push_float((_ap++)->f); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1222
  inline void get_double() { _arguments->push_double((_ap++)->d);}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1223
  inline void get_object() { _arguments->push_oop(Handle((oop *)(_ap++)->l, false)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1224
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1225
  inline void set_ap(const jvalue *rap) { _ap = rap; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1226
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1227
 public:
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1228
  JNI_ArgumentPusherArray(Symbol* signature, const jvalue *rap)
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1229
       : JNI_ArgumentPusher(signature) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1230
    set_ap(rap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
  }
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1232
  JNI_ArgumentPusherArray(jmethodID method_id, const jvalue *rap)
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1233
      : JNI_ArgumentPusher(Method::resolve_jmethod_id(method_id)->signature()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1234
    set_ap(rap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1235
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1236
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1237
  // Optimized path if we have the bitvector form of signature
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1238
  void iterate( uint64_t fingerprint ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1239
    if ( fingerprint == UCONST64(-1) ) SignatureIterator::iterate(); // Must be too many arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1240
    else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1241
      _return_type = (BasicType)((fingerprint >> static_feature_size) &
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1242
                                  result_feature_mask);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1243
      assert(fingerprint, "Fingerprint should not be 0");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1244
      fingerprint = fingerprint >> (static_feature_size + result_feature_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1245
      while ( 1 ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1246
        switch ( fingerprint & parameter_feature_mask ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1247
          case bool_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1248
            get_bool();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1249
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1250
          case char_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1251
            get_char();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1252
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1253
          case short_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1254
            get_short();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1255
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1256
          case byte_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1257
            get_byte();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1258
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1259
          case int_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1260
            get_int();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1261
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1262
          case obj_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1263
            get_object();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1264
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1265
          case long_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1266
            get_long();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1267
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1268
          case float_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1269
            get_float();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1270
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1271
          case double_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1272
            get_double();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1273
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1274
          case done_parm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1275
            return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1276
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1277
          default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1278
            ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1279
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1280
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1281
        fingerprint >>= parameter_feature_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1282
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1283
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1284
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1285
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1286
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1287
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1288
enum JNICallType {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1289
  JNI_STATIC,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1290
  JNI_VIRTUAL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1291
  JNI_NONVIRTUAL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1292
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1293
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1294
static methodHandle jni_resolve_interface_call(Handle recv, methodHandle method, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1295
  assert(!method.is_null() , "method should not be null");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1296
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1297
  KlassHandle recv_klass; // Default to NULL (use of ?: can confuse gcc)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1298
  if (recv.not_null()) recv_klass = KlassHandle(THREAD, recv->klass());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1299
  KlassHandle spec_klass (THREAD, method->method_holder());
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1300
  Symbol*  name  = method->name();
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1301
  Symbol*  signature  = method->signature();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1302
  CallInfo info;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1303
  LinkResolver::resolve_interface_call(info, recv, recv_klass,  spec_klass, name, signature, KlassHandle(), false, true, CHECK_(methodHandle()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1304
  return info.selected_method();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1305
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1306
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1307
static methodHandle jni_resolve_virtual_call(Handle recv, methodHandle method, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1308
  assert(!method.is_null() , "method should not be null");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1309
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1310
  KlassHandle recv_klass; // Default to NULL (use of ?: can confuse gcc)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1311
  if (recv.not_null()) recv_klass = KlassHandle(THREAD, recv->klass());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1312
  KlassHandle spec_klass (THREAD, method->method_holder());
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1313
  Symbol*  name  = method->name();
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1314
  Symbol*  signature  = method->signature();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1315
  CallInfo info;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1316
  LinkResolver::resolve_virtual_call(info, recv, recv_klass,  spec_klass, name, signature, KlassHandle(), false, true, CHECK_(methodHandle()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1317
  return info.selected_method();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1318
}
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
static void jni_invoke_static(JNIEnv *env, JavaValue* result, jobject receiver, JNICallType call_type, jmethodID method_id, JNI_ArgumentPusher *args, TRAPS) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1323
  methodHandle method(THREAD, Method::resolve_jmethod_id(method_id));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1324
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1325
  // Create object to hold arguments for the JavaCall, and associate it with
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1326
  // the jni parser
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1327
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1328
  int number_of_parameters = method->size_of_parameters();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1329
  JavaCallArguments java_args(number_of_parameters);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1330
  args->set_java_argument_object(&java_args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1331
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1332
  assert(method->is_static(), "method should be static");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1333
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1334
  // Fill out JavaCallArguments object
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1335
  args->iterate( Fingerprinter(method).fingerprint() );
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1336
  // Initialize result type
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1337
  result->set_type(args->get_ret_type());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1338
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1339
  // Invoke the method. Result is returned as oop.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1340
  JavaCalls::call(result, method, &java_args, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1341
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1342
  // Convert result
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1343
  if (result->get_type() == T_OBJECT || result->get_type() == T_ARRAY) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1344
    result->set_jobject(JNIHandles::make_local(env, (oop) result->get_jobject()));
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
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1349
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
  1350
  oop recv = JNIHandles::resolve(receiver);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1351
  if (recv == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1352
    THROW(vmSymbols::java_lang_NullPointerException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1353
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1354
  Handle h_recv(THREAD, recv);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1355
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1356
  int number_of_parameters;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1357
  Method* selected_method;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1358
  {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1359
    Method* m = Method::resolve_jmethod_id(method_id);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1360
    number_of_parameters = m->size_of_parameters();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1361
    Klass* holder = m->method_holder();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1362
    if (!(Klass::cast(holder))->is_interface()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1363
      // non-interface call -- for that little speed boost, don't handlize
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1364
      debug_only(No_Safepoint_Verifier nosafepoint;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1365
      if (call_type == JNI_VIRTUAL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1366
        // jni_GetMethodID makes sure class is linked and initialized
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1367
        // so m should have a valid vtable index.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1368
        int vtbl_index = m->vtable_index();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1369
        if (vtbl_index != Method::nonvirtual_vtable_index) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1370
          Klass* k = h_recv->klass();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1371
          // k might be an arrayKlassOop but all vtables start at
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1372
          // the same place. The cast is to avoid virtual call and assertion.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1373
          InstanceKlass *ik = (InstanceKlass*)k;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1374
          selected_method = ik->method_at_vtable(vtbl_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1375
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1376
          // final method
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1377
          selected_method = m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1378
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1379
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1380
        // JNI_NONVIRTUAL call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1381
        selected_method = m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1382
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1383
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1384
      // interface call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1385
      KlassHandle h_holder(THREAD, holder);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1386
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1387
      int itbl_index = m->cached_itable_index();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1388
      if (itbl_index == -1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1389
        itbl_index = klassItable::compute_itable_index(m);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1390
        m->set_cached_itable_index(itbl_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1391
        // the above may have grabbed a lock, 'm' and anything non-handlized can't be used again
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1392
      }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1393
      Klass* k = h_recv->klass();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1394
      selected_method = InstanceKlass::cast(k)->method_at_itable(h_holder(), itbl_index, CHECK);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1395
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1396
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1397
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1398
  methodHandle method(THREAD, selected_method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1399
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1400
  // Create object to hold arguments for the JavaCall, and associate it with
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1401
  // the jni parser
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1402
  ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1403
  JavaCallArguments java_args(number_of_parameters);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1404
  args->set_java_argument_object(&java_args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1405
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1406
  // handle arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1407
  assert(!method->is_static(), "method should not be static");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1408
  args->push_receiver(h_recv); // Push jobject handle
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1409
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1410
  // Fill out JavaCallArguments object
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1411
  args->iterate( Fingerprinter(method).fingerprint() );
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1412
  // Initialize result type
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1413
  result->set_type(args->get_ret_type());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1414
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1415
  // Invoke the method. Result is returned as oop.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1416
  JavaCalls::call(result, method, &java_args, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1417
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1418
  // Convert result
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1419
  if (result->get_type() == T_OBJECT || result->get_type() == T_ARRAY) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1420
    result->set_jobject(JNIHandles::make_local(env, (oop) result->get_jobject()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1421
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1422
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1423
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1424
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1425
static instanceOop alloc_object(jclass clazz, TRAPS) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1426
  KlassHandle k(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1427
  Klass::cast(k())->check_valid_for_instantiation(false, CHECK_NULL);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1428
  InstanceKlass::cast(k())->initialize(CHECK_NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1429
  instanceOop ih = InstanceKlass::cast(k())->allocate_instance(THREAD);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1430
  return ih;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1431
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1432
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1433
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1434
DT_RETURN_MARK_DECL(AllocObject, jobject);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1435
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1436
DT_RETURN_MARK_DECL(AllocObject, jobject
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1437
                    , HOTSPOT_JNI_ALLOCOBJECT_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1438
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1439
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1440
JNI_ENTRY(jobject, jni_AllocObject(JNIEnv *env, jclass clazz))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1441
  JNIWrapper("AllocObject");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1442
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1443
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1444
  DTRACE_PROBE2(hotspot_jni, AllocObject__entry, env, clazz);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1445
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1446
  HOTSPOT_JNI_ALLOCOBJECT_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1447
                                env, clazz);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1448
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1449
  jobject ret = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1450
  DT_RETURN_MARK(AllocObject, jobject, (const jobject&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1451
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1452
  instanceOop i = alloc_object(clazz, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1453
  ret = JNIHandles::make_local(env, i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1454
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1455
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1456
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1457
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1458
DT_RETURN_MARK_DECL(NewObjectA, jobject);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1459
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1460
DT_RETURN_MARK_DECL(NewObjectA, jobject
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1461
                    , HOTSPOT_JNI_NEWOBJECTA_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1462
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1463
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1464
JNI_ENTRY(jobject, jni_NewObjectA(JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1465
  JNIWrapper("NewObjectA");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1466
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1467
  DTRACE_PROBE3(hotspot_jni, NewObjectA__entry, env, clazz, methodID);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1468
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1469
  HOTSPOT_JNI_NEWOBJECTA_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1470
                               env, clazz, (uintptr_t) methodID);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1471
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1472
  jobject obj = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1473
  DT_RETURN_MARK(NewObjectA, jobject, (const jobject)obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1474
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1475
  instanceOop i = alloc_object(clazz, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1476
  obj = JNIHandles::make_local(env, i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1477
  JavaValue jvalue(T_VOID);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1478
  JNI_ArgumentPusherArray ap(methodID, args);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1479
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1480
  return obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1481
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1482
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1483
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1484
DT_RETURN_MARK_DECL(NewObjectV, jobject);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1485
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1486
DT_RETURN_MARK_DECL(NewObjectV, jobject
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1487
                    , HOTSPOT_JNI_NEWOBJECTV_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1488
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1489
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1490
JNI_ENTRY(jobject, jni_NewObjectV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1491
  JNIWrapper("NewObjectV");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1492
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1493
  DTRACE_PROBE3(hotspot_jni, NewObjectV__entry, env, clazz, methodID);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1494
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1495
  HOTSPOT_JNI_NEWOBJECTV_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1496
                               env, clazz, (uintptr_t) methodID);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1497
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1498
  jobject obj = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1499
  DT_RETURN_MARK(NewObjectV, jobject, (const jobject&)obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1500
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1501
  instanceOop i = alloc_object(clazz, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1502
  obj = JNIHandles::make_local(env, i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1503
  JavaValue jvalue(T_VOID);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1504
  JNI_ArgumentPusherVaArg ap(methodID, args);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1505
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1506
  return obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1507
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1508
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1509
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1510
DT_RETURN_MARK_DECL(NewObject, jobject);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1511
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1512
DT_RETURN_MARK_DECL(NewObject, jobject
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1513
                    , HOTSPOT_JNI_NEWOBJECT_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1514
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1515
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1516
JNI_ENTRY(jobject, jni_NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1517
  JNIWrapper("NewObject");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1518
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1519
  DTRACE_PROBE3(hotspot_jni, NewObject__entry, env, clazz, methodID);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1520
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1521
  HOTSPOT_JNI_NEWOBJECT_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1522
                              env, clazz, (uintptr_t) methodID);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1523
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1524
  jobject obj = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1525
  DT_RETURN_MARK(NewObject, jobject, (const jobject&)obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1526
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1527
  instanceOop i = alloc_object(clazz, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1528
  obj = JNIHandles::make_local(env, i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1529
  va_list args;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1530
  va_start(args, methodID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1531
  JavaValue jvalue(T_VOID);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1532
  JNI_ArgumentPusherVaArg ap(methodID, args);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1533
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1534
  va_end(args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1535
  return obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1536
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1537
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1538
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1539
JNI_ENTRY(jclass, jni_GetObjectClass(JNIEnv *env, jobject obj))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1540
  JNIWrapper("GetObjectClass");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1541
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1542
  DTRACE_PROBE2(hotspot_jni, GetObjectClass__entry, env, obj);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1543
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1544
  HOTSPOT_JNI_GETOBJECTCLASS_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1545
                                   env, obj);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1546
#endif /* USDT2 */
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1547
  Klass* k = JNIHandles::resolve_non_null(obj)->klass();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1548
  jclass ret =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1549
    (jclass) JNIHandles::make_local(env, Klass::cast(k)->java_mirror());
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1550
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1551
  DTRACE_PROBE1(hotspot_jni, GetObjectClass__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1552
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1553
  HOTSPOT_JNI_GETOBJECTCLASS_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1554
                                    ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1555
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1556
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1557
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1558
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1559
JNI_QUICK_ENTRY(jboolean, jni_IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1560
  JNIWrapper("IsInstanceOf");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1561
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1562
  DTRACE_PROBE3(hotspot_jni, IsInstanceOf__entry, env, obj, clazz);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1563
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1564
  HOTSPOT_JNI_ISINSTANCEOF_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1565
                                 env, obj, clazz);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1566
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1567
  jboolean ret = JNI_TRUE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1568
  if (obj != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1569
    ret = JNI_FALSE;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1570
    Klass* k = java_lang_Class::as_Klass(
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1571
      JNIHandles::resolve_non_null(clazz));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1572
    if (k != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1573
      ret = JNIHandles::resolve_non_null(obj)->is_a(k) ? JNI_TRUE : JNI_FALSE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1574
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1575
  }
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1576
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1577
  DTRACE_PROBE1(hotspot_jni, IsInstanceOf__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1578
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1579
  HOTSPOT_JNI_ISINSTANCEOF_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1580
                                  ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1581
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1582
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1583
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1584
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1585
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1586
static jmethodID get_method_id(JNIEnv *env, jclass clazz, const char *name_str,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1587
                               const char *sig, bool is_static, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1588
  // %%%% This code should probably just call into a method in the LinkResolver
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1589
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1590
  // The class should have been loaded (we have an instance of the class
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1591
  // passed in) so the method and signature should already be in the symbol
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1592
  // 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
  1593
  const char *name_to_probe = (name_str == NULL)
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1594
                        ? vmSymbols::object_initializer_name()->as_C_string()
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1595
                        : name_str;
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1596
  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
  1597
  TempNewSymbol signature = SymbolTable::probe(sig, (int)strlen(sig));
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1598
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1599
  if (name == NULL || signature == NULL) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1600
    THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(), name_str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1601
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1602
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1603
  // Throw a NoSuchMethodError exception if we have an instance of a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1604
  // primitive java.lang.Class
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1605
  if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(clazz))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1606
    THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(), name_str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1607
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1608
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1609
  KlassHandle klass(THREAD,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1610
               java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1611
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1612
  // Make sure class is linked and initialized before handing id's out to
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1613
  // Method*s.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1614
  Klass::cast(klass())->initialize(CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1615
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1616
  Method* m;
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1617
  if (name == vmSymbols::object_initializer_name() ||
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1618
      name == vmSymbols::class_initializer_name()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1619
    // Never search superclasses for constructors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1620
    if (klass->oop_is_instance()) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1621
      m = InstanceKlass::cast(klass())->find_method(name, signature);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1622
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1623
      m = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1624
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1625
  } else {
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1626
    m = klass->lookup_method(name, signature);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1627
    // Look up interfaces
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1628
    if (m == NULL && klass->oop_is_instance()) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  1629
      m = InstanceKlass::cast(klass())->lookup_method_in_all_interfaces(name,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1630
                                                                   signature);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1631
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1632
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1633
  if (m == NULL || (m->is_static() != is_static)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1634
    THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(), name_str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1635
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1636
  return m->jmethod_id();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1637
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1638
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1639
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1640
JNI_ENTRY(jmethodID, jni_GetMethodID(JNIEnv *env, jclass clazz,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1641
          const char *name, const char *sig))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1642
  JNIWrapper("GetMethodID");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1643
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1644
  DTRACE_PROBE4(hotspot_jni, GetMethodID__entry, env, clazz, name, sig);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1645
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1646
  HOTSPOT_JNI_GETMETHODID_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1647
                                env, clazz, (char *) name, (char *) sig);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1648
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1649
  jmethodID ret = get_method_id(env, clazz, name, sig, false, thread);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1650
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1651
  DTRACE_PROBE1(hotspot_jni, GetMethodID__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1652
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1653
  HOTSPOT_JNI_GETMETHODID_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1654
                                 (uintptr_t) ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1655
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1656
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1657
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1658
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1659
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1660
JNI_ENTRY(jmethodID, jni_GetStaticMethodID(JNIEnv *env, jclass clazz,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1661
          const char *name, const char *sig))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1662
  JNIWrapper("GetStaticMethodID");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1663
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1664
  DTRACE_PROBE4(hotspot_jni, GetStaticMethodID__entry, env, clazz, name, sig);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1665
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1666
  HOTSPOT_JNI_GETSTATICMETHODID_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1667
                                      env, (char *) clazz, (char *) name, (char *)sig);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1668
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1669
  jmethodID ret = get_method_id(env, clazz, name, sig, true, thread);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1670
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1671
  DTRACE_PROBE1(hotspot_jni, GetStaticMethodID__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1672
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1673
  HOTSPOT_JNI_GETSTATICMETHODID_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1674
                                       (uintptr_t) ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1675
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1676
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1677
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1678
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1679
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1680
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1681
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1682
// Calling Methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1683
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1684
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1685
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1686
#define DEFINE_CALLMETHOD(ResultType, Result, Tag) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1687
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1688
  DT_RETURN_MARK_DECL_FOR(Result, Call##Result##Method, ResultType);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1689
  DT_RETURN_MARK_DECL_FOR(Result, Call##Result##MethodV, ResultType);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1690
  DT_RETURN_MARK_DECL_FOR(Result, Call##Result##MethodA, ResultType);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1691
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1692
JNI_ENTRY(ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1693
          jni_Call##Result##Method(JNIEnv *env, jobject obj, jmethodID methodID, ...)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1694
  JNIWrapper("Call" XSTR(Result) "Method"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1695
\
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1696
  DTRACE_PROBE3(hotspot_jni, Call##Result##Method__entry, env, obj, methodID); \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1697
  ResultType ret = 0;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1698
  DT_RETURN_MARK_FOR(Result, Call##Result##Method, ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1699
                     (const ResultType&)ret);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1700
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1701
  va_list args; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1702
  va_start(args, methodID); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1703
  JavaValue jvalue(Tag); \
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1704
  JNI_ArgumentPusherVaArg ap(methodID, args); \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1705
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1706
  va_end(args); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1707
  ret = jvalue.get_##ResultType(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1708
  return ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1709
JNI_END \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1710
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1711
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1712
JNI_ENTRY(ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1713
          jni_Call##Result##MethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1714
  JNIWrapper("Call" XSTR(Result) "MethodV"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1715
\
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1716
  DTRACE_PROBE3(hotspot_jni, Call##Result##MethodV__entry, env, obj, methodID); \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1717
  ResultType ret = 0;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1718
  DT_RETURN_MARK_FOR(Result, Call##Result##MethodV, ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1719
                     (const ResultType&)ret);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1720
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1721
  JavaValue jvalue(Tag); \
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1722
  JNI_ArgumentPusherVaArg ap(methodID, args); \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1723
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1724
  ret = jvalue.get_##ResultType(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1725
  return ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1726
JNI_END \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1727
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1728
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1729
JNI_ENTRY(ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1730
          jni_Call##Result##MethodA(JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1731
  JNIWrapper("Call" XSTR(Result) "MethodA"); \
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1732
  DTRACE_PROBE3(hotspot_jni, Call##Result##MethodA__entry, env, obj, methodID); \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1733
  ResultType ret = 0;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1734
  DT_RETURN_MARK_FOR(Result, Call##Result##MethodA, ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1735
                     (const ResultType&)ret);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1736
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1737
  JavaValue jvalue(Tag); \
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1738
  JNI_ArgumentPusherArray ap(methodID, args); \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1739
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1740
  ret = jvalue.get_##ResultType(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1741
  return ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1742
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1743
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1744
// the runtime type of subword integral basic types is integer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1745
DEFINE_CALLMETHOD(jboolean, Boolean, T_BOOLEAN)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1746
DEFINE_CALLMETHOD(jbyte,    Byte,    T_BYTE)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1747
DEFINE_CALLMETHOD(jchar,    Char,    T_CHAR)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1748
DEFINE_CALLMETHOD(jshort,   Short,   T_SHORT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1749
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1750
DEFINE_CALLMETHOD(jobject,  Object,  T_OBJECT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1751
DEFINE_CALLMETHOD(jint,     Int,     T_INT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1752
DEFINE_CALLMETHOD(jlong,    Long,    T_LONG)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1753
DEFINE_CALLMETHOD(jfloat,   Float,   T_FLOAT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1754
DEFINE_CALLMETHOD(jdouble,  Double,  T_DOUBLE)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1755
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1756
DT_VOID_RETURN_MARK_DECL(CallVoidMethod);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1757
DT_VOID_RETURN_MARK_DECL(CallVoidMethodV);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1758
DT_VOID_RETURN_MARK_DECL(CallVoidMethodA);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1759
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1760
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1761
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1762
#define DEFINE_CALLMETHOD(ResultType, Result, Tag \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1763
                          , EntryProbe, ReturnProbe)    \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1764
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1765
  DT_RETURN_MARK_DECL_FOR(Result, Call##Result##Method, ResultType \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1766
                          , ReturnProbe);                          \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1767
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1768
JNI_ENTRY(ResultType, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1769
          jni_Call##Result##Method(JNIEnv *env, jobject obj, jmethodID methodID, ...)) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1770
  JNIWrapper("Call" XSTR(Result) "Method"); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1771
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1772
  EntryProbe; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1773
  ResultType ret = 0;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1774
  DT_RETURN_MARK_FOR(Result, Call##Result##Method, ResultType, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1775
                     (const ResultType&)ret);\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1776
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1777
  va_list args; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1778
  va_start(args, methodID); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1779
  JavaValue jvalue(Tag); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1780
  JNI_ArgumentPusherVaArg ap(methodID, args); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1781
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1782
  va_end(args); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1783
  ret = jvalue.get_##ResultType(); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1784
  return ret;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1785
JNI_END
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1786
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1787
// the runtime type of subword integral basic types is integer
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1788
DEFINE_CALLMETHOD(jboolean, Boolean, T_BOOLEAN
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1789
                  , HOTSPOT_JNI_CALLBOOLEANMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1790
                  HOTSPOT_JNI_CALLBOOLEANMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1791
DEFINE_CALLMETHOD(jbyte,    Byte,    T_BYTE
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1792
                  , HOTSPOT_JNI_CALLBYTEMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1793
                  HOTSPOT_JNI_CALLBYTEMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1794
DEFINE_CALLMETHOD(jchar,    Char,    T_CHAR
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1795
                  , HOTSPOT_JNI_CALLCHARMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1796
                  HOTSPOT_JNI_CALLCHARMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1797
DEFINE_CALLMETHOD(jshort,   Short,   T_SHORT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1798
                  , HOTSPOT_JNI_CALLSHORTMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1799
                  HOTSPOT_JNI_CALLSHORTMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1800
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1801
DEFINE_CALLMETHOD(jobject,  Object,  T_OBJECT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1802
                  , HOTSPOT_JNI_CALLOBJECTMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1803
                  HOTSPOT_JNI_CALLOBJECTMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1804
DEFINE_CALLMETHOD(jint,     Int,     T_INT,
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1805
                  HOTSPOT_JNI_CALLINTMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1806
                  HOTSPOT_JNI_CALLINTMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1807
DEFINE_CALLMETHOD(jlong,    Long,    T_LONG
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1808
                  , HOTSPOT_JNI_CALLLONGMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1809
                  HOTSPOT_JNI_CALLLONGMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1810
// Float and double probes don't return value because dtrace doesn't currently support it
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1811
DEFINE_CALLMETHOD(jfloat,   Float,   T_FLOAT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1812
                  , HOTSPOT_JNI_CALLFLOATMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1813
                  HOTSPOT_JNI_CALLFLOATMETHOD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1814
DEFINE_CALLMETHOD(jdouble,  Double,  T_DOUBLE
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1815
                  , HOTSPOT_JNI_CALLDOUBLEMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1816
                  HOTSPOT_JNI_CALLDOUBLEMETHOD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1817
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1818
#define DEFINE_CALLMETHODV(ResultType, Result, Tag \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1819
                          , EntryProbe, ReturnProbe)    \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1820
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1821
  DT_RETURN_MARK_DECL_FOR(Result, Call##Result##MethodV, ResultType \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1822
                          , ReturnProbe);                          \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1823
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1824
JNI_ENTRY(ResultType, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1825
          jni_Call##Result##MethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1826
  JNIWrapper("Call" XSTR(Result) "MethodV"); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1827
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1828
  EntryProbe;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1829
  ResultType ret = 0;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1830
  DT_RETURN_MARK_FOR(Result, Call##Result##MethodV, ResultType, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1831
                     (const ResultType&)ret);\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1832
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1833
  JavaValue jvalue(Tag); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1834
  JNI_ArgumentPusherVaArg ap(methodID, args); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1835
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1836
  ret = jvalue.get_##ResultType(); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1837
  return ret;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1838
JNI_END
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1839
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1840
// the runtime type of subword integral basic types is integer
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1841
DEFINE_CALLMETHODV(jboolean, Boolean, T_BOOLEAN
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1842
                  , HOTSPOT_JNI_CALLBOOLEANMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1843
                  HOTSPOT_JNI_CALLBOOLEANMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1844
DEFINE_CALLMETHODV(jbyte,    Byte,    T_BYTE
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1845
                  , HOTSPOT_JNI_CALLBYTEMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1846
                  HOTSPOT_JNI_CALLBYTEMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1847
DEFINE_CALLMETHODV(jchar,    Char,    T_CHAR
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1848
                  , HOTSPOT_JNI_CALLCHARMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1849
                  HOTSPOT_JNI_CALLCHARMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1850
DEFINE_CALLMETHODV(jshort,   Short,   T_SHORT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1851
                  , HOTSPOT_JNI_CALLSHORTMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1852
                  HOTSPOT_JNI_CALLSHORTMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1853
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1854
DEFINE_CALLMETHODV(jobject,  Object,  T_OBJECT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1855
                  , HOTSPOT_JNI_CALLOBJECTMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1856
                  HOTSPOT_JNI_CALLOBJECTMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1857
DEFINE_CALLMETHODV(jint,     Int,     T_INT,
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1858
                  HOTSPOT_JNI_CALLINTMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1859
                  HOTSPOT_JNI_CALLINTMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1860
DEFINE_CALLMETHODV(jlong,    Long,    T_LONG
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1861
                  , HOTSPOT_JNI_CALLLONGMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1862
                  HOTSPOT_JNI_CALLLONGMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1863
// Float and double probes don't return value because dtrace doesn't currently support it
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1864
DEFINE_CALLMETHODV(jfloat,   Float,   T_FLOAT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1865
                  , HOTSPOT_JNI_CALLFLOATMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1866
                  HOTSPOT_JNI_CALLFLOATMETHOD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1867
DEFINE_CALLMETHODV(jdouble,  Double,  T_DOUBLE
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1868
                  , HOTSPOT_JNI_CALLDOUBLEMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1869
                  HOTSPOT_JNI_CALLDOUBLEMETHOD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1870
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1871
#define DEFINE_CALLMETHODA(ResultType, Result, Tag \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1872
                          , EntryProbe, ReturnProbe)    \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1873
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1874
  DT_RETURN_MARK_DECL_FOR(Result, Call##Result##MethodA, ResultType \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1875
                          , ReturnProbe);                          \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1876
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1877
JNI_ENTRY(ResultType, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1878
          jni_Call##Result##MethodA(JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args)) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1879
  JNIWrapper("Call" XSTR(Result) "MethodA"); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1880
  EntryProbe; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1881
  ResultType ret = 0;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1882
  DT_RETURN_MARK_FOR(Result, Call##Result##MethodA, ResultType, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1883
                     (const ResultType&)ret);\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1884
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1885
  JavaValue jvalue(Tag); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1886
  JNI_ArgumentPusherArray ap(methodID, args); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1887
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1888
  ret = jvalue.get_##ResultType(); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1889
  return ret;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1890
JNI_END
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1891
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1892
// the runtime type of subword integral basic types is integer
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1893
DEFINE_CALLMETHODA(jboolean, Boolean, T_BOOLEAN
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1894
                  , HOTSPOT_JNI_CALLBOOLEANMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1895
                  HOTSPOT_JNI_CALLBOOLEANMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1896
DEFINE_CALLMETHODA(jbyte,    Byte,    T_BYTE
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1897
                  , HOTSPOT_JNI_CALLBYTEMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1898
                  HOTSPOT_JNI_CALLBYTEMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1899
DEFINE_CALLMETHODA(jchar,    Char,    T_CHAR
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1900
                  , HOTSPOT_JNI_CALLCHARMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1901
                  HOTSPOT_JNI_CALLCHARMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1902
DEFINE_CALLMETHODA(jshort,   Short,   T_SHORT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1903
                  , HOTSPOT_JNI_CALLSHORTMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1904
                  HOTSPOT_JNI_CALLSHORTMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1905
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1906
DEFINE_CALLMETHODA(jobject,  Object,  T_OBJECT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1907
                  , HOTSPOT_JNI_CALLOBJECTMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1908
                  HOTSPOT_JNI_CALLOBJECTMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1909
DEFINE_CALLMETHODA(jint,     Int,     T_INT,
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1910
                  HOTSPOT_JNI_CALLINTMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1911
                  HOTSPOT_JNI_CALLINTMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1912
DEFINE_CALLMETHODA(jlong,    Long,    T_LONG
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1913
                  , HOTSPOT_JNI_CALLLONGMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1914
                  HOTSPOT_JNI_CALLLONGMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1915
// Float and double probes don't return value because dtrace doesn't currently support it
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1916
DEFINE_CALLMETHODA(jfloat,   Float,   T_FLOAT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1917
                  , HOTSPOT_JNI_CALLFLOATMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1918
                  HOTSPOT_JNI_CALLFLOATMETHOD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1919
DEFINE_CALLMETHODA(jdouble,  Double,  T_DOUBLE
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1920
                  , HOTSPOT_JNI_CALLDOUBLEMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1921
                  HOTSPOT_JNI_CALLDOUBLEMETHOD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1922
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1923
DT_VOID_RETURN_MARK_DECL(CallVoidMethod, HOTSPOT_JNI_CALLVOIDMETHOD_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1924
DT_VOID_RETURN_MARK_DECL(CallVoidMethodV, HOTSPOT_JNI_CALLVOIDMETHODV_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1925
DT_VOID_RETURN_MARK_DECL(CallVoidMethodA, HOTSPOT_JNI_CALLVOIDMETHODA_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1926
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1927
#endif /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1928
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1929
JNI_ENTRY(void, jni_CallVoidMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1930
  JNIWrapper("CallVoidMethod");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1931
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1932
  DTRACE_PROBE3(hotspot_jni, CallVoidMethod__entry, env, obj, methodID);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1933
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1934
  HOTSPOT_JNI_CALLVOIDMETHOD_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1935
                                   env, obj, (uintptr_t) methodID);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1936
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1937
  DT_VOID_RETURN_MARK(CallVoidMethod);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1938
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1939
  va_list args;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1940
  va_start(args, methodID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1941
  JavaValue jvalue(T_VOID);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1942
  JNI_ArgumentPusherVaArg ap(methodID, args);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1943
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1944
  va_end(args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1945
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1946
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1947
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1948
JNI_ENTRY(void, jni_CallVoidMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1949
  JNIWrapper("CallVoidMethodV");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1950
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1951
  DTRACE_PROBE3(hotspot_jni, CallVoidMethodV__entry, env, obj, methodID);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1952
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1953
  HOTSPOT_JNI_CALLVOIDMETHODV_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1954
                                    env, obj, (uintptr_t) methodID);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1955
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1956
  DT_VOID_RETURN_MARK(CallVoidMethodV);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1957
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1958
  JavaValue jvalue(T_VOID);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1959
  JNI_ArgumentPusherVaArg ap(methodID, args);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1960
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1961
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1962
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1963
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1964
JNI_ENTRY(void, jni_CallVoidMethodA(JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1965
  JNIWrapper("CallVoidMethodA");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1966
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1967
  DTRACE_PROBE3(hotspot_jni, CallVoidMethodA__entry, env, obj, methodID);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1968
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1969
  HOTSPOT_JNI_CALLVOIDMETHODA_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1970
                                    env, obj, (uintptr_t) methodID);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1971
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1972
  DT_VOID_RETURN_MARK(CallVoidMethodA);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1973
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1974
  JavaValue jvalue(T_VOID);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1975
  JNI_ArgumentPusherArray ap(methodID, args);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1976
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1977
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1978
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1979
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  1980
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1981
#define DEFINE_CALLNONVIRTUALMETHOD(ResultType, Result, Tag) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1982
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1983
  DT_RETURN_MARK_DECL_FOR(Result, CallNonvirtual##Result##Method, ResultType);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1984
  DT_RETURN_MARK_DECL_FOR(Result, CallNonvirtual##Result##MethodV, ResultType);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1985
  DT_RETURN_MARK_DECL_FOR(Result, CallNonvirtual##Result##MethodA, ResultType);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1986
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1987
JNI_ENTRY(ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1988
          jni_CallNonvirtual##Result##Method(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, ...)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1989
  JNIWrapper("CallNonvitual" XSTR(Result) "Method"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1990
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1991
  DTRACE_PROBE4(hotspot_jni, CallNonvirtual##Result##Method__entry, env, obj, cls, methodID);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1992
  ResultType ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1993
  DT_RETURN_MARK_FOR(Result, CallNonvirtual##Result##Method, ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1994
                     (const ResultType&)ret);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1995
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1996
  va_list args; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1997
  va_start(args, methodID); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1998
  JavaValue jvalue(Tag); \
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  1999
  JNI_ArgumentPusherVaArg ap(methodID, args); \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2000
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2001
  va_end(args); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2002
  ret = jvalue.get_##ResultType(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2003
  return ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2004
JNI_END \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2005
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2006
JNI_ENTRY(ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2007
          jni_CallNonvirtual##Result##MethodV(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, va_list args)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2008
  JNIWrapper("CallNonvitual" XSTR(Result) "#MethodV"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2009
  DTRACE_PROBE4(hotspot_jni, CallNonvirtual##Result##MethodV__entry, env, obj, cls, methodID);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2010
  ResultType ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2011
  DT_RETURN_MARK_FOR(Result, CallNonvirtual##Result##MethodV, ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2012
                     (const ResultType&)ret);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2013
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2014
  JavaValue jvalue(Tag); \
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  2015
  JNI_ArgumentPusherVaArg ap(methodID, args); \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2016
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2017
  ret = jvalue.get_##ResultType(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2018
  return ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2019
JNI_END \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2020
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2021
JNI_ENTRY(ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2022
          jni_CallNonvirtual##Result##MethodA(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, const jvalue *args)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2023
  JNIWrapper("CallNonvitual" XSTR(Result) "MethodA"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2024
  DTRACE_PROBE4(hotspot_jni, CallNonvirtual##Result##MethodA__entry, env, obj, cls, methodID);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2025
  ResultType ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2026
  DT_RETURN_MARK_FOR(Result, CallNonvirtual##Result##MethodA, ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2027
                     (const ResultType&)ret);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2028
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2029
  JavaValue jvalue(Tag); \
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  2030
  JNI_ArgumentPusherArray ap(methodID, args); \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2031
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2032
  ret = jvalue.get_##ResultType(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2033
  return ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2034
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2035
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2036
// the runtime type of subword integral basic types is integer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2037
DEFINE_CALLNONVIRTUALMETHOD(jboolean, Boolean, T_BOOLEAN)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2038
DEFINE_CALLNONVIRTUALMETHOD(jbyte,    Byte,    T_BYTE)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2039
DEFINE_CALLNONVIRTUALMETHOD(jchar,    Char,    T_CHAR)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2040
DEFINE_CALLNONVIRTUALMETHOD(jshort,   Short,   T_SHORT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2041
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2042
DEFINE_CALLNONVIRTUALMETHOD(jobject,  Object,  T_OBJECT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2043
DEFINE_CALLNONVIRTUALMETHOD(jint,     Int,     T_INT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2044
DEFINE_CALLNONVIRTUALMETHOD(jlong,    Long,    T_LONG)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2045
DEFINE_CALLNONVIRTUALMETHOD(jfloat,   Float,   T_FLOAT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2046
DEFINE_CALLNONVIRTUALMETHOD(jdouble,  Double,  T_DOUBLE)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2047
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2048
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2049
DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethod);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2050
DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethodV);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2051
DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethodA);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2052
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2053
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2054
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2055
#define DEFINE_CALLNONVIRTUALMETHOD(ResultType, Result, Tag \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2056
                                    , EntryProbe, ReturnProbe)      \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2057
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2058
  DT_RETURN_MARK_DECL_FOR(Result, CallNonvirtual##Result##Method, ResultType \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2059
                          , ReturnProbe);\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2060
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2061
JNI_ENTRY(ResultType, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2062
          jni_CallNonvirtual##Result##Method(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, ...)) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2063
  JNIWrapper("CallNonvitual" XSTR(Result) "Method"); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2064
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2065
  EntryProbe;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2066
  ResultType ret;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2067
  DT_RETURN_MARK_FOR(Result, CallNonvirtual##Result##Method, ResultType, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2068
                     (const ResultType&)ret);\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2069
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2070
  va_list args; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2071
  va_start(args, methodID); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2072
  JavaValue jvalue(Tag); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2073
  JNI_ArgumentPusherVaArg ap(methodID, args); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2074
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2075
  va_end(args); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2076
  ret = jvalue.get_##ResultType(); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2077
  return ret;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2078
JNI_END
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2079
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2080
// the runtime type of subword integral basic types is integer
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2081
DEFINE_CALLNONVIRTUALMETHOD(jboolean, Boolean, T_BOOLEAN
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2082
                            , HOTSPOT_JNI_CALLNONVIRTUALBOOLEANMETHOD_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2083
                            HOTSPOT_JNI_CALLNONVIRTUALBOOLEANMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2084
DEFINE_CALLNONVIRTUALMETHOD(jbyte,    Byte,    T_BYTE
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2085
                            , HOTSPOT_JNI_CALLNONVIRTUALBYTEMETHOD_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2086
                            HOTSPOT_JNI_CALLNONVIRTUALBYTEMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2087
DEFINE_CALLNONVIRTUALMETHOD(jchar,    Char,    T_CHAR
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2088
                            , HOTSPOT_JNI_CALLNONVIRTUALCHARMETHOD_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2089
                            HOTSPOT_JNI_CALLNONVIRTUALCHARMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2090
DEFINE_CALLNONVIRTUALMETHOD(jshort,   Short,   T_SHORT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2091
                            , HOTSPOT_JNI_CALLNONVIRTUALSHORTMETHOD_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2092
                            HOTSPOT_JNI_CALLNONVIRTUALSHORTMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2093
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2094
DEFINE_CALLNONVIRTUALMETHOD(jobject,  Object,  T_OBJECT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2095
                            , HOTSPOT_JNI_CALLNONVIRTUALOBJECTMETHOD_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2096
                            HOTSPOT_JNI_CALLNONVIRTUALOBJECTMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2097
DEFINE_CALLNONVIRTUALMETHOD(jint,     Int,     T_INT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2098
                            , HOTSPOT_JNI_CALLNONVIRTUALINTMETHOD_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2099
                            HOTSPOT_JNI_CALLNONVIRTUALINTMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2100
DEFINE_CALLNONVIRTUALMETHOD(jlong,    Long,    T_LONG
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2101
                            , HOTSPOT_JNI_CALLNONVIRTUALLONGMETHOD_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2102
// Float and double probes don't return value because dtrace doesn't currently support it
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2103
                            HOTSPOT_JNI_CALLNONVIRTUALLONGMETHOD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2104
DEFINE_CALLNONVIRTUALMETHOD(jfloat,   Float,   T_FLOAT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2105
                            , HOTSPOT_JNI_CALLNONVIRTUALFLOATMETHOD_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2106
                            HOTSPOT_JNI_CALLNONVIRTUALFLOATMETHOD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2107
DEFINE_CALLNONVIRTUALMETHOD(jdouble,  Double,  T_DOUBLE
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2108
                            , HOTSPOT_JNI_CALLNONVIRTUALDOUBLEMETHOD_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2109
                            HOTSPOT_JNI_CALLNONVIRTUALDOUBLEMETHOD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2110
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2111
#define DEFINE_CALLNONVIRTUALMETHODV(ResultType, Result, Tag \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2112
                                    , EntryProbe, ReturnProbe)      \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2113
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2114
  DT_RETURN_MARK_DECL_FOR(Result, CallNonvirtual##Result##MethodV, ResultType \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2115
                          , ReturnProbe);\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2116
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2117
JNI_ENTRY(ResultType, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2118
          jni_CallNonvirtual##Result##MethodV(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, va_list args)) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2119
  JNIWrapper("CallNonvitual" XSTR(Result) "MethodV"); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2120
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2121
  EntryProbe;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2122
  ResultType ret;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2123
  DT_RETURN_MARK_FOR(Result, CallNonvirtual##Result##MethodV, ResultType, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2124
                     (const ResultType&)ret);\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2125
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2126
  JavaValue jvalue(Tag); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2127
  JNI_ArgumentPusherVaArg ap(methodID, args); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2128
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2129
  ret = jvalue.get_##ResultType(); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2130
  return ret;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2131
JNI_END
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2132
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2133
// the runtime type of subword integral basic types is integer
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2134
DEFINE_CALLNONVIRTUALMETHODV(jboolean, Boolean, T_BOOLEAN
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2135
                            , HOTSPOT_JNI_CALLNONVIRTUALBOOLEANMETHODV_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2136
                            HOTSPOT_JNI_CALLNONVIRTUALBOOLEANMETHODV_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2137
DEFINE_CALLNONVIRTUALMETHODV(jbyte,    Byte,    T_BYTE
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2138
                            , HOTSPOT_JNI_CALLNONVIRTUALBYTEMETHODV_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2139
                            HOTSPOT_JNI_CALLNONVIRTUALBYTEMETHODV_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2140
DEFINE_CALLNONVIRTUALMETHODV(jchar,    Char,    T_CHAR
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2141
                            , HOTSPOT_JNI_CALLNONVIRTUALCHARMETHODV_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2142
                            HOTSPOT_JNI_CALLNONVIRTUALCHARMETHODV_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2143
DEFINE_CALLNONVIRTUALMETHODV(jshort,   Short,   T_SHORT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2144
                            , HOTSPOT_JNI_CALLNONVIRTUALSHORTMETHODV_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2145
                            HOTSPOT_JNI_CALLNONVIRTUALSHORTMETHODV_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2146
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2147
DEFINE_CALLNONVIRTUALMETHODV(jobject,  Object,  T_OBJECT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2148
                            , HOTSPOT_JNI_CALLNONVIRTUALOBJECTMETHODV_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2149
                            HOTSPOT_JNI_CALLNONVIRTUALOBJECTMETHODV_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2150
DEFINE_CALLNONVIRTUALMETHODV(jint,     Int,     T_INT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2151
                            , HOTSPOT_JNI_CALLNONVIRTUALINTMETHODV_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2152
                            HOTSPOT_JNI_CALLNONVIRTUALINTMETHODV_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2153
DEFINE_CALLNONVIRTUALMETHODV(jlong,    Long,    T_LONG
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2154
                            , HOTSPOT_JNI_CALLNONVIRTUALLONGMETHODV_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2155
// Float and double probes don't return value because dtrace doesn't currently support it
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2156
                            HOTSPOT_JNI_CALLNONVIRTUALLONGMETHODV_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2157
DEFINE_CALLNONVIRTUALMETHODV(jfloat,   Float,   T_FLOAT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2158
                            , HOTSPOT_JNI_CALLNONVIRTUALFLOATMETHODV_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2159
                            HOTSPOT_JNI_CALLNONVIRTUALFLOATMETHODV_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2160
DEFINE_CALLNONVIRTUALMETHODV(jdouble,  Double,  T_DOUBLE
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2161
                            , HOTSPOT_JNI_CALLNONVIRTUALDOUBLEMETHODV_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2162
                            HOTSPOT_JNI_CALLNONVIRTUALDOUBLEMETHODV_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2163
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2164
#define DEFINE_CALLNONVIRTUALMETHODA(ResultType, Result, Tag \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2165
                                    , EntryProbe, ReturnProbe)      \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2166
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2167
  DT_RETURN_MARK_DECL_FOR(Result, CallNonvirtual##Result##MethodA, ResultType \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2168
                          , ReturnProbe);\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2169
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2170
JNI_ENTRY(ResultType, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2171
          jni_CallNonvirtual##Result##MethodA(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, const jvalue *args)) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2172
  JNIWrapper("CallNonvitual" XSTR(Result) "MethodA"); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2173
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2174
  EntryProbe;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2175
  ResultType ret;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2176
  DT_RETURN_MARK_FOR(Result, CallNonvirtual##Result##MethodA, ResultType, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2177
                     (const ResultType&)ret);\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2178
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2179
  JavaValue jvalue(Tag); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2180
  JNI_ArgumentPusherArray ap(methodID, args); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2181
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2182
  ret = jvalue.get_##ResultType(); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2183
  return ret;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2184
JNI_END
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2185
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2186
// the runtime type of subword integral basic types is integer
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2187
DEFINE_CALLNONVIRTUALMETHODA(jboolean, Boolean, T_BOOLEAN
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2188
                            , HOTSPOT_JNI_CALLNONVIRTUALBOOLEANMETHODA_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2189
                            HOTSPOT_JNI_CALLNONVIRTUALBOOLEANMETHODA_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2190
DEFINE_CALLNONVIRTUALMETHODA(jbyte,    Byte,    T_BYTE
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2191
                            , HOTSPOT_JNI_CALLNONVIRTUALBYTEMETHODA_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2192
                            HOTSPOT_JNI_CALLNONVIRTUALBYTEMETHODA_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2193
DEFINE_CALLNONVIRTUALMETHODA(jchar,    Char,    T_CHAR
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2194
                            , HOTSPOT_JNI_CALLNONVIRTUALCHARMETHODA_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2195
                            HOTSPOT_JNI_CALLNONVIRTUALCHARMETHODA_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2196
DEFINE_CALLNONVIRTUALMETHODA(jshort,   Short,   T_SHORT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2197
                            , HOTSPOT_JNI_CALLNONVIRTUALSHORTMETHODA_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2198
                            HOTSPOT_JNI_CALLNONVIRTUALSHORTMETHODA_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2199
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2200
DEFINE_CALLNONVIRTUALMETHODA(jobject,  Object,  T_OBJECT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2201
                            , HOTSPOT_JNI_CALLNONVIRTUALOBJECTMETHODA_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2202
                            HOTSPOT_JNI_CALLNONVIRTUALOBJECTMETHODA_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2203
DEFINE_CALLNONVIRTUALMETHODA(jint,     Int,     T_INT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2204
                            , HOTSPOT_JNI_CALLNONVIRTUALINTMETHODA_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2205
                            HOTSPOT_JNI_CALLNONVIRTUALINTMETHODA_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2206
DEFINE_CALLNONVIRTUALMETHODA(jlong,    Long,    T_LONG
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2207
                            , HOTSPOT_JNI_CALLNONVIRTUALLONGMETHODA_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2208
// Float and double probes don't return value because dtrace doesn't currently support it
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2209
                            HOTSPOT_JNI_CALLNONVIRTUALLONGMETHODA_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2210
DEFINE_CALLNONVIRTUALMETHODA(jfloat,   Float,   T_FLOAT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2211
                            , HOTSPOT_JNI_CALLNONVIRTUALFLOATMETHODA_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2212
                            HOTSPOT_JNI_CALLNONVIRTUALFLOATMETHODA_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2213
DEFINE_CALLNONVIRTUALMETHODA(jdouble,  Double,  T_DOUBLE
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2214
                            , HOTSPOT_JNI_CALLNONVIRTUALDOUBLEMETHODA_ENTRY(env, obj, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2215
                            HOTSPOT_JNI_CALLNONVIRTUALDOUBLEMETHODA_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2216
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2217
DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethod
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2218
                         , HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHOD_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2219
DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethodV
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2220
                         , HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHODV_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2221
DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethodA
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2222
                         , HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHODA_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2223
#endif /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2224
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2225
JNI_ENTRY(void, jni_CallNonvirtualVoidMethod(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, ...))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2226
  JNIWrapper("CallNonvirtualVoidMethod");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2227
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2228
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2229
  DTRACE_PROBE4(hotspot_jni, CallNonvirtualVoidMethod__entry,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2230
               env, obj, cls, methodID);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2231
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2232
  HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHOD_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2233
               env, obj, cls, (uintptr_t) methodID);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2234
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2235
  DT_VOID_RETURN_MARK(CallNonvirtualVoidMethod);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2236
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2237
  va_list args;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2238
  va_start(args, methodID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2239
  JavaValue jvalue(T_VOID);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  2240
  JNI_ArgumentPusherVaArg ap(methodID, args);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2241
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2242
  va_end(args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2243
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2244
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2245
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2246
JNI_ENTRY(void, jni_CallNonvirtualVoidMethodV(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, va_list args))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2247
  JNIWrapper("CallNonvirtualVoidMethodV");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2248
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2249
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2250
  DTRACE_PROBE4(hotspot_jni, CallNonvirtualVoidMethodV__entry,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2251
               env, obj, cls, methodID);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2252
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2253
  HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHODV_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2254
               env, obj, cls, (uintptr_t) methodID);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2255
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2256
  DT_VOID_RETURN_MARK(CallNonvirtualVoidMethodV);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2257
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2258
  JavaValue jvalue(T_VOID);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  2259
  JNI_ArgumentPusherVaArg ap(methodID, args);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2260
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2261
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2262
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2263
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2264
JNI_ENTRY(void, jni_CallNonvirtualVoidMethodA(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, const jvalue *args))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2265
  JNIWrapper("CallNonvirtualVoidMethodA");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2266
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2267
  DTRACE_PROBE4(hotspot_jni, CallNonvirtualVoidMethodA__entry,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2268
                env, obj, cls, methodID);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2269
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2270
  HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHODA_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2271
                env, obj, cls, (uintptr_t) methodID);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2272
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2273
  DT_VOID_RETURN_MARK(CallNonvirtualVoidMethodA);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2274
  JavaValue jvalue(T_VOID);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  2275
  JNI_ArgumentPusherArray ap(methodID, args);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2276
  jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2277
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2278
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2279
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2280
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2281
#define DEFINE_CALLSTATICMETHOD(ResultType, Result, Tag) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2282
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2283
  DT_RETURN_MARK_DECL_FOR(Result, CallStatic##Result##Method, ResultType);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2284
  DT_RETURN_MARK_DECL_FOR(Result, CallStatic##Result##MethodV, ResultType);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2285
  DT_RETURN_MARK_DECL_FOR(Result, CallStatic##Result##MethodA, ResultType);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2286
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2287
JNI_ENTRY(ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2288
          jni_CallStatic##Result##Method(JNIEnv *env, jclass cls, jmethodID methodID, ...)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2289
  JNIWrapper("CallStatic" XSTR(Result) "Method"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2290
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2291
  DTRACE_PROBE3(hotspot_jni, CallStatic##Result##Method__entry, env, cls, methodID);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2292
  ResultType ret = 0;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2293
  DT_RETURN_MARK_FOR(Result, CallStatic##Result##Method, ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2294
                     (const ResultType&)ret);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2295
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2296
  va_list args; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2297
  va_start(args, methodID); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2298
  JavaValue jvalue(Tag); \
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  2299
  JNI_ArgumentPusherVaArg ap(methodID, args); \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2300
  jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2301
  va_end(args); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2302
  ret = jvalue.get_##ResultType(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2303
  return ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2304
JNI_END \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2305
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2306
JNI_ENTRY(ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2307
          jni_CallStatic##Result##MethodV(JNIEnv *env, jclass cls, jmethodID methodID, va_list args)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2308
  JNIWrapper("CallStatic" XSTR(Result) "MethodV"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2309
  DTRACE_PROBE3(hotspot_jni, CallStatic##Result##MethodV__entry, env, cls, methodID);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2310
  ResultType ret = 0;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2311
  DT_RETURN_MARK_FOR(Result, CallStatic##Result##MethodV, ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2312
                     (const ResultType&)ret);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2313
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2314
  JavaValue jvalue(Tag); \
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  2315
  JNI_ArgumentPusherVaArg ap(methodID, args); \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2316
  jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2317
  ret = jvalue.get_##ResultType(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2318
  return ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2319
JNI_END \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2320
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2321
JNI_ENTRY(ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2322
          jni_CallStatic##Result##MethodA(JNIEnv *env, jclass cls, jmethodID methodID, const jvalue *args)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2323
  JNIWrapper("CallStatic" XSTR(Result) "MethodA"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2324
  DTRACE_PROBE3(hotspot_jni, CallStatic##Result##MethodA__entry, env, cls, methodID);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2325
  ResultType ret = 0;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2326
  DT_RETURN_MARK_FOR(Result, CallStatic##Result##MethodA, ResultType, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2327
                     (const ResultType&)ret);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2328
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2329
  JavaValue jvalue(Tag); \
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  2330
  JNI_ArgumentPusherArray ap(methodID, args); \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2331
  jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2332
  ret = jvalue.get_##ResultType(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2333
  return ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2334
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2335
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2336
// the runtime type of subword integral basic types is integer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2337
DEFINE_CALLSTATICMETHOD(jboolean, Boolean, T_BOOLEAN)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2338
DEFINE_CALLSTATICMETHOD(jbyte,    Byte,    T_BYTE)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2339
DEFINE_CALLSTATICMETHOD(jchar,    Char,    T_CHAR)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2340
DEFINE_CALLSTATICMETHOD(jshort,   Short,   T_SHORT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2341
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2342
DEFINE_CALLSTATICMETHOD(jobject,  Object,  T_OBJECT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2343
DEFINE_CALLSTATICMETHOD(jint,     Int,     T_INT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2344
DEFINE_CALLSTATICMETHOD(jlong,    Long,    T_LONG)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2345
DEFINE_CALLSTATICMETHOD(jfloat,   Float,   T_FLOAT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2346
DEFINE_CALLSTATICMETHOD(jdouble,  Double,  T_DOUBLE)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2347
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2348
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2349
DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethod);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2350
DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethodV);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2351
DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethodA);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2352
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2353
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2354
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2355
#define DEFINE_CALLSTATICMETHOD(ResultType, Result, Tag \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2356
                                , EntryProbe, ResultProbe) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2357
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2358
  DT_RETURN_MARK_DECL_FOR(Result, CallStatic##Result##Method, ResultType \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2359
                          , ResultProbe);                               \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2360
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2361
JNI_ENTRY(ResultType, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2362
          jni_CallStatic##Result##Method(JNIEnv *env, jclass cls, jmethodID methodID, ...)) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2363
  JNIWrapper("CallStatic" XSTR(Result) "Method"); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2364
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2365
  EntryProbe; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2366
  ResultType ret = 0;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2367
  DT_RETURN_MARK_FOR(Result, CallStatic##Result##Method, ResultType, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2368
                     (const ResultType&)ret);\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2369
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2370
  va_list args; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2371
  va_start(args, methodID); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2372
  JavaValue jvalue(Tag); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2373
  JNI_ArgumentPusherVaArg ap(methodID, args); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2374
  jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2375
  va_end(args); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2376
  ret = jvalue.get_##ResultType(); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2377
  return ret;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2378
JNI_END
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2379
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2380
// the runtime type of subword integral basic types is integer
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2381
DEFINE_CALLSTATICMETHOD(jboolean, Boolean, T_BOOLEAN
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2382
                        , HOTSPOT_JNI_CALLSTATICBOOLEANMETHOD_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2383
                        HOTSPOT_JNI_CALLSTATICBOOLEANMETHOD_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2384
DEFINE_CALLSTATICMETHOD(jbyte,    Byte,    T_BYTE
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2385
                        , HOTSPOT_JNI_CALLSTATICBYTEMETHOD_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2386
                        HOTSPOT_JNI_CALLSTATICBYTEMETHOD_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2387
DEFINE_CALLSTATICMETHOD(jchar,    Char,    T_CHAR
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2388
                        , HOTSPOT_JNI_CALLSTATICCHARMETHOD_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2389
                        HOTSPOT_JNI_CALLSTATICCHARMETHOD_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2390
DEFINE_CALLSTATICMETHOD(jshort,   Short,   T_SHORT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2391
                        , HOTSPOT_JNI_CALLSTATICSHORTMETHOD_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2392
                        HOTSPOT_JNI_CALLSTATICSHORTMETHOD_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2393
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2394
DEFINE_CALLSTATICMETHOD(jobject,  Object,  T_OBJECT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2395
                        , HOTSPOT_JNI_CALLSTATICOBJECTMETHOD_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2396
                        HOTSPOT_JNI_CALLSTATICOBJECTMETHOD_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2397
DEFINE_CALLSTATICMETHOD(jint,     Int,     T_INT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2398
                        , HOTSPOT_JNI_CALLSTATICINTMETHOD_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2399
                        HOTSPOT_JNI_CALLSTATICINTMETHOD_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2400
DEFINE_CALLSTATICMETHOD(jlong,    Long,    T_LONG
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2401
                        , HOTSPOT_JNI_CALLSTATICLONGMETHOD_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2402
                        HOTSPOT_JNI_CALLSTATICLONGMETHOD_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2403
// Float and double probes don't return value because dtrace doesn't currently support it
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2404
DEFINE_CALLSTATICMETHOD(jfloat,   Float,   T_FLOAT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2405
                        , HOTSPOT_JNI_CALLSTATICFLOATMETHOD_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2406
                        HOTSPOT_JNI_CALLSTATICFLOATMETHOD_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2407
DEFINE_CALLSTATICMETHOD(jdouble,  Double,  T_DOUBLE
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2408
                        , HOTSPOT_JNI_CALLSTATICDOUBLEMETHOD_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2409
                        HOTSPOT_JNI_CALLSTATICDOUBLEMETHOD_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2410
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2411
#define DEFINE_CALLSTATICMETHODV(ResultType, Result, Tag \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2412
                                , EntryProbe, ResultProbe) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2413
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2414
  DT_RETURN_MARK_DECL_FOR(Result, CallStatic##Result##MethodV, ResultType \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2415
                          , ResultProbe);                               \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2416
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2417
JNI_ENTRY(ResultType, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2418
          jni_CallStatic##Result##MethodV(JNIEnv *env, jclass cls, jmethodID methodID, va_list args)) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2419
  JNIWrapper("CallStatic" XSTR(Result) "MethodV"); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2420
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2421
  EntryProbe; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2422
  ResultType ret = 0;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2423
  DT_RETURN_MARK_FOR(Result, CallStatic##Result##MethodV, ResultType, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2424
                     (const ResultType&)ret);\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2425
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2426
  JavaValue jvalue(Tag); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2427
  JNI_ArgumentPusherVaArg ap(methodID, args); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2428
  /* Make sure class is initialized before trying to invoke its method */ \
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2429
  KlassHandle k(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls))); \
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2430
  Klass::cast(k())->initialize(CHECK_0); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2431
  jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2432
  va_end(args); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2433
  ret = jvalue.get_##ResultType(); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2434
  return ret;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2435
JNI_END
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2436
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2437
// the runtime type of subword integral basic types is integer
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2438
DEFINE_CALLSTATICMETHODV(jboolean, Boolean, T_BOOLEAN
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2439
                        , HOTSPOT_JNI_CALLSTATICBOOLEANMETHODV_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2440
                        HOTSPOT_JNI_CALLSTATICBOOLEANMETHODV_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2441
DEFINE_CALLSTATICMETHODV(jbyte,    Byte,    T_BYTE
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2442
                        , HOTSPOT_JNI_CALLSTATICBYTEMETHODV_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2443
                        HOTSPOT_JNI_CALLSTATICBYTEMETHODV_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2444
DEFINE_CALLSTATICMETHODV(jchar,    Char,    T_CHAR
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2445
                        , HOTSPOT_JNI_CALLSTATICCHARMETHODV_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2446
                        HOTSPOT_JNI_CALLSTATICCHARMETHODV_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2447
DEFINE_CALLSTATICMETHODV(jshort,   Short,   T_SHORT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2448
                        , HOTSPOT_JNI_CALLSTATICSHORTMETHODV_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2449
                        HOTSPOT_JNI_CALLSTATICSHORTMETHODV_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2450
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2451
DEFINE_CALLSTATICMETHODV(jobject,  Object,  T_OBJECT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2452
                        , HOTSPOT_JNI_CALLSTATICOBJECTMETHODV_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2453
                        HOTSPOT_JNI_CALLSTATICOBJECTMETHODV_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2454
DEFINE_CALLSTATICMETHODV(jint,     Int,     T_INT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2455
                        , HOTSPOT_JNI_CALLSTATICINTMETHODV_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2456
                        HOTSPOT_JNI_CALLSTATICINTMETHODV_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2457
DEFINE_CALLSTATICMETHODV(jlong,    Long,    T_LONG
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2458
                        , HOTSPOT_JNI_CALLSTATICLONGMETHODV_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2459
                        HOTSPOT_JNI_CALLSTATICLONGMETHODV_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2460
// Float and double probes don't return value because dtrace doesn't currently support it
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2461
DEFINE_CALLSTATICMETHODV(jfloat,   Float,   T_FLOAT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2462
                        , HOTSPOT_JNI_CALLSTATICFLOATMETHODV_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2463
                        HOTSPOT_JNI_CALLSTATICFLOATMETHODV_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2464
DEFINE_CALLSTATICMETHODV(jdouble,  Double,  T_DOUBLE
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2465
                        , HOTSPOT_JNI_CALLSTATICDOUBLEMETHODV_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2466
                        HOTSPOT_JNI_CALLSTATICDOUBLEMETHODV_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2467
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2468
#define DEFINE_CALLSTATICMETHODA(ResultType, Result, Tag \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2469
                                , EntryProbe, ResultProbe) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2470
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2471
  DT_RETURN_MARK_DECL_FOR(Result, CallStatic##Result##MethodA, ResultType \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2472
                          , ResultProbe);                               \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2473
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2474
JNI_ENTRY(ResultType, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2475
          jni_CallStatic##Result##MethodA(JNIEnv *env, jclass cls, jmethodID methodID, const jvalue *args)) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2476
  JNIWrapper("CallStatic" XSTR(Result) "MethodA"); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2477
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2478
  EntryProbe; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2479
  ResultType ret = 0;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2480
  DT_RETURN_MARK_FOR(Result, CallStatic##Result##MethodA, ResultType, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2481
                     (const ResultType&)ret);\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2482
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2483
  JavaValue jvalue(Tag); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2484
  JNI_ArgumentPusherArray ap(methodID, args); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2485
  jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2486
  ret = jvalue.get_##ResultType(); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2487
  return ret;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2488
JNI_END
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2489
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2490
// the runtime type of subword integral basic types is integer
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2491
DEFINE_CALLSTATICMETHODA(jboolean, Boolean, T_BOOLEAN
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2492
                        , HOTSPOT_JNI_CALLSTATICBOOLEANMETHODA_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2493
                        HOTSPOT_JNI_CALLSTATICBOOLEANMETHODA_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2494
DEFINE_CALLSTATICMETHODA(jbyte,    Byte,    T_BYTE
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2495
                        , HOTSPOT_JNI_CALLSTATICBYTEMETHODA_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2496
                        HOTSPOT_JNI_CALLSTATICBYTEMETHODA_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2497
DEFINE_CALLSTATICMETHODA(jchar,    Char,    T_CHAR
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2498
                        , HOTSPOT_JNI_CALLSTATICCHARMETHODA_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2499
                        HOTSPOT_JNI_CALLSTATICCHARMETHODA_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2500
DEFINE_CALLSTATICMETHODA(jshort,   Short,   T_SHORT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2501
                        , HOTSPOT_JNI_CALLSTATICSHORTMETHODA_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2502
                        HOTSPOT_JNI_CALLSTATICSHORTMETHODA_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2503
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2504
DEFINE_CALLSTATICMETHODA(jobject,  Object,  T_OBJECT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2505
                        , HOTSPOT_JNI_CALLSTATICOBJECTMETHODA_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2506
                        HOTSPOT_JNI_CALLSTATICOBJECTMETHODA_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2507
DEFINE_CALLSTATICMETHODA(jint,     Int,     T_INT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2508
                        , HOTSPOT_JNI_CALLSTATICINTMETHODA_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2509
                        HOTSPOT_JNI_CALLSTATICINTMETHODA_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2510
DEFINE_CALLSTATICMETHODA(jlong,    Long,    T_LONG
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2511
                        , HOTSPOT_JNI_CALLSTATICLONGMETHODA_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2512
                        HOTSPOT_JNI_CALLSTATICLONGMETHODA_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2513
// Float and double probes don't return value because dtrace doesn't currently support it
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2514
DEFINE_CALLSTATICMETHODA(jfloat,   Float,   T_FLOAT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2515
                        , HOTSPOT_JNI_CALLSTATICFLOATMETHODA_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2516
                        HOTSPOT_JNI_CALLSTATICFLOATMETHODA_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2517
DEFINE_CALLSTATICMETHODA(jdouble,  Double,  T_DOUBLE
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2518
                        , HOTSPOT_JNI_CALLSTATICDOUBLEMETHODA_ENTRY(env, cls, (uintptr_t)methodID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2519
                        HOTSPOT_JNI_CALLSTATICDOUBLEMETHODA_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2520
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2521
DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethod
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2522
                         , HOTSPOT_JNI_CALLSTATICVOIDMETHOD_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2523
DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethodV
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2524
                         , HOTSPOT_JNI_CALLSTATICVOIDMETHODV_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2525
DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethodA
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2526
                         , HOTSPOT_JNI_CALLSTATICVOIDMETHODA_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2527
#endif /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2528
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2529
JNI_ENTRY(void, jni_CallStaticVoidMethod(JNIEnv *env, jclass cls, jmethodID methodID, ...))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2530
  JNIWrapper("CallStaticVoidMethod");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2531
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2532
  DTRACE_PROBE3(hotspot_jni, CallStaticVoidMethod__entry, env, cls, methodID);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2533
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2534
  HOTSPOT_JNI_CALLSTATICVOIDMETHOD_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2535
                                         env, cls, (uintptr_t) methodID);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2536
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2537
  DT_VOID_RETURN_MARK(CallStaticVoidMethod);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2538
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2539
  va_list args;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2540
  va_start(args, methodID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2541
  JavaValue jvalue(T_VOID);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  2542
  JNI_ArgumentPusherVaArg ap(methodID, args);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2543
  jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2544
  va_end(args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2545
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2546
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2547
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2548
JNI_ENTRY(void, jni_CallStaticVoidMethodV(JNIEnv *env, jclass cls, jmethodID methodID, va_list args))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2549
  JNIWrapper("CallStaticVoidMethodV");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2550
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2551
  DTRACE_PROBE3(hotspot_jni, CallStaticVoidMethodV__entry, env, cls, methodID);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2552
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2553
  HOTSPOT_JNI_CALLSTATICVOIDMETHODV_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2554
                                          env, cls, (uintptr_t) methodID);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2555
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2556
  DT_VOID_RETURN_MARK(CallStaticVoidMethodV);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2557
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2558
  JavaValue jvalue(T_VOID);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  2559
  JNI_ArgumentPusherVaArg ap(methodID, args);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2560
  jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2561
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2562
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2563
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2564
JNI_ENTRY(void, jni_CallStaticVoidMethodA(JNIEnv *env, jclass cls, jmethodID methodID, const jvalue *args))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2565
  JNIWrapper("CallStaticVoidMethodA");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2566
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2567
  DTRACE_PROBE3(hotspot_jni, CallStaticVoidMethodA__entry, env, cls, methodID);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2568
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2569
  HOTSPOT_JNI_CALLSTATICVOIDMETHODA_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2570
                                          env, cls, (uintptr_t) methodID);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2571
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2572
  DT_VOID_RETURN_MARK(CallStaticVoidMethodA);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2573
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2574
  JavaValue jvalue(T_VOID);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  2575
  JNI_ArgumentPusherArray ap(methodID, args);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2576
  jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2577
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2578
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2579
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2580
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2581
// Accessing Fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2582
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2583
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2584
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2585
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2586
DT_RETURN_MARK_DECL(GetFieldID, jfieldID);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2587
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2588
DT_RETURN_MARK_DECL(GetFieldID, jfieldID
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2589
                    , HOTSPOT_JNI_GETFIELDID_RETURN((uintptr_t)_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2590
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2591
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2592
JNI_ENTRY(jfieldID, jni_GetFieldID(JNIEnv *env, jclass clazz,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2593
          const char *name, const char *sig))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2594
  JNIWrapper("GetFieldID");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2595
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2596
  DTRACE_PROBE4(hotspot_jni, GetFieldID__entry, env, clazz, name, sig);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2597
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2598
  HOTSPOT_JNI_GETFIELDID_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2599
                               env, clazz, (char *) name, (char *) sig);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2600
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2601
  jfieldID ret = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2602
  DT_RETURN_MARK(GetFieldID, jfieldID, (const jfieldID&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2603
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2604
  // The class should have been loaded (we have an instance of the class
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2605
  // passed in) so the field and signature should already be in the symbol
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2606
  // 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
  2607
  TempNewSymbol fieldname = SymbolTable::probe(name, (int)strlen(name));
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  2608
  TempNewSymbol signame = SymbolTable::probe(sig, (int)strlen(sig));
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  2609
  if (fieldname == NULL || signame == NULL) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2610
    THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2611
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2612
  KlassHandle k(THREAD,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2613
                java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2614
  // Make sure class is initialized before handing id's out to fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2615
  Klass::cast(k())->initialize(CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2616
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2617
  fieldDescriptor fd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2618
  if (!Klass::cast(k())->oop_is_instance() ||
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2619
      !InstanceKlass::cast(k())->find_field(fieldname, signame, false, &fd)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2620
    THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2621
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2622
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2623
  // A jfieldID for a non-static field is simply the offset of the field within the instanceOop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2624
  // It may also have hash bits for k, if VerifyJNIFields is turned on.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2625
  ret = jfieldIDWorkaround::to_instance_jfieldID(k(), fd.offset());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2626
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2627
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2628
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2629
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2630
JNI_ENTRY(jobject, jni_GetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2631
  JNIWrapper("GetObjectField");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2632
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2633
  DTRACE_PROBE3(hotspot_jni, GetObjectField__entry, env, obj, fieldID);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2634
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2635
  HOTSPOT_JNI_GETOBJECTFIELD_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2636
                                   env, obj, (uintptr_t) fieldID);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2637
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2638
  oop o = JNIHandles::resolve_non_null(obj);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2639
  Klass* k = o->klass();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2640
  int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2641
  // Keep JVMTI addition small and only check enabled flag here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2642
  // jni_GetField_probe() assumes that is okay to create handles.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2643
  if (JvmtiExport::should_post_field_access()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2644
    o = JvmtiExport::jni_GetField_probe(thread, obj, o, k, fieldID, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2645
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2646
  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
  2647
#ifndef SERIALGC
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
  2648
  // 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
  2649
  // 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
  2650
  // referent with the SATB barrier.
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
  2651
  if (UseG1GC) {
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
  2652
    bool needs_barrier = false;
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
  2653
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
  2654
    if (ret != NULL &&
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
  2655
        offset == java_lang_ref_Reference::referent_offset &&
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2656
        InstanceKlass::cast(k)->reference_type() != REF_NONE) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2657
      assert(InstanceKlass::cast(k)->is_subclass_of(SystemDictionary::Reference_klass()), "sanity");
9176
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
  2658
      needs_barrier = true;
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
  2659
    }
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
  2660
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
  2661
    if (needs_barrier) {
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
  2662
      oop referent = JNIHandles::resolve(ret);
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
  2663
      G1SATBCardTableModRefBS::enqueue(referent);
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
  2664
    }
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
  2665
  }
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
  2666
#endif // SERIALGC
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2667
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2668
  DTRACE_PROBE1(hotspot_jni, GetObjectField__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2669
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2670
HOTSPOT_JNI_GETOBJECTFIELD_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2671
                                  ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2672
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2673
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2674
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2675
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2676
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2677
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2678
#define DEFINE_GETFIELD(Return,Fieldname,Result) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2679
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2680
  DT_RETURN_MARK_DECL_FOR(Result, Get##Result##Field, Return);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2681
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2682
JNI_QUICK_ENTRY(Return, jni_Get##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2683
  JNIWrapper("Get" XSTR(Result) "Field"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2684
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2685
  DTRACE_PROBE3(hotspot_jni, Get##Result##Field__entry, env, obj, fieldID);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2686
  Return ret = 0;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2687
  DT_RETURN_MARK_FOR(Result, Get##Result##Field, Return, (const Return&)ret);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2688
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2689
  oop o = JNIHandles::resolve_non_null(obj); \
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2690
  Klass* k = o->klass(); \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2691
  int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);  \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2692
  /* Keep JVMTI addition small and only check enabled flag here.       */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2693
  /* jni_GetField_probe_nh() assumes that is not okay to create handles */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2694
  /* and creates a ResetNoHandleMark.                                   */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2695
  if (JvmtiExport::should_post_field_access()) { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2696
    o = JvmtiExport::jni_GetField_probe_nh(thread, obj, o, k, fieldID, false); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2697
  } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2698
  ret = o->Fieldname##_field(offset); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2699
  return ret; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2700
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2701
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2702
DEFINE_GETFIELD(jboolean, bool,   Boolean)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2703
DEFINE_GETFIELD(jbyte,    byte,   Byte)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2704
DEFINE_GETFIELD(jchar,    char,   Char)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2705
DEFINE_GETFIELD(jshort,   short,  Short)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2706
DEFINE_GETFIELD(jint,     int,    Int)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2707
DEFINE_GETFIELD(jlong,    long,   Long)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2708
DEFINE_GETFIELD(jfloat,   float,  Float)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2709
DEFINE_GETFIELD(jdouble,  double, Double)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2710
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2711
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2712
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2713
#define DEFINE_GETFIELD(Return,Fieldname,Result \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2714
  , EntryProbe, ReturnProbe) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2715
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2716
  DT_RETURN_MARK_DECL_FOR(Result, Get##Result##Field, Return \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2717
  , ReturnProbe); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2718
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2719
JNI_QUICK_ENTRY(Return, jni_Get##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID)) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2720
  JNIWrapper("Get" XSTR(Result) "Field"); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2721
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2722
  EntryProbe; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2723
  Return ret = 0;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2724
  DT_RETURN_MARK_FOR(Result, Get##Result##Field, Return, (const Return&)ret);\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2725
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2726
  oop o = JNIHandles::resolve_non_null(obj); \
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2727
  Klass* k = o->klass(); \
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2728
  int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);  \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2729
  /* Keep JVMTI addition small and only check enabled flag here.       */ \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2730
  /* jni_GetField_probe_nh() assumes that is not okay to create handles */ \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2731
  /* and creates a ResetNoHandleMark.                                   */ \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2732
  if (JvmtiExport::should_post_field_access()) { \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2733
    o = JvmtiExport::jni_GetField_probe_nh(thread, obj, o, k, fieldID, false); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2734
  } \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2735
  ret = o->Fieldname##_field(offset); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2736
  return ret; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2737
JNI_END
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2738
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2739
DEFINE_GETFIELD(jboolean, bool,   Boolean
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2740
                , HOTSPOT_JNI_GETBOOLEANFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2741
                HOTSPOT_JNI_GETBOOLEANFIELD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2742
DEFINE_GETFIELD(jbyte,    byte,   Byte
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2743
                , HOTSPOT_JNI_GETBYTEFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2744
                HOTSPOT_JNI_GETBYTEFIELD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2745
DEFINE_GETFIELD(jchar,    char,   Char
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2746
                , HOTSPOT_JNI_GETCHARFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2747
                HOTSPOT_JNI_GETCHARFIELD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2748
DEFINE_GETFIELD(jshort,   short,  Short
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2749
                , HOTSPOT_JNI_GETSHORTFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2750
                HOTSPOT_JNI_GETSHORTFIELD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2751
DEFINE_GETFIELD(jint,     int,    Int
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2752
                , HOTSPOT_JNI_GETINTFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2753
                HOTSPOT_JNI_GETINTFIELD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2754
DEFINE_GETFIELD(jlong,    long,   Long
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2755
                , HOTSPOT_JNI_GETLONGFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2756
                HOTSPOT_JNI_GETLONGFIELD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2757
// Float and double probes don't return value because dtrace doesn't currently support it
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2758
DEFINE_GETFIELD(jfloat,   float,  Float
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2759
                , HOTSPOT_JNI_GETFLOATFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2760
                HOTSPOT_JNI_GETFLOATFIELD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2761
DEFINE_GETFIELD(jdouble,  double, Double
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2762
                , HOTSPOT_JNI_GETDOUBLEFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2763
                HOTSPOT_JNI_GETDOUBLEFIELD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2764
#endif /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2765
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2766
address jni_GetBooleanField_addr() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2767
  return (address)jni_GetBooleanField;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2768
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2769
address jni_GetByteField_addr() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2770
  return (address)jni_GetByteField;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2771
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2772
address jni_GetCharField_addr() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2773
  return (address)jni_GetCharField;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2774
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2775
address jni_GetShortField_addr() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2776
  return (address)jni_GetShortField;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2777
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2778
address jni_GetIntField_addr() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2779
  return (address)jni_GetIntField;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2780
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2781
address jni_GetLongField_addr() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2782
  return (address)jni_GetLongField;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2783
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2784
address jni_GetFloatField_addr() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2785
  return (address)jni_GetFloatField;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2786
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2787
address jni_GetDoubleField_addr() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2788
  return (address)jni_GetDoubleField;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2789
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2790
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2791
JNI_QUICK_ENTRY(void, jni_SetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID, jobject value))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2792
  JNIWrapper("SetObjectField");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2793
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2794
  DTRACE_PROBE4(hotspot_jni, SetObjectField__entry, env, obj, fieldID, value);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2795
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2796
  HOTSPOT_JNI_SETOBJECTFIELD_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2797
                                   env, obj, (uintptr_t) fieldID, value);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2798
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2799
  oop o = JNIHandles::resolve_non_null(obj);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2800
  Klass* k = o->klass();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2801
  int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2802
  // Keep JVMTI addition small and only check enabled flag here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2803
  // jni_SetField_probe_nh() assumes that is not okay to create handles
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2804
  // and creates a ResetNoHandleMark.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2805
  if (JvmtiExport::should_post_field_modification()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2806
    jvalue field_value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2807
    field_value.l = value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2808
    o = JvmtiExport::jni_SetField_probe_nh(thread, obj, o, k, fieldID, false, 'L', (jvalue *)&field_value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2809
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2810
  o->obj_field_put(offset, JNIHandles::resolve(value));
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2811
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2812
  DTRACE_PROBE(hotspot_jni, SetObjectField__return);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2813
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2814
  HOTSPOT_JNI_SETOBJECTFIELD_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2815
);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2816
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2817
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2818
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2819
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2820
#define DEFINE_SETFIELD(Argument,Fieldname,Result,SigType,unionType) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2821
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2822
JNI_QUICK_ENTRY(void, jni_Set##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID, Argument value)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2823
  JNIWrapper("Set" XSTR(Result) "Field"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2824
\
13958
f5598a86c223 7170638: Use DTRACE_PROBE[N] in JNI Set and SetStatic Field.
coleenp
parents: 13952
diff changeset
  2825
  FP_SELECT_##Result( \
f5598a86c223 7170638: Use DTRACE_PROBE[N] in JNI Set and SetStatic Field.
coleenp
parents: 13952
diff changeset
  2826
    DTRACE_PROBE4(hotspot_jni, Set##Result##Field__entry, env, obj, fieldID, value), \
f5598a86c223 7170638: Use DTRACE_PROBE[N] in JNI Set and SetStatic Field.
coleenp
parents: 13952
diff changeset
  2827
    DTRACE_PROBE3(hotspot_jni, Set##Result##Field__entry, env, obj, fieldID)); \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2828
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2829
  oop o = JNIHandles::resolve_non_null(obj); \
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2830
  Klass* k = o->klass(); \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2831
  int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);  \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2832
  /* Keep JVMTI addition small and only check enabled flag here.       */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2833
  /* jni_SetField_probe_nh() assumes that is not okay to create handles */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2834
  /* and creates a ResetNoHandleMark.                                   */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2835
  if (JvmtiExport::should_post_field_modification()) { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2836
    jvalue field_value; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2837
    field_value.unionType = value; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2838
    o = JvmtiExport::jni_SetField_probe_nh(thread, obj, o, k, fieldID, false, SigType, (jvalue *)&field_value); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2839
  } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2840
  o->Fieldname##_field_put(offset, value); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2841
  DTRACE_PROBE(hotspot_jni, Set##Result##Field__return);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2842
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2843
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2844
DEFINE_SETFIELD(jboolean, bool,   Boolean, 'Z', z)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2845
DEFINE_SETFIELD(jbyte,    byte,   Byte,    'B', b)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2846
DEFINE_SETFIELD(jchar,    char,   Char,    'C', c)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2847
DEFINE_SETFIELD(jshort,   short,  Short,   'S', s)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2848
DEFINE_SETFIELD(jint,     int,    Int,     'I', i)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2849
DEFINE_SETFIELD(jlong,    long,   Long,    'J', j)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2850
DEFINE_SETFIELD(jfloat,   float,  Float,   'F', f)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2851
DEFINE_SETFIELD(jdouble,  double, Double,  'D', d)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2852
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2853
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2854
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2855
#define DEFINE_SETFIELD(Argument,Fieldname,Result,SigType,unionType \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2856
                        , EntryProbe, ReturnProbe) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2857
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2858
JNI_QUICK_ENTRY(void, jni_Set##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID, Argument value)) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2859
  JNIWrapper("Set" XSTR(Result) "Field"); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2860
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2861
  EntryProbe; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2862
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2863
  oop o = JNIHandles::resolve_non_null(obj); \
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2864
  Klass* k = o->klass(); \
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2865
  int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);  \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2866
  /* Keep JVMTI addition small and only check enabled flag here.       */ \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2867
  /* jni_SetField_probe_nh() assumes that is not okay to create handles */ \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2868
  /* and creates a ResetNoHandleMark.                                   */ \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2869
  if (JvmtiExport::should_post_field_modification()) { \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2870
    jvalue field_value; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2871
    field_value.unionType = value; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2872
    o = JvmtiExport::jni_SetField_probe_nh(thread, obj, o, k, fieldID, false, SigType, (jvalue *)&field_value); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2873
  } \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2874
  o->Fieldname##_field_put(offset, value); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2875
  ReturnProbe; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2876
JNI_END
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2877
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2878
DEFINE_SETFIELD(jboolean, bool,   Boolean, 'Z', z
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2879
                , HOTSPOT_JNI_SETBOOLEANFIELD_ENTRY(env, obj, (uintptr_t)fieldID, value),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2880
                HOTSPOT_JNI_SETBOOLEANFIELD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2881
DEFINE_SETFIELD(jbyte,    byte,   Byte,    'B', b
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2882
                , HOTSPOT_JNI_SETBYTEFIELD_ENTRY(env, obj, (uintptr_t)fieldID, value),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2883
                HOTSPOT_JNI_SETBYTEFIELD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2884
DEFINE_SETFIELD(jchar,    char,   Char,    'C', c
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2885
                , HOTSPOT_JNI_SETCHARFIELD_ENTRY(env, obj, (uintptr_t)fieldID, value),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2886
                HOTSPOT_JNI_SETCHARFIELD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2887
DEFINE_SETFIELD(jshort,   short,  Short,   'S', s
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2888
                , HOTSPOT_JNI_SETSHORTFIELD_ENTRY(env, obj, (uintptr_t)fieldID, value),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2889
                HOTSPOT_JNI_SETSHORTFIELD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2890
DEFINE_SETFIELD(jint,     int,    Int,     'I', i
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2891
                , HOTSPOT_JNI_SETINTFIELD_ENTRY(env, obj, (uintptr_t)fieldID, value),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2892
                HOTSPOT_JNI_SETINTFIELD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2893
DEFINE_SETFIELD(jlong,    long,   Long,    'J', j
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2894
                , HOTSPOT_JNI_SETLONGFIELD_ENTRY(env, obj, (uintptr_t)fieldID, value),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2895
                HOTSPOT_JNI_SETLONGFIELD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2896
// Float and double probes don't return value because dtrace doesn't currently support it
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2897
DEFINE_SETFIELD(jfloat,   float,  Float,   'F', f
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2898
                , HOTSPOT_JNI_SETFLOATFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2899
                HOTSPOT_JNI_SETFLOATFIELD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2900
DEFINE_SETFIELD(jdouble,  double, Double,  'D', d
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2901
                , HOTSPOT_JNI_SETDOUBLEFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2902
                HOTSPOT_JNI_SETDOUBLEFIELD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2903
#endif /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2904
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2905
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2906
DT_RETURN_MARK_DECL(ToReflectedField, jobject);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2907
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2908
DT_RETURN_MARK_DECL(ToReflectedField, jobject
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2909
                    , HOTSPOT_JNI_TOREFLECTEDFIELD_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2910
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2911
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2912
JNI_ENTRY(jobject, jni_ToReflectedField(JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2913
  JNIWrapper("ToReflectedField");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2914
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2915
  DTRACE_PROBE4(hotspot_jni, ToReflectedField__entry,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2916
                env, cls, fieldID, isStatic);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2917
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2918
  HOTSPOT_JNI_TOREFLECTEDFIELD_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2919
                env, cls, (uintptr_t) fieldID, isStatic);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2920
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2921
  jobject ret = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2922
  DT_RETURN_MARK(ToReflectedField, jobject, (const jobject&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2923
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2924
  fieldDescriptor fd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2925
  bool found = false;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2926
  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2927
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2928
  assert(jfieldIDWorkaround::is_static_jfieldID(fieldID) == (isStatic != 0), "invalid fieldID");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2929
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2930
  if (isStatic) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2931
    // Static field. The fieldID a JNIid specifying the field holder and the offset within the Klass*.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2932
    JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2933
    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
  2934
    found = id->find_local_field(&fd);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2935
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2936
    // Non-static field. The fieldID is really the offset of the field within the instanceOop.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2937
    int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2938
    found = InstanceKlass::cast(k)->find_field_from_offset(offset, false, &fd);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2939
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2940
  assert(found, "bad fieldID passed into jni_ToReflectedField");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2941
  oop reflected = Reflection::new_field(&fd, UseNewReflection, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2942
  ret = JNIHandles::make_local(env, reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2943
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2944
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2945
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2946
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2947
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2948
// Accessing Static Fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2949
//
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2950
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2951
DT_RETURN_MARK_DECL(GetStaticFieldID, jfieldID);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2952
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2953
DT_RETURN_MARK_DECL(GetStaticFieldID, jfieldID
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2954
                    , HOTSPOT_JNI_GETSTATICFIELDID_RETURN((uintptr_t)_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2955
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2956
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2957
JNI_ENTRY(jfieldID, jni_GetStaticFieldID(JNIEnv *env, jclass clazz,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2958
          const char *name, const char *sig))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2959
  JNIWrapper("GetStaticFieldID");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2960
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2961
  DTRACE_PROBE4(hotspot_jni, GetStaticFieldID__entry, env, clazz, name, sig);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2962
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2963
  HOTSPOT_JNI_GETSTATICFIELDID_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2964
                                     env, clazz, (char *) name, (char *) sig);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  2965
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2966
  jfieldID ret = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2967
  DT_RETURN_MARK(GetStaticFieldID, jfieldID, (const jfieldID&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2968
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2969
  // The class should have been loaded (we have an instance of the class
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2970
  // passed in) so the field and signature should already be in the symbol
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2971
  // 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
  2972
  TempNewSymbol fieldname = SymbolTable::probe(name, (int)strlen(name));
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  2973
  TempNewSymbol signame = SymbolTable::probe(sig, (int)strlen(sig));
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  2974
  if (fieldname == NULL || signame == NULL) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2975
    THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2976
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2977
  KlassHandle k(THREAD,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2978
                java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2979
  // Make sure class is initialized before handing id's out to static fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2980
  Klass::cast(k())->initialize(CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2981
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2982
  fieldDescriptor fd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2983
  if (!Klass::cast(k())->oop_is_instance() ||
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2984
      !InstanceKlass::cast(k())->find_field(fieldname, signame, true, &fd)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2985
    THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2986
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2987
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  2988
  // A jfieldID for a static field is a JNIid specifying the field holder and the offset within the Klass*
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13977
diff changeset
  2989
  JNIid* id = fd.field_holder()->jni_id_for(fd.offset());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2990
  debug_only(id->set_is_static_field_id();)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2991
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8076
diff changeset
  2992
  debug_only(id->verify(fd.field_holder()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2993
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2994
  ret = jfieldIDWorkaround::to_static_jfieldID(id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2995
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2996
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2997
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2998
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2999
JNI_ENTRY(jobject, jni_GetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3000
  JNIWrapper("GetStaticObjectField");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3001
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3002
  DTRACE_PROBE3(hotspot_jni, GetStaticObjectField__entry, env, clazz, fieldID);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3003
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3004
  HOTSPOT_JNI_GETSTATICOBJECTFIELD_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3005
                                         env, clazz, (uintptr_t) fieldID);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3006
#endif /* USDT2 */
13975
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13728
diff changeset
  3007
#if INCLUDE_JNI_CHECK
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  3008
  DEBUG_ONLY(Klass* param_k = jniCheck::validate_class(thread, clazz);)
13975
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13728
diff changeset
  3009
#endif // INCLUDE_JNI_CHECK
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3010
  JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3011
  assert(id->is_static_field_id(), "invalid static field id");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3012
  // Keep JVMTI addition small and only check enabled flag here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3013
  // jni_GetField_probe() assumes that is okay to create handles.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3014
  if (JvmtiExport::should_post_field_access()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3015
    JvmtiExport::jni_GetField_probe(thread, NULL, NULL, id->holder(), fieldID, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3016
  }
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8076
diff changeset
  3017
  jobject ret = JNIHandles::make_local(id->holder()->java_mirror()->obj_field(id->offset()));
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3018
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3019
  DTRACE_PROBE1(hotspot_jni, GetStaticObjectField__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3020
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3021
  HOTSPOT_JNI_GETSTATICOBJECTFIELD_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3022
                                          ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3023
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3024
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3025
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3026
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3027
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3028
#define DEFINE_GETSTATICFIELD(Return,Fieldname,Result) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3029
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3030
  DT_RETURN_MARK_DECL_FOR(Result, GetStatic##Result##Field, Return);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3031
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3032
JNI_ENTRY(Return, jni_GetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3033
  JNIWrapper("GetStatic" XSTR(Result) "Field"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3034
  DTRACE_PROBE3(hotspot_jni, GetStatic##Result##Field__entry, env, clazz, fieldID);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3035
  Return ret = 0;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3036
  DT_RETURN_MARK_FOR(Result, GetStatic##Result##Field, Return, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3037
                     (const Return&)ret);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3038
  JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3039
  assert(id->is_static_field_id(), "invalid static field id"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3040
  /* Keep JVMTI addition small and only check enabled flag here. */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3041
  /* jni_GetField_probe() assumes that is okay to create handles. */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3042
  if (JvmtiExport::should_post_field_access()) { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3043
    JvmtiExport::jni_GetField_probe(thread, NULL, NULL, id->holder(), fieldID, true); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3044
  } \
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8076
diff changeset
  3045
  ret = id->holder()->java_mirror()-> Fieldname##_field (id->offset()); \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3046
  return ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3047
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3048
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3049
DEFINE_GETSTATICFIELD(jboolean, bool,   Boolean)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3050
DEFINE_GETSTATICFIELD(jbyte,    byte,   Byte)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3051
DEFINE_GETSTATICFIELD(jchar,    char,   Char)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3052
DEFINE_GETSTATICFIELD(jshort,   short,  Short)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3053
DEFINE_GETSTATICFIELD(jint,     int,    Int)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3054
DEFINE_GETSTATICFIELD(jlong,    long,   Long)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3055
DEFINE_GETSTATICFIELD(jfloat,   float,  Float)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3056
DEFINE_GETSTATICFIELD(jdouble,  double, Double)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3057
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3058
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3059
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3060
#define DEFINE_GETSTATICFIELD(Return,Fieldname,Result \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3061
                              , EntryProbe, ReturnProbe) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3062
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3063
  DT_RETURN_MARK_DECL_FOR(Result, GetStatic##Result##Field, Return \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3064
                          , ReturnProbe);                                          \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3065
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3066
JNI_ENTRY(Return, jni_GetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID)) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3067
  JNIWrapper("GetStatic" XSTR(Result) "Field"); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3068
  EntryProbe; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3069
  Return ret = 0;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3070
  DT_RETURN_MARK_FOR(Result, GetStatic##Result##Field, Return, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3071
                     (const Return&)ret);\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3072
  JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3073
  assert(id->is_static_field_id(), "invalid static field id"); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3074
  /* Keep JVMTI addition small and only check enabled flag here. */ \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3075
  /* jni_GetField_probe() assumes that is okay to create handles. */ \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3076
  if (JvmtiExport::should_post_field_access()) { \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3077
    JvmtiExport::jni_GetField_probe(thread, NULL, NULL, id->holder(), fieldID, true); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3078
  } \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3079
  ret = id->holder()->java_mirror()-> Fieldname##_field (id->offset()); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3080
  return ret;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3081
JNI_END
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3082
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3083
DEFINE_GETSTATICFIELD(jboolean, bool,   Boolean
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3084
                      , HOTSPOT_JNI_GETSTATICBOOLEANFIELD_ENTRY(env, clazz, (uintptr_t) fieldID), HOTSPOT_JNI_GETSTATICBOOLEANFIELD_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3085
DEFINE_GETSTATICFIELD(jbyte,    byte,   Byte
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3086
                      , HOTSPOT_JNI_GETSTATICBYTEFIELD_ENTRY(env, clazz, (uintptr_t) fieldID),    HOTSPOT_JNI_GETSTATICBYTEFIELD_RETURN(_ret_ref)   )
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3087
DEFINE_GETSTATICFIELD(jchar,    char,   Char
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3088
                      , HOTSPOT_JNI_GETSTATICCHARFIELD_ENTRY(env, clazz, (uintptr_t) fieldID),    HOTSPOT_JNI_GETSTATICCHARFIELD_RETURN(_ret_ref)   )
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3089
DEFINE_GETSTATICFIELD(jshort,   short,  Short
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3090
                      , HOTSPOT_JNI_GETSTATICSHORTFIELD_ENTRY(env, clazz, (uintptr_t) fieldID),   HOTSPOT_JNI_GETSTATICSHORTFIELD_RETURN(_ret_ref)  )
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3091
DEFINE_GETSTATICFIELD(jint,     int,    Int
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3092
                      , HOTSPOT_JNI_GETSTATICINTFIELD_ENTRY(env, clazz, (uintptr_t) fieldID),     HOTSPOT_JNI_GETSTATICINTFIELD_RETURN(_ret_ref)    )
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3093
DEFINE_GETSTATICFIELD(jlong,    long,   Long
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3094
                      , HOTSPOT_JNI_GETSTATICLONGFIELD_ENTRY(env, clazz, (uintptr_t) fieldID),    HOTSPOT_JNI_GETSTATICLONGFIELD_RETURN(_ret_ref)   )
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3095
// Float and double probes don't return value because dtrace doesn't currently support it
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3096
DEFINE_GETSTATICFIELD(jfloat,   float,  Float
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3097
                      , HOTSPOT_JNI_GETSTATICFLOATFIELD_ENTRY(env, clazz, (uintptr_t) fieldID),   HOTSPOT_JNI_GETSTATICFLOATFIELD_RETURN()          )
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3098
DEFINE_GETSTATICFIELD(jdouble,  double, Double
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3099
                      , HOTSPOT_JNI_GETSTATICDOUBLEFIELD_ENTRY(env, clazz, (uintptr_t) fieldID),  HOTSPOT_JNI_GETSTATICDOUBLEFIELD_RETURN()         )
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3100
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3101
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3102
JNI_ENTRY(void, jni_SetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3103
  JNIWrapper("SetStaticObjectField");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3104
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3105
  DTRACE_PROBE4(hotspot_jni, SetStaticObjectField__entry, env, clazz, fieldID, value);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3106
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3107
 HOTSPOT_JNI_SETSTATICOBJECTFIELD_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3108
                                        env, clazz, (uintptr_t) fieldID, value);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3109
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3110
  JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3111
  assert(id->is_static_field_id(), "invalid static field id");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3112
  // Keep JVMTI addition small and only check enabled flag here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3113
  // jni_SetField_probe() assumes that is okay to create handles.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3114
  if (JvmtiExport::should_post_field_modification()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3115
    jvalue field_value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3116
    field_value.l = value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3117
    JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, 'L', (jvalue *)&field_value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3118
  }
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8076
diff changeset
  3119
  id->holder()->java_mirror()->obj_field_put(id->offset(), JNIHandles::resolve(value));
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3120
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3121
  DTRACE_PROBE(hotspot_jni, SetStaticObjectField__return);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3122
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3123
  HOTSPOT_JNI_SETSTATICOBJECTFIELD_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3124
                                          );
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3125
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3126
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3127
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3128
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3129
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3130
#define DEFINE_SETSTATICFIELD(Argument,Fieldname,Result,SigType,unionType) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3131
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3132
JNI_ENTRY(void, jni_SetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID, Argument value)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3133
  JNIWrapper("SetStatic" XSTR(Result) "Field"); \
13958
f5598a86c223 7170638: Use DTRACE_PROBE[N] in JNI Set and SetStatic Field.
coleenp
parents: 13952
diff changeset
  3134
  FP_SELECT_##Result( \
f5598a86c223 7170638: Use DTRACE_PROBE[N] in JNI Set and SetStatic Field.
coleenp
parents: 13952
diff changeset
  3135
     DTRACE_PROBE4(hotspot_jni, SetStatic##Result##Field__entry, env, clazz, fieldID, value), \
f5598a86c223 7170638: Use DTRACE_PROBE[N] in JNI Set and SetStatic Field.
coleenp
parents: 13952
diff changeset
  3136
     DTRACE_PROBE3(hotspot_jni, SetStatic##Result##Field__entry, env, clazz, fieldID)); \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3137
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3138
  JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3139
  assert(id->is_static_field_id(), "invalid static field id"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3140
  /* Keep JVMTI addition small and only check enabled flag here. */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3141
  /* jni_SetField_probe() assumes that is okay to create handles. */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3142
  if (JvmtiExport::should_post_field_modification()) { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3143
    jvalue field_value; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3144
    field_value.unionType = value; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3145
    JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, SigType, (jvalue *)&field_value); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3146
  } \
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8076
diff changeset
  3147
  id->holder()->java_mirror()-> Fieldname##_field_put (id->offset(), value); \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3148
  DTRACE_PROBE(hotspot_jni, SetStatic##Result##Field__return);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3149
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3150
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3151
DEFINE_SETSTATICFIELD(jboolean, bool,   Boolean, 'Z', z)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3152
DEFINE_SETSTATICFIELD(jbyte,    byte,   Byte,    'B', b)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3153
DEFINE_SETSTATICFIELD(jchar,    char,   Char,    'C', c)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3154
DEFINE_SETSTATICFIELD(jshort,   short,  Short,   'S', s)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3155
DEFINE_SETSTATICFIELD(jint,     int,    Int,     'I', i)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3156
DEFINE_SETSTATICFIELD(jlong,    long,   Long,    'J', j)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3157
DEFINE_SETSTATICFIELD(jfloat,   float,  Float,   'F', f)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3158
DEFINE_SETSTATICFIELD(jdouble,  double, Double,  'D', d)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3159
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3160
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3161
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3162
#define DEFINE_SETSTATICFIELD(Argument,Fieldname,Result,SigType,unionType \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3163
                              , EntryProbe, ReturnProbe) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3164
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3165
JNI_ENTRY(void, jni_SetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID, Argument value)) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3166
  JNIWrapper("SetStatic" XSTR(Result) "Field"); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3167
  EntryProbe; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3168
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3169
  JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3170
  assert(id->is_static_field_id(), "invalid static field id"); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3171
  /* Keep JVMTI addition small and only check enabled flag here. */ \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3172
  /* jni_SetField_probe() assumes that is okay to create handles. */ \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3173
  if (JvmtiExport::should_post_field_modification()) { \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3174
    jvalue field_value; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3175
    field_value.unionType = value; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3176
    JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, SigType, (jvalue *)&field_value); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3177
  } \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3178
  id->holder()->java_mirror()-> Fieldname##_field_put (id->offset(), value); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3179
  ReturnProbe;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3180
JNI_END
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3181
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3182
DEFINE_SETSTATICFIELD(jboolean, bool,   Boolean, 'Z', z
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3183
                      , HOTSPOT_JNI_SETBOOLEANFIELD_ENTRY(env, clazz, (uintptr_t)fieldID, value),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3184
                      HOTSPOT_JNI_SETBOOLEANFIELD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3185
DEFINE_SETSTATICFIELD(jbyte,    byte,   Byte,    'B', b
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3186
                      , HOTSPOT_JNI_SETSTATICBYTEFIELD_ENTRY(env, clazz, (uintptr_t) fieldID, value),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3187
                      HOTSPOT_JNI_SETSTATICBYTEFIELD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3188
DEFINE_SETSTATICFIELD(jchar,    char,   Char,    'C', c
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3189
                      , HOTSPOT_JNI_SETSTATICCHARFIELD_ENTRY(env, clazz, (uintptr_t) fieldID, value),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3190
                      HOTSPOT_JNI_SETSTATICCHARFIELD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3191
DEFINE_SETSTATICFIELD(jshort,   short,  Short,   'S', s
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3192
                      , HOTSPOT_JNI_SETSTATICSHORTFIELD_ENTRY(env, clazz, (uintptr_t) fieldID, value),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3193
                      HOTSPOT_JNI_SETSTATICSHORTFIELD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3194
DEFINE_SETSTATICFIELD(jint,     int,    Int,     'I', i
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3195
                      , HOTSPOT_JNI_SETSTATICINTFIELD_ENTRY(env, clazz, (uintptr_t) fieldID, value),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3196
                      HOTSPOT_JNI_SETSTATICINTFIELD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3197
DEFINE_SETSTATICFIELD(jlong,    long,   Long,    'J', j
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3198
                      , HOTSPOT_JNI_SETSTATICLONGFIELD_ENTRY(env, clazz, (uintptr_t) fieldID, value),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3199
                      HOTSPOT_JNI_SETSTATICLONGFIELD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3200
// Float and double probes don't return value because dtrace doesn't currently support it
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3201
DEFINE_SETSTATICFIELD(jfloat,   float,  Float,   'F', f
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3202
                      , HOTSPOT_JNI_SETSTATICFLOATFIELD_ENTRY(env, clazz, (uintptr_t) fieldID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3203
                      HOTSPOT_JNI_SETSTATICFLOATFIELD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3204
DEFINE_SETSTATICFIELD(jdouble,  double, Double,  'D', d
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3205
                      , HOTSPOT_JNI_SETSTATICDOUBLEFIELD_ENTRY(env, clazz, (uintptr_t) fieldID),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3206
                      HOTSPOT_JNI_SETSTATICDOUBLEFIELD_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3207
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3208
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3209
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3210
// String Operations
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3211
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3212
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3213
// Unicode Interface
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3214
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3215
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3216
DT_RETURN_MARK_DECL(NewString, jstring);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3217
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3218
DT_RETURN_MARK_DECL(NewString, jstring
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3219
                    , HOTSPOT_JNI_NEWSTRING_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3220
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3221
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3222
JNI_ENTRY(jstring, jni_NewString(JNIEnv *env, const jchar *unicodeChars, jsize len))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3223
  JNIWrapper("NewString");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3224
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3225
  DTRACE_PROBE3(hotspot_jni, NewString__entry, env, unicodeChars, len);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3226
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3227
 HOTSPOT_JNI_NEWSTRING_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3228
                             env, (uint16_t *) unicodeChars, len);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3229
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3230
  jstring ret = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3231
  DT_RETURN_MARK(NewString, jstring, (const jstring&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3232
  oop string=java_lang_String::create_oop_from_unicode((jchar*) unicodeChars, len, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3233
  ret = (jstring) JNIHandles::make_local(env, string);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3234
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3235
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3236
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3237
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3238
JNI_QUICK_ENTRY(jsize, jni_GetStringLength(JNIEnv *env, jstring string))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3239
  JNIWrapper("GetStringLength");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3240
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3241
  DTRACE_PROBE2(hotspot_jni, GetStringLength__entry, env, string);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3242
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3243
  HOTSPOT_JNI_GETSTRINGLENGTH_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3244
                                    env, string);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3245
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3246
  jsize ret = java_lang_String::length(JNIHandles::resolve_non_null(string));
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3247
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3248
  DTRACE_PROBE1(hotspot_jni, GetStringLength__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3249
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3250
 HOTSPOT_JNI_GETSTRINGLENGTH_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3251
                                    ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3252
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3253
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3254
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3255
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3256
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3257
JNI_QUICK_ENTRY(const jchar*, jni_GetStringChars(
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3258
  JNIEnv *env, jstring string, jboolean *isCopy))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3259
  JNIWrapper("GetStringChars");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3260
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3261
  DTRACE_PROBE3(hotspot_jni, GetStringChars__entry, env, string, isCopy);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3262
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3263
 HOTSPOT_JNI_GETSTRINGCHARS_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3264
                                  env, string, (uintptr_t *) isCopy);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3265
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3266
  //%note jni_5
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3267
  if (isCopy != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3268
    *isCopy = JNI_TRUE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3269
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3270
  oop s = JNIHandles::resolve_non_null(string);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3271
  int s_len = java_lang_String::length(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3272
  typeArrayOop s_value = java_lang_String::value(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3273
  int s_offset = java_lang_String::offset(s);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13087
diff changeset
  3274
  jchar* buf = NEW_C_HEAP_ARRAY(jchar, s_len + 1, mtInternal);  // add one for zero termination
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3275
  if (s_len > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3276
    memcpy(buf, s_value->char_at_addr(s_offset), sizeof(jchar)*s_len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3277
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3278
  buf[s_len] = 0;
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3279
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3280
  DTRACE_PROBE1(hotspot_jni, GetStringChars__return, buf);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3281
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3282
  HOTSPOT_JNI_GETSTRINGCHARS_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3283
                                    buf);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3284
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3285
  return buf;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3286
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3287
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3288
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3289
JNI_QUICK_ENTRY(void, jni_ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3290
  JNIWrapper("ReleaseStringChars");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3291
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3292
  DTRACE_PROBE3(hotspot_jni, ReleaseStringChars__entry, env, str, chars);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3293
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3294
  HOTSPOT_JNI_RELEASESTRINGCHARS_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3295
                                       env, str, (uint16_t *) chars);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3296
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3297
  //%note jni_6
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3298
  if (chars != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3299
    // Since String objects are supposed to be immutable, don't copy any
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3300
    // new data back.  A bad user will have to go after the char array.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3301
    FreeHeap((void*) chars);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3302
  }
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3303
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3304
  DTRACE_PROBE(hotspot_jni, ReleaseStringChars__return);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3305
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3306
  HOTSPOT_JNI_RELEASESTRINGCHARS_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3307
);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3308
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3309
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3310
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3311
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3312
// UTF Interface
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3313
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3314
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3315
DT_RETURN_MARK_DECL(NewStringUTF, jstring);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3316
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3317
DT_RETURN_MARK_DECL(NewStringUTF, jstring
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3318
                    , HOTSPOT_JNI_NEWSTRINGUTF_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3319
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3320
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3321
JNI_ENTRY(jstring, jni_NewStringUTF(JNIEnv *env, const char *bytes))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3322
  JNIWrapper("NewStringUTF");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3323
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3324
  DTRACE_PROBE2(hotspot_jni, NewStringUTF__entry, env, bytes);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3325
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3326
  HOTSPOT_JNI_NEWSTRINGUTF_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3327
                                 env, (char *) bytes);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3328
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3329
  jstring ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3330
  DT_RETURN_MARK(NewStringUTF, jstring, (const jstring&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3331
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3332
  oop result = java_lang_String::create_oop_from_str((char*) bytes, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3333
  ret = (jstring) JNIHandles::make_local(env, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3334
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3335
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3336
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3337
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3338
JNI_ENTRY(jsize, jni_GetStringUTFLength(JNIEnv *env, jstring string))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3339
  JNIWrapper("GetStringUTFLength");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3340
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3341
  DTRACE_PROBE2(hotspot_jni, GetStringUTFLength__entry, env, string);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3342
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3343
 HOTSPOT_JNI_GETSTRINGUTFLENGTH_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3344
                                      env, string);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3345
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3346
  jsize ret = java_lang_String::utf8_length(JNIHandles::resolve_non_null(string));
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3347
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3348
  DTRACE_PROBE1(hotspot_jni, GetStringUTFLength__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3349
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3350
  HOTSPOT_JNI_GETSTRINGUTFLENGTH_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3351
                                        ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3352
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3353
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3354
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3355
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3356
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3357
JNI_ENTRY(const char*, jni_GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3358
  JNIWrapper("GetStringUTFChars");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3359
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3360
  DTRACE_PROBE3(hotspot_jni, GetStringUTFChars__entry, env, string, isCopy);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3361
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3362
 HOTSPOT_JNI_GETSTRINGUTFCHARS_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3363
                                     env, string, (uintptr_t *) isCopy);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3364
#endif /* USDT2 */
7414
940d84ca7fca 6539281: -Xcheck:jni should validate char* argument to ReleaseStringUTFChars
sla
parents: 7405
diff changeset
  3365
  oop java_string = JNIHandles::resolve_non_null(string);
940d84ca7fca 6539281: -Xcheck:jni should validate char* argument to ReleaseStringUTFChars
sla
parents: 7405
diff changeset
  3366
  size_t length = java_lang_String::utf8_length(java_string);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13087
diff changeset
  3367
  char* result = AllocateHeap(length + 1, mtInternal);
7414
940d84ca7fca 6539281: -Xcheck:jni should validate char* argument to ReleaseStringUTFChars
sla
parents: 7405
diff changeset
  3368
  java_lang_String::as_utf8_string(java_string, result, (int) length + 1);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3369
  if (isCopy != NULL) *isCopy = JNI_TRUE;
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3370
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3371
  DTRACE_PROBE1(hotspot_jni, GetStringUTFChars__return, result);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3372
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3373
 HOTSPOT_JNI_GETSTRINGUTFCHARS_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3374
                                      result);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3375
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3376
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3377
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3378
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3379
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3380
JNI_LEAF(void, jni_ReleaseStringUTFChars(JNIEnv *env, jstring str, const char *chars))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3381
  JNIWrapper("ReleaseStringUTFChars");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3382
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3383
  DTRACE_PROBE3(hotspot_jni, ReleaseStringUTFChars__entry, env, str, chars);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3384
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3385
 HOTSPOT_JNI_RELEASESTRINGUTFCHARS_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3386
                                         env, str, (char *) chars);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3387
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3388
  if (chars != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3389
    FreeHeap((char*) chars);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3390
  }
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3391
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3392
  DTRACE_PROBE(hotspot_jni, ReleaseStringUTFChars__return);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3393
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3394
HOTSPOT_JNI_RELEASESTRINGUTFCHARS_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3395
);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3396
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3397
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3398
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3399
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3400
JNI_QUICK_ENTRY(jsize, jni_GetArrayLength(JNIEnv *env, jarray array))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3401
  JNIWrapper("GetArrayLength");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3402
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3403
  DTRACE_PROBE2(hotspot_jni, GetArrayLength__entry, env, array);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3404
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3405
 HOTSPOT_JNI_GETARRAYLENGTH_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3406
                                  env, array);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3407
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3408
  arrayOop a = arrayOop(JNIHandles::resolve_non_null(array));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3409
  assert(a->is_array(), "must be array");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3410
  jsize ret = a->length();
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3411
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3412
  DTRACE_PROBE1(hotspot_jni, GetArrayLength__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3413
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3414
 HOTSPOT_JNI_GETARRAYLENGTH_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3415
                                   ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3416
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3417
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3418
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3419
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3420
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3421
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3422
// Object Array Operations
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3423
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3424
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3425
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3426
DT_RETURN_MARK_DECL(NewObjectArray, jobjectArray);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3427
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3428
DT_RETURN_MARK_DECL(NewObjectArray, jobjectArray
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3429
                    , HOTSPOT_JNI_NEWOBJECTARRAY_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3430
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3431
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3432
JNI_ENTRY(jobjectArray, jni_NewObjectArray(JNIEnv *env, jsize length, jclass elementClass, jobject initialElement))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3433
  JNIWrapper("NewObjectArray");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3434
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3435
  DTRACE_PROBE4(hotspot_jni, NewObjectArray__entry, env, length, elementClass, initialElement);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3436
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3437
 HOTSPOT_JNI_NEWOBJECTARRAY_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3438
                                  env, length, elementClass, initialElement);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3439
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3440
  jobjectArray ret = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3441
  DT_RETURN_MARK(NewObjectArray, jobjectArray, (const jobjectArray&)ret);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  3442
  KlassHandle ek(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(elementClass)));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  3443
  Klass* ako = Klass::cast(ek())->array_klass(CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3444
  KlassHandle ak = KlassHandle(THREAD, ako);
13952
e3cf184080bc 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 13728
diff changeset
  3445
  ObjArrayKlass::cast(ak())->initialize(CHECK_NULL);
e3cf184080bc 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 13728
diff changeset
  3446
  objArrayOop result = ObjArrayKlass::cast(ak())->allocate(length, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3447
  oop initial_value = JNIHandles::resolve(initialElement);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3448
  if (initial_value != NULL) {  // array already initialized with NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3449
    for (int index = 0; index < length; index++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3450
      result->obj_at_put(index, initial_value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3451
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3452
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3453
  ret = (jobjectArray) JNIHandles::make_local(env, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3454
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3455
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3456
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3457
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3458
DT_RETURN_MARK_DECL(GetObjectArrayElement, jobject);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3459
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3460
DT_RETURN_MARK_DECL(GetObjectArrayElement, jobject
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3461
                    , HOTSPOT_JNI_GETOBJECTARRAYELEMENT_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3462
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3463
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3464
JNI_ENTRY(jobject, jni_GetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3465
  JNIWrapper("GetObjectArrayElement");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3466
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3467
  DTRACE_PROBE3(hotspot_jni, GetObjectArrayElement__entry, env, array, index);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3468
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3469
 HOTSPOT_JNI_GETOBJECTARRAYELEMENT_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3470
                                         env, array, index);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3471
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3472
  jobject ret = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3473
  DT_RETURN_MARK(GetObjectArrayElement, jobject, (const jobject&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3474
  objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(array));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3475
  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
  3476
    ret = JNIHandles::make_local(env, a->obj_at(index));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3477
    return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3478
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3479
    char buf[jintAsStringSize];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3480
    sprintf(buf, "%d", index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3481
    THROW_MSG_0(vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3482
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3483
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3484
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3485
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3486
DT_VOID_RETURN_MARK_DECL(SetObjectArrayElement);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3487
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3488
DT_VOID_RETURN_MARK_DECL(SetObjectArrayElement
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3489
                         , HOTSPOT_JNI_SETOBJECTARRAYELEMENT_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3490
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3491
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3492
JNI_ENTRY(void, jni_SetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index, jobject value))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3493
  JNIWrapper("SetObjectArrayElement");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3494
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3495
  DTRACE_PROBE4(hotspot_jni, SetObjectArrayElement__entry, env, array, index, value);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3496
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3497
 HOTSPOT_JNI_SETOBJECTARRAYELEMENT_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3498
                                         env, array, index, value);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3499
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3500
  DT_VOID_RETURN_MARK(SetObjectArrayElement);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3501
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3502
  objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(array));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3503
  oop v = JNIHandles::resolve(value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3504
  if (a->is_within_bounds(index)) {
13952
e3cf184080bc 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 13728
diff changeset
  3505
    if (v == NULL || v->is_a(ObjArrayKlass::cast(a->klass())->element_klass())) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3506
      a->obj_at_put(index, v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3507
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3508
      THROW(vmSymbols::java_lang_ArrayStoreException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3509
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3510
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3511
    char buf[jintAsStringSize];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3512
    sprintf(buf, "%d", index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3513
    THROW_MSG(vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3514
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3515
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3516
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3517
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3518
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3519
#define DEFINE_NEWSCALARARRAY(Return,Allocator,Result) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3520
\
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3521
  DT_RETURN_MARK_DECL(New##Result##Array, Return); \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3522
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3523
JNI_ENTRY(Return, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3524
          jni_New##Result##Array(JNIEnv *env, jsize len)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3525
  JNIWrapper("New" XSTR(Result) "Array"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3526
  DTRACE_PROBE2(hotspot_jni, New##Result##Array__entry, env, len);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3527
  Return ret = NULL;\
4089
14bd2cd13a2c 6893483: DTrace probe return values for a couple JNI methods are wrong
kamg
parents: 3820
diff changeset
  3528
  DT_RETURN_MARK(New##Result##Array, Return, (const Return&)ret);\
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3529
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3530
  oop obj= oopFactory::Allocator(len, CHECK_0); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3531
  ret = (Return) JNIHandles::make_local(env, obj); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3532
  return ret;\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3533
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3534
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3535
DEFINE_NEWSCALARARRAY(jbooleanArray, new_boolArray,   Boolean)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3536
DEFINE_NEWSCALARARRAY(jbyteArray,    new_byteArray,   Byte)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3537
DEFINE_NEWSCALARARRAY(jshortArray,   new_shortArray,  Short)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3538
DEFINE_NEWSCALARARRAY(jcharArray,    new_charArray,   Char)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3539
DEFINE_NEWSCALARARRAY(jintArray,     new_intArray,    Int)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3540
DEFINE_NEWSCALARARRAY(jlongArray,    new_longArray,   Long)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3541
DEFINE_NEWSCALARARRAY(jfloatArray,   new_singleArray, Float)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3542
DEFINE_NEWSCALARARRAY(jdoubleArray,  new_doubleArray, Double)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3543
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3544
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3545
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3546
#define DEFINE_NEWSCALARARRAY(Return,Allocator,Result \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3547
                              ,EntryProbe,ReturnProbe)  \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3548
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3549
  DT_RETURN_MARK_DECL(New##Result##Array, Return \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3550
                      , ReturnProbe); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3551
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3552
JNI_ENTRY(Return, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3553
          jni_New##Result##Array(JNIEnv *env, jsize len)) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3554
  JNIWrapper("New" XSTR(Result) "Array"); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3555
  EntryProbe; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3556
  Return ret = NULL;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3557
  DT_RETURN_MARK(New##Result##Array, Return, (const Return&)ret);\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3558
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3559
  oop obj= oopFactory::Allocator(len, CHECK_0); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3560
  ret = (Return) JNIHandles::make_local(env, obj); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3561
  return ret;\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3562
JNI_END
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3563
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3564
DEFINE_NEWSCALARARRAY(jbooleanArray, new_boolArray,   Boolean,
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3565
                      HOTSPOT_JNI_NEWBOOLEANARRAY_ENTRY(env, len),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3566
                      HOTSPOT_JNI_NEWBOOLEANARRAY_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3567
DEFINE_NEWSCALARARRAY(jbyteArray,    new_byteArray,   Byte,
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3568
                      HOTSPOT_JNI_NEWBYTEARRAY_ENTRY(env, len),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3569
                      HOTSPOT_JNI_NEWBYTEARRAY_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3570
DEFINE_NEWSCALARARRAY(jshortArray,   new_shortArray,  Short,
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3571
                      HOTSPOT_JNI_NEWSHORTARRAY_ENTRY(env, len),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3572
                      HOTSPOT_JNI_NEWSHORTARRAY_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3573
DEFINE_NEWSCALARARRAY(jcharArray,    new_charArray,   Char,
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3574
                      HOTSPOT_JNI_NEWCHARARRAY_ENTRY(env, len),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3575
                      HOTSPOT_JNI_NEWCHARARRAY_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3576
DEFINE_NEWSCALARARRAY(jintArray,     new_intArray,    Int,
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3577
                      HOTSPOT_JNI_NEWINTARRAY_ENTRY(env, len),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3578
                      HOTSPOT_JNI_NEWINTARRAY_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3579
DEFINE_NEWSCALARARRAY(jlongArray,    new_longArray,   Long,
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3580
                      HOTSPOT_JNI_NEWLONGARRAY_ENTRY(env, len),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3581
                      HOTSPOT_JNI_NEWLONGARRAY_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3582
DEFINE_NEWSCALARARRAY(jfloatArray,   new_singleArray, Float,
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3583
                      HOTSPOT_JNI_NEWFLOATARRAY_ENTRY(env, len),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3584
                      HOTSPOT_JNI_NEWFLOATARRAY_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3585
DEFINE_NEWSCALARARRAY(jdoubleArray,  new_doubleArray, Double,
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3586
                      HOTSPOT_JNI_NEWDOUBLEARRAY_ENTRY(env, len),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3587
                      HOTSPOT_JNI_NEWDOUBLEARRAY_RETURN(_ret_ref))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3588
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3589
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3590
// Return an address which will fault if the caller writes to it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3591
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3592
static char* get_bad_address() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3593
  static char* bad_address = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3594
  if (bad_address == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3595
    size_t size = os::vm_allocation_granularity();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3596
    bad_address = os::reserve_memory(size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3597
    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
  3598
      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
  3599
                         /*is_committed*/false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3600
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3601
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3602
  return bad_address;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3603
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3604
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3605
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3606
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3607
#define DEFINE_GETSCALARARRAYELEMENTS(ElementTag,ElementType,Result, Tag) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3608
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3609
JNI_QUICK_ENTRY(ElementType*, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3610
          jni_Get##Result##ArrayElements(JNIEnv *env, ElementType##Array array, jboolean *isCopy)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3611
  JNIWrapper("Get" XSTR(Result) "ArrayElements"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3612
  DTRACE_PROBE3(hotspot_jni, Get##Result##ArrayElements__entry, env, array, isCopy);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3613
  /* allocate an chunk of memory in c land */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3614
  typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3615
  ElementType* result; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3616
  int len = a->length(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3617
  if (len == 0) { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3618
    /* Empty array: legal but useless, can't return NULL. \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3619
     * Return a pointer to something useless. \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3620
     * Avoid asserts in typeArrayOop. */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3621
    result = (ElementType*)get_bad_address(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3622
  } else { \
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13087
diff changeset
  3623
    result = NEW_C_HEAP_ARRAY(ElementType, len, mtInternal); \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3624
    /* copy the array to the c chunk */ \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3625
    memcpy(result, a->Tag##_at_addr(0), sizeof(ElementType)*len); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3626
  } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3627
  if (isCopy) *isCopy = JNI_TRUE; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3628
  DTRACE_PROBE1(hotspot_jni, Get##Result##ArrayElements__return, result);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3629
  return result; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3630
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3631
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3632
DEFINE_GETSCALARARRAYELEMENTS(T_BOOLEAN, jboolean, Boolean, bool)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3633
DEFINE_GETSCALARARRAYELEMENTS(T_BYTE,    jbyte,    Byte,    byte)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3634
DEFINE_GETSCALARARRAYELEMENTS(T_SHORT,   jshort,   Short,   short)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3635
DEFINE_GETSCALARARRAYELEMENTS(T_CHAR,    jchar,    Char,    char)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3636
DEFINE_GETSCALARARRAYELEMENTS(T_INT,     jint,     Int,     int)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3637
DEFINE_GETSCALARARRAYELEMENTS(T_LONG,    jlong,    Long,    long)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3638
DEFINE_GETSCALARARRAYELEMENTS(T_FLOAT,   jfloat,   Float,   float)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3639
DEFINE_GETSCALARARRAYELEMENTS(T_DOUBLE,  jdouble,  Double,  double)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3640
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3641
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3642
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3643
#define DEFINE_GETSCALARARRAYELEMENTS(ElementTag,ElementType,Result, Tag \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3644
                                      , EntryProbe, ReturnProbe) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3645
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3646
JNI_QUICK_ENTRY(ElementType*, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3647
          jni_Get##Result##ArrayElements(JNIEnv *env, ElementType##Array array, jboolean *isCopy)) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3648
  JNIWrapper("Get" XSTR(Result) "ArrayElements"); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3649
  EntryProbe; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3650
  /* allocate an chunk of memory in c land */ \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3651
  typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3652
  ElementType* result; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3653
  int len = a->length(); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3654
  if (len == 0) { \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3655
    /* Empty array: legal but useless, can't return NULL. \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3656
     * Return a pointer to something useless. \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3657
     * Avoid asserts in typeArrayOop. */ \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3658
    result = (ElementType*)get_bad_address(); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3659
  } else { \
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13087
diff changeset
  3660
    result = NEW_C_HEAP_ARRAY(ElementType, len, mtInternal); \
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3661
    /* copy the array to the c chunk */ \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3662
    memcpy(result, a->Tag##_at_addr(0), sizeof(ElementType)*len); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3663
  } \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3664
  if (isCopy) *isCopy = JNI_TRUE; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3665
  ReturnProbe; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3666
  return result; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3667
JNI_END
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3668
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3669
DEFINE_GETSCALARARRAYELEMENTS(T_BOOLEAN, jboolean, Boolean, bool
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3670
                              , HOTSPOT_JNI_GETBOOLEANARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3671
                              HOTSPOT_JNI_GETBOOLEANARRAYELEMENTS_RETURN((uintptr_t*)result))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3672
DEFINE_GETSCALARARRAYELEMENTS(T_BYTE,    jbyte,    Byte,    byte
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3673
                              , HOTSPOT_JNI_GETBYTEARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3674
                              HOTSPOT_JNI_GETBYTEARRAYELEMENTS_RETURN((char*)result))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3675
DEFINE_GETSCALARARRAYELEMENTS(T_SHORT,   jshort,   Short,   short
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3676
                              , HOTSPOT_JNI_GETSHORTARRAYELEMENTS_ENTRY(env, (uint16_t*) array, (uintptr_t *) isCopy),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3677
                              HOTSPOT_JNI_GETSHORTARRAYELEMENTS_RETURN((uint16_t*)result))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3678
DEFINE_GETSCALARARRAYELEMENTS(T_CHAR,    jchar,    Char,    char
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3679
                              , HOTSPOT_JNI_GETCHARARRAYELEMENTS_ENTRY(env, (uint16_t*) array, (uintptr_t *) isCopy),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3680
                              HOTSPOT_JNI_GETCHARARRAYELEMENTS_RETURN(result))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3681
DEFINE_GETSCALARARRAYELEMENTS(T_INT,     jint,     Int,     int
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3682
                              , HOTSPOT_JNI_GETINTARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3683
                              HOTSPOT_JNI_GETINTARRAYELEMENTS_RETURN((uint32_t*)result))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3684
DEFINE_GETSCALARARRAYELEMENTS(T_LONG,    jlong,    Long,    long
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3685
                              , HOTSPOT_JNI_GETLONGARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3686
                              HOTSPOT_JNI_GETLONGARRAYELEMENTS_RETURN(((uintptr_t*)result)))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3687
// Float and double probes don't return value because dtrace doesn't currently support it
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3688
DEFINE_GETSCALARARRAYELEMENTS(T_FLOAT,   jfloat,   Float,   float
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3689
                              , HOTSPOT_JNI_GETFLOATARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3690
                              HOTSPOT_JNI_GETFLOATARRAYELEMENTS_RETURN(result))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3691
DEFINE_GETSCALARARRAYELEMENTS(T_DOUBLE,  jdouble,  Double,  double
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3692
                              , HOTSPOT_JNI_GETDOUBLEARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3693
                              HOTSPOT_JNI_GETDOUBLEARRAYELEMENTS_RETURN(result))
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3694
#endif /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3695
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3696
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3697
#define DEFINE_RELEASESCALARARRAYELEMENTS(ElementTag,ElementType,Result,Tag) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3698
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3699
JNI_QUICK_ENTRY(void, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3700
          jni_Release##Result##ArrayElements(JNIEnv *env, ElementType##Array array, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3701
                                             ElementType *buf, jint mode)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3702
  JNIWrapper("Release" XSTR(Result) "ArrayElements"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3703
  DTRACE_PROBE4(hotspot_jni, Release##Result##ArrayElements__entry, env, array, buf, mode);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3704
  typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3705
  int len = a->length(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3706
  if (len != 0) {   /* Empty array:  nothing to free or copy. */  \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3707
    if ((mode == 0) || (mode == JNI_COMMIT)) { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3708
      memcpy(a->Tag##_at_addr(0), buf, sizeof(ElementType)*len); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3709
    } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3710
    if ((mode == 0) || (mode == JNI_ABORT)) { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3711
      FreeHeap(buf); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3712
    } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3713
  } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3714
  DTRACE_PROBE(hotspot_jni, Release##Result##ArrayElements__return);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3715
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3716
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3717
DEFINE_RELEASESCALARARRAYELEMENTS(T_BOOLEAN, jboolean, Boolean, bool)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3718
DEFINE_RELEASESCALARARRAYELEMENTS(T_BYTE,    jbyte,    Byte,    byte)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3719
DEFINE_RELEASESCALARARRAYELEMENTS(T_SHORT,   jshort,   Short,   short)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3720
DEFINE_RELEASESCALARARRAYELEMENTS(T_CHAR,    jchar,    Char,    char)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3721
DEFINE_RELEASESCALARARRAYELEMENTS(T_INT,     jint,     Int,     int)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3722
DEFINE_RELEASESCALARARRAYELEMENTS(T_LONG,    jlong,    Long,    long)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3723
DEFINE_RELEASESCALARARRAYELEMENTS(T_FLOAT,   jfloat,   Float,   float)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3724
DEFINE_RELEASESCALARARRAYELEMENTS(T_DOUBLE,  jdouble,  Double,  double)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3725
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3726
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3727
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3728
#define DEFINE_RELEASESCALARARRAYELEMENTS(ElementTag,ElementType,Result,Tag \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3729
                                          , EntryProbe, ReturnProbe);\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3730
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3731
JNI_QUICK_ENTRY(void, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3732
          jni_Release##Result##ArrayElements(JNIEnv *env, ElementType##Array array, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3733
                                             ElementType *buf, jint mode)) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3734
  JNIWrapper("Release" XSTR(Result) "ArrayElements"); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3735
  EntryProbe; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3736
  typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3737
  int len = a->length(); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3738
  if (len != 0) {   /* Empty array:  nothing to free or copy. */  \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3739
    if ((mode == 0) || (mode == JNI_COMMIT)) { \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3740
      memcpy(a->Tag##_at_addr(0), buf, sizeof(ElementType)*len); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3741
    } \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3742
    if ((mode == 0) || (mode == JNI_ABORT)) { \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3743
      FreeHeap(buf); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3744
    } \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3745
  } \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3746
  ReturnProbe; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3747
JNI_END
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3748
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3749
DEFINE_RELEASESCALARARRAYELEMENTS(T_BOOLEAN, jboolean, Boolean, bool
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3750
                                  , HOTSPOT_JNI_RELEASEBOOLEANARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) buf, mode),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3751
                                  HOTSPOT_JNI_RELEASEBOOLEANARRAYELEMENTS_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3752
DEFINE_RELEASESCALARARRAYELEMENTS(T_BYTE,    jbyte,    Byte,    byte
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3753
                                  , HOTSPOT_JNI_RELEASEBYTEARRAYELEMENTS_ENTRY(env, array, (char *) buf, mode),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3754
                                  HOTSPOT_JNI_RELEASEBYTEARRAYELEMENTS_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3755
DEFINE_RELEASESCALARARRAYELEMENTS(T_SHORT,   jshort,   Short,   short
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3756
                                  ,  HOTSPOT_JNI_RELEASESHORTARRAYELEMENTS_ENTRY(env, array, (uint16_t *) buf, mode),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3757
                                  HOTSPOT_JNI_RELEASESHORTARRAYELEMENTS_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3758
DEFINE_RELEASESCALARARRAYELEMENTS(T_CHAR,    jchar,    Char,    char
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3759
                                  ,  HOTSPOT_JNI_RELEASECHARARRAYELEMENTS_ENTRY(env, array, (uint16_t *) buf, mode),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3760
                                  HOTSPOT_JNI_RELEASECHARARRAYELEMENTS_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3761
DEFINE_RELEASESCALARARRAYELEMENTS(T_INT,     jint,     Int,     int
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3762
                                  , HOTSPOT_JNI_RELEASEINTARRAYELEMENTS_ENTRY(env, array, (uint32_t *) buf, mode),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3763
                                  HOTSPOT_JNI_RELEASEINTARRAYELEMENTS_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3764
DEFINE_RELEASESCALARARRAYELEMENTS(T_LONG,    jlong,    Long,    long
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3765
                                  , HOTSPOT_JNI_RELEASELONGARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) buf, mode),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3766
                                  HOTSPOT_JNI_RELEASELONGARRAYELEMENTS_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3767
DEFINE_RELEASESCALARARRAYELEMENTS(T_FLOAT,   jfloat,   Float,   float
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3768
                                  , HOTSPOT_JNI_RELEASEFLOATARRAYELEMENTS_ENTRY(env, array, (float *) buf, mode),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3769
                                  HOTSPOT_JNI_RELEASEFLOATARRAYELEMENTS_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3770
DEFINE_RELEASESCALARARRAYELEMENTS(T_DOUBLE,  jdouble,  Double,  double
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3771
                                  , HOTSPOT_JNI_RELEASEDOUBLEARRAYELEMENTS_ENTRY(env, array, (double *) buf, mode),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3772
                                  HOTSPOT_JNI_RELEASEDOUBLEARRAYELEMENTS_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3773
#endif /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3774
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3775
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3776
#define DEFINE_GETSCALARARRAYREGION(ElementTag,ElementType,Result, Tag) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3777
  DT_VOID_RETURN_MARK_DECL(Get##Result##ArrayRegion);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3778
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3779
JNI_ENTRY(void, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3780
jni_Get##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3781
             jsize len, ElementType *buf)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3782
  JNIWrapper("Get" XSTR(Result) "ArrayRegion"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3783
  DTRACE_PROBE5(hotspot_jni, Get##Result##ArrayRegion__entry, env, array, start, len, buf);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3784
  DT_VOID_RETURN_MARK(Get##Result##ArrayRegion); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3785
  typeArrayOop src = typeArrayOop(JNIHandles::resolve_non_null(array)); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3786
  if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)src->length())) { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3787
    THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3788
  } else { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3789
    if (len > 0) { \
13952
e3cf184080bc 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 13728
diff changeset
  3790
      int sc = TypeArrayKlass::cast(src->klass())->log2_element_size(); \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3791
      memcpy((u_char*) buf, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3792
             (u_char*) src->Tag##_at_addr(start), \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3793
             len << sc);                          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3794
    } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3795
  } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3796
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3797
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3798
DEFINE_GETSCALARARRAYREGION(T_BOOLEAN, jboolean,Boolean, bool)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3799
DEFINE_GETSCALARARRAYREGION(T_BYTE,    jbyte,   Byte,    byte)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3800
DEFINE_GETSCALARARRAYREGION(T_SHORT,   jshort,  Short,   short)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3801
DEFINE_GETSCALARARRAYREGION(T_CHAR,    jchar,   Char,    char)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3802
DEFINE_GETSCALARARRAYREGION(T_INT,     jint,    Int,     int)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3803
DEFINE_GETSCALARARRAYREGION(T_LONG,    jlong,   Long,    long)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3804
DEFINE_GETSCALARARRAYREGION(T_FLOAT,   jfloat,  Float,   float)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3805
DEFINE_GETSCALARARRAYREGION(T_DOUBLE,  jdouble, Double,  double)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3806
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3807
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3808
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3809
#define DEFINE_GETSCALARARRAYREGION(ElementTag,ElementType,Result, Tag \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3810
                                    , EntryProbe, ReturnProbe); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3811
  DT_VOID_RETURN_MARK_DECL(Get##Result##ArrayRegion \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3812
                           , ReturnProbe); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3813
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3814
JNI_ENTRY(void, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3815
jni_Get##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3816
             jsize len, ElementType *buf)) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3817
  JNIWrapper("Get" XSTR(Result) "ArrayRegion"); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3818
  EntryProbe; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3819
  DT_VOID_RETURN_MARK(Get##Result##ArrayRegion); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3820
  typeArrayOop src = typeArrayOop(JNIHandles::resolve_non_null(array)); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3821
  if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)src->length())) { \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3822
    THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3823
  } else { \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3824
    if (len > 0) { \
13952
e3cf184080bc 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 13728
diff changeset
  3825
      int sc = TypeArrayKlass::cast(src->klass())->log2_element_size(); \
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3826
      memcpy((u_char*) buf, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3827
             (u_char*) src->Tag##_at_addr(start), \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3828
             len << sc);                          \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3829
    } \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3830
  } \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3831
JNI_END
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3832
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3833
DEFINE_GETSCALARARRAYREGION(T_BOOLEAN, jboolean,Boolean, bool
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3834
                            , HOTSPOT_JNI_GETBOOLEANARRAYREGION_ENTRY(env, array, start, len, (uintptr_t *) buf),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3835
                            HOTSPOT_JNI_GETBOOLEANARRAYREGION_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3836
DEFINE_GETSCALARARRAYREGION(T_BYTE,    jbyte,   Byte,    byte
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3837
                            ,  HOTSPOT_JNI_GETBYTEARRAYREGION_ENTRY(env, array, start, len, (char *) buf),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3838
                            HOTSPOT_JNI_GETBYTEARRAYREGION_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3839
DEFINE_GETSCALARARRAYREGION(T_SHORT,   jshort,  Short,   short
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3840
                            , HOTSPOT_JNI_GETSHORTARRAYREGION_ENTRY(env, array, start, len, (uint16_t *) buf),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3841
                            HOTSPOT_JNI_GETSHORTARRAYREGION_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3842
DEFINE_GETSCALARARRAYREGION(T_CHAR,    jchar,   Char,    char
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3843
                            ,  HOTSPOT_JNI_GETCHARARRAYREGION_ENTRY(env, array, start, len, (uint16_t*) buf),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3844
                            HOTSPOT_JNI_GETCHARARRAYREGION_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3845
DEFINE_GETSCALARARRAYREGION(T_INT,     jint,    Int,     int
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3846
                            , HOTSPOT_JNI_GETINTARRAYREGION_ENTRY(env, array, start, len, (uint32_t*) buf),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3847
                            HOTSPOT_JNI_GETINTARRAYREGION_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3848
DEFINE_GETSCALARARRAYREGION(T_LONG,    jlong,   Long,    long
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3849
                            ,  HOTSPOT_JNI_GETLONGARRAYREGION_ENTRY(env, array, start, len, (uintptr_t *) buf),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3850
                            HOTSPOT_JNI_GETLONGARRAYREGION_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3851
DEFINE_GETSCALARARRAYREGION(T_FLOAT,   jfloat,  Float,   float
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3852
                            , HOTSPOT_JNI_GETFLOATARRAYREGION_ENTRY(env, array, start, len, (float *) buf),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3853
                            HOTSPOT_JNI_GETFLOATARRAYREGION_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3854
DEFINE_GETSCALARARRAYREGION(T_DOUBLE,  jdouble, Double,  double
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3855
                            , HOTSPOT_JNI_GETDOUBLEARRAYREGION_ENTRY(env, array, start, len, (double *) buf),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3856
                            HOTSPOT_JNI_GETDOUBLEARRAYREGION_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3857
#endif /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3858
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3859
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3860
#define DEFINE_SETSCALARARRAYREGION(ElementTag,ElementType,Result, Tag) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3861
  DT_VOID_RETURN_MARK_DECL(Set##Result##ArrayRegion);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3862
\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3863
JNI_ENTRY(void, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3864
jni_Set##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3865
             jsize len, const ElementType *buf)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3866
  JNIWrapper("Set" XSTR(Result) "ArrayRegion"); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3867
  DTRACE_PROBE5(hotspot_jni, Set##Result##ArrayRegion__entry, env, array, start, len, buf);\
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3868
  DT_VOID_RETURN_MARK(Set##Result##ArrayRegion); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3869
  typeArrayOop dst = typeArrayOop(JNIHandles::resolve_non_null(array)); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3870
  if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)dst->length())) { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3871
    THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3872
  } else { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3873
    if (len > 0) { \
13952
e3cf184080bc 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 13728
diff changeset
  3874
      int sc = TypeArrayKlass::cast(dst->klass())->log2_element_size(); \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3875
      memcpy((u_char*) dst->Tag##_at_addr(start), \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3876
             (u_char*) buf, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3877
             len << sc);    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3878
    } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3879
  } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3880
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3881
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3882
DEFINE_SETSCALARARRAYREGION(T_BOOLEAN, jboolean, Boolean, bool)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3883
DEFINE_SETSCALARARRAYREGION(T_BYTE,    jbyte,    Byte,    byte)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3884
DEFINE_SETSCALARARRAYREGION(T_SHORT,   jshort,   Short,   short)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3885
DEFINE_SETSCALARARRAYREGION(T_CHAR,    jchar,    Char,    char)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3886
DEFINE_SETSCALARARRAYREGION(T_INT,     jint,     Int,     int)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3887
DEFINE_SETSCALARARRAYREGION(T_LONG,    jlong,    Long,    long)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3888
DEFINE_SETSCALARARRAYREGION(T_FLOAT,   jfloat,   Float,   float)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3889
DEFINE_SETSCALARARRAYREGION(T_DOUBLE,  jdouble,  Double,  double)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3890
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3891
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3892
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3893
#define DEFINE_SETSCALARARRAYREGION(ElementTag,ElementType,Result, Tag \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3894
                                    , EntryProbe, ReturnProbe); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3895
  DT_VOID_RETURN_MARK_DECL(Set##Result##ArrayRegion \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3896
                           ,ReturnProbe);           \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3897
\
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3898
JNI_ENTRY(void, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3899
jni_Set##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3900
             jsize len, const ElementType *buf)) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3901
  JNIWrapper("Set" XSTR(Result) "ArrayRegion"); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3902
  EntryProbe; \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3903
  DT_VOID_RETURN_MARK(Set##Result##ArrayRegion); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3904
  typeArrayOop dst = typeArrayOop(JNIHandles::resolve_non_null(array)); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3905
  if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)dst->length())) { \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3906
    THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3907
  } else { \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3908
    if (len > 0) { \
13952
e3cf184080bc 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 13728
diff changeset
  3909
      int sc = TypeArrayKlass::cast(dst->klass())->log2_element_size(); \
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3910
      memcpy((u_char*) dst->Tag##_at_addr(start), \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3911
             (u_char*) buf, \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3912
             len << sc);    \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3913
    } \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3914
  } \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3915
JNI_END
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3916
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3917
DEFINE_SETSCALARARRAYREGION(T_BOOLEAN, jboolean, Boolean, bool
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3918
                            , HOTSPOT_JNI_SETBOOLEANARRAYREGION_ENTRY(env, array, start, len, (uintptr_t *)buf),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3919
                            HOTSPOT_JNI_SETBOOLEANARRAYREGION_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3920
DEFINE_SETSCALARARRAYREGION(T_BYTE,    jbyte,    Byte,    byte
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3921
                            , HOTSPOT_JNI_SETBYTEARRAYREGION_ENTRY(env, array, start, len, (char *) buf),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3922
                            HOTSPOT_JNI_SETBYTEARRAYREGION_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3923
DEFINE_SETSCALARARRAYREGION(T_SHORT,   jshort,   Short,   short
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3924
                            , HOTSPOT_JNI_SETSHORTARRAYREGION_ENTRY(env, array, start, len, (uint16_t *) buf),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3925
                            HOTSPOT_JNI_SETSHORTARRAYREGION_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3926
DEFINE_SETSCALARARRAYREGION(T_CHAR,    jchar,    Char,    char
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3927
                            , HOTSPOT_JNI_SETCHARARRAYREGION_ENTRY(env, array, start, len, (uint16_t *) buf),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3928
                            HOTSPOT_JNI_SETCHARARRAYREGION_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3929
DEFINE_SETSCALARARRAYREGION(T_INT,     jint,     Int,     int
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3930
                            , HOTSPOT_JNI_SETINTARRAYREGION_ENTRY(env, array, start, len, (uint32_t *) buf),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3931
                            HOTSPOT_JNI_SETINTARRAYREGION_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3932
DEFINE_SETSCALARARRAYREGION(T_LONG,    jlong,    Long,    long
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3933
                            , HOTSPOT_JNI_SETLONGARRAYREGION_ENTRY(env, array, start, len, (uintptr_t *) buf),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3934
                            HOTSPOT_JNI_SETLONGARRAYREGION_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3935
DEFINE_SETSCALARARRAYREGION(T_FLOAT,   jfloat,   Float,   float
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3936
                            , HOTSPOT_JNI_SETFLOATARRAYREGION_ENTRY(env, array, start, len, (float *) buf),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3937
                            HOTSPOT_JNI_SETFLOATARRAYREGION_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3938
DEFINE_SETSCALARARRAYREGION(T_DOUBLE,  jdouble,  Double,  double
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3939
                            , HOTSPOT_JNI_SETDOUBLEARRAYREGION_ENTRY(env, array, start, len, (double *) buf),
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3940
                            HOTSPOT_JNI_SETDOUBLEARRAYREGION_RETURN())
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3941
#endif /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  3942
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3943
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3944
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3945
// Interception of natives
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3946
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3947
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3948
// The RegisterNatives call being attempted tried to register with a method that
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3949
// is not native.  Ask JVM TI what prefixes have been specified.  Then check
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3950
// to see if the native method is now wrapped with the prefixes.  See the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3951
// SetNativeMethodPrefix(es) functions in the JVM TI Spec for details.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  3952
static Method* find_prefixed_native(KlassHandle k,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  3953
                                      Symbol* name, Symbol* signature, TRAPS) {
13975
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13728
diff changeset
  3954
#if INCLUDE_JVMTI
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3955
  ResourceMark rm(THREAD);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  3956
  Method* method;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3957
  int name_len = name->utf8_length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3958
  char* name_str = name->as_utf8();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3959
  int prefix_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3960
  char** prefixes = JvmtiExport::get_all_native_method_prefixes(&prefix_count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3961
  for (int i = 0; i < prefix_count; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3962
    char* prefix = prefixes[i];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3963
    int prefix_len = (int)strlen(prefix);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3964
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3965
    // try adding this prefix to the method name and see if it matches another method name
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3966
    int trial_len = name_len + prefix_len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3967
    char* trial_name_str = NEW_RESOURCE_ARRAY(char, trial_len + 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3968
    strcpy(trial_name_str, prefix);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3969
    strcat(trial_name_str, name_str);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  3970
    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
  3971
    if (trial_name == NULL) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3972
      continue; // no such symbol, so this prefix wasn't used, try the next prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3973
    }
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  3974
    method = Klass::cast(k())->lookup_method(trial_name, signature);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3975
    if (method == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3976
      continue; // signature doesn't match, try the next prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3977
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3978
    if (method->is_native()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3979
      method->set_is_prefixed_native();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3980
      return method; // wahoo, we found a prefixed version of the method, return it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3981
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3982
    // found as non-native, so prefix is good, add it, probably just need more prefixes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3983
    name_len = trial_len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3984
    name_str = trial_name_str;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3985
  }
13975
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13728
diff changeset
  3986
#endif // INCLUDE_JVMTI
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3987
  return NULL; // not found
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3988
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3989
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  3990
static bool register_native(KlassHandle k, Symbol* name, Symbol* signature, address entry, TRAPS) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  3991
  Method* method = Klass::cast(k())->lookup_method(name, signature);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3992
  if (method == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3993
    ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3994
    stringStream st;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3995
    st.print("Method %s name or signature does not match",
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  3996
             Method::name_and_sig_as_C_string(Klass::cast(k()), name, signature));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3997
    THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3998
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3999
  if (!method->is_native()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4000
    // 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
  4001
    method = find_prefixed_native(k, name, signature, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4002
    if (method == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4003
      ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4004
      stringStream st;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4005
      st.print("Method %s is not declared as native",
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  4006
               Method::name_and_sig_as_C_string(Klass::cast(k()), name, signature));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4007
      THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4008
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4009
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4010
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4011
  if (entry != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4012
    method->set_native_function(entry,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  4013
      Method::native_bind_event_is_interesting);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4014
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4015
    method->clear_native_function();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4016
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4017
  if (PrintJNIResolving) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4018
    ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4019
    tty->print_cr("[Registering JNI native method %s.%s]",
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13977
diff changeset
  4020
      method->method_holder()->external_name(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4021
      method->name()->as_C_string());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4022
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4023
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4024
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4025
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4026
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4027
DT_RETURN_MARK_DECL(RegisterNatives, jint);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4028
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4029
DT_RETURN_MARK_DECL(RegisterNatives, jint
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4030
                    , HOTSPOT_JNI_REGISTERNATIVES_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4031
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4032
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4033
JNI_ENTRY(jint, jni_RegisterNatives(JNIEnv *env, jclass clazz,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4034
                                    const JNINativeMethod *methods,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4035
                                    jint nMethods))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4036
  JNIWrapper("RegisterNatives");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4037
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4038
  DTRACE_PROBE4(hotspot_jni, RegisterNatives__entry, env, clazz, methods, nMethods);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4039
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4040
  HOTSPOT_JNI_REGISTERNATIVES_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4041
                                    env, clazz, (void *) methods, nMethods);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4042
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4043
  jint ret = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4044
  DT_RETURN_MARK(RegisterNatives, jint, (const jint&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4045
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  4046
  KlassHandle h_k(thread, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4047
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4048
  for (int index = 0; index < nMethods; index++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4049
    const char* meth_name = methods[index].name;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4050
    const char* meth_sig = methods[index].signature;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4051
    int meth_name_len = (int)strlen(meth_name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4052
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4053
    // The class should have been loaded (we have an instance of the class
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4054
    // passed in) so the method and signature should already be in the symbol
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4055
    // 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
  4056
    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
  4057
    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
  4058
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  4059
    if (name == NULL || signature == NULL) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4060
      ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4061
      stringStream st;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4062
      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
  4063
      // Must return negative value on failure
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4064
      THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4065
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4066
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4067
    bool res = register_native(h_k, name, signature,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4068
                               (address) methods[index].fnPtr, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4069
    if (!res) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4070
      ret = -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4071
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4072
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4073
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4074
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4075
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4076
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4077
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4078
JNI_ENTRY(jint, jni_UnregisterNatives(JNIEnv *env, jclass clazz))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4079
  JNIWrapper("UnregisterNatives");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4080
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4081
  DTRACE_PROBE2(hotspot_jni, UnregisterNatives__entry, env, clazz);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4082
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4083
 HOTSPOT_JNI_UNREGISTERNATIVES_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4084
                                     env, clazz);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4085
#endif /* USDT2 */
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  4086
  Klass* k   = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4087
  //%note jni_2
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4088
  if (Klass::cast(k)->oop_is_instance()) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  4089
    for (int index = 0; index < InstanceKlass::cast(k)->methods()->length(); index++) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  4090
      Method* m = InstanceKlass::cast(k)->methods()->at(index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4091
      if (m->is_native()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4092
        m->clear_native_function();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4093
        m->set_signature_handler(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4094
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4095
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4096
  }
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4097
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4098
  DTRACE_PROBE1(hotspot_jni, UnregisterNatives__return, 0);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4099
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4100
 HOTSPOT_JNI_UNREGISTERNATIVES_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4101
                                      0);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4102
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4103
  return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4104
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4105
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4106
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4107
// Monitor functions
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4108
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4109
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4110
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4111
DT_RETURN_MARK_DECL(MonitorEnter, jint);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4112
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4113
DT_RETURN_MARK_DECL(MonitorEnter, jint
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4114
                    , HOTSPOT_JNI_MONITORENTER_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4115
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4116
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4117
JNI_ENTRY(jint, jni_MonitorEnter(JNIEnv *env, jobject jobj))
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4118
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4119
  DTRACE_PROBE2(hotspot_jni, MonitorEnter__entry, env, jobj);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4120
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4121
 HOTSPOT_JNI_MONITORENTER_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4122
                                env, jobj);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4123
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4124
  jint ret = JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4125
  DT_RETURN_MARK(MonitorEnter, jint, (const jint&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4126
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4127
  // If the object is null, we can't do anything with it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4128
  if (jobj == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4129
    THROW_(vmSymbols::java_lang_NullPointerException(), JNI_ERR);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4130
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4131
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4132
  Handle obj(thread, JNIHandles::resolve_non_null(jobj));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4133
  ObjectSynchronizer::jni_enter(obj, CHECK_(JNI_ERR));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4134
  ret = JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4135
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4136
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4137
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4138
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4139
DT_RETURN_MARK_DECL(MonitorExit, jint);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4140
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4141
DT_RETURN_MARK_DECL(MonitorExit, jint
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4142
                    , HOTSPOT_JNI_MONITOREXIT_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4143
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4144
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4145
JNI_ENTRY(jint, jni_MonitorExit(JNIEnv *env, jobject jobj))
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4146
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4147
  DTRACE_PROBE2(hotspot_jni, MonitorExit__entry, env, jobj);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4148
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4149
 HOTSPOT_JNI_MONITOREXIT_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4150
                               env, jobj);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4151
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4152
  jint ret = JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4153
  DT_RETURN_MARK(MonitorExit, jint, (const jint&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4154
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4155
  // Don't do anything with a null object
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4156
  if (jobj == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4157
    THROW_(vmSymbols::java_lang_NullPointerException(), JNI_ERR);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4158
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4159
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4160
  Handle obj(THREAD, JNIHandles::resolve_non_null(jobj));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4161
  ObjectSynchronizer::jni_exit(obj(), CHECK_(JNI_ERR));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4162
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4163
  ret = JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4164
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4165
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4166
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4167
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4168
// Extensions
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4169
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4170
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4171
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4172
DT_VOID_RETURN_MARK_DECL(GetStringRegion);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4173
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4174
DT_VOID_RETURN_MARK_DECL(GetStringRegion
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4175
                         , HOTSPOT_JNI_GETSTRINGREGION_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4176
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4177
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4178
JNI_ENTRY(void, jni_GetStringRegion(JNIEnv *env, jstring string, jsize start, jsize len, jchar *buf))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4179
  JNIWrapper("GetStringRegion");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4180
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4181
  DTRACE_PROBE5(hotspot_jni, GetStringRegion__entry, env, string, start, len, buf);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4182
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4183
 HOTSPOT_JNI_GETSTRINGREGION_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4184
                                   env, string, start, len, buf);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4185
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4186
  DT_VOID_RETURN_MARK(GetStringRegion);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4187
  oop s = JNIHandles::resolve_non_null(string);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4188
  int s_len = java_lang_String::length(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4189
  if (start < 0 || len < 0 || start + len > s_len) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4190
    THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4191
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4192
    if (len > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4193
      int s_offset = java_lang_String::offset(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4194
      typeArrayOop s_value = java_lang_String::value(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4195
      memcpy(buf, s_value->char_at_addr(s_offset+start), sizeof(jchar)*len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4196
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4197
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4198
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4199
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4200
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4201
DT_VOID_RETURN_MARK_DECL(GetStringUTFRegion);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4202
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4203
DT_VOID_RETURN_MARK_DECL(GetStringUTFRegion
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4204
                         , HOTSPOT_JNI_GETSTRINGUTFREGION_RETURN());
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4205
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4206
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4207
JNI_ENTRY(void, jni_GetStringUTFRegion(JNIEnv *env, jstring string, jsize start, jsize len, char *buf))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4208
  JNIWrapper("GetStringUTFRegion");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4209
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4210
  DTRACE_PROBE5(hotspot_jni, GetStringUTFRegion__entry, env, string, start, len, buf);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4211
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4212
 HOTSPOT_JNI_GETSTRINGUTFREGION_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4213
                                      env, string, start, len, buf);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4214
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4215
  DT_VOID_RETURN_MARK(GetStringUTFRegion);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4216
  oop s = JNIHandles::resolve_non_null(string);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4217
  int s_len = java_lang_String::length(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4218
  if (start < 0 || len < 0 || start + len > s_len) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4219
    THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4220
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4221
    //%note jni_7
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4222
    if (len > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4223
      ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4224
      char *utf_region = java_lang_String::as_utf8_string(s, start, len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4225
      int utf_len = (int)strlen(utf_region);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4226
      memcpy(buf, utf_region, utf_len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4227
      buf[utf_len] = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4228
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4229
      // JDK null-terminates the buffer even in len is zero
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4230
      if (buf != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4231
        buf[0] = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4232
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4233
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4234
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4235
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4236
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4237
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4238
JNI_ENTRY(void*, jni_GetPrimitiveArrayCritical(JNIEnv *env, jarray array, jboolean *isCopy))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4239
  JNIWrapper("GetPrimitiveArrayCritical");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4240
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4241
  DTRACE_PROBE3(hotspot_jni, GetPrimitiveArrayCritical__entry, env, array, isCopy);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4242
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4243
 HOTSPOT_JNI_GETPRIMITIVEARRAYCRITICAL_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4244
                                             env, array, (uintptr_t *) isCopy);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4245
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4246
  GC_locker::lock_critical(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4247
  if (isCopy != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4248
    *isCopy = JNI_FALSE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4249
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4250
  oop a = JNIHandles::resolve_non_null(array);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4251
  assert(a->is_array(), "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4252
  BasicType type;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4253
  if (a->is_objArray()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4254
    type = T_OBJECT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4255
  } else {
13952
e3cf184080bc 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 13728
diff changeset
  4256
    type = TypeArrayKlass::cast(a->klass())->element_type();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4257
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4258
  void* ret = arrayOop(a)->base(type);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4259
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4260
  DTRACE_PROBE1(hotspot_jni, GetPrimitiveArrayCritical__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4261
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4262
 HOTSPOT_JNI_GETPRIMITIVEARRAYCRITICAL_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4263
                                              ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4264
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4265
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4266
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4267
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4268
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4269
JNI_ENTRY(void, jni_ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray, jint mode))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4270
  JNIWrapper("ReleasePrimitiveArrayCritical");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4271
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4272
  DTRACE_PROBE4(hotspot_jni, ReleasePrimitiveArrayCritical__entry, env, array, carray, mode);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4273
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4274
  HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4275
                                                  env, array, carray, mode);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4276
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4277
  // The array, carray and mode arguments are ignored
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4278
  GC_locker::unlock_critical(thread);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4279
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4280
  DTRACE_PROBE(hotspot_jni, ReleasePrimitiveArrayCritical__return);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4281
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4282
HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4283
);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4284
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4285
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4286
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4287
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4288
JNI_ENTRY(const jchar*, jni_GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4289
  JNIWrapper("GetStringCritical");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4290
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4291
  DTRACE_PROBE3(hotspot_jni, GetStringCritical__entry, env, string, isCopy);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4292
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4293
  HOTSPOT_JNI_GETSTRINGCRITICAL_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4294
                                      env, string, (uintptr_t *) isCopy);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4295
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4296
  GC_locker::lock_critical(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4297
  if (isCopy != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4298
    *isCopy = JNI_FALSE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4299
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4300
  oop s = JNIHandles::resolve_non_null(string);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4301
  int s_len = java_lang_String::length(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4302
  typeArrayOop s_value = java_lang_String::value(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4303
  int s_offset = java_lang_String::offset(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4304
  const jchar* ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4305
  if (s_len > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4306
    ret = s_value->char_at_addr(s_offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4307
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4308
    ret = (jchar*) s_value->base(T_CHAR);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4309
  }
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4310
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4311
  DTRACE_PROBE1(hotspot_jni, GetStringCritical__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4312
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4313
 HOTSPOT_JNI_GETSTRINGCRITICAL_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4314
                                      (uint16_t *) ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4315
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4316
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4317
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4318
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4319
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4320
JNI_ENTRY(void, jni_ReleaseStringCritical(JNIEnv *env, jstring str, const jchar *chars))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4321
  JNIWrapper("ReleaseStringCritical");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4322
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4323
  DTRACE_PROBE3(hotspot_jni, ReleaseStringCritical__entry, env, str, chars);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4324
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4325
  HOTSPOT_JNI_RELEASESTRINGCRITICAL_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4326
                                          env, str, (uint16_t *) chars);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4327
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4328
  // The str and chars arguments are ignored
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4329
  GC_locker::unlock_critical(thread);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4330
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4331
  DTRACE_PROBE(hotspot_jni, ReleaseStringCritical__return);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4332
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4333
HOTSPOT_JNI_RELEASESTRINGCRITICAL_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4334
);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4335
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4336
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4337
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4338
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4339
JNI_ENTRY(jweak, jni_NewWeakGlobalRef(JNIEnv *env, jobject ref))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4340
  JNIWrapper("jni_NewWeakGlobalRef");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4341
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4342
  DTRACE_PROBE2(hotspot_jni, NewWeakGlobalRef__entry, env, ref);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4343
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4344
 HOTSPOT_JNI_NEWWEAKGLOBALREF_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4345
                                    env, ref);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4346
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4347
  Handle ref_handle(thread, JNIHandles::resolve(ref));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4348
  jweak ret = JNIHandles::make_weak_global(ref_handle);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4349
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4350
  DTRACE_PROBE1(hotspot_jni, NewWeakGlobalRef__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4351
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4352
 HOTSPOT_JNI_NEWWEAKGLOBALREF_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4353
                                     ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4354
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4355
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4356
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4357
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4358
// Must be JNI_ENTRY (with HandleMark)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4359
JNI_ENTRY(void, jni_DeleteWeakGlobalRef(JNIEnv *env, jweak ref))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4360
  JNIWrapper("jni_DeleteWeakGlobalRef");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4361
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4362
  DTRACE_PROBE2(hotspot_jni, DeleteWeakGlobalRef__entry, env, ref);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4363
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4364
  HOTSPOT_JNI_DELETEWEAKGLOBALREF_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4365
                                        env, ref);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4366
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4367
  JNIHandles::destroy_weak_global(ref);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4368
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4369
  DTRACE_PROBE(hotspot_jni, DeleteWeakGlobalRef__return);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4370
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4371
  HOTSPOT_JNI_DELETEWEAKGLOBALREF_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4372
                                         );
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4373
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4374
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4375
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4376
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4377
JNI_QUICK_ENTRY(jboolean, jni_ExceptionCheck(JNIEnv *env))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4378
  JNIWrapper("jni_ExceptionCheck");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4379
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4380
  DTRACE_PROBE1(hotspot_jni, ExceptionCheck__entry, env);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4381
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4382
 HOTSPOT_JNI_EXCEPTIONCHECK_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4383
                                  env);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4384
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4385
  jni_check_async_exceptions(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4386
  jboolean ret = (thread->has_pending_exception()) ? JNI_TRUE : JNI_FALSE;
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4387
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4388
  DTRACE_PROBE1(hotspot_jni, ExceptionCheck__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4389
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4390
 HOTSPOT_JNI_EXCEPTIONCHECK_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4391
                                   ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4392
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4393
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4394
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4395
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4396
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4397
// Initialization state for three routines below relating to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4398
// java.nio.DirectBuffers
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4399
static          jint directBufferSupportInitializeStarted = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4400
static volatile jint directBufferSupportInitializeEnded   = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4401
static volatile jint directBufferSupportInitializeFailed  = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4402
static jclass    bufferClass                 = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4403
static jclass    directBufferClass           = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4404
static jclass    directByteBufferClass       = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4405
static jmethodID directByteBufferConstructor = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4406
static jfieldID  directBufferAddressField    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4407
static jfieldID  bufferCapacityField         = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4408
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4409
static jclass lookupOne(JNIEnv* env, const char* name, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4410
  Handle loader;            // null (bootstrap) loader
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4411
  Handle protection_domain; // null protection domain
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4412
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7414
diff changeset
  4413
  TempNewSymbol sym = SymbolTable::new_symbol(name, CHECK_NULL);
2269
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
  4414
  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
  4415
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
  4416
  if (TraceClassResolution && result != NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
  4417
    trace_class_resolution(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(result)));
2269
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
  4418
  }
ee9da33d43ab 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 2105
diff changeset
  4419
  return result;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4420
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4421
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4422
// These lookups are done with the NULL (bootstrap) ClassLoader to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4423
// circumvent any security checks that would be done by jni_FindClass.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4424
JNI_ENTRY(bool, lookupDirectBufferClasses(JNIEnv* env))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4425
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4426
  if ((bufferClass           = lookupOne(env, "java/nio/Buffer", thread))           == NULL) { return false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4427
  if ((directBufferClass     = lookupOne(env, "sun/nio/ch/DirectBuffer", thread))   == NULL) { return false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4428
  if ((directByteBufferClass = lookupOne(env, "java/nio/DirectByteBuffer", thread)) == NULL) { return false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4429
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4430
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4431
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4432
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4433
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4434
static bool initializeDirectBufferSupport(JNIEnv* env, JavaThread* thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4435
  if (directBufferSupportInitializeFailed) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4436
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4437
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4438
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4439
  if (Atomic::cmpxchg(1, &directBufferSupportInitializeStarted, 0) == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4440
    if (!lookupDirectBufferClasses(env)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4441
      directBufferSupportInitializeFailed = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4442
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4443
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4444
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4445
    // Make global references for these
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4446
    bufferClass           = (jclass) env->NewGlobalRef(bufferClass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4447
    directBufferClass     = (jclass) env->NewGlobalRef(directBufferClass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4448
    directByteBufferClass = (jclass) env->NewGlobalRef(directByteBufferClass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4449
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4450
    // Get needed field and method IDs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4451
    directByteBufferConstructor = env->GetMethodID(directByteBufferClass, "<init>", "(JI)V");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4452
    directBufferAddressField    = env->GetFieldID(bufferClass, "address", "J");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4453
    bufferCapacityField         = env->GetFieldID(bufferClass, "capacity", "I");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4454
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4455
    if ((directByteBufferConstructor == NULL) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4456
        (directBufferAddressField    == NULL) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4457
        (bufferCapacityField         == NULL)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4458
      directBufferSupportInitializeFailed = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4459
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4460
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4461
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4462
    directBufferSupportInitializeEnded = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4463
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4464
    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
  4465
      // 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
  4466
      // 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
  4467
      // 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
  4468
      // 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
  4469
      // 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
  4470
      ThreadInVMfromNative tivn(thread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4471
      os::yield_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4472
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4473
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4474
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4475
  return !directBufferSupportInitializeFailed;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4476
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4477
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4478
extern "C" jobject JNICALL jni_NewDirectByteBuffer(JNIEnv *env, void* address, jlong capacity)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4479
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4480
  // thread_from_jni_environment() will block if VM is gone.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4481
  JavaThread* thread = JavaThread::thread_from_jni_environment(env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4482
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4483
  JNIWrapper("jni_NewDirectByteBuffer");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4484
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4485
  DTRACE_PROBE3(hotspot_jni, NewDirectByteBuffer__entry, env, address, capacity);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4486
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4487
 HOTSPOT_JNI_NEWDIRECTBYTEBUFFER_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4488
                                       env, address, capacity);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4489
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4490
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4491
  if (!directBufferSupportInitializeEnded) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4492
    if (!initializeDirectBufferSupport(env, thread)) {
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4493
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4494
      DTRACE_PROBE1(hotspot_jni, NewDirectByteBuffer__return, NULL);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4495
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4496
      HOTSPOT_JNI_NEWDIRECTBYTEBUFFER_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4497
                                             NULL);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4498
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4499
      return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4500
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4501
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4502
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4503
  // Being paranoid about accidental sign extension on address
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4504
  jlong addr = (jlong) ((uintptr_t) address);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4505
  // NOTE that package-private DirectByteBuffer constructor currently
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4506
  // takes int capacity
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4507
  jint  cap  = (jint)  capacity;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4508
  jobject ret = env->NewObject(directByteBufferClass, directByteBufferConstructor, addr, cap);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4509
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4510
  DTRACE_PROBE1(hotspot_jni, NewDirectByteBuffer__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4511
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4512
  HOTSPOT_JNI_NEWDIRECTBYTEBUFFER_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4513
                                         ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4514
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4515
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4516
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4517
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4518
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4519
DT_RETURN_MARK_DECL(GetDirectBufferAddress, void*);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4520
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4521
DT_RETURN_MARK_DECL(GetDirectBufferAddress, void*
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4522
                    , HOTSPOT_JNI_GETDIRECTBUFFERADDRESS_RETURN((void*) _ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4523
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4524
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4525
extern "C" void* JNICALL jni_GetDirectBufferAddress(JNIEnv *env, jobject buf)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4526
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4527
  // thread_from_jni_environment() will block if VM is gone.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4528
  JavaThread* thread = JavaThread::thread_from_jni_environment(env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4529
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4530
  JNIWrapper("jni_GetDirectBufferAddress");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4531
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4532
  DTRACE_PROBE2(hotspot_jni, GetDirectBufferAddress__entry, env, buf);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4533
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4534
  HOTSPOT_JNI_GETDIRECTBUFFERADDRESS_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4535
                                           env, buf);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4536
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4537
  void* ret = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4538
  DT_RETURN_MARK(GetDirectBufferAddress, void*, (const void*&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4539
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4540
  if (!directBufferSupportInitializeEnded) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4541
    if (!initializeDirectBufferSupport(env, thread)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4542
      return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4543
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4544
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4545
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4546
  if ((buf != NULL) && (!env->IsInstanceOf(buf, directBufferClass))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4547
    return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4548
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4549
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4550
  ret = (void*)(intptr_t)env->GetLongField(buf, directBufferAddressField);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4551
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4552
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4553
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4554
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4555
DT_RETURN_MARK_DECL(GetDirectBufferCapacity, jlong);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4556
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4557
DT_RETURN_MARK_DECL(GetDirectBufferCapacity, jlong
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4558
                    , HOTSPOT_JNI_GETDIRECTBUFFERCAPACITY_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4559
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4560
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4561
extern "C" jlong JNICALL jni_GetDirectBufferCapacity(JNIEnv *env, jobject buf)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4562
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4563
  // thread_from_jni_environment() will block if VM is gone.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4564
  JavaThread* thread = JavaThread::thread_from_jni_environment(env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4565
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4566
  JNIWrapper("jni_GetDirectBufferCapacity");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4567
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4568
  DTRACE_PROBE2(hotspot_jni, GetDirectBufferCapacity__entry, env, buf);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4569
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4570
  HOTSPOT_JNI_GETDIRECTBUFFERCAPACITY_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4571
                                            env, buf);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4572
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4573
  jlong ret = -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4574
  DT_RETURN_MARK(GetDirectBufferCapacity, jlong, (const jlong&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4575
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4576
  if (!directBufferSupportInitializeEnded) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4577
    if (!initializeDirectBufferSupport(env, thread)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4578
      ret = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4579
      return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4580
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4581
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4582
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4583
  if (buf == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4584
    return -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4585
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4586
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4587
  if (!env->IsInstanceOf(buf, directBufferClass)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4588
    return -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4589
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4590
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4591
  // NOTE that capacity is currently an int in the implementation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4592
  ret = env->GetIntField(buf, bufferCapacityField);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4593
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4594
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4595
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4596
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4597
JNI_LEAF(jint, jni_GetVersion(JNIEnv *env))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4598
  JNIWrapper("GetVersion");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4599
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4600
  DTRACE_PROBE1(hotspot_jni, GetVersion__entry, env);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4601
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4602
  HOTSPOT_JNI_GETVERSION_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4603
                               env);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4604
#endif /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4605
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4606
  DTRACE_PROBE1(hotspot_jni, GetVersion__return, CurrentVersion);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4607
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4608
  HOTSPOT_JNI_GETVERSION_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4609
                                CurrentVersion);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4610
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4611
  return CurrentVersion;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4612
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4613
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4614
extern struct JavaVM_ main_vm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4615
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4616
JNI_LEAF(jint, jni_GetJavaVM(JNIEnv *env, JavaVM **vm))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4617
  JNIWrapper("jni_GetJavaVM");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4618
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4619
  DTRACE_PROBE2(hotspot_jni, GetJavaVM__entry, env, vm);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4620
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4621
  HOTSPOT_JNI_GETJAVAVM_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4622
                              env, (void **) vm);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4623
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4624
  *vm  = (JavaVM *)(&main_vm);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4625
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4626
  DTRACE_PROBE1(hotspot_jni, GetJavaVM__return, JNI_OK);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4627
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4628
  HOTSPOT_JNI_GETJAVAVM_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4629
                               JNI_OK);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  4630
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4631
  return JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4632
JNI_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4633
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4634
// Structure containing all jni functions
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4635
struct JNINativeInterface_ jni_NativeInterface = {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4636
    NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4637
    NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4638
    NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4639
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4640
    NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4641
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4642
    jni_GetVersion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4643
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4644
    jni_DefineClass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4645
    jni_FindClass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4646
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4647
    jni_FromReflectedMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4648
    jni_FromReflectedField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4649
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4650
    jni_ToReflectedMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4651
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4652
    jni_GetSuperclass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4653
    jni_IsAssignableFrom,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4654
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4655
    jni_ToReflectedField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4656
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4657
    jni_Throw,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4658
    jni_ThrowNew,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4659
    jni_ExceptionOccurred,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4660
    jni_ExceptionDescribe,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4661
    jni_ExceptionClear,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4662
    jni_FatalError,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4663
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4664
    jni_PushLocalFrame,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4665
    jni_PopLocalFrame,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4666
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4667
    jni_NewGlobalRef,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4668
    jni_DeleteGlobalRef,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4669
    jni_DeleteLocalRef,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4670
    jni_IsSameObject,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4671
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4672
    jni_NewLocalRef,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4673
    jni_EnsureLocalCapacity,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4674
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4675
    jni_AllocObject,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4676
    jni_NewObject,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4677
    jni_NewObjectV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4678
    jni_NewObjectA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4679
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4680
    jni_GetObjectClass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4681
    jni_IsInstanceOf,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4682
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4683
    jni_GetMethodID,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4684
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4685
    jni_CallObjectMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4686
    jni_CallObjectMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4687
    jni_CallObjectMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4688
    jni_CallBooleanMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4689
    jni_CallBooleanMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4690
    jni_CallBooleanMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4691
    jni_CallByteMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4692
    jni_CallByteMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4693
    jni_CallByteMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4694
    jni_CallCharMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4695
    jni_CallCharMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4696
    jni_CallCharMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4697
    jni_CallShortMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4698
    jni_CallShortMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4699
    jni_CallShortMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4700
    jni_CallIntMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4701
    jni_CallIntMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4702
    jni_CallIntMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4703
    jni_CallLongMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4704
    jni_CallLongMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4705
    jni_CallLongMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4706
    jni_CallFloatMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4707
    jni_CallFloatMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4708
    jni_CallFloatMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4709
    jni_CallDoubleMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4710
    jni_CallDoubleMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4711
    jni_CallDoubleMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4712
    jni_CallVoidMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4713
    jni_CallVoidMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4714
    jni_CallVoidMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4715
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4716
    jni_CallNonvirtualObjectMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4717
    jni_CallNonvirtualObjectMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4718
    jni_CallNonvirtualObjectMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4719
    jni_CallNonvirtualBooleanMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4720
    jni_CallNonvirtualBooleanMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4721
    jni_CallNonvirtualBooleanMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4722
    jni_CallNonvirtualByteMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4723
    jni_CallNonvirtualByteMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4724
    jni_CallNonvirtualByteMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4725
    jni_CallNonvirtualCharMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4726
    jni_CallNonvirtualCharMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4727
    jni_CallNonvirtualCharMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4728
    jni_CallNonvirtualShortMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4729
    jni_CallNonvirtualShortMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4730
    jni_CallNonvirtualShortMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4731
    jni_CallNonvirtualIntMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4732
    jni_CallNonvirtualIntMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4733
    jni_CallNonvirtualIntMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4734
    jni_CallNonvirtualLongMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4735
    jni_CallNonvirtualLongMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4736
    jni_CallNonvirtualLongMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4737
    jni_CallNonvirtualFloatMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4738
    jni_CallNonvirtualFloatMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4739
    jni_CallNonvirtualFloatMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4740
    jni_CallNonvirtualDoubleMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4741
    jni_CallNonvirtualDoubleMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4742
    jni_CallNonvirtualDoubleMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4743
    jni_CallNonvirtualVoidMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4744
    jni_CallNonvirtualVoidMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4745
    jni_CallNonvirtualVoidMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4746
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4747
    jni_GetFieldID,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4748
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4749
    jni_GetObjectField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4750
    jni_GetBooleanField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4751
    jni_GetByteField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4752
    jni_GetCharField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4753
    jni_GetShortField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4754
    jni_GetIntField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4755
    jni_GetLongField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4756
    jni_GetFloatField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4757
    jni_GetDoubleField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4758
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4759
    jni_SetObjectField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4760
    jni_SetBooleanField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4761
    jni_SetByteField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4762
    jni_SetCharField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4763
    jni_SetShortField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4764
    jni_SetIntField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4765
    jni_SetLongField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4766
    jni_SetFloatField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4767
    jni_SetDoubleField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4768
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4769
    jni_GetStaticMethodID,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4770
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4771
    jni_CallStaticObjectMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4772
    jni_CallStaticObjectMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4773
    jni_CallStaticObjectMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4774
    jni_CallStaticBooleanMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4775
    jni_CallStaticBooleanMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4776
    jni_CallStaticBooleanMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4777
    jni_CallStaticByteMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4778
    jni_CallStaticByteMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4779
    jni_CallStaticByteMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4780
    jni_CallStaticCharMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4781
    jni_CallStaticCharMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4782
    jni_CallStaticCharMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4783
    jni_CallStaticShortMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4784
    jni_CallStaticShortMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4785
    jni_CallStaticShortMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4786
    jni_CallStaticIntMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4787
    jni_CallStaticIntMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4788
    jni_CallStaticIntMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4789
    jni_CallStaticLongMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4790
    jni_CallStaticLongMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4791
    jni_CallStaticLongMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4792
    jni_CallStaticFloatMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4793
    jni_CallStaticFloatMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4794
    jni_CallStaticFloatMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4795
    jni_CallStaticDoubleMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4796
    jni_CallStaticDoubleMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4797
    jni_CallStaticDoubleMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4798
    jni_CallStaticVoidMethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4799
    jni_CallStaticVoidMethodV,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4800
    jni_CallStaticVoidMethodA,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4801
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4802
    jni_GetStaticFieldID,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4803
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4804
    jni_GetStaticObjectField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4805
    jni_GetStaticBooleanField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4806
    jni_GetStaticByteField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4807
    jni_GetStaticCharField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4808
    jni_GetStaticShortField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4809
    jni_GetStaticIntField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4810
    jni_GetStaticLongField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4811
    jni_GetStaticFloatField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4812
    jni_GetStaticDoubleField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4813
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4814
    jni_SetStaticObjectField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4815
    jni_SetStaticBooleanField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4816
    jni_SetStaticByteField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4817
    jni_SetStaticCharField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4818
    jni_SetStaticShortField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4819
    jni_SetStaticIntField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4820
    jni_SetStaticLongField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4821
    jni_SetStaticFloatField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4822
    jni_SetStaticDoubleField,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4823
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4824
    jni_NewString,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4825
    jni_GetStringLength,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4826
    jni_GetStringChars,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4827
    jni_ReleaseStringChars,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4828
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4829
    jni_NewStringUTF,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4830
    jni_GetStringUTFLength,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4831
    jni_GetStringUTFChars,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4832
    jni_ReleaseStringUTFChars,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4833
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4834
    jni_GetArrayLength,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4835
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4836
    jni_NewObjectArray,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4837
    jni_GetObjectArrayElement,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4838
    jni_SetObjectArrayElement,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4839
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4840
    jni_NewBooleanArray,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4841
    jni_NewByteArray,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4842
    jni_NewCharArray,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4843
    jni_NewShortArray,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4844
    jni_NewIntArray,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4845
    jni_NewLongArray,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4846
    jni_NewFloatArray,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4847
    jni_NewDoubleArray,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4848
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4849
    jni_GetBooleanArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4850
    jni_GetByteArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4851
    jni_GetCharArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4852
    jni_GetShortArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4853
    jni_GetIntArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4854
    jni_GetLongArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4855
    jni_GetFloatArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4856
    jni_GetDoubleArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4857
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4858
    jni_ReleaseBooleanArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4859
    jni_ReleaseByteArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4860
    jni_ReleaseCharArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4861
    jni_ReleaseShortArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4862
    jni_ReleaseIntArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4863
    jni_ReleaseLongArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4864
    jni_ReleaseFloatArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4865
    jni_ReleaseDoubleArrayElements,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4866
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4867
    jni_GetBooleanArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4868
    jni_GetByteArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4869
    jni_GetCharArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4870
    jni_GetShortArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4871
    jni_GetIntArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4872
    jni_GetLongArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4873
    jni_GetFloatArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4874
    jni_GetDoubleArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4875
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4876
    jni_SetBooleanArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4877
    jni_SetByteArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4878
    jni_SetCharArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4879
    jni_SetShortArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4880
    jni_SetIntArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4881
    jni_SetLongArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4882
    jni_SetFloatArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4883
    jni_SetDoubleArrayRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4884
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4885
    jni_RegisterNatives,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4886
    jni_UnregisterNatives,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4887
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4888
    jni_MonitorEnter,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4889
    jni_MonitorExit,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4890
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4891
    jni_GetJavaVM,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4892
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4893
    jni_GetStringRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4894
    jni_GetStringUTFRegion,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4895
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4896
    jni_GetPrimitiveArrayCritical,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4897
    jni_ReleasePrimitiveArrayCritical,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4898
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4899
    jni_GetStringCritical,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4900
    jni_ReleaseStringCritical,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4901
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4902
    jni_NewWeakGlobalRef,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4903
    jni_DeleteWeakGlobalRef,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4904
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4905
    jni_ExceptionCheck,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4906
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4907
    jni_NewDirectByteBuffer,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4908
    jni_GetDirectBufferAddress,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4909
    jni_GetDirectBufferCapacity,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4910
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4911
    // New 1_6 features
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4912
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4913
    jni_GetObjectRefType
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4914
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4915
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4916
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4917
// For jvmti use to modify jni function table.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4918
// Java threads in native contiues to run until it is transitioned
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4919
// to VM at safepoint. Before the transition or before it is blocked
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4920
// for safepoint it may access jni function table. VM could crash if
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4921
// any java thread access the jni function table in the middle of memcpy.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4922
// To avoid this each function pointers are copied automically.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4923
void copy_jni_function_table(const struct JNINativeInterface_ *new_jni_NativeInterface) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4924
  assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4925
  intptr_t *a = (intptr_t *) jni_functions();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4926
  intptr_t *b = (intptr_t *) new_jni_NativeInterface;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4927
  for (uint i=0; i <  sizeof(struct JNINativeInterface_)/sizeof(void *); i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4928
    Atomic::store_ptr(*b++, a++);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4929
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4930
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4931
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4932
void quicken_jni_functions() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4933
  // Replace Get<Primitive>Field with fast versions
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4934
  if (UseFastJNIAccessors && !JvmtiExport::can_post_field_access()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4935
      && !VerifyJNIFields && !TraceJNICalls && !CountJNICalls && !CheckJNICalls
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4936
#if defined(_WINDOWS) && defined(IA32) && defined(COMPILER2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4937
      // windows x86 currently needs SEH wrapper and the gain of the fast
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4938
      // versions currently isn't certain for server vm on uniprocessor.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4939
      && os::is_MP()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4940
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4941
  ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4942
    address func;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4943
    func = JNI_FastGetField::generate_fast_get_boolean_field();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4944
    if (func != (address)-1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4945
      jni_NativeInterface.GetBooleanField = (GetBooleanField_t)func;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4946
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4947
    func = JNI_FastGetField::generate_fast_get_byte_field();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4948
    if (func != (address)-1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4949
      jni_NativeInterface.GetByteField = (GetByteField_t)func;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4950
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4951
    func = JNI_FastGetField::generate_fast_get_char_field();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4952
    if (func != (address)-1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4953
      jni_NativeInterface.GetCharField = (GetCharField_t)func;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4954
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4955
    func = JNI_FastGetField::generate_fast_get_short_field();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4956
    if (func != (address)-1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4957
      jni_NativeInterface.GetShortField = (GetShortField_t)func;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4958
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4959
    func = JNI_FastGetField::generate_fast_get_int_field();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4960
    if (func != (address)-1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4961
      jni_NativeInterface.GetIntField = (GetIntField_t)func;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4962
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4963
    func = JNI_FastGetField::generate_fast_get_long_field();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4964
    if (func != (address)-1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4965
      jni_NativeInterface.GetLongField = (GetLongField_t)func;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4966
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4967
    func = JNI_FastGetField::generate_fast_get_float_field();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4968
    if (func != (address)-1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4969
      jni_NativeInterface.GetFloatField = (GetFloatField_t)func;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4970
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4971
    func = JNI_FastGetField::generate_fast_get_double_field();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4972
    if (func != (address)-1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4973
      jni_NativeInterface.GetDoubleField = (GetDoubleField_t)func;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4974
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4975
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4976
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4977
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4978
// Returns the function structure
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4979
struct JNINativeInterface_* jni_functions() {
13975
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13728
diff changeset
  4980
#if INCLUDE_JNI_CHECK
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4981
  if (CheckJNICalls) return jni_functions_check();
13975
2f7431485cfa 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 13728
diff changeset
  4982
#endif // INCLUDE_JNI_CHECK
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4983
  return &jni_NativeInterface;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4984
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4985
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4986
// Returns the function structure
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4987
struct JNINativeInterface_* jni_functions_nocheck() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4988
  return &jni_NativeInterface;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4989
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4990
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4991
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4992
// Invocation API
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4993
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4994
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4995
// Forward declaration
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4996
extern const struct JNIInvokeInterface_ jni_InvokeInterface;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4997
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4998
// Global invocation API vars
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4999
volatile jint vm_created = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5000
// Indicate whether it is safe to recreate VM
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5001
volatile jint safe_to_recreate_vm = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5002
struct JavaVM_ main_vm = {&jni_InvokeInterface};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5003
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5004
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5005
#define JAVASTACKSIZE (400 * 1024)    /* Default size of a thread java stack */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5006
enum { VERIFY_NONE, VERIFY_REMOTE, VERIFY_ALL };
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5007
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5008
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5009
HS_DTRACE_PROBE_DECL1(hotspot_jni, GetDefaultJavaVMInitArgs__entry, void*);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5010
DT_RETURN_MARK_DECL(GetDefaultJavaVMInitArgs, jint);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5011
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5012
DT_RETURN_MARK_DECL(GetDefaultJavaVMInitArgs, jint
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5013
                    , HOTSPOT_JNI_GETDEFAULTJAVAVMINITARGS_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5014
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5015
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5016
_JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_GetDefaultJavaVMInitArgs(void *args_) {
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5017
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5018
  HS_DTRACE_PROBE1(hotspot_jni, GetDefaultJavaVMInitArgs__entry, args_);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5019
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5020
  HOTSPOT_JNI_GETDEFAULTJAVAVMINITARGS_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5021
                                             args_);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5022
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5023
  JDK1_1InitArgs *args = (JDK1_1InitArgs *)args_;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5024
  jint ret = JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5025
  DT_RETURN_MARK(GetDefaultJavaVMInitArgs, jint, (const jint&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5026
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5027
  if (Threads::is_supported_jni_version(args->version)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5028
    ret = JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5029
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5030
  // 1.1 style no longer supported in hotspot.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5031
  // According the JNI spec, we should update args->version on return.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5032
  // We also use the structure to communicate with launcher about default
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5033
  // stack size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5034
  if (args->version == JNI_VERSION_1_1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5035
    args->version = JNI_VERSION_1_2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5036
    // javaStackSize is int in arguments structure
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5037
    assert(jlong(ThreadStackSize) * K < INT_MAX, "integer overflow");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5038
    args->javaStackSize = (jint)(ThreadStackSize * K);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5039
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5040
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5041
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5042
10002
2d83be3a0927 7016112: CMS: crash during promotion testing
brutisso
parents: 9176
diff changeset
  5043
#ifndef PRODUCT
2d83be3a0927 7016112: CMS: crash during promotion testing
brutisso
parents: 9176
diff changeset
  5044
11247
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10994
diff changeset
  5045
#include "gc_interface/collectedHeap.hpp"
10002
2d83be3a0927 7016112: CMS: crash during promotion testing
brutisso
parents: 9176
diff changeset
  5046
#include "utilities/quickSort.hpp"
2d83be3a0927 7016112: CMS: crash during promotion testing
brutisso
parents: 9176
diff changeset
  5047
11247
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10994
diff changeset
  5048
#define run_unit_test(unit_test_function_call)              \
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10994
diff changeset
  5049
  tty->print_cr("Running test: " #unit_test_function_call); \
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10994
diff changeset
  5050
  unit_test_function_call
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10994
diff changeset
  5051
10002
2d83be3a0927 7016112: CMS: crash during promotion testing
brutisso
parents: 9176
diff changeset
  5052
void execute_internal_vm_tests() {
2d83be3a0927 7016112: CMS: crash during promotion testing
brutisso
parents: 9176
diff changeset
  5053
  if (ExecuteInternalVMTests) {
11247
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10994
diff changeset
  5054
    tty->print_cr("Running internal VM tests");
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10994
diff changeset
  5055
    run_unit_test(arrayOopDesc::test_max_array_length());
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10994
diff changeset
  5056
    run_unit_test(CollectedHeap::test_is_in());
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10994
diff changeset
  5057
    run_unit_test(QuickSort::test_quick_sort());
13087
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 12939
diff changeset
  5058
    run_unit_test(AltHashing::test_alt_hash());
10994
fc93bca9c720 7102044: G1: VM crashes with assert(old_end != new_end) failed: don't call this otherwise
brutisso
parents: 10739
diff changeset
  5059
    tty->print_cr("All internal VM tests passed");
10002
2d83be3a0927 7016112: CMS: crash during promotion testing
brutisso
parents: 9176
diff changeset
  5060
  }
2d83be3a0927 7016112: CMS: crash during promotion testing
brutisso
parents: 9176
diff changeset
  5061
}
2d83be3a0927 7016112: CMS: crash during promotion testing
brutisso
parents: 9176
diff changeset
  5062
11247
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10994
diff changeset
  5063
#undef run_unit_test
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10994
diff changeset
  5064
10002
2d83be3a0927 7016112: CMS: crash during promotion testing
brutisso
parents: 9176
diff changeset
  5065
#endif
2d83be3a0927 7016112: CMS: crash during promotion testing
brutisso
parents: 9176
diff changeset
  5066
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5067
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5068
HS_DTRACE_PROBE_DECL3(hotspot_jni, CreateJavaVM__entry, vm, penv, args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5069
DT_RETURN_MARK_DECL(CreateJavaVM, jint);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5070
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5071
DT_RETURN_MARK_DECL(CreateJavaVM, jint
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5072
                    , HOTSPOT_JNI_CREATEJAVAVM_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5073
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5074
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5075
_JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_CreateJavaVM(JavaVM **vm, void **penv, void *args) {
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5076
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5077
  HS_DTRACE_PROBE3(hotspot_jni, CreateJavaVM__entry, vm, penv, args);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5078
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5079
  HOTSPOT_JNI_CREATEJAVAVM_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5080
                                 (void **) vm, penv, args);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5081
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5082
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5083
  jint result = JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5084
  DT_RETURN_MARK(CreateJavaVM, jint, (const jint&)result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5085
4448
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 4089
diff changeset
  5086
  // We're about to use Atomic::xchg for synchronization.  Some Zero
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 4089
diff changeset
  5087
  // platforms use the GCC builtin __sync_lock_test_and_set for this,
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 4089
diff changeset
  5088
  // 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
  5089
  // on all architectures.  So we check it works before relying on it.
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 4089
diff changeset
  5090
#if defined(ZERO) && defined(ASSERT)
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 4089
diff changeset
  5091
  {
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 4089
diff changeset
  5092
    jint a = 0xcafebabe;
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 4089
diff changeset
  5093
    jint b = Atomic::xchg(0xdeadbeef, &a);
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 4089
diff changeset
  5094
    void *c = &a;
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 4089
diff changeset
  5095
    void *d = Atomic::xchg_ptr(&b, &c);
4561
4dfa5956fbb9 6913869: Zero assert fix
twisti
parents: 4448
diff changeset
  5096
    assert(a == (jint) 0xdeadbeef && b == (jint) 0xcafebabe, "Atomic::xchg() works");
4448
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 4089
diff changeset
  5097
    assert(c == &b && d == &a, "Atomic::xchg_ptr() works");
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 4089
diff changeset
  5098
  }
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 4089
diff changeset
  5099
#endif // ZERO && ASSERT
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 4089
diff changeset
  5100
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5101
  // At the moment it's only possible to have one Java VM,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5102
  // since some of the runtime state is in global variables.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5103
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5104
  // We cannot use our mutex locks here, since they only work on
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5105
  // Threads. We do an atomic compare and exchange to ensure only
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5106
  // one thread can call this method at a time
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5107
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5108
  // We use Atomic::xchg rather than Atomic::add/dec since on some platforms
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5109
  // the add/dec implementations are dependent on whether we are running
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5110
  // on a multiprocessor, and at this stage of initialization the os::is_MP
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5111
  // function used to determine this will always return false. Atomic::xchg
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5112
  // does not have this problem.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5113
  if (Atomic::xchg(1, &vm_created) == 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5114
    return JNI_ERR;   // already created, or create attempt in progress
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5115
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5116
  if (Atomic::xchg(0, &safe_to_recreate_vm) == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5117
    return JNI_ERR;  // someone tried and failed and retry not allowed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5118
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5119
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5120
  assert(vm_created == 1, "vm_created is true during the creation");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5121
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5122
  /**
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5123
   * Certain errors during initialization are recoverable and do not
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5124
   * prevent this method from being called again at a later time
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5125
   * (perhaps with different arguments).  However, at a certain
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5126
   * point during initialization if an error occurs we cannot allow
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5127
   * this function to be called again (or it will crash).  In those
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5128
   * situations, the 'canTryAgain' flag is set to false, which atomically
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5129
   * sets safe_to_recreate_vm to 1, such that any new call to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5130
   * JNI_CreateJavaVM will immediately fail using the above logic.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5131
   */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5132
  bool can_try_again = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5133
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5134
  result = Threads::create_vm((JavaVMInitArgs*) args, &can_try_again);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5135
  if (result == JNI_OK) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5136
    JavaThread *thread = JavaThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5137
    /* thread is thread_in_vm here */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5138
    *vm = (JavaVM *)(&main_vm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5139
    *(JNIEnv**)penv = thread->jni_environment();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5140
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5141
    // Tracks the time application was running before GC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5142
    RuntimeService::record_application_start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5143
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5144
    // Notify JVMTI
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5145
    if (JvmtiExport::should_post_thread_life()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5146
       JvmtiExport::post_thread_start(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5147
    }
11480
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 11247
diff changeset
  5148
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 11247
diff changeset
  5149
    EVENT_BEGIN(TraceEventThreadStart, event);
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 11247
diff changeset
  5150
    EVENT_COMMIT(event,
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 11247
diff changeset
  5151
        EVENT_SET(event, javalangthread, java_lang_Thread::thread_id(thread->threadObj())));
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 11247
diff changeset
  5152
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5153
    // Check if we should compile all classes on bootclasspath
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5154
    NOT_PRODUCT(if (CompileTheWorld) ClassLoader::compile_the_world();)
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  5155
    NOT_PRODUCT(if (ReplayCompiles) ciReplay::replay(thread);)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5156
    // Since this is not a JVM_ENTRY we have to set the thread state manually before leaving.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5157
    ThreadStateTransition::transition_and_fence(thread, _thread_in_vm, _thread_in_native);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5158
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5159
    if (can_try_again) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5160
      // reset safe_to_recreate_vm to 1 so that retrial would be possible
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5161
      safe_to_recreate_vm = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5162
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5163
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5164
    // Creation failed. We must reset vm_created
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5165
    *vm = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5166
    *(JNIEnv**)penv = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5167
    // reset vm_created last to avoid race condition. Use OrderAccess to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5168
    // control both compiler and architectural-based reordering.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5169
    OrderAccess::release_store(&vm_created, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5170
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5171
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5041
diff changeset
  5172
  NOT_PRODUCT(test_error_handler(ErrorHandlerTest));
10002
2d83be3a0927 7016112: CMS: crash during promotion testing
brutisso
parents: 9176
diff changeset
  5173
  NOT_PRODUCT(execute_internal_vm_tests());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5174
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5175
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5176
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5177
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5178
HS_DTRACE_PROBE_DECL3(hotspot_jni, GetCreatedJavaVMs__entry, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5179
  JavaVM**, jsize, jsize*);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5180
HS_DTRACE_PROBE_DECL1(hotspot_jni, GetCreatedJavaVMs__return, jint);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5181
#endif /* !USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5182
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5183
_JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_GetCreatedJavaVMs(JavaVM **vm_buf, jsize bufLen, jsize *numVMs) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5184
  // See bug 4367188, the wrapper can sometimes cause VM crashes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5185
  // JNIWrapper("GetCreatedJavaVMs");
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5186
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5187
  HS_DTRACE_PROBE3(hotspot_jni, GetCreatedJavaVMs__entry, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5188
    vm_buf, bufLen, numVMs);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5189
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5190
  HOTSPOT_JNI_GETCREATEDJAVAVMS_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5191
                                      (void **) vm_buf, bufLen, (uintptr_t *) numVMs);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5192
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5193
  if (vm_created) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5194
    if (numVMs != NULL) *numVMs = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5195
    if (bufLen > 0)     *vm_buf = (JavaVM *)(&main_vm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5196
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5197
    if (numVMs != NULL) *numVMs = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5198
  }
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5199
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5200
  HS_DTRACE_PROBE1(hotspot_jni, GetCreatedJavaVMs__return, JNI_OK);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5201
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5202
  HOTSPOT_JNI_GETCREATEDJAVAVMS_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5203
                                    JNI_OK);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5204
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5205
  return JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5206
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5207
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5208
extern "C" {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5209
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5210
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5211
DT_RETURN_MARK_DECL(DestroyJavaVM, jint);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5212
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5213
DT_RETURN_MARK_DECL(DestroyJavaVM, jint
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5214
                    , HOTSPOT_JNI_DESTROYJAVAVM_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5215
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5216
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5217
jint JNICALL jni_DestroyJavaVM(JavaVM *vm) {
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5218
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5219
  DTRACE_PROBE1(hotspot_jni, DestroyJavaVM__entry, vm);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5220
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5221
  HOTSPOT_JNI_DESTROYJAVAVM_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5222
                                  vm);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5223
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5224
  jint res = JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5225
  DT_RETURN_MARK(DestroyJavaVM, jint, (const jint&)res);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5226
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5227
  if (!vm_created) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5228
    res = JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5229
    return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5230
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5231
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5232
  JNIWrapper("DestroyJavaVM");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5233
  JNIEnv *env;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5234
  JavaVMAttachArgs destroyargs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5235
  destroyargs.version = CurrentVersion;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5236
  destroyargs.name = (char *)"DestroyJavaVM";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5237
  destroyargs.group = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5238
  res = vm->AttachCurrentThread((void **)&env, (void *)&destroyargs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5239
  if (res != JNI_OK) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5240
    return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5241
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5242
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5243
  // Since this is not a JVM_ENTRY we have to set the thread state manually before entering.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5244
  JavaThread* thread = JavaThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5245
  ThreadStateTransition::transition_from_native(thread, _thread_in_vm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5246
  if (Threads::destroy_vm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5247
    // Should not change thread state, VM is gone
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5248
    vm_created = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5249
    res = JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5250
    return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5251
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5252
    ThreadStateTransition::transition_and_fence(thread, _thread_in_vm, _thread_in_native);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5253
    res = JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5254
    return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5255
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5256
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5257
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5258
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5259
static jint attach_current_thread(JavaVM *vm, void **penv, void *_args, bool daemon) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5260
  JavaVMAttachArgs *args = (JavaVMAttachArgs *) _args;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5261
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5262
  // Check below commented out from JDK1.2fcs as well
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5263
  /*
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5264
  if (args && (args->version != JNI_VERSION_1_1 || args->version != JNI_VERSION_1_2)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5265
    return JNI_EVERSION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5266
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5267
  */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5268
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5269
  Thread* t = ThreadLocalStorage::get_thread_slow();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5270
  if (t != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5271
    // If the thread has been attached this operation is a no-op
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5272
    *(JNIEnv**)penv = ((JavaThread*) t)->jni_environment();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5273
    return JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5274
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5275
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5276
  // Create a thread and mark it as attaching so it will be skipped by the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5277
  // ThreadsListEnumerator - see CR 6404306
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5278
  JavaThread* thread = new JavaThread(true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5279
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5280
  // Set correct safepoint info. The thread is going to call into Java when
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5281
  // initializing the Java level thread object. Hence, the correct state must
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5282
  // be set in order for the Safepoint code to deal with it correctly.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5283
  thread->set_thread_state(_thread_in_vm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5284
  // Must do this before initialize_thread_local_storage
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5285
  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
  5286
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5287
  thread->initialize_thread_local_storage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5288
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5289
  if (!os::create_attached_thread(thread)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5290
    delete thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5291
    return JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5292
  }
5041
5bce37d77dde 6914050: jvm assertion "guard pages must be in use" in -Xcomp mode
coleenp
parents: 4571
diff changeset
  5293
  // Enable stack overflow checks
5bce37d77dde 6914050: jvm assertion "guard pages must be in use" in -Xcomp mode
coleenp
parents: 4571
diff changeset
  5294
  thread->create_stack_guard_pages();
5bce37d77dde 6914050: jvm assertion "guard pages must be in use" in -Xcomp mode
coleenp
parents: 4571
diff changeset
  5295
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5296
  thread->initialize_tlab();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5297
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
  5298
  thread->cache_global_variables();
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
  5299
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5300
  // Crucial that we do not have a safepoint check for this thread, since it has
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5301
  // not been added to the Thread list yet.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5302
  { Threads_lock->lock_without_safepoint_check();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5303
    // This must be inside this lock in order to get FullGCALot to work properly, i.e., to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5304
    // avoid this thread trying to do a GC before it is added to the thread-list
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5305
    thread->set_active_handles(JNIHandleBlock::allocate_block());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5306
    Threads::add(thread, daemon);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5307
    Threads_lock->unlock();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5308
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5309
  // Create thread group and name info from attach arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5310
  oop group = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5311
  char* thread_name = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5312
  if (args != NULL && Threads::is_supported_jni_version(args->version)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5313
    group = JNIHandles::resolve(args->group);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5314
    thread_name = args->name; // may be NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5315
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5316
  if (group == NULL) group = Universe::main_thread_group();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5317
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5318
  // Create Java level thread object and attach it to this thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5319
  bool attach_failed = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5320
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5321
    EXCEPTION_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5322
    HandleMark hm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5323
    Handle thread_group(THREAD, group);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5324
    thread->allocate_threadObj(thread_group, thread_name, daemon, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5325
    if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5326
      CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5327
      // cleanup outside the handle mark.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5328
      attach_failed = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5329
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5330
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5331
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5332
  if (attach_failed) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5333
    // Added missing cleanup
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5334
    thread->cleanup_failed_attach_current_thread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5335
    return JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5336
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5337
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5338
  // mark the thread as no longer attaching
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5339
  // this uses a fence to push the change through so we don't have
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5340
  // to regrab the threads_lock
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5341
  thread->set_done_attaching_via_jni();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5342
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5343
  // Set java thread status.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5344
  java_lang_Thread::set_thread_status(thread->threadObj(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5345
              java_lang_Thread::RUNNABLE);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5346
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5347
  // Notify the debugger
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5348
  if (JvmtiExport::should_post_thread_life()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5349
    JvmtiExport::post_thread_start(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5350
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5351
11480
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 11247
diff changeset
  5352
  EVENT_BEGIN(TraceEventThreadStart, event);
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 11247
diff changeset
  5353
  EVENT_COMMIT(event,
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 11247
diff changeset
  5354
      EVENT_SET(event, javalangthread, java_lang_Thread::thread_id(thread->threadObj())));
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 11247
diff changeset
  5355
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5356
  *(JNIEnv**)penv = thread->jni_environment();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5357
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5358
  // Now leaving the VM, so change thread_state. This is normally automatically taken care
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5359
  // 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
  5360
  // using ThreadStateTransition::transition, we do a callback to the safepoint code if
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5361
  // needed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5362
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5363
  ThreadStateTransition::transition_and_fence(thread, _thread_in_vm, _thread_in_native);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5364
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5365
  // Perform any platform dependent FPU setup
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5366
  os::setup_fpu();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5367
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5368
  return JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5369
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5370
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5371
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5372
jint JNICALL jni_AttachCurrentThread(JavaVM *vm, void **penv, void *_args) {
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5373
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5374
  DTRACE_PROBE3(hotspot_jni, AttachCurrentThread__entry, vm, penv, _args);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5375
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5376
  HOTSPOT_JNI_ATTACHCURRENTTHREAD_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5377
                                        vm, penv, _args);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5378
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5379
  if (!vm_created) {
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5380
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5381
    DTRACE_PROBE1(hotspot_jni, AttachCurrentThread__return, JNI_ERR);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5382
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5383
  HOTSPOT_JNI_ATTACHCURRENTTHREAD_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5384
                                         (uint32_t) JNI_ERR);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5385
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5386
    return JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5387
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5388
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5389
  JNIWrapper("AttachCurrentThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5390
  jint ret = attach_current_thread(vm, penv, _args, false);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5391
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5392
  DTRACE_PROBE1(hotspot_jni, AttachCurrentThread__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5393
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5394
  HOTSPOT_JNI_ATTACHCURRENTTHREAD_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5395
                                         ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5396
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5397
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5398
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5399
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5400
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5401
jint JNICALL jni_DetachCurrentThread(JavaVM *vm)  {
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5402
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5403
  DTRACE_PROBE1(hotspot_jni, DetachCurrentThread__entry, vm);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5404
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5405
  HOTSPOT_JNI_DETACHCURRENTTHREAD_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5406
                                        vm);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5407
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5408
  VM_Exit::block_if_vm_exited();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5409
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5410
  JNIWrapper("DetachCurrentThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5411
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5412
  // If the thread has been deattacted the operations is a no-op
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5413
  if (ThreadLocalStorage::thread() == NULL) {
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5414
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5415
    DTRACE_PROBE1(hotspot_jni, DetachCurrentThread__return, JNI_OK);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5416
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5417
  HOTSPOT_JNI_DETACHCURRENTTHREAD_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5418
                                         JNI_OK);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5419
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5420
    return JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5421
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5422
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5423
  JavaThread* thread = JavaThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5424
  if (thread->has_last_Java_frame()) {
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5425
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5426
    DTRACE_PROBE1(hotspot_jni, DetachCurrentThread__return, JNI_ERR);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5427
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5428
  HOTSPOT_JNI_DETACHCURRENTTHREAD_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5429
                                         (uint32_t) JNI_ERR);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5430
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5431
    // Can't detach a thread that's running java, that can't work.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5432
    return JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5433
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5434
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5435
  // Safepoint support. Have to do call-back to safepoint code, if in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5436
  // middel of a safepoint operation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5437
  ThreadStateTransition::transition_from_native(thread, _thread_in_vm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5438
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5439
  // XXX: Note that JavaThread::exit() call below removes the guards on the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5440
  // stack pages set up via enable_stack_{red,yellow}_zone() calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5441
  // above in jni_AttachCurrentThread. Unfortunately, while the setting
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5442
  // of the guards is visible in jni_AttachCurrentThread above,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5443
  // the removal of the guards is buried below in JavaThread::exit()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5444
  // here. The abstraction should be more symmetrically either exposed
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5445
  // or hidden (e.g. it could probably be hidden in the same
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5446
  // (platform-dependent) methods where we do alternate stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5447
  // maintenance work?)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5448
  thread->exit(false, JavaThread::jni_detach);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5449
  delete thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5450
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5451
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5452
  DTRACE_PROBE1(hotspot_jni, DetachCurrentThread__return, JNI_OK);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5453
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5454
  HOTSPOT_JNI_DETACHCURRENTTHREAD_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5455
                                         JNI_OK);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5456
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5457
  return JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5458
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5459
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5460
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5461
DT_RETURN_MARK_DECL(GetEnv, jint);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5462
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5463
DT_RETURN_MARK_DECL(GetEnv, jint
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5464
                    , HOTSPOT_JNI_GETENV_RETURN(_ret_ref));
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5465
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5466
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5467
jint JNICALL jni_GetEnv(JavaVM *vm, void **penv, jint version) {
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5468
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5469
  DTRACE_PROBE3(hotspot_jni, GetEnv__entry, vm, penv, version);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5470
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5471
  HOTSPOT_JNI_GETENV_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5472
                           vm, penv, version);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5473
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5474
  jint ret = JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5475
  DT_RETURN_MARK(GetEnv, jint, (const jint&)ret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5476
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5477
  if (!vm_created) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5478
    *penv = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5479
    ret = JNI_EDETACHED;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5480
    return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5481
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5482
11480
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 11247
diff changeset
  5483
  if (JniExportedInterface::GetExportedInterface(vm, penv, version, &ret)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5484
    return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5485
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5486
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5487
#ifndef JVMPI_VERSION_1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5488
// need these in order to be polite about older agents
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5489
#define JVMPI_VERSION_1   ((jint)0x10000001)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5490
#define JVMPI_VERSION_1_1 ((jint)0x10000002)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5491
#define JVMPI_VERSION_1_2 ((jint)0x10000003)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5492
#endif // !JVMPI_VERSION_1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5493
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5494
  Thread* thread = ThreadLocalStorage::thread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5495
  if (thread != NULL && thread->is_Java_thread()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5496
    if (Threads::is_supported_jni_version_including_1_1(version)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5497
      *(JNIEnv**)penv = ((JavaThread*) thread)->jni_environment();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5498
      ret = JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5499
      return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5500
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5501
    } else if (version == JVMPI_VERSION_1 ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5502
               version == JVMPI_VERSION_1_1 ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5503
               version == JVMPI_VERSION_1_2) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5504
      tty->print_cr("ERROR: JVMPI, an experimental interface, is no longer supported.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5505
      tty->print_cr("Please use the supported interface: the JVM Tool Interface (JVM TI).");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5506
      ret = JNI_EVERSION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5507
      return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5508
    } else if (JvmtiExport::is_jvmdi_version(version)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5509
      tty->print_cr("FATAL ERROR: JVMDI is no longer supported.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5510
      tty->print_cr("Please use the supported interface: the JVM Tool Interface (JVM TI).");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5511
      ret = JNI_EVERSION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5512
      return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5513
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5514
      *penv = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5515
      ret = JNI_EVERSION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5516
      return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5517
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5518
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5519
    *penv = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5520
    ret = JNI_EDETACHED;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5521
    return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5522
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5523
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5524
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5525
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5526
jint JNICALL jni_AttachCurrentThreadAsDaemon(JavaVM *vm, void **penv, void *_args) {
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5527
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5528
  DTRACE_PROBE3(hotspot_jni, AttachCurrentThreadAsDaemon__entry, vm, penv, _args);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5529
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5530
  HOTSPOT_JNI_ATTACHCURRENTTHREADASDAEMON_ENTRY(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5531
                                                vm, penv, _args);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5532
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5533
  if (!vm_created) {
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5534
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5535
    DTRACE_PROBE1(hotspot_jni, AttachCurrentThreadAsDaemon__return, JNI_ERR);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5536
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5537
  HOTSPOT_JNI_ATTACHCURRENTTHREADASDAEMON_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5538
                                                 (uint32_t) JNI_ERR);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5539
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5540
    return JNI_ERR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5541
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5542
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5543
  JNIWrapper("AttachCurrentThreadAsDaemon");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5544
  jint ret = attach_current_thread(vm, penv, _args, true);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5545
#ifndef USDT2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5546
  DTRACE_PROBE1(hotspot_jni, AttachCurrentThreadAsDaemon__return, ret);
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5547
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5548
  HOTSPOT_JNI_ATTACHCURRENTTHREADASDAEMON_RETURN(
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5549
                                                 ret);
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
  5550
#endif /* USDT2 */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5551
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5552
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5553
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5554
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5555
} // End extern "C"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5556
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5557
const struct JNIInvokeInterface_ jni_InvokeInterface = {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5558
    NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5559
    NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5560
    NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5561
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5562
    jni_DestroyJavaVM,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5563
    jni_AttachCurrentThread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5564
    jni_DetachCurrentThread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5565
    jni_GetEnv,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5566
    jni_AttachCurrentThreadAsDaemon
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5567
};