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