Changeset 43339 in webkit for trunk/JavaScriptCore/parser/Nodes.cpp
- Timestamp:
- May 7, 2009, 1:27:58 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/parser/Nodes.cpp
r43331 r43339 1176 1176 // least one left child that is also an add that can be determined to be operating on strings. 1177 1177 // 1178 // Fixme: This method should correctly support concatenation on read-modify nodes (+=) 1179 // but disabling this due to performance degradation (op_strcat needs to be able 1180 // to append to the existing string). 1181 // 1182 RegisterID* BinaryOpNode::emitStrcat(BytecodeGenerator& generator, RegisterID* dst, RegisterID* lhs) 1178 RegisterID* BinaryOpNode::emitStrcat(BytecodeGenerator& generator, RegisterID* dst, RegisterID* lhs, ReadModifyResolveNode* emitExpressionInfoForMe) 1183 1179 { 1184 1180 ASSERT(isAdd()); … … 1257 1253 ASSERT(temporaryRegisters.size() >= 3); 1258 1254 1255 // Certain read-modify nodes require expression info to be emitted *after* m_right has been generated. 1256 // If this is required the node is passed as 'emitExpressionInfoForMe'; do so now. 1257 if (emitExpressionInfoForMe) 1258 generator.emitExpressionInfo(emitExpressionInfoForMe->divot(), emitExpressionInfoForMe->startOffset(), emitExpressionInfoForMe->endOffset()); 1259 1259 1260 // If there is an assignment convert the lhs now. This will also copy lhs to 1260 1261 // the temporary register we allocated for it. … … 1409 1410 1410 1411 // FIXME: should this be moved to be a method on BytecodeGenerator? 1411 static ALWAYS_INLINE RegisterID* emitReadModifyAssignment(BytecodeGenerator& generator, RegisterID* dst, RegisterID* src1, RegisterID* src2, Operator oper, OperandTypes types)1412 static ALWAYS_INLINE RegisterID* emitReadModifyAssignment(BytecodeGenerator& generator, RegisterID* dst, RegisterID* src1, ExpressionNode* m_right, Operator oper, OperandTypes types, ReadModifyResolveNode* emitExpressionInfoForMe = 0) 1412 1413 { 1413 1414 OpcodeID opcodeID; … … 1420 1421 break; 1421 1422 case OpPlusEq: 1423 if (m_right->isAdd() && m_right->resultDescriptor().definitelyIsString()) 1424 return static_cast<AddNode*>(m_right)->emitStrcat(generator, dst, src1, emitExpressionInfoForMe); 1422 1425 opcodeID = op_add; 1423 1426 break; … … 1450 1453 return dst; 1451 1454 } 1452 1455 1456 RegisterID* src2 = generator.emitNode(m_right); 1457 1458 // Certain read-modify nodes require expression info to be emitted *after* m_right has been generated. 1459 // If this is required the node is passed as 'emitExpressionInfoForMe'; do so now. 1460 if (emitExpressionInfoForMe) 1461 generator.emitExpressionInfo(emitExpressionInfoForMe->divot(), emitExpressionInfoForMe->startOffset(), emitExpressionInfoForMe->endOffset()); 1462 1453 1463 return generator.emitBinaryOp(opcodeID, dst, src1, src2, types); 1454 1464 } … … 1458 1468 if (RegisterID* local = generator.registerFor(m_ident)) { 1459 1469 if (generator.isLocalConstant(m_ident)) { 1460 RegisterID* src2 = generator.emitNode(m_right.get()); 1461 return emitReadModifyAssignment(generator, generator.finalDestination(dst), local, src2, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); 1470 return emitReadModifyAssignment(generator, generator.finalDestination(dst), local, m_right.get(), m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); 1462 1471 } 1463 1472 … … 1465 1474 RefPtr<RegisterID> result = generator.newTemporary(); 1466 1475 generator.emitMove(result.get(), local); 1467 RegisterID* src2 = generator.emitNode(m_right.get()); 1468 emitReadModifyAssignment(generator, result.get(), result.get(), src2, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); 1476 emitReadModifyAssignment(generator, result.get(), result.get(), m_right.get(), m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); 1469 1477 generator.emitMove(local, result.get()); 1470 1478 return generator.moveToDestinationIfNeeded(dst, result.get()); 1471 1479 } 1472 1480 1473 RegisterID* src2 = generator.emitNode(m_right.get()); 1474 RegisterID* result = emitReadModifyAssignment(generator, local, local, src2, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); 1481 RegisterID* result = emitReadModifyAssignment(generator, local, local, m_right.get(), m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); 1475 1482 return generator.moveToDestinationIfNeeded(dst, result); 1476 1483 } … … 1481 1488 if (generator.findScopedProperty(m_ident, index, depth, true, globalObject) && index != missingSymbolMarker()) { 1482 1489 RefPtr<RegisterID> src1 = generator.emitGetScopedVar(generator.tempDestination(dst), depth, index, globalObject); 1483 RegisterID* src2 = generator.emitNode(m_right.get()); 1484 RegisterID* result = emitReadModifyAssignment(generator, generator.finalDestination(dst, src1.get()), src1.get(), src2, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); 1490 RegisterID* result = emitReadModifyAssignment(generator, generator.finalDestination(dst, src1.get()), src1.get(), m_right.get(), m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); 1485 1491 generator.emitPutScopedVar(depth, index, result, globalObject); 1486 1492 return result; … … 1490 1496 generator.emitExpressionInfo(divot() - startOffset() + m_ident.size(), m_ident.size(), 0); 1491 1497 RefPtr<RegisterID> base = generator.emitResolveWithBase(generator.newTemporary(), src1.get(), m_ident); 1492 RegisterID* src2 = generator.emitNode(m_right.get()); 1493 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 1494 RegisterID* result = emitReadModifyAssignment(generator, generator.finalDestination(dst, src1.get()), src1.get(), src2, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); 1498 RegisterID* result = emitReadModifyAssignment(generator, generator.finalDestination(dst, src1.get()), src1.get(), m_right.get(), m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()), this); 1495 1499 return generator.emitPutById(base.get(), m_ident, result); 1496 1500 } … … 1579 1583 generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffset() - m_subexpressionDivotOffset, m_subexpressionEndOffset); 1580 1584 RefPtr<RegisterID> value = generator.emitGetById(generator.tempDestination(dst), base.get(), m_ident); 1581 RegisterID* change = generator.emitNode(m_right.get()); 1582 RegisterID* updatedValue = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), change, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); 1585 RegisterID* updatedValue = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), m_right.get(), m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); 1583 1586 1584 1587 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); … … 1651 1654 generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffset() - m_subexpressionDivotOffset, m_subexpressionEndOffset); 1652 1655 RefPtr<RegisterID> value = generator.emitGetByVal(generator.tempDestination(dst), base.get(), property.get()); 1653 RegisterID* change = generator.emitNode(m_right.get()); 1654 RegisterID* updatedValue = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), change, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); 1656 RegisterID* updatedValue = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), m_right.get(), m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); 1655 1657 1656 1658 generator.emitExpressionInfo(divot(), startOffset(), endOffset());
Note:
See TracChangeset
for help on using the changeset viewer.