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