| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 interface HVisitor<R> { | 5 interface HVisitor<R> { |
| 6 R visitAdd(HAdd node); | 6 R visitAdd(HAdd node); |
| 7 R visitBailoutTarget(HBailoutTarget node); | 7 R visitBailoutTarget(HBailoutTarget node); |
| 8 R visitBitAnd(HBitAnd node); | 8 R visitBitAnd(HBitAnd node); |
| 9 R visitBitNot(HBitNot node); | 9 R visitBitNot(HBitNot node); |
| 10 R visitBitOr(HBitOr node); | 10 R visitBitOr(HBitOr node); |
| 11 R visitBitXor(HBitXor node); | 11 R visitBitXor(HBitXor node); |
| 12 R visitBoolify(HBoolify node); | 12 R visitBoolify(HBoolify node); |
| 13 R visitBoundsCheck(HBoundsCheck node); | 13 R visitBoundsCheck(HBoundsCheck node); |
| 14 R visitBreak(HBreak node); |
| 14 R visitDivide(HDivide node); | 15 R visitDivide(HDivide node); |
| 15 R visitEquals(HEquals node); | 16 R visitEquals(HEquals node); |
| 16 R visitExit(HExit node); | 17 R visitExit(HExit node); |
| 17 R visitFieldGet(HFieldGet node); | 18 R visitFieldGet(HFieldGet node); |
| 18 R visitFieldSet(HFieldSet node); | 19 R visitFieldSet(HFieldSet node); |
| 19 R visitForeign(HForeign node); | 20 R visitForeign(HForeign node); |
| 20 R visitForeignNew(HForeignNew); | 21 R visitForeignNew(HForeignNew); |
| 21 R visitGoto(HGoto node); | 22 R visitGoto(HGoto node); |
| 22 R visitGreater(HGreater node); | 23 R visitGreater(HGreater node); |
| 23 R visitGreaterEqual(HGreaterEqual node); | 24 R visitGreaterEqual(HGreaterEqual node); |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 blocks.add(block); | 129 blocks.add(block); |
| 129 assert(blocks[id] === block); | 130 assert(blocks[id] === block); |
| 130 } | 131 } |
| 131 | 132 |
| 132 HBasicBlock addNewBlock() { | 133 HBasicBlock addNewBlock() { |
| 133 HBasicBlock result = new HBasicBlock(); | 134 HBasicBlock result = new HBasicBlock(); |
| 134 addBlock(result); | 135 addBlock(result); |
| 135 return result; | 136 return result; |
| 136 } | 137 } |
| 137 | 138 |
| 138 HBasicBlock addNewLoopHeaderBlock() { | 139 HBasicBlock addNewLoopHeaderBlock(List<SourceString> labels) { |
| 139 HBasicBlock result = addNewBlock(); | 140 HBasicBlock result = addNewBlock(); |
| 140 result.loopInformation = new HLoopInformation(result); | 141 result.loopInformation = new HLoopInformation(result, labels); |
| 141 return result; | 142 return result; |
| 142 } | 143 } |
| 143 | 144 |
| 144 void finalize() { | 145 void finalize() { |
| 145 addBlock(exit); | 146 addBlock(exit); |
| 146 exit.open(); | 147 exit.open(); |
| 147 exit.close(new HExit()); | 148 exit.close(new HExit()); |
| 148 assignDominators(); | 149 assignDominators(); |
| 149 } | 150 } |
| 150 | 151 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 visitRelational(HRelational node) => visitInvokeBinary(node); | 201 visitRelational(HRelational node) => visitInvokeBinary(node); |
| 201 | 202 |
| 202 visitAdd(HAdd node) => visitBinaryArithmetic(node); | 203 visitAdd(HAdd node) => visitBinaryArithmetic(node); |
| 203 visitBitAnd(HBitAnd node) => visitBinaryBitOp(node); | 204 visitBitAnd(HBitAnd node) => visitBinaryBitOp(node); |
| 204 visitBitNot(HBitNot node) => visitInvokeUnary(node); | 205 visitBitNot(HBitNot node) => visitInvokeUnary(node); |
| 205 visitBitOr(HBitOr node) => visitBinaryBitOp(node); | 206 visitBitOr(HBitOr node) => visitBinaryBitOp(node); |
| 206 visitBitXor(HBitXor node) => visitBinaryBitOp(node); | 207 visitBitXor(HBitXor node) => visitBinaryBitOp(node); |
| 207 visitBailoutTarget(HBailoutTarget node) => visitInstruction(node); | 208 visitBailoutTarget(HBailoutTarget node) => visitInstruction(node); |
| 208 visitBoolify(HBoolify node) => visitInstruction(node); | 209 visitBoolify(HBoolify node) => visitInstruction(node); |
| 209 visitBoundsCheck(HBoundsCheck node) => visitCheck(node); | 210 visitBoundsCheck(HBoundsCheck node) => visitCheck(node); |
| 211 visitBreak(HBreak node) => visitGoto(node); |
| 210 visitCheck(HCheck node) => visitInstruction(node); | 212 visitCheck(HCheck node) => visitInstruction(node); |
| 211 visitDivide(HDivide node) => visitBinaryArithmetic(node); | 213 visitDivide(HDivide node) => visitBinaryArithmetic(node); |
| 212 visitEquals(HEquals node) => visitRelational(node); | 214 visitEquals(HEquals node) => visitRelational(node); |
| 213 visitExit(HExit node) => visitControlFlow(node); | 215 visitExit(HExit node) => visitControlFlow(node); |
| 214 visitFieldGet(HFieldGet node) => visitInstruction(node); | 216 visitFieldGet(HFieldGet node) => visitInstruction(node); |
| 215 visitFieldSet(HFieldSet node) => visitInstruction(node); | 217 visitFieldSet(HFieldSet node) => visitInstruction(node); |
| 216 visitForeign(HForeign node) => visitInstruction(node); | 218 visitForeign(HForeign node) => visitInstruction(node); |
| 217 visitForeignNew(HForeignNew node) => visitForeign(node); | 219 visitForeignNew(HForeignNew node) => visitForeign(node); |
| 218 visitGoto(HGoto node) => visitControlFlow(node); | 220 visitGoto(HGoto node) => visitControlFlow(node); |
| 219 visitGreater(HGreater node) => visitRelational(node); | 221 visitGreater(HGreater node) => visitRelational(node); |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 342 // this [id]. The exception are back-edges. | 344 // this [id]. The exception are back-edges. |
| 343 int id; | 345 int id; |
| 344 | 346 |
| 345 static final int STATUS_NEW = 0; | 347 static final int STATUS_NEW = 0; |
| 346 static final int STATUS_OPEN = 1; | 348 static final int STATUS_OPEN = 1; |
| 347 static final int STATUS_CLOSED = 2; | 349 static final int STATUS_CLOSED = 2; |
| 348 int status = STATUS_NEW; | 350 int status = STATUS_NEW; |
| 349 | 351 |
| 350 HInstructionList phis; | 352 HInstructionList phis; |
| 351 | 353 |
| 352 HLoopInformation loopInformation = null; | 354 HBlockInformation blockInformation = null; |
| 353 HBasicBlock parentLoopHeader = null; | 355 HBasicBlock parentLoopHeader = null; |
| 354 List<HBailoutTarget> bailouts; | 356 List<HBailoutTarget> bailouts; |
| 355 | 357 |
| 356 final List<HBasicBlock> predecessors; | 358 final List<HBasicBlock> predecessors; |
| 357 List<HBasicBlock> successors; | 359 List<HBasicBlock> successors; |
| 358 | 360 |
| 359 HBasicBlock dominator = null; | 361 HBasicBlock dominator = null; |
| 360 final List<HBasicBlock> dominatedBlocks; | 362 final List<HBasicBlock> dominatedBlocks; |
| 361 | 363 |
| 364 // For recognizing labeled statements. |
| 365 List<SourceString> labels; |
| 366 |
| 362 HBasicBlock() : this.withId(null); | 367 HBasicBlock() : this.withId(null); |
| 363 HBasicBlock.withId(this.id) | 368 HBasicBlock.withId(this.id) |
| 364 : phis = new HInstructionList(), | 369 : phis = new HInstructionList(), |
| 365 predecessors = <HBasicBlock>[], | 370 predecessors = <HBasicBlock>[], |
| 366 successors = const <HBasicBlock>[], | 371 successors = const <HBasicBlock>[], |
| 367 dominatedBlocks = <HBasicBlock>[], | 372 dominatedBlocks = <HBasicBlock>[], |
| 368 bailouts = <HBailoutTarget>[]; | 373 bailouts = <HBailoutTarget>[]; |
| 369 | 374 |
| 370 bool isNew() => status == STATUS_NEW; | 375 bool isNew() => status == STATUS_NEW; |
| 371 bool isOpen() => status == STATUS_OPEN; | 376 bool isOpen() => status == STATUS_OPEN; |
| 372 bool isClosed() => status == STATUS_CLOSED; | 377 bool isClosed() => status == STATUS_CLOSED; |
| 373 | 378 |
| 374 bool isLoopHeader() => loopInformation !== null; | 379 bool isLoopHeader() => blockInformation is HLoopInformation; |
| 380 bool hasLabeledBlockInformation() => |
| 381 blockInformation is HLabeledBlockInformation; |
| 375 bool hasBailouts() => !bailouts.isEmpty(); | 382 bool hasBailouts() => !bailouts.isEmpty(); |
| 376 | 383 |
| 384 void set loopInformation(HLoopInformation info) { |
| 385 assert(this.blockInformation === null); |
| 386 blockInformation = info; |
| 387 } |
| 388 |
| 389 void set labeledBlockInformation(HLabeledBlockInformation info) { |
| 390 assert(this.blockInformation === null); |
| 391 blockInformation = info; |
| 392 } |
| 393 |
| 394 HLoopInformation get loopInformation() { |
| 395 if (blockInformation is HLoopInformation) { |
| 396 return blockInformation; |
| 397 } |
| 398 return null; |
| 399 } |
| 400 |
| 401 HLabeledBlockInformation get labeledBlockInformation() { |
| 402 if (blockInformation is HLabeledBlockInformation) { |
| 403 return blockInformation; |
| 404 } |
| 405 return null; |
| 406 } |
| 407 |
| 377 void open() { | 408 void open() { |
| 378 assert(isNew()); | 409 assert(isNew()); |
| 379 status = STATUS_OPEN; | 410 status = STATUS_OPEN; |
| 380 } | 411 } |
| 381 | 412 |
| 382 void close(HControlFlow end) { | 413 void close(HControlFlow end) { |
| 383 assert(isOpen()); | 414 assert(isOpen()); |
| 384 addAfter(last, end); | 415 addAfter(last, end); |
| 385 status = STATUS_CLOSED; | 416 status = STATUS_CLOSED; |
| 386 } | 417 } |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 576 } | 607 } |
| 577 | 608 |
| 578 bool isValid() { | 609 bool isValid() { |
| 579 assert(isClosed()); | 610 assert(isClosed()); |
| 580 HValidator validator = new HValidator(); | 611 HValidator validator = new HValidator(); |
| 581 validator.visitBasicBlock(this); | 612 validator.visitBasicBlock(this); |
| 582 return validator.isValid; | 613 return validator.isValid; |
| 583 } | 614 } |
| 584 } | 615 } |
| 585 | 616 |
| 586 class HLoopInformation { | 617 class HBlockInformation { |
| 618 // Just a marker class. |
| 619 } |
| 620 |
| 621 class HLabeledBlockInformation extends HBlockInformation { |
| 622 final HBasicBlock start; |
| 623 final HBasicBlock end; |
| 624 final List<SourceString> labels; |
| 625 HLabeledBlockInformation(this.start, this.end, this.labels); |
| 626 } |
| 627 |
| 628 class HLoopInformation extends HBlockInformation { |
| 587 final HBasicBlock header; | 629 final HBasicBlock header; |
| 588 final List<HBasicBlock> blocks; | 630 final List<HBasicBlock> blocks; |
| 589 final List<HBasicBlock> backEdges; | 631 final List<HBasicBlock> backEdges; |
| 632 final List<SourceString> labels; |
| 590 | 633 |
| 591 HLoopInformation(this.header) | 634 HLoopInformation(this.header, this.labels) |
| 592 : blocks = new List<HBasicBlock>(), | 635 : blocks = new List<HBasicBlock>(), |
| 593 backEdges = new List<HBasicBlock>(); | 636 backEdges = new List<HBasicBlock>(); |
| 594 | 637 |
| 595 void addBackEdge(HBasicBlock predecessor) { | 638 void addBackEdge(HBasicBlock predecessor) { |
| 596 backEdges.add(predecessor); | 639 backEdges.add(predecessor); |
| 597 addBlock(predecessor); | 640 addBlock(predecessor); |
| 598 } | 641 } |
| 599 | 642 |
| 600 // Adds a block and transitively all its predecessors in the loop as | 643 // Adds a block and transitively all its predecessors in the loop as |
| 601 // loop blocks. | 644 // loop blocks. |
| (...skipping 1025 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1627 toString() => 'exit'; | 1670 toString() => 'exit'; |
| 1628 accept(HVisitor visitor) => visitor.visitExit(this); | 1671 accept(HVisitor visitor) => visitor.visitExit(this); |
| 1629 } | 1672 } |
| 1630 | 1673 |
| 1631 class HGoto extends HControlFlow { | 1674 class HGoto extends HControlFlow { |
| 1632 HGoto() : super(const <HInstruction>[]); | 1675 HGoto() : super(const <HInstruction>[]); |
| 1633 toString() => 'goto'; | 1676 toString() => 'goto'; |
| 1634 accept(HVisitor visitor) => visitor.visitGoto(this); | 1677 accept(HVisitor visitor) => visitor.visitGoto(this); |
| 1635 } | 1678 } |
| 1636 | 1679 |
| 1680 class HBreak extends HGoto { |
| 1681 final SourceString label; |
| 1682 HBreak([this.label]); |
| 1683 toString() => 'break'; |
| 1684 accept(HVisitor visitor) => visitor.visitBreak(this); |
| 1685 } |
| 1686 |
| 1637 class HTry extends HControlFlow { | 1687 class HTry extends HControlFlow { |
| 1638 HParameterValue exception; | 1688 HParameterValue exception; |
| 1639 HBasicBlock finallyBlock; | 1689 HBasicBlock finallyBlock; |
| 1640 HTry() : super(const <HInstruction>[]); | 1690 HTry() : super(const <HInstruction>[]); |
| 1641 toString() => 'try'; | 1691 toString() => 'try'; |
| 1642 accept(HVisitor visitor) => visitor.visitTry(this); | 1692 accept(HVisitor visitor) => visitor.visitTry(this); |
| 1643 } | 1693 } |
| 1644 | 1694 |
| 1645 class HIf extends HConditionalBranch { | 1695 class HIf extends HConditionalBranch { |
| 1646 bool hasElse; | 1696 bool hasElse; |
| (...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2131 | 2181 |
| 2132 HInstruction get expression() => inputs[0]; | 2182 HInstruction get expression() => inputs[0]; |
| 2133 | 2183 |
| 2134 HType computeType() => HType.BOOLEAN; | 2184 HType computeType() => HType.BOOLEAN; |
| 2135 bool hasExpectedType() => true; | 2185 bool hasExpectedType() => true; |
| 2136 | 2186 |
| 2137 accept(HVisitor visitor) => visitor.visitIs(this); | 2187 accept(HVisitor visitor) => visitor.visitIs(this); |
| 2138 | 2188 |
| 2139 toString() => "$expression is $typeExpression"; | 2189 toString() => "$expression is $typeExpression"; |
| 2140 } | 2190 } |
| OLD | NEW |