| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/bytecode-graph-builder.h" | 5 #include "src/compiler/bytecode-graph-builder.h" |
| 6 | 6 |
| 7 #include "src/compiler/bytecode-branch-analysis.h" | 7 #include "src/compiler/bytecode-branch-analysis.h" |
| 8 #include "src/compiler/linkage.h" | 8 #include "src/compiler/linkage.h" |
| 9 #include "src/compiler/operator-properties.h" | 9 #include "src/compiler/operator-properties.h" |
| 10 #include "src/interpreter/bytecodes.h" | 10 #include "src/interpreter/bytecodes.h" |
| (...skipping 1376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1387 environment()->BindAccumulator(node, &states); | 1387 environment()->BindAccumulator(node, &states); |
| 1388 } | 1388 } |
| 1389 | 1389 |
| 1390 | 1390 |
| 1391 void BytecodeGraphBuilder::VisitToName( | 1391 void BytecodeGraphBuilder::VisitToName( |
| 1392 const interpreter::BytecodeArrayIterator& iterator) { | 1392 const interpreter::BytecodeArrayIterator& iterator) { |
| 1393 BuildCastOperator(javascript()->ToName(), iterator); | 1393 BuildCastOperator(javascript()->ToName(), iterator); |
| 1394 } | 1394 } |
| 1395 | 1395 |
| 1396 | 1396 |
| 1397 void BytecodeGraphBuilder::VisitToObject( |
| 1398 const interpreter::BytecodeArrayIterator& iterator) { |
| 1399 BuildCastOperator(javascript()->ToObject(), iterator); |
| 1400 } |
| 1401 |
| 1402 |
| 1397 void BytecodeGraphBuilder::VisitToNumber( | 1403 void BytecodeGraphBuilder::VisitToNumber( |
| 1398 const interpreter::BytecodeArrayIterator& iterator) { | 1404 const interpreter::BytecodeArrayIterator& iterator) { |
| 1399 BuildCastOperator(javascript()->ToNumber(), iterator); | 1405 BuildCastOperator(javascript()->ToNumber(), iterator); |
| 1400 } | 1406 } |
| 1401 | 1407 |
| 1402 | 1408 |
| 1403 void BytecodeGraphBuilder::VisitToObject( | |
| 1404 const interpreter::BytecodeArrayIterator& iterator) { | |
| 1405 BuildCastOperator(javascript()->ToObject(), iterator); | |
| 1406 } | |
| 1407 | |
| 1408 | |
| 1409 void BytecodeGraphBuilder::VisitJump( | 1409 void BytecodeGraphBuilder::VisitJump( |
| 1410 const interpreter::BytecodeArrayIterator& iterator) { | 1410 const interpreter::BytecodeArrayIterator& iterator) { |
| 1411 BuildJump(); | 1411 BuildJump(); |
| 1412 } | 1412 } |
| 1413 | 1413 |
| 1414 | 1414 |
| 1415 void BytecodeGraphBuilder::VisitJumpConstant( | 1415 void BytecodeGraphBuilder::VisitJumpConstant( |
| 1416 const interpreter::BytecodeArrayIterator& iterator) { | 1416 const interpreter::BytecodeArrayIterator& iterator) { |
| 1417 BuildJump(); | 1417 BuildJump(); |
| 1418 } | 1418 } |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1506 const interpreter::BytecodeArrayIterator& iterator) { | 1506 const interpreter::BytecodeArrayIterator& iterator) { |
| 1507 Node* control = | 1507 Node* control = |
| 1508 NewNode(common()->Return(), environment()->LookupAccumulator()); | 1508 NewNode(common()->Return(), environment()->LookupAccumulator()); |
| 1509 UpdateControlDependencyToLeaveFunction(control); | 1509 UpdateControlDependencyToLeaveFunction(control); |
| 1510 set_environment(nullptr); | 1510 set_environment(nullptr); |
| 1511 } | 1511 } |
| 1512 | 1512 |
| 1513 | 1513 |
| 1514 void BytecodeGraphBuilder::VisitForInPrepare( | 1514 void BytecodeGraphBuilder::VisitForInPrepare( |
| 1515 const interpreter::BytecodeArrayIterator& iterator) { | 1515 const interpreter::BytecodeArrayIterator& iterator) { |
| 1516 UNIMPLEMENTED(); | 1516 // Bytecodes in the boilerplate emitted by the bytecode generator |
| 1517 // have already cast the object to JSReceiver and checked it is |
| 1518 // valid. |
| 1519 Node* receiver = |
| 1520 environment()->LookupRegister(iterator.GetRegisterOperand(0)); |
| 1521 Node* prepare = NewNode(javascript()->ForInPrepare(), receiver); |
| 1522 Node* cache_type = NewNode(common()->Projection(0), prepare); |
| 1523 Node* cache_array = NewNode(common()->Projection(1), prepare); |
| 1524 Node* cache_length = NewNode(common()->Projection(2), prepare); |
| 1525 environment()->BindRegister(iterator.GetRegisterOperand(1), cache_type); |
| 1526 environment()->BindRegister(iterator.GetRegisterOperand(2), cache_array); |
| 1527 environment()->BindRegister(iterator.GetRegisterOperand(3), cache_length); |
| 1528 } |
| 1529 |
| 1530 |
| 1531 void BytecodeGraphBuilder::VisitForInDone( |
| 1532 const interpreter::BytecodeArrayIterator& iterator) { |
| 1533 Node* index = environment()->LookupRegister(iterator.GetRegisterOperand(0)); |
| 1534 Node* cache_length = |
| 1535 environment()->LookupRegister(iterator.GetRegisterOperand(1)); |
| 1536 Node* exit_cond = NewNode(javascript()->ForInDone(), index, cache_length); |
| 1537 environment()->BindAccumulator(exit_cond); |
| 1517 } | 1538 } |
| 1518 | 1539 |
| 1519 | 1540 |
| 1520 void BytecodeGraphBuilder::VisitForInNext( | 1541 void BytecodeGraphBuilder::VisitForInNext( |
| 1521 const interpreter::BytecodeArrayIterator& iterator) { | 1542 const interpreter::BytecodeArrayIterator& iterator) { |
| 1522 UNIMPLEMENTED(); | 1543 Node* receiver = |
| 1544 environment()->LookupRegister(iterator.GetRegisterOperand(0)); |
| 1545 Node* cache_type = |
| 1546 environment()->LookupRegister(iterator.GetRegisterOperand(1)); |
| 1547 Node* cache_array = |
| 1548 environment()->LookupRegister(iterator.GetRegisterOperand(2)); |
| 1549 Node* index = environment()->LookupRegister(iterator.GetRegisterOperand(3)); |
| 1550 Node* value = NewNode(javascript()->ForInNext(), receiver, cache_array, |
| 1551 cache_type, index); |
| 1552 environment()->BindAccumulator(value); |
| 1523 } | 1553 } |
| 1524 | 1554 |
| 1525 | 1555 |
| 1526 void BytecodeGraphBuilder::VisitForInDone( | 1556 void BytecodeGraphBuilder::VisitForInStep( |
| 1527 const interpreter::BytecodeArrayIterator& iterator) { | 1557 const interpreter::BytecodeArrayIterator& iterator) { |
| 1528 UNIMPLEMENTED(); | 1558 Node* index = environment()->LookupRegister(iterator.GetRegisterOperand(0)); |
| 1559 index = NewNode(javascript()->ForInStep(), index); |
| 1560 environment()->BindRegister(iterator.GetRegisterOperand(0), index); |
| 1529 } | 1561 } |
| 1530 | 1562 |
| 1531 | 1563 |
| 1532 void BytecodeGraphBuilder::MergeEnvironmentsOfBackwardBranches( | 1564 void BytecodeGraphBuilder::MergeEnvironmentsOfBackwardBranches( |
| 1533 int source_offset, int target_offset) { | 1565 int source_offset, int target_offset) { |
| 1534 DCHECK_GE(source_offset, target_offset); | 1566 DCHECK_GE(source_offset, target_offset); |
| 1535 const ZoneVector<int>* branch_sites = | 1567 const ZoneVector<int>* branch_sites = |
| 1536 branch_analysis()->BackwardBranchesTargetting(target_offset); | 1568 branch_analysis()->BackwardBranchesTargetting(target_offset); |
| 1537 if (branch_sites->back() == source_offset) { | 1569 if (branch_sites->back() == source_offset) { |
| 1538 // The set of back branches is complete, merge them. | 1570 // The set of back branches is complete, merge them. |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1771 | 1803 |
| 1772 void BytecodeGraphBuilder::UpdateControlDependencyToLeaveFunction(Node* exit) { | 1804 void BytecodeGraphBuilder::UpdateControlDependencyToLeaveFunction(Node* exit) { |
| 1773 if (environment()->IsMarkedAsUnreachable()) return; | 1805 if (environment()->IsMarkedAsUnreachable()) return; |
| 1774 environment()->MarkAsUnreachable(); | 1806 environment()->MarkAsUnreachable(); |
| 1775 exit_controls_.push_back(exit); | 1807 exit_controls_.push_back(exit); |
| 1776 } | 1808 } |
| 1777 | 1809 |
| 1778 } // namespace compiler | 1810 } // namespace compiler |
| 1779 } // namespace internal | 1811 } // namespace internal |
| 1780 } // namespace v8 | 1812 } // namespace v8 |
| OLD | NEW |