Unsafe.java revision 13532:859397229dc4
1/*
2 * Copyright (c) 2000, 2015, 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
26package jdk.internal.misc;
27
28import java.lang.reflect.Field;
29import java.security.ProtectionDomain;
30
31import sun.reflect.CallerSensitive;
32import sun.reflect.Reflection;
33import jdk.internal.misc.VM;
34
35import 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
47public 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    /**
462     * Disposes of a block of native memory, as obtained from {@link
463     * #allocateMemory} or {@link #reallocateMemory}.  The address passed to
464     * this method may be null, in which case no action is taken.
465     *
466     * @see #allocateMemory
467     */
468    public native void freeMemory(long address);
469
470    /// random queries
471
472    /**
473     * This constant differs from all results that will ever be returned from
474     * {@link #staticFieldOffset}, {@link #objectFieldOffset},
475     * or {@link #arrayBaseOffset}.
476     */
477    public static final int INVALID_FIELD_OFFSET   = -1;
478
479    /**
480     * Reports the location of a given field in the storage allocation of its
481     * class.  Do not expect to perform any sort of arithmetic on this offset;
482     * it is just a cookie which is passed to the unsafe heap memory accessors.
483     *
484     * <p>Any given field will always have the same offset and base, and no
485     * two distinct fields of the same class will ever have the same offset
486     * and base.
487     *
488     * <p>As of 1.4.1, offsets for fields are represented as long values,
489     * although the Sun JVM does not use the most significant 32 bits.
490     * However, JVM implementations which store static fields at absolute
491     * addresses can use long offsets and null base pointers to express
492     * the field locations in a form usable by {@link #getInt(Object,long)}.
493     * Therefore, code which will be ported to such JVMs on 64-bit platforms
494     * must preserve all bits of static field offsets.
495     * @see #getInt(Object, long)
496     */
497    public native long objectFieldOffset(Field f);
498
499    /**
500     * Reports the location of a given static field, in conjunction with {@link
501     * #staticFieldBase}.
502     * <p>Do not expect to perform any sort of arithmetic on this offset;
503     * it is just a cookie which is passed to the unsafe heap memory accessors.
504     *
505     * <p>Any given field will always have the same offset, and no two distinct
506     * fields of the same class will ever have the same offset.
507     *
508     * <p>As of 1.4.1, offsets for fields are represented as long values,
509     * although the Sun JVM does not use the most significant 32 bits.
510     * It is hard to imagine a JVM technology which needs more than
511     * a few bits to encode an offset within a non-array object,
512     * However, for consistency with other methods in this class,
513     * this method reports its result as a long value.
514     * @see #getInt(Object, long)
515     */
516    public native long staticFieldOffset(Field f);
517
518    /**
519     * Reports the location of a given static field, in conjunction with {@link
520     * #staticFieldOffset}.
521     * <p>Fetch the base "Object", if any, with which static fields of the
522     * given class can be accessed via methods like {@link #getInt(Object,
523     * long)}.  This value may be null.  This value may refer to an object
524     * which is a "cookie", not guaranteed to be a real Object, and it should
525     * not be used in any way except as argument to the get and put routines in
526     * this class.
527     */
528    public native Object staticFieldBase(Field f);
529
530    /**
531     * Detects if the given class may need to be initialized. This is often
532     * needed in conjunction with obtaining the static field base of a
533     * class.
534     * @return false only if a call to {@code ensureClassInitialized} would have no effect
535     */
536    public native boolean shouldBeInitialized(Class<?> c);
537
538    /**
539     * Ensures the given class has been initialized. This is often
540     * needed in conjunction with obtaining the static field base of a
541     * class.
542     */
543    public native void ensureClassInitialized(Class<?> c);
544
545    /**
546     * Reports the offset of the first element in the storage allocation of a
547     * given array class.  If {@link #arrayIndexScale} returns a non-zero value
548     * for the same class, you may use that scale factor, together with this
549     * base offset, to form new offsets to access elements of arrays of the
550     * given class.
551     *
552     * @see #getInt(Object, long)
553     * @see #putInt(Object, long, int)
554     */
555    public native int arrayBaseOffset(Class<?> arrayClass);
556
557    /** The value of {@code arrayBaseOffset(boolean[].class)} */
558    public static final int ARRAY_BOOLEAN_BASE_OFFSET
559            = theUnsafe.arrayBaseOffset(boolean[].class);
560
561    /** The value of {@code arrayBaseOffset(byte[].class)} */
562    public static final int ARRAY_BYTE_BASE_OFFSET
563            = theUnsafe.arrayBaseOffset(byte[].class);
564
565    /** The value of {@code arrayBaseOffset(short[].class)} */
566    public static final int ARRAY_SHORT_BASE_OFFSET
567            = theUnsafe.arrayBaseOffset(short[].class);
568
569    /** The value of {@code arrayBaseOffset(char[].class)} */
570    public static final int ARRAY_CHAR_BASE_OFFSET
571            = theUnsafe.arrayBaseOffset(char[].class);
572
573    /** The value of {@code arrayBaseOffset(int[].class)} */
574    public static final int ARRAY_INT_BASE_OFFSET
575            = theUnsafe.arrayBaseOffset(int[].class);
576
577    /** The value of {@code arrayBaseOffset(long[].class)} */
578    public static final int ARRAY_LONG_BASE_OFFSET
579            = theUnsafe.arrayBaseOffset(long[].class);
580
581    /** The value of {@code arrayBaseOffset(float[].class)} */
582    public static final int ARRAY_FLOAT_BASE_OFFSET
583            = theUnsafe.arrayBaseOffset(float[].class);
584
585    /** The value of {@code arrayBaseOffset(double[].class)} */
586    public static final int ARRAY_DOUBLE_BASE_OFFSET
587            = theUnsafe.arrayBaseOffset(double[].class);
588
589    /** The value of {@code arrayBaseOffset(Object[].class)} */
590    public static final int ARRAY_OBJECT_BASE_OFFSET
591            = theUnsafe.arrayBaseOffset(Object[].class);
592
593    /**
594     * Reports the scale factor for addressing elements in the storage
595     * allocation of a given array class.  However, arrays of "narrow" types
596     * will generally not work properly with accessors like {@link
597     * #getByte(Object, long)}, so the scale factor for such classes is reported
598     * as zero.
599     *
600     * @see #arrayBaseOffset
601     * @see #getInt(Object, long)
602     * @see #putInt(Object, long, int)
603     */
604    public native int arrayIndexScale(Class<?> arrayClass);
605
606    /** The value of {@code arrayIndexScale(boolean[].class)} */
607    public static final int ARRAY_BOOLEAN_INDEX_SCALE
608            = theUnsafe.arrayIndexScale(boolean[].class);
609
610    /** The value of {@code arrayIndexScale(byte[].class)} */
611    public static final int ARRAY_BYTE_INDEX_SCALE
612            = theUnsafe.arrayIndexScale(byte[].class);
613
614    /** The value of {@code arrayIndexScale(short[].class)} */
615    public static final int ARRAY_SHORT_INDEX_SCALE
616            = theUnsafe.arrayIndexScale(short[].class);
617
618    /** The value of {@code arrayIndexScale(char[].class)} */
619    public static final int ARRAY_CHAR_INDEX_SCALE
620            = theUnsafe.arrayIndexScale(char[].class);
621
622    /** The value of {@code arrayIndexScale(int[].class)} */
623    public static final int ARRAY_INT_INDEX_SCALE
624            = theUnsafe.arrayIndexScale(int[].class);
625
626    /** The value of {@code arrayIndexScale(long[].class)} */
627    public static final int ARRAY_LONG_INDEX_SCALE
628            = theUnsafe.arrayIndexScale(long[].class);
629
630    /** The value of {@code arrayIndexScale(float[].class)} */
631    public static final int ARRAY_FLOAT_INDEX_SCALE
632            = theUnsafe.arrayIndexScale(float[].class);
633
634    /** The value of {@code arrayIndexScale(double[].class)} */
635    public static final int ARRAY_DOUBLE_INDEX_SCALE
636            = theUnsafe.arrayIndexScale(double[].class);
637
638    /** The value of {@code arrayIndexScale(Object[].class)} */
639    public static final int ARRAY_OBJECT_INDEX_SCALE
640            = theUnsafe.arrayIndexScale(Object[].class);
641
642    /**
643     * Reports the size in bytes of a native pointer, as stored via {@link
644     * #putAddress}.  This value will be either 4 or 8.  Note that the sizes of
645     * other primitive types (as stored in native memory blocks) is determined
646     * fully by their information content.
647     */
648    public native int addressSize();
649
650    /** The value of {@code addressSize()} */
651    public static final int ADDRESS_SIZE = theUnsafe.addressSize();
652
653    /**
654     * Reports the size in bytes of a native memory page (whatever that is).
655     * This value will always be a power of two.
656     */
657    public native int pageSize();
658
659
660    /// random trusted operations from JNI:
661
662    /**
663     * Tells the VM to define a class, without security checks.  By default, the
664     * class loader and protection domain come from the caller's class.
665     */
666    public native Class<?> defineClass(String name, byte[] b, int off, int len,
667                                       ClassLoader loader,
668                                       ProtectionDomain protectionDomain);
669
670    /**
671     * Defines a class but does not make it known to the class loader or system dictionary.
672     * <p>
673     * For each CP entry, the corresponding CP patch must either be null or have
674     * the a format that matches its tag:
675     * <ul>
676     * <li>Integer, Long, Float, Double: the corresponding wrapper object type from java.lang
677     * <li>Utf8: a string (must have suitable syntax if used as signature or name)
678     * <li>Class: any java.lang.Class object
679     * <li>String: any object (not just a java.lang.String)
680     * <li>InterfaceMethodRef: (NYI) a method handle to invoke on that call site's arguments
681     * </ul>
682     * @param hostClass context for linkage, access control, protection domain, and class loader
683     * @param data      bytes of a class file
684     * @param cpPatches where non-null entries exist, they replace corresponding CP entries in data
685     */
686    public native Class<?> defineAnonymousClass(Class<?> hostClass, byte[] data, Object[] cpPatches);
687
688    /**
689     * Allocates an instance but does not run any constructor.
690     * Initializes the class if it has not yet been.
691     */
692    @HotSpotIntrinsicCandidate
693    public native Object allocateInstance(Class<?> cls)
694        throws InstantiationException;
695
696    /** Throws the exception without telling the verifier. */
697    public native void throwException(Throwable ee);
698
699    /**
700     * Atomically updates Java variable to {@code x} if it is currently
701     * holding {@code expected}.
702     *
703     * <p>This operation has memory semantics of a {@code volatile} read
704     * and write.  Corresponds to C11 atomic_compare_exchange_strong.
705     *
706     * @return {@code true} if successful
707     */
708    @HotSpotIntrinsicCandidate
709    public final native boolean compareAndSwapObject(Object o, long offset,
710                                                     Object expected,
711                                                     Object x);
712
713    /**
714     * Atomically updates Java variable to {@code x} if it is currently
715     * holding {@code expected}.
716     *
717     * <p>This operation has memory semantics of a {@code volatile} read
718     * and write.  Corresponds to C11 atomic_compare_exchange_strong.
719     *
720     * @return {@code true} if successful
721     */
722    @HotSpotIntrinsicCandidate
723    public final native boolean compareAndSwapInt(Object o, long offset,
724                                                  int expected,
725                                                  int x);
726
727    /**
728     * Atomically updates Java variable to {@code x} if it is currently
729     * holding {@code expected}.
730     *
731     * <p>This operation has memory semantics of a {@code volatile} read
732     * and write.  Corresponds to C11 atomic_compare_exchange_strong.
733     *
734     * @return {@code true} if successful
735     */
736    @HotSpotIntrinsicCandidate
737    public final native boolean compareAndSwapLong(Object o, long offset,
738                                                   long expected,
739                                                   long x);
740
741    /**
742     * Fetches a reference value from a given Java variable, with volatile
743     * load semantics. Otherwise identical to {@link #getObject(Object, long)}
744     */
745    @HotSpotIntrinsicCandidate
746    public native Object getObjectVolatile(Object o, long offset);
747
748    /**
749     * Stores a reference value into a given Java variable, with
750     * volatile store semantics. Otherwise identical to {@link #putObject(Object, long, Object)}
751     */
752    @HotSpotIntrinsicCandidate
753    public native void    putObjectVolatile(Object o, long offset, Object x);
754
755    /** Volatile version of {@link #getInt(Object, long)}  */
756    @HotSpotIntrinsicCandidate
757    public native int     getIntVolatile(Object o, long offset);
758
759    /** Volatile version of {@link #putInt(Object, long, int)}  */
760    @HotSpotIntrinsicCandidate
761    public native void    putIntVolatile(Object o, long offset, int x);
762
763    /** Volatile version of {@link #getBoolean(Object, long)}  */
764    @HotSpotIntrinsicCandidate
765    public native boolean getBooleanVolatile(Object o, long offset);
766
767    /** Volatile version of {@link #putBoolean(Object, long, boolean)}  */
768    @HotSpotIntrinsicCandidate
769    public native void    putBooleanVolatile(Object o, long offset, boolean x);
770
771    /** Volatile version of {@link #getByte(Object, long)}  */
772    @HotSpotIntrinsicCandidate
773    public native byte    getByteVolatile(Object o, long offset);
774
775    /** Volatile version of {@link #putByte(Object, long, byte)}  */
776    @HotSpotIntrinsicCandidate
777    public native void    putByteVolatile(Object o, long offset, byte x);
778
779    /** Volatile version of {@link #getShort(Object, long)}  */
780    @HotSpotIntrinsicCandidate
781    public native short   getShortVolatile(Object o, long offset);
782
783    /** Volatile version of {@link #putShort(Object, long, short)}  */
784    @HotSpotIntrinsicCandidate
785    public native void    putShortVolatile(Object o, long offset, short x);
786
787    /** Volatile version of {@link #getChar(Object, long)}  */
788    @HotSpotIntrinsicCandidate
789    public native char    getCharVolatile(Object o, long offset);
790
791    /** Volatile version of {@link #putChar(Object, long, char)}  */
792    @HotSpotIntrinsicCandidate
793    public native void    putCharVolatile(Object o, long offset, char x);
794
795    /** Volatile version of {@link #getLong(Object, long)}  */
796    @HotSpotIntrinsicCandidate
797    public native long    getLongVolatile(Object o, long offset);
798
799    /** Volatile version of {@link #putLong(Object, long, long)}  */
800    @HotSpotIntrinsicCandidate
801    public native void    putLongVolatile(Object o, long offset, long x);
802
803    /** Volatile version of {@link #getFloat(Object, long)}  */
804    @HotSpotIntrinsicCandidate
805    public native float   getFloatVolatile(Object o, long offset);
806
807    /** Volatile version of {@link #putFloat(Object, long, float)}  */
808    @HotSpotIntrinsicCandidate
809    public native void    putFloatVolatile(Object o, long offset, float x);
810
811    /** Volatile version of {@link #getDouble(Object, long)}  */
812    @HotSpotIntrinsicCandidate
813    public native double  getDoubleVolatile(Object o, long offset);
814
815    /** Volatile version of {@link #putDouble(Object, long, double)}  */
816    @HotSpotIntrinsicCandidate
817    public native void    putDoubleVolatile(Object o, long offset, double x);
818
819    /**
820     * Version of {@link #putObjectVolatile(Object, long, Object)}
821     * that does not guarantee immediate visibility of the store to
822     * other threads. This method is generally only useful if the
823     * underlying field is a Java volatile (or if an array cell, one
824     * that is otherwise only accessed using volatile accesses).
825     *
826     * Corresponds to C11 atomic_store_explicit(..., memory_order_release).
827     */
828    @HotSpotIntrinsicCandidate
829    public native void    putOrderedObject(Object o, long offset, Object x);
830
831    /** Ordered/Lazy version of {@link #putIntVolatile(Object, long, int)}  */
832    @HotSpotIntrinsicCandidate
833    public native void    putOrderedInt(Object o, long offset, int x);
834
835    /** Ordered/Lazy version of {@link #putLongVolatile(Object, long, long)} */
836    @HotSpotIntrinsicCandidate
837    public native void    putOrderedLong(Object o, long offset, long x);
838
839    /**
840     * Unblocks the given thread blocked on {@code park}, or, if it is
841     * not blocked, causes the subsequent call to {@code park} not to
842     * block.  Note: this operation is "unsafe" solely because the
843     * caller must somehow ensure that the thread has not been
844     * destroyed. Nothing special is usually required to ensure this
845     * when called from Java (in which there will ordinarily be a live
846     * reference to the thread) but this is not nearly-automatically
847     * so when calling from native code.
848     *
849     * @param thread the thread to unpark.
850     */
851    @HotSpotIntrinsicCandidate
852    public native void unpark(Object thread);
853
854    /**
855     * Blocks current thread, returning when a balancing
856     * {@code unpark} occurs, or a balancing {@code unpark} has
857     * already occurred, or the thread is interrupted, or, if not
858     * absolute and time is not zero, the given time nanoseconds have
859     * elapsed, or if absolute, the given deadline in milliseconds
860     * since Epoch has passed, or spuriously (i.e., returning for no
861     * "reason"). Note: This operation is in the Unsafe class only
862     * because {@code unpark} is, so it would be strange to place it
863     * elsewhere.
864     */
865    @HotSpotIntrinsicCandidate
866    public native void park(boolean isAbsolute, long time);
867
868    /**
869     * Gets the load average in the system run queue assigned
870     * to the available processors averaged over various periods of time.
871     * This method retrieves the given {@code nelem} samples and
872     * assigns to the elements of the given {@code loadavg} array.
873     * The system imposes a maximum of 3 samples, representing
874     * averages over the last 1,  5,  and  15 minutes, respectively.
875     *
876     * @param loadavg an array of double of size nelems
877     * @param nelems the number of samples to be retrieved and
878     *        must be 1 to 3.
879     *
880     * @return the number of samples actually retrieved; or -1
881     *         if the load average is unobtainable.
882     */
883    public native int getLoadAverage(double[] loadavg, int nelems);
884
885    // The following contain CAS-based Java implementations used on
886    // platforms not supporting native instructions
887
888    /**
889     * Atomically adds the given value to the current value of a field
890     * or array element within the given object {@code o}
891     * at the given {@code offset}.
892     *
893     * @param o object/array to update the field/element in
894     * @param offset field/element offset
895     * @param delta the value to add
896     * @return the previous value
897     * @since 1.8
898     */
899    @HotSpotIntrinsicCandidate
900    public final int getAndAddInt(Object o, long offset, int delta) {
901        int v;
902        do {
903            v = getIntVolatile(o, offset);
904        } while (!compareAndSwapInt(o, offset, v, v + delta));
905        return v;
906    }
907
908    /**
909     * Atomically adds the given value to the current value of a field
910     * or array element within the given object {@code o}
911     * at the given {@code offset}.
912     *
913     * @param o object/array to update the field/element in
914     * @param offset field/element offset
915     * @param delta the value to add
916     * @return the previous value
917     * @since 1.8
918     */
919    @HotSpotIntrinsicCandidate
920    public final long getAndAddLong(Object o, long offset, long delta) {
921        long v;
922        do {
923            v = getLongVolatile(o, offset);
924        } while (!compareAndSwapLong(o, offset, v, v + delta));
925        return v;
926    }
927
928    /**
929     * Atomically exchanges the given value with the current value of
930     * a field or array element within the given object {@code o}
931     * at the given {@code offset}.
932     *
933     * @param o object/array to update the field/element in
934     * @param offset field/element offset
935     * @param newValue new value
936     * @return the previous value
937     * @since 1.8
938     */
939    @HotSpotIntrinsicCandidate
940    public final int getAndSetInt(Object o, long offset, int newValue) {
941        int v;
942        do {
943            v = getIntVolatile(o, offset);
944        } while (!compareAndSwapInt(o, offset, v, newValue));
945        return v;
946    }
947
948    /**
949     * Atomically exchanges the given value with the current value of
950     * a field or array element within the given object {@code o}
951     * at the given {@code offset}.
952     *
953     * @param o object/array to update the field/element in
954     * @param offset field/element offset
955     * @param newValue new value
956     * @return the previous value
957     * @since 1.8
958     */
959    @HotSpotIntrinsicCandidate
960    public final long getAndSetLong(Object o, long offset, long newValue) {
961        long v;
962        do {
963            v = getLongVolatile(o, offset);
964        } while (!compareAndSwapLong(o, offset, v, newValue));
965        return v;
966    }
967
968    /**
969     * Atomically exchanges the given reference value with the current
970     * reference value of a field or array element within the given
971     * object {@code o} at the given {@code offset}.
972     *
973     * @param o object/array to update the field/element in
974     * @param offset field/element offset
975     * @param newValue new value
976     * @return the previous value
977     * @since 1.8
978     */
979    @HotSpotIntrinsicCandidate
980    public final Object getAndSetObject(Object o, long offset, Object newValue) {
981        Object v;
982        do {
983            v = getObjectVolatile(o, offset);
984        } while (!compareAndSwapObject(o, offset, v, newValue));
985        return v;
986    }
987
988
989    /**
990     * Ensures that loads before the fence will not be reordered with loads and
991     * stores after the fence; a "LoadLoad plus LoadStore barrier".
992     *
993     * Corresponds to C11 atomic_thread_fence(memory_order_acquire)
994     * (an "acquire fence").
995     *
996     * A pure LoadLoad fence is not provided, since the addition of LoadStore
997     * is almost always desired, and most current hardware instructions that
998     * provide a LoadLoad barrier also provide a LoadStore barrier for free.
999     * @since 1.8
1000     */
1001    @HotSpotIntrinsicCandidate
1002    public native void loadFence();
1003
1004    /**
1005     * Ensures that loads and stores before the fence will not be reordered with
1006     * stores after the fence; a "StoreStore plus LoadStore barrier".
1007     *
1008     * Corresponds to C11 atomic_thread_fence(memory_order_release)
1009     * (a "release fence").
1010     *
1011     * A pure StoreStore fence is not provided, since the addition of LoadStore
1012     * is almost always desired, and most current hardware instructions that
1013     * provide a StoreStore barrier also provide a LoadStore barrier for free.
1014     * @since 1.8
1015     */
1016    @HotSpotIntrinsicCandidate
1017    public native void storeFence();
1018
1019    /**
1020     * Ensures that loads and stores before the fence will not be reordered
1021     * with loads and stores after the fence.  Implies the effects of both
1022     * loadFence() and storeFence(), and in addition, the effect of a StoreLoad
1023     * barrier.
1024     *
1025     * Corresponds to C11 atomic_thread_fence(memory_order_seq_cst).
1026     * @since 1.8
1027     */
1028    @HotSpotIntrinsicCandidate
1029    public native void fullFence();
1030
1031    /**
1032     * Throws IllegalAccessError; for use by the VM for access control
1033     * error support.
1034     * @since 1.8
1035     */
1036    private static void throwIllegalAccessError() {
1037        throw new IllegalAccessError();
1038    }
1039
1040    /**
1041     * @return Returns true if the native byte ordering of this
1042     * platform is big-endian, false if it is little-endian.
1043     */
1044    public final boolean isBigEndian() { return BE; }
1045
1046    /**
1047     * @return Returns true if this platform is capable of performing
1048     * accesses at addresses which are not aligned for the type of the
1049     * primitive type being accessed, false otherwise.
1050     */
1051    public final boolean unalignedAccess() { return unalignedAccess; }
1052
1053    /**
1054     * Fetches a value at some byte offset into a given Java object.
1055     * More specifically, fetches a value within the given object
1056     * <code>o</code> at the given offset, or (if <code>o</code> is
1057     * null) from the memory address whose numerical value is the
1058     * given offset.  <p>
1059     *
1060     * The specification of this method is the same as {@link
1061     * #getLong(Object, long)} except that the offset does not need to
1062     * have been obtained from {@link #objectFieldOffset} on the
1063     * {@link java.lang.reflect.Field} of some Java field.  The value
1064     * in memory is raw data, and need not correspond to any Java
1065     * variable.  Unless <code>o</code> is null, the value accessed
1066     * must be entirely within the allocated object.  The endianness
1067     * of the value in memory is the endianness of the native platform.
1068     *
1069     * <p> The read will be atomic with respect to the largest power
1070     * of two that divides the GCD of the offset and the storage size.
1071     * For example, getLongUnaligned will make atomic reads of 2-, 4-,
1072     * or 8-byte storage units if the offset is zero mod 2, 4, or 8,
1073     * respectively.  There are no other guarantees of atomicity.
1074     * <p>
1075     * 8-byte atomicity is only guaranteed on platforms on which
1076     * support atomic accesses to longs.
1077     *
1078     * @param o Java heap object in which the value resides, if any, else
1079     *        null
1080     * @param offset The offset in bytes from the start of the object
1081     * @return the value fetched from the indicated object
1082     * @throws RuntimeException No defined exceptions are thrown, not even
1083     *         {@link NullPointerException}
1084     * @since 9
1085     */
1086    @HotSpotIntrinsicCandidate
1087    public final long getLongUnaligned(Object o, long offset) {
1088        if ((offset & 7) == 0) {
1089            return getLong(o, offset);
1090        } else if ((offset & 3) == 0) {
1091            return makeLong(getInt(o, offset),
1092                            getInt(o, offset + 4));
1093        } else if ((offset & 1) == 0) {
1094            return makeLong(getShort(o, offset),
1095                            getShort(o, offset + 2),
1096                            getShort(o, offset + 4),
1097                            getShort(o, offset + 6));
1098        } else {
1099            return makeLong(getByte(o, offset),
1100                            getByte(o, offset + 1),
1101                            getByte(o, offset + 2),
1102                            getByte(o, offset + 3),
1103                            getByte(o, offset + 4),
1104                            getByte(o, offset + 5),
1105                            getByte(o, offset + 6),
1106                            getByte(o, offset + 7));
1107        }
1108    }
1109    /**
1110     * As {@link #getLongUnaligned(Object, long)} but with an
1111     * additional argument which specifies the endianness of the value
1112     * as stored in memory.
1113     *
1114     * @param o Java heap object in which the variable resides
1115     * @param offset The offset in bytes from the start of the object
1116     * @param bigEndian The endianness of the value
1117     * @return the value fetched from the indicated object
1118     * @since 9
1119     */
1120    public final long getLongUnaligned(Object o, long offset, boolean bigEndian) {
1121        return convEndian(bigEndian, getLongUnaligned(o, offset));
1122    }
1123
1124    /** @see #getLongUnaligned(Object, long) */
1125    @HotSpotIntrinsicCandidate
1126    public final int getIntUnaligned(Object o, long offset) {
1127        if ((offset & 3) == 0) {
1128            return getInt(o, offset);
1129        } else if ((offset & 1) == 0) {
1130            return makeInt(getShort(o, offset),
1131                           getShort(o, offset + 2));
1132        } else {
1133            return makeInt(getByte(o, offset),
1134                           getByte(o, offset + 1),
1135                           getByte(o, offset + 2),
1136                           getByte(o, offset + 3));
1137        }
1138    }
1139    /** @see #getLongUnaligned(Object, long, boolean) */
1140    public final int getIntUnaligned(Object o, long offset, boolean bigEndian) {
1141        return convEndian(bigEndian, getIntUnaligned(o, offset));
1142    }
1143
1144    /** @see #getLongUnaligned(Object, long) */
1145    @HotSpotIntrinsicCandidate
1146    public final short getShortUnaligned(Object o, long offset) {
1147        if ((offset & 1) == 0) {
1148            return getShort(o, offset);
1149        } else {
1150            return makeShort(getByte(o, offset),
1151                             getByte(o, offset + 1));
1152        }
1153    }
1154    /** @see #getLongUnaligned(Object, long, boolean) */
1155    public final short getShortUnaligned(Object o, long offset, boolean bigEndian) {
1156        return convEndian(bigEndian, getShortUnaligned(o, offset));
1157    }
1158
1159    /** @see #getLongUnaligned(Object, long) */
1160    @HotSpotIntrinsicCandidate
1161    public final char getCharUnaligned(Object o, long offset) {
1162        return (char)getShortUnaligned(o, offset);
1163    }
1164
1165    /** @see #getLongUnaligned(Object, long, boolean) */
1166    public final char getCharUnaligned(Object o, long offset, boolean bigEndian) {
1167        return convEndian(bigEndian, getCharUnaligned(o, offset));
1168    }
1169
1170    /**
1171     * Stores a value at some byte offset into a given Java object.
1172     * <p>
1173     * The specification of this method is the same as {@link
1174     * #getLong(Object, long)} except that the offset does not need to
1175     * have been obtained from {@link #objectFieldOffset} on the
1176     * {@link java.lang.reflect.Field} of some Java field.  The value
1177     * in memory is raw data, and need not correspond to any Java
1178     * variable.  The endianness of the value in memory is the
1179     * endianness of the native platform.
1180     * <p>
1181     * The write will be atomic with respect to the largest power of
1182     * two that divides the GCD of the offset and the storage size.
1183     * For example, putLongUnaligned will make atomic writes of 2-, 4-,
1184     * or 8-byte storage units if the offset is zero mod 2, 4, or 8,
1185     * respectively.  There are no other guarantees of atomicity.
1186     * <p>
1187     * 8-byte atomicity is only guaranteed on platforms on which
1188     * support atomic accesses to longs.
1189     *
1190     * @param o Java heap object in which the value resides, if any, else
1191     *        null
1192     * @param offset The offset in bytes from the start of the object
1193     * @param x the value to store
1194     * @throws RuntimeException No defined exceptions are thrown, not even
1195     *         {@link NullPointerException}
1196     * @since 9
1197     */
1198    @HotSpotIntrinsicCandidate
1199    public final void putLongUnaligned(Object o, long offset, long x) {
1200        if ((offset & 7) == 0) {
1201            putLong(o, offset, x);
1202        } else if ((offset & 3) == 0) {
1203            putLongParts(o, offset,
1204                         (int)(x >> 0),
1205                         (int)(x >>> 32));
1206        } else if ((offset & 1) == 0) {
1207            putLongParts(o, offset,
1208                         (short)(x >>> 0),
1209                         (short)(x >>> 16),
1210                         (short)(x >>> 32),
1211                         (short)(x >>> 48));
1212        } else {
1213            putLongParts(o, offset,
1214                         (byte)(x >>> 0),
1215                         (byte)(x >>> 8),
1216                         (byte)(x >>> 16),
1217                         (byte)(x >>> 24),
1218                         (byte)(x >>> 32),
1219                         (byte)(x >>> 40),
1220                         (byte)(x >>> 48),
1221                         (byte)(x >>> 56));
1222        }
1223    }
1224
1225    /**
1226     * As {@link #putLongUnaligned(Object, long, long)} but with an additional
1227     * argument which specifies the endianness of the value as stored in memory.
1228     * @param o Java heap object in which the value resides
1229     * @param offset The offset in bytes from the start of the object
1230     * @param x the value to store
1231     * @param bigEndian The endianness of the value
1232     * @throws RuntimeException No defined exceptions are thrown, not even
1233     *         {@link NullPointerException}
1234     * @since 9
1235     */
1236    public final void putLongUnaligned(Object o, long offset, long x, boolean bigEndian) {
1237        putLongUnaligned(o, offset, convEndian(bigEndian, x));
1238    }
1239
1240    /** @see #putLongUnaligned(Object, long, long) */
1241    @HotSpotIntrinsicCandidate
1242    public final void putIntUnaligned(Object o, long offset, int x) {
1243        if ((offset & 3) == 0) {
1244            putInt(o, offset, x);
1245        } else if ((offset & 1) == 0) {
1246            putIntParts(o, offset,
1247                        (short)(x >> 0),
1248                        (short)(x >>> 16));
1249        } else {
1250            putIntParts(o, offset,
1251                        (byte)(x >>> 0),
1252                        (byte)(x >>> 8),
1253                        (byte)(x >>> 16),
1254                        (byte)(x >>> 24));
1255        }
1256    }
1257    /** @see #putLongUnaligned(Object, long, long, boolean) */
1258    public final void putIntUnaligned(Object o, long offset, int x, boolean bigEndian) {
1259        putIntUnaligned(o, offset, convEndian(bigEndian, x));
1260    }
1261
1262    /** @see #putLongUnaligned(Object, long, long) */
1263    @HotSpotIntrinsicCandidate
1264    public final void putShortUnaligned(Object o, long offset, short x) {
1265        if ((offset & 1) == 0) {
1266            putShort(o, offset, x);
1267        } else {
1268            putShortParts(o, offset,
1269                          (byte)(x >>> 0),
1270                          (byte)(x >>> 8));
1271        }
1272    }
1273    /** @see #putLongUnaligned(Object, long, long, boolean) */
1274    public final void putShortUnaligned(Object o, long offset, short x, boolean bigEndian) {
1275        putShortUnaligned(o, offset, convEndian(bigEndian, x));
1276    }
1277
1278    /** @see #putLongUnaligned(Object, long, long) */
1279    @HotSpotIntrinsicCandidate
1280    public final void putCharUnaligned(Object o, long offset, char x) {
1281        putShortUnaligned(o, offset, (short)x);
1282    }
1283    /** @see #putLongUnaligned(Object, long, long, boolean) */
1284    public final void putCharUnaligned(Object o, long offset, char x, boolean bigEndian) {
1285        putCharUnaligned(o, offset, convEndian(bigEndian, x));
1286    }
1287
1288    // JVM interface methods
1289    private native boolean unalignedAccess0();
1290    private native boolean isBigEndian0();
1291
1292    // BE is true iff the native endianness of this platform is big.
1293    private static final boolean BE = theUnsafe.isBigEndian0();
1294
1295    // unalignedAccess is true iff this platform can perform unaligned accesses.
1296    private static final boolean unalignedAccess = theUnsafe.unalignedAccess0();
1297
1298    private static int pickPos(int top, int pos) { return BE ? top - pos : pos; }
1299
1300    // These methods construct integers from bytes.  The byte ordering
1301    // is the native endianness of this platform.
1302    private static long makeLong(byte i0, byte i1, byte i2, byte i3, byte i4, byte i5, byte i6, byte i7) {
1303        return ((toUnsignedLong(i0) << pickPos(56, 0))
1304              | (toUnsignedLong(i1) << pickPos(56, 8))
1305              | (toUnsignedLong(i2) << pickPos(56, 16))
1306              | (toUnsignedLong(i3) << pickPos(56, 24))
1307              | (toUnsignedLong(i4) << pickPos(56, 32))
1308              | (toUnsignedLong(i5) << pickPos(56, 40))
1309              | (toUnsignedLong(i6) << pickPos(56, 48))
1310              | (toUnsignedLong(i7) << pickPos(56, 56)));
1311    }
1312    private static long makeLong(short i0, short i1, short i2, short i3) {
1313        return ((toUnsignedLong(i0) << pickPos(48, 0))
1314              | (toUnsignedLong(i1) << pickPos(48, 16))
1315              | (toUnsignedLong(i2) << pickPos(48, 32))
1316              | (toUnsignedLong(i3) << pickPos(48, 48)));
1317    }
1318    private static long makeLong(int i0, int i1) {
1319        return (toUnsignedLong(i0) << pickPos(32, 0))
1320             | (toUnsignedLong(i1) << pickPos(32, 32));
1321    }
1322    private static int makeInt(short i0, short i1) {
1323        return (toUnsignedInt(i0) << pickPos(16, 0))
1324             | (toUnsignedInt(i1) << pickPos(16, 16));
1325    }
1326    private static int makeInt(byte i0, byte i1, byte i2, byte i3) {
1327        return ((toUnsignedInt(i0) << pickPos(24, 0))
1328              | (toUnsignedInt(i1) << pickPos(24, 8))
1329              | (toUnsignedInt(i2) << pickPos(24, 16))
1330              | (toUnsignedInt(i3) << pickPos(24, 24)));
1331    }
1332    private static short makeShort(byte i0, byte i1) {
1333        return (short)((toUnsignedInt(i0) << pickPos(8, 0))
1334                     | (toUnsignedInt(i1) << pickPos(8, 8)));
1335    }
1336
1337    private static byte  pick(byte  le, byte  be) { return BE ? be : le; }
1338    private static short pick(short le, short be) { return BE ? be : le; }
1339    private static int   pick(int   le, int   be) { return BE ? be : le; }
1340
1341    // These methods write integers to memory from smaller parts
1342    // provided by their caller.  The ordering in which these parts
1343    // are written is the native endianness of this platform.
1344    private void putLongParts(Object o, long offset, byte i0, byte i1, byte i2, byte i3, byte i4, byte i5, byte i6, byte i7) {
1345        putByte(o, offset + 0, pick(i0, i7));
1346        putByte(o, offset + 1, pick(i1, i6));
1347        putByte(o, offset + 2, pick(i2, i5));
1348        putByte(o, offset + 3, pick(i3, i4));
1349        putByte(o, offset + 4, pick(i4, i3));
1350        putByte(o, offset + 5, pick(i5, i2));
1351        putByte(o, offset + 6, pick(i6, i1));
1352        putByte(o, offset + 7, pick(i7, i0));
1353    }
1354    private void putLongParts(Object o, long offset, short i0, short i1, short i2, short i3) {
1355        putShort(o, offset + 0, pick(i0, i3));
1356        putShort(o, offset + 2, pick(i1, i2));
1357        putShort(o, offset + 4, pick(i2, i1));
1358        putShort(o, offset + 6, pick(i3, i0));
1359    }
1360    private void putLongParts(Object o, long offset, int i0, int i1) {
1361        putInt(o, offset + 0, pick(i0, i1));
1362        putInt(o, offset + 4, pick(i1, i0));
1363    }
1364    private void putIntParts(Object o, long offset, short i0, short i1) {
1365        putShort(o, offset + 0, pick(i0, i1));
1366        putShort(o, offset + 2, pick(i1, i0));
1367    }
1368    private void putIntParts(Object o, long offset, byte i0, byte i1, byte i2, byte i3) {
1369        putByte(o, offset + 0, pick(i0, i3));
1370        putByte(o, offset + 1, pick(i1, i2));
1371        putByte(o, offset + 2, pick(i2, i1));
1372        putByte(o, offset + 3, pick(i3, i0));
1373    }
1374    private void putShortParts(Object o, long offset, byte i0, byte i1) {
1375        putByte(o, offset + 0, pick(i0, i1));
1376        putByte(o, offset + 1, pick(i1, i0));
1377    }
1378
1379    // Zero-extend an integer
1380    private static int toUnsignedInt(byte n)    { return n & 0xff; }
1381    private static int toUnsignedInt(short n)   { return n & 0xffff; }
1382    private static long toUnsignedLong(byte n)  { return n & 0xffl; }
1383    private static long toUnsignedLong(short n) { return n & 0xffffl; }
1384    private static long toUnsignedLong(int n)   { return n & 0xffffffffl; }
1385
1386    // Maybe byte-reverse an integer
1387    private static char convEndian(boolean big, char n)   { return big == BE ? n : Character.reverseBytes(n); }
1388    private static short convEndian(boolean big, short n) { return big == BE ? n : Short.reverseBytes(n)    ; }
1389    private static int convEndian(boolean big, int n)     { return big == BE ? n : Integer.reverseBytes(n)  ; }
1390    private static long convEndian(boolean big, long n)   { return big == BE ? n : Long.reverseBytes(n)     ; }
1391}
1392