/** * * This file is a part of ZOOLA - an extensible BeanShell implementation. * Zoola is based on original BeanShell code created by Pat Niemeyer. * * Original BeanShell code is Copyright (C) 2000 Pat Niemeyer <pat@pat.net>. * * New portions are Copyright 2012 Rafal Lewczuk <rafal.lewczuk@jitlogic.com> * * This is free software. You can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * This software is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with ZOOLA. If not, see <http://www.gnu.org/licenses/>. * */ package bsh.ast; import bsh.*; public class BSHUnaryExpression extends SimpleNode implements ParserConstants { public int kind; public boolean postfix = false; public BSHUnaryExpression(int id) { super(id); } public Object lhsUnaryOperation( LHS lhs, boolean strictJava ) throws UtilEvalError { if ( Interpreter.DEBUG ) Interpreter.debug("lhsUnaryOperation"); Object prevalue, postvalue; prevalue = lhs.getValue(); postvalue = unaryOperation(prevalue, kind); Object retVal; if ( postfix ) retVal = prevalue; else retVal = postvalue; lhs.assign( postvalue, strictJava ); return retVal; } public Object unaryOperation( Object op, int kind ) throws UtilEvalError { if (op instanceof Boolean || op instanceof Character || op instanceof Number) return primitiveWrapperUnaryOperation( op, kind ); if ( !(op instanceof Primitive) ) throw new UtilEvalError( "Unary operation " + tokenImage[kind] + " inappropriate for object" ); return Primitive.unaryOperation((Primitive)op, kind); } private Object primitiveWrapperUnaryOperation(Object val, int kind) throws UtilEvalError { Class operandType = val.getClass(); Object operand = Primitive.promoteToInteger(val); if ( operand instanceof Boolean ) return new Boolean( Primitive.booleanUnaryOperation((Boolean)operand, kind)); else if ( operand instanceof Integer ) { int result = Primitive.intUnaryOperation((Integer)operand, kind); // ++ and -- must be cast back the original type if(kind == INCR || kind == DECR) { if(operandType == Byte.TYPE) return new Byte((byte)result); if(operandType == Short.TYPE) return new Short((short)result); if(operandType == Character.TYPE) return new Character((char)result); } return new Integer(result); } else if(operand instanceof Long) return new Long(Primitive.longUnaryOperation((Long)operand, kind)); else if(operand instanceof Float) return new Float(Primitive.floatUnaryOperation((Float)operand, kind)); else if(operand instanceof Double) return new Double(Primitive.doubleUnaryOperation((Double)operand, kind)); else throw new InterpreterError("An error occurred. Please call technical support."); } public <T> T accept(BshNodeVisitor<T> visitor) { return visitor.visit(this); } }