KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > bsh > BSHUnaryExpression


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
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 JavaDoc eval( CallStack callstack, Interpreter interpreter)
45         throws EvalError
46     {
47         SimpleNode node = (SimpleNode)jjtGetChild(0);
48
49         // If this is a unary increment of decrement (either pre or postfix)
50
// then we need an LHS to which to assign the result. Otherwise
51
// just do the unary operation for the value.
52
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 JavaDoc lhsUnaryOperation( LHS lhs, boolean strictJava )
66         throws UtilEvalError
67     {
68         if ( Interpreter.DEBUG ) Interpreter.debug("lhsUnaryOperation");
69         Object JavaDoc prevalue, postvalue;
70         prevalue = lhs.getValue();
71         postvalue = unaryOperation(prevalue, kind);
72
73         Object JavaDoc 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 JavaDoc unaryOperation( Object JavaDoc op, int kind ) throws UtilEvalError
84     {
85         if (op instanceof Boolean JavaDoc || op instanceof Character JavaDoc
86             || op instanceof Number JavaDoc)
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 JavaDoc primitiveWrapperUnaryOperation(Object JavaDoc val, int kind)
98         throws UtilEvalError
99     {
100         Class JavaDoc operandType = val.getClass();
101         Object JavaDoc operand = Primitive.promoteToInteger(val);
102
103         if ( operand instanceof Boolean JavaDoc )
104             return new Boolean JavaDoc(
105                 Primitive.booleanUnaryOperation((Boolean JavaDoc)operand, kind));
106         else
107         if ( operand instanceof Integer JavaDoc )
108         {
109             int result = Primitive.intUnaryOperation((Integer JavaDoc)operand, kind);
110
111             // ++ and -- must be cast back the original type
112
if(kind == INCR || kind == DECR)
113             {
114                 if(operandType == Byte.TYPE)
115                     return new Byte JavaDoc((byte)result);
116                 if(operandType == Short.TYPE)
117                     return new Short JavaDoc((short)result);
118                 if(operandType == Character.TYPE)
119                     return new Character JavaDoc((char)result);
120             }
121
122             return new Integer JavaDoc(result);
123         }
124         else if(operand instanceof Long JavaDoc)
125             return new Long JavaDoc(Primitive.longUnaryOperation((Long JavaDoc)operand, kind));
126         else if(operand instanceof Float JavaDoc)
127             return new Float JavaDoc(Primitive.floatUnaryOperation((Float JavaDoc)operand, kind));
128         else if(operand instanceof Double JavaDoc)
129             return new Double JavaDoc(Primitive.doubleUnaryOperation((Double JavaDoc)operand, kind));
130         else
131             throw new InterpreterError("An error occurred. Please call technical support.");
132     }
133 }
134
Popular Tags