PageRenderTime 48ms CodeModel.GetById 38ms app.highlight 7ms RepoModel.GetById 1ms app.codeStats 0ms

/jEdit/tags/jedit-4-0-pre5/bsh/BSHUnaryExpression.java

#
Java | 120 lines | 71 code | 16 blank | 33 comment | 25 complexity | 6f6afc97d2dd3281025c795580dc5d9e MD5 | raw file
  1/*****************************************************************************
  2 *                                                                           *
  3 *  This file is part of the BeanShell Java Scripting distribution.          *
  4 *  Documentation and updates may be found at http://www.beanshell.org/      *
  5 *                                                                           *
  6 *  Sun Public License Notice:                                               *
  7 *                                                                           *
  8 *  The contents of this file are subject to the Sun Public License Version  *
  9 *  1.0 (the "License"); you may not use this file except in compliance with *
 10 *  the License. A copy of the License is available at http://www.sun.com    * 
 11 *                                                                           *
 12 *  The Original Code is BeanShell. The Initial Developer of the Original    *
 13 *  Code is Pat Niemeyer. Portions created by Pat Niemeyer are Copyright     *
 14 *  (C) 2000.  All Rights Reserved.                                          *
 15 *                                                                           *
 16 *  GNU Public License Notice:                                               *
 17 *                                                                           *
 18 *  Alternatively, the contents of this file may be used under the terms of  *
 19 *  the GNU Lesser General Public License (the "LGPL"), in which case the    *
 20 *  provisions of LGPL are applicable instead of those above. If you wish to *
 21 *  allow use of your version of this file only under the  terms of the LGPL *
 22 *  and not to allow others to use your version of this file under the SPL,  *
 23 *  indicate your decision by deleting the provisions above and replace      *
 24 *  them with the notice and other provisions required by the LGPL.  If you  *
 25 *  do not delete the provisions above, a recipient may use your version of  *
 26 *  this file under either the SPL or the LGPL.                              *
 27 *                                                                           *
 28 *  Patrick Niemeyer (pat@pat.net)                                           *
 29 *  Author of Learning Java, O'Reilly & Associates                           *
 30 *  http://www.pat.net/~pat/                                                 *
 31 *                                                                           *
 32 *****************************************************************************/
 33
 34
 35package bsh;
 36
 37class BSHUnaryExpression extends SimpleNode implements ParserConstants
 38{
 39    public int kind;
 40	public boolean postfix = false;
 41
 42    BSHUnaryExpression(int id) { super(id); }
 43
 44    public Object eval( CallStack callstack, Interpreter interpreter)  
 45		throws EvalError
 46    {
 47        SimpleNode node = (SimpleNode)jjtGetChild(0);
 48
 49        if(node instanceof BSHLHSPrimaryExpression)
 50            return lhsUnaryOperation(
 51				((BSHLHSPrimaryExpression)node).toLHS(callstack, interpreter));
 52        else
 53            return unaryOperation(node.eval(callstack, interpreter), kind);
 54    }
 55
 56    private Object lhsUnaryOperation(LHS lhs) throws EvalError
 57    {
 58        Interpreter.debug("lhsUnaryOperation");
 59        Object prevalue, postvalue;
 60        prevalue = lhs.getValue();
 61        postvalue = unaryOperation(prevalue, kind);
 62
 63		Object retVal;
 64		if ( postfix )
 65			retVal = prevalue;
 66		else
 67			retVal = postvalue;
 68
 69		lhs.assign(postvalue);
 70		return retVal;
 71    }
 72
 73    private Object unaryOperation(Object op, int kind) throws EvalError
 74    {
 75        if(op instanceof Boolean || op instanceof Character || op instanceof Number)
 76            return primitiveWrapperUnaryOperation(op, kind);
 77
 78        if(!(op instanceof Primitive))
 79            throw new EvalError("Unary operation " + tokenImage[kind]
 80                + " inappropriate for object", this);
 81
 82        return Primitive.unaryOperation((Primitive)op, kind);
 83    }
 84
 85    private Object primitiveWrapperUnaryOperation(Object val, int kind)
 86        throws EvalError
 87    {
 88        Class operandType = val.getClass();
 89        Object operand = Primitive.promoteToInteger(val);
 90
 91        if(operand instanceof Boolean)
 92            return new Boolean(
 93				Primitive.booleanUnaryOperation((Boolean)operand, kind));
 94        else if(operand instanceof Integer)
 95        {
 96            int result = Primitive.intUnaryOperation((Integer)operand, kind);
 97
 98            // ++ and -- must be cast back the original type
 99            if(kind == INCR || kind == DECR)
100            {
101                if(operandType == Byte.TYPE)
102                    return new Byte((byte)result);
103                if(operandType == Short.TYPE)
104                    return new Short((short)result);
105                if(operandType == Character.TYPE)
106                    return new Character((char)result);
107            }
108
109            return new Integer(result);
110        }
111        else if(operand instanceof Long)
112            return new Long(Primitive.longUnaryOperation((Long)operand, kind));
113        else if(operand instanceof Float)
114            return new Float(Primitive.floatUnaryOperation((Float)operand, kind));
115        else if(operand instanceof Double)
116            return new Double(Primitive.doubleUnaryOperation((Double)operand, kind));
117        else
118            throw new InterpreterError("An error occurred.  Please call technical support.");
119    }
120}