OLD | NEW |
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 1999 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2010 | 2010 |
2011 | 2011 |
2012 FlowGraphBuilder::FlowGraphBuilder( | 2012 FlowGraphBuilder::FlowGraphBuilder( |
2013 TreeNode* node, | 2013 TreeNode* node, |
2014 ParsedFunction* parsed_function, | 2014 ParsedFunction* parsed_function, |
2015 const ZoneGrowableArray<const ICData*>& ic_data_array, | 2015 const ZoneGrowableArray<const ICData*>& ic_data_array, |
2016 InlineExitCollector* exit_collector, | 2016 InlineExitCollector* exit_collector, |
2017 intptr_t osr_id, | 2017 intptr_t osr_id, |
2018 intptr_t first_block_id) | 2018 intptr_t first_block_id) |
2019 : translation_helper_(Thread::Current()), | 2019 : translation_helper_(Thread::Current()), |
| 2020 thread_(translation_helper_.thread()), |
2020 zone_(translation_helper_.zone()), | 2021 zone_(translation_helper_.zone()), |
2021 node_(node), | 2022 node_(node), |
2022 parsed_function_(parsed_function), | 2023 parsed_function_(parsed_function), |
2023 osr_id_(osr_id), | 2024 osr_id_(osr_id), |
2024 ic_data_array_(ic_data_array), | 2025 ic_data_array_(ic_data_array), |
2025 exit_collector_(exit_collector), | 2026 exit_collector_(exit_collector), |
2026 next_block_id_(first_block_id), | 2027 next_block_id_(first_block_id), |
2027 next_function_id_(0), | 2028 next_function_id_(0), |
2028 context_depth_(0), | 2029 context_depth_(0), |
2029 loop_depth_(0), | 2030 loop_depth_(0), |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2241 | 2242 |
2242 Fragment FlowGraphBuilder::LoadFunctionTypeArguments() { | 2243 Fragment FlowGraphBuilder::LoadFunctionTypeArguments() { |
2243 UNIMPLEMENTED(); // TODO(regis) | 2244 UNIMPLEMENTED(); // TODO(regis) |
2244 return Fragment(NULL); | 2245 return Fragment(NULL); |
2245 } | 2246 } |
2246 | 2247 |
2247 | 2248 |
2248 Fragment FlowGraphBuilder::InstantiateType(const AbstractType& type) { | 2249 Fragment FlowGraphBuilder::InstantiateType(const AbstractType& type) { |
2249 Value* function_type_args = Pop(); | 2250 Value* function_type_args = Pop(); |
2250 Value* instantiator_type_args = Pop(); | 2251 Value* instantiator_type_args = Pop(); |
2251 InstantiateTypeInstr* instr = | 2252 InstantiateTypeInstr* instr = new (Z) InstantiateTypeInstr( |
2252 new (Z) InstantiateTypeInstr(TokenPosition::kNoSource, type, | 2253 TokenPosition::kNoSource, type, instantiator_type_args, |
2253 instantiator_type_args, function_type_args); | 2254 function_type_args, GetNextDeoptId()); |
2254 Push(instr); | 2255 Push(instr); |
2255 return Fragment(instr); | 2256 return Fragment(instr); |
2256 } | 2257 } |
2257 | 2258 |
2258 | 2259 |
2259 Fragment FlowGraphBuilder::InstantiateTypeArguments( | 2260 Fragment FlowGraphBuilder::InstantiateTypeArguments( |
2260 const TypeArguments& type_arguments) { | 2261 const TypeArguments& type_arguments) { |
2261 Value* function_type_args = Pop(); | 2262 Value* function_type_args = Pop(); |
2262 Value* instantiator_type_args = Pop(); | 2263 Value* instantiator_type_args = Pop(); |
2263 InstantiateTypeArgumentsInstr* instr = new (Z) InstantiateTypeArgumentsInstr( | 2264 InstantiateTypeArgumentsInstr* instr = new (Z) InstantiateTypeArgumentsInstr( |
2264 TokenPosition::kNoSource, type_arguments, *active_class_.klass, | 2265 TokenPosition::kNoSource, type_arguments, *active_class_.klass, |
2265 instantiator_type_args, function_type_args); | 2266 instantiator_type_args, function_type_args, GetNextDeoptId()); |
2266 Push(instr); | 2267 Push(instr); |
2267 return Fragment(instr); | 2268 return Fragment(instr); |
2268 } | 2269 } |
2269 | 2270 |
2270 | 2271 |
2271 Fragment FlowGraphBuilder::TranslateInstantiatedTypeArguments( | 2272 Fragment FlowGraphBuilder::TranslateInstantiatedTypeArguments( |
2272 const TypeArguments& type_arguments) { | 2273 const TypeArguments& type_arguments) { |
2273 Fragment instructions; | 2274 Fragment instructions; |
2274 | 2275 |
2275 if (type_arguments.IsNull() || type_arguments.IsInstantiated()) { | 2276 if (type_arguments.IsNull() || type_arguments.IsInstantiated()) { |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2345 BooleanNegateInstr* negate = new (Z) BooleanNegateInstr(Pop()); | 2346 BooleanNegateInstr* negate = new (Z) BooleanNegateInstr(Pop()); |
2346 Push(negate); | 2347 Push(negate); |
2347 return Fragment(negate); | 2348 return Fragment(negate); |
2348 } | 2349 } |
2349 | 2350 |
2350 | 2351 |
2351 Fragment FlowGraphBuilder::StrictCompare(Token::Kind kind, | 2352 Fragment FlowGraphBuilder::StrictCompare(Token::Kind kind, |
2352 bool number_check /* = false */) { | 2353 bool number_check /* = false */) { |
2353 Value* right = Pop(); | 2354 Value* right = Pop(); |
2354 Value* left = Pop(); | 2355 Value* left = Pop(); |
2355 StrictCompareInstr* compare = new (Z) StrictCompareInstr( | 2356 StrictCompareInstr* compare = |
2356 TokenPosition::kNoSource, kind, left, right, number_check); | 2357 new (Z) StrictCompareInstr(TokenPosition::kNoSource, kind, left, right, |
| 2358 number_check, GetNextDeoptId()); |
2357 Push(compare); | 2359 Push(compare); |
2358 return Fragment(compare); | 2360 return Fragment(compare); |
2359 } | 2361 } |
2360 | 2362 |
2361 | 2363 |
2362 Fragment FlowGraphBuilder::BranchIfTrue(TargetEntryInstr** then_entry, | 2364 Fragment FlowGraphBuilder::BranchIfTrue(TargetEntryInstr** then_entry, |
2363 TargetEntryInstr** otherwise_entry, | 2365 TargetEntryInstr** otherwise_entry, |
2364 bool negate) { | 2366 bool negate) { |
2365 Fragment instructions = Constant(Bool::True()); | 2367 Fragment instructions = Constant(Bool::True()); |
2366 return instructions + BranchIfEqual(then_entry, otherwise_entry, negate); | 2368 return instructions + BranchIfEqual(then_entry, otherwise_entry, negate); |
2367 } | 2369 } |
2368 | 2370 |
2369 | 2371 |
2370 Fragment FlowGraphBuilder::BranchIfNull(TargetEntryInstr** then_entry, | 2372 Fragment FlowGraphBuilder::BranchIfNull(TargetEntryInstr** then_entry, |
2371 TargetEntryInstr** otherwise_entry, | 2373 TargetEntryInstr** otherwise_entry, |
2372 bool negate) { | 2374 bool negate) { |
2373 Fragment instructions = NullConstant(); | 2375 Fragment instructions = NullConstant(); |
2374 return instructions + BranchIfEqual(then_entry, otherwise_entry, negate); | 2376 return instructions + BranchIfEqual(then_entry, otherwise_entry, negate); |
2375 } | 2377 } |
2376 | 2378 |
2377 Fragment FlowGraphBuilder::BranchIfEqual(TargetEntryInstr** then_entry, | 2379 Fragment FlowGraphBuilder::BranchIfEqual(TargetEntryInstr** then_entry, |
2378 TargetEntryInstr** otherwise_entry, | 2380 TargetEntryInstr** otherwise_entry, |
2379 bool negate) { | 2381 bool negate) { |
2380 Value* right_value = Pop(); | 2382 Value* right_value = Pop(); |
2381 Value* left_value = Pop(); | 2383 Value* left_value = Pop(); |
2382 StrictCompareInstr* compare = new (Z) StrictCompareInstr( | 2384 StrictCompareInstr* compare = new (Z) StrictCompareInstr( |
2383 TokenPosition::kNoSource, negate ? Token::kNE_STRICT : Token::kEQ_STRICT, | 2385 TokenPosition::kNoSource, negate ? Token::kNE_STRICT : Token::kEQ_STRICT, |
2384 left_value, right_value, false); | 2386 left_value, right_value, false, GetNextDeoptId()); |
2385 BranchInstr* branch = new (Z) BranchInstr(compare); | 2387 BranchInstr* branch = new (Z) BranchInstr(compare, GetNextDeoptId()); |
2386 *then_entry = *branch->true_successor_address() = BuildTargetEntry(); | 2388 *then_entry = *branch->true_successor_address() = BuildTargetEntry(); |
2387 *otherwise_entry = *branch->false_successor_address() = BuildTargetEntry(); | 2389 *otherwise_entry = *branch->false_successor_address() = BuildTargetEntry(); |
2388 return Fragment(branch).closed(); | 2390 return Fragment(branch).closed(); |
2389 } | 2391 } |
2390 | 2392 |
2391 | 2393 |
2392 Fragment FlowGraphBuilder::BranchIfStrictEqual( | 2394 Fragment FlowGraphBuilder::BranchIfStrictEqual( |
2393 TargetEntryInstr** then_entry, | 2395 TargetEntryInstr** then_entry, |
2394 TargetEntryInstr** otherwise_entry) { | 2396 TargetEntryInstr** otherwise_entry) { |
2395 Value* rhs = Pop(); | 2397 Value* rhs = Pop(); |
2396 Value* lhs = Pop(); | 2398 Value* lhs = Pop(); |
2397 StrictCompareInstr* compare = new (Z) StrictCompareInstr( | 2399 StrictCompareInstr* compare = |
2398 TokenPosition::kNoSource, Token::kEQ_STRICT, lhs, rhs, false); | 2400 new (Z) StrictCompareInstr(TokenPosition::kNoSource, Token::kEQ_STRICT, |
2399 BranchInstr* branch = new (Z) BranchInstr(compare); | 2401 lhs, rhs, false, GetNextDeoptId()); |
| 2402 BranchInstr* branch = new (Z) BranchInstr(compare, GetNextDeoptId()); |
2400 *then_entry = *branch->true_successor_address() = BuildTargetEntry(); | 2403 *then_entry = *branch->true_successor_address() = BuildTargetEntry(); |
2401 *otherwise_entry = *branch->false_successor_address() = BuildTargetEntry(); | 2404 *otherwise_entry = *branch->false_successor_address() = BuildTargetEntry(); |
2402 return Fragment(branch).closed(); | 2405 return Fragment(branch).closed(); |
2403 } | 2406 } |
2404 | 2407 |
2405 | 2408 |
2406 Fragment FlowGraphBuilder::CatchBlockEntry(const Array& handler_types, | 2409 Fragment FlowGraphBuilder::CatchBlockEntry(const Array& handler_types, |
2407 intptr_t handler_index, | 2410 intptr_t handler_index, |
2408 bool needs_stacktrace) { | 2411 bool needs_stacktrace) { |
2409 ASSERT(CurrentException()->is_captured() == | 2412 ASSERT(CurrentException()->is_captured() == |
(...skipping 29 matching lines...) Expand all Loading... |
2439 } | 2442 } |
2440 | 2443 |
2441 | 2444 |
2442 Fragment FlowGraphBuilder::TryCatch(int try_handler_index) { | 2445 Fragment FlowGraphBuilder::TryCatch(int try_handler_index) { |
2443 // The body of the try needs to have it's own block in order to get a new try | 2446 // The body of the try needs to have it's own block in order to get a new try |
2444 // index. | 2447 // index. |
2445 // | 2448 // |
2446 // => We therefore create a block for the body (fresh try index) and another | 2449 // => We therefore create a block for the body (fresh try index) and another |
2447 // join block (with current try index). | 2450 // join block (with current try index). |
2448 Fragment body; | 2451 Fragment body; |
2449 JoinEntryInstr* entry = | 2452 JoinEntryInstr* entry = new (Z) |
2450 new (Z) JoinEntryInstr(AllocateBlockId(), try_handler_index); | 2453 JoinEntryInstr(AllocateBlockId(), try_handler_index, GetNextDeoptId()); |
2451 body += LoadLocal(parsed_function_->current_context_var()); | 2454 body += LoadLocal(parsed_function_->current_context_var()); |
2452 body += StoreLocal(TokenPosition::kNoSource, CurrentCatchContext()); | 2455 body += StoreLocal(TokenPosition::kNoSource, CurrentCatchContext()); |
2453 body += Drop(); | 2456 body += Drop(); |
2454 body += Goto(entry); | 2457 body += Goto(entry); |
2455 return Fragment(body.entry, entry); | 2458 return Fragment(body.entry, entry); |
2456 } | 2459 } |
2457 | 2460 |
2458 | 2461 |
2459 Fragment FlowGraphBuilder::CheckStackOverflowInPrologue() { | 2462 Fragment FlowGraphBuilder::CheckStackOverflowInPrologue() { |
2460 if (IsInlining()) { | 2463 if (IsInlining()) { |
2461 // If we are inlining don't actually attach the stack check. We must still | 2464 // If we are inlining don't actually attach the stack check. We must still |
2462 // create the stack check in order to allocate a deopt id. | 2465 // create the stack check in order to allocate a deopt id. |
2463 CheckStackOverflow(); | 2466 CheckStackOverflow(); |
2464 return Fragment(); | 2467 return Fragment(); |
2465 } | 2468 } |
2466 return CheckStackOverflow(); | 2469 return CheckStackOverflow(); |
2467 } | 2470 } |
2468 | 2471 |
2469 | 2472 |
2470 Fragment FlowGraphBuilder::CheckStackOverflow() { | 2473 Fragment FlowGraphBuilder::CheckStackOverflow() { |
2471 return Fragment( | 2474 return Fragment(new (Z) CheckStackOverflowInstr( |
2472 new (Z) CheckStackOverflowInstr(TokenPosition::kNoSource, loop_depth_)); | 2475 TokenPosition::kNoSource, loop_depth_, GetNextDeoptId())); |
2473 } | 2476 } |
2474 | 2477 |
2475 | 2478 |
2476 Fragment FlowGraphBuilder::CloneContext() { | 2479 Fragment FlowGraphBuilder::CloneContext() { |
2477 LocalVariable* context_variable = parsed_function_->current_context_var(); | 2480 LocalVariable* context_variable = parsed_function_->current_context_var(); |
2478 | 2481 |
2479 Fragment instructions = LoadLocal(context_variable); | 2482 Fragment instructions = LoadLocal(context_variable); |
2480 | 2483 |
2481 CloneContextInstr* clone_instruction = | 2484 CloneContextInstr* clone_instruction = new (Z) |
2482 new (Z) CloneContextInstr(TokenPosition::kNoSource, Pop()); | 2485 CloneContextInstr(TokenPosition::kNoSource, Pop(), GetNextDeoptId()); |
2483 instructions <<= clone_instruction; | 2486 instructions <<= clone_instruction; |
2484 Push(clone_instruction); | 2487 Push(clone_instruction); |
2485 | 2488 |
2486 instructions += StoreLocal(TokenPosition::kNoSource, context_variable); | 2489 instructions += StoreLocal(TokenPosition::kNoSource, context_variable); |
2487 instructions += Drop(); | 2490 instructions += Drop(); |
2488 return instructions; | 2491 return instructions; |
2489 } | 2492 } |
2490 | 2493 |
2491 | 2494 |
2492 Fragment FlowGraphBuilder::Constant(const Object& value) { | 2495 Fragment FlowGraphBuilder::Constant(const Object& value) { |
2493 ASSERT(value.IsNotTemporaryScopedHandle()); | 2496 ASSERT(value.IsNotTemporaryScopedHandle()); |
2494 ConstantInstr* constant = new (Z) ConstantInstr(value); | 2497 ConstantInstr* constant = new (Z) ConstantInstr(value); |
2495 Push(constant); | 2498 Push(constant); |
2496 return Fragment(constant); | 2499 return Fragment(constant); |
2497 } | 2500 } |
2498 | 2501 |
2499 | 2502 |
2500 Fragment FlowGraphBuilder::CreateArray() { | 2503 Fragment FlowGraphBuilder::CreateArray() { |
2501 Value* element_count = Pop(); | 2504 Value* element_count = Pop(); |
2502 CreateArrayInstr* array = new (Z) CreateArrayInstr(TokenPosition::kNoSource, | 2505 CreateArrayInstr* array = |
2503 Pop(), // Element type. | 2506 new (Z) CreateArrayInstr(TokenPosition::kNoSource, |
2504 element_count); | 2507 Pop(), // Element type. |
| 2508 element_count, GetNextDeoptId()); |
2505 Push(array); | 2509 Push(array); |
2506 return Fragment(array); | 2510 return Fragment(array); |
2507 } | 2511 } |
2508 | 2512 |
2509 | 2513 |
2510 Fragment FlowGraphBuilder::Goto(JoinEntryInstr* destination) { | 2514 Fragment FlowGraphBuilder::Goto(JoinEntryInstr* destination) { |
2511 return Fragment(new (Z) GotoInstr(destination)).closed(); | 2515 return Fragment(new (Z) GotoInstr(destination, GetNextDeoptId())).closed(); |
2512 } | 2516 } |
2513 | 2517 |
2514 | 2518 |
2515 Fragment FlowGraphBuilder::IntConstant(int64_t value) { | 2519 Fragment FlowGraphBuilder::IntConstant(int64_t value) { |
2516 return Fragment( | 2520 return Fragment( |
2517 Constant(Integer::ZoneHandle(Z, Integer::New(value, Heap::kOld)))); | 2521 Constant(Integer::ZoneHandle(Z, Integer::New(value, Heap::kOld)))); |
2518 } | 2522 } |
2519 | 2523 |
2520 | 2524 |
2521 Fragment FlowGraphBuilder::InstanceCall(TokenPosition position, | 2525 Fragment FlowGraphBuilder::InstanceCall(TokenPosition position, |
2522 const dart::String& name, | 2526 const dart::String& name, |
2523 Token::Kind kind, | 2527 Token::Kind kind, |
2524 intptr_t argument_count, | 2528 intptr_t argument_count, |
2525 intptr_t num_args_checked) { | 2529 intptr_t num_args_checked) { |
2526 return InstanceCall(position, name, kind, argument_count, Array::null_array(), | 2530 return InstanceCall(position, name, kind, argument_count, Array::null_array(), |
2527 num_args_checked); | 2531 num_args_checked); |
2528 } | 2532 } |
2529 | 2533 |
2530 | 2534 |
2531 Fragment FlowGraphBuilder::InstanceCall(TokenPosition position, | 2535 Fragment FlowGraphBuilder::InstanceCall(TokenPosition position, |
2532 const dart::String& name, | 2536 const dart::String& name, |
2533 Token::Kind kind, | 2537 Token::Kind kind, |
2534 intptr_t argument_count, | 2538 intptr_t argument_count, |
2535 const Array& argument_names, | 2539 const Array& argument_names, |
2536 intptr_t num_args_checked) { | 2540 intptr_t num_args_checked) { |
2537 ArgumentArray arguments = GetArguments(argument_count); | 2541 ArgumentArray arguments = GetArguments(argument_count); |
2538 const intptr_t kTypeArgsLen = 0; // Generic instance calls not yet supported. | 2542 const intptr_t kTypeArgsLen = 0; // Generic instance calls not yet supported. |
2539 InstanceCallInstr* call = new (Z) | 2543 InstanceCallInstr* call = new (Z) InstanceCallInstr( |
2540 InstanceCallInstr(position, name, kind, arguments, kTypeArgsLen, | 2544 position, name, kind, arguments, kTypeArgsLen, argument_names, |
2541 argument_names, num_args_checked, ic_data_array_); | 2545 num_args_checked, ic_data_array_, GetNextDeoptId()); |
2542 Push(call); | 2546 Push(call); |
2543 return Fragment(call); | 2547 return Fragment(call); |
2544 } | 2548 } |
2545 | 2549 |
2546 | 2550 |
2547 Fragment FlowGraphBuilder::ClosureCall(int argument_count, | 2551 Fragment FlowGraphBuilder::ClosureCall(int argument_count, |
2548 const Array& argument_names) { | 2552 const Array& argument_names) { |
2549 Value* function = Pop(); | 2553 Value* function = Pop(); |
2550 ArgumentArray arguments = GetArguments(argument_count); | 2554 ArgumentArray arguments = GetArguments(argument_count); |
2551 const intptr_t kTypeArgsLen = 0; // Generic closures not yet supported. | 2555 const intptr_t kTypeArgsLen = 0; // Generic closures not yet supported. |
2552 ClosureCallInstr* call = | 2556 ClosureCallInstr* call = new (Z) |
2553 new (Z) ClosureCallInstr(function, arguments, kTypeArgsLen, | 2557 ClosureCallInstr(function, arguments, kTypeArgsLen, argument_names, |
2554 argument_names, TokenPosition::kNoSource); | 2558 TokenPosition::kNoSource, GetNextDeoptId()); |
2555 Push(call); | 2559 Push(call); |
2556 return Fragment(call); | 2560 return Fragment(call); |
2557 } | 2561 } |
2558 | 2562 |
2559 | 2563 |
2560 Fragment FlowGraphBuilder::ThrowException(TokenPosition position) { | 2564 Fragment FlowGraphBuilder::ThrowException(TokenPosition position) { |
2561 Fragment instructions; | 2565 Fragment instructions; |
2562 instructions += Drop(); | 2566 instructions += Drop(); |
2563 instructions += Fragment(new (Z) ThrowInstr(position)).closed(); | 2567 instructions += |
| 2568 Fragment(new (Z) ThrowInstr(position, GetNextDeoptId())).closed(); |
2564 // Use it's side effect of leaving a constant on the stack (does not change | 2569 // Use it's side effect of leaving a constant on the stack (does not change |
2565 // the graph). | 2570 // the graph). |
2566 NullConstant(); | 2571 NullConstant(); |
2567 | 2572 |
2568 pending_argument_count_ -= 1; | 2573 pending_argument_count_ -= 1; |
2569 | 2574 |
2570 return instructions; | 2575 return instructions; |
2571 } | 2576 } |
2572 | 2577 |
2573 | 2578 |
2574 Fragment FlowGraphBuilder::RethrowException(TokenPosition position, | 2579 Fragment FlowGraphBuilder::RethrowException(TokenPosition position, |
2575 int catch_try_index) { | 2580 int catch_try_index) { |
2576 Fragment instructions; | 2581 Fragment instructions; |
2577 instructions += Drop(); | 2582 instructions += Drop(); |
2578 instructions += Drop(); | 2583 instructions += Drop(); |
2579 instructions += | 2584 instructions += Fragment(new (Z) ReThrowInstr(position, catch_try_index, |
2580 Fragment(new (Z) ReThrowInstr(position, catch_try_index)).closed(); | 2585 GetNextDeoptId())) |
| 2586 .closed(); |
2581 // Use it's side effect of leaving a constant on the stack (does not change | 2587 // Use it's side effect of leaving a constant on the stack (does not change |
2582 // the graph). | 2588 // the graph). |
2583 NullConstant(); | 2589 NullConstant(); |
2584 | 2590 |
2585 pending_argument_count_ -= 2; | 2591 pending_argument_count_ -= 2; |
2586 | 2592 |
2587 return instructions; | 2593 return instructions; |
2588 } | 2594 } |
2589 | 2595 |
2590 | 2596 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2650 LoadLocalInstr* load = | 2656 LoadLocalInstr* load = |
2651 new (Z) LoadLocalInstr(*variable, TokenPosition::kNoSource); | 2657 new (Z) LoadLocalInstr(*variable, TokenPosition::kNoSource); |
2652 instructions <<= load; | 2658 instructions <<= load; |
2653 Push(load); | 2659 Push(load); |
2654 } | 2660 } |
2655 return instructions; | 2661 return instructions; |
2656 } | 2662 } |
2657 | 2663 |
2658 | 2664 |
2659 Fragment FlowGraphBuilder::InitStaticField(const dart::Field& field) { | 2665 Fragment FlowGraphBuilder::InitStaticField(const dart::Field& field) { |
2660 InitStaticFieldInstr* init = | 2666 InitStaticFieldInstr* init = new (Z) |
2661 new (Z) InitStaticFieldInstr(Pop(), MayCloneField(Z, field)); | 2667 InitStaticFieldInstr(Pop(), MayCloneField(Z, field), GetNextDeoptId()); |
2662 return Fragment(init); | 2668 return Fragment(init); |
2663 } | 2669 } |
2664 | 2670 |
2665 | 2671 |
2666 Fragment FlowGraphBuilder::LoadStaticField() { | 2672 Fragment FlowGraphBuilder::LoadStaticField() { |
2667 LoadStaticFieldInstr* load = | 2673 LoadStaticFieldInstr* load = |
2668 new (Z) LoadStaticFieldInstr(Pop(), TokenPosition::kNoSource); | 2674 new (Z) LoadStaticFieldInstr(Pop(), TokenPosition::kNoSource); |
2669 Push(load); | 2675 Push(load); |
2670 return Fragment(load); | 2676 return Fragment(load); |
2671 } | 2677 } |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2714 (function.IsAsyncClosure() || function.IsAsyncGenClosure())) { | 2720 (function.IsAsyncClosure() || function.IsAsyncGenClosure())) { |
2715 // We are returning from an asynchronous closure. Before we do that, be | 2721 // We are returning from an asynchronous closure. Before we do that, be |
2716 // sure to clear the thread's asynchronous stack trace. | 2722 // sure to clear the thread's asynchronous stack trace. |
2717 const Function& target = Function::ZoneHandle( | 2723 const Function& target = Function::ZoneHandle( |
2718 Z, I->object_store()->async_clear_thread_stack_trace()); | 2724 Z, I->object_store()->async_clear_thread_stack_trace()); |
2719 ASSERT(!target.IsNull()); | 2725 ASSERT(!target.IsNull()); |
2720 instructions += StaticCall(TokenPosition::kNoSource, target, 0); | 2726 instructions += StaticCall(TokenPosition::kNoSource, target, 0); |
2721 instructions += Drop(); | 2727 instructions += Drop(); |
2722 } | 2728 } |
2723 | 2729 |
2724 ReturnInstr* return_instr = new (Z) ReturnInstr(position, value); | 2730 ReturnInstr* return_instr = |
| 2731 new (Z) ReturnInstr(position, value, GetNextDeoptId()); |
2725 if (exit_collector_ != NULL) exit_collector_->AddExit(return_instr); | 2732 if (exit_collector_ != NULL) exit_collector_->AddExit(return_instr); |
2726 | 2733 |
2727 instructions <<= return_instr; | 2734 instructions <<= return_instr; |
2728 | 2735 |
2729 return instructions.closed(); | 2736 return instructions.closed(); |
2730 } | 2737 } |
2731 | 2738 |
2732 | 2739 |
2733 Fragment FlowGraphBuilder::StaticCall(TokenPosition position, | 2740 Fragment FlowGraphBuilder::StaticCall(TokenPosition position, |
2734 const Function& target, | 2741 const Function& target, |
(...skipping 25 matching lines...) Expand all Loading... |
2760 | 2767 |
2761 | 2768 |
2762 Fragment FlowGraphBuilder::StaticCall(TokenPosition position, | 2769 Fragment FlowGraphBuilder::StaticCall(TokenPosition position, |
2763 const Function& target, | 2770 const Function& target, |
2764 intptr_t argument_count, | 2771 intptr_t argument_count, |
2765 const Array& argument_names) { | 2772 const Array& argument_names) { |
2766 ArgumentArray arguments = GetArguments(argument_count); | 2773 ArgumentArray arguments = GetArguments(argument_count); |
2767 const intptr_t kTypeArgsLen = 0; // Generic static calls not yet supported. | 2774 const intptr_t kTypeArgsLen = 0; // Generic static calls not yet supported. |
2768 StaticCallInstr* call = | 2775 StaticCallInstr* call = |
2769 new (Z) StaticCallInstr(position, target, kTypeArgsLen, argument_names, | 2776 new (Z) StaticCallInstr(position, target, kTypeArgsLen, argument_names, |
2770 arguments, ic_data_array_); | 2777 arguments, ic_data_array_, GetNextDeoptId()); |
2771 const intptr_t list_cid = | 2778 const intptr_t list_cid = |
2772 GetResultCidOfListFactory(Z, target, argument_count); | 2779 GetResultCidOfListFactory(Z, target, argument_count); |
2773 if (list_cid != kDynamicCid) { | 2780 if (list_cid != kDynamicCid) { |
2774 call->set_result_cid(list_cid); | 2781 call->set_result_cid(list_cid); |
2775 call->set_is_known_list_constructor(true); | 2782 call->set_is_known_list_constructor(true); |
2776 } else if (target.recognized_kind() != MethodRecognizer::kUnknown) { | 2783 } else if (target.recognized_kind() != MethodRecognizer::kUnknown) { |
2777 call->set_result_cid(MethodRecognizer::ResultCid(target)); | 2784 call->set_result_cid(MethodRecognizer::ResultCid(target)); |
2778 } | 2785 } |
2779 Push(call); | 2786 Push(call); |
2780 return Fragment(call); | 2787 return Fragment(call); |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2874 Fragment FlowGraphBuilder::StoreStaticField(TokenPosition position, | 2881 Fragment FlowGraphBuilder::StoreStaticField(TokenPosition position, |
2875 const dart::Field& field) { | 2882 const dart::Field& field) { |
2876 return Fragment( | 2883 return Fragment( |
2877 new (Z) StoreStaticFieldInstr(MayCloneField(Z, field), Pop(), position)); | 2884 new (Z) StoreStaticFieldInstr(MayCloneField(Z, field), Pop(), position)); |
2878 } | 2885 } |
2879 | 2886 |
2880 | 2887 |
2881 Fragment FlowGraphBuilder::StringInterpolate(TokenPosition position) { | 2888 Fragment FlowGraphBuilder::StringInterpolate(TokenPosition position) { |
2882 Value* array = Pop(); | 2889 Value* array = Pop(); |
2883 StringInterpolateInstr* interpolate = | 2890 StringInterpolateInstr* interpolate = |
2884 new (Z) StringInterpolateInstr(array, position); | 2891 new (Z) StringInterpolateInstr(array, position, GetNextDeoptId()); |
2885 Push(interpolate); | 2892 Push(interpolate); |
2886 return Fragment(interpolate); | 2893 return Fragment(interpolate); |
2887 } | 2894 } |
2888 | 2895 |
2889 | 2896 |
2890 Fragment FlowGraphBuilder::StringInterpolateSingle(TokenPosition position) { | 2897 Fragment FlowGraphBuilder::StringInterpolateSingle(TokenPosition position) { |
2891 const int kTypeArgsLen = 0; | 2898 const int kTypeArgsLen = 0; |
2892 const int kNumberOfArguments = 1; | 2899 const int kNumberOfArguments = 1; |
2893 const Array& kNoArgumentNames = Object::null_array(); | 2900 const Array& kNoArgumentNames = Object::null_array(); |
2894 const dart::Class& cls = dart::Class::Handle( | 2901 const dart::Class& cls = dart::Class::Handle( |
(...skipping 1029 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3924 instructions += LoadLocal(top_of_stack); | 3931 instructions += LoadLocal(top_of_stack); |
3925 instructions += AssertAssignable(dst_type, dst_name); | 3932 instructions += AssertAssignable(dst_type, dst_name); |
3926 instructions += Drop(); | 3933 instructions += Drop(); |
3927 } | 3934 } |
3928 return instructions; | 3935 return instructions; |
3929 } | 3936 } |
3930 | 3937 |
3931 | 3938 |
3932 Fragment FlowGraphBuilder::AssertBool() { | 3939 Fragment FlowGraphBuilder::AssertBool() { |
3933 Value* value = Pop(); | 3940 Value* value = Pop(); |
3934 AssertBooleanInstr* instr = | 3941 AssertBooleanInstr* instr = new (Z) |
3935 new (Z) AssertBooleanInstr(TokenPosition::kNoSource, value); | 3942 AssertBooleanInstr(TokenPosition::kNoSource, value, GetNextDeoptId()); |
3936 Push(instr); | 3943 Push(instr); |
3937 return Fragment(instr); | 3944 return Fragment(instr); |
3938 } | 3945 } |
3939 | 3946 |
3940 | 3947 |
3941 Fragment FlowGraphBuilder::AssertAssignable(const AbstractType& dst_type, | 3948 Fragment FlowGraphBuilder::AssertAssignable(const AbstractType& dst_type, |
3942 const dart::String& dst_name) { | 3949 const dart::String& dst_name) { |
3943 Fragment instructions; | 3950 Fragment instructions; |
3944 Value* value = Pop(); | 3951 Value* value = Pop(); |
3945 | 3952 |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4264 } | 4271 } |
4265 default_values->Add(default_value); | 4272 default_values->Add(default_value); |
4266 } | 4273 } |
4267 } | 4274 } |
4268 parsed_function_->set_default_parameter_values(default_values); | 4275 parsed_function_->set_default_parameter_values(default_values); |
4269 } | 4276 } |
4270 } | 4277 } |
4271 | 4278 |
4272 | 4279 |
4273 TargetEntryInstr* FlowGraphBuilder::BuildTargetEntry() { | 4280 TargetEntryInstr* FlowGraphBuilder::BuildTargetEntry() { |
4274 return new (Z) TargetEntryInstr(AllocateBlockId(), CurrentTryIndex()); | 4281 return new (Z) |
| 4282 TargetEntryInstr(AllocateBlockId(), CurrentTryIndex(), GetNextDeoptId()); |
4275 } | 4283 } |
4276 | 4284 |
4277 | 4285 |
4278 JoinEntryInstr* FlowGraphBuilder::BuildJoinEntry(intptr_t try_index) { | 4286 JoinEntryInstr* FlowGraphBuilder::BuildJoinEntry(intptr_t try_index) { |
4279 return new (Z) JoinEntryInstr(AllocateBlockId(), try_index); | 4287 return new (Z) JoinEntryInstr(AllocateBlockId(), try_index, GetNextDeoptId()); |
4280 } | 4288 } |
4281 | 4289 |
4282 | 4290 |
4283 JoinEntryInstr* FlowGraphBuilder::BuildJoinEntry() { | 4291 JoinEntryInstr* FlowGraphBuilder::BuildJoinEntry() { |
4284 return new (Z) JoinEntryInstr(AllocateBlockId(), CurrentTryIndex()); | 4292 return new (Z) |
| 4293 JoinEntryInstr(AllocateBlockId(), CurrentTryIndex(), GetNextDeoptId()); |
4285 } | 4294 } |
4286 | 4295 |
4287 | 4296 |
4288 Fragment FlowGraphBuilder::TranslateFieldInitializer(NameIndex canonical_name, | 4297 Fragment FlowGraphBuilder::TranslateFieldInitializer(NameIndex canonical_name, |
4289 Expression* init) { | 4298 Expression* init) { |
4290 dart::Field& field = | 4299 dart::Field& field = |
4291 dart::Field::ZoneHandle(Z, H.LookupFieldByKernelField(canonical_name)); | 4300 dart::Field::ZoneHandle(Z, H.LookupFieldByKernelField(canonical_name)); |
4292 if (init->IsNullLiteral()) { | 4301 if (init->IsNullLiteral()) { |
4293 field.RecordStore(Object::null_object()); | 4302 field.RecordStore(Object::null_object()); |
4294 return Fragment(); | 4303 return Fragment(); |
(...skipping 1567 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5862 body += TranslateStatement(node->body()); | 5871 body += TranslateStatement(node->body()); |
5863 | 5872 |
5864 Instruction* entry; | 5873 Instruction* entry; |
5865 if (body.is_open()) { | 5874 if (body.is_open()) { |
5866 JoinEntryInstr* join = BuildJoinEntry(); | 5875 JoinEntryInstr* join = BuildJoinEntry(); |
5867 body += Goto(join); | 5876 body += Goto(join); |
5868 | 5877 |
5869 Fragment loop(join); | 5878 Fragment loop(join); |
5870 loop += CheckStackOverflow(); | 5879 loop += CheckStackOverflow(); |
5871 loop += condition; | 5880 loop += condition; |
5872 entry = new (Z) GotoInstr(join); | 5881 entry = new (Z) GotoInstr(join, GetNextDeoptId()); |
5873 } else { | 5882 } else { |
5874 entry = condition.entry; | 5883 entry = condition.entry; |
5875 } | 5884 } |
5876 | 5885 |
5877 | 5886 |
5878 fragment_ = Fragment(entry, loop_exit); | 5887 fragment_ = Fragment(entry, loop_exit); |
5879 --loop_depth_; | 5888 --loop_depth_; |
5880 } | 5889 } |
5881 | 5890 |
5882 | 5891 |
(...skipping 15 matching lines...) Expand all Loading... |
5898 loop += CheckStackOverflow(); | 5907 loop += CheckStackOverflow(); |
5899 loop += body; | 5908 loop += body; |
5900 loop += TranslateCondition(node->condition(), &negate); | 5909 loop += TranslateCondition(node->condition(), &negate); |
5901 TargetEntryInstr* loop_repeat; | 5910 TargetEntryInstr* loop_repeat; |
5902 TargetEntryInstr* loop_exit; | 5911 TargetEntryInstr* loop_exit; |
5903 loop += BranchIfTrue(&loop_repeat, &loop_exit, negate); | 5912 loop += BranchIfTrue(&loop_repeat, &loop_exit, negate); |
5904 | 5913 |
5905 Fragment repeat(loop_repeat); | 5914 Fragment repeat(loop_repeat); |
5906 repeat += Goto(join); | 5915 repeat += Goto(join); |
5907 | 5916 |
5908 fragment_ = Fragment(new (Z) GotoInstr(join), loop_exit); | 5917 fragment_ = Fragment(new (Z) GotoInstr(join, GetNextDeoptId()), loop_exit); |
5909 --loop_depth_; | 5918 --loop_depth_; |
5910 } | 5919 } |
5911 | 5920 |
5912 | 5921 |
5913 void FlowGraphBuilder::VisitForStatement(ForStatement* node) { | 5922 void FlowGraphBuilder::VisitForStatement(ForStatement* node) { |
5914 STREAM_STATEMENT_IF_POSSIBLE(node); | 5923 STREAM_STATEMENT_IF_POSSIBLE(node); |
5915 | 5924 |
5916 Fragment declarations; | 5925 Fragment declarations; |
5917 | 5926 |
5918 bool new_context = false; | 5927 bool new_context = false; |
(...skipping 911 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6830 thread->clear_sticky_error(); | 6839 thread->clear_sticky_error(); |
6831 return error.raw(); | 6840 return error.raw(); |
6832 } | 6841 } |
6833 } | 6842 } |
6834 | 6843 |
6835 | 6844 |
6836 } // namespace kernel | 6845 } // namespace kernel |
6837 } // namespace dart | 6846 } // namespace dart |
6838 | 6847 |
6839 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 6848 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
OLD | NEW |