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

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

Issue 2941643002: Check for a passed-in type argument vector in the prolog of generic functions. (Closed)
Patch Set: address review comments 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
« no previous file with comments | « runtime/vm/kernel_to_il.h ('k') | runtime/vm/native_arguments.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <set> 5 #include <set>
6 6
7 #include "vm/kernel_to_il.h" 7 #include "vm/kernel_to_il.h"
8 8
9 #include "vm/compiler.h" 9 #include "vm/compiler.h"
10 #include "vm/intermediate_language.h" 10 #include "vm/intermediate_language.h"
(...skipping 1159 matching lines...) Expand 10 before | Expand all | Expand 10 after
1170 ArgumentArray arguments = GetArguments(argument_count); 1170 ArgumentArray arguments = GetArguments(argument_count);
1171 const intptr_t kTypeArgsLen = 0; // Generic instance calls not yet supported. 1171 const intptr_t kTypeArgsLen = 0; // Generic instance calls not yet supported.
1172 InstanceCallInstr* call = new (Z) InstanceCallInstr( 1172 InstanceCallInstr* call = new (Z) InstanceCallInstr(
1173 position, name, kind, arguments, kTypeArgsLen, argument_names, 1173 position, name, kind, arguments, kTypeArgsLen, argument_names,
1174 num_args_checked, ic_data_array_, GetNextDeoptId()); 1174 num_args_checked, ic_data_array_, GetNextDeoptId());
1175 Push(call); 1175 Push(call);
1176 return Fragment(call); 1176 return Fragment(call);
1177 } 1177 }
1178 1178
1179 1179
1180 Fragment FlowGraphBuilder::ClosureCall(int argument_count, 1180 Fragment FlowGraphBuilder::ClosureCall(intptr_t type_args_len,
1181 intptr_t argument_count,
1181 const Array& argument_names) { 1182 const Array& argument_names) {
1182 Value* function = Pop(); 1183 Value* function = Pop();
1183 ArgumentArray arguments = GetArguments(argument_count); 1184 const intptr_t total_count = argument_count + (type_args_len > 0 ? 1 : 0);
1184 const intptr_t kTypeArgsLen = 0; // Generic closures not yet supported. 1185 ArgumentArray arguments = GetArguments(total_count);
1185 ClosureCallInstr* call = new (Z) 1186 ClosureCallInstr* call = new (Z)
1186 ClosureCallInstr(function, arguments, kTypeArgsLen, argument_names, 1187 ClosureCallInstr(function, arguments, type_args_len, argument_names,
1187 TokenPosition::kNoSource, GetNextDeoptId()); 1188 TokenPosition::kNoSource, GetNextDeoptId());
1188 Push(call); 1189 Push(call);
1189 return Fragment(call); 1190 return Fragment(call);
1190 } 1191 }
1191 1192
1192 1193
1193 Fragment FlowGraphBuilder::ThrowException(TokenPosition position) { 1194 Fragment FlowGraphBuilder::ThrowException(TokenPosition position) {
1194 Fragment instructions; 1195 Fragment instructions;
1195 instructions += Drop(); 1196 instructions += Drop();
1196 instructions += 1197 instructions +=
(...skipping 1105 matching lines...) Expand 10 before | Expand all | Expand 10 after
2302 2303
2303 TargetEntryInstr* normal_entry = BuildTargetEntry(); 2304 TargetEntryInstr* normal_entry = BuildTargetEntry();
2304 graph_entry_ = new (Z) 2305 graph_entry_ = new (Z)
2305 GraphEntryInstr(*parsed_function_, normal_entry, Compiler::kNoOSRDeoptId); 2306 GraphEntryInstr(*parsed_function_, normal_entry, Compiler::kNoOSRDeoptId);
2306 2307
2307 Fragment body(normal_entry); 2308 Fragment body(normal_entry);
2308 body += CheckStackOverflowInPrologue(); 2309 body += CheckStackOverflowInPrologue();
2309 2310
2310 LocalScope* scope = parsed_function_->node_sequence()->scope(); 2311 LocalScope* scope = parsed_function_->node_sequence()->scope();
2311 2312
2313 if (descriptor.TypeArgsLen() > 0) {
2314 LocalVariable* type_args = parsed_function_->function_type_arguments();
2315 ASSERT(type_args != NULL);
2316 body += LoadLocal(type_args);
2317 body += PushArgument();
2318 }
2319
2312 LocalVariable* closure = NULL; 2320 LocalVariable* closure = NULL;
2313 if (is_closure_call) { 2321 if (is_closure_call) {
2314 closure = scope->VariableAt(0); 2322 closure = scope->VariableAt(0);
2315 2323
2316 // The closure itself is the first argument. 2324 // The closure itself is the first argument.
2317 body += LoadLocal(closure); 2325 body += LoadLocal(closure);
2318 } else { 2326 } else {
2319 // Invoke the getter to get the field value. 2327 // Invoke the getter to get the field value.
2320 body += LoadLocal(scope->VariableAt(0)); 2328 body += LoadLocal(scope->VariableAt(0));
2321 body += PushArgument(); 2329 body += PushArgument();
2322 body += 2330 body +=
2323 InstanceCall(TokenPosition::kMinSource, getter_name, Token::kGET, 1); 2331 InstanceCall(TokenPosition::kMinSource, getter_name, Token::kGET, 1);
2324 } 2332 }
2325 2333
2326 body += PushArgument(); 2334 body += PushArgument();
2327 2335
2328 // Push all arguments onto the stack. 2336 // Push all arguments onto the stack.
2329 intptr_t pos = 1; 2337 intptr_t pos = 1;
2330 for (; pos < descriptor.Count(); pos++) { 2338 for (; pos < descriptor.Count(); pos++) {
2331 body += LoadLocal(scope->VariableAt(pos)); 2339 body += LoadLocal(scope->VariableAt(pos));
2332 body += PushArgument(); 2340 body += PushArgument();
2333 } 2341 }
2334 2342
2335 if (is_closure_call) { 2343 if (is_closure_call) {
2336 // Lookup the function in the closure. 2344 // Lookup the function in the closure.
2337 body += LoadLocal(closure); 2345 body += LoadLocal(closure);
2338 body += LoadField(Closure::function_offset()); 2346 body += LoadField(Closure::function_offset());
2339 2347
2340 body += ClosureCall(descriptor.Count(), argument_names); 2348 body += ClosureCall(descriptor.TypeArgsLen(), descriptor.Count(),
2349 argument_names);
2341 } else { 2350 } else {
2351 if (descriptor.TypeArgsLen() > 0) {
2352 UNIMPLEMENTED();
2353 }
2342 body += InstanceCall(TokenPosition::kMinSource, Symbols::Call(), 2354 body += InstanceCall(TokenPosition::kMinSource, Symbols::Call(),
2343 Token::kILLEGAL, descriptor.Count(), argument_names); 2355 Token::kILLEGAL, descriptor.Count(), argument_names);
2344 } 2356 }
2345 2357
2346 body += Return(TokenPosition::kNoSource); 2358 body += Return(TokenPosition::kNoSource);
2347 2359
2348 return new (Z) FlowGraph(*parsed_function_, graph_entry_, next_block_id_ - 1); 2360 return new (Z) FlowGraph(*parsed_function_, graph_entry_, next_block_id_ - 1);
2349 } 2361 }
2350 2362
2351 2363
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after
2739 thread->clear_sticky_error(); 2751 thread->clear_sticky_error();
2740 return error.raw(); 2752 return error.raw();
2741 } 2753 }
2742 } 2754 }
2743 2755
2744 2756
2745 } // namespace kernel 2757 } // namespace kernel
2746 } // namespace dart 2758 } // namespace dart
2747 2759
2748 #endif // !defined(DART_PRECOMPILED_RUNTIME) 2760 #endif // !defined(DART_PRECOMPILED_RUNTIME)
OLDNEW
« no previous file with comments | « runtime/vm/kernel_to_il.h ('k') | runtime/vm/native_arguments.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698