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

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

Issue 2941643002: Check for a passed-in type argument vector in the prolog of generic functions. (Closed)
Patch Set: Fix lookup in dart:_internal Created 3 years, 6 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) 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 #include "vm/scopes.h" 5 #include "vm/scopes.h"
6 6
7 #include "vm/object.h" 7 #include "vm/object.h"
8 #include "vm/stack_frame.h" 8 #include "vm/stack_frame.h"
9 #include "vm/symbols.h" 9 #include "vm/symbols.h"
10 10
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 } else { 187 } else {
188 ASSERT(context_level() == (*context_owner)->context_level()); 188 ASSERT(context_level() == (*context_owner)->context_level());
189 } 189 }
190 } 190 }
191 variable->set_index((*context_owner)->num_context_variables_++); 191 variable->set_index((*context_owner)->num_context_variables_++);
192 } 192 }
193 193
194 194
195 int LocalScope::AllocateVariables(int first_parameter_index, 195 int LocalScope::AllocateVariables(int first_parameter_index,
196 int num_parameters, 196 int num_parameters,
197 int type_args_slot,
197 int first_frame_index, 198 int first_frame_index,
198 LocalScope* context_owner, 199 LocalScope* context_owner,
199 bool* found_captured_variables) { 200 bool* found_captured_variables) {
200 // We should not allocate variables of nested functions while compiling an 201 // We should not allocate variables of nested functions while compiling an
201 // enclosing function. 202 // enclosing function.
202 ASSERT(function_level() == 0); 203 ASSERT(function_level() == 0);
203 ASSERT(num_parameters >= 0); 204 ASSERT(num_parameters >= 0);
204 // Parameters must be listed first and must all appear in the top scope. 205 // Parameters must be listed first and must all appear in the top scope.
205 ASSERT(num_parameters <= num_variables()); 206 ASSERT(num_parameters <= num_variables());
206 int pos = 0; // Current variable position. 207 int pos = 0; // Current variable position.
(...skipping 20 matching lines...) Expand all
227 // No overlapping of parameters and locals. 228 // No overlapping of parameters and locals.
228 ASSERT(frame_index >= first_frame_index); 229 ASSERT(frame_index >= first_frame_index);
229 frame_index = first_frame_index; 230 frame_index = first_frame_index;
230 while (pos < num_variables()) { 231 while (pos < num_variables()) {
231 LocalVariable* variable = VariableAt(pos); 232 LocalVariable* variable = VariableAt(pos);
232 pos++; 233 pos++;
233 if (variable->owner() == this) { 234 if (variable->owner() == this) {
234 if (variable->is_captured()) { 235 if (variable->is_captured()) {
235 AllocateContextVariable(variable, &context_owner); 236 AllocateContextVariable(variable, &context_owner);
236 *found_captured_variables = true; 237 *found_captured_variables = true;
238 if ((pos == num_parameters) && (type_args_slot == 1)) {
Vyacheslav Egorov (Google) 2017/06/20 15:21:41 can this instead be: if (variable->name().raw() =
regis 2017/06/21 04:39:04 Good point. Thanks. I never revisited this code af
239 ASSERT(variable->name().Equals(Symbols::FunctionTypeArgumentsVar()));
240 // A captured type args variable has a slot allocated in the frame and
241 // one in the context, where it gets copied to.
242 frame_index--;
243 }
237 } else { 244 } else {
238 variable->set_index(frame_index--); 245 variable->set_index(frame_index--);
239 } 246 }
240 } 247 }
241 } 248 }
242 // Allocate variables of all children. 249 // Allocate variables of all children.
243 int min_frame_index = frame_index; // Frame index decreases with allocations. 250 int min_frame_index = frame_index; // Frame index decreases with allocations.
244 LocalScope* child = this->child(); 251 LocalScope* child = this->child();
245 while (child != NULL) { 252 while (child != NULL) {
246 int const dummy_parameter_index = 0; // Ignored, since no parameters. 253 const int dummy_parameter_index = 0; // Ignored, since no parameters.
247 int const num_parameters_in_child = 0; // No parameters in children scopes. 254 const int num_parameters_in_child = 0; // No parameters in children scopes.
255 const int no_type_args_slot = 0; // No type args slot in children scopes.
248 int child_frame_index = child->AllocateVariables( 256 int child_frame_index = child->AllocateVariables(
249 dummy_parameter_index, num_parameters_in_child, frame_index, 257 dummy_parameter_index, num_parameters_in_child, no_type_args_slot,
250 context_owner, found_captured_variables); 258 frame_index, context_owner, found_captured_variables);
251 if (child_frame_index < min_frame_index) { 259 if (child_frame_index < min_frame_index) {
252 min_frame_index = child_frame_index; 260 min_frame_index = child_frame_index;
253 } 261 }
254 child = child->sibling(); 262 child = child->sibling();
255 } 263 }
256 return min_frame_index; 264 return min_frame_index;
257 } 265 }
258 266
259 267
260 // The parser creates internal variables that start with ":" 268 // The parser creates internal variables that start with ":"
(...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after
726 return fixed_parameter_count - (index() - kParamEndSlotFromFp); 734 return fixed_parameter_count - (index() - kParamEndSlotFromFp);
727 } else { 735 } else {
728 // Shift negative indexes so that the lowest one is 0 (they are still 736 // Shift negative indexes so that the lowest one is 0 (they are still
729 // non-positive). 737 // non-positive).
730 return fixed_parameter_count - (index() - kFirstLocalSlotFromFp); 738 return fixed_parameter_count - (index() - kFirstLocalSlotFromFp);
731 } 739 }
732 } 740 }
733 741
734 742
735 } // namespace dart 743 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698