1 33 34 35 package bsh; 36 37 class 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 try { 53 if ( kind == INCR || kind == DECR ) { 54 LHS lhs = ((BSHPrimaryExpression)node).toLHS( 55 callstack, interpreter ); 56 return lhsUnaryOperation( lhs, interpreter.getStrictJava() ); 57 } else 58 return 59 unaryOperation( node.eval(callstack, interpreter), kind ); 60 } catch ( UtilEvalError e ) { 61 throw e.toEvalError( this, callstack ); 62 } 63 } 64 65 private Object lhsUnaryOperation( LHS lhs, boolean strictJava ) 66 throws UtilEvalError 67 { 68 if ( Interpreter.DEBUG ) Interpreter.debug("lhsUnaryOperation"); 69 Object prevalue, postvalue; 70 prevalue = lhs.getValue(); 71 postvalue = unaryOperation(prevalue, kind); 72 73 Object retVal; 74 if ( postfix ) 75 retVal = prevalue; 76 else 77 retVal = postvalue; 78 79 lhs.assign( postvalue, strictJava ); 80 return retVal; 81 } 82 83 private Object unaryOperation( Object op, int kind ) throws UtilEvalError 84 { 85 if (op instanceof Boolean || op instanceof Character 86 || op instanceof Number ) 87 return primitiveWrapperUnaryOperation( op, kind ); 88 89 if ( !(op instanceof Primitive) ) 90 throw new UtilEvalError( "Unary operation " + tokenImage[kind] 91 + " inappropriate for object" ); 92 93 94 return Primitive.unaryOperation((Primitive)op, kind); 95 } 96 97 private Object primitiveWrapperUnaryOperation(Object val, int kind) 98 throws UtilEvalError 99 { 100 Class operandType = val.getClass(); 101 Object operand = Primitive.promoteToInteger(val); 102 103 if ( operand instanceof Boolean ) 104 return new Boolean ( 105 Primitive.booleanUnaryOperation((Boolean )operand, kind)); 106 else 107 if ( operand instanceof Integer ) 108 { 109 int result = Primitive.intUnaryOperation((Integer )operand, kind); 110 111 if(kind == INCR || kind == DECR) 113 { 114 if(operandType == Byte.TYPE) 115 return new Byte ((byte)result); 116 if(operandType == Short.TYPE) 117 return new Short ((short)result); 118 if(operandType == Character.TYPE) 119 return new Character ((char)result); 120 } 121 122 return new Integer (result); 123 } 124 else if(operand instanceof Long ) 125 return new Long (Primitive.longUnaryOperation((Long )operand, kind)); 126 else if(operand instanceof Float ) 127 return new Float (Primitive.floatUnaryOperation((Float )operand, kind)); 128 else if(operand instanceof Double ) 129 return new Double (Primitive.doubleUnaryOperation((Double )operand, kind)); 130 else 131 throw new InterpreterError("An error occurred. Please call technical support."); 132 } 133 } 134 | Popular Tags |