1 /*
   2  * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package jdk.internal.misc;
  27 
  28 import java.lang.reflect.Field;
  29 import java.security.ProtectionDomain;
  30 
  31 import sun.reflect.CallerSensitive;
  32 import sun.reflect.Reflection;
  33 import jdk.internal.misc.VM;
  34 
  35 import jdk.internal.HotSpotIntrinsicCandidate;
  36 
  37 
  38 /**
  39  * A collection of methods for performing low-level, unsafe operations.
  40  * Although the class and all methods are public, use of this class is
  41  * limited because only trusted code can obtain instances of it.
  42  *
  43  * @author John R. Rose
  44  * @see #getUnsafe
  45  */
  46 
  47 public final class Unsafe {
  48 
  49     private static native void registerNatives();
  50     static {
  51         registerNatives();
  52         sun.reflect.Reflection.registerMethodsToFilter(Unsafe.class, "getUnsafe");
  53     }
  54 
  55     private Unsafe() {}
  56 
  57     private static final Unsafe theUnsafe = new Unsafe();
  58 
  59     /**
  60      * Provides the caller with the capability of performing unsafe
  61      * operations.
  62      *
  63      * <p>The returned {@code Unsafe} object should be carefully guarded
  64      * by the caller, since it can be used to read and write data at arbitrary
  65      * memory addresses.  It must never be passed to untrusted code.
  66      *
  67      * <p>Most methods in this class are very low-level, and correspond to a
  68      * small number of hardware instructions (on typical machines).  Compilers
  69      * are encouraged to optimize these methods accordingly.
  70      *
  71      * <p>Here is a suggested idiom for using unsafe operations:
  72      *
  73      * <pre> {@code
  74      * class MyTrustedClass {
  75      *   private static final Unsafe unsafe = Unsafe.getUnsafe();
  76      *   ...
  77      *   private long myCountAddress = ...;
  78      *   public int getCount() { return unsafe.getByte(myCountAddress); }
  79      * }}</pre>
  80      *
  81      * (It may assist compilers to make the local variable {@code final}.)
  82      *
  83      * @throws  SecurityException  if a security manager exists and its
  84      *          {@code checkPropertiesAccess} method doesn't allow
  85      *          access to the system properties.
  86      */
  87     @CallerSensitive
  88     public static Unsafe getUnsafe() {
  89         Class<?> caller = Reflection.getCallerClass();
  90         if (!VM.isSystemDomainLoader(caller.getClassLoader()))
  91             throw new SecurityException("Unsafe");
  92         return theUnsafe;
  93     }
  94 
  95     /// peek and poke operations
  96     /// (compilers should optimize these to memory ops)
  97 
  98     // These work on object fields in the Java heap.
  99     // They will not work on elements of packed arrays.
 100 
 101     /**
 102      * Fetches a value from a given Java variable.
 103      * More specifically, fetches a field or array element within the given
 104      * object {@code o} at the given offset, or (if {@code o} is null)
 105      * from the memory address whose numerical value is the given offset.
 106      * <p>
 107      * The results are undefined unless one of the following cases is true:
 108      * <ul>
 109      * <li>The offset was obtained from {@link #objectFieldOffset} on
 110      * the {@link java.lang.reflect.Field} of some Java field and the object
 111      * referred to by {@code o} is of a class compatible with that
 112      * field's class.
 113      *
 114      * <li>The offset and object reference {@code o} (either null or
 115      * non-null) were both obtained via {@link #staticFieldOffset}
 116      * and {@link #staticFieldBase} (respectively) from the
 117      * reflective {@link Field} representation of some Java field.
 118      *
 119      * <li>The object referred to by {@code o} is an array, and the offset
 120      * is an integer of the form {@code B+N*S}, where {@code N} is
 121      * a valid index into the array, and {@code B} and {@code S} are
 122      * the values obtained by {@link #arrayBaseOffset} and {@link
 123      * #arrayIndexScale} (respectively) from the array's class.  The value
 124      * referred to is the {@code N}<em>th</em> element of the array.
 125      *
 126      * </ul>
 127      * <p>
 128      * If one of the above cases is true, the call references a specific Java
 129      * variable (field or array element).  However, the results are undefined
 130      * if that variable is not in fact of the type returned by this method.
 131      * <p>
 132      * This method refers to a variable by means of two parameters, and so
 133      * it provides (in effect) a <em>double-register</em> addressing mode
 134      * for Java variables.  When the object reference is null, this method
 135      * uses its offset as an absolute address.  This is similar in operation
 136      * to methods such as {@link #getInt(long)}, which provide (in effect) a
 137      * <em>single-register</em> addressing mode for non-Java variables.
 138      * However, because Java variables may have a different layout in memory
 139      * from non-Java variables, programmers should not assume that these
 140      * two addressing modes are ever equivalent.  Also, programmers should
 141      * remember that offsets from the double-register addressing mode cannot
 142      * be portably confused with longs used in the single-register addressing
 143      * mode.
 144      *
 145      * @param o Java heap object in which the variable resides, if any, else
 146      *        null
 147      * @param offset indication of where the variable resides in a Java heap
 148      *        object, if any, else a memory address locating the variable
 149      *        statically
 150      * @return the value fetched from the indicated Java variable
 151      * @throws RuntimeException No defined exceptions are thrown, not even
 152      *         {@link NullPointerException}
 153      */
 154     @HotSpotIntrinsicCandidate
 155     public native int getInt(Object o, long offset);
 156 
 157     /**
 158      * Stores a value into a given Java variable.
 159      * <p>
 160      * The first two parameters are interpreted exactly as with
 161      * {@link #getInt(Object, long)} to refer to a specific
 162      * Java variable (field or array element).  The given value
 163      * is stored into that variable.
 164      * <p>
 165      * The variable must be of the same type as the method
 166      * parameter {@code x}.
 167      *
 168      * @param o Java heap object in which the variable resides, if any, else
 169      *        null
 170      * @param offset indication of where the variable resides in a Java heap
 171      *        object, if any, else a memory address locating the variable
 172      *        statically
 173      * @param x the value to store into the indicated Java variable
 174      * @throws RuntimeException No defined exceptions are thrown, not even
 175      *         {@link NullPointerException}
 176      */
 177     @HotSpotIntrinsicCandidate
 178     public native void putInt(Object o, long offset, int x);
 179 
 180     /**
 181      * Fetches a reference value from a given Java variable.
 182      * @see #getInt(Object, long)
 183      */
 184     @HotSpotIntrinsicCandidate
 185     public native Object getObject(Object o, long offset);
 186 
 187     /**
 188      * Stores a reference value into a given Java variable.
 189      * <p>
 190      * Unless the reference {@code x} being stored is either null
 191      * or matches the field type, the results are undefined.
 192      * If the reference {@code o} is non-null, card marks or
 193      * other store barriers for that object (if the VM requires them)
 194      * are updated.
 195      * @see #putInt(Object, long, int)
 196      */
 197     @HotSpotIntrinsicCandidate
 198     public native void putObject(Object o, long offset, Object x);
 199 
 200     /** @see #getInt(Object, long) */
 201     @HotSpotIntrinsicCandidate
 202     public native boolean getBoolean(Object o, long offset);
 203     /** @see #putInt(Object, long, int) */
 204     @HotSpotIntrinsicCandidate
 205     public native void    putBoolean(Object o, long offset, boolean x);
 206     /** @see #getInt(Object, long) */
 207     @HotSpotIntrinsicCandidate
 208     public native byte    getByte(Object o, long offset);
 209     /** @see #putInt(Object, long, int) */
 210     @HotSpotIntrinsicCandidate
 211     public native void    putByte(Object o, long offset, byte x);
 212     /** @see #getInt(Object, long) */
 213     @HotSpotIntrinsicCandidate
 214     public native short   getShort(Object o, long offset);
 215     /** @see #putInt(Object, long, int) */
 216     @HotSpotIntrinsicCandidate
 217     public native void    putShort(Object o, long offset, short x);
 218     /** @see #getInt(Object, long) */
 219     @HotSpotIntrinsicCandidate
 220     public native char    getChar(Object o, long offset);
 221     /** @see #putInt(Object, long, int) */
 222     @HotSpotIntrinsicCandidate
 223     public native void    putChar(Object o, long offset, char x);
 224     /** @see #getInt(Object, long) */
 225     @HotSpotIntrinsicCandidate
 226     public native long    getLong(Object o, long offset);
 227     /** @see #putInt(Object, long, int) */
 228     @HotSpotIntrinsicCandidate
 229     public native void    putLong(Object o, long offset, long x);
 230     /** @see #getInt(Object, long) */
 231     @HotSpotIntrinsicCandidate
 232     public native float   getFloat(Object o, long offset);
 233     /** @see #putInt(Object, long, int) */
 234     @HotSpotIntrinsicCandidate
 235     public native void    putFloat(Object o, long offset, float x);
 236     /** @see #getInt(Object, long) */
 237     @HotSpotIntrinsicCandidate
 238     public native double  getDouble(Object o, long offset);
 239     /** @see #putInt(Object, long, int) */
 240     @HotSpotIntrinsicCandidate
 241     public native void    putDouble(Object o, long offset, double x);
 242 
 243     // These read VM internal data.
 244 
 245     /**
 246      * Fetches an uncompressed reference value from a given native variable
 247      * ignoring the VM's compressed references mode.
 248      *
 249      * @param address a memory address locating the variable
 250      * @return the value fetched from the indicated native variable
 251      */
 252     public native Object getUncompressedObject(long address);
 253 
 254     /**
 255      * Fetches the {@link java.lang.Class} Java mirror for the given native
 256      * metaspace {@code Klass} pointer.
 257      *
 258      * @param metaspaceKlass a native metaspace {@code Klass} pointer
 259      * @return the {@link java.lang.Class} Java mirror
 260      */
 261     public native Class<?> getJavaMirror(long metaspaceKlass);
 262 
 263     /**
 264      * Fetches a native metaspace {@code Klass} pointer for the given Java
 265      * object.
 266      *
 267      * @param o Java heap object for which to fetch the class pointer
 268      * @return a native metaspace {@code Klass} pointer
 269      */
 270     public native long getKlassPointer(Object o);
 271 
 272     // These work on values in the C heap.
 273 
 274     /**
 275      * Fetches a value from a given memory address.  If the address is zero, or
 276      * does not point into a block obtained from {@link #allocateMemory}, the
 277      * results are undefined.
 278      *
 279      * @see #allocateMemory
 280      */
 281     @HotSpotIntrinsicCandidate
 282     public native byte    getByte(long address);
 283 
 284     /**
 285      * Stores a value into a given memory address.  If the address is zero, or
 286      * does not point into a block obtained from {@link #allocateMemory}, the
 287      * results are undefined.
 288      *
 289      * @see #getByte(long)
 290      */
 291     @HotSpotIntrinsicCandidate
 292     public native void    putByte(long address, byte x);
 293 
 294     /** @see #getByte(long) */
 295     @HotSpotIntrinsicCandidate
 296     public native short   getShort(long address);
 297     /** @see #putByte(long, byte) */
 298     @HotSpotIntrinsicCandidate
 299     public native void    putShort(long address, short x);
 300     /** @see #getByte(long) */
 301     @HotSpotIntrinsicCandidate
 302     public native char    getChar(long address);
 303     /** @see #putByte(long, byte) */
 304     @HotSpotIntrinsicCandidate
 305     public native void    putChar(long address, char x);
 306     /** @see #getByte(long) */
 307     @HotSpotIntrinsicCandidate
 308     public native int     getInt(long address);
 309     /** @see #putByte(long, byte) */
 310     @HotSpotIntrinsicCandidate
 311     public native void    putInt(long address, int x);
 312     /** @see #getByte(long) */
 313     @HotSpotIntrinsicCandidate
 314     public native long    getLong(long address);
 315     /** @see #putByte(long, byte) */
 316     @HotSpotIntrinsicCandidate
 317     public native void    putLong(long address, long x);
 318     /** @see #getByte(long) */
 319     @HotSpotIntrinsicCandidate
 320     public native float   getFloat(long address);
 321     /** @see #putByte(long, byte) */
 322     @HotSpotIntrinsicCandidate
 323     public native void    putFloat(long address, float x);
 324     /** @see #getByte(long) */
 325     @HotSpotIntrinsicCandidate
 326     public native double  getDouble(long address);
 327     /** @see #putByte(long, byte) */
 328     @HotSpotIntrinsicCandidate
 329     public native void    putDouble(long address, double x);
 330 
 331     /**
 332      * Fetches a native pointer from a given memory address.  If the address is
 333      * zero, or does not point into a block obtained from {@link
 334      * #allocateMemory}, the results are undefined.
 335      *
 336      * <p>If the native pointer is less than 64 bits wide, it is extended as
 337      * an unsigned number to a Java long.  The pointer may be indexed by any
 338      * given byte offset, simply by adding that offset (as a simple integer) to
 339      * the long representing the pointer.  The number of bytes actually read
 340      * from the target address may be determined by consulting {@link
 341      * #addressSize}.
 342      *
 343      * @see #allocateMemory
 344      */
 345     @HotSpotIntrinsicCandidate
 346     public native long getAddress(long address);
 347 
 348     /**
 349      * Stores a native pointer into a given memory address.  If the address is
 350      * zero, or does not point into a block obtained from {@link
 351      * #allocateMemory}, the results are undefined.
 352      *
 353      * <p>The number of bytes actually written at the target address may be
 354      * determined by consulting {@link #addressSize}.
 355      *
 356      * @see #getAddress(long)
 357      */
 358     @HotSpotIntrinsicCandidate
 359     public native void putAddress(long address, long x);
 360 
 361     /// wrappers for malloc, realloc, free:
 362 
 363     /**
 364      * Allocates a new block of native memory, of the given size in bytes.  The
 365      * contents of the memory are uninitialized; they will generally be
 366      * garbage.  The resulting native pointer will never be zero, and will be
 367      * aligned for all value types.  Dispose of this memory by calling {@link
 368      * #freeMemory}, or resize it with {@link #reallocateMemory}.
 369      *
 370      * @throws IllegalArgumentException if the size is negative or too large
 371      *         for the native size_t type
 372      *
 373      * @throws OutOfMemoryError if the allocation is refused by the system
 374      *
 375      * @see #getByte(long)
 376      * @see #putByte(long, byte)
 377      */
 378     public native long allocateMemory(long bytes);
 379 
 380     /**
 381      * Resizes a new block of native memory, to the given size in bytes.  The
 382      * contents of the new block past the size of the old block are
 383      * uninitialized; they will generally be garbage.  The resulting native
 384      * pointer will be zero if and only if the requested size is zero.  The
 385      * resulting native pointer will be aligned for all value types.  Dispose
 386      * of this memory by calling {@link #freeMemory}, or resize it with {@link
 387      * #reallocateMemory}.  The address passed to this method may be null, in
 388      * which case an allocation will be performed.
 389      *
 390      * @throws IllegalArgumentException if the size is negative or too large
 391      *         for the native size_t type
 392      *
 393      * @throws OutOfMemoryError if the allocation is refused by the system
 394      *
 395      * @see #allocateMemory
 396      */
 397     public native long reallocateMemory(long address, long bytes);
 398 
 399     /**
 400      * Sets all bytes in a given block of memory to a fixed value
 401      * (usually zero).
 402      *
 403      * <p>This method determines a block's base address by means of two parameters,
 404      * and so it provides (in effect) a <em>double-register</em> addressing mode,
 405      * as discussed in {@link #getInt(Object,long)}.  When the object reference is null,
 406      * the offset supplies an absolute base address.
 407      *
 408      * <p>The stores are in coherent (atomic) units of a size determined
 409      * by the address and length parameters.  If the effective address and
 410      * length are all even modulo 8, the stores take place in 'long' units.
 411      * If the effective address and length are (resp.) even modulo 4 or 2,
 412      * the stores take place in units of 'int' or 'short'.
 413      *
 414      * @since 1.7
 415      */
 416     public native void setMemory(Object o, long offset, long bytes, byte value);
 417 
 418     /**
 419      * Sets all bytes in a given block of memory to a fixed value
 420      * (usually zero).  This provides a <em>single-register</em> addressing mode,
 421      * as discussed in {@link #getInt(Object,long)}.
 422      *
 423      * <p>Equivalent to {@code setMemory(null, address, bytes, value)}.
 424      */
 425     public void setMemory(long address, long bytes, byte value) {
 426         setMemory(null, address, bytes, value);
 427     }
 428 
 429     /**
 430      * Sets all bytes in a given block of memory to a copy of another
 431      * block.
 432      *
 433      * <p>This method determines each block's base address by means of two parameters,
 434      * and so it provides (in effect) a <em>double-register</em> addressing mode,
 435      * as discussed in {@link #getInt(Object,long)}.  When the object reference is null,
 436      * the offset supplies an absolute base address.
 437      *
 438      * <p>The transfers are in coherent (atomic) units of a size determined
 439      * by the address and length parameters.  If the effective addresses and
 440      * length are all even modulo 8, the transfer takes place in 'long' units.
 441      * If the effective addresses and length are (resp.) even modulo 4 or 2,
 442      * the transfer takes place in units of 'int' or 'short'.
 443      *
 444      * @since 1.7
 445      */
 446     @HotSpotIntrinsicCandidate
 447     public native void copyMemory(Object srcBase, long srcOffset,
 448                                   Object destBase, long destOffset,
 449                                   long bytes);
 450     /**
 451      * Sets all bytes in a given block of memory to a copy of another
 452      * block.  This provides a <em>single-register</em> addressing mode,
 453      * as discussed in {@link #getInt(Object,long)}.
 454      *
 455      * Equivalent to {@code copyMemory(null, srcAddress, null, destAddress, bytes)}.
 456      */
 457     public void copyMemory(long srcAddress, long destAddress, long bytes) {
 458         copyMemory(null, srcAddress, null, destAddress, bytes);
 459     }
 460 
 461     private boolean isPrimitiveArray(Class<?> c) {
 462         Class<?> componentType = c.getComponentType();
 463         return componentType != null && componentType.isPrimitive();
 464     }
 465 
 466     private native void copySwapMemory0(Object srcBase, long srcOffset,
 467                                         Object destBase, long destOffset,
 468                                         long bytes, long elemSize);
 469         
 470 
 471     /**
 472      * Copies all elements from one block of memory to another block,
 473      * *unconditionally* byte swapping the elements on the fly.
 474      *
 475      * <p>This method determines each block's base address by means of two parameters,
 476      * and so it provides (in effect) a <em>double-register</em> addressing mode,
 477      * as discussed in {@link #getInt(Object,long)}.  When the object reference is null,
 478      * the offset supplies an absolute base address.
 479      *
 480      * @since 9
 481      */
 482     public void copySwapMemory(Object srcBase, long srcOffset,
 483                                Object destBase, long destOffset,
 484                                long bytes, long elemSize) {
 485         if (bytes < 0 || srcOffset < 0 || destOffset < 0) {
 486             throw new IllegalArgumentException();
 487         }
 488         if (elemSize != 2 && elemSize != 4 && elemSize != 8) {
 489             throw new IllegalArgumentException();
 490         }
 491         if (bytes % elemSize != 0) {
 492             throw new IllegalArgumentException();
 493         }
 494         if ((srcBase == null && srcOffset == 0) ||
 495             (destBase == null && destOffset == 0)) {
 496             throw new NullPointerException();
 497         }
 498 
 499         // Must be off-heap, or primitive heap arrays
 500         if ((srcBase != null && !isPrimitiveArray(srcBase.getClass())) ||
 501             (destBase != null && !isPrimitiveArray(destBase.getClass()))) {
 502             throw new IllegalArgumentException();
 503         }
 504 
 505         // Sanity check size and offsets on 32-bit platforms. Most
 506         // significant 32 bits must be zero.
 507         if (ADDRESS_SIZE == 4 &&
 508             (bytes >>> 32 != 0 || srcOffset >>> 32 != 0 || destOffset >>> 32 != 0)) {
 509             throw new IllegalArgumentException();
 510         }
 511 
 512         if (bytes == 0) {
 513             return;
 514         }
 515 
 516         copySwapMemory0(srcBase, srcOffset, destBase, destOffset, bytes, elemSize);
 517     }
 518 
 519    /**
 520      * Copies all elements from one block of memory to another block, byte swapping the
 521      * elements on the fly.
 522      *
 523      * This provides a <em>single-register</em> addressing mode, as
 524      * discussed in {@link #getInt(Object,long)}.
 525      *
 526      * Equivalent to {@code copySwapMemory(null, srcAddress, null, destAddress, bytes, elemSize)}.
 527      */
 528     public void copySwapMemory(long srcAddress, long destAddress, long bytes, long elemSize) {
 529         copySwapMemory(null, srcAddress, null, destAddress, bytes, elemSize);
 530     }
 531 
 532     /**
 533      * Disposes of a block of native memory, as obtained from {@link
 534      * #allocateMemory} or {@link #reallocateMemory}.  The address passed to
 535      * this method may be null, in which case no action is taken.
 536      *
 537      * @see #allocateMemory
 538      */
 539     public native void freeMemory(long address);
 540 
 541     /// random queries
 542 
 543     /**
 544      * This constant differs from all results that will ever be returned from
 545      * {@link #staticFieldOffset}, {@link #objectFieldOffset},
 546      * or {@link #arrayBaseOffset}.
 547      */
 548     public static final int INVALID_FIELD_OFFSET   = -1;
 549 
 550     /**
 551      * Reports the location of a given field in the storage allocation of its
 552      * class.  Do not expect to perform any sort of arithmetic on this offset;
 553      * it is just a cookie which is passed to the unsafe heap memory accessors.
 554      *
 555      * <p>Any given field will always have the same offset and base, and no
 556      * two distinct fields of the same class will ever have the same offset
 557      * and base.
 558      *
 559      * <p>As of 1.4.1, offsets for fields are represented as long values,
 560      * although the Sun JVM does not use the most significant 32 bits.
 561      * However, JVM implementations which store static fields at absolute
 562      * addresses can use long offsets and null base pointers to express
 563      * the field locations in a form usable by {@link #getInt(Object,long)}.
 564      * Therefore, code which will be ported to such JVMs on 64-bit platforms
 565      * must preserve all bits of static field offsets.
 566      * @see #getInt(Object, long)
 567      */
 568     public native long objectFieldOffset(Field f);
 569 
 570     /**
 571      * Reports the location of a given static field, in conjunction with {@link
 572      * #staticFieldBase}.
 573      * <p>Do not expect to perform any sort of arithmetic on this offset;
 574      * it is just a cookie which is passed to the unsafe heap memory accessors.
 575      *
 576      * <p>Any given field will always have the same offset, and no two distinct
 577      * fields of the same class will ever have the same offset.
 578      *
 579      * <p>As of 1.4.1, offsets for fields are represented as long values,
 580      * although the Sun JVM does not use the most significant 32 bits.
 581      * It is hard to imagine a JVM technology which needs more than
 582      * a few bits to encode an offset within a non-array object,
 583      * However, for consistency with other methods in this class,
 584      * this method reports its result as a long value.
 585      * @see #getInt(Object, long)
 586      */
 587     public native long staticFieldOffset(Field f);
 588 
 589     /**
 590      * Reports the location of a given static field, in conjunction with {@link
 591      * #staticFieldOffset}.
 592      * <p>Fetch the base "Object", if any, with which static fields of the
 593      * given class can be accessed via methods like {@link #getInt(Object,
 594      * long)}.  This value may be null.  This value may refer to an object
 595      * which is a "cookie", not guaranteed to be a real Object, and it should
 596      * not be used in any way except as argument to the get and put routines in
 597      * this class.
 598      */
 599     public native Object staticFieldBase(Field f);
 600 
 601     /**
 602      * Detects if the given class may need to be initialized. This is often
 603      * needed in conjunction with obtaining the static field base of a
 604      * class.
 605      * @return false only if a call to {@code ensureClassInitialized} would have no effect
 606      */
 607     public native boolean shouldBeInitialized(Class<?> c);
 608 
 609     /**
 610      * Ensures the given class has been initialized. This is often
 611      * needed in conjunction with obtaining the static field base of a
 612      * class.
 613      */
 614     public native void ensureClassInitialized(Class<?> c);
 615 
 616     /**
 617      * Reports the offset of the first element in the storage allocation of a
 618      * given array class.  If {@link #arrayIndexScale} returns a non-zero value
 619      * for the same class, you may use that scale factor, together with this
 620      * base offset, to form new offsets to access elements of arrays of the
 621      * given class.
 622      *
 623      * @see #getInt(Object, long)
 624      * @see #putInt(Object, long, int)
 625      */
 626     public native int arrayBaseOffset(Class<?> arrayClass);
 627 
 628     /** The value of {@code arrayBaseOffset(boolean[].class)} */
 629     public static final int ARRAY_BOOLEAN_BASE_OFFSET
 630             = theUnsafe.arrayBaseOffset(boolean[].class);
 631 
 632     /** The value of {@code arrayBaseOffset(byte[].class)} */
 633     public static final int ARRAY_BYTE_BASE_OFFSET
 634             = theUnsafe.arrayBaseOffset(byte[].class);
 635 
 636     /** The value of {@code arrayBaseOffset(short[].class)} */
 637     public static final int ARRAY_SHORT_BASE_OFFSET
 638             = theUnsafe.arrayBaseOffset(short[].class);
 639 
 640     /** The value of {@code arrayBaseOffset(char[].class)} */
 641     public static final int ARRAY_CHAR_BASE_OFFSET
 642             = theUnsafe.arrayBaseOffset(char[].class);
 643 
 644     /** The value of {@code arrayBaseOffset(int[].class)} */
 645     public static final int ARRAY_INT_BASE_OFFSET
 646             = theUnsafe.arrayBaseOffset(int[].class);
 647 
 648     /** The value of {@code arrayBaseOffset(long[].class)} */
 649     public static final int ARRAY_LONG_BASE_OFFSET
 650             = theUnsafe.arrayBaseOffset(long[].class);
 651 
 652     /** The value of {@code arrayBaseOffset(float[].class)} */
 653     public static final int ARRAY_FLOAT_BASE_OFFSET
 654             = theUnsafe.arrayBaseOffset(float[].class);
 655 
 656     /** The value of {@code arrayBaseOffset(double[].class)} */
 657     public static final int ARRAY_DOUBLE_BASE_OFFSET
 658             = theUnsafe.arrayBaseOffset(double[].class);
 659 
 660     /** The value of {@code arrayBaseOffset(Object[].class)} */
 661     public static final int ARRAY_OBJECT_BASE_OFFSET
 662             = theUnsafe.arrayBaseOffset(Object[].class);
 663 
 664     /**
 665      * Reports the scale factor for addressing elements in the storage
 666      * allocation of a given array class.  However, arrays of "narrow" types
 667      * will generally not work properly with accessors like {@link
 668      * #getByte(Object, long)}, so the scale factor for such classes is reported
 669      * as zero.
 670      *
 671      * @see #arrayBaseOffset
 672      * @see #getInt(Object, long)
 673      * @see #putInt(Object, long, int)
 674      */
 675     public native int arrayIndexScale(Class<?> arrayClass);
 676 
 677     /** The value of {@code arrayIndexScale(boolean[].class)} */
 678     public static final int ARRAY_BOOLEAN_INDEX_SCALE
 679             = theUnsafe.arrayIndexScale(boolean[].class);
 680 
 681     /** The value of {@code arrayIndexScale(byte[].class)} */
 682     public static final int ARRAY_BYTE_INDEX_SCALE
 683             = theUnsafe.arrayIndexScale(byte[].class);
 684 
 685     /** The value of {@code arrayIndexScale(short[].class)} */
 686     public static final int ARRAY_SHORT_INDEX_SCALE
 687             = theUnsafe.arrayIndexScale(short[].class);
 688 
 689     /** The value of {@code arrayIndexScale(char[].class)} */
 690     public static final int ARRAY_CHAR_INDEX_SCALE
 691             = theUnsafe.arrayIndexScale(char[].class);
 692 
 693     /** The value of {@code arrayIndexScale(int[].class)} */
 694     public static final int ARRAY_INT_INDEX_SCALE
 695             = theUnsafe.arrayIndexScale(int[].class);
 696 
 697     /** The value of {@code arrayIndexScale(long[].class)} */
 698     public static final int ARRAY_LONG_INDEX_SCALE
 699             = theUnsafe.arrayIndexScale(long[].class);
 700 
 701     /** The value of {@code arrayIndexScale(float[].class)} */
 702     public static final int ARRAY_FLOAT_INDEX_SCALE
 703             = theUnsafe.arrayIndexScale(float[].class);
 704 
 705     /** The value of {@code arrayIndexScale(double[].class)} */
 706     public static final int ARRAY_DOUBLE_INDEX_SCALE
 707             = theUnsafe.arrayIndexScale(double[].class);
 708 
 709     /** The value of {@code arrayIndexScale(Object[].class)} */
 710     public static final int ARRAY_OBJECT_INDEX_SCALE
 711             = theUnsafe.arrayIndexScale(Object[].class);
 712 
 713     /**
 714      * Reports the size in bytes of a native pointer, as stored via {@link
 715      * #putAddress}.  This value will be either 4 or 8.  Note that the sizes of
 716      * other primitive types (as stored in native memory blocks) is determined
 717      * fully by their information content.
 718      */
 719     public native int addressSize();
 720 
 721     /** The value of {@code addressSize()} */
 722     public static final int ADDRESS_SIZE = theUnsafe.addressSize();
 723 
 724     /**
 725      * Reports the size in bytes of a native memory page (whatever that is).
 726      * This value will always be a power of two.
 727      */
 728     public native int pageSize();
 729 
 730 
 731     /// random trusted operations from JNI:
 732 
 733     /**
 734      * Tells the VM to define a class, without security checks.  By default, the
 735      * class loader and protection domain come from the caller's class.
 736      */
 737     public native Class<?> defineClass(String name, byte[] b, int off, int len,
 738                                        ClassLoader loader,
 739                                        ProtectionDomain protectionDomain);
 740 
 741     /**
 742      * Defines a class but does not make it known to the class loader or system dictionary.
 743      * <p>
 744      * For each CP entry, the corresponding CP patch must either be null or have
 745      * the a format that matches its tag:
 746      * <ul>
 747      * <li>Integer, Long, Float, Double: the corresponding wrapper object type from java.lang
 748      * <li>Utf8: a string (must have suitable syntax if used as signature or name)
 749      * <li>Class: any java.lang.Class object
 750      * <li>String: any object (not just a java.lang.String)
 751      * <li>InterfaceMethodRef: (NYI) a method handle to invoke on that call site's arguments
 752      * </ul>
 753      * @param hostClass context for linkage, access control, protection domain, and class loader
 754      * @param data      bytes of a class file
 755      * @param cpPatches where non-null entries exist, they replace corresponding CP entries in data
 756      */
 757     public native Class<?> defineAnonymousClass(Class<?> hostClass, byte[] data, Object[] cpPatches);
 758 
 759     /**
 760      * Allocates an instance but does not run any constructor.
 761      * Initializes the class if it has not yet been.
 762      */
 763     @HotSpotIntrinsicCandidate
 764     public native Object allocateInstance(Class<?> cls)
 765         throws InstantiationException;
 766 
 767     /** Throws the exception without telling the verifier. */
 768     public native void throwException(Throwable ee);
 769 
 770     /**
 771      * Atomically updates Java variable to {@code x} if it is currently
 772      * holding {@code expected}.
 773      *
 774      * <p>This operation has memory semantics of a {@code volatile} read
 775      * and write.  Corresponds to C11 atomic_compare_exchange_strong.
 776      *
 777      * @return {@code true} if successful
 778      */
 779     @HotSpotIntrinsicCandidate
 780     public final native boolean compareAndSwapObject(Object o, long offset,
 781                                                      Object expected,
 782                                                      Object x);
 783 
 784     /**
 785      * Atomically updates Java variable to {@code x} if it is currently
 786      * holding {@code expected}.
 787      *
 788      * <p>This operation has memory semantics of a {@code volatile} read
 789      * and write.  Corresponds to C11 atomic_compare_exchange_strong.
 790      *
 791      * @return {@code true} if successful
 792      */
 793     @HotSpotIntrinsicCandidate
 794     public final native boolean compareAndSwapInt(Object o, long offset,
 795                                                   int expected,
 796                                                   int x);
 797 
 798     /**
 799      * Atomically updates Java variable to {@code x} if it is currently
 800      * holding {@code expected}.
 801      *
 802      * <p>This operation has memory semantics of a {@code volatile} read
 803      * and write.  Corresponds to C11 atomic_compare_exchange_strong.
 804      *
 805      * @return {@code true} if successful
 806      */
 807     @HotSpotIntrinsicCandidate
 808     public final native boolean compareAndSwapLong(Object o, long offset,
 809                                                    long expected,
 810                                                    long x);
 811 
 812     /**
 813      * Fetches a reference value from a given Java variable, with volatile
 814      * load semantics. Otherwise identical to {@link #getObject(Object, long)}
 815      */
 816     @HotSpotIntrinsicCandidate
 817     public native Object getObjectVolatile(Object o, long offset);
 818 
 819     /**
 820      * Stores a reference value into a given Java variable, with
 821      * volatile store semantics. Otherwise identical to {@link #putObject(Object, long, Object)}
 822      */
 823     @HotSpotIntrinsicCandidate
 824     public native void    putObjectVolatile(Object o, long offset, Object x);
 825 
 826     /** Volatile version of {@link #getInt(Object, long)}  */
 827     @HotSpotIntrinsicCandidate
 828     public native int     getIntVolatile(Object o, long offset);
 829 
 830     /** Volatile version of {@link #putInt(Object, long, int)}  */
 831     @HotSpotIntrinsicCandidate
 832     public native void    putIntVolatile(Object o, long offset, int x);
 833 
 834     /** Volatile version of {@link #getBoolean(Object, long)}  */
 835     @HotSpotIntrinsicCandidate
 836     public native boolean getBooleanVolatile(Object o, long offset);
 837 
 838     /** Volatile version of {@link #putBoolean(Object, long, boolean)}  */
 839     @HotSpotIntrinsicCandidate
 840     public native void    putBooleanVolatile(Object o, long offset, boolean x);
 841 
 842     /** Volatile version of {@link #getByte(Object, long)}  */
 843     @HotSpotIntrinsicCandidate
 844     public native byte    getByteVolatile(Object o, long offset);
 845 
 846     /** Volatile version of {@link #putByte(Object, long, byte)}  */
 847     @HotSpotIntrinsicCandidate
 848     public native void    putByteVolatile(Object o, long offset, byte x);
 849 
 850     /** Volatile version of {@link #getShort(Object, long)}  */
 851     @HotSpotIntrinsicCandidate
 852     public native short   getShortVolatile(Object o, long offset);
 853 
 854     /** Volatile version of {@link #putShort(Object, long, short)}  */
 855     @HotSpotIntrinsicCandidate
 856     public native void    putShortVolatile(Object o, long offset, short x);
 857 
 858     /** Volatile version of {@link #getChar(Object, long)}  */
 859     @HotSpotIntrinsicCandidate
 860     public native char    getCharVolatile(Object o, long offset);
 861 
 862     /** Volatile version of {@link #putChar(Object, long, char)}  */
 863     @HotSpotIntrinsicCandidate
 864     public native void    putCharVolatile(Object o, long offset, char x);
 865 
 866     /** Volatile version of {@link #getLong(Object, long)}  */
 867     @HotSpotIntrinsicCandidate
 868     public native long    getLongVolatile(Object o, long offset);
 869 
 870     /** Volatile version of {@link #putLong(Object, long, long)}  */
 871     @HotSpotIntrinsicCandidate
 872     public native void    putLongVolatile(Object o, long offset, long x);
 873 
 874     /** Volatile version of {@link #getFloat(Object, long)}  */
 875     @HotSpotIntrinsicCandidate
 876     public native float   getFloatVolatile(Object o, long offset);
 877 
 878     /** Volatile version of {@link #putFloat(Object, long, float)}  */
 879     @HotSpotIntrinsicCandidate
 880     public native void    putFloatVolatile(Object o, long offset, float x);
 881 
 882     /** Volatile version of {@link #getDouble(Object, long)}  */
 883     @HotSpotIntrinsicCandidate
 884     public native double  getDoubleVolatile(Object o, long offset);
 885 
 886     /** Volatile version of {@link #putDouble(Object, long, double)}  */
 887     @HotSpotIntrinsicCandidate
 888     public native void    putDoubleVolatile(Object o, long offset, double x);
 889 
 890     /**
 891      * Version of {@link #putObjectVolatile(Object, long, Object)}
 892      * that does not guarantee immediate visibility of the store to
 893      * other threads. This method is generally only useful if the
 894      * underlying field is a Java volatile (or if an array cell, one
 895      * that is otherwise only accessed using volatile accesses).
 896      *
 897      * Corresponds to C11 atomic_store_explicit(..., memory_order_release).
 898      */
 899     @HotSpotIntrinsicCandidate
 900     public native void    putOrderedObject(Object o, long offset, Object x);
 901 
 902     /** Ordered/Lazy version of {@link #putIntVolatile(Object, long, int)}  */
 903     @HotSpotIntrinsicCandidate
 904     public native void    putOrderedInt(Object o, long offset, int x);
 905 
 906     /** Ordered/Lazy version of {@link #putLongVolatile(Object, long, long)} */
 907     @HotSpotIntrinsicCandidate
 908     public native void    putOrderedLong(Object o, long offset, long x);
 909 
 910     /**
 911      * Unblocks the given thread blocked on {@code park}, or, if it is
 912      * not blocked, causes the subsequent call to {@code park} not to
 913      * block.  Note: this operation is "unsafe" solely because the
 914      * caller must somehow ensure that the thread has not been
 915      * destroyed. Nothing special is usually required to ensure this
 916      * when called from Java (in which there will ordinarily be a live
 917      * reference to the thread) but this is not nearly-automatically
 918      * so when calling from native code.
 919      *
 920      * @param thread the thread to unpark.
 921      */
 922     @HotSpotIntrinsicCandidate
 923     public native void unpark(Object thread);
 924 
 925     /**
 926      * Blocks current thread, returning when a balancing
 927      * {@code unpark} occurs, or a balancing {@code unpark} has
 928      * already occurred, or the thread is interrupted, or, if not
 929      * absolute and time is not zero, the given time nanoseconds have
 930      * elapsed, or if absolute, the given deadline in milliseconds
 931      * since Epoch has passed, or spuriously (i.e., returning for no
 932      * "reason"). Note: This operation is in the Unsafe class only
 933      * because {@code unpark} is, so it would be strange to place it
 934      * elsewhere.
 935      */
 936     @HotSpotIntrinsicCandidate
 937     public native void park(boolean isAbsolute, long time);
 938 
 939     /**
 940      * Gets the load average in the system run queue assigned
 941      * to the available processors averaged over various periods of time.
 942      * This method retrieves the given {@code nelem} samples and
 943      * assigns to the elements of the given {@code loadavg} array.
 944      * The system imposes a maximum of 3 samples, representing
 945      * averages over the last 1,  5,  and  15 minutes, respectively.
 946      *
 947      * @param loadavg an array of double of size nelems
 948      * @param nelems the number of samples to be retrieved and
 949      *        must be 1 to 3.
 950      *
 951      * @return the number of samples actually retrieved; or -1
 952      *         if the load average is unobtainable.
 953      */
 954     public native int getLoadAverage(double[] loadavg, int nelems);
 955 
 956     // The following contain CAS-based Java implementations used on
 957     // platforms not supporting native instructions
 958 
 959     /**
 960      * Atomically adds the given value to the current value of a field
 961      * or array element within the given object {@code o}
 962      * at the given {@code offset}.
 963      *
 964      * @param o object/array to update the field/element in
 965      * @param offset field/element offset
 966      * @param delta the value to add
 967      * @return the previous value
 968      * @since 1.8
 969      */
 970     @HotSpotIntrinsicCandidate
 971     public final int getAndAddInt(Object o, long offset, int delta) {
 972         int v;
 973         do {
 974             v = getIntVolatile(o, offset);
 975         } while (!compareAndSwapInt(o, offset, v, v + delta));
 976         return v;
 977     }
 978 
 979     /**
 980      * Atomically adds the given value to the current value of a field
 981      * or array element within the given object {@code o}
 982      * at the given {@code offset}.
 983      *
 984      * @param o object/array to update the field/element in
 985      * @param offset field/element offset
 986      * @param delta the value to add
 987      * @return the previous value
 988      * @since 1.8
 989      */
 990     @HotSpotIntrinsicCandidate
 991     public final long getAndAddLong(Object o, long offset, long delta) {
 992         long v;
 993         do {
 994             v = getLongVolatile(o, offset);
 995         } while (!compareAndSwapLong(o, offset, v, v + delta));
 996         return v;
 997     }
 998 
 999     /**
1000      * Atomically exchanges the given value with the current value of
1001      * a field or array element within the given object {@code o}
1002      * at the given {@code offset}.
1003      *
1004      * @param o object/array to update the field/element in
1005      * @param offset field/element offset
1006      * @param newValue new value
1007      * @return the previous value
1008      * @since 1.8
1009      */
1010     @HotSpotIntrinsicCandidate
1011     public final int getAndSetInt(Object o, long offset, int newValue) {
1012         int v;
1013         do {
1014             v = getIntVolatile(o, offset);
1015         } while (!compareAndSwapInt(o, offset, v, newValue));
1016         return v;
1017     }
1018 
1019     /**
1020      * Atomically exchanges the given value with the current value of
1021      * a field or array element within the given object {@code o}
1022      * at the given {@code offset}.
1023      *
1024      * @param o object/array to update the field/element in
1025      * @param offset field/element offset
1026      * @param newValue new value
1027      * @return the previous value
1028      * @since 1.8
1029      */
1030     @HotSpotIntrinsicCandidate
1031     public final long getAndSetLong(Object o, long offset, long newValue) {
1032         long v;
1033         do {
1034             v = getLongVolatile(o, offset);
1035         } while (!compareAndSwapLong(o, offset, v, newValue));
1036         return v;
1037     }
1038 
1039     /**
1040      * Atomically exchanges the given reference value with the current
1041      * reference value of a field or array element within the given
1042      * object {@code o} at the given {@code offset}.
1043      *
1044      * @param o object/array to update the field/element in
1045      * @param offset field/element offset
1046      * @param newValue new value
1047      * @return the previous value
1048      * @since 1.8
1049      */
1050     @HotSpotIntrinsicCandidate
1051     public final Object getAndSetObject(Object o, long offset, Object newValue) {
1052         Object v;
1053         do {
1054             v = getObjectVolatile(o, offset);
1055         } while (!compareAndSwapObject(o, offset, v, newValue));
1056         return v;
1057     }
1058 
1059 
1060     /**
1061      * Ensures that loads before the fence will not be reordered with loads and
1062      * stores after the fence; a "LoadLoad plus LoadStore barrier".
1063      *
1064      * Corresponds to C11 atomic_thread_fence(memory_order_acquire)
1065      * (an "acquire fence").
1066      *
1067      * A pure LoadLoad fence is not provided, since the addition of LoadStore
1068      * is almost always desired, and most current hardware instructions that
1069      * provide a LoadLoad barrier also provide a LoadStore barrier for free.
1070      * @since 1.8
1071      */
1072     @HotSpotIntrinsicCandidate
1073     public native void loadFence();
1074 
1075     /**
1076      * Ensures that loads and stores before the fence will not be reordered with
1077      * stores after the fence; a "StoreStore plus LoadStore barrier".
1078      *
1079      * Corresponds to C11 atomic_thread_fence(memory_order_release)
1080      * (a "release fence").
1081      *
1082      * A pure StoreStore fence is not provided, since the addition of LoadStore
1083      * is almost always desired, and most current hardware instructions that
1084      * provide a StoreStore barrier also provide a LoadStore barrier for free.
1085      * @since 1.8
1086      */
1087     @HotSpotIntrinsicCandidate
1088     public native void storeFence();
1089 
1090     /**
1091      * Ensures that loads and stores before the fence will not be reordered
1092      * with loads and stores after the fence.  Implies the effects of both
1093      * loadFence() and storeFence(), and in addition, the effect of a StoreLoad
1094      * barrier.
1095      *
1096      * Corresponds to C11 atomic_thread_fence(memory_order_seq_cst).
1097      * @since 1.8
1098      */
1099     @HotSpotIntrinsicCandidate
1100     public native void fullFence();
1101 
1102     /**
1103      * Throws IllegalAccessError; for use by the VM for access control
1104      * error support.
1105      * @since 1.8
1106      */
1107     private static void throwIllegalAccessError() {
1108         throw new IllegalAccessError();
1109     }
1110 
1111     /**
1112      * @return Returns true if the native byte ordering of this
1113      * platform is big-endian, false if it is little-endian.
1114      */
1115     public final boolean isBigEndian() { return BE; }
1116 
1117     /**
1118      * @return Returns true if this platform is capable of performing
1119      * accesses at addresses which are not aligned for the type of the
1120      * primitive type being accessed, false otherwise.
1121      */
1122     public final boolean unalignedAccess() { return unalignedAccess; }
1123 
1124     /**
1125      * Fetches a value at some byte offset into a given Java object.
1126      * More specifically, fetches a value within the given object
1127      * <code>o</code> at the given offset, or (if <code>o</code> is
1128      * null) from the memory address whose numerical value is the
1129      * given offset.  <p>
1130      *
1131      * The specification of this method is the same as {@link
1132      * #getLong(Object, long)} except that the offset does not need to
1133      * have been obtained from {@link #objectFieldOffset} on the
1134      * {@link java.lang.reflect.Field} of some Java field.  The value
1135      * in memory is raw data, and need not correspond to any Java
1136      * variable.  Unless <code>o</code> is null, the value accessed
1137      * must be entirely within the allocated object.  The endianness
1138      * of the value in memory is the endianness of the native platform.
1139      *
1140      * <p> The read will be atomic with respect to the largest power
1141      * of two that divides the GCD of the offset and the storage size.
1142      * For example, getLongUnaligned will make atomic reads of 2-, 4-,
1143      * or 8-byte storage units if the offset is zero mod 2, 4, or 8,
1144      * respectively.  There are no other guarantees of atomicity.
1145      * <p>
1146      * 8-byte atomicity is only guaranteed on platforms on which
1147      * support atomic accesses to longs.
1148      *
1149      * @param o Java heap object in which the value resides, if any, else
1150      *        null
1151      * @param offset The offset in bytes from the start of the object
1152      * @return the value fetched from the indicated object
1153      * @throws RuntimeException No defined exceptions are thrown, not even
1154      *         {@link NullPointerException}
1155      * @since 9
1156      */
1157     @HotSpotIntrinsicCandidate
1158     public final long getLongUnaligned(Object o, long offset) {
1159         if ((offset & 7) == 0) {
1160             return getLong(o, offset);
1161         } else if ((offset & 3) == 0) {
1162             return makeLong(getInt(o, offset),
1163                             getInt(o, offset + 4));
1164         } else if ((offset & 1) == 0) {
1165             return makeLong(getShort(o, offset),
1166                             getShort(o, offset + 2),
1167                             getShort(o, offset + 4),
1168                             getShort(o, offset + 6));
1169         } else {
1170             return makeLong(getByte(o, offset),
1171                             getByte(o, offset + 1),
1172                             getByte(o, offset + 2),
1173                             getByte(o, offset + 3),
1174                             getByte(o, offset + 4),
1175                             getByte(o, offset + 5),
1176                             getByte(o, offset + 6),
1177                             getByte(o, offset + 7));
1178         }
1179     }
1180     /**
1181      * As {@link #getLongUnaligned(Object, long)} but with an
1182      * additional argument which specifies the endianness of the value
1183      * as stored in memory.
1184      *
1185      * @param o Java heap object in which the variable resides
1186      * @param offset The offset in bytes from the start of the object
1187      * @param bigEndian The endianness of the value
1188      * @return the value fetched from the indicated object
1189      * @since 9
1190      */
1191     public final long getLongUnaligned(Object o, long offset, boolean bigEndian) {
1192         return convEndian(bigEndian, getLongUnaligned(o, offset));
1193     }
1194 
1195     /** @see #getLongUnaligned(Object, long) */
1196     @HotSpotIntrinsicCandidate
1197     public final int getIntUnaligned(Object o, long offset) {
1198         if ((offset & 3) == 0) {
1199             return getInt(o, offset);
1200         } else if ((offset & 1) == 0) {
1201             return makeInt(getShort(o, offset),
1202                            getShort(o, offset + 2));
1203         } else {
1204             return makeInt(getByte(o, offset),
1205                            getByte(o, offset + 1),
1206                            getByte(o, offset + 2),
1207                            getByte(o, offset + 3));
1208         }
1209     }
1210     /** @see #getLongUnaligned(Object, long, boolean) */
1211     public final int getIntUnaligned(Object o, long offset, boolean bigEndian) {
1212         return convEndian(bigEndian, getIntUnaligned(o, offset));
1213     }
1214 
1215     /** @see #getLongUnaligned(Object, long) */
1216     @HotSpotIntrinsicCandidate
1217     public final short getShortUnaligned(Object o, long offset) {
1218         if ((offset & 1) == 0) {
1219             return getShort(o, offset);
1220         } else {
1221             return makeShort(getByte(o, offset),
1222                              getByte(o, offset + 1));
1223         }
1224     }
1225     /** @see #getLongUnaligned(Object, long, boolean) */
1226     public final short getShortUnaligned(Object o, long offset, boolean bigEndian) {
1227         return convEndian(bigEndian, getShortUnaligned(o, offset));
1228     }
1229 
1230     /** @see #getLongUnaligned(Object, long) */
1231     @HotSpotIntrinsicCandidate
1232     public final char getCharUnaligned(Object o, long offset) {
1233         return (char)getShortUnaligned(o, offset);
1234     }
1235 
1236     /** @see #getLongUnaligned(Object, long, boolean) */
1237     public final char getCharUnaligned(Object o, long offset, boolean bigEndian) {
1238         return convEndian(bigEndian, getCharUnaligned(o, offset));
1239     }
1240 
1241     /**
1242      * Stores a value at some byte offset into a given Java object.
1243      * <p>
1244      * The specification of this method is the same as {@link
1245      * #getLong(Object, long)} except that the offset does not need to
1246      * have been obtained from {@link #objectFieldOffset} on the
1247      * {@link java.lang.reflect.Field} of some Java field.  The value
1248      * in memory is raw data, and need not correspond to any Java
1249      * variable.  The endianness of the value in memory is the
1250      * endianness of the native platform.
1251      * <p>
1252      * The write will be atomic with respect to the largest power of
1253      * two that divides the GCD of the offset and the storage size.
1254      * For example, putLongUnaligned will make atomic writes of 2-, 4-,
1255      * or 8-byte storage units if the offset is zero mod 2, 4, or 8,
1256      * respectively.  There are no other guarantees of atomicity.
1257      * <p>
1258      * 8-byte atomicity is only guaranteed on platforms on which
1259      * support atomic accesses to longs.
1260      *
1261      * @param o Java heap object in which the value resides, if any, else
1262      *        null
1263      * @param offset The offset in bytes from the start of the object
1264      * @param x the value to store
1265      * @throws RuntimeException No defined exceptions are thrown, not even
1266      *         {@link NullPointerException}
1267      * @since 9
1268      */
1269     @HotSpotIntrinsicCandidate
1270     public final void putLongUnaligned(Object o, long offset, long x) {
1271         if ((offset & 7) == 0) {
1272             putLong(o, offset, x);
1273         } else if ((offset & 3) == 0) {
1274             putLongParts(o, offset,
1275                          (int)(x >> 0),
1276                          (int)(x >>> 32));
1277         } else if ((offset & 1) == 0) {
1278             putLongParts(o, offset,
1279                          (short)(x >>> 0),
1280                          (short)(x >>> 16),
1281                          (short)(x >>> 32),
1282                          (short)(x >>> 48));
1283         } else {
1284             putLongParts(o, offset,
1285                          (byte)(x >>> 0),
1286                          (byte)(x >>> 8),
1287                          (byte)(x >>> 16),
1288                          (byte)(x >>> 24),
1289                          (byte)(x >>> 32),
1290                          (byte)(x >>> 40),
1291                          (byte)(x >>> 48),
1292                          (byte)(x >>> 56));
1293         }
1294     }
1295 
1296     /**
1297      * As {@link #putLongUnaligned(Object, long, long)} but with an additional
1298      * argument which specifies the endianness of the value as stored in memory.
1299      * @param o Java heap object in which the value resides
1300      * @param offset The offset in bytes from the start of the object
1301      * @param x the value to store
1302      * @param bigEndian The endianness of the value
1303      * @throws RuntimeException No defined exceptions are thrown, not even
1304      *         {@link NullPointerException}
1305      * @since 9
1306      */
1307     public final void putLongUnaligned(Object o, long offset, long x, boolean bigEndian) {
1308         putLongUnaligned(o, offset, convEndian(bigEndian, x));
1309     }
1310 
1311     /** @see #putLongUnaligned(Object, long, long) */
1312     @HotSpotIntrinsicCandidate
1313     public final void putIntUnaligned(Object o, long offset, int x) {
1314         if ((offset & 3) == 0) {
1315             putInt(o, offset, x);
1316         } else if ((offset & 1) == 0) {
1317             putIntParts(o, offset,
1318                         (short)(x >> 0),
1319                         (short)(x >>> 16));
1320         } else {
1321             putIntParts(o, offset,
1322                         (byte)(x >>> 0),
1323                         (byte)(x >>> 8),
1324                         (byte)(x >>> 16),
1325                         (byte)(x >>> 24));
1326         }
1327     }
1328     /** @see #putLongUnaligned(Object, long, long, boolean) */
1329     public final void putIntUnaligned(Object o, long offset, int x, boolean bigEndian) {
1330         putIntUnaligned(o, offset, convEndian(bigEndian, x));
1331     }
1332 
1333     /** @see #putLongUnaligned(Object, long, long) */
1334     @HotSpotIntrinsicCandidate
1335     public final void putShortUnaligned(Object o, long offset, short x) {
1336         if ((offset & 1) == 0) {
1337             putShort(o, offset, x);
1338         } else {
1339             putShortParts(o, offset,
1340                           (byte)(x >>> 0),
1341                           (byte)(x >>> 8));
1342         }
1343     }
1344     /** @see #putLongUnaligned(Object, long, long, boolean) */
1345     public final void putShortUnaligned(Object o, long offset, short x, boolean bigEndian) {
1346         putShortUnaligned(o, offset, convEndian(bigEndian, x));
1347     }
1348 
1349     /** @see #putLongUnaligned(Object, long, long) */
1350     @HotSpotIntrinsicCandidate
1351     public final void putCharUnaligned(Object o, long offset, char x) {
1352         putShortUnaligned(o, offset, (short)x);
1353     }
1354     /** @see #putLongUnaligned(Object, long, long, boolean) */
1355     public final void putCharUnaligned(Object o, long offset, char x, boolean bigEndian) {
1356         putCharUnaligned(o, offset, convEndian(bigEndian, x));
1357     }
1358 
1359     // JVM interface methods
1360     private native boolean unalignedAccess0();
1361     private native boolean isBigEndian0();
1362 
1363     // BE is true iff the native endianness of this platform is big.
1364     private static final boolean BE = theUnsafe.isBigEndian0();
1365 
1366     // unalignedAccess is true iff this platform can perform unaligned accesses.
1367     private static final boolean unalignedAccess = theUnsafe.unalignedAccess0();
1368 
1369     private static int pickPos(int top, int pos) { return BE ? top - pos : pos; }
1370 
1371     // These methods construct integers from bytes.  The byte ordering
1372     // is the native endianness of this platform.
1373     private static long makeLong(byte i0, byte i1, byte i2, byte i3, byte i4, byte i5, byte i6, byte i7) {
1374         return ((toUnsignedLong(i0) << pickPos(56, 0))
1375               | (toUnsignedLong(i1) << pickPos(56, 8))
1376               | (toUnsignedLong(i2) << pickPos(56, 16))
1377               | (toUnsignedLong(i3) << pickPos(56, 24))
1378               | (toUnsignedLong(i4) << pickPos(56, 32))
1379               | (toUnsignedLong(i5) << pickPos(56, 40))
1380               | (toUnsignedLong(i6) << pickPos(56, 48))
1381               | (toUnsignedLong(i7) << pickPos(56, 56)));
1382     }
1383     private static long makeLong(short i0, short i1, short i2, short i3) {
1384         return ((toUnsignedLong(i0) << pickPos(48, 0))
1385               | (toUnsignedLong(i1) << pickPos(48, 16))
1386               | (toUnsignedLong(i2) << pickPos(48, 32))
1387               | (toUnsignedLong(i3) << pickPos(48, 48)));
1388     }
1389     private static long makeLong(int i0, int i1) {
1390         return (toUnsignedLong(i0) << pickPos(32, 0))
1391              | (toUnsignedLong(i1) << pickPos(32, 32));
1392     }
1393     private static int makeInt(short i0, short i1) {
1394         return (toUnsignedInt(i0) << pickPos(16, 0))
1395              | (toUnsignedInt(i1) << pickPos(16, 16));
1396     }
1397     private static int makeInt(byte i0, byte i1, byte i2, byte i3) {
1398         return ((toUnsignedInt(i0) << pickPos(24, 0))
1399               | (toUnsignedInt(i1) << pickPos(24, 8))
1400               | (toUnsignedInt(i2) << pickPos(24, 16))
1401               | (toUnsignedInt(i3) << pickPos(24, 24)));
1402     }
1403     private static short makeShort(byte i0, byte i1) {
1404         return (short)((toUnsignedInt(i0) << pickPos(8, 0))
1405                      | (toUnsignedInt(i1) << pickPos(8, 8)));
1406     }
1407 
1408     private static byte  pick(byte  le, byte  be) { return BE ? be : le; }
1409     private static short pick(short le, short be) { return BE ? be : le; }
1410     private static int   pick(int   le, int   be) { return BE ? be : le; }
1411 
1412     // These methods write integers to memory from smaller parts
1413     // provided by their caller.  The ordering in which these parts
1414     // are written is the native endianness of this platform.
1415     private void putLongParts(Object o, long offset, byte i0, byte i1, byte i2, byte i3, byte i4, byte i5, byte i6, byte i7) {
1416         putByte(o, offset + 0, pick(i0, i7));
1417         putByte(o, offset + 1, pick(i1, i6));
1418         putByte(o, offset + 2, pick(i2, i5));
1419         putByte(o, offset + 3, pick(i3, i4));
1420         putByte(o, offset + 4, pick(i4, i3));
1421         putByte(o, offset + 5, pick(i5, i2));
1422         putByte(o, offset + 6, pick(i6, i1));
1423         putByte(o, offset + 7, pick(i7, i0));
1424     }
1425     private void putLongParts(Object o, long offset, short i0, short i1, short i2, short i3) {
1426         putShort(o, offset + 0, pick(i0, i3));
1427         putShort(o, offset + 2, pick(i1, i2));
1428         putShort(o, offset + 4, pick(i2, i1));
1429         putShort(o, offset + 6, pick(i3, i0));
1430     }
1431     private void putLongParts(Object o, long offset, int i0, int i1) {
1432         putInt(o, offset + 0, pick(i0, i1));
1433         putInt(o, offset + 4, pick(i1, i0));
1434     }
1435     private void putIntParts(Object o, long offset, short i0, short i1) {
1436         putShort(o, offset + 0, pick(i0, i1));
1437         putShort(o, offset + 2, pick(i1, i0));
1438     }
1439     private void putIntParts(Object o, long offset, byte i0, byte i1, byte i2, byte i3) {
1440         putByte(o, offset + 0, pick(i0, i3));
1441         putByte(o, offset + 1, pick(i1, i2));
1442         putByte(o, offset + 2, pick(i2, i1));
1443         putByte(o, offset + 3, pick(i3, i0));
1444     }
1445     private void putShortParts(Object o, long offset, byte i0, byte i1) {
1446         putByte(o, offset + 0, pick(i0, i1));
1447         putByte(o, offset + 1, pick(i1, i0));
1448     }
1449 
1450     // Zero-extend an integer
1451     private static int toUnsignedInt(byte n)    { return n & 0xff; }
1452     private static int toUnsignedInt(short n)   { return n & 0xffff; }
1453     private static long toUnsignedLong(byte n)  { return n & 0xffl; }
1454     private static long toUnsignedLong(short n) { return n & 0xffffl; }
1455     private static long toUnsignedLong(int n)   { return n & 0xffffffffl; }
1456 
1457     // Maybe byte-reverse an integer
1458     private static char convEndian(boolean big, char n)   { return big == BE ? n : Character.reverseBytes(n); }
1459     private static short convEndian(boolean big, short n) { return big == BE ? n : Short.reverseBytes(n)    ; }
1460     private static int convEndian(boolean big, int n)     { return big == BE ? n : Integer.reverseBytes(n)  ; }
1461     private static long convEndian(boolean big, long n)   { return big == BE ? n : Long.reverseBytes(n)     ; }
1462 }