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 }