KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jdt > internal > debug > eval > ast > instructions > BinaryOperator


1 /*******************************************************************************
2  * Copyright (c) 2000, 2005 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  * IBM Corporation - initial API and implementation
10  *******************************************************************************/

11 package org.eclipse.jdt.internal.debug.eval.ast.instructions;
12
13 import org.eclipse.core.runtime.CoreException;
14 import org.eclipse.jdt.debug.core.IJavaValue;
15 import org.eclipse.jdt.debug.core.IJavaVariable;
16
17 public abstract class BinaryOperator extends CompoundInstruction {
18     protected int fResultTypeId;
19     protected int fLeftTypeId;
20     protected int fRightTypeId;
21     protected boolean fIsAssignmentOperator;
22
23     protected BinaryOperator(int resultId, int leftTypeId, int rightTypeId, boolean isAssignementOperator, int start) {
24         super(start);
25         fResultTypeId= resultId;
26         fLeftTypeId= leftTypeId;
27         fRightTypeId= rightTypeId;
28         fIsAssignmentOperator= isAssignementOperator;
29     }
30     
31     /*
32      * @see Instruction#execute()
33      */

34     final public void execute() throws CoreException {
35         if (fIsAssignmentOperator) {
36             executeAssignment();
37         } else {
38             executeBinary();
39         }
40     }
41     
42     private void executeAssignment() throws CoreException {
43         IJavaValue value = popValue();
44         IJavaVariable variable = (IJavaVariable) pop();
45         IJavaValue variableValue = (IJavaValue)variable.getValue();
46         
47         switch (fResultTypeId) {
48             case T_byte:
49                 variableValue= getByteValueResult(variableValue, value);
50                 break;
51             case T_short:
52                 variableValue= getShortValueResult(variableValue, value);
53                 break;
54             case T_char:
55                 variableValue= getCharValueResult(variableValue, value);
56                 break;
57             case T_int:
58                 variableValue= getIntValueResult(variableValue, value);
59                 break;
60             case T_long:
61                 variableValue= getLongValueResult(variableValue, value);
62                 break;
63             case T_float:
64                 variableValue= getFloatValueResult(variableValue, value);
65                 break;
66             case T_double:
67                 variableValue= getDoubleValueResult(variableValue, value);
68                 break;
69             case T_boolean:
70                 variableValue= getBooleanValueResult(variableValue, value);
71                 break;
72             case T_String:
73                 variableValue= getStringValueResult(variableValue, value);
74                 break;
75         }
76         variable.setValue(variableValue);
77         push(variableValue);
78     }
79     
80     private void executeBinary() throws CoreException {
81         IJavaValue right= popValue();
82         IJavaValue left= popValue();
83
84         switch (fResultTypeId) {
85             case T_String:
86                 pushNewValue(getStringResult(left, right));
87                 break;
88             case T_double:
89                 pushNewValue(getDoubleResult(left, right));
90                 break;
91             case T_float:
92                 pushNewValue(getFloatResult(left, right));
93                 break;
94             case T_long:
95                 pushNewValue(getLongResult(left, right));
96                 break;
97             case T_int:
98                 pushNewValue(getIntResult(left, right));
99                 break;
100             case T_boolean:
101                 pushNewValue(getBooleanResult(left, right));
102                 break;
103         }
104     }
105     
106     private IJavaValue getByteValueResult(IJavaValue leftOperand, IJavaValue rightOperand) throws CoreException {
107         switch (getInternResultType()) {
108             case T_double:
109                 return newValue((byte) getDoubleResult(leftOperand, rightOperand));
110             case T_float:
111                 return newValue((byte) getFloatResult(leftOperand, rightOperand));
112             case T_long:
113                 return newValue((byte) getLongResult(leftOperand, rightOperand));
114             case T_int:
115                 return newValue((byte) getIntResult(leftOperand, rightOperand));
116             default:
117                 return null;
118         }
119     }
120     
121     private IJavaValue getShortValueResult(IJavaValue leftOperand, IJavaValue rightOperand) throws CoreException {
122         switch (getInternResultType()) {
123             case T_double:
124                 return newValue((short) getDoubleResult(leftOperand, rightOperand));
125             case T_float:
126                 return newValue((short) getFloatResult(leftOperand, rightOperand));
127             case T_long:
128                 return newValue((short) getLongResult(leftOperand, rightOperand));
129             case T_int:
130                 return newValue((short) getIntResult(leftOperand, rightOperand));
131             default:
132                 return null;
133         }
134     }
135     
136     private IJavaValue getCharValueResult(IJavaValue leftOperand, IJavaValue rightOperand) throws CoreException {
137         switch (getInternResultType()) {
138             case T_double:
139                 return newValue((char) getDoubleResult(leftOperand, rightOperand));
140             case T_float:
141                 return newValue((char) getFloatResult(leftOperand, rightOperand));
142             case T_long:
143                 return newValue((char) getLongResult(leftOperand, rightOperand));
144             case T_int:
145                 return newValue((char) getIntResult(leftOperand, rightOperand));
146             default:
147                 return null;
148         }
149     }
150     
151     private IJavaValue getIntValueResult(IJavaValue leftOperand, IJavaValue rightOperand) throws CoreException {
152         switch (getInternResultType()) {
153             case T_double:
154                 return newValue((int) getDoubleResult(leftOperand, rightOperand));
155             case T_float:
156                 return newValue((int) getFloatResult(leftOperand, rightOperand));
157             case T_long:
158                 return newValue((int) getLongResult(leftOperand, rightOperand));
159             case T_int:
160                 return newValue(getIntResult(leftOperand, rightOperand));
161             default:
162                 return null;
163         }
164     }
165     
166     private IJavaValue getLongValueResult(IJavaValue leftOperand, IJavaValue rightOperand) throws CoreException {
167         switch (getInternResultType()) {
168             case T_double:
169                 return newValue((long) getDoubleResult(leftOperand, rightOperand));
170             case T_float:
171                 return newValue((long) getFloatResult(leftOperand, rightOperand));
172             case T_long:
173                 return newValue(getLongResult(leftOperand, rightOperand));
174             case T_int:
175                 return newValue((long) getIntResult(leftOperand, rightOperand));
176             default:
177                 return null;
178         }
179     }
180     
181     private IJavaValue getFloatValueResult(IJavaValue leftOperand, IJavaValue rightOperand) throws CoreException {
182         switch (getInternResultType()) {
183             case T_double:
184                 return newValue((float) getDoubleResult(leftOperand, rightOperand));
185             case T_float:
186                 return newValue(getFloatResult(leftOperand, rightOperand));
187             case T_long:
188                 return newValue((float) getLongResult(leftOperand, rightOperand));
189             case T_int:
190                 return newValue((float) getIntResult(leftOperand, rightOperand));
191             default:
192                 return null;
193         }
194     }
195     
196     private IJavaValue getDoubleValueResult(IJavaValue leftOperand, IJavaValue rightOperand) throws CoreException {
197         switch (getInternResultType()) {
198             case T_double:
199                 return newValue(getDoubleResult(leftOperand, rightOperand));
200             case T_float:
201                 return newValue((double) getFloatResult(leftOperand, rightOperand));
202             case T_long:
203                 return newValue((double) getLongResult(leftOperand, rightOperand));
204             case T_int:
205                 return newValue((double) getIntResult(leftOperand, rightOperand));
206             default:
207                 return null;
208         }
209     }
210     
211     private IJavaValue getBooleanValueResult(IJavaValue leftOperand, IJavaValue rightOperand) {
212         return newValue(getBooleanResult(leftOperand, rightOperand));
213     }
214     
215     private IJavaValue getStringValueResult(IJavaValue leftOperand, IJavaValue rightOperand) throws CoreException {
216         return newValue(getStringResult(leftOperand, rightOperand));
217     }
218     
219     protected abstract int getIntResult(IJavaValue leftOperand, IJavaValue rightOperand) throws CoreException;
220     
221     protected abstract long getLongResult(IJavaValue leftOperand, IJavaValue rightOperand) throws CoreException;
222
223     protected abstract float getFloatResult(IJavaValue leftOperand, IJavaValue rightOperand);
224
225     protected abstract double getDoubleResult(IJavaValue leftOperand, IJavaValue rightOperand);
226
227     protected abstract boolean getBooleanResult(IJavaValue leftOperand, IJavaValue rightOperand);
228
229     protected abstract String JavaDoc getStringResult(IJavaValue leftOperand, IJavaValue rightOperand) throws CoreException;
230
231     protected int getInternResultType() {
232         return getBinaryPromotionType(fLeftTypeId, fRightTypeId);
233     }
234
235 }
236
Popular Tags