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

Side by Side Diff: runtime/vm/kernel_binary_flowgraph.cc

Issue 2999633002: [kernel] Offsets on loops (Closed)
Patch Set: Fix long line Created 3 years, 4 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
OLDNEW
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 #include "vm/kernel_binary_flowgraph.h" 5 #include "vm/kernel_binary_flowgraph.h"
6 6
7 #include "vm/compiler.h" 7 #include "vm/compiler.h"
8 #include "vm/longjump.h" 8 #include "vm/longjump.h"
9 #include "vm/object_store.h" 9 #include "vm/object_store.h"
10 10
(...skipping 742 matching lines...) Expand 10 before | Expand all | Expand 10 after
753 } 753 }
754 case kLabeledStatement: 754 case kLabeledStatement:
755 VisitStatement(); // read body. 755 VisitStatement(); // read body.
756 return; 756 return;
757 case kBreakStatement: 757 case kBreakStatement:
758 builder_->ReadPosition(); // read position. 758 builder_->ReadPosition(); // read position.
759 builder_->ReadUInt(); // read target_index. 759 builder_->ReadUInt(); // read target_index.
760 return; 760 return;
761 case kWhileStatement: 761 case kWhileStatement:
762 ++depth_.loop_; 762 ++depth_.loop_;
763 builder_->ReadPosition(); // read position.
763 VisitExpression(); // read condition. 764 VisitExpression(); // read condition.
764 VisitStatement(); // read body. 765 VisitStatement(); // read body.
765 --depth_.loop_; 766 --depth_.loop_;
766 return; 767 return;
767 case kDoStatement: 768 case kDoStatement:
768 ++depth_.loop_; 769 ++depth_.loop_;
770 builder_->ReadPosition(); // read position.
769 VisitStatement(); // read body. 771 VisitStatement(); // read body.
770 VisitExpression(); // read condition. 772 VisitExpression(); // read condition.
771 --depth_.loop_; 773 --depth_.loop_;
772 return; 774 return;
773 case kForStatement: { 775 case kForStatement: {
774 PositionScope scope(builder_->reader_); 776 PositionScope scope(builder_->reader_);
775 777
776 intptr_t offset = 778 intptr_t offset =
777 builder_->ReaderOffset() - 1; // -1 to include tag byte. 779 builder_->ReaderOffset() - 1; // -1 to include tag byte.
778 780
779 EnterScope(offset); 781 EnterScope(offset);
780 782
783 TokenPosition position = builder_->ReadPosition(); // read position.
781 intptr_t list_length = 784 intptr_t list_length =
782 builder_->ReadListLength(); // read number of variables. 785 builder_->ReadListLength(); // read number of variables.
783 for (intptr_t i = 0; i < list_length; ++i) { 786 for (intptr_t i = 0; i < list_length; ++i) {
784 VisitVariableDeclaration(); // read ith variable. 787 VisitVariableDeclaration(); // read ith variable.
785 } 788 }
786 789
787 ++depth_.loop_; 790 ++depth_.loop_;
788 791
789 Tag tag = builder_->ReadTag(); // Read first part of condition. 792 Tag tag = builder_->ReadTag(); // Read first part of condition.
790 if (tag == kSomething) { 793 if (tag == kSomething) {
791 VisitExpression(); // read rest of condition. 794 VisitExpression(); // read rest of condition.
792 } 795 }
793 list_length = builder_->ReadListLength(); // read number of updates. 796 list_length = builder_->ReadListLength(); // read number of updates.
794 for (intptr_t i = 0; i < list_length; ++i) { 797 for (intptr_t i = 0; i < list_length; ++i) {
795 VisitExpression(); // read ith update. 798 VisitExpression(); // read ith update.
796 } 799 }
797 VisitStatement(); // read body. 800 VisitStatement(); // read body.
798 801
799 --depth_.loop_; 802 --depth_.loop_;
800 803
801 ExitScope(builder_->reader_->min_position(), 804 ExitScope(position, builder_->reader_->max_position());
802 builder_->reader_->max_position());
803 return; 805 return;
804 } 806 }
805 case kForInStatement: 807 case kForInStatement:
806 case kAsyncForInStatement: { 808 case kAsyncForInStatement: {
807 PositionScope scope(builder_->reader_); 809 PositionScope scope(builder_->reader_);
808 810
809 intptr_t start_offset = 811 intptr_t start_offset =
810 builder_->ReaderOffset() - 1; // -1 to include tag byte. 812 builder_->ReaderOffset() - 1; // -1 to include tag byte.
811 813
812 TokenPosition position = builder_->ReadPosition(); // read position. 814 builder_->ReadPosition(); // read position.
815 TokenPosition body_position =
816 builder_->ReadPosition(); // read body position.
813 817
814 // Notice the ordering: We skip the variable, read the iterable, go back, 818 // Notice the ordering: We skip the variable, read the iterable, go back,
815 // re-read the variable, go forward to after having read the iterable. 819 // re-read the variable, go forward to after having read the iterable.
816 intptr_t offset = builder_->ReaderOffset(); 820 intptr_t offset = builder_->ReaderOffset();
817 builder_->SkipVariableDeclaration(); // read variable. 821 builder_->SkipVariableDeclaration(); // read variable.
818 VisitExpression(); // read iterable. 822 VisitExpression(); // read iterable.
819 823
820 ++depth_.for_in_; 824 ++depth_.for_in_;
821 AddIteratorVariable(); 825 AddIteratorVariable();
822 ++depth_.loop_; 826 ++depth_.loop_;
823 EnterScope(start_offset); 827 EnterScope(start_offset);
824 828
825 { 829 {
826 AlternativeReadingScope alt(builder_->reader_, offset); 830 AlternativeReadingScope alt(builder_->reader_, offset);
827 VisitVariableDeclaration(); // read variable. 831 VisitVariableDeclaration(); // read variable.
828 } 832 }
829 VisitStatement(); // read body. 833 VisitStatement(); // read body.
830 834
831 if (!position.IsReal()) { 835 if (!body_position.IsReal()) {
832 position = builder_->reader_->min_position(); 836 body_position = builder_->reader_->min_position();
833 } 837 }
834 // TODO(jensj): From kernel_binary.cc 838 // TODO(jensj): From kernel_binary.cc
835 // forinstmt->variable_->set_end_position(forinstmt->position_); 839 // forinstmt->variable_->set_end_position(forinstmt->position_);
836 ExitScope(position, builder_->reader_->max_position()); 840 ExitScope(body_position, builder_->reader_->max_position());
837 --depth_.loop_; 841 --depth_.loop_;
838 --depth_.for_in_; 842 --depth_.for_in_;
839 return; 843 return;
840 } 844 }
841 case kSwitchStatement: { 845 case kSwitchStatement: {
842 AddSwitchVariable(); 846 AddSwitchVariable();
843 VisitExpression(); // read condition. 847 VisitExpression(); // read condition.
844 int case_count = builder_->ReadListLength(); // read number of cases. 848 int case_count = builder_->ReadListLength(); // read number of cases.
845 for (intptr_t i = 0; i < case_count; ++i) { 849 for (intptr_t i = 0; i < case_count; ++i) {
846 int expression_count = 850 int expression_count =
(...skipping 3250 matching lines...) Expand 10 before | Expand all | Expand 10 after
4097 return; 4101 return;
4098 } 4102 }
4099 case kLabeledStatement: 4103 case kLabeledStatement:
4100 SkipStatement(); // read body. 4104 SkipStatement(); // read body.
4101 return; 4105 return;
4102 case kBreakStatement: 4106 case kBreakStatement:
4103 ReadPosition(); // read position. 4107 ReadPosition(); // read position.
4104 ReadUInt(); // read target_index. 4108 ReadUInt(); // read target_index.
4105 return; 4109 return;
4106 case kWhileStatement: 4110 case kWhileStatement:
4111 ReadPosition(); // read position.
ahe 2017/08/08 11:38:51 print("Hello, World!"); // Prints "Hello, World!"
4107 SkipExpression(); // read condition. 4112 SkipExpression(); // read condition.
ahe 2017/08/08 11:38:51 Similarly, adding a comment that contradicts with
4108 SkipStatement(); // read body. 4113 SkipStatement(); // read body.
4109 return; 4114 return;
4110 case kDoStatement: 4115 case kDoStatement:
4116 ReadPosition(); // read position.
4111 SkipStatement(); // read body. 4117 SkipStatement(); // read body.
4112 SkipExpression(); // read condition. 4118 SkipExpression(); // read condition.
4113 return; 4119 return;
4114 case kForStatement: { 4120 case kForStatement: {
4121 ReadPosition(); // read position.
4115 SkipListOfVariableDeclarations(); // read variables. 4122 SkipListOfVariableDeclarations(); // read variables.
4116 Tag tag = ReadTag(); // Read first part of condition. 4123 Tag tag = ReadTag(); // Read first part of condition.
ahe 2017/08/08 11:38:51 Generally, comments should start with an uppercase
4117 if (tag == kSomething) { 4124 if (tag == kSomething) {
4118 SkipExpression(); // read rest of condition. 4125 SkipExpression(); // read rest of condition.
4119 } 4126 }
4120 SkipListOfExpressions(); // read updates. 4127 SkipListOfExpressions(); // read updates.
4121 SkipStatement(); // read body. 4128 SkipStatement(); // read body.
4122 return; 4129 return;
4123 } 4130 }
4124 case kForInStatement: 4131 case kForInStatement:
4125 case kAsyncForInStatement: 4132 case kAsyncForInStatement:
4126 ReadPosition(); // read position. 4133 ReadPosition(); // read position.
ahe 2017/08/08 11:38:51 Read position of what?
4134 ReadPosition(); // read body position.
ahe 2017/08/08 11:38:51 This comment adds value as it adds additional info
4127 SkipVariableDeclaration(); // read variable. 4135 SkipVariableDeclaration(); // read variable.
4128 SkipExpression(); // read iterable. 4136 SkipExpression(); // read iterable.
4129 SkipStatement(); // read body. 4137 SkipStatement(); // read body.
4130 return; 4138 return;
4131 case kSwitchStatement: { 4139 case kSwitchStatement: {
4132 SkipExpression(); // read condition. 4140 SkipExpression(); // read condition.
4133 int case_count = ReadListLength(); // read number of cases. 4141 int case_count = ReadListLength(); // read number of cases.
4134 for (intptr_t i = 0; i < case_count; ++i) { 4142 for (intptr_t i = 0; i < case_count; ++i) {
4135 int expression_count = ReadListLength(); // read number of expressions. 4143 int expression_count = ReadListLength(); // read number of expressions.
4136 for (intptr_t j = 0; j < expression_count; ++j) { 4144 for (intptr_t j = 0; j < expression_count; ++j) {
(...skipping 1945 matching lines...) Expand 10 before | Expand all | Expand 10 after
6082 if (NeedsDebugStepCheck(parsed_function()->function(), position)) { 6090 if (NeedsDebugStepCheck(parsed_function()->function(), position)) {
6083 instructions += DebugStepCheck(position); 6091 instructions += DebugStepCheck(position);
6084 } 6092 }
6085 instructions += Goto(destination); 6093 instructions += Goto(destination);
6086 } 6094 }
6087 return instructions; 6095 return instructions;
6088 } 6096 }
6089 6097
6090 Fragment StreamingFlowGraphBuilder::BuildWhileStatement() { 6098 Fragment StreamingFlowGraphBuilder::BuildWhileStatement() {
6091 loop_depth_inc(); 6099 loop_depth_inc();
6100 ReadPosition(); // read position.
6101
6092 bool negate; 6102 bool negate;
6093 Fragment condition = TranslateCondition(&negate); // read condition. 6103 Fragment condition = TranslateCondition(&negate); // read condition.
6094 TargetEntryInstr* body_entry; 6104 TargetEntryInstr* body_entry;
6095 TargetEntryInstr* loop_exit; 6105 TargetEntryInstr* loop_exit;
6096 condition += BranchIfTrue(&body_entry, &loop_exit, negate); 6106 condition += BranchIfTrue(&body_entry, &loop_exit, negate);
6097 6107
6098 Fragment body(body_entry); 6108 Fragment body(body_entry);
6099 body += BuildStatement(); // read body. 6109 body += BuildStatement(); // read body.
6100 6110
6101 Instruction* entry; 6111 Instruction* entry;
6102 if (body.is_open()) { 6112 if (body.is_open()) {
6103 JoinEntryInstr* join = BuildJoinEntry(); 6113 JoinEntryInstr* join = BuildJoinEntry();
6104 body += Goto(join); 6114 body += Goto(join);
6105 6115
6106 Fragment loop(join); 6116 Fragment loop(join);
6107 loop += CheckStackOverflow(); 6117 loop += CheckStackOverflow();
6108 loop += condition; 6118 loop += condition;
6109 entry = new (Z) GotoInstr(join, Thread::Current()->GetNextDeoptId()); 6119 entry = new (Z) GotoInstr(join, Thread::Current()->GetNextDeoptId());
6110 } else { 6120 } else {
6111 entry = condition.entry; 6121 entry = condition.entry;
6112 } 6122 }
6113 6123
6114 loop_depth_dec(); 6124 loop_depth_dec();
6115 return Fragment(entry, loop_exit); 6125 return Fragment(entry, loop_exit);
6116 } 6126 }
6117 6127
6118 Fragment StreamingFlowGraphBuilder::BuildDoStatement() { 6128 Fragment StreamingFlowGraphBuilder::BuildDoStatement() {
6119 loop_depth_inc(); 6129 loop_depth_inc();
6130 ReadPosition(); // read position.
6120 Fragment body = BuildStatement(); // read body. 6131 Fragment body = BuildStatement(); // read body.
6121 6132
6122 if (body.is_closed()) { 6133 if (body.is_closed()) {
6123 SkipExpression(); // read condition. 6134 SkipExpression(); // read condition.
6124 loop_depth_dec(); 6135 loop_depth_dec();
6125 return body; 6136 return body;
6126 } 6137 }
6127 6138
6128 bool negate; 6139 bool negate;
6129 JoinEntryInstr* join = BuildJoinEntry(); 6140 JoinEntryInstr* join = BuildJoinEntry();
6130 Fragment loop(join); 6141 Fragment loop(join);
6131 loop += CheckStackOverflow(); 6142 loop += CheckStackOverflow();
6132 loop += body; 6143 loop += body;
6133 loop += TranslateCondition(&negate); // read condition. 6144 loop += TranslateCondition(&negate); // read condition.
6134 TargetEntryInstr* loop_repeat; 6145 TargetEntryInstr* loop_repeat;
6135 TargetEntryInstr* loop_exit; 6146 TargetEntryInstr* loop_exit;
6136 loop += BranchIfTrue(&loop_repeat, &loop_exit, negate); 6147 loop += BranchIfTrue(&loop_repeat, &loop_exit, negate);
6137 6148
6138 Fragment repeat(loop_repeat); 6149 Fragment repeat(loop_repeat);
6139 repeat += Goto(join); 6150 repeat += Goto(join);
6140 6151
6141 loop_depth_dec(); 6152 loop_depth_dec();
6142 return Fragment(new (Z) GotoInstr(join, Thread::Current()->GetNextDeoptId()), 6153 return Fragment(new (Z) GotoInstr(join, Thread::Current()->GetNextDeoptId()),
6143 loop_exit); 6154 loop_exit);
6144 } 6155 }
6145 6156
6146 Fragment StreamingFlowGraphBuilder::BuildForStatement() { 6157 Fragment StreamingFlowGraphBuilder::BuildForStatement() {
6147 intptr_t offset = ReaderOffset() - 1; // Include the tag. 6158 intptr_t offset = ReaderOffset() - 1; // Include the tag.
6148 6159
6160 ReadPosition(); // read position.
6161
6149 Fragment declarations; 6162 Fragment declarations;
6150 6163
6151 bool new_context = false; 6164 bool new_context = false;
6152 declarations += EnterScope(offset, &new_context); 6165 declarations += EnterScope(offset, &new_context);
6153 6166
6154 intptr_t list_length = ReadListLength(); // read number of variables. 6167 intptr_t list_length = ReadListLength(); // read number of variables.
6155 for (intptr_t i = 0; i < list_length; ++i) { 6168 for (intptr_t i = 0; i < list_length; ++i) {
6156 declarations += BuildVariableDeclaration(); // read ith variable. 6169 declarations += BuildVariableDeclaration(); // read ith variable.
6157 } 6170 }
6158 6171
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
6200 loop_depth_dec(); 6213 loop_depth_dec();
6201 6214
6202 loop += ExitScope(offset); 6215 loop += ExitScope(offset);
6203 6216
6204 return loop; 6217 return loop;
6205 } 6218 }
6206 6219
6207 Fragment StreamingFlowGraphBuilder::BuildForInStatement(bool async) { 6220 Fragment StreamingFlowGraphBuilder::BuildForInStatement(bool async) {
6208 intptr_t offset = ReaderOffset() - 1; // Include the tag. 6221 intptr_t offset = ReaderOffset() - 1; // Include the tag.
6209 6222
6210 TokenPosition position = ReadPosition(); // read position. 6223 ReadPosition(); // read position.
ahe 2017/08/08 11:38:51 Of what?
6224 TokenPosition body_position = ReadPosition(); // read body position.
6211 intptr_t variable_kernel_position = ReaderOffset(); 6225 intptr_t variable_kernel_position = ReaderOffset();
6212 SkipVariableDeclaration(); // read variable. 6226 SkipVariableDeclaration(); // read variable.
6213 6227
6214 TokenPosition iterable_position = TokenPosition::kNoSource; 6228 TokenPosition iterable_position = TokenPosition::kNoSource;
6215 Fragment instructions = 6229 Fragment instructions =
6216 BuildExpression(&iterable_position); // read iterable. 6230 BuildExpression(&iterable_position); // read iterable.
6217 instructions += PushArgument(); 6231 instructions += PushArgument();
6218 6232
6219 const dart::String& iterator_getter = dart::String::ZoneHandle( 6233 const dart::String& iterator_getter = dart::String::ZoneHandle(
6220 Z, dart::Field::GetterSymbol(Symbols::Iterator())); 6234 Z, dart::Field::GetterSymbol(Symbols::Iterator()));
(...skipping 12 matching lines...) Expand all
6233 TargetEntryInstr* body_entry; 6247 TargetEntryInstr* body_entry;
6234 TargetEntryInstr* loop_exit; 6248 TargetEntryInstr* loop_exit;
6235 condition += BranchIfTrue(&body_entry, &loop_exit, false); 6249 condition += BranchIfTrue(&body_entry, &loop_exit, false);
6236 6250
6237 Fragment body(body_entry); 6251 Fragment body(body_entry);
6238 body += EnterScope(offset); 6252 body += EnterScope(offset);
6239 body += LoadLocal(iterator); 6253 body += LoadLocal(iterator);
6240 body += PushArgument(); 6254 body += PushArgument();
6241 const dart::String& current_getter = dart::String::ZoneHandle( 6255 const dart::String& current_getter = dart::String::ZoneHandle(
6242 Z, dart::Field::GetterSymbol(Symbols::Current())); 6256 Z, dart::Field::GetterSymbol(Symbols::Current()));
6243 body += InstanceCall(position, current_getter, Token::kGET, 1); 6257 body += InstanceCall(body_position, current_getter, Token::kGET, 1);
6244 body += StoreLocal(TokenPosition::kNoSource, 6258 body += StoreLocal(TokenPosition::kNoSource,
6245 LookupVariable(variable_kernel_position)); 6259 LookupVariable(variable_kernel_position));
6246 body += Drop(); 6260 body += Drop();
6247 body += BuildStatement(); // read body. 6261 body += BuildStatement(); // read body.
6248 body += ExitScope(offset); 6262 body += ExitScope(offset);
6249 6263
6250 if (body.is_open()) { 6264 if (body.is_open()) {
6251 JoinEntryInstr* join = BuildJoinEntry(); 6265 JoinEntryInstr* join = BuildJoinEntry();
6252 instructions += Goto(join); 6266 instructions += Goto(join);
6253 body += Goto(join); 6267 body += Goto(join);
(...skipping 1060 matching lines...) Expand 10 before | Expand all | Expand 10 after
7314 } 7328 }
7315 } 7329 }
7316 7330
7317 return Array::Handle(Array::null()); 7331 return Array::Handle(Array::null());
7318 } 7332 }
7319 7333
7320 } // namespace kernel 7334 } // namespace kernel
7321 } // namespace dart 7335 } // namespace dart
7322 7336
7323 #endif // !defined(DART_PRECOMPILED_RUNTIME) 7337 #endif // !defined(DART_PRECOMPILED_RUNTIME)
OLDNEW
« pkg/kernel/lib/binary/ast_to_binary.dart ('K') | « pkg/kernel/lib/binary/ast_to_binary.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698