1 /*
   2  * Copyright (c) 2011,2012, 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 package com.apple.jobjc;
  26 import com.apple.jobjc.JObjCRuntime.Width;
  27 import javax.tools.annotation.GenerateNativeHeader;
  28 // Auto generated by PrimitiveCoder.hs
  29 // Do not edit by hand.
  30 /* No native methods here, but the constants are needed in the supporting JNI code */
  31 @GenerateNativeHeader
  32 public abstract class PrimitiveCoder<T> extends Coder<T>{
  33     public PrimitiveCoder(int ffiTypeCode, String objCEncoding, Class jclass, Class jprim){
  34         super(ffiTypeCode, objCEncoding, jclass, jprim);
  35     }
  36     public final boolean popBoolean(NativeArgumentBuffer args){
  37         return popBoolean(args.runtime, args.retValPtr);
  38     }
  39     public abstract boolean popBoolean(JObjCRuntime runtime, long addr);
  40 
  41     public final void push(NativeArgumentBuffer args, boolean x){
  42         push(args.runtime, args.argValuesPtr, x);
  43         args.didPutArgValue(sizeof());
  44     }
  45     public abstract void push(JObjCRuntime runtime, long addr, boolean x);
  46 
  47 
  48     public final byte popByte(NativeArgumentBuffer args){
  49         return popByte(args.runtime, args.retValPtr);
  50     }
  51     public abstract byte popByte(JObjCRuntime runtime, long addr);
  52 
  53     public final void push(NativeArgumentBuffer args, byte x){
  54         push(args.runtime, args.argValuesPtr, x);
  55         args.didPutArgValue(sizeof());
  56     }
  57     public abstract void push(JObjCRuntime runtime, long addr, byte x);
  58 
  59 
  60     public final char popChar(NativeArgumentBuffer args){
  61         return popChar(args.runtime, args.retValPtr);
  62     }
  63     public abstract char popChar(JObjCRuntime runtime, long addr);
  64 
  65     public final void push(NativeArgumentBuffer args, char x){
  66         push(args.runtime, args.argValuesPtr, x);
  67         args.didPutArgValue(sizeof());
  68     }
  69     public abstract void push(JObjCRuntime runtime, long addr, char x);
  70 
  71 
  72     public final short popShort(NativeArgumentBuffer args){
  73         return popShort(args.runtime, args.retValPtr);
  74     }
  75     public abstract short popShort(JObjCRuntime runtime, long addr);
  76 
  77     public final void push(NativeArgumentBuffer args, short x){
  78         push(args.runtime, args.argValuesPtr, x);
  79         args.didPutArgValue(sizeof());
  80     }
  81     public abstract void push(JObjCRuntime runtime, long addr, short x);
  82 
  83 
  84     public final int popInt(NativeArgumentBuffer args){
  85         return popInt(args.runtime, args.retValPtr);
  86     }
  87     public abstract int popInt(JObjCRuntime runtime, long addr);
  88 
  89     public final void push(NativeArgumentBuffer args, int x){
  90         push(args.runtime, args.argValuesPtr, x);
  91         args.didPutArgValue(sizeof());
  92     }
  93     public abstract void push(JObjCRuntime runtime, long addr, int x);
  94 
  95 
  96     public final long popLong(NativeArgumentBuffer args){
  97         return popLong(args.runtime, args.retValPtr);
  98     }
  99     public abstract long popLong(JObjCRuntime runtime, long addr);
 100 
 101     public final void push(NativeArgumentBuffer args, long x){
 102         push(args.runtime, args.argValuesPtr, x);
 103         args.didPutArgValue(sizeof());
 104     }
 105     public abstract void push(JObjCRuntime runtime, long addr, long x);
 106 
 107 
 108     public final float popFloat(NativeArgumentBuffer args){
 109         return popFloat(args.runtime, args.retValPtr);
 110     }
 111     public abstract float popFloat(JObjCRuntime runtime, long addr);
 112 
 113     public final void push(NativeArgumentBuffer args, float x){
 114         push(args.runtime, args.argValuesPtr, x);
 115         args.didPutArgValue(sizeof());
 116     }
 117     public abstract void push(JObjCRuntime runtime, long addr, float x);
 118 
 119 
 120     public final double popDouble(NativeArgumentBuffer args){
 121         return popDouble(args.runtime, args.retValPtr);
 122     }
 123     public abstract double popDouble(JObjCRuntime runtime, long addr);
 124 
 125     public final void push(NativeArgumentBuffer args, double x){
 126         push(args.runtime, args.argValuesPtr, x);
 127         args.didPutArgValue(sizeof());
 128     }
 129     public abstract void push(JObjCRuntime runtime, long addr, double x);
 130 
 131 
 132 // native BOOL -> java boolean
 133 /* No native methods here, but the constants are needed in the supporting JNI code */
 134 @GenerateNativeHeader
 135 public static final class BoolCoder extends PrimitiveCoder<Boolean>{
 136     public static final BoolCoder INST = new BoolCoder();
 137     public BoolCoder(){ super(FFI_SINT8, "B", Boolean.class, boolean.class); }
 138     // compile time
 139     @Override public void push(JObjCRuntime rt, long addr, boolean x){
 140         rt.unsafe.putByte(addr, (byte) (x ? 1 : 0));
 141     }
 142     @Override public boolean popBoolean(JObjCRuntime rt, long addr){
 143         return rt.unsafe.getByte(addr) != 0;
 144     }
 145     // for runtime coding
 146     @Override public int sizeof(Width w){
 147         return 1;
 148     }
 149     @Override public void push(JObjCRuntime rt, long addr, Boolean x){ push(rt, addr, (boolean) x); }
 150     @Override public Boolean pop(JObjCRuntime rt, long addr){ return popBoolean(rt, addr); }
 151     // proxies for mixed encoding
 152 
 153     @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, (x != 0)); }
 154     @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)(popBoolean(rt, addr) ? 1 : 0)); }
 155 
 156     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, (x != 0)); }
 157     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)(popBoolean(rt, addr) ? 1 : 0)); }
 158 
 159     @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, (x != 0)); }
 160     @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)(popBoolean(rt, addr) ? 1 : 0)); }
 161 
 162     @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, (x != 0)); }
 163     @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)(popBoolean(rt, addr) ? 1 : 0)); }
 164 
 165     @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, (x != 0)); }
 166     @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)(popBoolean(rt, addr) ? 1 : 0)); }
 167 
 168     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, (x != 0)); }
 169     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)(popBoolean(rt, addr) ? 1 : 0)); }
 170 
 171     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, (x != 0)); }
 172     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)(popBoolean(rt, addr) ? 1 : 0)); }
 173 
 174 
 175 }
 176 
 177 // native schar -> java byte
 178 /* No native methods here, but the constants are needed in the supporting JNI code */
 179 @GenerateNativeHeader
 180 public static final class SCharCoder extends PrimitiveCoder<Byte>{
 181     public static final SCharCoder INST = new SCharCoder();
 182     public SCharCoder(){ super(FFI_SINT8, "c", Byte.class, byte.class); }
 183     // compile time
 184     @Override public void push(JObjCRuntime rt, long addr, byte x){
 185         rt.unsafe.putByte(addr, x);
 186     }
 187     @Override public byte popByte(JObjCRuntime rt, long addr){
 188         return rt.unsafe.getByte(addr);
 189     }
 190     // for runtime coding
 191     @Override public int sizeof(Width w){
 192         return 1;
 193     }
 194     @Override public void push(JObjCRuntime rt, long addr, Byte x){ push(rt, addr, (byte) x); }
 195     @Override public Byte pop(JObjCRuntime rt, long addr){ return popByte(rt, addr); }
 196     // proxies for mixed encoding
 197     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((byte)(x ? 1 : 0))); }
 198     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popByte(rt, addr) != 0); }
 199 
 200 
 201     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((byte)x)); }
 202     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popByte(rt, addr)); }
 203 
 204     @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((byte)x)); }
 205     @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popByte(rt, addr)); }
 206 
 207     @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((byte)x)); }
 208     @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popByte(rt, addr)); }
 209 
 210     @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((byte)x)); }
 211     @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popByte(rt, addr)); }
 212 
 213     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((byte)x)); }
 214     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popByte(rt, addr)); }
 215 
 216     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((byte)x)); }
 217     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popByte(rt, addr)); }
 218 
 219 
 220 }
 221 
 222 // native uchar -> java byte
 223 /* No native methods here, but the constants are needed in the supporting JNI code */
 224 @GenerateNativeHeader
 225 public static final class UCharCoder extends PrimitiveCoder<Byte>{
 226     public static final UCharCoder INST = new UCharCoder();
 227     public UCharCoder(){ super(FFI_UINT8, "C", Byte.class, byte.class); }
 228     // compile time
 229     @Override public void push(JObjCRuntime rt, long addr, byte x){
 230         rt.unsafe.putByte(addr, x);
 231     }
 232     @Override public byte popByte(JObjCRuntime rt, long addr){
 233         return rt.unsafe.getByte(addr);
 234     }
 235     // for runtime coding
 236     @Override public int sizeof(Width w){
 237         return 1;
 238     }
 239     @Override public void push(JObjCRuntime rt, long addr, Byte x){ push(rt, addr, (byte) x); }
 240     @Override public Byte pop(JObjCRuntime rt, long addr){ return popByte(rt, addr); }
 241     // proxies for mixed encoding
 242     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((byte)(x ? 1 : 0))); }
 243     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popByte(rt, addr) != 0); }
 244 
 245 
 246     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((byte)x)); }
 247     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popByte(rt, addr)); }
 248 
 249     @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((byte)x)); }
 250     @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popByte(rt, addr)); }
 251 
 252     @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((byte)x)); }
 253     @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popByte(rt, addr)); }
 254 
 255     @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((byte)x)); }
 256     @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popByte(rt, addr)); }
 257 
 258     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((byte)x)); }
 259     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popByte(rt, addr)); }
 260 
 261     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((byte)x)); }
 262     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popByte(rt, addr)); }
 263 
 264 
 265 }
 266 
 267 // native sshort -> java short
 268 /* No native methods here, but the constants are needed in the supporting JNI code */
 269 @GenerateNativeHeader
 270 public static final class SShortCoder extends PrimitiveCoder<Short>{
 271     public static final SShortCoder INST = new SShortCoder();
 272     public SShortCoder(){ super(FFI_SINT16, "s", Short.class, short.class); }
 273     // compile time
 274     @Override public void push(JObjCRuntime rt, long addr, short x){
 275         rt.unsafe.putShort(addr, (short) x);
 276     }
 277     @Override public short popShort(JObjCRuntime rt, long addr){
 278         return rt.unsafe.getShort(addr);
 279     }
 280     // for runtime coding
 281     @Override public int sizeof(Width w){
 282         return 2;
 283     }
 284     @Override public void push(JObjCRuntime rt, long addr, Short x){ push(rt, addr, (short) x); }
 285     @Override public Short pop(JObjCRuntime rt, long addr){ return popShort(rt, addr); }
 286     // proxies for mixed encoding
 287     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((short)(x ? 1 : 0))); }
 288     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popShort(rt, addr) != 0); }
 289 
 290     @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((short)x)); }
 291     @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popShort(rt, addr)); }
 292 
 293     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((short)x)); }
 294     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popShort(rt, addr)); }
 295 
 296 
 297     @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((short)x)); }
 298     @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popShort(rt, addr)); }
 299 
 300     @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((short)x)); }
 301     @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popShort(rt, addr)); }
 302 
 303     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((short)x)); }
 304     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popShort(rt, addr)); }
 305 
 306     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((short)x)); }
 307     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popShort(rt, addr)); }
 308 
 309 
 310 }
 311 
 312 // native ushort -> java short
 313 /* No native methods here, but the constants are needed in the supporting JNI code */
 314 @GenerateNativeHeader
 315 public static final class UShortCoder extends PrimitiveCoder<Short>{
 316     public static final UShortCoder INST = new UShortCoder();
 317     public UShortCoder(){ super(FFI_UINT16, "S", Short.class, short.class); }
 318     // compile time
 319     @Override public void push(JObjCRuntime rt, long addr, short x){
 320         rt.unsafe.putShort(addr, (short) x);
 321     }
 322     @Override public short popShort(JObjCRuntime rt, long addr){
 323         return rt.unsafe.getShort(addr);
 324     }
 325     // for runtime coding
 326     @Override public int sizeof(Width w){
 327         return 2;
 328     }
 329     @Override public void push(JObjCRuntime rt, long addr, Short x){ push(rt, addr, (short) x); }
 330     @Override public Short pop(JObjCRuntime rt, long addr){ return popShort(rt, addr); }
 331     // proxies for mixed encoding
 332     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((short)(x ? 1 : 0))); }
 333     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popShort(rt, addr) != 0); }
 334 
 335     @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((short)x)); }
 336     @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popShort(rt, addr)); }
 337 
 338     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((short)x)); }
 339     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popShort(rt, addr)); }
 340 
 341 
 342     @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((short)x)); }
 343     @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popShort(rt, addr)); }
 344 
 345     @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((short)x)); }
 346     @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popShort(rt, addr)); }
 347 
 348     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((short)x)); }
 349     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popShort(rt, addr)); }
 350 
 351     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((short)x)); }
 352     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popShort(rt, addr)); }
 353 
 354 
 355 }
 356 
 357 // native sint -> java int
 358 /* No native methods here, but the constants are needed in the supporting JNI code */
 359 @GenerateNativeHeader
 360 public static final class SIntCoder extends PrimitiveCoder<Integer>{
 361     public static final SIntCoder INST = new SIntCoder();
 362     public SIntCoder(){ super(FFI_SINT32, "i", Integer.class, int.class); }
 363     // compile time
 364     @Override public void push(JObjCRuntime rt, long addr, int x){
 365         rt.unsafe.putInt(addr, (int) x);
 366     }
 367     @Override public int popInt(JObjCRuntime rt, long addr){
 368         return rt.unsafe.getInt(addr);
 369     }
 370     // for runtime coding
 371     @Override public int sizeof(Width w){
 372         return 4;
 373     }
 374     @Override public void push(JObjCRuntime rt, long addr, Integer x){ push(rt, addr, (int) x); }
 375     @Override public Integer pop(JObjCRuntime rt, long addr){ return popInt(rt, addr); }
 376     // proxies for mixed encoding
 377     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((int)(x ? 1 : 0))); }
 378     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popInt(rt, addr) != 0); }
 379 
 380     @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((int)x)); }
 381     @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popInt(rt, addr)); }
 382 
 383     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((int)x)); }
 384     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popInt(rt, addr)); }
 385 
 386     @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((int)x)); }
 387     @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popInt(rt, addr)); }
 388 
 389 
 390     @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((int)x)); }
 391     @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popInt(rt, addr)); }
 392 
 393     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((int)x)); }
 394     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popInt(rt, addr)); }
 395 
 396     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((int)x)); }
 397     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popInt(rt, addr)); }
 398 
 399 
 400 }
 401 
 402 // native uint -> java int
 403 /* No native methods here, but the constants are needed in the supporting JNI code */
 404 @GenerateNativeHeader
 405 public static final class UIntCoder extends PrimitiveCoder<Integer>{
 406     public static final UIntCoder INST = new UIntCoder();
 407     public UIntCoder(){ super(FFI_UINT32, "I", Integer.class, int.class); }
 408     // compile time
 409     @Override public void push(JObjCRuntime rt, long addr, int x){
 410         rt.unsafe.putInt(addr, (int) x);
 411     }
 412     @Override public int popInt(JObjCRuntime rt, long addr){
 413         return rt.unsafe.getInt(addr);
 414     }
 415     // for runtime coding
 416     @Override public int sizeof(Width w){
 417         return 4;
 418     }
 419     @Override public void push(JObjCRuntime rt, long addr, Integer x){ push(rt, addr, (int) x); }
 420     @Override public Integer pop(JObjCRuntime rt, long addr){ return popInt(rt, addr); }
 421     // proxies for mixed encoding
 422     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((int)(x ? 1 : 0))); }
 423     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popInt(rt, addr) != 0); }
 424 
 425     @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((int)x)); }
 426     @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popInt(rt, addr)); }
 427 
 428     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((int)x)); }
 429     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popInt(rt, addr)); }
 430 
 431     @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((int)x)); }
 432     @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popInt(rt, addr)); }
 433 
 434 
 435     @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((int)x)); }
 436     @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popInt(rt, addr)); }
 437 
 438     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((int)x)); }
 439     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popInt(rt, addr)); }
 440 
 441     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((int)x)); }
 442     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popInt(rt, addr)); }
 443 
 444 
 445 }
 446 
 447 // native slong -> java long
 448 /* No native methods here, but the constants are needed in the supporting JNI code */
 449 @GenerateNativeHeader
 450 public static final class SLongCoder extends PrimitiveCoder<Long>{
 451     public static final SLongCoder INST = new SLongCoder();
 452     public SLongCoder(){ super((JObjCRuntime.IS64 ? (FFI_SINT64) : (FFI_SINT32)), "l", Long.class, long.class); }
 453     // compile time
 454     @Override public void push(JObjCRuntime rt, long addr, long x){
 455         if(JObjCRuntime.IS64){ rt.unsafe.putLong(addr, (long) x); }else{ rt.unsafe.putInt(addr, (int) x); }
 456     }
 457     @Override public long popLong(JObjCRuntime rt, long addr){
 458         return (JObjCRuntime.IS64 ? (rt.unsafe.getLong(addr)) : (rt.unsafe.getInt(addr)));
 459     }
 460     // for runtime coding
 461     @Override public int sizeof(Width w){
 462         switch(w){
 463             case W32: return 4;
 464             case W64: return 8;
 465 
 466         default: return -1;
 467         }
 468 
 469     }
 470     @Override public void push(JObjCRuntime rt, long addr, Long x){ push(rt, addr, (long) x); }
 471     @Override public Long pop(JObjCRuntime rt, long addr){ return popLong(rt, addr); }
 472     // proxies for mixed encoding
 473     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((long)(x ? 1 : 0))); }
 474     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popLong(rt, addr) != 0); }
 475 
 476     @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((long)x)); }
 477     @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popLong(rt, addr)); }
 478 
 479     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((long)x)); }
 480     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popLong(rt, addr)); }
 481 
 482     @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((long)x)); }
 483     @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popLong(rt, addr)); }
 484 
 485     @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((long)x)); }
 486     @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popLong(rt, addr)); }
 487 
 488 
 489     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((long)x)); }
 490     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popLong(rt, addr)); }
 491 
 492     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((long)x)); }
 493     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popLong(rt, addr)); }
 494 
 495 
 496 }
 497 
 498 // native ulong -> java long
 499 /* No native methods here, but the constants are needed in the supporting JNI code */
 500 @GenerateNativeHeader
 501 public static final class ULongCoder extends PrimitiveCoder<Long>{
 502     public static final ULongCoder INST = new ULongCoder();
 503     public ULongCoder(){ super((JObjCRuntime.IS64 ? (FFI_UINT64) : (FFI_UINT32)), "L", Long.class, long.class); }
 504     // compile time
 505     @Override public void push(JObjCRuntime rt, long addr, long x){
 506         if(JObjCRuntime.IS64){ rt.unsafe.putLong(addr, (long) x); }else{ rt.unsafe.putInt(addr, (int) x); }
 507     }
 508     @Override public long popLong(JObjCRuntime rt, long addr){
 509         return (JObjCRuntime.IS64 ? (rt.unsafe.getLong(addr)) : (rt.unsafe.getInt(addr)));
 510     }
 511     // for runtime coding
 512     @Override public int sizeof(Width w){
 513         switch(w){
 514             case W32: return 4;
 515             case W64: return 8;
 516 
 517         default: return -1;
 518         }
 519 
 520     }
 521     @Override public void push(JObjCRuntime rt, long addr, Long x){ push(rt, addr, (long) x); }
 522     @Override public Long pop(JObjCRuntime rt, long addr){ return popLong(rt, addr); }
 523     // proxies for mixed encoding
 524     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((long)(x ? 1 : 0))); }
 525     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popLong(rt, addr) != 0); }
 526 
 527     @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((long)x)); }
 528     @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popLong(rt, addr)); }
 529 
 530     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((long)x)); }
 531     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popLong(rt, addr)); }
 532 
 533     @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((long)x)); }
 534     @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popLong(rt, addr)); }
 535 
 536     @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((long)x)); }
 537     @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popLong(rt, addr)); }
 538 
 539 
 540     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((long)x)); }
 541     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popLong(rt, addr)); }
 542 
 543     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((long)x)); }
 544     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popLong(rt, addr)); }
 545 
 546 
 547 }
 548 
 549 // native slonglong -> java long
 550 /* No native methods here, but the constants are needed in the supporting JNI code */
 551 @GenerateNativeHeader
 552 public static final class SLongLongCoder extends PrimitiveCoder<Long>{
 553     public static final SLongLongCoder INST = new SLongLongCoder();
 554     public SLongLongCoder(){ super(FFI_SINT64, "q", Long.class, long.class); }
 555     // compile time
 556     @Override public void push(JObjCRuntime rt, long addr, long x){
 557         rt.unsafe.putLong(addr, (long) x);
 558     }
 559     @Override public long popLong(JObjCRuntime rt, long addr){
 560         return rt.unsafe.getLong(addr);
 561     }
 562     // for runtime coding
 563     @Override public int sizeof(Width w){
 564         return 8;
 565     }
 566     @Override public void push(JObjCRuntime rt, long addr, Long x){ push(rt, addr, (long) x); }
 567     @Override public Long pop(JObjCRuntime rt, long addr){ return popLong(rt, addr); }
 568     // proxies for mixed encoding
 569     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((long)(x ? 1 : 0))); }
 570     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popLong(rt, addr) != 0); }
 571 
 572     @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((long)x)); }
 573     @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popLong(rt, addr)); }
 574 
 575     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((long)x)); }
 576     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popLong(rt, addr)); }
 577 
 578     @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((long)x)); }
 579     @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popLong(rt, addr)); }
 580 
 581     @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((long)x)); }
 582     @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popLong(rt, addr)); }
 583 
 584 
 585     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((long)x)); }
 586     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popLong(rt, addr)); }
 587 
 588     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((long)x)); }
 589     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popLong(rt, addr)); }
 590 
 591 
 592 }
 593 
 594 // native ulonglong -> java long
 595 /* No native methods here, but the constants are needed in the supporting JNI code */
 596 @GenerateNativeHeader
 597 public static final class ULongLongCoder extends PrimitiveCoder<Long>{
 598     public static final ULongLongCoder INST = new ULongLongCoder();
 599     public ULongLongCoder(){ super(FFI_UINT64, "Q", Long.class, long.class); }
 600     // compile time
 601     @Override public void push(JObjCRuntime rt, long addr, long x){
 602         rt.unsafe.putLong(addr, (long) x);
 603     }
 604     @Override public long popLong(JObjCRuntime rt, long addr){
 605         return rt.unsafe.getLong(addr);
 606     }
 607     // for runtime coding
 608     @Override public int sizeof(Width w){
 609         return 8;
 610     }
 611     @Override public void push(JObjCRuntime rt, long addr, Long x){ push(rt, addr, (long) x); }
 612     @Override public Long pop(JObjCRuntime rt, long addr){ return popLong(rt, addr); }
 613     // proxies for mixed encoding
 614     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((long)(x ? 1 : 0))); }
 615     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popLong(rt, addr) != 0); }
 616 
 617     @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((long)x)); }
 618     @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popLong(rt, addr)); }
 619 
 620     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((long)x)); }
 621     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popLong(rt, addr)); }
 622 
 623     @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((long)x)); }
 624     @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popLong(rt, addr)); }
 625 
 626     @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((long)x)); }
 627     @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popLong(rt, addr)); }
 628 
 629 
 630     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((long)x)); }
 631     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popLong(rt, addr)); }
 632 
 633     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((long)x)); }
 634     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popLong(rt, addr)); }
 635 
 636 
 637 }
 638 
 639 // native float -> java float
 640 /* No native methods here, but the constants are needed in the supporting JNI code */
 641 @GenerateNativeHeader
 642 public static final class FloatCoder extends PrimitiveCoder<Float>{
 643     public static final FloatCoder INST = new FloatCoder();
 644     public FloatCoder(){ super(FFI_FLOAT, "f", Float.class, float.class); }
 645     // compile time
 646     @Override public void push(JObjCRuntime rt, long addr, float x){
 647         rt.unsafe.putFloat(addr, (float) x);
 648     }
 649     @Override public float popFloat(JObjCRuntime rt, long addr){
 650         return rt.unsafe.getFloat(addr);
 651     }
 652     // for runtime coding
 653     @Override public int sizeof(Width w){
 654         return 4;
 655     }
 656     @Override public void push(JObjCRuntime rt, long addr, Float x){ push(rt, addr, (float) x); }
 657     @Override public Float pop(JObjCRuntime rt, long addr){ return popFloat(rt, addr); }
 658     // proxies for mixed encoding
 659     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((float)(x ? 1 : 0))); }
 660     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popFloat(rt, addr) != 0); }
 661 
 662     @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((float)x)); }
 663     @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popFloat(rt, addr)); }
 664 
 665     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((float)x)); }
 666     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popFloat(rt, addr)); }
 667 
 668     @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((float)x)); }
 669     @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popFloat(rt, addr)); }
 670 
 671     @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((float)x)); }
 672     @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popFloat(rt, addr)); }
 673 
 674     @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((float)x)); }
 675     @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popFloat(rt, addr)); }
 676 
 677 
 678     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((float)x)); }
 679     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popFloat(rt, addr)); }
 680 
 681 
 682 }
 683 
 684 // native double -> java double
 685 /* No native methods here, but the constants are needed in the supporting JNI code */
 686 @GenerateNativeHeader
 687 public static final class DoubleCoder extends PrimitiveCoder<Double>{
 688     public static final DoubleCoder INST = new DoubleCoder();
 689     public DoubleCoder(){ super(FFI_DOUBLE, "d", Double.class, double.class); }
 690     // compile time
 691     @Override public void push(JObjCRuntime rt, long addr, double x){
 692         rt.unsafe.putDouble(addr, (double) x);
 693     }
 694     @Override public double popDouble(JObjCRuntime rt, long addr){
 695         return rt.unsafe.getDouble(addr);
 696     }
 697     // for runtime coding
 698     @Override public int sizeof(Width w){
 699         return 8;
 700     }
 701     @Override public void push(JObjCRuntime rt, long addr, Double x){ push(rt, addr, (double) x); }
 702     @Override public Double pop(JObjCRuntime rt, long addr){ return popDouble(rt, addr); }
 703     // proxies for mixed encoding
 704     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((double)(x ? 1 : 0))); }
 705     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popDouble(rt, addr) != 0); }
 706 
 707     @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((double)x)); }
 708     @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popDouble(rt, addr)); }
 709 
 710     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((double)x)); }
 711     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popDouble(rt, addr)); }
 712 
 713     @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((double)x)); }
 714     @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popDouble(rt, addr)); }
 715 
 716     @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((double)x)); }
 717     @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popDouble(rt, addr)); }
 718 
 719     @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((double)x)); }
 720     @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popDouble(rt, addr)); }
 721 
 722     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((double)x)); }
 723     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popDouble(rt, addr)); }
 724 
 725 
 726 
 727 }
 728 
 729 }