Changeset 11722
- Timestamp:
- 04/01/09 19:58:11 (14 years ago)
- Location:
- trunk/abcl/src/org/armedbear/lisp
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abcl/src/org/armedbear/lisp/Bignum.java
r11714 r11722 40 40 public final BigInteger value; 41 41 42 public static Bignum getInstance(long l) { 43 return new Bignum(l); 44 } 45 46 public Bignum(long l) 42 private static BigInteger MOST_NEGATIVE_FIXNUM = 43 BigInteger.valueOf(Integer.MIN_VALUE); 44 private static BigInteger MOST_POSITIVE_FIXNUM = 45 BigInteger.valueOf(Integer.MAX_VALUE); 46 47 public static LispInteger getInstance(long l) { 48 if (Integer.MIN_VALUE <= l && l <= Integer.MAX_VALUE) 49 return Fixnum.getInstance(l); 50 else 51 return new Bignum(l); 52 } 53 54 public static LispInteger getInstance(BigInteger n) { 55 if (MOST_NEGATIVE_FIXNUM.compareTo(n) < 0 || 56 MOST_POSITIVE_FIXNUM.compareTo(n) > 0) 57 return new Bignum(n); 58 else 59 return Fixnum.getInstance(n.intValue()); 60 } 61 62 public static LispInteger getInstance(String s, int radix) { 63 BigInteger value = new BigInteger(s, radix); 64 65 return Bignum.getInstance(value); 66 } 67 68 private Bignum(long l) 47 69 { 48 70 value = BigInteger.valueOf(l); 49 71 } 50 72 51 p ublicBignum(BigInteger n)73 private Bignum(BigInteger n) 52 74 { 53 75 value = n; 54 }55 56 public Bignum(String s, int radix)57 {58 value = new BigInteger(s, radix);59 76 } 60 77 -
trunk/abcl/src/org/armedbear/lisp/Fixnum.java
r11714 r11722 253 253 if (value >= 0) 254 254 return this; 255 if (value > Integer.MIN_VALUE) 256 return Fixnum.getInstance(-value); 257 return new Bignum(-((long)Integer.MIN_VALUE)); 255 return LispInteger.getInstance(-(long)value); 258 256 } 259 257 … … 372 370 public final LispObject incr() 373 371 { 374 if (value < Integer.MAX_VALUE) 375 return Fixnum.getInstance(value + 1); 376 return new Bignum((long) value + 1); 372 return LispInteger.getInstance(1 + (long)value); 377 373 } 378 374 … … 380 376 public final LispObject decr() 381 377 { 382 if (value > Integer.MIN_VALUE) 383 return Fixnum.getInstance(value - 1); 384 return new Bignum((long) value - 1); 378 return LispInteger.getInstance(-1 + (long)value); 385 379 } 386 380 … … 388 382 public LispObject negate() 389 383 { 390 long result = 0L - value; 391 if (result >= Integer.MIN_VALUE && result <= Integer.MAX_VALUE) 392 return Fixnum.getInstance((int)result); 393 else 394 return new Bignum(result); 384 return LispInteger.getInstance((-(long)value)); 395 385 } 396 386 … … 398 388 public LispObject add(int n) 399 389 { 400 long result = (long) value + n; 401 if (result >= Integer.MIN_VALUE && result <= Integer.MAX_VALUE) 402 return Fixnum.getInstance((int)result); 403 else 404 return new Bignum(result); 390 return LispInteger.getInstance((long) value + n); 405 391 } 406 392 … … 411 397 { 412 398 long result = (long) value + ((Fixnum)obj).value; 413 if (result >= Integer.MIN_VALUE && result <= Integer.MAX_VALUE) 414 return Fixnum.getInstance((int)result); 415 else 416 return new Bignum(result); 399 return LispInteger.getInstance(result); 417 400 } 418 401 if (obj instanceof Bignum) … … 440 423 public LispObject subtract(int n) 441 424 { 442 long result = (long) value - n; 443 if (result >= Integer.MIN_VALUE && result <= Integer.MAX_VALUE) 444 return Fixnum.getInstance((int)result); 445 else 446 return new Bignum(result); 425 return LispInteger.getInstance((long)value - n); 447 426 } 448 427 … … 479 458 { 480 459 long result = (long) value * n; 481 if (result >= Integer.MIN_VALUE && result <= Integer.MAX_VALUE) 482 return Fixnum.getInstance((int)result); 483 else 484 return new Bignum(result); 460 return LispInteger.getInstance(result); 485 461 } 486 462 … … 491 467 { 492 468 long result = (long) value * ((Fixnum)obj).value; 493 if (result >= Integer.MIN_VALUE && result <= Integer.MAX_VALUE) 494 return Fixnum.getInstance((int)result); 495 else 496 return new Bignum(result); 469 return LispInteger.getInstance(result); 497 470 } 498 471 if (obj instanceof Bignum) … … 839 812 { 840 813 n = n << shift; 841 if (n >= Integer.MIN_VALUE && n <= Integer.MAX_VALUE) 842 return Fixnum.getInstance((int)n); 843 else 844 return new Bignum(n); 814 return LispInteger.getInstance(n); 845 815 } 846 816 // BigInteger.shiftLeft() succumbs to a stack overflow if shift … … 962 932 963 933 if (y.compareTo (BigInteger.ZERO) < 0) 964 return (Fixnum.getInstance(1)).divideBy(this.pow( new Bignum(y.negate())));934 return (Fixnum.getInstance(1)).divideBy(this.pow(Bignum.getInstance(y.negate()))); 965 935 966 936 if (y.compareTo(BigInteger.ZERO) == 0) … … 988 958 } 989 959 990 return new Bignum(xy);960 return Bignum.getInstance(xy); 991 961 } 992 962 -
trunk/abcl/src/org/armedbear/lisp/FloatFunctions.java
r11714 r11722 155 155 int bits = Float.floatToIntBits(((SingleFloat)arg).value); 156 156 BigInteger big = BigInteger.valueOf(bits >> 1); 157 return new Bignum(big.shiftLeft(1).add(((bits & 1) == 1) ? BigInteger.ONE : BigInteger.ZERO));157 return Bignum.getInstance(big.shiftLeft(1).add(((bits & 1) == 1) ? BigInteger.ONE : BigInteger.ZERO)); 158 158 } 159 159 if (arg instanceof DoubleFloat) { 160 160 long bits = Double.doubleToLongBits(((DoubleFloat)arg).value); 161 161 BigInteger big = BigInteger.valueOf(bits >> 1); 162 return new Bignum(big.shiftLeft(1).add(((bits & 1) == 1) ? BigInteger.ONE : BigInteger.ZERO));162 return Bignum.getInstance(big.shiftLeft(1).add(((bits & 1) == 1) ? BigInteger.ONE : BigInteger.ZERO)); 163 163 } 164 164 return type_error(arg, Symbol.FLOAT); -
trunk/abcl/src/org/armedbear/lisp/JavaObject.java
r11691 r11722 135 135 136 136 if (obj instanceof BigInteger) 137 return new Bignum((BigInteger)obj);137 return Bignum.getInstance((BigInteger)obj); 138 138 139 139 if (obj instanceof Short) -
trunk/abcl/src/org/armedbear/lisp/Lisp.java
r11715 r11722 882 882 return Fixnum.getInstance((int)n); 883 883 else 884 return new Bignum(n);884 return Bignum.getInstance(n); 885 885 } 886 886 … … 916 916 return Fixnum.getInstance(n.intValue()); 917 917 else 918 return new Bignum(n);918 return Bignum.getInstance(n); 919 919 } 920 920 … … 1220 1220 1221 1221 public static final LispObject UNSIGNED_BYTE_32_MAX_VALUE = 1222 new Bignum(4294967296L);1222 Bignum.getInstance(4294967296L); 1223 1223 1224 1224 public static final LispObject getUpgradedArrayElementType(LispObject type) … … 2089 2089 Symbol.MOST_POSITIVE_FIXNUM.initializeConstant(Fixnum.getInstance(Integer.MAX_VALUE)); 2090 2090 Symbol.MOST_NEGATIVE_FIXNUM.initializeConstant(Fixnum.getInstance(Integer.MIN_VALUE)); 2091 Symbol.MOST_POSITIVE_JAVA_LONG.initializeConstant( new Bignum(Long.MAX_VALUE));2092 Symbol.MOST_NEGATIVE_JAVA_LONG.initializeConstant( new Bignum(Long.MIN_VALUE));2091 Symbol.MOST_POSITIVE_JAVA_LONG.initializeConstant(Bignum.getInstance(Long.MAX_VALUE)); 2092 Symbol.MOST_NEGATIVE_JAVA_LONG.initializeConstant(Bignum.getInstance(Long.MIN_VALUE)); 2093 2093 } 2094 2094 -
trunk/abcl/src/org/armedbear/lisp/LispInteger.java
r11574 r11722 44 44 return Fixnum.getInstance((int)l); 45 45 else 46 return new Bignum(l);46 return Bignum.getInstance(l); 47 47 } 48 48 -
trunk/abcl/src/org/armedbear/lisp/RuntimeClass.java
r11714 r11722 170 170 } 171 171 172 public static final BignummakeLispObject(long i) throws ConditionThrowable172 public static final LispInteger makeLispObject(long i) throws ConditionThrowable 173 173 { 174 return new Bignum(i);174 return Bignum.getInstance(i); 175 175 } 176 176 -
trunk/abcl/src/org/armedbear/lisp/Stream.java
r11714 r11722 1357 1357 try 1358 1358 { 1359 return new Bignum(token, radix);1359 return Bignum.getInstance(token, radix); 1360 1360 } 1361 1361 catch (NumberFormatException e) {} … … 1494 1494 try 1495 1495 { 1496 return new Bignum(s, radix);1496 return Bignum.getInstance(s, radix); 1497 1497 } 1498 1498 catch (NumberFormatException e) {} … … 1523 1523 try 1524 1524 { 1525 return new Bignum(s, radix);1525 return Bignum.getInstance(s, radix); 1526 1526 } 1527 1527 catch (NumberFormatException e) {} -
trunk/abcl/src/org/armedbear/lisp/compiler-pass2.lisp
r11719 r11722 2201 2201 (let ((*code* *static-code*)) 2202 2202 (declare-field g +lisp-integer+) 2203 (emit 'new +lisp-bignum-class+)2204 (emit 'dup)2205 2203 (cond ((<= most-negative-java-long n most-positive-java-long) 2206 2204 ;; (setf g (format nil "BIGNUM_~A~D" … … 2208 2206 ;; (abs n))) 2209 2207 (emit 'ldc2_w (pool-long n)) 2210 (emit-invokespecial-init +lisp-bignum-class+ '("J"))) 2208 (emit-invokestatic +lisp-bignum-class+ "getInstance" 2209 '("J") +lisp-integer+)) 2211 2210 (t 2212 2211 (let* ((*print-base* 10) … … 2214 2213 (emit 'ldc (pool-string s)) 2215 2214 (emit-push-constant-int 10) 2216 (emit-invokes pecial-init +lisp-bignum-class+2217 (list +java-string+ "I")))))2215 (emit-invokestatic +lisp-bignum-class+ "getInstance" 2216 (list +java-string+ "I") +lisp-integer+)))) 2218 2217 (emit 'putstatic *this-class* g +lisp-integer+) 2219 2218 (setf *static-code* *code*))
Note: See TracChangeset
for help on using the changeset viewer.