hotspot/src/share/vm/prims/unsafe.cpp
author johnc
Thu, 07 Apr 2011 09:53:20 -0700
changeset 9176 42d9d1010f38
parent 8725 8c1e3dd5fe1b
child 9179 6db9c9dffe1f
permissions -rw-r--r--
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer. Reviewed-by: kvn, iveresov, never, tonyp, dholmes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
7885
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
     2
 * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5089
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5089
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5089
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    26
#include "classfile/vmSymbols.hpp"
9176
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
    27
#ifndef SERIALGC
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
    28
#include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
    29
#endif // SERIALGC
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    30
#include "memory/allocation.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    31
#include "prims/jni.h"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    32
#include "prims/jvm.h"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    33
#include "runtime/globals.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    34
#include "runtime/interfaceSupport.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    35
#include "runtime/reflection.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    36
#include "runtime/reflectionCompat.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    37
#include "runtime/synchronizer.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    38
#include "services/threadService.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    39
#include "utilities/copy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    40
#include "utilities/dtrace.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    41
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
 *      Implementation of class sun.misc.Unsafe
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
5089
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 3262
diff changeset
    46
HS_DTRACE_PROBE_DECL3(hotspot, thread__park__begin, uintptr_t, int, long long);
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 3262
diff changeset
    47
HS_DTRACE_PROBE_DECL1(hotspot, thread__park__end, uintptr_t);
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 3262
diff changeset
    48
HS_DTRACE_PROBE_DECL1(hotspot, thread__unpark, uintptr_t);
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 3262
diff changeset
    49
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
#define MAX_OBJECT_SIZE \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
  ( arrayOopDesc::header_size(T_DOUBLE) * HeapWordSize \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
    + ((julong)max_jint * sizeof(double)) )
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
#define UNSAFE_ENTRY(result_type, header) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
  JVM_ENTRY(result_type, header)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
