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

Side by Side Diff: pkg/compiler/lib/src/ssa/builder.dart

Issue 1212433002: Implement SsaBuilder without the ResolvedVisitor. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 5 months 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
« no previous file with comments | « no previous file | pkg/compiler/lib/src/ssa/ssa.dart » ('j') | pkg/compiler/lib/src/warnings.dart » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 part of ssa; 5 part of ssa;
6 6
7 class SsaFunctionCompiler implements FunctionCompiler { 7 class SsaFunctionCompiler implements FunctionCompiler {
8 SsaCodeGeneratorTask generator; 8 SsaCodeGeneratorTask generator;
9 SsaBuilderTask builder; 9 SsaBuilderTask builder;
10 SsaOptimizerTask optimizer; 10 SsaOptimizerTask optimizer;
(...skipping 1001 matching lines...) Expand 10 before | Expand all | Expand 10 after
1012 for (JumpTarget target in targetIndexMap.keys) { 1012 for (JumpTarget target in targetIndexMap.keys) {
1013 builder.jumpTargets.remove(target); 1013 builder.jumpTargets.remove(target);
1014 } 1014 }
1015 super.close(); 1015 super.close();
1016 } 1016 }
1017 } 1017 }
1018 1018
1019 /** 1019 /**
1020 * This class builds SSA nodes for functions represented in AST. 1020 * This class builds SSA nodes for functions represented in AST.
1021 */ 1021 */
1022 class SsaBuilder extends NewResolvedVisitor { 1022 class SsaBuilder extends ast.Visitor
1023 with BaseImplementationOfCompoundsMixin,
1024 SendResolverMixin,
1025 SemanticSendResolvedMixin,
1026 NewBulkMixin
1027 implements SemanticSendVisitor {
1023 final Compiler compiler; 1028 final Compiler compiler;
1024 final JavaScriptBackend backend; 1029 final JavaScriptBackend backend;
1025 final ConstantSystem constantSystem; 1030 final ConstantSystem constantSystem;
1026 final CodegenWorkItem work; 1031 final CodegenWorkItem work;
1027 final RuntimeTypes rti; 1032 final RuntimeTypes rti;
1033 TreeElements elements;
1028 SourceInformationBuilder sourceInformationBuilder; 1034 SourceInformationBuilder sourceInformationBuilder;
1029 bool inLazyInitializerExpression = false; 1035 bool inLazyInitializerExpression = false;
1030 1036
1031 /* This field is used by the native handler. */ 1037 /* This field is used by the native handler. */
1032 final NativeEmitter nativeEmitter; 1038 final NativeEmitter nativeEmitter;
1033 1039
1034 final HGraph graph = new HGraph(); 1040 final HGraph graph = new HGraph();
1035 1041
1036 /** 1042 /**
1037 * The current block to add instructions to. Might be null, if we are 1043 * The current block to add instructions to. Might be null, if we are
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1112 1118
1113 SsaBuilder(JavaScriptBackend backend, 1119 SsaBuilder(JavaScriptBackend backend,
1114 CodegenWorkItem work, 1120 CodegenWorkItem work,
1115 this.nativeEmitter, 1121 this.nativeEmitter,
1116 SourceInformationFactory sourceInformationFactory) 1122 SourceInformationFactory sourceInformationFactory)
1117 : this.compiler = backend.compiler, 1123 : this.compiler = backend.compiler,
1118 this.backend = backend, 1124 this.backend = backend,
1119 this.constantSystem = backend.constantSystem, 1125 this.constantSystem = backend.constantSystem,
1120 this.work = work, 1126 this.work = work,
1121 this.rti = backend.rti, 1127 this.rti = backend.rti,
1122 super(work.resolutionTree) { 1128 this.elements = work.resolutionTree {
1123 localsHandler = new LocalsHandler(this, work.element, null); 1129 localsHandler = new LocalsHandler(this, work.element, null);
1124 sourceElementStack.add(work.element); 1130 sourceElementStack.add(work.element);
1125 sourceInformationBuilder = 1131 sourceInformationBuilder =
1126 sourceInformationFactory.forContext(work.element.implementation); 1132 sourceInformationFactory.forContext(work.element.implementation);
1127 } 1133 }
1128 1134
1135 @override
1136 SemanticSendVisitor get sendVisitor => this;
1137
1138 @override
1139 void visitNode(ast.Node node) {
1140 internalError(node, "Unhandled node: $node");
1141 }
1142
1143 @override
1144 void apply(ast.Node node, [_]) {
1145 node.accept(this);
1146 }
1147
1129 CodegenRegistry get registry => work.registry; 1148 CodegenRegistry get registry => work.registry;
1130 1149
1131 /// Returns the current source element. 1150 /// Returns the current source element.
1132 /// 1151 ///
1133 /// The returned element is a declaration element. 1152 /// The returned element is a declaration element.
1134 // TODO(johnniwinther): Check that all usages of sourceElement agree on 1153 // TODO(johnniwinther): Check that all usages of sourceElement agree on
1135 // implementation/declaration distinction. 1154 // implementation/declaration distinction.
1136 Element get sourceElement => sourceElementStack.last; 1155 Element get sourceElement => sourceElementStack.last;
1137 1156
1138 bool get _checkOrTrustTypes => 1157 bool get _checkOrTrustTypes =>
(...skipping 1977 matching lines...) Expand 10 before | Expand all | Expand 10 after
3116 } 3135 }
3117 3136
3118 visitFunctionDeclaration(ast.FunctionDeclaration node) { 3137 visitFunctionDeclaration(ast.FunctionDeclaration node) {
3119 assert(isReachable); 3138 assert(isReachable);
3120 visit(node.function); 3139 visit(node.function);
3121 LocalFunctionElement localFunction = 3140 LocalFunctionElement localFunction =
3122 elements.getFunctionDefinition(node.function); 3141 elements.getFunctionDefinition(node.function);
3123 localsHandler.updateLocal(localFunction, pop()); 3142 localsHandler.updateLocal(localFunction, pop());
3124 } 3143 }
3125 3144
3145 @override
3146 void visitThisGet(ast.Identifier node, [_]) {
sigurdm 2015/06/26 07:44:19 Should this be called `handleThisGet`? I am not ex
Johnni Winther 2015/06/26 10:15:25 It is part of the [SemanticSendVisitor]. `this` is
3147 stack.add(localsHandler.readThis());
3148 }
3149
3126 visitIdentifier(ast.Identifier node) { 3150 visitIdentifier(ast.Identifier node) {
3127 if (node.isThis()) { 3151 if (node.isThis()) {
3128 stack.add(localsHandler.readThis()); 3152 visitThisGet(node);
3129 } else { 3153 } else {
3130 compiler.internalError(node, 3154 compiler.internalError(node,
3131 "SsaFromAstMixin.visitIdentifier on non-this."); 3155 "SsaFromAstMixin.visitIdentifier on non-this.");
3132 } 3156 }
3133 } 3157 }
3134 3158
3135 visitIf(ast.If node) { 3159 visitIf(ast.If node) {
3136 assert(isReachable); 3160 assert(isReachable);
3137 handleIf(node, 3161 handleIf(node,
3138 () => visit(node.condition), 3162 () => visit(node.condition),
(...skipping 1255 matching lines...) Expand 10 before | Expand all | Expand 10 after
4394 /// Access an unresolved super property. 4418 /// Access an unresolved super property.
4395 void handleUnresolvedSuperInvoke(ast.Send node) { 4419 void handleUnresolvedSuperInvoke(ast.Send node) {
4396 Selector selector = elements.getSelector(node); 4420 Selector selector = elements.getSelector(node);
4397 List<HInstruction> arguments = <HInstruction>[]; 4421 List<HInstruction> arguments = <HInstruction>[];
4398 if (!node.isPropertyAccess) { 4422 if (!node.isPropertyAccess) {
4399 addGenericSendArgumentsToList(node.arguments, arguments); 4423 addGenericSendArgumentsToList(node.arguments, arguments);
4400 } 4424 }
4401 generateSuperNoSuchMethodSend(node, selector, arguments); 4425 generateSuperNoSuchMethodSend(node, selector, arguments);
4402 } 4426 }
4403 4427
4404 /// Handle super constructor invocation.
4405 @override
4406 void handleSuperConstructorInvoke(ast.Send node) {
4407 Selector selector = elements.getSelector(node);
4408 Element element = elements[node];
4409 if (selector.applies(element, compiler.world)) {
4410 generateSuperInvoke(node, element);
4411 } else {
4412 generateWrongArgumentCountError(node, element, node.arguments);
4413 }
4414 }
4415
4416 @override 4428 @override
4417 void visitUnresolvedSuperIndex( 4429 void visitUnresolvedSuperIndex(
4418 ast.Send node, 4430 ast.Send node,
4419 Element element, 4431 Element element,
4420 ast.Node index, 4432 ast.Node index,
4421 _) { 4433 _) {
4422 handleUnresolvedSuperInvoke(node); 4434 handleUnresolvedSuperInvoke(node);
4423 } 4435 }
4424 4436
4425 @override 4437 @override
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
4568 handleSuperMethodInvoke(node, method); 4580 handleSuperMethodInvoke(node, method);
4569 } 4581 }
4570 4582
4571 @override 4583 @override
4572 void visitSuperMethodIncompatibleInvoke( 4584 void visitSuperMethodIncompatibleInvoke(
4573 ast.Send node, 4585 ast.Send node,
4574 MethodElement method, 4586 MethodElement method,
4575 ast.NodeList arguments, 4587 ast.NodeList arguments,
4576 CallStructure callStructure, 4588 CallStructure callStructure,
4577 _) { 4589 _) {
4590 handleInvalidSuperInvoke(node, arguments);
4591 }
4592
4593 @override
4594 visitSuperSetterInvoke(
sigurdm 2015/06/26 07:44:19 void return type?
Johnni Winther 2015/06/26 10:15:25 Done.
4595 ast.Send node,
4596 SetterElement setter,
4597 ast.NodeList arguments,
4598 CallStructure callStructure,
4599 _) {
4600 handleInvalidSuperInvoke(node, arguments);
4601 }
4602
4603 void handleInvalidSuperInvoke(ast.Send node, ast.NodeList arguments) {
4578 Selector selector = elements.getSelector(node); 4604 Selector selector = elements.getSelector(node);
4579 List<HInstruction> inputs = <HInstruction>[]; 4605 List<HInstruction> inputs = <HInstruction>[];
4580 addGenericSendArgumentsToList(arguments.nodes, inputs); 4606 addGenericSendArgumentsToList(arguments.nodes, inputs);
4581 generateSuperNoSuchMethodSend(node, selector, inputs); 4607 generateSuperNoSuchMethodSend(node, selector, inputs);
4582 } 4608 }
4583 4609
4584 bool needsSubstitutionForTypeVariableAccess(ClassElement cls) { 4610 bool needsSubstitutionForTypeVariableAccess(ClassElement cls) {
4585 ClassWorld classWorld = compiler.world; 4611 ClassWorld classWorld = compiler.world;
4586 if (classWorld.isUsedAsMixin(cls)) return true; 4612 if (classWorld.isUsedAsMixin(cls)) return true;
4587 4613
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
4753 typeMask: backend.dynamicType); 4779 typeMask: backend.dynamicType);
4754 4780
4755 // The new object will now be referenced through the 4781 // The new object will now be referenced through the
4756 // `setRuntimeTypeInfo` call. We therefore set the type of that 4782 // `setRuntimeTypeInfo` call. We therefore set the type of that
4757 // instruction to be of the object's type. 4783 // instruction to be of the object's type.
4758 assert(stack.last is HInvokeStatic || stack.last == newObject); 4784 assert(stack.last is HInvokeStatic || stack.last == newObject);
4759 stack.last.instructionType = newObject.instructionType; 4785 stack.last.instructionType = newObject.instructionType;
4760 return pop(); 4786 return pop();
4761 } 4787 }
4762 4788
4763 handleNewSend(ast.NewExpression node) { 4789 void handleNewSend(ast.NewExpression node) {
4764 ast.Send send = node.send; 4790 ast.Send send = node.send;
4765 generateIsDeferredLoadedCheckOfSend(send); 4791 generateIsDeferredLoadedCheckOfSend(send);
4766 4792
4767 bool isFixedList = false; 4793 bool isFixedList = false;
4768 bool isFixedListConstructorCall = 4794 bool isFixedListConstructorCall =
4769 Elements.isFixedListConstructorCall(elements[send], send, compiler); 4795 Elements.isFixedListConstructorCall(elements[send], send, compiler);
4770 bool isGrowableListConstructorCall = 4796 bool isGrowableListConstructorCall =
4771 Elements.isGrowableListConstructorCall(elements[send], send, compiler); 4797 Elements.isGrowableListConstructorCall(elements[send], send, compiler);
4772 4798
4773 TypeMask computeType(element) { 4799 TypeMask computeType(element) {
(...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after
5420 signature.forEachParameter((Element parameter) { 5446 signature.forEachParameter((Element parameter) {
5421 existingArguments.add(parameter.name); 5447 existingArguments.add(parameter.name);
5422 }); 5448 });
5423 generateThrowNoSuchMethod(diagnosticNode, 5449 generateThrowNoSuchMethod(diagnosticNode,
5424 function.name, 5450 function.name,
5425 argumentNodes: argumentNodes, 5451 argumentNodes: argumentNodes,
5426 existingArguments: existingArguments); 5452 existingArguments: existingArguments);
5427 } 5453 }
5428 5454
5429 @override 5455 @override
5430 handleNewExpression(ast.NewExpression node) { 5456 void bulkHandleNode(ast.Node node, String message, _) {
5457 internalError(node, "Unexpected bulk handled node: $node");
5458 }
5459
5460 @override
5461 void bulkHandleNew(ast.NewExpression node, [_]) {
5431 Element element = elements[node.send]; 5462 Element element = elements[node.send];
5432 final bool isSymbolConstructor = element == compiler.symbolConstructor; 5463 final bool isSymbolConstructor = element == compiler.symbolConstructor;
5433 if (!Elements.isErroneous(element)) { 5464 if (!Elements.isErroneous(element)) {
5434 ConstructorElement function = element; 5465 ConstructorElement function = element;
5435 element = function.effectiveTarget; 5466 element = function.effectiveTarget;
5436 } 5467 }
5437 if (Elements.isErroneous(element)) { 5468 if (Elements.isErroneous(element)) {
5438 if (element is !ErroneousElement) { 5469 if (element is !ErroneousElement) {
5439 // TODO(ahe): Do something like [generateWrongArgumentCountError]. 5470 // TODO(ahe): Do something like [generateWrongArgumentCountError].
5440 stack.add(graph.addConstantNull(compiler)); 5471 stack.add(graph.addConstantNull(compiler));
(...skipping 15 matching lines...) Expand all
5456 ConstructedConstantValue symbol = getConstantForNode(node); 5487 ConstructedConstantValue symbol = getConstantForNode(node);
5457 StringConstantValue stringConstant = symbol.fields.values.single; 5488 StringConstantValue stringConstant = symbol.fields.values.single;
5458 String nameString = stringConstant.toDartString().slowToString(); 5489 String nameString = stringConstant.toDartString().slowToString();
5459 registry.registerConstSymbol(nameString); 5490 registry.registerConstSymbol(nameString);
5460 } 5491 }
5461 } else { 5492 } else {
5462 handleNewSend(node); 5493 handleNewSend(node);
5463 } 5494 }
5464 } 5495 }
5465 5496
5497 @override
5498 void errorNonConstantConstructorInvoke(
5499 ast.NewExpression node,
5500 Element element,
5501 DartType type,
5502 ast.NodeList arguments,
5503 CallStructure callStructure,
5504 _) {
5505 bulkHandleNew(node);
5506 }
5507
5466 void pushInvokeDynamic(ast.Node node, 5508 void pushInvokeDynamic(ast.Node node,
5467 Selector selector, 5509 Selector selector,
5468 TypeMask mask, 5510 TypeMask mask,
5469 List<HInstruction> arguments, 5511 List<HInstruction> arguments,
5470 {ast.Node location}) { 5512 {ast.Node location}) {
5471 if (location == null) location = node; 5513 if (location == null) location = node;
5472 5514
5473 // We prefer to not inline certain operations on indexables, 5515 // We prefer to not inline certain operations on indexables,
5474 // because the constant folder will handle them better and turn 5516 // because the constant folder will handle them better and turn
5475 // them into simpler instructions that allow further 5517 // them into simpler instructions that allow further
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
5683 } else { 5725 } else {
5684 handleComplexOperatorSend(node, getterInstruction, arguments); 5726 handleComplexOperatorSend(node, getterInstruction, arguments);
5685 setterInputs.add(pop()); 5727 setterInputs.add(pop());
5686 generateSuperSendSet(); 5728 generateSuperSendSet();
5687 stack.add(node.isPostfix ? getterInstruction : setterInputs.last); 5729 stack.add(node.isPostfix ? getterInstruction : setterInputs.last);
5688 } 5730 }
5689 } 5731 }
5690 } 5732 }
5691 5733
5692 @override 5734 @override
5735 void handleSuperCompounds(
5736 ast.SendSet node,
5737 Element getter,
5738 CompoundGetter getterKind,
5739 Element setter,
5740 CompoundSetter setterKind,
5741 CompoundRhs rhs,
5742 _) {
5743 handleSuperSendSet(node);
5744 }
5745
5746 @override
5747 void visitFinalSuperFieldSet(
5748 ast.SendSet node,
5749 FieldElement field,
5750 ast.Node rhs,
5751 _) {
5752 handleSuperSendSet(node);
5753 }
5754
5755 @override
5756 void visitSuperFieldSet(
5757 ast.SendSet node,
5758 FieldElement field,
5759 ast.Node rhs,
5760 _) {
5761 handleSuperSendSet(node);
5762 }
5763
5764 @override
5765 void visitSuperGetterSet(
5766 ast.SendSet node,
5767 FunctionElement getter,
5768 ast.Node rhs,
5769 _) {
5770 handleSuperSendSet(node);
5771 }
5772
5773 @override
5774 void visitSuperIndexSet(
5775 ast.SendSet node,
5776 FunctionElement function,
5777 ast.Node index,
5778 ast.Node rhs,
5779 _) {
5780 handleSuperSendSet(node);
5781 }
5782
5783 @override
5784 void visitSuperMethodSet(
5785 ast.Send node,
5786 MethodElement method,
5787 ast.Node rhs,
5788 _) {
5789 handleSuperSendSet(node);
5790 }
5791
5792 @override
5793 void visitSuperSetterSet(
5794 ast.SendSet node,
5795 FunctionElement setter,
5796 ast.Node rhs,
5797 _) {
5798 handleSuperSendSet(node);
5799 }
5800
5801 @override
5802 void visitUnresolvedSuperIndexSet(
5803 ast.Send node,
5804 Element element,
5805 ast.Node index,
5806 ast.Node rhs,
5807 _) {
5808 handleSuperSendSet(node);
5809 }
5810
5811 void visitSuperIndexPrefix(
5812 ast.Send node,
5813 MethodElement indexFunction,
5814 MethodElement indexSetFunction,
5815 ast.Node index,
5816 IncDecOperator operator,
5817 _) {
5818 handleSuperSendSet(node);
5819 }
5820
5821 void visitSuperIndexPostfix(
5822 ast.Send node,
5823 MethodElement indexFunction,
5824 MethodElement indexSetFunction,
5825 ast.Node index,
5826 IncDecOperator operator,
5827 _) {
5828 handleSuperSendSet(node);
5829 }
5830
5831 void visitUnresolvedSuperGetterIndexPrefix(
5832 ast.Send node,
5833 Element element,
5834 MethodElement setter,
5835 ast.Node index,
5836 IncDecOperator operator,
5837 _) {
5838 handleSuperSendSet(node);
5839 }
5840
5841 void visitUnresolvedSuperGetterIndexPostfix(
5842 ast.Send node,
5843 Element element,
5844 MethodElement setter,
5845 ast.Node index,
5846 IncDecOperator operator,
5847 _) {
5848 handleSuperSendSet(node);
5849 }
5850
5851 void visitUnresolvedSuperSetterIndexPrefix(
5852 ast.Send node,
5853 MethodElement indexFunction,
5854 Element element,
5855 ast.Node index,
5856 IncDecOperator operator,
5857 _) {
5858 handleSuperSendSet(node);
5859 }
5860
5861 void visitUnresolvedSuperSetterIndexPostfix(
5862 ast.Send node,
5863 MethodElement indexFunction,
5864 Element element,
5865 ast.Node index,
5866 IncDecOperator operator,
5867 _) {
5868 handleSuperSendSet(node);
5869 }
5870
5871 void visitUnresolvedSuperIndexPrefix(
5872 ast.Send node,
5873 Element element,
5874 ast.Node index,
5875 IncDecOperator operator,
5876 _) {
5877 handleSuperSendSet(node);
5878 }
5879
5880 void visitUnresolvedSuperIndexPostfix(
5881 ast.Send node,
5882 Element element,
5883 ast.Node index,
5884 IncDecOperator operator,
5885 _) {
5886 handleSuperSendSet(node);
5887 }
5888
5889 void visitSuperCompoundIndexSet(
5890 ast.SendSet node,
5891 MethodElement getter,
5892 MethodElement setter,
5893 ast.Node index,
5894 AssignmentOperator operator,
5895 ast.Node rhs,
5896 _) {
5897 handleSuperSendSet(node);
5898 }
5899
5900 void visitUnresolvedSuperGetterCompoundIndexSet(
5901 ast.Send node,
5902 Element element,
5903 MethodElement setter,
5904 ast.Node index,
5905 AssignmentOperator operator,
5906 ast.Node rhs,
5907 _) {
5908 handleSuperSendSet(node);
5909 }
5910
5911 void visitUnresolvedSuperSetterCompoundIndexSet(
5912 ast.Send node,
5913 MethodElement getter,
5914 Element element,
5915 ast.Node index,
5916 AssignmentOperator operator,
5917 ast.Node rhs,
5918 _) {
5919 handleSuperSendSet(node);
5920 }
5921
5922 void visitUnresolvedSuperCompoundIndexSet(
5923 ast.Send node,
5924 Element element,
5925 ast.Node index,
5926 AssignmentOperator operator,
5927 ast.Node rhs,
5928 _) {
5929 handleSuperSendSet(node);
5930 }
5931
5932 void visitSuperFieldCompound(
5933 ast.Send node,
5934 FieldElement field,
5935 AssignmentOperator operator,
5936 ast.Node rhs,
5937 _) {
5938 handleSuperSendSet(node);
5939 }
5940
5941 void visitFinalSuperFieldCompound(
5942 ast.Send node,
5943 FieldElement field,
5944 AssignmentOperator operator,
5945 ast.Node rhs,
5946 _) {
5947 handleSuperSendSet(node);
5948 }
5949
5950 void visitFinalSuperFieldPrefix(
5951 ast.Send node,
5952 FieldElement field,
5953 IncDecOperator operator,
5954 _) {
5955 handleSuperSendSet(node);
5956 }
5957
5958 void visitUnresolvedSuperPrefix(
5959 ast.Send node,
5960 Element element,
5961 IncDecOperator operator,
5962 _) {
5963 handleSuperSendSet(node);
5964 }
5965
5966 void visitUnresolvedSuperPostfix(
5967 ast.Send node,
5968 Element element,
5969 IncDecOperator operator,
5970 _) {
5971 handleSuperSendSet(node);
5972 }
5973
5974 void visitUnresolvedSuperCompound(
5975 ast.Send node,
5976 Element element,
5977 AssignmentOperator operator,
5978 ast.Node rhs,
5979 _) {
5980 handleSuperSendSet(node);
5981 }
5982
5983 void visitFinalSuperFieldPostfix(
5984 ast.Send node,
5985 FieldElement field,
5986 IncDecOperator operator,
5987 _) {
5988 handleSuperSendSet(node);
5989 }
5990
5991 void visitSuperFieldFieldCompound(
5992 ast.Send node,
5993 FieldElement readField,
5994 FieldElement writtenField,
5995 AssignmentOperator operator,
5996 ast.Node rhs,
5997 _) {
5998 handleSuperSendSet(node);
5999 }
6000
6001 void visitSuperGetterSetterCompound(
6002 ast.Send node,
6003 FunctionElement getter,
6004 FunctionElement setter,
6005 AssignmentOperator operator,
6006 ast.Node rhs,
6007 _) {
6008 handleSuperSendSet(node);
6009 }
6010
6011 void visitSuperMethodSetterCompound(
6012 ast.Send node,
6013 FunctionElement method,
6014 FunctionElement setter,
6015 AssignmentOperator operator,
6016 ast.Node rhs,
6017 _) {
6018 handleSuperSendSet(node);
6019 }
6020
6021 void visitSuperMethodCompound(
6022 ast.Send node,
6023 FunctionElement method,
6024 AssignmentOperator operator,
6025 ast.Node rhs,
6026 _) {
6027 handleSuperSendSet(node);
6028 }
6029
6030 void visitUnresolvedSuperGetterCompound(
6031 ast.Send node,
6032 Element element,
6033 MethodElement setter,
6034 AssignmentOperator operator,
6035 ast.Node rhs,
6036 _) {
6037 handleSuperSendSet(node);
6038 }
6039
6040 void visitUnresolvedSuperSetterCompound(
6041 ast.Send node,
6042 MethodElement getter,
6043 Element element,
6044 AssignmentOperator operator,
6045 ast.Node rhs,
6046 _) {
6047 handleSuperSendSet(node);
6048 }
6049
6050 void visitSuperFieldSetterCompound(
6051 ast.Send node,
6052 FieldElement field,
6053 FunctionElement setter,
6054 AssignmentOperator operator,
6055 ast.Node rhs,
6056 _) {
6057 handleSuperSendSet(node);
6058 }
6059
6060 void visitSuperGetterFieldCompound(
6061 ast.Send node,
6062 FunctionElement getter,
6063 FieldElement field,
6064 AssignmentOperator operator,
6065 ast.Node rhs,
6066 _) {
6067 handleSuperSendSet(node);
6068 }
6069
6070 @override
5693 void visitIndexSet( 6071 void visitIndexSet(
5694 ast.SendSet node, 6072 ast.SendSet node,
5695 ast.Node receiver, 6073 ast.Node receiver,
5696 ast.Node index, 6074 ast.Node index,
5697 ast.Node rhs, 6075 ast.Node rhs,
5698 _) { 6076 _) {
5699 generateDynamicSend(node); 6077 generateDynamicSend(node);
5700 } 6078 }
5701 6079
6080 void visitCompoundIndexSet(
6081 ast.SendSet node,
6082 ast.Node receiver,
6083 ast.Node index,
6084 AssignmentOperator operator,
6085 ast.Node rhs,
6086 _) {
6087 generateIsDeferredLoadedCheckOfSend(node);
6088 handleIndexSendSet(node);
6089 }
6090
6091
6092 void visitIndexPrefix(
6093 ast.Send node,
6094 ast.Node receiver,
6095 ast.Node index,
6096 IncDecOperator operator,
6097 _) {
6098 generateIsDeferredLoadedCheckOfSend(node);
6099 handleIndexSendSet(node);
6100 }
6101
6102 void visitIndexPostfix(
6103 ast.Send node,
6104 ast.Node receiver,
6105 ast.Node index,
6106 IncDecOperator operator,
6107 _) {
6108 generateIsDeferredLoadedCheckOfSend(node);
6109 handleIndexSendSet(node);
6110 }
6111
5702 void handleIndexSendSet(ast.SendSet node) { 6112 void handleIndexSendSet(ast.SendSet node) {
5703 ast.Operator op = node.assignmentOperator; 6113 ast.Operator op = node.assignmentOperator;
5704 if ("=" == op.source) { 6114 if ("=" == op.source) {
5705 internalError(node, "Unexpected index set."); 6115 internalError(node, "Unexpected index set.");
5706 } else { 6116 } else {
5707 visit(node.receiver); 6117 visit(node.receiver);
5708 HInstruction receiver = pop(); 6118 HInstruction receiver = pop();
5709 Link<ast.Node> arguments = node.arguments; 6119 Link<ast.Node> arguments = node.arguments;
5710 HInstruction index; 6120 HInstruction index;
5711 if (node.isIndex) { 6121 if (node.isIndex) {
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
6101 HInstruction value = pop(); 6511 HInstruction value = pop();
6102 generateNonInstanceSetter(node, element, value); 6512 generateNonInstanceSetter(node, element, value);
6103 } 6513 }
6104 if (node.isPostfix) { 6514 if (node.isPostfix) {
6105 pop(); 6515 pop();
6106 stack.add(getterInstruction); 6516 stack.add(getterInstruction);
6107 } 6517 }
6108 } 6518 }
6109 6519
6110 @override 6520 @override
6111 handleSendSet(ast.SendSet node) { 6521 void handleDynamicCompounds(
6112 ast.Operator op = node.assignmentOperator; 6522 ast.Send node,
6113 generateIsDeferredLoadedCheckOfSend(node); 6523 ast.Node receiver,
6114 Element element = elements[node]; 6524 CompoundRhs rhs,
6115 if (!Elements.isUnresolved(element) && element.impliesType) { 6525 Selector getterSelector,
6116 ast.Identifier selector = node.selector; 6526 Selector setterSelector,
6117 generateThrowNoSuchMethod(node, selector.source, 6527 _) {
6118 argumentNodes: node.arguments); 6528 handleCompoundSendSet(node);
6119 } else if (node.isSuperCall) { 6529 }
6120 handleSuperSendSet(node); 6530
6121 } else if (node.isIndex) { 6531 @override
6122 handleIndexSendSet(node); 6532 void handleLocalCompounds(
6123 } else if ("=" == op.source) { 6533 ast.SendSet node,
6124 internalError(node, "Unexpected assignment."); 6534 LocalElement local,
6125 } else if (identical(op.source, "is")) { 6535 CompoundRhs rhs,
6126 compiler.internalError(op, "is-operator as SendSet."); 6536 _,
6127 } else { 6537 {bool isSetterValid}) {
6128 assert("++" == op.source || "--" == op.source || 6538 handleCompoundSendSet(node);
6129 node.assignmentOperator.source.endsWith("=")); 6539 }
6130 handleCompoundSendSet(node); 6540
6131 } 6541 @override
6542 void handleStaticCompounds(
6543 ast.SendSet node,
6544 Element getter,
6545 CompoundGetter getterKind,
6546 Element setter,
6547 CompoundSetter setterKind,
6548 CompoundRhs rhs,
6549 _) {
6550 handleCompoundSendSet(node);
6132 } 6551 }
6133 6552
6134 void visitLiteralInt(ast.LiteralInt node) { 6553 void visitLiteralInt(ast.LiteralInt node) {
6135 stack.add(graph.addConstantInt(node.value, compiler)); 6554 stack.add(graph.addConstantInt(node.value, compiler));
6136 } 6555 }
6137 6556
6138 void visitLiteralDouble(ast.LiteralDouble node) { 6557 void visitLiteralDouble(ast.LiteralDouble node) {
6139 stack.add(graph.addConstantDouble(node.value, compiler)); 6558 stack.add(graph.addConstantDouble(node.value, compiler));
6140 } 6559 }
6141 6560
(...skipping 1422 matching lines...) Expand 10 before | Expand all | Expand 10 after
7564 visitInlinedFunction(function); 7983 visitInlinedFunction(function);
7565 } 7984 }
7566 7985
7567 void emitReturn(HInstruction value, ast.Node node) { 7986 void emitReturn(HInstruction value, ast.Node node) {
7568 if (inliningStack.isEmpty) { 7987 if (inliningStack.isEmpty) {
7569 closeAndGotoExit(attachPosition(new HReturn(value), node)); 7988 closeAndGotoExit(attachPosition(new HReturn(value), node));
7570 } else { 7989 } else {
7571 localsHandler.updateLocal(returnLocal, value); 7990 localsHandler.updateLocal(returnLocal, value);
7572 } 7991 }
7573 } 7992 }
7993
7994 @override
7995 void handleTypeLiteralConstantCompounds(
7996 ast.SendSet node,
7997 ConstantExpression constant,
7998 CompoundRhs rhs,
7999 _) {
8000 if (rhs.operator.kind == BinaryOperatorKind.IF_NULL) {
8001 handleCompoundSendSet(node);
8002 } else {
8003 handleTypeLiteralCompound(node);
8004 }
8005 }
8006
8007 @override
8008 void handleTypeVariableTypeLiteralCompounds(
8009 ast.SendSet node,
8010 TypeVariableElement typeVariable,
8011 CompoundRhs rhs,
8012 _) {
8013 handleTypeLiteralCompound(node);
8014 }
8015
8016 void handleTypeLiteralCompound(ast.SendSet node) {
8017 generateIsDeferredLoadedCheckOfSend(node);
8018 ast.Identifier selector = node.selector;
8019 generateThrowNoSuchMethod(node, selector.source,
8020 argumentNodes: node.arguments);
8021 }
8022
8023 @override
8024 visitConstantGet(
sigurdm 2015/06/26 07:44:19 void return type?
Johnni Winther 2015/06/26 10:15:25 Done.
8025 ast.Send node,
8026 ConstantExpression constant,
8027 _) {
8028 visitNode(node);
8029 }
8030
8031 @override
8032 visitConstantInvoke(
sigurdm 2015/06/26 07:44:19 void return type?
Johnni Winther 2015/06/26 10:15:25 Done.
8033 ast.Send node,
8034 ConstantExpression constant,
8035 ast.NodeList arguments,
8036 CallStructure callStreucture,
8037 _) {
8038 visitNode(node);
8039 }
8040
8041 @override
8042 void errorInvalidAssert(
8043 ast.Send node,
8044 ast.NodeList arguments,
8045 _) {
8046 visitNode(node);
8047 }
8048
8049 @override
8050 void errorUndefinedBinaryExpression(
8051 ast.Send node,
8052 ast.Node left,
8053 ast.Operator operator,
8054 ast.Node right,
8055 _) {
8056 visitNode(node);
8057 }
8058
8059 @override
8060 void errorUndefinedUnaryExpression(
8061 ast.Send node,
8062 ast.Operator operator,
8063 ast.Node expression,
8064 _) {
8065 visitNode(node);
8066 }
7574 } 8067 }
7575 8068
7576 /** 8069 /**
7577 * Visitor that handles generation of string literals (LiteralString, 8070 * Visitor that handles generation of string literals (LiteralString,
7578 * StringInterpolation), and otherwise delegates to the given visitor for 8071 * StringInterpolation), and otherwise delegates to the given visitor for
7579 * non-literal subexpressions. 8072 * non-literal subexpressions.
7580 */ 8073 */
7581 class StringBuilderVisitor extends ast.Visitor { 8074 class StringBuilderVisitor extends ast.Visitor {
7582 final SsaBuilder builder; 8075 final SsaBuilder builder;
7583 final ast.Node diagnosticNode; 8076 final ast.Node diagnosticNode;
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after
8160 if (unaliased is TypedefType) throw 'unable to unalias $type'; 8653 if (unaliased is TypedefType) throw 'unable to unalias $type';
8161 unaliased.accept(this, builder); 8654 unaliased.accept(this, builder);
8162 } 8655 }
8163 8656
8164 void visitDynamicType(DynamicType type, SsaBuilder builder) { 8657 void visitDynamicType(DynamicType type, SsaBuilder builder) {
8165 JavaScriptBackend backend = builder.compiler.backend; 8658 JavaScriptBackend backend = builder.compiler.backend;
8166 ClassElement cls = backend.findHelper('DynamicRuntimeType'); 8659 ClassElement cls = backend.findHelper('DynamicRuntimeType');
8167 builder.push(new HDynamicType(type, new TypeMask.exact(cls, classWorld))); 8660 builder.push(new HDynamicType(type, new TypeMask.exact(cls, classWorld)));
8168 } 8661 }
8169 } 8662 }
OLDNEW
« no previous file with comments | « no previous file | pkg/compiler/lib/src/ssa/ssa.dart » ('j') | pkg/compiler/lib/src/warnings.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698