Changeset 5976


Ignore:
Timestamp:
02/25/04 23:51:53 (17 years ago)
Author:
piso
Message:

ash()

Location:
trunk/j/src/org/armedbear/lisp
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/j/src/org/armedbear/lisp/Bignum.java

    r5477 r5976  
    33 *
    44 * Copyright (C) 2003-2004 Peter Graves
    5  * $Id: Bignum.java,v 1.51 2004-01-17 00:39:29 piso Exp $
     5 * $Id: Bignum.java,v 1.52 2004-02-25 23:51:53 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    431431    }
    432432
     433    public LispObject ash(LispObject obj) throws ConditionThrowable
     434    {
     435        BigInteger n = value;
     436        if (obj instanceof Fixnum) {
     437            int count = ((Fixnum)obj).value;
     438            if (count == 0)
     439                return this;
     440            // BigInteger.shiftLeft() succumbs to a stack overflow if count
     441            // is Integer.MIN_VALUE, so...
     442            if (count == Integer.MIN_VALUE)
     443                return n.signum() >= 0 ? Fixnum.ZERO : Fixnum.MINUS_ONE;
     444            return number(n.shiftLeft(count));
     445        }
     446        if (obj instanceof Bignum) {
     447            BigInteger count = ((Bignum)obj).value;
     448            if (count.signum() > 0)
     449                return signal(new LispError("Can't represent result of left shift."));
     450            if (count.signum() < 0)
     451                return n.signum() >= 0 ? Fixnum.ZERO : Fixnum.MINUS_ONE;
     452            Debug.bug(); // Shouldn't happen.
     453        }
     454        return signal(new TypeError(obj, Symbol.INTEGER));
     455    }
     456
    433457    public int hashCode()
    434458    {
  • trunk/j/src/org/armedbear/lisp/Fixnum.java

    r5891 r5976  
    33 *
    44 * Copyright (C) 2002-2004 Peter Graves
    5  * $Id: Fixnum.java,v 1.83 2004-02-22 19:11:07 piso Exp $
     5 * $Id: Fixnum.java,v 1.84 2004-02-25 23:51:31 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    521521    }
    522522
     523    public LispObject ash(LispObject obj) throws ConditionThrowable
     524    {
     525        if (obj instanceof Fixnum) {
     526            int count = ((Fixnum)obj).value;
     527            if (count == 0)
     528                return this;
     529            long n = value;
     530            if (n == 0)
     531                return this;
     532            if (count < -32) {
     533                // Right shift.
     534                return n >= 0 ? Fixnum.ZERO : Fixnum.MINUS_ONE;
     535            }
     536            if (count <= 32)
     537                return number(count > 0 ? (n << count) : (n >> -count));
     538            // BigInteger.shiftLeft() succumbs to a stack overflow if count
     539            // is Integer.MIN_VALUE, so...
     540            if (count == Integer.MIN_VALUE)
     541                return n >= 0 ? Fixnum.ZERO : Fixnum.MINUS_ONE;
     542            return number(BigInteger.valueOf(value).shiftLeft(count));
     543        }
     544        if (obj instanceof Bignum) {
     545            BigInteger n = BigInteger.valueOf(value);
     546            BigInteger count = ((Bignum)obj).getValue();
     547            if (count.signum() > 0)
     548                return signal(new LispError("Can't represent result of left shift."));
     549            if (count.signum() < 0)
     550                return n.signum() >= 0 ? Fixnum.ZERO : Fixnum.MINUS_ONE;
     551            Debug.bug(); // Shouldn't happen.
     552        }
     553        return signal(new TypeError(obj, Symbol.INTEGER));
     554    }
     555
    523556    public int hashCode()
    524557    {
Note: See TracChangeset for help on using the changeset viewer.