// Can't use UNSAFE_LEAF because it has the signature of a straight
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
// call into the runtime (just like JVM_LEAF, funny that) but it's
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
// called like a Java Native and thus the wrapper built for it passes
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
// arguments like a JNI call.  It expects those arguments to be popped
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
// from the stack on Intel like all good JNI args are, and adjusts the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
// stack according.  Since the JVM_LEAF call expects no extra
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
// arguments the stack isn't popped in the C code, is pushed by the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
// wrapper and we get sick.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
//#define UNSAFE_LEAF(result_type, header) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
//  JVM_LEAF(result_type, header)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
#define UNSAFE_END JVM_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
#define UnsafeWrapper(arg) /*nothing, for the present*/
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
inline void* addr_from_java(jlong addr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  // This assert fails in a variety of ways on 32-bit systems.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  // It is impossible to predict whether native code that converts
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  // pointers to longs will sign-extend or zero-extend the addresses.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  //assert(addr == (uintptr_t)addr, "must not be odd high bits");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  return (void*)(uintptr_t)addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
inline jlong addr_to_java(void* p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  assert(p == (void*)(uintptr_t)p, "must not be odd high bits");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  return (uintptr_t)p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
// Note: The VM's obj_field and related accessors use byte-scaled
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
// ("unscaled") offsets, just as the unsafe methods do.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
// However, the method Unsafe.fieldOffset explicitly declines to
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
// guarantee this.  The field offset values manipulated by the Java user
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
// through the Unsafe API are opaque cookies that just happen to be byte
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
// offsets.  We represent this state of affairs by passing the cookies
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
// through conversion functions when going between the VM and the Unsafe API.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
// The conversion functions just happen to be no-ops at present.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
inline jlong field_offset_to_byte_offset(jlong field_offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  return field_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
inline jlong field_offset_from_byte_offset(jlong byte_offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  return byte_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
inline jint invocation_key_from_method_slot(jint slot) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  return slot;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
inline jint invocation_key_to_method_slot(jint key) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  return key;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
inline void* index_oop_from_field_offset_long(oop p, jlong field_offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  jlong byte_offset = field_offset_to_byte_offset(field_offset);
8490
d58c5dbf8c7b 7012072: CompileTheWorld causes incorrect class initialization
never
parents: 8076
diff changeset
   116
  // Don't allow unsafe to be used to read or write the header word of oops
d58c5dbf8c7b 7012072: CompileTheWorld causes incorrect class initialization
never
parents: 8076
diff changeset
   117
  assert(p == NULL || field_offset >= oopDesc::header_size(), "offset must be outside of header");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  if (p != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
    assert(byte_offset >= 0 && byte_offset <= (jlong)MAX_OBJECT_SIZE, "sane offset");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
    if (byte_offset == (jint)byte_offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
      void* ptr_plus_disp = (address)p + byte_offset;
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   123
      assert((void*)p->obj_field_addr<oop>((jint)byte_offset) == ptr_plus_disp,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
             "raw [ptr+disp] must be consistent with oop::field_base");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  if (sizeof(char*) == sizeof(jint))    // (this constant folds!)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
    return (address)p + (jint) byte_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
    return (address)p +        byte_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
// Externally callable versions:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
// (Use these in compiler intrinsics which emulate unsafe primitives.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
jlong Unsafe_field_offset_to_byte_offset(jlong field_offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  return field_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
jlong Unsafe_field_offset_from_byte_offset(jlong byte_offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  return byte_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
jint Unsafe_invocation_key_from_method_slot(jint slot) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  return invocation_key_from_method_slot(slot);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
jint Unsafe_invocation_key_to_method_slot(jint key) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  return invocation_key_to_method_slot(key);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
///// Data in the Java heap.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
#define GET_FIELD(obj, offset, type_name, v) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  oop p = JNIHandles::resolve(obj); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  type_name v = *(type_name*)index_oop_from_field_offset_long(p, offset)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
#define SET_FIELD(obj, offset, type_name, x) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  oop p = JNIHandles::resolve(obj); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  *(type_name*)index_oop_from_field_offset_long(p, offset) = x
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
#define GET_FIELD_VOLATILE(obj, offset, type_name, v) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  oop p = JNIHandles::resolve(obj); \
7885
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   162
  volatile type_name v = OrderAccess::load_acquire((volatile type_name*)index_oop_from_field_offset_long(p, offset));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
#define SET_FIELD_VOLATILE(obj, offset, type_name, x) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  oop p = JNIHandles::resolve(obj); \
7885
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   166
  OrderAccess::release_store_fence((volatile type_name*)index_oop_from_field_offset_long(p, offset), x);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   168
// Macros for oops that check UseCompressedOops
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   169
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   170
#define GET_OOP_FIELD(obj, offset, v) \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   171
  oop p = JNIHandles::resolve(obj);   \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   172
  oop v;                              \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   173
  if (UseCompressedOops) {            \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   174
    narrowOop n = *(narrowOop*)index_oop_from_field_offset_long(p, offset); \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   175
    v = oopDesc::decode_heap_oop(n);                                \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   176
  } else {                            \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   177
    v = *(oop*)index_oop_from_field_offset_long(p, offset);                 \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   178
  }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   179
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   180
#define GET_OOP_FIELD_VOLATILE(obj, offset, v) \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   181
  oop p = JNIHandles::resolve(obj);   \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   182
  volatile oop v;                     \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   183
  if (UseCompressedOops) {            \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   184
    volatile narrowOop n = *(volatile narrowOop*)index_oop_from_field_offset_long(p, offset); \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   185
    v = oopDesc::decode_heap_oop(n);                               \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   186
  } else {                            \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   187
    v = *(volatile oop*)index_oop_from_field_offset_long(p, offset);       \
7885
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   188
  } \
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   189
  OrderAccess::acquire();
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   190
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   191
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
// Get/SetObject must be special-cased, since it works with handles.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
// The xxx140 variants for backward compatibility do not allow a full-width offset.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
UNSAFE_ENTRY(jobject, Unsafe_GetObject140(JNIEnv *env, jobject unsafe, jobject obj, jint offset))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  UnsafeWrapper("Unsafe_GetObject");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  if (obj == NULL)  THROW_0(vmSymbols::java_lang_NullPointerException());
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   198
  GET_OOP_FIELD(obj, offset, v)
9176
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   199
  jobject ret = JNIHandles::make_local(env, v);
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   200
#ifndef SERIALGC
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   201
  // We could be accessing the referent field in a reference
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   202
  // object. If G1 is enabled 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
   203
  // referent with the SATB barrier.
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   204
  if (UseG1GC) {
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   205
    bool needs_barrier = false;
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   206
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   207
    if (ret != NULL) {
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   208
      if (offset == java_lang_ref_Reference::referent_offset) {
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   209
        oop o = JNIHandles::resolve_non_null(obj);
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   210
        klassOop k = o->klass();
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   211
        if (instanceKlass::cast(k)->reference_type() != REF_NONE) {
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   212
          assert(instanceKlass::cast(k)->is_subclass_of(SystemDictionary::Reference_klass()), "sanity");
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   213
          needs_barrier = true;
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   214
        }
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   215
      }
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   216
    }
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   217
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   218
    if (needs_barrier) {
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   219
      oop referent = JNIHandles::resolve(ret);
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   220
      G1SATBCardTableModRefBS::enqueue(referent);
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   221
    }
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   222
  }
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   223
#endif // SERIALGC
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   224
  return ret;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
UNSAFE_ENTRY(void, Unsafe_SetObject140(JNIEnv *env, jobject unsafe, jobject obj, jint offset, jobject x_h))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  UnsafeWrapper("Unsafe_SetObject");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  if (obj == NULL)  THROW(vmSymbols::java_lang_NullPointerException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  oop x = JNIHandles::resolve(x_h);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  //SET_FIELD(obj, offset, oop, x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  oop p = JNIHandles::resolve(obj);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   233
  if (UseCompressedOops) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   234
    if (x != NULL) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   235
      // If there is a heap base pointer, we are obliged to emit a store barrier.
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   236
      oop_store((narrowOop*)index_oop_from_field_offset_long(p, offset), x);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   237
    } else {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   238
      narrowOop n = oopDesc::encode_heap_oop_not_null(x);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   239
      *(narrowOop*)index_oop_from_field_offset_long(p, offset) = n;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   240
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  } else {
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   242
    if (x != NULL) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   243
      // If there is a heap base pointer, we are obliged to emit a store barrier.
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   244
      oop_store((oop*)index_oop_from_field_offset_long(p, offset), x);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   245
    } else {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   246
      *(oop*)index_oop_from_field_offset_long(p, offset) = x;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   247
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
// The normal variants allow a null base pointer with an arbitrary address.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
// But if the base pointer is non-null, the offset should make some sense.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
// That is, it should be in the range [0, MAX_OBJECT_SIZE].
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
UNSAFE_ENTRY(jobject, Unsafe_GetObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  UnsafeWrapper("Unsafe_GetObject");
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   256
  GET_OOP_FIELD(obj, offset, v)
9176
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   257
  jobject ret = JNIHandles::make_local(env, v);
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   258
#ifndef SERIALGC
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   259
  // We could be accessing the referent field in a reference
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   260
  // object. If G1 is enabled then we need to register non-null
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   261
  // referent with the SATB barrier.
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   262
  if (UseG1GC) {
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   263
    bool needs_barrier = false;
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   264
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   265
    if (ret != NULL) {
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   266
      if (offset == java_lang_ref_Reference::referent_offset && obj != NULL) {
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   267
        oop o = JNIHandles::resolve(obj);
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   268
        klassOop k = o->klass();
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   269
        if (instanceKlass::cast(k)->reference_type() != REF_NONE) {
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   270
          assert(instanceKlass::cast(k)->is_subclass_of(SystemDictionary::Reference_klass()), "sanity");
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   271
          needs_barrier = true;
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   272
        }
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   273
      }
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   274
    }
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   275
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   276
    if (needs_barrier) {
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   277
      oop referent = JNIHandles::resolve(ret);
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   278
      G1SATBCardTableModRefBS::enqueue(referent);
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   279
    }
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   280
  }
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   281
#endif // SERIALGC
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8725
diff changeset
   282
  return ret;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
UNSAFE_ENTRY(void, Unsafe_SetObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  UnsafeWrapper("Unsafe_SetObject");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  oop x = JNIHandles::resolve(x_h);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  oop p = JNIHandles::resolve(obj);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   289
  if (UseCompressedOops) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   290
    oop_store((narrowOop*)index_oop_from_field_offset_long(p, offset), x);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   291
  } else {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   292
    oop_store((oop*)index_oop_from_field_offset_long(p, offset), x);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   293
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
UNSAFE_ENTRY(jobject, Unsafe_GetObjectVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  UnsafeWrapper("Unsafe_GetObjectVolatile");
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   298
  GET_OOP_FIELD_VOLATILE(obj, offset, v)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  return JNIHandles::make_local(env, v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
UNSAFE_ENTRY(void, Unsafe_SetObjectVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  UnsafeWrapper("Unsafe_SetObjectVolatile");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  oop x = JNIHandles::resolve(x_h);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  oop p = JNIHandles::resolve(obj);
7885
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   306
  void* addr = index_oop_from_field_offset_long(p, offset);
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   307
  OrderAccess::release();
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   308
  if (UseCompressedOops) {
7885
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   309
    oop_store((narrowOop*)addr, x);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   310
  } else {
7885
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   311
    oop_store((oop*)addr, x);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   312
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  OrderAccess::fence();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
7885
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   316
#if defined(SPARC) || defined(X86)
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   317
// Sparc and X86 have atomic jlong (8 bytes) instructions
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   318
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   319
#else
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   320
// Keep old code for platforms which may not have atomic jlong (8 bytes) instructions
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   321
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
// Volatile long versions must use locks if !VM_Version::supports_cx8().
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
// support_cx8 is a surrogate for 'supports atomic long memory ops'.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
UNSAFE_ENTRY(jlong, Unsafe_GetLongVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  UnsafeWrapper("Unsafe_GetLongVolatile");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
    if (VM_Version::supports_cx8()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
      GET_FIELD_VOLATILE(obj, offset, jlong, v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
      return v;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
    else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
      Handle p (THREAD, JNIHandles::resolve(obj));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
      jlong* addr = (jlong*)(index_oop_from_field_offset_long(p(), offset));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
      ObjectLocker ol(p, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
      jlong value = *addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
      return value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
UNSAFE_ENTRY(void, Unsafe_SetLongVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong x))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  UnsafeWrapper("Unsafe_SetLongVolatile");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
    if (VM_Version::supports_cx8()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
      SET_FIELD_VOLATILE(obj, offset, jlong, x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
    else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
      Handle p (THREAD, JNIHandles::resolve(obj));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
      jlong* addr = (jlong*)(index_oop_from_field_offset_long(p(), offset));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
      ObjectLocker ol(p, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
      *addr = x;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
7885
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   357
#endif // not SPARC and not X86
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
#define DEFINE_GETSETOOP(jboolean, Boolean) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
UNSAFE_ENTRY(jboolean, Unsafe_Get##Boolean##140(JNIEnv *env, jobject unsafe, jobject obj, jint offset)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
  UnsafeWrapper("Unsafe_Get"#Boolean); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  if (obj == NULL)  THROW_0(vmSymbols::java_lang_NullPointerException()); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
  GET_FIELD(obj, offset, jboolean, v); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  return v; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
UNSAFE_END \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
UNSAFE_ENTRY(void, Unsafe_Set##Boolean##140(JNIEnv *env, jobject unsafe, jobject obj, jint offset, jboolean x)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  UnsafeWrapper("Unsafe_Set"#Boolean); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  if (obj == NULL)  THROW(vmSymbols::java_lang_NullPointerException()); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  SET_FIELD(obj, offset, jboolean, x); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
UNSAFE_END \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
UNSAFE_ENTRY(jboolean, Unsafe_Get##Boolean(JNIEnv *env, jobject unsafe, jobject obj, jlong offset)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
  UnsafeWrapper("Unsafe_Get"#Boolean); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
  GET_FIELD(obj, offset, jboolean, v); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
  return v; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
UNSAFE_END \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
UNSAFE_ENTRY(void, Unsafe_Set##Boolean(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jboolean x)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  UnsafeWrapper("Unsafe_Set"#Boolean); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  SET_FIELD(obj, offset, jboolean, x); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
UNSAFE_END \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
// END DEFINE_GETSETOOP.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
7885
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   387
DEFINE_GETSETOOP(jboolean, Boolean)
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   388
DEFINE_GETSETOOP(jbyte, Byte)
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   389
DEFINE_GETSETOOP(jshort, Short);
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   390
DEFINE_GETSETOOP(jchar, Char);
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   391
DEFINE_GETSETOOP(jint, Int);
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   392
DEFINE_GETSETOOP(jlong, Long);
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   393
DEFINE_GETSETOOP(jfloat, Float);
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   394
DEFINE_GETSETOOP(jdouble, Double);
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   395
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   396
#undef DEFINE_GETSETOOP
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
#define DEFINE_GETSETOOP_VOLATILE(jboolean, Boolean) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
UNSAFE_ENTRY(jboolean, Unsafe_Get##Boolean##Volatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  UnsafeWrapper("Unsafe_Get"#Boolean); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  GET_FIELD_VOLATILE(obj, offset, jboolean, v); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
  return v; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
UNSAFE_END \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
UNSAFE_ENTRY(void, Unsafe_Set##Boolean##Volatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jboolean x)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  UnsafeWrapper("Unsafe_Set"#Boolean); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  SET_FIELD_VOLATILE(obj, offset, jboolean, x); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
UNSAFE_END \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
// END DEFINE_GETSETOOP_VOLATILE.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
DEFINE_GETSETOOP_VOLATILE(jboolean, Boolean)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
DEFINE_GETSETOOP_VOLATILE(jbyte, Byte)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
DEFINE_GETSETOOP_VOLATILE(jshort, Short);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
DEFINE_GETSETOOP_VOLATILE(jchar, Char);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
DEFINE_GETSETOOP_VOLATILE(jint, Int);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
DEFINE_GETSETOOP_VOLATILE(jfloat, Float);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
DEFINE_GETSETOOP_VOLATILE(jdouble, Double);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
7885
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   421
#if defined(SPARC) || defined(X86)
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   422
// Sparc and X86 have atomic jlong (8 bytes) instructions
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   423
DEFINE_GETSETOOP_VOLATILE(jlong, Long);
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   424
#endif
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   425
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   426
#undef DEFINE_GETSETOOP_VOLATILE
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
// The non-intrinsified versions of setOrdered just use setVolatile
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
7885
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   430
UNSAFE_ENTRY(void, Unsafe_SetOrderedInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint x))
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   431
  UnsafeWrapper("Unsafe_SetOrderedInt");
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   432
  SET_FIELD_VOLATILE(obj, offset, jint, x);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
UNSAFE_ENTRY(void, Unsafe_SetOrderedObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
  UnsafeWrapper("Unsafe_SetOrderedObject");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  oop x = JNIHandles::resolve(x_h);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
  oop p = JNIHandles::resolve(obj);
7885
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   439
  void* addr = index_oop_from_field_offset_long(p, offset);
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   440
  OrderAccess::release();
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   441
  if (UseCompressedOops) {
7885
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   442
    oop_store((narrowOop*)addr, x);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   443
  } else {
7885
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   444
    oop_store((oop*)addr, x);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   445
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  OrderAccess::fence();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
UNSAFE_ENTRY(void, Unsafe_SetOrderedLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong x))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  UnsafeWrapper("Unsafe_SetOrderedLong");
7885
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   451
#if defined(SPARC) || defined(X86)
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   452
  // Sparc and X86 have atomic jlong (8 bytes) instructions
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   453
  SET_FIELD_VOLATILE(obj, offset, jlong, x);
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   454
#else
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   455
  // Keep old code for platforms which may not have atomic long (8 bytes) instructions
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
    if (VM_Version::supports_cx8()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
      SET_FIELD_VOLATILE(obj, offset, jlong, x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
    else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
      Handle p (THREAD, JNIHandles::resolve(obj));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
      jlong* addr = (jlong*)(index_oop_from_field_offset_long(p(), offset));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
      ObjectLocker ol(p, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
      *addr = x;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
  }
7885
c02b05ba16a1 7009756: volatile variables could be broken throw reflection API
kvn
parents: 7397
diff changeset
   467
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
////// Data in the C heap.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
// Note:  These do not throw NullPointerException for bad pointers.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
// They just crash.  Only a oop base pointer can generate a NullPointerException.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
#define DEFINE_GETSETNATIVE(java_type, Type, native_type) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
UNSAFE_ENTRY(java_type, Unsafe_GetNative##Type(JNIEnv *env, jobject unsafe, jlong addr)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
  UnsafeWrapper("Unsafe_GetNative"#Type); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
  void* p = addr_from_java(addr); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
  JavaThread* t = JavaThread::current(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
  t->set_doing_unsafe_access(true); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
  java_type x = *(volatile native_type*)p; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
  t->set_doing_unsafe_access(false); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
  return x; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
UNSAFE_END \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
UNSAFE_ENTRY(void, Unsafe_SetNative##Type(JNIEnv *env, jobject unsafe, jlong addr, java_type x)) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
  UnsafeWrapper("Unsafe_SetNative"#Type); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
  JavaThread* t = JavaThread::current(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
  t->set_doing_unsafe_access(true); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
  void* p = addr_from_java(addr); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
  *(volatile native_type*)p = x; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
  t->set_doing_unsafe_access(false); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
UNSAFE_END \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
// END DEFINE_GETSETNATIVE.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
DEFINE_GETSETNATIVE(jbyte, Byte, signed char)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
DEFINE_GETSETNATIVE(jshort, Short, signed short);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
DEFINE_GETSETNATIVE(jchar, Char, unsigned short);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
DEFINE_GETSETNATIVE(jint, Int, jint);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
// no long -- handled specially
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
DEFINE_GETSETNATIVE(jfloat, Float, float);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
DEFINE_GETSETNATIVE(jdouble, Double, double);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
#undef DEFINE_GETSETNATIVE
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
UNSAFE_ENTRY(jlong, Unsafe_GetNativeLong(JNIEnv *env, jobject unsafe, jlong addr))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
  UnsafeWrapper("Unsafe_GetNativeLong");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
  JavaThread* t = JavaThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
  // We do it this way to avoid problems with access to heap using 64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
  // bit loads, as jlong in heap could be not 64-bit aligned, and on
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
  // some CPUs (SPARC) it leads to SIGBUS.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
  t->set_doing_unsafe_access(true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
  void* p = addr_from_java(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
  jlong x;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
  if (((intptr_t)p & 7) == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
    // jlong is aligned, do a volatile access
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
    x = *(volatile jlong*)p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
    jlong_accessor acc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
    acc.words[0] = ((volatile jint*)p)[0];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
    acc.words[1] = ((volatile jint*)p)[1];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
    x = acc.long_value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
  t->set_doing_unsafe_access(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
  return x;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
UNSAFE_ENTRY(void, Unsafe_SetNativeLong(JNIEnv *env, jobject unsafe, jlong addr, jlong x))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
  UnsafeWrapper("Unsafe_SetNativeLong");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
  JavaThread* t = JavaThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
  // see comment for Unsafe_GetNativeLong
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
  t->set_doing_unsafe_access(true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
  void* p = addr_from_java(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
  if (((intptr_t)p & 7) == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
    // jlong is aligned, do a volatile access
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
    *(volatile jlong*)p = x;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
    jlong_accessor acc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
    acc.long_value = x;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
    ((volatile jint*)p)[0] = acc.words[0];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
    ((volatile jint*)p)[1] = acc.words[1];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
  t->set_doing_unsafe_access(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
UNSAFE_ENTRY(jlong, Unsafe_GetNativeAddress(JNIEnv *env, jobject unsafe, jlong addr))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  UnsafeWrapper("Unsafe_GetNativeAddress");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  void* p = addr_from_java(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  return addr_to_java(*(void**)p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
UNSAFE_ENTRY(void, Unsafe_SetNativeAddress(JNIEnv *env, jobject unsafe, jlong addr, jlong x))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
  UnsafeWrapper("Unsafe_SetNativeAddress");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
  void* p = addr_from_java(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
  *(void**)p = addr_from_java(x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
////// Allocation requests
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
UNSAFE_ENTRY(jobject, Unsafe_AllocateInstance(JNIEnv *env, jobject unsafe, jclass cls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
  UnsafeWrapper("Unsafe_AllocateInstance");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
    ThreadToNativeFromVM ttnfv(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
    return env->AllocObject(cls);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
UNSAFE_ENTRY(jlong, Unsafe_AllocateMemory(JNIEnv *env, jobject unsafe, jlong size))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
  UnsafeWrapper("Unsafe_AllocateMemory");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
  size_t sz = (size_t)size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
  if (sz != (julong)size || size < 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
    THROW_0(vmSymbols::java_lang_IllegalArgumentException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
  if (sz == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
    return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
  sz = round_to(sz, HeapWordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
  void* x = os::malloc(sz);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
  if (x == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
    THROW_0(vmSymbols::java_lang_OutOfMemoryError());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
  //Copy::fill_to_words((HeapWord*)x, sz / HeapWordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
  return addr_to_java(x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
UNSAFE_ENTRY(jlong, Unsafe_ReallocateMemory(JNIEnv *env, jobject unsafe, jlong addr, jlong size))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
  UnsafeWrapper("Unsafe_ReallocateMemory");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
  void* p = addr_from_java(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
  size_t sz = (size_t)size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
  if (sz != (julong)size || size < 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
    THROW_0(vmSymbols::java_lang_IllegalArgumentException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
  if (sz == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
    os::free(p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
    return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
  sz = round_to(sz, HeapWordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
  void* x = (p == NULL) ? os::malloc(sz) : os::realloc(p, sz);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
  if (x == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
    THROW_0(vmSymbols::java_lang_OutOfMemoryError());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
  return addr_to_java(x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
UNSAFE_ENTRY(void, Unsafe_FreeMemory(JNIEnv *env, jobject unsafe, jlong addr))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
  UnsafeWrapper("Unsafe_FreeMemory");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
  void* p = addr_from_java(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
  if (p == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
  os::free(p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
UNSAFE_ENTRY(void, Unsafe_SetMemory(JNIEnv *env, jobject unsafe, jlong addr, jlong size, jbyte value))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
  UnsafeWrapper("Unsafe_SetMemory");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
  size_t sz = (size_t)size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
  if (sz != (julong)size || size < 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
    THROW(vmSymbols::java_lang_IllegalArgumentException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
  char* p = (char*) addr_from_java(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
  Copy::fill_to_memory_atomic(p, sz, value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
UNSAFE_ENTRY(void, Unsafe_SetMemory2(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong size, jbyte value))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
  UnsafeWrapper("Unsafe_SetMemory");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
  size_t sz = (size_t)size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
  if (sz != (julong)size || size < 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
    THROW(vmSymbols::java_lang_IllegalArgumentException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
  oop base = JNIHandles::resolve(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
  void* p = index_oop_from_field_offset_long(base, offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
  Copy::fill_to_memory_atomic(p, sz, value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
UNSAFE_ENTRY(void, Unsafe_CopyMemory(JNIEnv *env, jobject unsafe, jlong srcAddr, jlong dstAddr, jlong size))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
  UnsafeWrapper("Unsafe_CopyMemory");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
  if (size == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
  size_t sz = (size_t)size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
  if (sz != (julong)size || size < 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
    THROW(vmSymbols::java_lang_IllegalArgumentException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
  void* src = addr_from_java(srcAddr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
  void* dst = addr_from_java(dstAddr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
  Copy::conjoint_memory_atomic(src, dst, sz);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
UNSAFE_ENTRY(void, Unsafe_CopyMemory2(JNIEnv *env, jobject unsafe, jobject srcObj, jlong srcOffset, jobject dstObj, jlong dstOffset, jlong size))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
  UnsafeWrapper("Unsafe_CopyMemory");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
  if (size == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
  size_t sz = (size_t)size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
  if (sz != (julong)size || size < 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
    THROW(vmSymbols::java_lang_IllegalArgumentException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
  oop srcp = JNIHandles::resolve(srcObj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
  oop dstp = JNIHandles::resolve(dstObj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
  if (dstp != NULL && !dstp->is_typeArray()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
    // NYI:  This works only for non-oop arrays at present.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
    // Generalizing it would be reasonable, but requires card marking.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
    // Also, autoboxing a Long from 0L in copyMemory(x,y, 0L,z, n) would be bad.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
    THROW(vmSymbols::java_lang_IllegalArgumentException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
  void* src = index_oop_from_field_offset_long(srcp, srcOffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
  void* dst = index_oop_from_field_offset_long(dstp, dstOffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
  Copy::conjoint_memory_atomic(src, dst, sz);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
////// Random queries
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
// See comment at file start about UNSAFE_LEAF
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
//UNSAFE_LEAF(jint, Unsafe_AddressSize())
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
UNSAFE_ENTRY(jint, Unsafe_AddressSize(JNIEnv *env, jobject unsafe))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
  UnsafeWrapper("Unsafe_AddressSize");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
  return sizeof(void*);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
// See comment at file start about UNSAFE_LEAF
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
//UNSAFE_LEAF(jint, Unsafe_PageSize())
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
UNSAFE_ENTRY(jint, Unsafe_PageSize(JNIEnv *env, jobject unsafe))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
  UnsafeWrapper("Unsafe_PageSize");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
  return os::vm_page_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
jint find_field_offset(jobject field, int must_be_static, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
  if (field == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
    THROW_0(vmSymbols::java_lang_NullPointerException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
  oop reflected   = JNIHandles::resolve_non_null(field);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
  oop mirror      = java_lang_reflect_Field::clazz(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
  klassOop k      = java_lang_Class::as_klassOop(mirror);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
  int slot        = java_lang_reflect_Field::slot(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
  int modifiers   = java_lang_reflect_Field::modifiers(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
  if (must_be_static >= 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
    int really_is_static = ((modifiers & JVM_ACC_STATIC) != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
    if (must_be_static != really_is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
      THROW_0(vmSymbols::java_lang_IllegalArgumentException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
  int offset = instanceKlass::cast(k)->offset_from_fields(slot);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
  return field_offset_from_byte_offset(offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
UNSAFE_ENTRY(jlong, Unsafe_ObjectFieldOffset(JNIEnv *env, jobject unsafe, jobject field))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
  UnsafeWrapper("Unsafe_ObjectFieldOffset");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
  return find_field_offset(field, 0, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
UNSAFE_ENTRY(jlong, Unsafe_StaticFieldOffset(JNIEnv *env, jobject unsafe, jobject field))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
  UnsafeWrapper("Unsafe_StaticFieldOffset");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
  return find_field_offset(field, 1, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
UNSAFE_ENTRY(jobject, Unsafe_StaticFieldBaseFromField(JNIEnv *env, jobject unsafe, jobject field))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
  UnsafeWrapper("Unsafe_StaticFieldBase");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
  // Note:  In this VM implementation, a field address is always a short
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
  // offset from the base of a a klass metaobject.  Thus, the full dynamic
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
  // range of the return type is never used.  However, some implementations
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
  // might put the static field inside an array shared by many classes,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
  // or even at a fixed address, in which case the address could be quite
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
  // large.  In that last case, this function would return NULL, since
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
  // the address would operate alone, without any base pointer.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
  if (field == NULL)  THROW_0(vmSymbols::java_lang_NullPointerException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
  oop reflected   = JNIHandles::resolve_non_null(field);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
  oop mirror      = java_lang_reflect_Field::clazz(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
  int modifiers   = java_lang_reflect_Field::modifiers(reflected);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
  if ((modifiers & JVM_ACC_STATIC) == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
    THROW_0(vmSymbols::java_lang_IllegalArgumentException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8490
diff changeset
   744
  return JNIHandles::make_local(env, mirror);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
//@deprecated
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
UNSAFE_ENTRY(jint, Unsafe_FieldOffset(JNIEnv *env, jobject unsafe, jobject field))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
  UnsafeWrapper("Unsafe_FieldOffset");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
  // tries (but fails) to be polymorphic between static and non-static:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
  jlong offset = find_field_offset(field, -1, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
  guarantee(offset == (jint)offset, "offset fits in 32 bits");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
  return (jint)offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
//@deprecated
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
UNSAFE_ENTRY(jobject, Unsafe_StaticFieldBaseFromClass(JNIEnv *env, jobject unsafe, jobject clazz))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
  UnsafeWrapper("Unsafe_StaticFieldBase");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
  if (clazz == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
    THROW_0(vmSymbols::java_lang_NullPointerException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
  }
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8490
diff changeset
   762
  return JNIHandles::make_local(env, JNIHandles::resolve_non_null(clazz));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
UNSAFE_ENTRY(void, Unsafe_EnsureClassInitialized(JNIEnv *env, jobject unsafe, jobject clazz))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
  UnsafeWrapper("Unsafe_EnsureClassInitialized");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
  if (clazz == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
    THROW(vmSymbols::java_lang_NullPointerException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
  oop mirror = JNIHandles::resolve_non_null(clazz);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
  instanceKlass* k = instanceKlass::cast(java_lang_Class::as_klassOop(mirror));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
  if (k != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
    k->initialize(CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
static void getBaseAndScale(int& base, int& scale, jclass acls, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
  if (acls == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
    THROW(vmSymbols::java_lang_NullPointerException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
  oop      mirror = JNIHandles::resolve_non_null(acls);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
  klassOop k      = java_lang_Class::as_klassOop(mirror);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
  if (k == NULL || !k->klass_part()->oop_is_array()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
    THROW(vmSymbols::java_lang_InvalidClassException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
  } else if (k->klass_part()->oop_is_objArray()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
    base  = arrayOopDesc::base_offset_in_bytes(T_OBJECT);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   787
    scale = heapOopSize;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
  } else if (k->klass_part()->oop_is_typeArray()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
    typeArrayKlass* tak = typeArrayKlass::cast(k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
    base  = tak->array_header_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
    assert(base == arrayOopDesc::base_offset_in_bytes(tak->element_type()), "array_header_size semantics ok");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
    scale = (1 << tak->log2_element_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
UNSAFE_ENTRY(jint, Unsafe_ArrayBaseOffset(JNIEnv *env, jobject unsafe, jclass acls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
  UnsafeWrapper("Unsafe_ArrayBaseOffset");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
  int base, scale;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
  getBaseAndScale(base, scale, acls, CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
  return field_offset_from_byte_offset(base);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
UNSAFE_ENTRY(jint, Unsafe_ArrayIndexScale(JNIEnv *env, jobject unsafe, jclass acls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
  UnsafeWrapper("Unsafe_ArrayIndexScale");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
  int base, scale;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
  getBaseAndScale(base, scale, acls, CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
  // This VM packs both fields and array elements down to the byte.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
  // But watch out:  If this changes, so that array references for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
  // a given primitive type (say, T_BOOLEAN) use different memory units
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
  // than fields, this method MUST return zero for such arrays.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
  // For example, the VM used to store sub-word sized fields in full
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
  // words in the object layout, so that accessors like getByte(Object,int)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
  // did not really do what one might expect for arrays.  Therefore,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
  // this function used to report a zero scale factor, so that the user
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
  // would know not to attempt to access sub-word array elements.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
  // // Code for unpacked fields:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
  // if (scale < wordSize)  return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
  // The following allows for a pretty general fieldOffset cookie scheme,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
  // but requires it to be linear in byte offset.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
  return field_offset_from_byte_offset(scale) - field_offset_from_byte_offset(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
static inline void throw_new(JNIEnv *env, const char *ename) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
  char buf[100];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
  strcpy(buf, "java/lang/");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
  strcat(buf, ename);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
  jclass cls = env->FindClass(buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
  char* msg = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
  env->ThrowNew(cls, msg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
static jclass Unsafe_DefineClass(JNIEnv *env, jstring name, jbyteArray data, int offset, int length, jobject loader, jobject pd) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
    // Code lifted from JDK 1.3 ClassLoader.c
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
    jbyte *body;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
    char *utfName;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
    jclass result = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
    char buf[128];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
    if (UsePerfData) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
      ClassLoader::unsafe_defineClassCallCounter()->inc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
    if (data == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
        throw_new(env, "NullPointerException");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
        return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
    /* Work around 4153825. malloc crashes on Solaris when passed a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
     * negative size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
     */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
    if (length < 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
        throw_new(env, "ArrayIndexOutOfBoundsException");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
        return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
    body = NEW_C_HEAP_ARRAY(jbyte, length);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
    if (body == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
        throw_new(env, "OutOfMemoryError");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
        return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
    env->GetByteArrayRegion(data, offset, length, body);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
    if (env->ExceptionOccurred())
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
        goto free_body;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
    if (name != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
        uint len = env->GetStringUTFLength(name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
        int unicode_len = env->GetStringLength(name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
        if (len >= sizeof(buf)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
            utfName = NEW_C_HEAP_ARRAY(char, len + 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
            if (utfName == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
                throw_new(env, "OutOfMemoryError");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
                goto free_body;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
            utfName = buf;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
        env->GetStringUTFRegion(name, 0, unicode_len, utfName);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
        //VerifyFixClassname(utfName);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
        for (uint i = 0; i < len; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
          if (utfName[i] == '.')   utfName[i] = '/';
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
        utfName = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
    result = JVM_DefineClass(env, utfName, loader, body, length, pd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
    if (utfName && utfName != buf)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
        FREE_C_HEAP_ARRAY(char, utfName);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
 free_body:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
    FREE_C_HEAP_ARRAY(jbyte, body);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
    return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
UNSAFE_ENTRY(jclass, Unsafe_DefineClass0(JNIEnv *env, jobject unsafe, jstring name, jbyteArray data, int offset, int length))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
  UnsafeWrapper("Unsafe_DefineClass");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
    ThreadToNativeFromVM ttnfv(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
    int depthFromDefineClass0 = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
    jclass  caller = JVM_GetCallerClass(env, depthFromDefineClass0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
    jobject loader = (caller == NULL) ? NULL : JVM_GetClassLoader(env, caller);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
    jobject pd     = (caller == NULL) ? NULL : JVM_GetProtectionDomain(env, caller);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
    return Unsafe_DefineClass(env, name, data, offset, length, loader, pd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
UNSAFE_ENTRY(jclass, Unsafe_DefineClass1(JNIEnv *env, jobject unsafe, jstring name, jbyteArray data, int offset, int length, jobject loader, jobject pd))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
  UnsafeWrapper("Unsafe_DefineClass");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
    ThreadToNativeFromVM ttnfv(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
    return Unsafe_DefineClass(env, name, data, offset, length, loader, pd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
1550
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   932
#define DAC_Args CLS"[B["OBJ
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   933
// define a class but do not make it known to the class loader or system dictionary
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   934
// - host_class:  supplies context for linkage, access control, protection domain, and class loader
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   935
// - data:  bytes of a class file, a raw memory address (length gives the number of bytes)
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   936
// - cp_patches:  where non-null entries exist, they replace corresponding CP entries in data
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   937
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   938
// When you load an anonymous class U, it works as if you changed its name just before loading,
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   939
// to a name that you will never use again.  Since the name is lost, no other class can directly
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   940
// link to any member of U.  Just after U is loaded, the only way to use it is reflectively,
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   941
// through java.lang.Class methods like Class.newInstance.
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   942
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   943
// Access checks for linkage sites within U continue to follow the same rules as for named classes.
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   944
// The package of an anonymous class is given by the package qualifier on the name under which it was loaded.
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   945
// An anonymous class also has special privileges to access any member of its host class.
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   946
// This is the main reason why this loading operation is unsafe.  The purpose of this is to
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   947
// allow language implementations to simulate "open classes"; a host class in effect gets
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   948
// new code when an anonymous class is loaded alongside it.  A less convenient but more
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   949
// standard way to do this is with reflection, which can also be set to ignore access
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   950
// restrictions.
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   951
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   952
// Access into an anonymous class is possible only through reflection.  Therefore, there
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   953
// are no special access rules for calling into an anonymous class.  The relaxed access
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   954
// rule for the host class is applied in the opposite direction:  A host class reflectively
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   955
// access one of its anonymous classes.
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   956
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   957
// If you load the same bytecodes twice, you get two different classes.  You can reload
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   958
// the same bytecodes with or without varying CP patches.
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   959
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   960
// By using the CP patching array, you can have a new anonymous class U2 refer to an older one U1.
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   961
// The bytecodes for U2 should refer to U1 by a symbolic name (doesn't matter what the name is).
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   962
// The CONSTANT_Class entry for that name can be patched to refer directly to U1.
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   963
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   964
// This allows, for example, U2 to use U1 as a superclass or super-interface, or as
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   965
// an outer class (so that U2 is an anonymous inner class of anonymous U1).
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   966
// It is not possible for a named class, or an older anonymous class, to refer by
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   967
// name (via its CP) to a newer anonymous class.
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   968
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   969
// CP patching may also be used to modify (i.e., hack) the names of methods, classes,
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   970
// or type descriptors used in the loaded anonymous class.
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   971
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   972
// Finally, CP patching may be used to introduce "live" objects into the constant pool,
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   973
// instead of "dead" strings.  A compiled statement like println((Object)"hello") can
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   974
// be changed to println(greeting), where greeting is an arbitrary object created before
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   975
// the anonymous class is loaded.  This is useful in dynamic languages, in which
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   976
// various kinds of metaobjects must be introduced as constants into bytecode.
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   977
// Note the cast (Object), which tells the verifier to expect an arbitrary object,
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   978
// not just a literal string.  For such ldc instructions, the verifier uses the
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   979
// type Object instead of String, if the loaded constant is not in fact a String.
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   980
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   981
static oop
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   982
Unsafe_DefineAnonymousClass_impl(JNIEnv *env,
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   983
                                 jclass host_class, jbyteArray data, jobjectArray cp_patches_jh,
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   984
                                 HeapWord* *temp_alloc,
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   985
                                 TRAPS) {
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   986
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   987
  if (UsePerfData) {
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   988
    ClassLoader::unsafe_defineClassCallCounter()->inc();
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   989
  }
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   990
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   991
  if (data == NULL) {
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   992
    THROW_0(vmSymbols::java_lang_NullPointerException());
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   993
  }
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   994
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   995
  jint length = typeArrayOop(JNIHandles::resolve_non_null(data))->length();
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   996
  jint word_length = (length + sizeof(HeapWord)-1) / sizeof(HeapWord);
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   997
  HeapWord* body = NEW_C_HEAP_ARRAY(HeapWord, word_length);
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   998
  if (body == NULL) {
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
   999
    THROW_0(vmSymbols::java_lang_OutOfMemoryError());
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1000
  }
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1001
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1002
  // caller responsible to free it:
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1003
  (*temp_alloc) = body;
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1004
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1005
  {
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1006
    jbyte* array_base = typeArrayOop(JNIHandles::resolve_non_null(data))->byte_at_addr(0);
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1007
    Copy::conjoint_words((HeapWord*) array_base, body, word_length);
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1008
  }
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1009
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1010
  u1* class_bytes = (u1*) body;
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1011
  int class_bytes_length = (int) length;
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1012
  if (class_bytes_length < 0)  class_bytes_length = 0;
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1013
  if (class_bytes == NULL
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1014
      || host_class == NULL
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1015
      || length != class_bytes_length)
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1016
    THROW_0(vmSymbols::java_lang_IllegalArgumentException());
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1017
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1018
  objArrayHandle cp_patches_h;
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1019
  if (cp_patches_jh != NULL) {
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1020
    oop p = JNIHandles::resolve_non_null(cp_patches_jh);
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1021
    if (!p->is_objArray())
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1022
      THROW_0(vmSymbols::java_lang_IllegalArgumentException());
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1023
    cp_patches_h = objArrayHandle(THREAD, (objArrayOop)p);
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1024
  }
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1025
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1026
  KlassHandle host_klass(THREAD, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(host_class)));
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1027
  const char* host_source = host_klass->external_name();
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1028
  Handle      host_loader(THREAD, host_klass->class_loader());
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1029
  Handle      host_domain(THREAD, host_klass->protection_domain());
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1030
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1031
  GrowableArray<Handle>* cp_patches = NULL;
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1032
  if (cp_patches_h.not_null()) {
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1033
    int alen = cp_patches_h->length();
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1034
    for (int i = alen-1; i >= 0; i--) {
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1035
      oop p = cp_patches_h->obj_at(i);
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1036
      if (p != NULL) {
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1037
        Handle patch(THREAD, p);
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1038
        if (cp_patches == NULL)
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1039
          cp_patches = new GrowableArray<Handle>(i+1, i+1, Handle());
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1040
        cp_patches->at_put(i, patch);
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1041
      }
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1042
    }
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1043
  }
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1044
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1045
  ClassFileStream st(class_bytes, class_bytes_length, (char*) host_source);
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1046
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1047
  instanceKlassHandle anon_klass;
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1048
  {
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7885
diff changeset
  1049
    Symbol* no_class_name = NULL;
1550
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1050
    klassOop anonk = SystemDictionary::parse_stream(no_class_name,
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1051
                                                    host_loader, host_domain,
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1052
                                                    &st, host_klass, cp_patches,
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1053
                                                    CHECK_NULL);
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1054
    if (anonk == NULL)  return NULL;
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1055
    anon_klass = instanceKlassHandle(THREAD, anonk);
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1056
  }
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1057
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1058
  // let caller initialize it as needed...
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1059
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1060
  return anon_klass->java_mirror();
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1061
}
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1062
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1063
UNSAFE_ENTRY(jclass, Unsafe_DefineAnonymousClass(JNIEnv *env, jobject unsafe, jclass host_class, jbyteArray data, jobjectArray cp_patches_jh))
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1064
{
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1065
  UnsafeWrapper("Unsafe_DefineAnonymousClass");
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1066
  ResourceMark rm(THREAD);
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1067
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1068
  HeapWord* temp_alloc = NULL;
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1069
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1070
  jobject res_jh = NULL;
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1071
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1072
  { oop res_oop = Unsafe_DefineAnonymousClass_impl(env,
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1073
                                                   host_class, data, cp_patches_jh,
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1074
                                                   &temp_alloc, THREAD);
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1075
    if (res_oop != NULL)
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1076
      res_jh = JNIHandles::make_local(env, res_oop);
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1077
  }
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1078
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1079
  // try/finally clause:
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1080
  if (temp_alloc != NULL) {
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1081
    FREE_C_HEAP_ARRAY(HeapWord, temp_alloc);
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1082
  }
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1083
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1084
  return (jclass) res_jh;
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1085
}
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1086
UNSAFE_END
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1087
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1088
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1089
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
UNSAFE_ENTRY(void, Unsafe_MonitorEnter(JNIEnv *env, jobject unsafe, jobject jobj))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
  UnsafeWrapper("Unsafe_MonitorEnter");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1093
    if (jobj == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
      THROW(vmSymbols::java_lang_NullPointerException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
    Handle obj(thread, JNIHandles::resolve_non_null(jobj));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
    ObjectSynchronizer::jni_enter(obj, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
UNSAFE_ENTRY(jboolean, Unsafe_TryMonitorEnter(JNIEnv *env, jobject unsafe, jobject jobj))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
  UnsafeWrapper("Unsafe_TryMonitorEnter");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
    if (jobj == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
      THROW_(vmSymbols::java_lang_NullPointerException(), JNI_FALSE);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
    Handle obj(thread, JNIHandles::resolve_non_null(jobj));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
    bool res = ObjectSynchronizer::jni_try_enter(obj, CHECK_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
    return (res ? JNI_TRUE : JNI_FALSE);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
UNSAFE_ENTRY(void, Unsafe_MonitorExit(JNIEnv *env, jobject unsafe, jobject jobj))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
  UnsafeWrapper("Unsafe_MonitorExit");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
    if (jobj == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
      THROW(vmSymbols::java_lang_NullPointerException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
    Handle obj(THREAD, JNIHandles::resolve_non_null(jobj));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1122
    ObjectSynchronizer::jni_exit(obj(), CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1123
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
UNSAFE_ENTRY(void, Unsafe_ThrowException(JNIEnv *env, jobject unsafe, jthrowable thr))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
  UnsafeWrapper("Unsafe_ThrowException");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
    ThreadToNativeFromVM ttnfv(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
    env->Throw(thr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
// JSR166 ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1136
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject e_h, jobject x_h))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
  UnsafeWrapper("Unsafe_CompareAndSwapObject");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
  oop x = JNIHandles::resolve(x_h);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
  oop e = JNIHandles::resolve(e_h);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
  oop p = JNIHandles::resolve(obj);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1142
  HeapWord* addr = (HeapWord *)index_oop_from_field_offset_long(p, offset);
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1550
diff changeset
  1143
  if (UseCompressedOops) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1550
diff changeset
  1144
    update_barrier_set_pre((narrowOop*)addr, e);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1550
diff changeset
  1145
  } else {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1550
diff changeset
  1146
    update_barrier_set_pre((oop*)addr, e);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 1550
diff changeset
  1147
  }
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1148
  oop res = oopDesc::atomic_compare_exchange_oop(x, addr, e);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1149
  jboolean success  = (res == e);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
  if (success)
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1151
    update_barrier_set((void*)addr, x);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
  return success;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1156
  UnsafeWrapper("Unsafe_CompareAndSwapInt");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1157
  oop p = JNIHandles::resolve(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1158
  jint* addr = (jint *) index_oop_from_field_offset_long(p, offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1159
  return (jint)(Atomic::cmpxchg(x, addr, e)) == e;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1160
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1161
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1162
UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong e, jlong x))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
  UnsafeWrapper("Unsafe_CompareAndSwapLong");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1164
  Handle p (THREAD, JNIHandles::resolve(obj));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1165
  jlong* addr = (jlong*)(index_oop_from_field_offset_long(p(), offset));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1166
  if (VM_Version::supports_cx8())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
    return (jlong)(Atomic::cmpxchg(x, addr, e)) == e;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
  else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
    jboolean success = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
    ObjectLocker ol(p, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
    if (*addr == e) { *addr = x; success = true; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
    return success;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
UNSAFE_ENTRY(void, Unsafe_Park(JNIEnv *env, jobject unsafe, jboolean isAbsolute, jlong time))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
  UnsafeWrapper("Unsafe_Park");
5089
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 3262
diff changeset
  1178
  HS_DTRACE_PROBE3(hotspot, thread__park__begin, thread->parker(), (int) isAbsolute, time);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
  JavaThreadParkedState jtps(thread, time != 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1180
  thread->parker()->park(isAbsolute != 0, time);
5089
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 3262
diff changeset
  1181
  HS_DTRACE_PROBE1(hotspot, thread__park__end, thread->parker());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
UNSAFE_ENTRY(void, Unsafe_Unpark(JNIEnv *env, jobject unsafe, jobject jthread))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
  UnsafeWrapper("Unsafe_Unpark");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
  Parker* p = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
  if (jthread != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1188
    oop java_thread = JNIHandles::resolve_non_null(jthread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
    if (java_thread != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1190
      jlong lp = java_lang_Thread::park_event(java_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
      if (lp != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
        // This cast is OK even though the jlong might have been read
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
        // non-atomically on 32bit systems, since there, one word will
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
        // always be zero anyway and the value set is always the same
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
        p = (Parker*)addr_from_java(lp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1197
        // Grab lock if apparently null or using older version of library
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
        MutexLocker mu(Threads_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
        java_thread = JNIHandles::resolve_non_null(jthread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
        if (java_thread != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1201
          JavaThread* thr = java_lang_Thread::thread(java_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1202
          if (thr != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1203
            p = thr->parker();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
            if (p != NULL) { // Bind to Java thread for next time.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
              java_lang_Thread::set_park_event(java_thread, addr_to_java(p));
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
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1211
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1212
  if (p != NULL) {
5089
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 3262
diff changeset
  1213
    HS_DTRACE_PROBE1(hotspot, thread__unpark, p);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1214
    p->unpark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1215
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1216
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1217
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1218
UNSAFE_ENTRY(jint, Unsafe_Loadavg(JNIEnv *env, jobject unsafe, jdoubleArray loadavg, jint nelem))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1219
  UnsafeWrapper("Unsafe_Loadavg");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1220
  const int max_nelem = 3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1221
  double la[max_nelem];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1222
  jint ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1223
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1224
  typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(loadavg));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1225
  assert(a->is_typeArray(), "must be type array");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1226
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1227
  if (nelem < 0 || nelem > max_nelem || a->length() < nelem) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1228
    ThreadToNativeFromVM ttnfv(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1229
    throw_new(env, "ArrayIndexOutOfBoundsException");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1230
    return -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1232
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1233
  ret = os::loadavg(la, nelem);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1234
  if (ret == -1) return -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1235
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1236
  // if successful, ret is the number of samples actually retrieved.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1237
  assert(ret >= 0 && ret <= max_nelem, "Unexpected loadavg return value");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1238
  switch(ret) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1239
    case 3: a->double_at_put(2, (jdouble)la[2]); // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1240
    case 2: a->double_at_put(1, (jdouble)la[1]); // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1241
    case 1: a->double_at_put(0, (jdouble)la[0]); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1242
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1243
  return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1244
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1245
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1246
UNSAFE_ENTRY(void, Unsafe_PrefetchRead(JNIEnv* env, jclass ignored, jobject obj, jlong offset))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1247
  UnsafeWrapper("Unsafe_PrefetchRead");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1248
  oop p = JNIHandles::resolve(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1249
  void* addr = index_oop_from_field_offset_long(p, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1250
  Prefetch::read(addr, (intx)offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1251
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1252
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1253
UNSAFE_ENTRY(void, Unsafe_PrefetchWrite(JNIEnv* env, jclass ignored, jobject obj, jlong offset))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1254
  UnsafeWrapper("Unsafe_PrefetchWrite");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1255
  oop p = JNIHandles::resolve(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1256
  void* addr = index_oop_from_field_offset_long(p, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1257
  Prefetch::write(addr, (intx)offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1258
UNSAFE_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1259
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1260
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1261
/// JVM_RegisterUnsafeMethods
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1262
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1263
#define ADR "J"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1264
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1265
#define LANG "Ljava/lang/"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1266
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1267
#define OBJ LANG"Object;"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1268
#define CLS LANG"Class;"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1269
#define CTR LANG"reflect/Constructor;"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1270
#define FLD LANG"reflect/Field;"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1271
#define MTH LANG"reflect/Method;"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1272
#define THR LANG"Throwable;"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1273
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1274
#define DC0_Args LANG"String;[BII"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1275
#define DC1_Args DC0_Args LANG"ClassLoader;" "Ljava/security/ProtectionDomain;"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1276
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1277
#define CC (char*)  /*cast a literal from (const char*)*/
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1278
#define FN_PTR(f) CAST_FROM_FN_PTR(void*, &f)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1279
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1280
// define deprecated accessors for compabitility with 1.4.0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1281
#define DECLARE_GETSETOOP_140(Boolean, Z) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1282
    {CC"get"#Boolean,      CC"("OBJ"I)"#Z,      FN_PTR(Unsafe_Get##Boolean##140)}, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1283
    {CC"put"#Boolean,      CC"("OBJ"I"#Z")V",   FN_PTR(Unsafe_Set##Boolean##140)}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1284
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1285
// Note:  In 1.4.1, getObject and kin take both int and long offsets.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1286
#define DECLARE_GETSETOOP_141(Boolean, Z) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1287
    {CC"get"#Boolean,      CC"("OBJ"J)"#Z,      FN_PTR(Unsafe_Get##Boolean)}, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1288
    {CC"put"#Boolean,      CC"("OBJ"J"#Z")V",   FN_PTR(Unsafe_Set##Boolean)}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1289
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1290
// Note:  In 1.5.0, there are volatile versions too
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1291
#define DECLARE_GETSETOOP(Boolean, Z) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1292
    {CC"get"#Boolean,      CC"("OBJ"J)"#Z,      FN_PTR(Unsafe_Get##Boolean)}, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1293
    {CC"put"#Boolean,      CC"("OBJ"J"#Z")V",   FN_PTR(Unsafe_Set##Boolean)}, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1294
    {CC"get"#Boolean"Volatile",      CC"("OBJ"J)"#Z,      FN_PTR(Unsafe_Get##Boolean##Volatile)}, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1295
    {CC"put"#Boolean"Volatile",      CC"("OBJ"J"#Z")V",   FN_PTR(Unsafe_Set##Boolean##Volatile)}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1296
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1297
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1298
#define DECLARE_GETSETNATIVE(Byte, B) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1299
    {CC"get"#Byte,         CC"("ADR")"#B,       FN_PTR(Unsafe_GetNative##Byte)}, \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1300
    {CC"put"#Byte,         CC"("ADR#B")V",      FN_PTR(Unsafe_SetNative##Byte)}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1301
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1302
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1303
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1304
// %%% These are temporarily supported until the SDK sources
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1305
// contain the necessarily updated Unsafe.java.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1306
static JNINativeMethod methods_140[] = {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1307
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1308
    {CC"getObject",        CC"("OBJ"I)"OBJ"",   FN_PTR(Unsafe_GetObject140)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1309
    {CC"putObject",        CC"("OBJ"I"OBJ")V",  FN_PTR(Unsafe_SetObject140)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1310
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1311
    DECLARE_GETSETOOP_140(Boolean, Z),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1312
    DECLARE_GETSETOOP_140(Byte, B),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1313
    DECLARE_GETSETOOP_140(Short, S),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1314
    DECLARE_GETSETOOP_140(Char, C),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1315
    DECLARE_GETSETOOP_140(Int, I),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1316
    DECLARE_GETSETOOP_140(Long, J),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1317
    DECLARE_GETSETOOP_140(Float, F),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1318
    DECLARE_GETSETOOP_140(Double, D),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1319
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1320
    DECLARE_GETSETNATIVE(Byte, B),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1321
    DECLARE_GETSETNATIVE(Short, S),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1322
    DECLARE_GETSETNATIVE(Char, C),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1323
    DECLARE_GETSETNATIVE(Int, I),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1324
    DECLARE_GETSETNATIVE(Long, J),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1325
    DECLARE_GETSETNATIVE(Float, F),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1326
    DECLARE_GETSETNATIVE(Double, D),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1327
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1328
    {CC"getAddress",         CC"("ADR")"ADR,             FN_PTR(Unsafe_GetNativeAddress)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1329
    {CC"putAddress",         CC"("ADR""ADR")V",          FN_PTR(Unsafe_SetNativeAddress)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1330
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1331
    {CC"allocateMemory",     CC"(J)"ADR,                 FN_PTR(Unsafe_AllocateMemory)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1332
    {CC"reallocateMemory",   CC"("ADR"J)"ADR,            FN_PTR(Unsafe_ReallocateMemory)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1333
//  {CC"setMemory",          CC"("ADR"JB)V",             FN_PTR(Unsafe_SetMemory)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1334
//  {CC"copyMemory",         CC"("ADR ADR"J)V",          FN_PTR(Unsafe_CopyMemory)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1335
    {CC"freeMemory",         CC"("ADR")V",               FN_PTR(Unsafe_FreeMemory)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1336
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1337
    {CC"fieldOffset",        CC"("FLD")I",               FN_PTR(Unsafe_FieldOffset)}, //deprecated
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1338
    {CC"staticFieldBase",    CC"("CLS")"OBJ,             FN_PTR(Unsafe_StaticFieldBaseFromClass)}, //deprecated
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1339
    {CC"ensureClassInitialized",CC"("CLS")V",            FN_PTR(Unsafe_EnsureClassInitialized)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1340
    {CC"arrayBaseOffset",    CC"("CLS")I",               FN_PTR(Unsafe_ArrayBaseOffset)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1341
    {CC"arrayIndexScale",    CC"("CLS")I",               FN_PTR(Unsafe_ArrayIndexScale)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1342
    {CC"addressSize",        CC"()I",                    FN_PTR(Unsafe_AddressSize)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1343
    {CC"pageSize",           CC"()I",                    FN_PTR(Unsafe_PageSize)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1344
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1345
    {CC"defineClass",        CC"("DC0_Args")"CLS,        FN_PTR(Unsafe_DefineClass0)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1346
    {CC"defineClass",        CC"("DC1_Args")"CLS,        FN_PTR(Unsafe_DefineClass1)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1347
    {CC"allocateInstance",   CC"("CLS")"OBJ,             FN_PTR(Unsafe_AllocateInstance)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1348
    {CC"monitorEnter",       CC"("OBJ")V",               FN_PTR(Unsafe_MonitorEnter)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1349
    {CC"monitorExit",        CC"("OBJ")V",               FN_PTR(Unsafe_MonitorExit)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1350
    {CC"throwException",     CC"("THR")V",               FN_PTR(Unsafe_ThrowException)}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1351
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1352
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1353
// These are the old methods prior to the JSR 166 changes in 1.5.0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1354
static JNINativeMethod methods_141[] = {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1355
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1356
    {CC"getObject",        CC"("OBJ"J)"OBJ"",   FN_PTR(Unsafe_GetObject)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1357
    {CC"putObject",        CC"("OBJ"J"OBJ")V",  FN_PTR(Unsafe_SetObject)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1358
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1359
    DECLARE_GETSETOOP_141(Boolean, Z),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1360
    DECLARE_GETSETOOP_141(Byte, B),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1361
    DECLARE_GETSETOOP_141(Short, S),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1362
    DECLARE_GETSETOOP_141(Char, C),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1363
    DECLARE_GETSETOOP_141(Int, I),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1364
    DECLARE_GETSETOOP_141(Long, J),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1365
    DECLARE_GETSETOOP_141(Float, F),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1366
    DECLARE_GETSETOOP_141(Double, D),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1367
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1368
    DECLARE_GETSETNATIVE(Byte, B),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1369
    DECLARE_GETSETNATIVE(Short, S),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1370
    DECLARE_GETSETNATIVE(Char, C),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1371
    DECLARE_GETSETNATIVE(Int, I),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1372
    DECLARE_GETSETNATIVE(Long, J),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1373
    DECLARE_GETSETNATIVE(Float, F),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1374
    DECLARE_GETSETNATIVE(Double, D),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1375
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1376
    {CC"getAddress",         CC"("ADR")"ADR,             FN_PTR(Unsafe_GetNativeAddress)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1377
    {CC"putAddress",         CC"("ADR""ADR")V",          FN_PTR(Unsafe_SetNativeAddress)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1378
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1379
    {CC"allocateMemory",     CC"(J)"ADR,                 FN_PTR(Unsafe_AllocateMemory)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1380
    {CC"reallocateMemory",   CC"("ADR"J)"ADR,            FN_PTR(Unsafe_ReallocateMemory)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1381
//  {CC"setMemory",          CC"("ADR"JB)V",             FN_PTR(Unsafe_SetMemory)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1382
//  {CC"copyMemory",         CC"("ADR ADR"J)V",          FN_PTR(Unsafe_CopyMemory)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1383
    {CC"freeMemory",         CC"("ADR")V",               FN_PTR(Unsafe_FreeMemory)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1384
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1385
    {CC"objectFieldOffset",  CC"("FLD")J",               FN_PTR(Unsafe_ObjectFieldOffset)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1386
    {CC"staticFieldOffset",  CC"("FLD")J",               FN_PTR(Unsafe_StaticFieldOffset)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1387
    {CC"staticFieldBase",    CC"("FLD")"OBJ,             FN_PTR(Unsafe_StaticFieldBaseFromField)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1388
    {CC"ensureClassInitialized",CC"("CLS")V",            FN_PTR(Unsafe_EnsureClassInitialized)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1389
    {CC"arrayBaseOffset",    CC"("CLS")I",               FN_PTR(Unsafe_ArrayBaseOffset)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1390
    {CC"arrayIndexScale",    CC"("CLS")I",               FN_PTR(Unsafe_ArrayIndexScale)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1391
    {CC"addressSize",        CC"()I",                    FN_PTR(Unsafe_AddressSize)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1392
    {CC"pageSize",           CC"()I",                    FN_PTR(Unsafe_PageSize)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1393
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1394
    {CC"defineClass",        CC"("DC0_Args")"CLS,        FN_PTR(Unsafe_DefineClass0)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1395
    {CC"defineClass",        CC"("DC1_Args")"CLS,        FN_PTR(Unsafe_DefineClass1)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1396
    {CC"allocateInstance",   CC"("CLS")"OBJ,             FN_PTR(Unsafe_AllocateInstance)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1397
    {CC"monitorEnter",       CC"("OBJ")V",               FN_PTR(Unsafe_MonitorEnter)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1398
    {CC"monitorExit",        CC"("OBJ")V",               FN_PTR(Unsafe_MonitorExit)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1399
    {CC"throwException",     CC"("THR")V",               FN_PTR(Unsafe_ThrowException)}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1400
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1401
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1402
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1403
// These are the old methods prior to the JSR 166 changes in 1.6.0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1404
static JNINativeMethod methods_15[] = {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1405
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1406
    {CC"getObject",        CC"("OBJ"J)"OBJ"",   FN_PTR(Unsafe_GetObject)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1407
    {CC"putObject",        CC"("OBJ"J"OBJ")V",  FN_PTR(Unsafe_SetObject)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1408
    {CC"getObjectVolatile",CC"("OBJ"J)"OBJ"",   FN_PTR(Unsafe_GetObjectVolatile)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1409
    {CC"putObjectVolatile",CC"("OBJ"J"OBJ")V",  FN_PTR(Unsafe_SetObjectVolatile)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1410
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1411
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1412
    DECLARE_GETSETOOP(Boolean, Z),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1413
    DECLARE_GETSETOOP(Byte, B),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1414
    DECLARE_GETSETOOP(Short, S),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1415
    DECLARE_GETSETOOP(Char, C),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1416
    DECLARE_GETSETOOP(Int, I),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1417
    DECLARE_GETSETOOP(Long, J),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1418
    DECLARE_GETSETOOP(Float, F),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1419
    DECLARE_GETSETOOP(Double, D),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1420
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1421
    DECLARE_GETSETNATIVE(Byte, B),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1422
    DECLARE_GETSETNATIVE(Short, S),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1423
    DECLARE_GETSETNATIVE(Char, C),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1424
    DECLARE_GETSETNATIVE(Int, I),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1425
    DECLARE_GETSETNATIVE(Long, J),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1426
    DECLARE_GETSETNATIVE(Float, F),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1427
    DECLARE_GETSETNATIVE(Double, D),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1428
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1429
    {CC"getAddress",         CC"("ADR")"ADR,             FN_PTR(Unsafe_GetNativeAddress)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1430
    {CC"putAddress",         CC"("ADR""ADR")V",          FN_PTR(Unsafe_SetNativeAddress)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1431
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1432
    {CC"allocateMemory",     CC"(J)"ADR,                 FN_PTR(Unsafe_AllocateMemory)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1433
    {CC"reallocateMemory",   CC"("ADR"J)"ADR,            FN_PTR(Unsafe_ReallocateMemory)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1434
//  {CC"setMemory",          CC"("ADR"JB)V",             FN_PTR(Unsafe_SetMemory)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1435
//  {CC"copyMemory",         CC"("ADR ADR"J)V",          FN_PTR(Unsafe_CopyMemory)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1436
    {CC"freeMemory",         CC"("ADR")V",               FN_PTR(Unsafe_FreeMemory)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1437
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1438
    {CC"objectFieldOffset",  CC"("FLD")J",               FN_PTR(Unsafe_ObjectFieldOffset)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1439
    {CC"staticFieldOffset",  CC"("FLD")J",               FN_PTR(Unsafe_StaticFieldOffset)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1440
    {CC"staticFieldBase",    CC"("FLD")"OBJ,             FN_PTR(Unsafe_StaticFieldBaseFromField)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1441
    {CC"ensureClassInitialized",CC"("CLS")V",            FN_PTR(Unsafe_EnsureClassInitialized)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1442
    {CC"arrayBaseOffset",    CC"("CLS")I",               FN_PTR(Unsafe_ArrayBaseOffset)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1443
    {CC"arrayIndexScale",    CC"("CLS")I",               FN_PTR(Unsafe_ArrayIndexScale)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1444
    {CC"addressSize",        CC"()I",                    FN_PTR(Unsafe_AddressSize)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1445
    {CC"pageSize",           CC"()I",                    FN_PTR(Unsafe_PageSize)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1446
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1447
    {CC"defineClass",        CC"("DC0_Args")"CLS,        FN_PTR(Unsafe_DefineClass0)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1448
    {CC"defineClass",        CC"("DC1_Args")"CLS,        FN_PTR(Unsafe_DefineClass1)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1449
    {CC"allocateInstance",   CC"("CLS")"OBJ,             FN_PTR(Unsafe_AllocateInstance)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1450
    {CC"monitorEnter",       CC"("OBJ")V",               FN_PTR(Unsafe_MonitorEnter)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1451
    {CC"monitorExit",        CC"("OBJ")V",               FN_PTR(Unsafe_MonitorExit)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1452
    {CC"throwException",     CC"("THR")V",               FN_PTR(Unsafe_ThrowException)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1453
    {CC"compareAndSwapObject", CC"("OBJ"J"OBJ""OBJ")Z",  FN_PTR(Unsafe_CompareAndSwapObject)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1454
    {CC"compareAndSwapInt",  CC"("OBJ"J""I""I"")Z",      FN_PTR(Unsafe_CompareAndSwapInt)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1455
    {CC"compareAndSwapLong", CC"("OBJ"J""J""J"")Z",      FN_PTR(Unsafe_CompareAndSwapLong)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1456
    {CC"park",               CC"(ZJ)V",                  FN_PTR(Unsafe_Park)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1457
    {CC"unpark",             CC"("OBJ")V",               FN_PTR(Unsafe_Unpark)}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1458
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1459
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1460
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1461
// These are the correct methods, moving forward:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1462
static JNINativeMethod methods[] = {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1463
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1464
    {CC"getObject",        CC"("OBJ"J)"OBJ"",   FN_PTR(Unsafe_GetObject)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1465
    {CC"putObject",        CC"("OBJ"J"OBJ")V",  FN_PTR(Unsafe_SetObject)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1466
    {CC"getObjectVolatile",CC"("OBJ"J)"OBJ"",   FN_PTR(Unsafe_GetObjectVolatile)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1467
    {CC"putObjectVolatile",CC"("OBJ"J"OBJ")V",  FN_PTR(Unsafe_SetObjectVolatile)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1468
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1469
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1470
    DECLARE_GETSETOOP(Boolean, Z),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1471
    DECLARE_GETSETOOP(Byte, B),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1472
    DECLARE_GETSETOOP(Short, S),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1473
    DECLARE_GETSETOOP(Char, C),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1474
    DECLARE_GETSETOOP(Int, I),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1475
    DECLARE_GETSETOOP(Long, J),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1476
    DECLARE_GETSETOOP(Float, F),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1477
    DECLARE_GETSETOOP(Double, D),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1478
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1479
    DECLARE_GETSETNATIVE(Byte, B),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1480
    DECLARE_GETSETNATIVE(Short, S),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1481
    DECLARE_GETSETNATIVE(Char, C),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1482
    DECLARE_GETSETNATIVE(Int, I),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1483
    DECLARE_GETSETNATIVE(Long, J),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1484
    DECLARE_GETSETNATIVE(Float, F),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1485
    DECLARE_GETSETNATIVE(Double, D),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1486
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1487
    {CC"getAddress",         CC"("ADR")"ADR,             FN_PTR(Unsafe_GetNativeAddress)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1488
    {CC"putAddress",         CC"("ADR""ADR")V",          FN_PTR(Unsafe_SetNativeAddress)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1489
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1490
    {CC"allocateMemory",     CC"(J)"ADR,                 FN_PTR(Unsafe_AllocateMemory)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1491
    {CC"reallocateMemory",   CC"("ADR"J)"ADR,            FN_PTR(Unsafe_ReallocateMemory)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1492
//  {CC"setMemory",          CC"("ADR"JB)V",             FN_PTR(Unsafe_SetMemory)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1493
//  {CC"copyMemory",         CC"("ADR ADR"J)V",          FN_PTR(Unsafe_CopyMemory)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1494
    {CC"freeMemory",         CC"("ADR")V",               FN_PTR(Unsafe_FreeMemory)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1495
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1496
    {CC"objectFieldOffset",  CC"("FLD")J",               FN_PTR(Unsafe_ObjectFieldOffset)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1497
    {CC"staticFieldOffset",  CC"("FLD")J",               FN_PTR(Unsafe_StaticFieldOffset)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1498
    {CC"staticFieldBase",    CC"("FLD")"OBJ,             FN_PTR(Unsafe_StaticFieldBaseFromField)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1499
    {CC"ensureClassInitialized",CC"("CLS")V",            FN_PTR(Unsafe_EnsureClassInitialized)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1500
    {CC"arrayBaseOffset",    CC"("CLS")I",               FN_PTR(Unsafe_ArrayBaseOffset)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1501
    {CC"arrayIndexScale",    CC"("CLS")I",               FN_PTR(Unsafe_ArrayIndexScale)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1502
    {CC"addressSize",        CC"()I",                    FN_PTR(Unsafe_AddressSize)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1503
    {CC"pageSize",           CC"()I",                    FN_PTR(Unsafe_PageSize)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1504
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1505
    {CC"defineClass",        CC"("DC0_Args")"CLS,        FN_PTR(Unsafe_DefineClass0)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1506
    {CC"defineClass",        CC"("DC1_Args")"CLS,        FN_PTR(Unsafe_DefineClass1)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1507
    {CC"allocateInstance",   CC"("CLS")"OBJ,             FN_PTR(Unsafe_AllocateInstance)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1508
    {CC"monitorEnter",       CC"("OBJ")V",               FN_PTR(Unsafe_MonitorEnter)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1509
    {CC"monitorExit",        CC"("OBJ")V",               FN_PTR(Unsafe_MonitorExit)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1510
    {CC"tryMonitorEnter",    CC"("OBJ")Z",               FN_PTR(Unsafe_TryMonitorEnter)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1511
    {CC"throwException",     CC"("THR")V",               FN_PTR(Unsafe_ThrowException)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1512
    {CC"compareAndSwapObject", CC"("OBJ"J"OBJ""OBJ")Z",  FN_PTR(Unsafe_CompareAndSwapObject)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1513
    {CC"compareAndSwapInt",  CC"("OBJ"J""I""I"")Z",      FN_PTR(Unsafe_CompareAndSwapInt)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1514
    {CC"compareAndSwapLong", CC"("OBJ"J""J""J"")Z",      FN_PTR(Unsafe_CompareAndSwapLong)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1515
    {CC"putOrderedObject",   CC"("OBJ"J"OBJ")V",         FN_PTR(Unsafe_SetOrderedObject)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1516
    {CC"putOrderedInt",      CC"("OBJ"JI)V",             FN_PTR(Unsafe_SetOrderedInt)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1517
    {CC"putOrderedLong",     CC"("OBJ"JJ)V",             FN_PTR(Unsafe_SetOrderedLong)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1518
    {CC"park",               CC"(ZJ)V",                  FN_PTR(Unsafe_Park)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1519
    {CC"unpark",             CC"("OBJ")V",               FN_PTR(Unsafe_Unpark)}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1520
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1521
//    {CC"getLoadAverage",     CC"([DI)I",                 FN_PTR(Unsafe_Loadavg)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1522
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1523
//    {CC"prefetchRead",       CC"("OBJ"J)V",              FN_PTR(Unsafe_PrefetchRead)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1524
//    {CC"prefetchWrite",      CC"("OBJ"J)V",              FN_PTR(Unsafe_PrefetchWrite)}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1525
//    {CC"prefetchReadStatic", CC"("OBJ"J)V",              FN_PTR(Unsafe_PrefetchRead)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1526
//    {CC"prefetchWriteStatic",CC"("OBJ"J)V",              FN_PTR(Unsafe_PrefetchWrite)}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1527
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1528
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1529
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1530
JNINativeMethod loadavg_method[] = {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1531
    {CC"getLoadAverage",            CC"([DI)I",                 FN_PTR(Unsafe_Loadavg)}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1532
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1533
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1534
JNINativeMethod prefetch_methods[] = {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1535
    {CC"prefetchRead",       CC"("OBJ"J)V",              FN_PTR(Unsafe_PrefetchRead)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1536
    {CC"prefetchWrite",      CC"("OBJ"J)V",              FN_PTR(Unsafe_PrefetchWrite)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1537
    {CC"prefetchReadStatic", CC"("OBJ"J)V",              FN_PTR(Unsafe_PrefetchRead)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1538
    {CC"prefetchWriteStatic",CC"("OBJ"J)V",              FN_PTR(Unsafe_PrefetchWrite)}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1539
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1540
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1541
JNINativeMethod memcopy_methods[] = {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1542
    {CC"copyMemory",         CC"("OBJ"J"OBJ"JJ)V",       FN_PTR(Unsafe_CopyMemory2)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1543
    {CC"setMemory",          CC"("OBJ"JJB)V",            FN_PTR(Unsafe_SetMemory2)}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1544
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1545
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1546
JNINativeMethod memcopy_methods_15[] = {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1547
    {CC"setMemory",          CC"("ADR"JB)V",             FN_PTR(Unsafe_SetMemory)},
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1548
    {CC"copyMemory",         CC"("ADR ADR"J)V",          FN_PTR(Unsafe_CopyMemory)}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1549
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1550
1550
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1551
JNINativeMethod anonk_methods[] = {
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1552
    {CC"defineAnonymousClass", CC"("DAC_Args")"CLS,      FN_PTR(Unsafe_DefineAnonymousClass)},
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1553
};
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1554
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1555
#undef CC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1556
#undef FN_PTR
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1557
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1558
#undef ADR
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1559
#undef LANG
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1560
#undef OBJ
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1561
#undef CLS
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1562
#undef CTR
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1563
#undef FLD
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1564
#undef MTH
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1565
#undef THR
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1566
#undef DC0_Args
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1567
#undef DC1_Args
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1568
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1569
#undef DECLARE_GETSETOOP
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1570
#undef DECLARE_GETSETNATIVE
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1571
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1572
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1573
// This one function is exported, used by NativeLookup.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1574
// The Unsafe_xxx functions above are called only from the interpreter.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1575
// The optimizer looks at names and signatures to recognize
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1576
// individual functions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1577
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1578
JVM_ENTRY(void, JVM_RegisterUnsafeMethods(JNIEnv *env, jclass unsafecls))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1579
  UnsafeWrapper("JVM_RegisterUnsafeMethods");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1580
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1581
    ThreadToNativeFromVM ttnfv(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1582
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1583
      env->RegisterNatives(unsafecls, loadavg_method, sizeof(loadavg_method)/sizeof(JNINativeMethod));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1584
      if (env->ExceptionOccurred()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1585
        if (PrintMiscellaneous && (Verbose || WizardMode)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1586
          tty->print_cr("Warning:  SDK 1.6 Unsafe.loadavg not found.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1587
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1588
        env->ExceptionClear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1589
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1590
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1591
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1592
      env->RegisterNatives(unsafecls, prefetch_methods, sizeof(prefetch_methods)/sizeof(JNINativeMethod));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1593
      if (env->ExceptionOccurred()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1594
        if (PrintMiscellaneous && (Verbose || WizardMode)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1595
          tty->print_cr("Warning:  SDK 1.6 Unsafe.prefetchRead/Write not found.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1596
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1597
        env->ExceptionClear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1598
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1599
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1600
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1601
      env->RegisterNatives(unsafecls, memcopy_methods, sizeof(memcopy_methods)/sizeof(JNINativeMethod));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1602
      if (env->ExceptionOccurred()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1603
        if (PrintMiscellaneous && (Verbose || WizardMode)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1604
          tty->print_cr("Warning:  SDK 1.7 Unsafe.copyMemory not found.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1605
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1606
        env->ExceptionClear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1607
        env->RegisterNatives(unsafecls, memcopy_methods_15, sizeof(memcopy_methods_15)/sizeof(JNINativeMethod));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1608
        if (env->ExceptionOccurred()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1609
          if (PrintMiscellaneous && (Verbose || WizardMode)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1610
            tty->print_cr("Warning:  SDK 1.5 Unsafe.copyMemory not found.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1611
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1612
          env->ExceptionClear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1613
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1614
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1615
    }
1550
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1616
    if (AnonymousClasses) {
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1617
      env->RegisterNatives(unsafecls, anonk_methods, sizeof(anonk_methods)/sizeof(JNINativeMethod));
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1618
      if (env->ExceptionOccurred()) {
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1619
        if (PrintMiscellaneous && (Verbose || WizardMode)) {
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1620
          tty->print_cr("Warning:  SDK 1.7 Unsafe.defineClass (anonymous version) not found.");
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1621
        }
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1622
        env->ExceptionClear();
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1623
      }
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1388
diff changeset
  1624
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1625
    int status = env->RegisterNatives(unsafecls, methods, sizeof(methods)/sizeof(JNINativeMethod));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1626
    if (env->ExceptionOccurred()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1627
      if (PrintMiscellaneous && (Verbose || WizardMode)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1628
        tty->print_cr("Warning:  SDK 1.6 version of Unsafe not found.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1629
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1630
      env->ExceptionClear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1631
      // %%% For now, be backward compatible with an older class:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1632
      status = env->RegisterNatives(unsafecls, methods_15, sizeof(methods_15)/sizeof(JNINativeMethod));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1633
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1634
    if (env->ExceptionOccurred()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1635
      if (PrintMiscellaneous && (Verbose || WizardMode)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1636
        tty->print_cr("Warning:  SDK 1.5 version of Unsafe not found.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1637
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1638
      env->ExceptionClear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1639
      // %%% For now, be backward compatible with an older class:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1640
      status = env->RegisterNatives(unsafecls, methods_141, sizeof(methods_141)/sizeof(JNINativeMethod));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1641
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1642
    if (env->ExceptionOccurred()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1643
      if (PrintMiscellaneous && (Verbose || WizardMode)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1644
        tty->print_cr("Warning:  SDK 1.4.1 version of Unsafe not found.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1645
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1646
      env->ExceptionClear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1647
      // %%% For now, be backward compatible with an older class:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1648
      status = env->RegisterNatives(unsafecls, methods_140, sizeof(methods_140)/sizeof(JNINativeMethod));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1649
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1650
    guarantee(status == 0, "register unsafe natives");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1651
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1652
JVM_END