OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 import 'package:kernel/ast.dart' as ir; | 5 import 'package:kernel/ast.dart' as ir; |
6 | 6 |
7 import '../common.dart'; | 7 import '../common.dart'; |
8 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem; | 8 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem; |
9 import '../common/names.dart'; | 9 import '../common/names.dart'; |
10 import '../common/tasks.dart' show CompilerTask; | 10 import '../common/tasks.dart' show CompilerTask; |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 buildField(target); | 101 buildField(target); |
102 } else if (target is ir.Constructor) { | 102 } else if (target is ir.Constructor) { |
103 buildConstructor(target); | 103 buildConstructor(target); |
104 } | 104 } |
105 assert(graph.isValid()); | 105 assert(graph.isValid()); |
106 return graph; | 106 return graph; |
107 } | 107 } |
108 | 108 |
109 void buildField(ir.Field field) { | 109 void buildField(ir.Field field) { |
110 openFunction(); | 110 openFunction(); |
111 field.initializer.accept(this); | 111 if (field.initializer != null) { |
| 112 field.initializer.accept(this); |
| 113 } else { |
| 114 stack.add(graph.addConstantNull(compiler)); |
| 115 } |
112 HInstruction value = pop(); | 116 HInstruction value = pop(); |
113 closeAndGotoExit(new HReturn(value, null)); | 117 closeAndGotoExit(new HReturn(value, null)); |
114 closeFunction(); | 118 closeFunction(); |
115 } | 119 } |
116 | 120 |
117 @override | 121 @override |
118 HInstruction popBoolified() { | 122 HInstruction popBoolified() { |
119 HInstruction value = pop(); | 123 HInstruction value = pop(); |
120 // TODO(het): add boolean conversion type check | 124 // TODO(het): add boolean conversion type check |
121 HInstruction result = new HBoolify(value, backend.boolType); | 125 HInstruction result = new HBoolify(value, backend.boolType); |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
405 return popBoolified(); | 409 return popBoolified(); |
406 } | 410 } |
407 | 411 |
408 loopHandler.handleLoop(whileStatement, () {}, buildCondition, () {}, () { | 412 loopHandler.handleLoop(whileStatement, () {}, buildCondition, () {}, () { |
409 whileStatement.body.accept(this); | 413 whileStatement.body.accept(this); |
410 }); | 414 }); |
411 } | 415 } |
412 | 416 |
413 @override | 417 @override |
414 void visitIfStatement(ir.IfStatement ifStatement) { | 418 void visitIfStatement(ir.IfStatement ifStatement) { |
415 SsaBranchBuilder brancher = new SsaBranchBuilder(this, compiler); | 419 handleIf( |
416 brancher.handleIf( | 420 visitCondition: () => ifStatement.condition.accept(this), |
417 () => ifStatement.condition.accept(this), | 421 visitThen: () => ifStatement.then.accept(this), |
418 () => ifStatement.then.accept(this), | 422 visitElse: () => ifStatement.otherwise?.accept(this)); |
419 () => ifStatement.otherwise?.accept(this)); | |
420 } | 423 } |
421 | 424 |
422 @override | 425 @override |
| 426 void visitAssertStatement(ir.AssertStatement assertStatement) { |
| 427 if (!compiler.options.enableUserAssertions) return; |
| 428 if (assertStatement.message == null) { |
| 429 assertStatement.condition.accept(this); |
| 430 _pushStaticInvocation(astAdapter.assertHelper, <HInstruction>[pop()], |
| 431 astAdapter.assertHelperReturnType); |
| 432 pop(); |
| 433 return; |
| 434 } |
| 435 |
| 436 // if (assertTest(condition)) assertThrow(message); |
| 437 void buildCondition() { |
| 438 assertStatement.condition.accept(this); |
| 439 _pushStaticInvocation(astAdapter.assertTest, <HInstruction>[pop()], |
| 440 astAdapter.assertTestReturnType); |
| 441 } |
| 442 |
| 443 void fail() { |
| 444 assertStatement.message.accept(this); |
| 445 _pushStaticInvocation(astAdapter.assertThrow, <HInstruction>[pop()], |
| 446 astAdapter.assertThrowReturnType); |
| 447 pop(); |
| 448 } |
| 449 |
| 450 handleIf(visitCondition: buildCondition, visitThen: fail); |
| 451 } |
| 452 |
| 453 @override |
423 void visitConditionalExpression(ir.ConditionalExpression conditional) { | 454 void visitConditionalExpression(ir.ConditionalExpression conditional) { |
424 SsaBranchBuilder brancher = new SsaBranchBuilder(this, compiler); | 455 SsaBranchBuilder brancher = new SsaBranchBuilder(this, compiler); |
425 brancher.handleConditional( | 456 brancher.handleConditional( |
426 () => conditional.condition.accept(this), | 457 () => conditional.condition.accept(this), |
427 () => conditional.then.accept(this), | 458 () => conditional.then.accept(this), |
428 () => conditional.otherwise.accept(this)); | 459 () => conditional.otherwise.accept(this)); |
429 } | 460 } |
430 | 461 |
431 @override | 462 @override |
432 void visitLogicalExpression(ir.LogicalExpression logicalExpression) { | 463 void visitLogicalExpression(ir.LogicalExpression logicalExpression) { |
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
786 push(new HNot(popBoolified(), backend.boolType)); | 817 push(new HNot(popBoolified(), backend.boolType)); |
787 } | 818 } |
788 | 819 |
789 @override | 820 @override |
790 void visitStringConcatenation(ir.StringConcatenation stringConcat) { | 821 void visitStringConcatenation(ir.StringConcatenation stringConcat) { |
791 KernelStringBuilder stringBuilder = new KernelStringBuilder(this); | 822 KernelStringBuilder stringBuilder = new KernelStringBuilder(this); |
792 stringConcat.accept(stringBuilder); | 823 stringConcat.accept(stringBuilder); |
793 stack.add(stringBuilder.result); | 824 stack.add(stringBuilder.result); |
794 } | 825 } |
795 } | 826 } |
OLD | NEW |