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);
  49 
  50     public final void push(NativeArgumentBuffer args, byte x){
  51         push(args.runtime, args.argValuesPtr, x);
  52         args.didPutArgValue(sizeof());
  53     }
  54     public abstract void push(JObjCRuntime runtime, long addr, byte x);
  55 
  56 
  57     public final char popChar(NativeArgumentBuffer args){
  58         return popChar(args.runtime, args.retValPtr);
  59     }
  60     public abstract char popChar(JObjCRuntime runtime, long addr);
  61 
  62     public final void push(NativeArgumentBuffer args, char x){
  63         push(args.runtime, args.argValuesPtr, x);
  64         args.didPutArgValue(sizeof());
  65     }
  66     public abstract void push(JObjCRuntime runtime, long addr, char x);
  67 
  68 
  69     public final short popShort(NativeArgumentBuffer args){
  70         return popShort(args.runtime, args.retValPtr);
  71     }
  72     public abstract short popShort(JObjCRuntime runtime, long addr);
  73 
  74     public final void push(NativeArgumentBuffer args, short x){
  75         push(args.runtime, args.argValuesPtr, x);
  76         args.didPutArgValue(sizeof());
  77     }
  78     public abstract void push(JObjCRuntime runtime, long addr, short x);
  79 
  80 
  81     public final int popInt(NativeArgumentBuffer args){
  82         return popInt(args.runtime, args.retValPtr);
  83     }
  84     public abstract int popInt(JObjCRuntime runtime, long addr);
  85 
  86     public final void push(NativeArgumentBuffer args, int x){
  87         push(args.runtime, args.argValuesPtr, x);
  88         args.didPutArgValue(sizeof());
  89     }
  90     public abstract void push(JObjCRuntime runtime, long addr, int x);
  91 
  92 
  93     public final long popLong(NativeArgumentBuffer args){
  94         return popLong(args.runtime, args.retValPtr);
  95     }
  96     public abstract long popLong(JObjCRuntime runtime, long addr);
  97 
  98     public final void push(NativeArgumentBuffer args, long x){
  99         push(args.runtime, args.argValuesPtr, x);
 100         args.didPutArgValue(sizeof());
 101     }
 102     public abstract void push(JObjCRuntime runtime, long addr, long x);
 103 
 104 
 105     public final float popFloat(NativeArgumentBuffer args){
 106         return popFloat(args.runtime, args.retValPtr);
 107     }
 108     public abstract float popFloat(JObjCRuntime runtime, long addr);
 109 
 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)); }
 150 
 151     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, (x != 0)); }
 152     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)(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 
 193 
 194     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((byte)x)); }
 195     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popByte(rt, addr)); }
 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 
 236 
 237     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((byte)x)); }
 238     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popByte(rt, addr)); }
 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 
 279     @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((short)x)); }
 280     @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popShort(rt, addr)); }
 281 
 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 
 322     @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((short)x)); }
 323     @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popShort(rt, addr)); }
 324 
 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 
 365     @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((int)x)); }
 366     @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popInt(rt, addr)); }
 367 
 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 
 408     @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((int)x)); }
 409     @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popInt(rt, addr)); }
 410 
 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     }
 451     @Override public void push(JObjCRuntime rt, long addr, Long x){ push(rt, addr, (long) x); }
 452     @Override public Long pop(JObjCRuntime rt, long addr){ return popLong(rt, addr); }
 453     // proxies for mixed encoding
 454     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((long)(x ? 1 : 0))); }
 455     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popLong(rt, addr) != 0); }
 456 
 457     @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((long)x)); }
 458     @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popLong(rt, addr)); }
 459 
 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     }
 500     @Override public void push(JObjCRuntime rt, long addr, Long x){ push(rt, addr, (long) x); }
 501     @Override public Long pop(JObjCRuntime rt, long addr){ return popLong(rt, addr); }
 502     // proxies for mixed encoding
 503     @Override public void push(JObjCRuntime rt, long addr, boolean x){ push(rt, addr, ((long)(x ? 1 : 0))); }
 504     @Override public boolean popBoolean(JObjCRuntime rt, long addr){ return (popLong(rt, addr) != 0); }
 505 
 506     @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((long)x)); }
 507     @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popLong(rt, addr)); }
 508 
 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 
 549     @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((long)x)); }
 550     @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popLong(rt, addr)); }
 551 
 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 
 592     @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((long)x)); }
 593     @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popLong(rt, addr)); }
 594 
 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 
 635     @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((float)x)); }
 636     @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popFloat(rt, addr)); }
 637 
 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 
 678     @Override public void push(JObjCRuntime rt, long addr, byte x){ push(rt, addr, ((double)x)); }
 679     @Override public byte popByte(JObjCRuntime rt, long addr){ return ((byte)popDouble(rt, addr)); }
 680 
 681     @Override public void push(JObjCRuntime rt, long addr, char x){ push(rt, addr, ((double)x)); }
 682     @Override public char popChar(JObjCRuntime rt, long addr){ return ((char)popDouble(rt, addr)); }
 683 
 684     @Override public void push(JObjCRuntime rt, long addr, short x){ push(rt, addr, ((double)x)); }
 685     @Override public short popShort(JObjCRuntime rt, long addr){ return ((short)popDouble(rt, addr)); }
 686 
 687     @Override public void push(JObjCRuntime rt, long addr, int x){ push(rt, addr, ((double)x)); }
 688     @Override public int popInt(JObjCRuntime rt, long addr){ return ((int)popDouble(rt, addr)); }
 689 
 690     @Override public void push(JObjCRuntime rt, long addr, long x){ push(rt, addr, ((double)x)); }
 691     @Override public long popLong(JObjCRuntime rt, long addr){ return ((long)popDouble(rt, addr)); }
 692 
 693     @Override public void push(JObjCRuntime rt, long addr, float x){ push(rt, addr, ((double)x)); }
 694     @Override public float popFloat(JObjCRuntime rt, long addr){ return ((float)popDouble(rt, addr)); }
 695 
 696 
 697 
 698 }
 699 
 700 }