Changeset 39961 in webkit for trunk/JavaScriptCore/parser
- Timestamp:
- Jan 15, 2009, 10:52:13 PM (16 years ago)
- Location:
- trunk/JavaScriptCore/parser
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/parser/Nodes.cpp
r39910 r39961 1301 1301 if (generator.isLocalConstant(m_ident)) { 1302 1302 RegisterID* src2 = generator.emitNode(m_right.get()); 1303 return emitReadModifyAssignment(generator, generator.finalDestination(dst), local, src2, m_operator, OperandTypes(ResultType::unknown (), m_right->resultDescriptor()));1303 return emitReadModifyAssignment(generator, generator.finalDestination(dst), local, src2, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); 1304 1304 } 1305 1305 … … 1308 1308 generator.emitMove(result.get(), local); 1309 1309 RegisterID* src2 = generator.emitNode(m_right.get()); 1310 emitReadModifyAssignment(generator, result.get(), result.get(), src2, m_operator, OperandTypes(ResultType::unknown (), m_right->resultDescriptor()));1310 emitReadModifyAssignment(generator, result.get(), result.get(), src2, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); 1311 1311 generator.emitMove(local, result.get()); 1312 1312 return generator.moveToDestinationIfNeeded(dst, result.get()); … … 1314 1314 1315 1315 RegisterID* src2 = generator.emitNode(m_right.get()); 1316 RegisterID* result = emitReadModifyAssignment(generator, local, local, src2, m_operator, OperandTypes(ResultType::unknown (), m_right->resultDescriptor()));1316 RegisterID* result = emitReadModifyAssignment(generator, local, local, src2, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); 1317 1317 return generator.moveToDestinationIfNeeded(dst, result); 1318 1318 } … … 1324 1324 RefPtr<RegisterID> src1 = generator.emitGetScopedVar(generator.tempDestination(dst), depth, index, globalObject); 1325 1325 RegisterID* src2 = generator.emitNode(m_right.get()); 1326 RegisterID* result = emitReadModifyAssignment(generator, generator.finalDestination(dst, src1.get()), src1.get(), src2, m_operator, OperandTypes(ResultType::unknown (), m_right->resultDescriptor()));1326 RegisterID* result = emitReadModifyAssignment(generator, generator.finalDestination(dst, src1.get()), src1.get(), src2, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); 1327 1327 generator.emitPutScopedVar(depth, index, result, globalObject); 1328 1328 return result; … … 1334 1334 RegisterID* src2 = generator.emitNode(m_right.get()); 1335 1335 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 1336 RegisterID* result = emitReadModifyAssignment(generator, generator.finalDestination(dst, src1.get()), src1.get(), src2, m_operator, OperandTypes(ResultType::unknown (), m_right->resultDescriptor()));1336 RegisterID* result = emitReadModifyAssignment(generator, generator.finalDestination(dst, src1.get()), src1.get(), src2, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); 1337 1337 return generator.emitPutById(base.get(), m_ident, result); 1338 1338 } … … 1422 1422 RefPtr<RegisterID> value = generator.emitGetById(generator.tempDestination(dst), base.get(), m_ident); 1423 1423 RegisterID* change = generator.emitNode(m_right.get()); 1424 RegisterID* updatedValue = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), change, m_operator, OperandTypes(ResultType::unknown (), m_right->resultDescriptor()));1424 RegisterID* updatedValue = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), change, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); 1425 1425 1426 1426 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); … … 1494 1494 RefPtr<RegisterID> value = generator.emitGetByVal(generator.tempDestination(dst), base.get(), property.get()); 1495 1495 RegisterID* change = generator.emitNode(m_right.get()); 1496 RegisterID* updatedValue = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), change, m_operator, OperandTypes(ResultType::unknown (), m_right->resultDescriptor()));1496 RegisterID* updatedValue = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), change, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); 1497 1497 1498 1498 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); -
trunk/JavaScriptCore/parser/Nodes.h
r39951 r39961 157 157 class ExpressionNode : public Node { 158 158 public: 159 ExpressionNode(JSGlobalData* globalData, ResultType resultDesc = ResultType::unknown ()) JSC_FAST_CALL159 ExpressionNode(JSGlobalData* globalData, ResultType resultDesc = ResultType::unknownType()) JSC_FAST_CALL 160 160 : Node(globalData) 161 161 , m_resultDesc(resultDesc) … … 217 217 public: 218 218 BooleanNode(JSGlobalData* globalData, bool value) JSC_FAST_CALL 219 : ExpressionNode(globalData, ResultType::boolean ())219 : ExpressionNode(globalData, ResultType::booleanType()) 220 220 , m_value(value) 221 221 { … … 233 233 public: 234 234 NumberNode(JSGlobalData* globalData, double v) JSC_FAST_CALL 235 : ExpressionNode(globalData, ResultType:: constNumber())235 : ExpressionNode(globalData, ResultType::numberType()) 236 236 , m_double(v) 237 237 { … … 252 252 public: 253 253 StringNode(JSGlobalData* globalData, const Identifier& v) JSC_FAST_CALL 254 : ExpressionNode(globalData, ResultType::string ())254 : ExpressionNode(globalData, ResultType::stringType()) 255 255 , m_value(v) 256 256 { … … 774 774 public: 775 775 PrePostResolveNode(JSGlobalData* globalData, const Identifier& ident, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL 776 : ExpressionNode(globalData, ResultType:: constNumber()) // could be reusable for pre?776 : ExpressionNode(globalData, ResultType::numberType()) // could be reusable for pre? 777 777 , ThrowableExpressionData(divot, startOffset, endOffset) 778 778 , m_ident(ident) … … 954 954 public: 955 955 TypeOfResolveNode(JSGlobalData* globalData, const Identifier& ident) JSC_FAST_CALL 956 : ExpressionNode(globalData, ResultType::string ())956 : ExpressionNode(globalData, ResultType::stringType()) 957 957 , m_ident(ident) 958 958 { … … 970 970 public: 971 971 TypeOfValueNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL 972 : ExpressionNode(globalData, ResultType::string ())972 : ExpressionNode(globalData, ResultType::stringType()) 973 973 , m_expr(expr) 974 974 { … … 1089 1089 public: 1090 1090 UnaryPlusNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL 1091 : UnaryOpNode(globalData, ResultType:: constNumber(), expr)1091 : UnaryOpNode(globalData, ResultType::numberType(), expr) 1092 1092 { 1093 1093 } … … 1101 1101 public: 1102 1102 NegateNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL 1103 : UnaryOpNode(globalData, ResultType:: reusableNumber(), expr)1103 : UnaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr) 1104 1104 { 1105 1105 } … … 1111 1111 public: 1112 1112 BitwiseNotNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL 1113 : UnaryOpNode(globalData, ResultType:: reusableNumber(), expr)1113 : UnaryOpNode(globalData, ResultType::forBitOp(), expr) 1114 1114 { 1115 1115 } … … 1121 1121 public: 1122 1122 LogicalNotNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL 1123 : UnaryOpNode(globalData, ResultType::boolean (), expr)1123 : UnaryOpNode(globalData, ResultType::booleanType(), expr) 1124 1124 { 1125 1125 } … … 1176 1176 public: 1177 1177 MultNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL 1178 : BinaryOpNode(globalData, ResultType:: reusableNumber(), expr1, expr2, rightHasAssignments)1178 : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, rightHasAssignments) 1179 1179 { 1180 1180 } … … 1186 1186 public: 1187 1187 DivNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL 1188 : BinaryOpNode(globalData, ResultType:: reusableNumber(), expr1, expr2, rightHasAssignments)1188 : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, rightHasAssignments) 1189 1189 { 1190 1190 } … … 1196 1196 public: 1197 1197 ModNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL 1198 : BinaryOpNode(globalData, ResultType:: reusableNumber(), expr1, expr2, rightHasAssignments)1198 : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, rightHasAssignments) 1199 1199 { 1200 1200 } … … 1216 1216 public: 1217 1217 SubNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL 1218 : BinaryOpNode(globalData, ResultType:: reusableNumber(), expr1, expr2, rightHasAssignments)1218 : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, rightHasAssignments) 1219 1219 { 1220 1220 } … … 1226 1226 public: 1227 1227 LeftShiftNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL 1228 : BinaryOpNode(globalData, ResultType:: reusableNumber(), expr1, expr2, rightHasAssignments)1228 : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, rightHasAssignments) 1229 1229 { 1230 1230 } … … 1236 1236 public: 1237 1237 RightShiftNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL 1238 : BinaryOpNode(globalData, ResultType:: reusableNumber(), expr1, expr2, rightHasAssignments)1238 : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, rightHasAssignments) 1239 1239 { 1240 1240 } … … 1246 1246 public: 1247 1247 UnsignedRightShiftNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL 1248 : BinaryOpNode(globalData, ResultType:: reusableNumber(), expr1, expr2, rightHasAssignments)1248 : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, rightHasAssignments) 1249 1249 { 1250 1250 } … … 1256 1256 public: 1257 1257 LessNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL 1258 : BinaryOpNode(globalData, ResultType::boolean (), expr1, expr2, rightHasAssignments)1258 : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments) 1259 1259 { 1260 1260 } … … 1266 1266 public: 1267 1267 GreaterNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL 1268 : ReverseBinaryOpNode(globalData, ResultType::boolean (), expr1, expr2, rightHasAssignments)1268 : ReverseBinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments) 1269 1269 { 1270 1270 } … … 1276 1276 public: 1277 1277 LessEqNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL 1278 : BinaryOpNode(globalData, ResultType::boolean (), expr1, expr2, rightHasAssignments)1278 : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments) 1279 1279 { 1280 1280 } … … 1286 1286 public: 1287 1287 GreaterEqNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL 1288 : ReverseBinaryOpNode(globalData, ResultType::boolean (), expr1, expr2, rightHasAssignments)1288 : ReverseBinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments) 1289 1289 { 1290 1290 } … … 1309 1309 public: 1310 1310 InstanceOfNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL 1311 : ThrowableBinaryOpNode(globalData, ResultType::boolean (), expr1, expr2, rightHasAssignments)1311 : ThrowableBinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments) 1312 1312 { 1313 1313 } … … 1331 1331 public: 1332 1332 EqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL 1333 : BinaryOpNode(globalData, ResultType::boolean (), expr1, expr2, rightHasAssignments)1333 : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments) 1334 1334 { 1335 1335 } … … 1342 1342 public: 1343 1343 NotEqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL 1344 : BinaryOpNode(globalData, ResultType::boolean (), expr1, expr2, rightHasAssignments)1344 : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments) 1345 1345 { 1346 1346 } … … 1352 1352 public: 1353 1353 StrictEqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL 1354 : BinaryOpNode(globalData, ResultType::boolean (), expr1, expr2, rightHasAssignments)1354 : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments) 1355 1355 { 1356 1356 } … … 1363 1363 public: 1364 1364 NotStrictEqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL 1365 : BinaryOpNode(globalData, ResultType::boolean (), expr1, expr2, rightHasAssignments)1365 : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments) 1366 1366 { 1367 1367 } … … 1373 1373 public: 1374 1374 BitAndNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL 1375 : BinaryOpNode(globalData, ResultType:: reusableNumber(), expr1, expr2, rightHasAssignments)1375 : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, rightHasAssignments) 1376 1376 { 1377 1377 } … … 1383 1383 public: 1384 1384 BitOrNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL 1385 : BinaryOpNode(globalData, ResultType:: reusableNumber(), expr1, expr2, rightHasAssignments)1385 : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, rightHasAssignments) 1386 1386 { 1387 1387 } … … 1393 1393 public: 1394 1394 BitXOrNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL 1395 : BinaryOpNode(globalData, ResultType:: reusableNumber(), expr1, expr2, rightHasAssignments)1395 : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, rightHasAssignments) 1396 1396 { 1397 1397 } … … 1406 1406 public: 1407 1407 LogicalOpNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, LogicalOperator oper) JSC_FAST_CALL 1408 : ExpressionNode(globalData, ResultType::boolean ())1408 : ExpressionNode(globalData, ResultType::booleanType()) 1409 1409 , m_expr1(expr1) 1410 1410 , m_expr2(expr2) -
trunk/JavaScriptCore/parser/ResultType.h
r38917 r39961 34 34 typedef char Type; 35 35 static const Type TypeReusable = 1; 36 static const Type TypeInt32 = 2; 36 37 37 static const Type TypeMaybeNumber = 2;38 static const Type TypeMaybeString = 4;39 static const Type TypeMaybeNull = 8;40 static const Type TypeMaybeBool = 16;41 static const Type TypeMaybeOther = 32;38 static const Type TypeMaybeNumber = 0x04; 39 static const Type TypeMaybeString = 0x08; 40 static const Type TypeMaybeNull = 0x10; 41 static const Type TypeMaybeBool = 0x20; 42 static const Type TypeMaybeOther = 0x40; 42 43 43 static const Type TypeReusableNumber = 3;44 static const Type TypeStringOrReusableNumber = 4;45 46 44 explicit ResultType(Type type) 47 45 : m_type(type) … … 54 52 } 55 53 54 bool isInt32() 55 { 56 return (m_type & TypeInt32); 57 } 58 56 59 bool definitelyIsNumber() 57 60 { … … 61 64 bool isNotNumber() 62 65 { 63 return ((m_type & TypeMaybeNumber) == 0);66 return !(m_type & TypeMaybeNumber); 64 67 } 65 68 … … 74 77 } 75 78 76 static ResultType boolean ()79 static ResultType booleanType() 77 80 { 78 81 return ResultType(TypeMaybeBool); 79 82 } 80 83 81 static ResultType constNumber()84 static ResultType numberType() 82 85 { 83 86 return ResultType(TypeMaybeNumber); 84 87 } 85 88 86 static ResultType reusableNumber()89 static ResultType numberTypeCanReuse() 87 90 { 88 91 return ResultType(TypeReusable | TypeMaybeNumber); 89 92 } 90 93 91 static ResultType reusableNumberOrString() 94 static ResultType numberTypeCanReuseIsInt32() 95 { 96 return ResultType(TypeReusable | TypeInt32 | TypeMaybeNumber); 97 } 98 99 static ResultType stringOrNumberTypeCanReuse() 92 100 { 93 101 return ResultType(TypeReusable | TypeMaybeNumber | TypeMaybeString); 94 102 } 95 103 96 static ResultType string ()104 static ResultType stringType() 97 105 { 98 106 return ResultType(TypeMaybeString); 99 107 } 100 108 101 static ResultType unknown ()109 static ResultType unknownType() 102 110 { 103 111 return ResultType(TypeMaybeNumber | TypeMaybeString | TypeMaybeNull | TypeMaybeBool | TypeMaybeOther); … … 107 115 { 108 116 if (op1.definitelyIsNumber() && op2.definitelyIsNumber()) 109 return reusableNumber();117 return numberTypeCanReuse(); 110 118 if (op1.isNotNumber() || op2.isNotNumber()) 111 return string(); 112 return reusableNumberOrString(); 119 return stringType(); 120 return stringOrNumberTypeCanReuse(); 121 } 122 123 static ResultType forBitOp() 124 { 125 return numberTypeCanReuseIsInt32(); 113 126 } 114 127 … … 119 132 struct OperandTypes 120 133 { 121 OperandTypes(ResultType first = ResultType::unknown (), ResultType second = ResultType::unknown())134 OperandTypes(ResultType first = ResultType::unknownType(), ResultType second = ResultType::unknownType()) 122 135 { 123 136 m_u.rds.first = first.m_type;
Note:
See TracChangeset
for help on using the changeset viewer.