src/macosx/native/jobjc/src/core/java/com/apple/jobjc/PrimitiveCoder.java

Print this page


   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);


 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)); }


 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 


 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 


 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 


 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 


 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 


 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 


 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     }


 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     }


 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 


 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 


 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 


 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 


   1 /*
   2  * Copyright (c) 2011, 2013, 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 // Auto generated by PrimitiveCoder.hs
  28 // Do not edit by hand.


  29 public abstract class PrimitiveCoder<T> extends Coder<T>{
  30     public PrimitiveCoder(int ffiTypeCode, String objCEncoding, Class jclass, Class jprim){
  31         super(ffiTypeCode, objCEncoding, jclass, jprim);
  32     }
  33     public final boolean popBoolean(NativeArgumentBuffer args){
  34         return popBoolean(args.runtime, args.retValPtr);
  35     }
  36     public abstract boolean popBoolean(JObjCRuntime runtime, long addr);
  37 
  38     public final void push(NativeArgumentBuffer args, boolean x){
  39         push(args.runtime, args.argValuesPtr, x);
  40         args.didPutArgValue(sizeof());
  41     }
  42     public abstract void push(JObjCRuntime runtime, long addr, boolean x);
  43 
  44 
  45     public final byte popByte(NativeArgumentBuffer args){
  46         return popByte(args.runtime, args.retValPtr);
  47     }
  48     public abstract byte popByte(JObjCRuntime runtime, long addr);


 110     public final void push(NativeArgumentBuffer args, float x){
 111         push(args.runtime, args.argValuesPtr, x);
 112         args.didPutArgValue(sizeof());
 113     }
 114     public abstract void push(JObjCRuntime runtime, long addr, float x);
 115 
 116 
 117     public final double popDouble(NativeArgumentBuffer args){
 118         return popDouble(args.runtime, args.retValPtr);
 119     }
 120     public abstract double popDouble(JObjCRuntime runtime, long addr);
 121 
 122     public final void push(NativeArgumentBuffer args, double x){
 123         push(args.runtime, args.argValuesPtr, x);
 124         args.didPutArgValue(sizeof());
 125     }
 126     public abstract void push(JObjCRuntime runtime, long addr, double x);
 127 
 128 
 129 // native BOOL -> java boolean


 130 public static final class BoolCoder extends PrimitiveCoder<Boolean>{
 131     public static final BoolCoder INST = new BoolCoder();
 132     public BoolCoder(){ super(FFI_SINT8, "B", Boolean.class, boolean.class); }
 133     // compile time
 134     @Override public void push(JObjCRuntime rt, long addr, boolean x){
 135         rt.unsafe.putByte(addr, (byte) (x ? 1 : 0));
 136     }
 137     @Override public boolean popBoolean(JObjCRuntime rt, long addr){
 138         return rt.unsafe.getByte(addr) != 0;
 139     }
 140     // for runtime coding
 141     @Override public int sizeof(Width w){
 142         return 1;
 143     }
 144     @Override public void push(JObjCRuntime rt, long addr, Boolean x){ push(rt, addr, (boolean) x); }
 145     @Override public Boolean pop(JObjCRuntime rt, long addr){ return popBoolean(rt, addr); }
 146     // proxies for mixed encoding
 147 
 148     @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, (x != 0)); }
 149     @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)(popBoolean(rt, addr) ? 1 : 0)); }


 153 
 154     @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, (x != 0)); }
 155     @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)(popBoolean(rt, addr) ? 1 : 0)); }
 156 
 157     @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, (x != 0)); }
 158     @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)(popBoolean(rt, addr) ? 1 : 0)); }
 159 
 160     @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, (x != 0)); }
 161     @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)(popBoolean(rt, addr) ? 1 : 0)); }
 162 
 163     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, (x != 0)); }
 164     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)(popBoolean(rt, addr) ? 1 : 0)); }
 165 
 166     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, (x != 0)); }
 167     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)(popBoolean(rt, addr) ? 1 : 0)); }
 168 
 169 
 170 }
 171 
 172 // native schar -> java byte


 173 public static final class SCharCoder extends PrimitiveCoder<Byte>{
 174     public static final SCharCoder INST = new SCharCoder();
 175     public SCharCoder(){ super(FFI_SINT8, "c", Byte.class, byte.class); }
 176     // compile time
 177     @Override public void push(JObjCRuntime rt, long addr, byte x){
 178         rt.unsafe.putByte(addr, x);
 179     }
 180     @Override public byte popByte(JObjCRuntime rt, long addr){
 181         return rt.unsafe.getByte(addr);
 182     }
 183     // for runtime coding
 184     @Override public int sizeof(Width w){
 185         return 1;
 186     }
 187     @Override public void push(JObjCRuntime rt, long addr, Byte x){ push(rt, addr, (byte) x); }
 188     @Override public Byte pop(JObjCRuntime rt, long addr){ return popByte(rt, addr); }
 189     // proxies for mixed encoding
 190     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((byte)(x ? 1 : 0))); }
 191     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popByte(rt, addr) != 0); }
 192 


 196 
 197     @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((byte)x)); }
 198     @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popByte(rt, addr)); }
 199 
 200     @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((byte)x)); }
 201     @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popByte(rt, addr)); }
 202 
 203     @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((byte)x)); }
 204     @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popByte(rt, addr)); }
 205 
 206     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((byte)x)); }
 207     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popByte(rt, addr)); }
 208 
 209     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((byte)x)); }
 210     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popByte(rt, addr)); }
 211 
 212 
 213 }
 214 
 215 // native uchar -> java byte


 216 public static final class UCharCoder extends PrimitiveCoder<Byte>{
 217     public static final UCharCoder INST = new UCharCoder();
 218     public UCharCoder(){ super(FFI_UINT8, "C", Byte.class, byte.class); }
 219     // compile time
 220     @Override public void push(JObjCRuntime rt, long addr, byte x){
 221         rt.unsafe.putByte(addr, x);
 222     }
 223     @Override public byte popByte(JObjCRuntime rt, long addr){
 224         return rt.unsafe.getByte(addr);
 225     }
 226     // for runtime coding
 227     @Override public int sizeof(Width w){
 228         return 1;
 229     }
 230     @Override public void push(JObjCRuntime rt, long addr, Byte x){ push(rt, addr, (byte) x); }
 231     @Override public Byte pop(JObjCRuntime rt, long addr){ return popByte(rt, addr); }
 232     // proxies for mixed encoding
 233     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((byte)(x ? 1 : 0))); }
 234     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popByte(rt, addr) != 0); }
 235 


 239 
 240     @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((byte)x)); }
 241     @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popByte(rt, addr)); }
 242 
 243     @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((byte)x)); }
 244     @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popByte(rt, addr)); }
 245 
 246     @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((byte)x)); }
 247     @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popByte(rt, addr)); }
 248 
 249     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((byte)x)); }
 250     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popByte(rt, addr)); }
 251 
 252     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((byte)x)); }
 253     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popByte(rt, addr)); }
 254 
 255 
 256 }
 257 
 258 // native sshort -> java short


 259 public static final class SShortCoder extends PrimitiveCoder<Short>{
 260     public static final SShortCoder INST = new SShortCoder();
 261     public SShortCoder(){ super(FFI_SINT16, "s", Short.class, short.class); }
 262     // compile time
 263     @Override public void push(JObjCRuntime rt, long addr, short x){
 264         rt.unsafe.putShort(addr, (short) x);
 265     }
 266     @Override public short popShort(JObjCRuntime rt, long addr){
 267         return rt.unsafe.getShort(addr);
 268     }
 269     // for runtime coding
 270     @Override public int sizeof(Width w){
 271         return 2;
 272     }
 273     @Override public void push(JObjCRuntime rt, long addr, Short x){ push(rt, addr, (short) x); }
 274     @Override public Short pop(JObjCRuntime rt, long addr){ return popShort(rt, addr); }
 275     // proxies for mixed encoding
 276     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((short)(x ? 1 : 0))); }
 277     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popShort(rt, addr) != 0); }
 278 


 282     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((short)x)); }
 283     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popShort(rt, addr)); }
 284 
 285 
 286     @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((short)x)); }
 287     @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popShort(rt, addr)); }
 288 
 289     @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((short)x)); }
 290     @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popShort(rt, addr)); }
 291 
 292     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((short)x)); }
 293     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popShort(rt, addr)); }
 294 
 295     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((short)x)); }
 296     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popShort(rt, addr)); }
 297 
 298 
 299 }
 300 
 301 // native ushort -> java short


 302 public static final class UShortCoder extends PrimitiveCoder<Short>{
 303     public static final UShortCoder INST = new UShortCoder();
 304     public UShortCoder(){ super(FFI_UINT16, "S", Short.class, short.class); }
 305     // compile time
 306     @Override public void push(JObjCRuntime rt, long addr, short x){
 307         rt.unsafe.putShort(addr, (short) x);
 308     }
 309     @Override public short popShort(JObjCRuntime rt, long addr){
 310         return rt.unsafe.getShort(addr);
 311     }
 312     // for runtime coding
 313     @Override public int sizeof(Width w){
 314         return 2;
 315     }
 316     @Override public void push(JObjCRuntime rt, long addr, Short x){ push(rt, addr, (short) x); }
 317     @Override public Short pop(JObjCRuntime rt, long addr){ return popShort(rt, addr); }
 318     // proxies for mixed encoding
 319     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((short)(x ? 1 : 0))); }
 320     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popShort(rt, addr) != 0); }
 321 


 325     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((short)x)); }
 326     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popShort(rt, addr)); }
 327 
 328 
 329     @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((short)x)); }
 330     @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popShort(rt, addr)); }
 331 
 332     @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((short)x)); }
 333     @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popShort(rt, addr)); }
 334 
 335     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((short)x)); }
 336     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popShort(rt, addr)); }
 337 
 338     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((short)x)); }
 339     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popShort(rt, addr)); }
 340 
 341 
 342 }
 343 
 344 // native sint -> java int


 345 public static final class SIntCoder extends PrimitiveCoder<Integer>{
 346     public static final SIntCoder INST = new SIntCoder();
 347     public SIntCoder(){ super(FFI_SINT32, "i", Integer.class, int.class); }
 348     // compile time
 349     @Override public void push(JObjCRuntime rt, long addr, int x){
 350         rt.unsafe.putInt(addr, (int) x);
 351     }
 352     @Override public int popInt(JObjCRuntime rt, long addr){
 353         return rt.unsafe.getInt(addr);
 354     }
 355     // for runtime coding
 356     @Override public int sizeof(Width w){
 357         return 4;
 358     }
 359     @Override public void push(JObjCRuntime rt, long addr, Integer x){ push(rt, addr, (int) x); }
 360     @Override public Integer pop(JObjCRuntime rt, long addr){ return popInt(rt, addr); }
 361     // proxies for mixed encoding
 362     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((int)(x ? 1 : 0))); }
 363     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popInt(rt, addr) != 0); }
 364 


 368     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((int)x)); }
 369     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popInt(rt, addr)); }
 370 
 371     @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((int)x)); }
 372     @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popInt(rt, addr)); }
 373 
 374 
 375     @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((int)x)); }
 376     @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popInt(rt, addr)); }
 377 
 378     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((int)x)); }
 379     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popInt(rt, addr)); }
 380 
 381     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((int)x)); }
 382     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popInt(rt, addr)); }
 383 
 384 
 385 }
 386 
 387 // native uint -> java int


 388 public static final class UIntCoder extends PrimitiveCoder<Integer>{
 389     public static final UIntCoder INST = new UIntCoder();
 390     public UIntCoder(){ super(FFI_UINT32, "I", Integer.class, int.class); }
 391     // compile time
 392     @Override public void push(JObjCRuntime rt, long addr, int x){
 393         rt.unsafe.putInt(addr, (int) x);
 394     }
 395     @Override public int popInt(JObjCRuntime rt, long addr){
 396         return rt.unsafe.getInt(addr);
 397     }
 398     // for runtime coding
 399     @Override public int sizeof(Width w){
 400         return 4;
 401     }
 402     @Override public void push(JObjCRuntime rt, long addr, Integer x){ push(rt, addr, (int) x); }
 403     @Override public Integer pop(JObjCRuntime rt, long addr){ return popInt(rt, addr); }
 404     // proxies for mixed encoding
 405     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((int)(x ? 1 : 0))); }
 406     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popInt(rt, addr) != 0); }
 407 


 411     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((int)x)); }
 412     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popInt(rt, addr)); }
 413 
 414     @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((int)x)); }
 415     @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popInt(rt, addr)); }
 416 
 417 
 418     @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((int)x)); }
 419     @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popInt(rt, addr)); }
 420 
 421     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((int)x)); }
 422     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popInt(rt, addr)); }
 423 
 424     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((int)x)); }
 425     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popInt(rt, addr)); }
 426 
 427 
 428 }
 429 
 430 // native slong -> java long


 431 public static final class SLongCoder extends PrimitiveCoder<Long>{
 432     public static final SLongCoder INST = new SLongCoder();
 433     public SLongCoder(){ super((JObjCRuntime.IS64 ? (FFI_SINT64) : (FFI_SINT32)), "l", Long.class, long.class); }
 434     // compile time
 435     @Override public void push(JObjCRuntime rt, long addr, long x){
 436         if(JObjCRuntime.IS64){ rt.unsafe.putLong(addr, (long) x); }else{ rt.unsafe.putInt(addr, (int) x); }
 437     }
 438     @Override public long popLong(JObjCRuntime rt, long addr){
 439         return (JObjCRuntime.IS64 ? (rt.unsafe.getLong(addr)) : (rt.unsafe.getInt(addr)));
 440     }
 441     // for runtime coding
 442     @Override public int sizeof(Width w){
 443         switch(w){
 444             case W32: return 4;
 445             case W64: return 8;
 446 
 447         default: return -1;
 448         }
 449 
 450     }


 460     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((long)x)); }
 461     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popLong(rt, addr)); }
 462 
 463     @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((long)x)); }
 464     @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popLong(rt, addr)); }
 465 
 466     @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((long)x)); }
 467     @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popLong(rt, addr)); }
 468 
 469 
 470     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((long)x)); }
 471     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popLong(rt, addr)); }
 472 
 473     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((long)x)); }
 474     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popLong(rt, addr)); }
 475 
 476 
 477 }
 478 
 479 // native ulong -> java long


 480 public static final class ULongCoder extends PrimitiveCoder<Long>{
 481     public static final ULongCoder INST = new ULongCoder();
 482     public ULongCoder(){ super((JObjCRuntime.IS64 ? (FFI_UINT64) : (FFI_UINT32)), "L", Long.class, long.class); }
 483     // compile time
 484     @Override public void push(JObjCRuntime rt, long addr, long x){
 485         if(JObjCRuntime.IS64){ rt.unsafe.putLong(addr, (long) x); }else{ rt.unsafe.putInt(addr, (int) x); }
 486     }
 487     @Override public long popLong(JObjCRuntime rt, long addr){
 488         return (JObjCRuntime.IS64 ? (rt.unsafe.getLong(addr)) : (rt.unsafe.getInt(addr)));
 489     }
 490     // for runtime coding
 491     @Override public int sizeof(Width w){
 492         switch(w){
 493             case W32: return 4;
 494             case W64: return 8;
 495 
 496         default: return -1;
 497         }
 498 
 499     }


 509     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((long)x)); }
 510     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popLong(rt, addr)); }
 511 
 512     @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((long)x)); }
 513     @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popLong(rt, addr)); }
 514 
 515     @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((long)x)); }
 516     @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popLong(rt, addr)); }
 517 
 518 
 519     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((long)x)); }
 520     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popLong(rt, addr)); }
 521 
 522     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((long)x)); }
 523     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popLong(rt, addr)); }
 524 
 525 
 526 }
 527 
 528 // native slonglong -> java long


 529 public static final class SLongLongCoder extends PrimitiveCoder<Long>{
 530     public static final SLongLongCoder INST = new SLongLongCoder();
 531     public SLongLongCoder(){ super(FFI_SINT64, "q", Long.class, long.class); }
 532     // compile time
 533     @Override public void push(JObjCRuntime rt, long addr, long x){
 534         rt.unsafe.putLong(addr, (long) x);
 535     }
 536     @Override public long popLong(JObjCRuntime rt, long addr){
 537         return rt.unsafe.getLong(addr);
 538     }
 539     // for runtime coding
 540     @Override public int sizeof(Width w){
 541         return 8;
 542     }
 543     @Override public void push(JObjCRuntime rt, long addr, Long x){ push(rt, addr, (long) x); }
 544     @Override public Long pop(JObjCRuntime rt, long addr){ return popLong(rt, addr); }
 545     // proxies for mixed encoding
 546     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((long)(x ? 1 : 0))); }
 547     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popLong(rt, addr) != 0); }
 548 


 552     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((long)x)); }
 553     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popLong(rt, addr)); }
 554 
 555     @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((long)x)); }
 556     @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popLong(rt, addr)); }
 557 
 558     @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((long)x)); }
 559     @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popLong(rt, addr)); }
 560 
 561 
 562     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((long)x)); }
 563     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popLong(rt, addr)); }
 564 
 565     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((long)x)); }
 566     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popLong(rt, addr)); }
 567 
 568 
 569 }
 570 
 571 // native ulonglong -> java long


 572 public static final class ULongLongCoder extends PrimitiveCoder<Long>{
 573     public static final ULongLongCoder INST = new ULongLongCoder();
 574     public ULongLongCoder(){ super(FFI_UINT64, "Q", Long.class, long.class); }
 575     // compile time
 576     @Override public void push(JObjCRuntime rt, long addr, long x){
 577         rt.unsafe.putLong(addr, (long) x);
 578     }
 579     @Override public long popLong(JObjCRuntime rt, long addr){
 580         return rt.unsafe.getLong(addr);
 581     }
 582     // for runtime coding
 583     @Override public int sizeof(Width w){
 584         return 8;
 585     }
 586     @Override public void push(JObjCRuntime rt, long addr, Long x){ push(rt, addr, (long) x); }
 587     @Override public Long pop(JObjCRuntime rt, long addr){ return popLong(rt, addr); }
 588     // proxies for mixed encoding
 589     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((long)(x ? 1 : 0))); }
 590     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popLong(rt, addr) != 0); }
 591 


 595     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((long)x)); }
 596     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popLong(rt, addr)); }
 597 
 598     @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((long)x)); }
 599     @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popLong(rt, addr)); }
 600 
 601     @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((long)x)); }
 602     @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popLong(rt, addr)); }
 603 
 604 
 605     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((long)x)); }
 606     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popLong(rt, addr)); }
 607 
 608     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((long)x)); }
 609     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popLong(rt, addr)); }
 610 
 611 
 612 }
 613 
 614 // native float -> java float


 615 public static final class FloatCoder extends PrimitiveCoder<Float>{
 616     public static final FloatCoder INST = new FloatCoder();
 617     public FloatCoder(){ super(FFI_FLOAT, "f", Float.class, float.class); }
 618     // compile time
 619     @Override public void push(JObjCRuntime rt, long addr, float x){
 620         rt.unsafe.putFloat(addr, (float) x);
 621     }
 622     @Override public float popFloat(JObjCRuntime rt, long addr){
 623         return rt.unsafe.getFloat(addr);
 624     }
 625     // for runtime coding
 626     @Override public int sizeof(Width w){
 627         return 4;
 628     }
 629     @Override public void push(JObjCRuntime rt, long addr, Float x){ push(rt, addr, (float) x); }
 630     @Override public Float pop(JObjCRuntime rt, long addr){ return popFloat(rt, addr); }
 631     // proxies for mixed encoding
 632     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((float)(x ? 1 : 0))); }
 633     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popFloat(rt, addr) != 0); }
 634 


 638     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((float)x)); }
 639     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popFloat(rt, addr)); }
 640 
 641     @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((float)x)); }
 642     @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popFloat(rt, addr)); }
 643 
 644     @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((float)x)); }
 645     @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popFloat(rt, addr)); }
 646 
 647     @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((float)x)); }
 648     @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popFloat(rt, addr)); }
 649 
 650 
 651     @Override public void push(JObjCRuntime rt, long addr, double x){ push(rt, addr, ((float)x)); }
 652     @Override public double popDouble(JObjCRuntime rt, long addr){ return ((double)popFloat(rt, addr)); }
 653 
 654 
 655 }
 656 
 657 // native double -> java double


 658 public static final class DoubleCoder extends PrimitiveCoder<Double>{
 659     public static final DoubleCoder INST = new DoubleCoder();
 660     public DoubleCoder(){ super(FFI_DOUBLE, "d", Double.class, double.class); }
 661     // compile time
 662     @Override public void push(JObjCRuntime rt, long addr, double x){
 663         rt.unsafe.putDouble(addr, (double) x);
 664     }
 665     @Override public double popDouble(JObjCRuntime rt, long addr){
 666         return rt.unsafe.getDouble(addr);
 667     }
 668     // for runtime coding
 669     @Override public int sizeof(Width w){
 670         return 8;
 671     }
 672     @Override public void push(JObjCRuntime rt, long addr, Double x){ push(rt, addr, (double) x); }
 673     @Override public Double pop(JObjCRuntime rt, long addr){ return popDouble(rt, addr); }
 674     // proxies for mixed encoding
 675     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((double)(x ? 1 : 0))); }
 676     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popDouble(rt, addr) != 0); }
 677