Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(66)

Side by Side Diff: pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart

Issue 1507313006: dart2js cps: Add instruction for null checks. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Fix true/false misdocumentation about condition and do not emit call Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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 library tree_ir_builder; 5 library tree_ir_builder;
6 6
7 import '../common.dart'; 7 import '../common.dart';
8 import '../constants/values.dart'; 8 import '../constants/values.dart';
9 import '../cps_ir/cps_ir_nodes.dart' as cps_ir; 9 import '../cps_ir/cps_ir_nodes.dart' as cps_ir;
10 import '../elements/elements.dart'; 10 import '../elements/elements.dart';
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 Variable getVariable(cps_ir.Primitive primitive) { 100 Variable getVariable(cps_ir.Primitive primitive) {
101 return primitive2variable.putIfAbsent(primitive, 101 return primitive2variable.putIfAbsent(primitive,
102 () => new Variable(currentElement, primitive.hint)); 102 () => new Variable(currentElement, primitive.hint));
103 } 103 }
104 104
105 /// Obtains a reference to the tree Variable corresponding to the IR primitive 105 /// Obtains a reference to the tree Variable corresponding to the IR primitive
106 /// referred to by [reference]. 106 /// referred to by [reference].
107 /// This increments the reference count for the given variable, so the 107 /// This increments the reference count for the given variable, so the
108 /// returned expression must be used in the tree. 108 /// returned expression must be used in the tree.
109 Expression getVariableUse(cps_ir.Reference<cps_ir.Primitive> reference) { 109 Expression getVariableUse(cps_ir.Reference<cps_ir.Primitive> reference) {
110 if (thisParameter != null && reference.definition == thisParameter) { 110 cps_ir.Primitive prim = reference.definition.effectiveDefinition;
111 if (thisParameter != null && prim == thisParameter) {
111 return new This(); 112 return new This();
112 } 113 }
113 return new VariableUse(getVariable(reference.definition)); 114 return new VariableUse(getVariable(prim));
115 }
116
117 Expression getVariableUseOrNull(
118 cps_ir.Reference<cps_ir.Primitive> reference) {
119 return reference == null ? null : getVariableUse(reference);
114 } 120 }
115 121
116 Label getLabel(cps_ir.Continuation cont) { 122 Label getLabel(cps_ir.Continuation cont) {
117 return labels.putIfAbsent(cont, () => new Label()); 123 return labels.putIfAbsent(cont, () => new Label());
118 } 124 }
119 125
120 Variable addFunctionParameter(cps_ir.Parameter parameter) { 126 Variable addFunctionParameter(cps_ir.Parameter parameter) {
121 return getVariable(parameter); 127 return getVariable(parameter);
122 } 128 }
123 129
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 return new LiteralMap( 495 return new LiteralMap(
490 node.dartType, 496 node.dartType,
491 new List<LiteralMapEntry>.generate(node.entries.length, (int index) { 497 new List<LiteralMapEntry>.generate(node.entries.length, (int index) {
492 return new LiteralMapEntry( 498 return new LiteralMapEntry(
493 getVariableUse(node.entries[index].key), 499 getVariableUse(node.entries[index].key),
494 getVariableUse(node.entries[index].value)); 500 getVariableUse(node.entries[index].value));
495 }) 501 })
496 ); 502 );
497 } 503 }
498 504
499 FunctionDefinition makeSubFunction(cps_ir.FunctionDefinition function) {
500 return createInnerBuilder().buildFunction(function);
501 }
502
503 Expression visitReifyRuntimeType(cps_ir.ReifyRuntimeType node) { 505 Expression visitReifyRuntimeType(cps_ir.ReifyRuntimeType node) {
504 return new ReifyRuntimeType( 506 return new ReifyRuntimeType(
505 getVariableUse(node.value), node.sourceInformation); 507 getVariableUse(node.value), node.sourceInformation);
506 } 508 }
507 509
508 Expression visitReadTypeVariable(cps_ir.ReadTypeVariable node) { 510 Expression visitReadTypeVariable(cps_ir.ReadTypeVariable node) {
509 return new ReadTypeVariable( 511 return new ReadTypeVariable(
510 node.variable, 512 node.variable,
511 getVariableUse(node.target), 513 getVariableUse(node.target),
512 node.sourceInformation); 514 node.sourceInformation);
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
636 return new ForeignStatement( 638 return new ForeignStatement(
637 node.codeTemplate, 639 node.codeTemplate,
638 node.type, 640 node.type,
639 arguments, 641 arguments,
640 node.nativeBehavior, 642 node.nativeBehavior,
641 node.dependency); 643 node.dependency);
642 }; 644 };
643 } 645 }
644 } 646 }
645 647
648 visitNullCheck(cps_ir.NullCheck node) => (Statement next) {
649 return new NullCheck(
650 condition: getVariableUseOrNull(node.condition),
651 value: getVariableUse(node.value),
652 selector: node.selector,
653 next: next,
654 sourceInformation: node.sourceInformation);
655 };
656
646 Expression visitGetLazyStatic(cps_ir.GetLazyStatic node) { 657 Expression visitGetLazyStatic(cps_ir.GetLazyStatic node) {
647 // In the tree IR, GetStatic handles lazy fields because we do not need 658 // In the tree IR, GetStatic handles lazy fields because we do not need
648 // as fine-grained control over side effects. 659 // as fine-grained control over side effects.
649 return new GetStatic(node.element, node.sourceInformation); 660 return new GetStatic(node.element, node.sourceInformation);
650 } 661 }
651 662
652 @override 663 @override
653 NodeCallback visitYield(cps_ir.Yield node) { 664 NodeCallback visitYield(cps_ir.Yield node) {
654 return (Statement next) { 665 return (Statement next) {
655 return new Yield(getVariableUse(node.input), node.hasStar, next); 666 return new Yield(getVariableUse(node.input), node.hasStar, next);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
697 --enclosingFunctions; 708 --enclosingFunctions;
698 } 709 }
699 710
700 @override 711 @override
701 visitInterpolatedNode(js.InterpolatedNode node) { 712 visitInterpolatedNode(js.InterpolatedNode node) {
702 if (enclosingFunctions > 0) { 713 if (enclosingFunctions > 0) {
703 found = true; 714 found = true;
704 } 715 }
705 } 716 }
706 } 717 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart ('k') | pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698