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

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

Issue 2512653002: Merge of source position information from kernel-sdk. (Closed)
Patch Set: Changed how GetTokenLocation was called back to original to fix failing failing tests. Created 4 years 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/object.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 <map> 5 #include <map>
6 #include <set> 6 #include <set>
7 #include <string> 7 #include <string>
8 8
9 #include "vm/kernel_to_il.h" 9 #include "vm/kernel_to_il.h"
10 10
(...skipping 2269 matching lines...) Expand 10 before | Expand all | Expand 10 after
2280 return Fragment(new (Z) GotoInstr(destination)).closed(); 2280 return Fragment(new (Z) GotoInstr(destination)).closed();
2281 } 2281 }
2282 2282
2283 2283
2284 Fragment FlowGraphBuilder::IntConstant(int64_t value) { 2284 Fragment FlowGraphBuilder::IntConstant(int64_t value) {
2285 return Fragment( 2285 return Fragment(
2286 Constant(Integer::ZoneHandle(Z, Integer::New(value, Heap::kOld)))); 2286 Constant(Integer::ZoneHandle(Z, Integer::New(value, Heap::kOld))));
2287 } 2287 }
2288 2288
2289 2289
2290 Fragment FlowGraphBuilder::InstanceCall(const dart::String& name, 2290 Fragment FlowGraphBuilder::InstanceCall(TokenPosition position,
2291 const dart::String& name,
2291 Token::Kind kind, 2292 Token::Kind kind,
2292 intptr_t argument_count, 2293 intptr_t argument_count,
2293 intptr_t num_args_checked) { 2294 intptr_t num_args_checked) {
2294 return InstanceCall(name, kind, argument_count, Array::null_array(), 2295 return InstanceCall(position, name, kind, argument_count, Array::null_array(),
2295 num_args_checked); 2296 num_args_checked);
2296 } 2297 }
2297 2298
2298 2299
2299 Fragment FlowGraphBuilder::InstanceCall(const dart::String& name, 2300 Fragment FlowGraphBuilder::InstanceCall(TokenPosition position,
2301 const dart::String& name,
2300 Token::Kind kind, 2302 Token::Kind kind,
2301 intptr_t argument_count, 2303 intptr_t argument_count,
2302 const Array& argument_names, 2304 const Array& argument_names,
2303 intptr_t num_args_checked) { 2305 intptr_t num_args_checked) {
2304 ArgumentArray arguments = GetArguments(argument_count); 2306 ArgumentArray arguments = GetArguments(argument_count);
2305 InstanceCallInstr* call = new (Z) 2307 InstanceCallInstr* call =
2306 InstanceCallInstr(TokenPosition::kNoSource, name, kind, arguments, 2308 new (Z) InstanceCallInstr(position, name, kind, arguments, argument_names,
2307 argument_names, num_args_checked, ic_data_array_); 2309 num_args_checked, ic_data_array_);
2308 Push(call); 2310 Push(call);
2309 return Fragment(call); 2311 return Fragment(call);
2310 } 2312 }
2311 2313
2312 2314
2313 Fragment FlowGraphBuilder::ClosureCall(int argument_count, 2315 Fragment FlowGraphBuilder::ClosureCall(int argument_count,
2314 const Array& argument_names) { 2316 const Array& argument_names) {
2315 Value* function = Pop(); 2317 Value* function = Pop();
2316 ArgumentArray arguments = GetArguments(argument_count); 2318 ArgumentArray arguments = GetArguments(argument_count);
2317 ClosureCallInstr* call = new (Z) ClosureCallInstr( 2319 ClosureCallInstr* call = new (Z) ClosureCallInstr(
2318 function, arguments, argument_names, TokenPosition::kNoSource); 2320 function, arguments, argument_names, TokenPosition::kNoSource);
2319 Push(call); 2321 Push(call);
2320 return Fragment(call); 2322 return Fragment(call);
2321 } 2323 }
2322 2324
2323 2325
2324 Fragment FlowGraphBuilder::ThrowException() { 2326 Fragment FlowGraphBuilder::ThrowException(TokenPosition position) {
2325 Fragment instructions; 2327 Fragment instructions;
2326 instructions += Drop(); 2328 instructions += Drop();
2327 instructions += 2329 instructions += Fragment(new (Z) ThrowInstr(position)).closed();
2328 Fragment(new (Z) ThrowInstr(TokenPosition::kNoSource)).closed();
2329 // Use it's side effect of leaving a constant on the stack (does not change 2330 // Use it's side effect of leaving a constant on the stack (does not change
2330 // the graph). 2331 // the graph).
2331 NullConstant(); 2332 NullConstant();
2332 2333
2333 pending_argument_count_ -= 1; 2334 pending_argument_count_ -= 1;
2334 2335
2335 return instructions; 2336 return instructions;
2336 } 2337 }
2337 2338
2338 2339
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
2464 Fragment FlowGraphBuilder::Return() { 2465 Fragment FlowGraphBuilder::Return() {
2465 Value* value = Pop(); 2466 Value* value = Pop();
2466 ASSERT(stack_ == NULL); 2467 ASSERT(stack_ == NULL);
2467 ReturnInstr* return_instr = 2468 ReturnInstr* return_instr =
2468 new (Z) ReturnInstr(TokenPosition::kNoSource, value); 2469 new (Z) ReturnInstr(TokenPosition::kNoSource, value);
2469 if (exit_collector_ != NULL) exit_collector_->AddExit(return_instr); 2470 if (exit_collector_ != NULL) exit_collector_->AddExit(return_instr);
2470 return Fragment(return_instr).closed(); 2471 return Fragment(return_instr).closed();
2471 } 2472 }
2472 2473
2473 2474
2474 Fragment FlowGraphBuilder::StaticCall(const Function& target, 2475 Fragment FlowGraphBuilder::StaticCall(TokenPosition position,
2476 const Function& target,
2475 intptr_t argument_count) { 2477 intptr_t argument_count) {
2476 return StaticCall(target, argument_count, Array::null_array()); 2478 return StaticCall(position, target, argument_count, Array::null_array());
2477 } 2479 }
2478 2480
2479 2481
2480 static intptr_t GetResultCidOfListFactory(Zone* zone, 2482 static intptr_t GetResultCidOfListFactory(Zone* zone,
2481 const Function& function, 2483 const Function& function,
2482 intptr_t argument_count) { 2484 intptr_t argument_count) {
2483 if (!function.IsFactory()) { 2485 if (!function.IsFactory()) {
2484 return kDynamicCid; 2486 return kDynamicCid;
2485 } 2487 }
2486 2488
2487 const dart::Class& owner = dart::Class::Handle(zone, function.Owner()); 2489 const dart::Class& owner = dart::Class::Handle(zone, function.Owner());
2488 if ((owner.library() != dart::Library::CoreLibrary()) && 2490 if ((owner.library() != dart::Library::CoreLibrary()) &&
2489 (owner.library() != dart::Library::TypedDataLibrary())) { 2491 (owner.library() != dart::Library::TypedDataLibrary())) {
2490 return kDynamicCid; 2492 return kDynamicCid;
2491 } 2493 }
2492 2494
2493 if ((owner.Name() == Symbols::List().raw()) && 2495 if ((owner.Name() == Symbols::List().raw()) &&
2494 (function.name() == Symbols::ListFactory().raw())) { 2496 (function.name() == Symbols::ListFactory().raw())) {
2495 ASSERT(argument_count == 1 || argument_count == 2); 2497 ASSERT(argument_count == 1 || argument_count == 2);
2496 return (argument_count == 1) ? kGrowableObjectArrayCid : kArrayCid; 2498 return (argument_count == 1) ? kGrowableObjectArrayCid : kArrayCid;
2497 } 2499 }
2498 return FactoryRecognizer::ResultCid(function); 2500 return FactoryRecognizer::ResultCid(function);
2499 } 2501 }
2500 2502
2501 2503
2502 Fragment FlowGraphBuilder::StaticCall(const Function& target, 2504 Fragment FlowGraphBuilder::StaticCall(TokenPosition position,
2505 const Function& target,
2503 intptr_t argument_count, 2506 intptr_t argument_count,
2504 const Array& argument_names) { 2507 const Array& argument_names) {
2505 ArgumentArray arguments = GetArguments(argument_count); 2508 ArgumentArray arguments = GetArguments(argument_count);
2506 StaticCallInstr* call = 2509 StaticCallInstr* call = new (Z) StaticCallInstr(
2507 new (Z) StaticCallInstr(TokenPosition::kNoSource, target, argument_names, 2510 position, target, argument_names, arguments, ic_data_array_);
2508 arguments, ic_data_array_);
2509 const intptr_t list_cid = 2511 const intptr_t list_cid =
2510 GetResultCidOfListFactory(Z, target, argument_count); 2512 GetResultCidOfListFactory(Z, target, argument_count);
2511 if (list_cid != kDynamicCid) { 2513 if (list_cid != kDynamicCid) {
2512 call->set_result_cid(list_cid); 2514 call->set_result_cid(list_cid);
2513 call->set_is_known_list_constructor(true); 2515 call->set_is_known_list_constructor(true);
2514 } else if (target.recognized_kind() != MethodRecognizer::kUnknown) { 2516 } else if (target.recognized_kind() != MethodRecognizer::kUnknown) {
2515 call->set_result_cid(MethodRecognizer::ResultCid(target)); 2517 call->set_result_cid(MethodRecognizer::ResultCid(target));
2516 } 2518 }
2517 Push(call); 2519 Push(call);
2518 return Fragment(call); 2520 return Fragment(call);
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
2638 2640
2639 instructions += NullConstant(); 2641 instructions += NullConstant();
2640 instructions += PushArgument(); // line 2642 instructions += PushArgument(); // line
2641 2643
2642 instructions += IntConstant(0); 2644 instructions += IntConstant(0);
2643 instructions += PushArgument(); // column 2645 instructions += PushArgument(); // column
2644 2646
2645 instructions += Constant(H.DartSymbol("Malformed type.")); 2647 instructions += Constant(H.DartSymbol("Malformed type."));
2646 instructions += PushArgument(); // message 2648 instructions += PushArgument(); // message
2647 2649
2648 instructions += StaticCall(constructor, 5); 2650 instructions += StaticCall(TokenPosition::kNoSource, constructor, 5);
2649 instructions += Drop(); 2651 instructions += Drop();
2650 2652
2651 // Throw the exception 2653 // Throw the exception
2652 instructions += PushArgument(); 2654 instructions += PushArgument();
2653 instructions += ThrowException(); 2655 instructions += ThrowException(TokenPosition::kNoSource);
2654 2656
2655 return instructions; 2657 return instructions;
2656 } 2658 }
2657 2659
2658 2660
2659 Fragment FlowGraphBuilder::ThrowNoSuchMethodError() { 2661 Fragment FlowGraphBuilder::ThrowNoSuchMethodError() {
2660 const dart::Class& klass = dart::Class::ZoneHandle( 2662 const dart::Class& klass = dart::Class::ZoneHandle(
2661 Z, dart::Library::LookupCoreClass(Symbols::NoSuchMethodError())); 2663 Z, dart::Library::LookupCoreClass(Symbols::NoSuchMethodError()));
2662 ASSERT(!klass.IsNull()); 2664 ASSERT(!klass.IsNull());
2663 const dart::Function& throw_function = dart::Function::ZoneHandle( 2665 const dart::Function& throw_function = dart::Function::ZoneHandle(
(...skipping 14 matching lines...) Expand all
2678 2680
2679 instructions += NullConstant(); 2681 instructions += NullConstant();
2680 instructions += PushArgument(); // arguments 2682 instructions += PushArgument(); // arguments
2681 2683
2682 instructions += NullConstant(); 2684 instructions += NullConstant();
2683 instructions += PushArgument(); // argumentNames 2685 instructions += PushArgument(); // argumentNames
2684 2686
2685 instructions += NullConstant(); 2687 instructions += NullConstant();
2686 instructions += PushArgument(); // existingArgumentNames 2688 instructions += PushArgument(); // existingArgumentNames
2687 2689
2688 instructions += StaticCall(throw_function, 6); 2690 instructions += StaticCall(TokenPosition::kNoSource, throw_function, 6);
2689 // Leave "result" on the stack since callers expect it to be there (even 2691 // Leave "result" on the stack since callers expect it to be there (even
2690 // though the function will result in an exception). 2692 // though the function will result in an exception).
2691 2693
2692 return instructions; 2694 return instructions;
2693 } 2695 }
2694 2696
2695 2697
2696 dart::RawFunction* FlowGraphBuilder::LookupMethodByMember( 2698 dart::RawFunction* FlowGraphBuilder::LookupMethodByMember(
2697 Member* target, 2699 Member* target,
2698 const dart::String& method_name) { 2700 const dart::String& method_name) {
(...skipping 741 matching lines...) Expand 10 before | Expand all | Expand 10 after
3440 for (intptr_t i = 0; i < named_argument_count; i++) { 3442 for (intptr_t i = 0; i < named_argument_count; i++) {
3441 VariableDeclaration* variable = kernel_function->named_parameters()[i]; 3443 VariableDeclaration* variable = kernel_function->named_parameters()[i];
3442 body += LoadLocal(LookupVariable(variable)); 3444 body += LoadLocal(LookupVariable(variable));
3443 body += PushArgument(); 3445 body += PushArgument();
3444 argument_names.SetAt(i, H.DartSymbol(variable->name())); 3446 argument_names.SetAt(i, H.DartSymbol(variable->name()));
3445 } 3447 }
3446 } 3448 }
3447 // Forward them to the target. 3449 // Forward them to the target.
3448 intptr_t argument_count = positional_argument_count + named_argument_count; 3450 intptr_t argument_count = positional_argument_count + named_argument_count;
3449 if (!target.is_static()) ++argument_count; 3451 if (!target.is_static()) ++argument_count;
3450 body += StaticCall(target, argument_count, argument_names); 3452 body += StaticCall(TokenPosition::kNoSource, target, argument_count,
3453 argument_names);
3451 3454
3452 // Return the result. 3455 // Return the result.
3453 body += Return(); 3456 body += Return();
3454 3457
3455 return new (Z) FlowGraph(*parsed_function_, graph_entry_, next_block_id_ - 1); 3458 return new (Z) FlowGraph(*parsed_function_, graph_entry_, next_block_id_ - 1);
3456 } 3459 }
3457 3460
3458 3461
3459 FlowGraph* FlowGraphBuilder::BuildGraphOfNoSuchMethodDispatcher( 3462 FlowGraph* FlowGraphBuilder::BuildGraphOfNoSuchMethodDispatcher(
3460 const Function& function) { 3463 const Function& function) {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
3527 body += Constant(Bool::False()); 3530 body += Constant(Bool::False());
3528 body += PushArgument(); 3531 body += PushArgument();
3529 3532
3530 const dart::Class& mirror_class = dart::Class::Handle( 3533 const dart::Class& mirror_class = dart::Class::Handle(
3531 Z, dart::Library::LookupCoreClass(Symbols::InvocationMirror())); 3534 Z, dart::Library::LookupCoreClass(Symbols::InvocationMirror()));
3532 ASSERT(!mirror_class.IsNull()); 3535 ASSERT(!mirror_class.IsNull());
3533 const Function& allocation_function = Function::ZoneHandle( 3536 const Function& allocation_function = Function::ZoneHandle(
3534 Z, mirror_class.LookupStaticFunction(dart::Library::PrivateCoreLibName( 3537 Z, mirror_class.LookupStaticFunction(dart::Library::PrivateCoreLibName(
3535 Symbols::AllocateInvocationMirror()))); 3538 Symbols::AllocateInvocationMirror())));
3536 ASSERT(!allocation_function.IsNull()); 3539 ASSERT(!allocation_function.IsNull());
3537 body += StaticCall(allocation_function, 4); 3540 body += StaticCall(TokenPosition::kMinSource, allocation_function, 4);
3538 body += PushArgument(); // For the call to noSuchMethod. 3541 body += PushArgument(); // For the call to noSuchMethod.
3539 3542
3540 ArgumentsDescriptor two_arguments( 3543 ArgumentsDescriptor two_arguments(
3541 Array::Handle(Z, ArgumentsDescriptor::New(2))); 3544 Array::Handle(Z, ArgumentsDescriptor::New(2)));
3542 Function& no_such_method = 3545 Function& no_such_method =
3543 Function::ZoneHandle(Z, Resolver::ResolveDynamicForReceiverClass( 3546 Function::ZoneHandle(Z, Resolver::ResolveDynamicForReceiverClass(
3544 dart::Class::Handle(Z, function.Owner()), 3547 dart::Class::Handle(Z, function.Owner()),
3545 Symbols::NoSuchMethod(), two_arguments)); 3548 Symbols::NoSuchMethod(), two_arguments));
3546 if (no_such_method.IsNull()) { 3549 if (no_such_method.IsNull()) {
3547 // If noSuchMethod is not found on the receiver class, call 3550 // If noSuchMethod is not found on the receiver class, call
3548 // Object.noSuchMethod. 3551 // Object.noSuchMethod.
3549 no_such_method = Resolver::ResolveDynamicForReceiverClass( 3552 no_such_method = Resolver::ResolveDynamicForReceiverClass(
3550 dart::Class::Handle(Z, I->object_store()->object_class()), 3553 dart::Class::Handle(Z, I->object_store()->object_class()),
3551 Symbols::NoSuchMethod(), two_arguments); 3554 Symbols::NoSuchMethod(), two_arguments);
3552 } 3555 }
3553 body += StaticCall(no_such_method, 2); 3556 body += StaticCall(TokenPosition::kMinSource, no_such_method, 2);
3554 body += Return(); 3557 body += Return();
3555 3558
3556 return new (Z) FlowGraph(*parsed_function_, graph_entry_, next_block_id_ - 1); 3559 return new (Z) FlowGraph(*parsed_function_, graph_entry_, next_block_id_ - 1);
3557 } 3560 }
3558 3561
3559 3562
3560 FlowGraph* FlowGraphBuilder::BuildGraphOfInvokeFieldDispatcher( 3563 FlowGraph* FlowGraphBuilder::BuildGraphOfInvokeFieldDispatcher(
3561 const Function& function) { 3564 const Function& function) {
3562 // Find the name of the field we should dispatch to. 3565 // Find the name of the field we should dispatch to.
3563 const dart::Class& owner = dart::Class::Handle(Z, function.Owner()); 3566 const dart::Class& owner = dart::Class::Handle(Z, function.Owner());
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
3607 LocalVariable* closure = NULL; 3610 LocalVariable* closure = NULL;
3608 if (is_closure_call) { 3611 if (is_closure_call) {
3609 closure = scope->VariableAt(0); 3612 closure = scope->VariableAt(0);
3610 3613
3611 // The closure itself is the first argument. 3614 // The closure itself is the first argument.
3612 body += LoadLocal(closure); 3615 body += LoadLocal(closure);
3613 } else { 3616 } else {
3614 // Invoke the getter to get the field value. 3617 // Invoke the getter to get the field value.
3615 body += LoadLocal(scope->VariableAt(0)); 3618 body += LoadLocal(scope->VariableAt(0));
3616 body += PushArgument(); 3619 body += PushArgument();
3617 body += InstanceCall(getter_name, Token::kGET, 1); 3620 body +=
3621 InstanceCall(TokenPosition::kMinSource, getter_name, Token::kGET, 1);
3618 } 3622 }
3619 3623
3620 body += PushArgument(); 3624 body += PushArgument();
3621 3625
3622 // Push all arguments onto the stack. 3626 // Push all arguments onto the stack.
3623 intptr_t pos = 1; 3627 intptr_t pos = 1;
3624 for (; pos < descriptor.Count(); pos++) { 3628 for (; pos < descriptor.Count(); pos++) {
3625 body += LoadLocal(scope->VariableAt(pos)); 3629 body += LoadLocal(scope->VariableAt(pos));
3626 body += PushArgument(); 3630 body += PushArgument();
3627 } 3631 }
3628 3632
3629 if (is_closure_call) { 3633 if (is_closure_call) {
3630 // Lookup the function in the closure. 3634 // Lookup the function in the closure.
3631 body += LoadLocal(closure); 3635 body += LoadLocal(closure);
3632 body += LoadField(Closure::function_offset()); 3636 body += LoadField(Closure::function_offset());
3633 3637
3634 body += ClosureCall(descriptor.Count(), argument_names); 3638 body += ClosureCall(descriptor.Count(), argument_names);
3635 } else { 3639 } else {
3636 body += InstanceCall(Symbols::Call(), Token::kILLEGAL, descriptor.Count(), 3640 body += InstanceCall(TokenPosition::kMinSource, Symbols::Call(),
3637 argument_names); 3641 Token::kILLEGAL, descriptor.Count(), argument_names);
3638 } 3642 }
3639 3643
3640 body += Return(); 3644 body += Return();
3641 3645
3642 return new (Z) FlowGraph(*parsed_function_, graph_entry_, next_block_id_ - 1); 3646 return new (Z) FlowGraph(*parsed_function_, graph_entry_, next_block_id_ - 1);
3643 } 3647 }
3644 3648
3645 3649
3646 void FlowGraphBuilder::SetupDefaultParameterValues(FunctionNode* function) { 3650 void FlowGraphBuilder::SetupDefaultParameterValues(FunctionNode* function) {
3647 intptr_t num_optional_parameters = 3651 intptr_t num_optional_parameters =
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
3740 instructions += LoadLocal(scopes_->this_variable); 3744 instructions += LoadLocal(scopes_->this_variable);
3741 instructions += PushArgument(); 3745 instructions += PushArgument();
3742 3746
3743 ASSERT(init->arguments()->types().length() == 0); 3747 ASSERT(init->arguments()->types().length() == 0);
3744 Array& argument_names = Array::ZoneHandle(Z); 3748 Array& argument_names = Array::ZoneHandle(Z);
3745 instructions += TranslateArguments(init->arguments(), &argument_names); 3749 instructions += TranslateArguments(init->arguments(), &argument_names);
3746 3750
3747 const Function& target = Function::ZoneHandle( 3751 const Function& target = Function::ZoneHandle(
3748 Z, H.LookupConstructorByKernelConstructor(init->target())); 3752 Z, H.LookupConstructorByKernelConstructor(init->target()));
3749 intptr_t argument_count = init->arguments()->count() + 1; 3753 intptr_t argument_count = init->arguments()->count() + 1;
3750 instructions += StaticCall(target, argument_count, argument_names); 3754 instructions += StaticCall(TokenPosition::kNoSource, target,
3755 argument_count, argument_names);
3751 instructions += Drop(); 3756 instructions += Drop();
3752 } else if (initializer->IsRedirectingInitializer()) { 3757 } else if (initializer->IsRedirectingInitializer()) {
3753 RedirectingInitializer* init = RedirectingInitializer::Cast(initializer); 3758 RedirectingInitializer* init = RedirectingInitializer::Cast(initializer);
3754 3759
3755 instructions += LoadLocal(scopes_->this_variable); 3760 instructions += LoadLocal(scopes_->this_variable);
3756 instructions += PushArgument(); 3761 instructions += PushArgument();
3757 3762
3758 ASSERT(init->arguments()->types().length() == 0); 3763 ASSERT(init->arguments()->types().length() == 0);
3759 Array& argument_names = Array::ZoneHandle(Z); 3764 Array& argument_names = Array::ZoneHandle(Z);
3760 instructions += TranslateArguments(init->arguments(), &argument_names); 3765 instructions += TranslateArguments(init->arguments(), &argument_names);
3761 3766
3762 const Function& target = Function::ZoneHandle( 3767 const Function& target = Function::ZoneHandle(
3763 Z, H.LookupConstructorByKernelConstructor(init->target())); 3768 Z, H.LookupConstructorByKernelConstructor(init->target()));
3764 intptr_t argument_count = init->arguments()->count() + 1; 3769 intptr_t argument_count = init->arguments()->count() + 1;
3765 instructions += StaticCall(target, argument_count, argument_names); 3770 instructions += StaticCall(TokenPosition::kNoSource, target,
3771 argument_count, argument_names);
3766 instructions += Drop(); 3772 instructions += Drop();
3767 } else if (initializer->IsLocalInitializer()) { 3773 } else if (initializer->IsLocalInitializer()) {
3768 // The other initializers following this one might read the variable. This 3774 // The other initializers following this one might read the variable. This
3769 // is used e.g. for evaluating the arguments to a super call first, run 3775 // is used e.g. for evaluating the arguments to a super call first, run
3770 // normal field initializers next and then make the actual super call: 3776 // normal field initializers next and then make the actual super call:
3771 // 3777 //
3772 // The frontend converts 3778 // The frontend converts
3773 // 3779 //
3774 // class A { 3780 // class A {
3775 // var x; 3781 // var x;
(...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after
4182 fragment_ = Constant(constant_evaluator_.EvaluateExpression(node)); 4188 fragment_ = Constant(constant_evaluator_.EvaluateExpression(node));
4183 } else { 4189 } else {
4184 const dart::Class& owner = dart::Class::Handle(Z, field.Owner()); 4190 const dart::Class& owner = dart::Class::Handle(Z, field.Owner());
4185 const dart::String& getter_name = H.DartGetterName(kernel_field->name()); 4191 const dart::String& getter_name = H.DartGetterName(kernel_field->name());
4186 const Function& getter = 4192 const Function& getter =
4187 Function::ZoneHandle(Z, owner.LookupStaticFunction(getter_name)); 4193 Function::ZoneHandle(Z, owner.LookupStaticFunction(getter_name));
4188 if (getter.IsNull() || !field.has_initializer()) { 4194 if (getter.IsNull() || !field.has_initializer()) {
4189 Fragment instructions = Constant(field); 4195 Fragment instructions = Constant(field);
4190 fragment_ = instructions + LoadStaticField(); 4196 fragment_ = instructions + LoadStaticField();
4191 } else { 4197 } else {
4192 fragment_ = StaticCall(getter, 0); 4198 fragment_ = StaticCall(node->position(), getter, 0);
4193 } 4199 }
4194 } 4200 }
4195 } else { 4201 } else {
4196 Procedure* procedure = Procedure::Cast(target); 4202 Procedure* procedure = Procedure::Cast(target);
4197 const Function& target = Function::ZoneHandle( 4203 const Function& target = Function::ZoneHandle(
4198 Z, H.LookupStaticMethodByKernelProcedure(procedure)); 4204 Z, H.LookupStaticMethodByKernelProcedure(procedure));
4199 4205
4200 if (procedure->kind() == Procedure::kGetter) { 4206 if (procedure->kind() == Procedure::kGetter) {
4201 fragment_ = StaticCall(target, 0); 4207 fragment_ = StaticCall(node->position(), target, 0);
4202 } else if (procedure->kind() == Procedure::kMethod) { 4208 } else if (procedure->kind() == Procedure::kMethod) {
4203 ASSERT(procedure->IsStatic()); 4209 ASSERT(procedure->IsStatic());
4204 Function& closure_function = 4210 Function& closure_function =
4205 Function::ZoneHandle(Z, target.ImplicitClosureFunction()); 4211 Function::ZoneHandle(Z, target.ImplicitClosureFunction());
4206 closure_function.set_kernel_function(target.kernel_function()); 4212 closure_function.set_kernel_function(target.kernel_function());
4207 const Instance& closure = 4213 const Instance& closure =
4208 Instance::ZoneHandle(Z, closure_function.ImplicitStaticClosure()); 4214 Instance::ZoneHandle(Z, closure_function.ImplicitStaticClosure());
4209 fragment_ = Constant(closure); 4215 fragment_ = Constant(closure);
4210 } else { 4216 } else {
4211 UNIMPLEMENTED(); 4217 UNIMPLEMENTED();
(...skipping 20 matching lines...) Expand all
4232 LocalVariable* variable = MakeTemporary(); 4238 LocalVariable* variable = MakeTemporary();
4233 4239
4234 // Prepare argument. 4240 // Prepare argument.
4235 instructions += LoadLocal(variable); 4241 instructions += LoadLocal(variable);
4236 instructions += PushArgument(); 4242 instructions += PushArgument();
4237 4243
4238 // Invoke the setter function. 4244 // Invoke the setter function.
4239 Procedure* procedure = Procedure::Cast(target); 4245 Procedure* procedure = Procedure::Cast(target);
4240 const Function& target = Function::ZoneHandle( 4246 const Function& target = Function::ZoneHandle(
4241 Z, H.LookupStaticMethodByKernelProcedure(procedure)); 4247 Z, H.LookupStaticMethodByKernelProcedure(procedure));
4242 instructions += StaticCall(target, 1); 4248 instructions += StaticCall(node->position(), target, 1);
4243 4249
4244 // Drop the unused result & leave the stored value on the stack. 4250 // Drop the unused result & leave the stored value on the stack.
4245 fragment_ = instructions + Drop(); 4251 fragment_ = instructions + Drop();
4246 } 4252 }
4247 } 4253 }
4248 4254
4249 4255
4250 void FlowGraphBuilder::VisitPropertyGet(PropertyGet* node) { 4256 void FlowGraphBuilder::VisitPropertyGet(PropertyGet* node) {
4251 Fragment instructions = TranslateExpression(node->receiver()); 4257 Fragment instructions = TranslateExpression(node->receiver());
4252 instructions += PushArgument(); 4258 instructions += PushArgument();
4253 const dart::String& getter_name = H.DartGetterName(node->name()); 4259 const dart::String& getter_name = H.DartGetterName(node->name());
4254 fragment_ = instructions + InstanceCall(getter_name, Token::kGET, 1); 4260 fragment_ = instructions +
4261 InstanceCall(node->position(), getter_name, Token::kGET, 1);
4255 } 4262 }
4256 4263
4257 4264
4258 void FlowGraphBuilder::VisitPropertySet(PropertySet* node) { 4265 void FlowGraphBuilder::VisitPropertySet(PropertySet* node) {
4259 Fragment instructions(NullConstant()); 4266 Fragment instructions(NullConstant());
4260 LocalVariable* variable = MakeTemporary(); 4267 LocalVariable* variable = MakeTemporary();
4261 instructions += TranslateExpression(node->receiver()); 4268 instructions += TranslateExpression(node->receiver());
4262 instructions += PushArgument(); 4269 instructions += PushArgument();
4263 instructions += TranslateExpression(node->value()); 4270 instructions += TranslateExpression(node->value());
4264 instructions += StoreLocal(variable); 4271 instructions += StoreLocal(variable);
4265 instructions += PushArgument(); 4272 instructions += PushArgument();
4266 4273
4267 const dart::String& setter_name = H.DartSetterName(node->name()); 4274 const dart::String& setter_name = H.DartSetterName(node->name());
4268 instructions += InstanceCall(setter_name, Token::kSET, 2); 4275 instructions += InstanceCall(node->position(), setter_name, Token::kSET, 2);
4269 fragment_ = instructions + Drop(); 4276 fragment_ = instructions + Drop();
4270 } 4277 }
4271 4278
4272 4279
4273 void FlowGraphBuilder::VisitDirectPropertyGet(DirectPropertyGet* node) { 4280 void FlowGraphBuilder::VisitDirectPropertyGet(DirectPropertyGet* node) {
4274 Function& target = Function::ZoneHandle(Z); 4281 Function& target = Function::ZoneHandle(Z);
4275 if (node->target()->IsProcedure()) { 4282 if (node->target()->IsProcedure()) {
4276 Procedure* kernel_procedure = Procedure::Cast(node->target()); 4283 Procedure* kernel_procedure = Procedure::Cast(node->target());
4277 Name* kernel_name = kernel_procedure->name(); 4284 Name* kernel_name = kernel_procedure->name();
4278 if (kernel_procedure->kind() == Procedure::kGetter) { 4285 if (kernel_procedure->kind() == Procedure::kGetter) {
4279 target = 4286 target =
4280 LookupMethodByMember(kernel_procedure, H.DartGetterName(kernel_name)); 4287 LookupMethodByMember(kernel_procedure, H.DartGetterName(kernel_name));
4281 } else { 4288 } else {
4282 target = 4289 target =
4283 LookupMethodByMember(kernel_procedure, H.DartMethodName(kernel_name)); 4290 LookupMethodByMember(kernel_procedure, H.DartMethodName(kernel_name));
4284 target = target.ImplicitClosureFunction(); 4291 target = target.ImplicitClosureFunction();
4285 ASSERT(!target.IsNull()); 4292 ASSERT(!target.IsNull());
4286 fragment_ = BuildImplicitClosureCreation(target); 4293 fragment_ = BuildImplicitClosureCreation(target);
4287 return; 4294 return;
4288 } 4295 }
4289 } else { 4296 } else {
4290 ASSERT(node->target()->IsField()); 4297 ASSERT(node->target()->IsField());
4291 const dart::String& getter_name = H.DartGetterName(node->target()->name()); 4298 const dart::String& getter_name = H.DartGetterName(node->target()->name());
4292 target = LookupMethodByMember(node->target(), getter_name); 4299 target = LookupMethodByMember(node->target(), getter_name);
4293 ASSERT(target.IsGetterFunction() || target.IsImplicitGetterFunction()); 4300 ASSERT(target.IsGetterFunction() || target.IsImplicitGetterFunction());
4294 } 4301 }
4295 4302
4296 Fragment instructions = TranslateExpression(node->receiver()); 4303 Fragment instructions = TranslateExpression(node->receiver());
4297 instructions += PushArgument(); 4304 instructions += PushArgument();
4298 fragment_ = instructions + StaticCall(target, 1); 4305 fragment_ = instructions + StaticCall(node->position(), target, 1);
4299 } 4306 }
4300 4307
4301 4308
4302 void FlowGraphBuilder::VisitDirectPropertySet(DirectPropertySet* node) { 4309 void FlowGraphBuilder::VisitDirectPropertySet(DirectPropertySet* node) {
4303 const dart::String& method_name = H.DartSetterName(node->target()->name()); 4310 const dart::String& method_name = H.DartSetterName(node->target()->name());
4304 const Function& target = Function::ZoneHandle( 4311 const Function& target = Function::ZoneHandle(
4305 Z, LookupMethodByMember(node->target(), method_name)); 4312 Z, LookupMethodByMember(node->target(), method_name));
4306 ASSERT(target.IsSetterFunction() || target.IsImplicitSetterFunction()); 4313 ASSERT(target.IsSetterFunction() || target.IsImplicitSetterFunction());
4307 4314
4308 Fragment instructions(NullConstant()); 4315 Fragment instructions(NullConstant());
4309 LocalVariable* value = MakeTemporary(); 4316 LocalVariable* value = MakeTemporary();
4310 instructions += TranslateExpression(node->receiver()); 4317 instructions += TranslateExpression(node->receiver());
4311 instructions += PushArgument(); 4318 instructions += PushArgument();
4312 instructions += TranslateExpression(node->value()); 4319 instructions += TranslateExpression(node->value());
4313 instructions += StoreLocal(value); 4320 instructions += StoreLocal(value);
4314 instructions += PushArgument(); 4321 instructions += PushArgument();
4315 instructions += StaticCall(target, 2); 4322 instructions += StaticCall(node->position(), target, 2);
4316 4323
4317 fragment_ = instructions + Drop(); 4324 fragment_ = instructions + Drop();
4318 } 4325 }
4319 4326
4320 4327
4321 void FlowGraphBuilder::VisitStaticInvocation(StaticInvocation* node) { 4328 void FlowGraphBuilder::VisitStaticInvocation(StaticInvocation* node) {
4322 const Function& target = Function::ZoneHandle( 4329 const Function& target = Function::ZoneHandle(
4323 Z, H.LookupStaticMethodByKernelProcedure(node->procedure())); 4330 Z, H.LookupStaticMethodByKernelProcedure(node->procedure()));
4324 const dart::Class& klass = dart::Class::ZoneHandle(Z, target.Owner()); 4331 const dart::Class& klass = dart::Class::ZoneHandle(Z, target.Owner());
4325 intptr_t argument_count = node->arguments()->count(); 4332 intptr_t argument_count = node->arguments()->count();
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
4390 (target.name() == Symbols::Identical().raw())) { 4397 (target.name() == Symbols::Identical().raw())) {
4391 ASSERT(argument_count == 2); 4398 ASSERT(argument_count == 2);
4392 4399
4393 List<Expression>& positional = node->arguments()->positional(); 4400 List<Expression>& positional = node->arguments()->positional();
4394 for (intptr_t i = 0; i < positional.length(); ++i) { 4401 for (intptr_t i = 0; i < positional.length(); ++i) {
4395 instructions += TranslateExpression(positional[i]); 4402 instructions += TranslateExpression(positional[i]);
4396 } 4403 }
4397 instructions += StrictCompare(Token::kEQ_STRICT, /*number_check=*/true); 4404 instructions += StrictCompare(Token::kEQ_STRICT, /*number_check=*/true);
4398 } else { 4405 } else {
4399 instructions += TranslateArguments(node->arguments(), NULL); 4406 instructions += TranslateArguments(node->arguments(), NULL);
4400 instructions += StaticCall(target, argument_count, argument_names); 4407 instructions +=
4408 StaticCall(node->position(), target, argument_count, argument_names);
4401 4409
4402 if (target.IsGenerativeConstructor()) { 4410 if (target.IsGenerativeConstructor()) {
4403 // Drop the result of the constructor call and leave [instance_variable] 4411 // Drop the result of the constructor call and leave [instance_variable]
4404 // on top-of-stack. 4412 // on top-of-stack.
4405 instructions += Drop(); 4413 instructions += Drop();
4406 } 4414 }
4407 } 4415 }
4408 4416
4409 fragment_ = instructions; 4417 fragment_ = instructions;
4410 } 4418 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
4447 instructions += TranslateArguments(node->arguments(), &argument_names); 4455 instructions += TranslateArguments(node->arguments(), &argument_names);
4448 4456
4449 intptr_t num_args_checked = 1; 4457 intptr_t num_args_checked = 1;
4450 // If we have a special operation (e.g. +/-/==) we mark both arguments as 4458 // If we have a special operation (e.g. +/-/==) we mark both arguments as
4451 // to be checked. 4459 // to be checked.
4452 if (token_kind != Token::kILLEGAL) { 4460 if (token_kind != Token::kILLEGAL) {
4453 ASSERT(argument_count <= 2); 4461 ASSERT(argument_count <= 2);
4454 num_args_checked = argument_count; 4462 num_args_checked = argument_count;
4455 } 4463 }
4456 4464
4457 fragment_ = instructions + InstanceCall(name, token_kind, argument_count, 4465 fragment_ = instructions + InstanceCall(node->position(), name, token_kind,
4458 argument_names, num_args_checked); 4466 argument_count, argument_names,
4467 num_args_checked);
4459 } 4468 }
4460 4469
4461 4470
4462 void FlowGraphBuilder::VisitDirectMethodInvocation( 4471 void FlowGraphBuilder::VisitDirectMethodInvocation(
4463 DirectMethodInvocation* node) { 4472 DirectMethodInvocation* node) {
4464 const dart::String& method_name = H.DartMethodName(node->target()->name()); 4473 const dart::String& method_name = H.DartMethodName(node->target()->name());
4465 const Function& target = Function::ZoneHandle( 4474 const Function& target = Function::ZoneHandle(
4466 Z, LookupMethodByMember(node->target(), method_name)); 4475 Z, LookupMethodByMember(node->target(), method_name));
4467 4476
4468 intptr_t argument_count = node->arguments()->count() + 1; 4477 intptr_t argument_count = node->arguments()->count() + 1;
4469 Array& argument_names = Array::ZoneHandle(Z); 4478 Array& argument_names = Array::ZoneHandle(Z);
4470 4479
4471 ASSERT(node->arguments()->types().length() == 0); 4480 ASSERT(node->arguments()->types().length() == 0);
4472 Fragment instructions = TranslateExpression(node->receiver()); 4481 Fragment instructions = TranslateExpression(node->receiver());
4473 instructions += PushArgument(); 4482 instructions += PushArgument();
4474 instructions += TranslateArguments(node->arguments(), &argument_names); 4483 instructions += TranslateArguments(node->arguments(), &argument_names);
4475 fragment_ = instructions + StaticCall(target, argument_count, argument_names); 4484 fragment_ = instructions + StaticCall(node->position(), target,
4485 argument_count, argument_names);
4476 } 4486 }
4477 4487
4478 4488
4479 void FlowGraphBuilder::VisitConstructorInvocation(ConstructorInvocation* node) { 4489 void FlowGraphBuilder::VisitConstructorInvocation(ConstructorInvocation* node) {
4480 if (node->is_const()) { 4490 if (node->is_const()) {
4481 fragment_ = 4491 fragment_ =
4482 Constant(constant_evaluator_.EvaluateConstructorInvocation(node)); 4492 Constant(constant_evaluator_.EvaluateConstructorInvocation(node));
4483 return; 4493 return;
4484 } 4494 }
4485 4495
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
4525 4535
4526 instructions += LoadLocal(variable); 4536 instructions += LoadLocal(variable);
4527 instructions += PushArgument(); 4537 instructions += PushArgument();
4528 4538
4529 Array& argument_names = Array::ZoneHandle(Z); 4539 Array& argument_names = Array::ZoneHandle(Z);
4530 instructions += TranslateArguments(node->arguments(), &argument_names); 4540 instructions += TranslateArguments(node->arguments(), &argument_names);
4531 4541
4532 const Function& target = Function::ZoneHandle( 4542 const Function& target = Function::ZoneHandle(
4533 Z, H.LookupConstructorByKernelConstructor(klass, node->target())); 4543 Z, H.LookupConstructorByKernelConstructor(klass, node->target()));
4534 intptr_t argument_count = node->arguments()->count() + 1; 4544 intptr_t argument_count = node->arguments()->count() + 1;
4535 instructions += StaticCall(target, argument_count, argument_names); 4545 instructions +=
4546 StaticCall(node->position(), target, argument_count, argument_names);
4536 fragment_ = instructions + Drop(); 4547 fragment_ = instructions + Drop();
4537 } 4548 }
4538 4549
4539 4550
4540 void FlowGraphBuilder::VisitIsExpression(IsExpression* node) { 4551 void FlowGraphBuilder::VisitIsExpression(IsExpression* node) {
4541 Fragment instructions = TranslateExpression(node->operand()); 4552 Fragment instructions = TranslateExpression(node->operand());
4542 4553
4543 // The VM does not like an instanceOf call with a dynamic type. We need to 4554 // The VM does not like an instanceOf call with a dynamic type. We need to
4544 // special case this situation. 4555 // special case this situation.
4545 const Type& object_type = Type::Handle(Z, Type::ObjectType()); 4556 const Type& object_type = Type::Handle(Z, Type::ObjectType());
(...skipping 22 matching lines...) Expand all
4568 } 4579 }
4569 instructions += PushArgument(); // Type arguments. 4580 instructions += PushArgument(); // Type arguments.
4570 4581
4571 instructions += Constant(type); 4582 instructions += Constant(type);
4572 instructions += PushArgument(); // Type. 4583 instructions += PushArgument(); // Type.
4573 4584
4574 instructions += Constant(Bool::False()); 4585 instructions += Constant(Bool::False());
4575 instructions += PushArgument(); // Negate?. 4586 instructions += PushArgument(); // Negate?.
4576 4587
4577 instructions += 4588 instructions +=
4578 InstanceCall(dart::Library::PrivateCoreLibName(Symbols::_instanceOf()), 4589 InstanceCall(TokenPosition::kNoSource,
4590 dart::Library::PrivateCoreLibName(Symbols::_instanceOf()),
4579 Token::kIS, 4); 4591 Token::kIS, 4);
4580 } 4592 }
4581 4593
4582 fragment_ = instructions; 4594 fragment_ = instructions;
4583 } 4595 }
4584 4596
4585 4597
4586 void FlowGraphBuilder::VisitAsExpression(AsExpression* node) { 4598 void FlowGraphBuilder::VisitAsExpression(AsExpression* node) {
4587 Fragment instructions = TranslateExpression(node->operand()); 4599 Fragment instructions = TranslateExpression(node->operand());
4588 4600
(...skipping 19 matching lines...) Expand all
4608 instructions += LoadInstantiatorTypeArguments(); 4620 instructions += LoadInstantiatorTypeArguments();
4609 } else { 4621 } else {
4610 instructions += NullConstant(); 4622 instructions += NullConstant();
4611 } 4623 }
4612 instructions += PushArgument(); // Type arguments. 4624 instructions += PushArgument(); // Type arguments.
4613 4625
4614 instructions += Constant(type); 4626 instructions += Constant(type);
4615 instructions += PushArgument(); // Type. 4627 instructions += PushArgument(); // Type.
4616 4628
4617 instructions += InstanceCall( 4629 instructions += InstanceCall(
4630 TokenPosition::kNoSource,
4618 dart::Library::PrivateCoreLibName(Symbols::_as()), Token::kAS, 3); 4631 dart::Library::PrivateCoreLibName(Symbols::_as()), Token::kAS, 3);
4619 } 4632 }
4620 4633
4621 fragment_ = instructions; 4634 fragment_ = instructions;
4622 } 4635 }
4623 4636
4624 4637
4625 void FlowGraphBuilder::VisitConditionalExpression(ConditionalExpression* node) { 4638 void FlowGraphBuilder::VisitConditionalExpression(ConditionalExpression* node) {
4626 bool negate; 4639 bool negate;
4627 Fragment instructions = TranslateCondition(node->condition(), &negate); 4640 Fragment instructions = TranslateCondition(node->condition(), &negate);
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
4754 instructions += Drop(); 4767 instructions += Drop();
4755 } 4768 }
4756 } 4769 }
4757 instructions += PushArgument(); // The array. 4770 instructions += PushArgument(); // The array.
4758 4771
4759 const dart::Class& factory_class = 4772 const dart::Class& factory_class =
4760 dart::Class::Handle(Z, dart::Library::LookupCoreClass(Symbols::List())); 4773 dart::Class::Handle(Z, dart::Library::LookupCoreClass(Symbols::List()));
4761 const Function& factory_method = Function::ZoneHandle( 4774 const Function& factory_method = Function::ZoneHandle(
4762 Z, factory_class.LookupFactory( 4775 Z, factory_class.LookupFactory(
4763 dart::Library::PrivateCoreLibName(Symbols::ListLiteralFactory()))); 4776 dart::Library::PrivateCoreLibName(Symbols::ListLiteralFactory())));
4764 fragment_ = instructions + StaticCall(factory_method, 2); 4777 fragment_ = instructions + StaticCall(node->position(), factory_method, 2);
4765 } 4778 }
4766 4779
4767 4780
4768 void FlowGraphBuilder::VisitMapLiteral(MapLiteral* node) { 4781 void FlowGraphBuilder::VisitMapLiteral(MapLiteral* node) {
4769 if (node->is_const()) { 4782 if (node->is_const()) {
4770 fragment_ = Constant(constant_evaluator_.EvaluateMapLiteral(node)); 4783 fragment_ = Constant(constant_evaluator_.EvaluateMapLiteral(node));
4771 return; 4784 return;
4772 } 4785 }
4773 4786
4774 const dart::Class& map_class = 4787 const dart::Class& map_class =
(...skipping 30 matching lines...) Expand all
4805 4818
4806 instructions += LoadLocal(array); 4819 instructions += LoadLocal(array);
4807 instructions += IntConstant(2 * i + 1); 4820 instructions += IntConstant(2 * i + 1);
4808 instructions += TranslateExpression(entries[i]->value()); 4821 instructions += TranslateExpression(entries[i]->value());
4809 instructions += StoreIndexed(kArrayCid); 4822 instructions += StoreIndexed(kArrayCid);
4810 instructions += Drop(); 4823 instructions += Drop();
4811 } 4824 }
4812 } 4825 }
4813 instructions += PushArgument(); // The array. 4826 instructions += PushArgument(); // The array.
4814 4827
4815 fragment_ = instructions + StaticCall(factory_method, 2); 4828 fragment_ = instructions + StaticCall(node->position(), factory_method, 2);
4816 } 4829 }
4817 4830
4818 4831
4819 void FlowGraphBuilder::VisitFunctionExpression(FunctionExpression* node) { 4832 void FlowGraphBuilder::VisitFunctionExpression(FunctionExpression* node) {
4820 fragment_ = TranslateFunctionNode(node->function(), node); 4833 fragment_ = TranslateFunctionNode(node->function(), node);
4821 } 4834 }
4822 4835
4823 4836
4824 void FlowGraphBuilder::VisitLet(Let* node) { 4837 void FlowGraphBuilder::VisitLet(Let* node) {
4825 Fragment instructions = TranslateStatement(node->variable()); 4838 Fragment instructions = TranslateStatement(node->variable());
4826 instructions += TranslateExpression(node->body()); 4839 instructions += TranslateExpression(node->body());
4827 fragment_ = instructions; 4840 fragment_ = instructions;
4828 } 4841 }
4829 4842
4830 4843
4831 void FlowGraphBuilder::VisitThrow(Throw* node) { 4844 void FlowGraphBuilder::VisitThrow(Throw* node) {
4832 Fragment instructions; 4845 Fragment instructions;
4833 4846
4834 instructions += TranslateExpression(node->expression()); 4847 instructions += TranslateExpression(node->expression());
4835 instructions += PushArgument(); 4848 instructions += PushArgument();
4836 instructions += ThrowException(); 4849 instructions += ThrowException(node->position());
4837 ASSERT(instructions.is_closed()); 4850 ASSERT(instructions.is_closed());
4838 4851
4839 fragment_ = instructions; 4852 fragment_ = instructions;
4840 } 4853 }
4841 4854
4842 4855
4843 void FlowGraphBuilder::VisitRethrow(Rethrow* node) { 4856 void FlowGraphBuilder::VisitRethrow(Rethrow* node) {
4844 Fragment instructions; 4857 Fragment instructions;
4845 4858
4846 instructions += LoadLocal(catch_block_->exception_var()); 4859 instructions += LoadLocal(catch_block_->exception_var());
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
5110 fragment_ = loop; 5123 fragment_ = loop;
5111 } 5124 }
5112 5125
5113 5126
5114 void FlowGraphBuilder::VisitForInStatement(ForInStatement* node) { 5127 void FlowGraphBuilder::VisitForInStatement(ForInStatement* node) {
5115 Fragment instructions = TranslateExpression(node->iterable()); 5128 Fragment instructions = TranslateExpression(node->iterable());
5116 instructions += PushArgument(); 5129 instructions += PushArgument();
5117 5130
5118 const dart::String& iterator_getter = dart::String::ZoneHandle( 5131 const dart::String& iterator_getter = dart::String::ZoneHandle(
5119 Z, dart::Field::GetterSymbol(Symbols::Iterator())); 5132 Z, dart::Field::GetterSymbol(Symbols::Iterator()));
5120 instructions += InstanceCall(iterator_getter, Token::kGET, 1); 5133 instructions +=
5134 InstanceCall(TokenPosition::kNoSource, iterator_getter, Token::kGET, 1);
5121 LocalVariable* iterator = scopes_->iterator_variables[for_in_depth_]; 5135 LocalVariable* iterator = scopes_->iterator_variables[for_in_depth_];
5122 instructions += StoreLocal(iterator); 5136 instructions += StoreLocal(iterator);
5123 instructions += Drop(); 5137 instructions += Drop();
5124 5138
5125 ++for_in_depth_; 5139 ++for_in_depth_;
5126 ++loop_depth_; 5140 ++loop_depth_;
5127 Fragment condition = LoadLocal(iterator); 5141 Fragment condition = LoadLocal(iterator);
5128 condition += PushArgument(); 5142 condition += PushArgument();
5129 condition += InstanceCall(Symbols::MoveNext(), Token::kILLEGAL, 1); 5143 condition += InstanceCall(TokenPosition::kNoSource, Symbols::MoveNext(),
5144 Token::kILLEGAL, 1);
5130 TargetEntryInstr* body_entry; 5145 TargetEntryInstr* body_entry;
5131 TargetEntryInstr* loop_exit; 5146 TargetEntryInstr* loop_exit;
5132 condition += BranchIfTrue(&body_entry, &loop_exit); 5147 condition += BranchIfTrue(&body_entry, &loop_exit);
5133 5148
5134 Fragment body(body_entry); 5149 Fragment body(body_entry);
5135 body += EnterScope(node); 5150 body += EnterScope(node);
5136 body += LoadLocal(iterator); 5151 body += LoadLocal(iterator);
5137 body += PushArgument(); 5152 body += PushArgument();
5138 const dart::String& current_getter = dart::String::ZoneHandle( 5153 const dart::String& current_getter = dart::String::ZoneHandle(
5139 Z, dart::Field::GetterSymbol(Symbols::Current())); 5154 Z, dart::Field::GetterSymbol(Symbols::Current()));
5140 body += InstanceCall(current_getter, Token::kGET, 1); 5155 body +=
5156 InstanceCall(TokenPosition::kNoSource, current_getter, Token::kGET, 1);
5141 body += StoreLocal(LookupVariable(node->variable())); 5157 body += StoreLocal(LookupVariable(node->variable()));
5142 body += Drop(); 5158 body += Drop();
5143 body += TranslateStatement(node->body()); 5159 body += TranslateStatement(node->body());
5144 body += ExitScope(node); 5160 body += ExitScope(node);
5145 5161
5146 if (body.is_open()) { 5162 if (body.is_open()) {
5147 JoinEntryInstr* join = BuildJoinEntry(); 5163 JoinEntryInstr* join = BuildJoinEntry();
5148 instructions += Goto(join); 5164 instructions += Goto(join);
5149 body += Goto(join); 5165 body += Goto(join);
5150 5166
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
5251 // Call _AssertionError._create constructor. 5267 // Call _AssertionError._create constructor.
5252 body_fragment += LoadLocal(instance); 5268 body_fragment += LoadLocal(instance);
5253 body_fragment += PushArgument(); // this 5269 body_fragment += PushArgument(); // this
5254 5270
5255 body_fragment += Constant(url); 5271 body_fragment += Constant(url);
5256 body_fragment += PushArgument(); // url 5272 body_fragment += PushArgument(); // url
5257 5273
5258 body_fragment += NullConstant(); 5274 body_fragment += NullConstant();
5259 body_fragment += PushArgument(); // line 5275 body_fragment += PushArgument(); // line
5260 5276
5261 body_fragment += StaticCall(constructor, 3); 5277 body_fragment += StaticCall(TokenPosition::kNoSource, constructor, 3);
5262 body_fragment += Drop(); 5278 body_fragment += Drop();
5263 5279
5264 // Throw the exception 5280 // Throw the exception
5265 body_fragment += PushArgument(); 5281 body_fragment += PushArgument();
5266 body_fragment += ThrowException(); 5282 body_fragment += ThrowException(TokenPosition::kNoSource);
5267 body_fragment += Drop(); 5283 body_fragment += Drop();
5268 } 5284 }
5269 5285
5270 // If there is an implicit fall-through we have one [SwitchCase] and 5286 // If there is an implicit fall-through we have one [SwitchCase] and
5271 // multiple expressions, e.g. 5287 // multiple expressions, e.g.
5272 // 5288 //
5273 // switch(expr) { 5289 // switch(expr) {
5274 // case a: 5290 // case a:
5275 // case b: 5291 // case b:
5276 // <stmt-body> 5292 // <stmt-body>
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
5320 5336
5321 for (intptr_t j = 0; j < switch_case->expressions().length(); j++) { 5337 for (intptr_t j = 0; j < switch_case->expressions().length(); j++) {
5322 TargetEntryInstr* then; 5338 TargetEntryInstr* then;
5323 TargetEntryInstr* otherwise; 5339 TargetEntryInstr* otherwise;
5324 5340
5325 current_instructions += Constant(constant_evaluator_.EvaluateExpression( 5341 current_instructions += Constant(constant_evaluator_.EvaluateExpression(
5326 switch_case->expressions()[j])); 5342 switch_case->expressions()[j]));
5327 current_instructions += PushArgument(); 5343 current_instructions += PushArgument();
5328 current_instructions += LoadLocal(scopes_->switch_variable); 5344 current_instructions += LoadLocal(scopes_->switch_variable);
5329 current_instructions += PushArgument(); 5345 current_instructions += PushArgument();
5330 current_instructions += 5346 current_instructions += InstanceCall(
5331 InstanceCall(Symbols::EqualOperator(), Token::kEQ, 5347 TokenPosition::kNoSource, Symbols::EqualOperator(), Token::kEQ,
5332 /*argument_count=*/2, 5348 /*argument_count=*/2,
5333 /*num_args_checked=*/2); 5349 /*num_args_checked=*/2);
5334 current_instructions += BranchIfTrue(&then, &otherwise); 5350 current_instructions += BranchIfTrue(&then, &otherwise);
5335 5351
5336 Fragment then_fragment(then); 5352 Fragment then_fragment(then);
5337 5353
5338 if (body_join != NULL) { 5354 if (body_join != NULL) {
5339 // There are several branches to the body, so we will make a goto to 5355 // There are several branches to the body, so we will make a goto to
5340 // the join block (the real body has already been prepended with a 5356 // the join block (the real body has already been prepended with a
5341 // join instruction). 5357 // join instruction).
5342 then_fragment += Goto(body_join); 5358 then_fragment += Goto(body_join);
5343 } else { 5359 } else {
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
5443 5459
5444 otherwise_fragment += Constant(url); 5460 otherwise_fragment += Constant(url);
5445 otherwise_fragment += PushArgument(); // url 5461 otherwise_fragment += PushArgument(); // url
5446 5462
5447 otherwise_fragment += IntConstant(0); 5463 otherwise_fragment += IntConstant(0);
5448 otherwise_fragment += PushArgument(); // line 5464 otherwise_fragment += PushArgument(); // line
5449 5465
5450 otherwise_fragment += IntConstant(0); 5466 otherwise_fragment += IntConstant(0);
5451 otherwise_fragment += PushArgument(); // column 5467 otherwise_fragment += PushArgument(); // column
5452 5468
5453 otherwise_fragment += StaticCall(constructor, 5); 5469 otherwise_fragment += StaticCall(TokenPosition::kNoSource, constructor, 5);
5454 otherwise_fragment += Drop(); 5470 otherwise_fragment += Drop();
5455 5471
5456 // Throw _AssertionError exception. 5472 // Throw _AssertionError exception.
5457 otherwise_fragment += PushArgument(); 5473 otherwise_fragment += PushArgument();
5458 otherwise_fragment += ThrowException(); 5474 otherwise_fragment += ThrowException(TokenPosition::kNoSource);
5459 otherwise_fragment += Drop(); 5475 otherwise_fragment += Drop();
5460 5476
5461 fragment_ = Fragment(instructions.entry, then); 5477 fragment_ = Fragment(instructions.entry, then);
5462 } 5478 }
5463 5479
5464 5480
5465 void FlowGraphBuilder::VisitTryFinally(TryFinally* node) { 5481 void FlowGraphBuilder::VisitTryFinally(TryFinally* node) {
5466 InlineBailout("kernel::FlowgraphBuilder::VisitTryFinally"); 5482 InlineBailout("kernel::FlowgraphBuilder::VisitTryFinally");
5467 5483
5468 // There are 5 different cases where we need to execute the finally block: 5484 // There are 5 different cases where we need to execute the finally block:
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
5603 } else { 5619 } else {
5604 catch_body += LoadLocal(CurrentException()); 5620 catch_body += LoadLocal(CurrentException());
5605 catch_body += PushArgument(); // exception 5621 catch_body += PushArgument(); // exception
5606 catch_body += NullConstant(); 5622 catch_body += NullConstant();
5607 catch_body += PushArgument(); // type arguments 5623 catch_body += PushArgument(); // type arguments
5608 catch_body += Constant(*type_guard); 5624 catch_body += Constant(*type_guard);
5609 catch_body += PushArgument(); // guard type 5625 catch_body += PushArgument(); // guard type
5610 catch_body += Constant(Object::bool_false()); 5626 catch_body += Constant(Object::bool_false());
5611 catch_body += PushArgument(); // negate 5627 catch_body += PushArgument(); // negate
5612 catch_body += InstanceCall( 5628 catch_body += InstanceCall(
5629 TokenPosition::kNoSource,
5613 dart::Library::PrivateCoreLibName(Symbols::_instanceOf()), 5630 dart::Library::PrivateCoreLibName(Symbols::_instanceOf()),
5614 Token::kIS, 4); 5631 Token::kIS, 4);
5615 5632
5616 TargetEntryInstr* catch_entry; 5633 TargetEntryInstr* catch_entry;
5617 TargetEntryInstr* next_catch_entry; 5634 TargetEntryInstr* next_catch_entry;
5618 catch_body += BranchIfTrue(&catch_entry, &next_catch_entry); 5635 catch_body += BranchIfTrue(&catch_entry, &next_catch_entry);
5619 5636
5620 Fragment(catch_entry) + catch_handler_body; 5637 Fragment(catch_entry) + catch_handler_body;
5621 catch_body = Fragment(next_catch_entry); 5638 catch_body = Fragment(next_catch_entry);
5622 } 5639 }
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
5720 Fragment FlowGraphBuilder::TranslateFunctionNode(FunctionNode* node, 5737 Fragment FlowGraphBuilder::TranslateFunctionNode(FunctionNode* node,
5721 TreeNode* parent) { 5738 TreeNode* parent) {
5722 // The VM has a per-isolate table of functions indexed by the enclosing 5739 // The VM has a per-isolate table of functions indexed by the enclosing
5723 // function and token position. We don't have token positions, so we've 5740 // function and token position. We don't have token positions, so we've
5724 // simply numbered the immediately-nested functions with respect to the 5741 // simply numbered the immediately-nested functions with respect to the
5725 // parent. 5742 // parent.
5726 Function& function = Function::ZoneHandle(Z); 5743 Function& function = Function::ZoneHandle(Z);
5727 for (intptr_t i = 0; i < scopes_->function_scopes.length(); ++i) { 5744 for (intptr_t i = 0; i < scopes_->function_scopes.length(); ++i) {
5728 if (scopes_->function_scopes[i].function != node) continue; 5745 if (scopes_->function_scopes[i].function != node) continue;
5729 5746
5747 // NOTE: This is not TokenPosition in the general sense!
5730 function = I->LookupClosureFunction(parsed_function_->function(), 5748 function = I->LookupClosureFunction(parsed_function_->function(),
5731 TokenPosition(i)); 5749 TokenPosition(i));
5732 if (function.IsNull()) { 5750 if (function.IsNull()) {
5733 const dart::String* name; 5751 const dart::String* name;
5734 if (parent->IsFunctionExpression()) { 5752 if (parent->IsFunctionExpression()) {
5735 name = &Symbols::AnonymousClosure(); 5753 name = &Symbols::AnonymousClosure();
5736 } else { 5754 } else {
5737 ASSERT(parent->IsFunctionDeclaration()); 5755 ASSERT(parent->IsFunctionDeclaration());
5738 name = &H.DartSymbol( 5756 name = &H.DartSymbol(
5739 FunctionDeclaration::Cast(parent)->variable()->name()); 5757 FunctionDeclaration::Cast(parent)->variable()->name());
5740 } 5758 }
5759 // NOTE: This is not TokenPosition in the general sense!
5741 function = Function::NewClosureFunction( 5760 function = Function::NewClosureFunction(
5742 *name, parsed_function_->function(), TokenPosition(i)); 5761 *name, parsed_function_->function(), TokenPosition(i));
5743 function.set_is_debuggable(false); 5762 function.set_is_debuggable(false);
5744 LocalScope* scope = scopes_->function_scopes[i].scope; 5763 LocalScope* scope = scopes_->function_scopes[i].scope;
5745 const ContextScope& context_scope = 5764 const ContextScope& context_scope =
5746 ContextScope::Handle(Z, scope->PreserveOuterScope(context_depth_)); 5765 ContextScope::Handle(Z, scope->PreserveOuterScope(context_depth_));
5747 function.set_context_scope(context_scope); 5766 function.set_context_scope(context_scope);
5748 function.set_kernel_function(node); 5767 function.set_kernel_function(node);
5749 KernelReader::SetupFunctionParameters(H, T, dart::Class::Handle(Z), 5768 KernelReader::SetupFunctionParameters(H, T, dart::Class::Handle(Z),
5750 function, node, 5769 function, node,
(...skipping 27 matching lines...) Expand all
5778 instructions += LoadLocal(parsed_function_->current_context_var()); 5797 instructions += LoadLocal(parsed_function_->current_context_var());
5779 instructions += StoreInstanceField(Closure::context_offset()); 5798 instructions += StoreInstanceField(Closure::context_offset());
5780 5799
5781 return instructions; 5800 return instructions;
5782 } 5801 }
5783 5802
5784 5803
5785 } // namespace kernel 5804 } // namespace kernel
5786 } // namespace dart 5805 } // namespace dart
5787 #endif // !defined(DART_PRECOMPILED_RUNTIME) 5806 #endif // !defined(DART_PRECOMPILED_RUNTIME)
OLDNEW
« no previous file with comments | « runtime/vm/kernel_to_il.h ('k') | runtime/vm/object.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698