1 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 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 getStringResult(IJavaValue leftOperand, IJavaValue rightOperand) throws CoreException; 230 231 protected int getInternResultType() { 232 return getBinaryPromotionType(fLeftTypeId, fRightTypeId); 233 } 234 235 } 236 | Popular Tags |