OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/ast.h" | 5 #include "vm/ast.h" |
6 #include "vm/compiler.h" | 6 #include "vm/compiler.h" |
7 #include "vm/dart_entry.h" | 7 #include "vm/dart_entry.h" |
8 #include "vm/isolate.h" | 8 #include "vm/isolate.h" |
9 #include "vm/log.h" | 9 #include "vm/log.h" |
10 #include "vm/object_store.h" | 10 #include "vm/object_store.h" |
(...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
568 return NULL; | 568 return NULL; |
569 } | 569 } |
570 return new StoreLocalNode(token_pos(), &local(), rhs); | 570 return new StoreLocalNode(token_pos(), &local(), rhs); |
571 } | 571 } |
572 | 572 |
573 | 573 |
574 AstNode* LoadStaticFieldNode::MakeAssignmentNode(AstNode* rhs) { | 574 AstNode* LoadStaticFieldNode::MakeAssignmentNode(AstNode* rhs) { |
575 if (field().is_final()) { | 575 if (field().is_final()) { |
576 return NULL; | 576 return NULL; |
577 } | 577 } |
578 if (Isolate::Current()->flags().type_checks()) { | 578 if (Isolate::Current()->type_checks()) { |
579 rhs = new AssignableNode( | 579 rhs = new AssignableNode( |
580 field().token_pos(), | 580 field().token_pos(), |
581 rhs, | 581 rhs, |
582 AbstractType::ZoneHandle(field().type()), | 582 AbstractType::ZoneHandle(field().type()), |
583 String::ZoneHandle(field().name())); | 583 String::ZoneHandle(field().name())); |
584 } | 584 } |
585 return new StoreStaticFieldNode(token_pos(), field(), rhs); | 585 return new StoreStaticFieldNode(token_pos(), field(), rhs); |
586 } | 586 } |
587 | 587 |
588 | 588 |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
656 // If the prefix is not yet loaded, the getter doesn't exist. Return a | 656 // If the prefix is not yet loaded, the getter doesn't exist. Return a |
657 // setter that will throw a NSME at runtime. | 657 // setter that will throw a NSME at runtime. |
658 if (!prefix.is_loaded()) { | 658 if (!prefix.is_loaded()) { |
659 return new StaticSetterNode(token_pos(), NULL, cls(), field_name_, rhs); | 659 return new StaticSetterNode(token_pos(), NULL, cls(), field_name_, rhs); |
660 } | 660 } |
661 | 661 |
662 Object& obj = Object::Handle(zone, prefix.LookupObject(field_name_)); | 662 Object& obj = Object::Handle(zone, prefix.LookupObject(field_name_)); |
663 if (obj.IsField()) { | 663 if (obj.IsField()) { |
664 const Field& field = Field::ZoneHandle(zone, Field::Cast(obj).raw()); | 664 const Field& field = Field::ZoneHandle(zone, Field::Cast(obj).raw()); |
665 if (!field.is_final()) { | 665 if (!field.is_final()) { |
666 if (isolate->flags().type_checks()) { | 666 if (isolate->type_checks()) { |
667 rhs = new AssignableNode(field.token_pos(), | 667 rhs = new AssignableNode(field.token_pos(), |
668 rhs, | 668 rhs, |
669 AbstractType::ZoneHandle(zone, field.type()), | 669 AbstractType::ZoneHandle(zone, field.type()), |
670 field_name_); | 670 field_name_); |
671 } | 671 } |
672 return new StoreStaticFieldNode(token_pos(), field, rhs); | 672 return new StoreStaticFieldNode(token_pos(), field, rhs); |
673 } | 673 } |
674 } | 674 } |
675 | 675 |
676 // No field found in prefix. Look for a setter function. | 676 // No field found in prefix. Look for a setter function. |
(...skipping 14 matching lines...) Expand all Loading... |
691 // non-existing setter that will throw an NSM error. | 691 // non-existing setter that will throw an NSM error. |
692 return new StaticSetterNode(token_pos(), NULL, cls(), field_name_, rhs); | 692 return new StaticSetterNode(token_pos(), NULL, cls(), field_name_, rhs); |
693 } | 693 } |
694 | 694 |
695 if (owner().IsLibrary()) { | 695 if (owner().IsLibrary()) { |
696 const Library& library = Library::Cast(owner()); | 696 const Library& library = Library::Cast(owner()); |
697 Object& obj = Object::Handle(zone, library.ResolveName(field_name_)); | 697 Object& obj = Object::Handle(zone, library.ResolveName(field_name_)); |
698 if (obj.IsField()) { | 698 if (obj.IsField()) { |
699 const Field& field = Field::ZoneHandle(zone, Field::Cast(obj).raw()); | 699 const Field& field = Field::ZoneHandle(zone, Field::Cast(obj).raw()); |
700 if (!field.is_final()) { | 700 if (!field.is_final()) { |
701 if (isolate->flags().type_checks()) { | 701 if (isolate->type_checks()) { |
702 rhs = new AssignableNode(field.token_pos(), | 702 rhs = new AssignableNode(field.token_pos(), |
703 rhs, | 703 rhs, |
704 AbstractType::ZoneHandle(zone, field.type()), | 704 AbstractType::ZoneHandle(zone, field.type()), |
705 field_name_); | 705 field_name_); |
706 } | 706 } |
707 return new StoreStaticFieldNode(token_pos(), field, rhs); | 707 return new StoreStaticFieldNode(token_pos(), field, rhs); |
708 } | 708 } |
709 } | 709 } |
710 | 710 |
711 // No field found in library. Look for a setter function. | 711 // No field found in library. Look for a setter function. |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
747 } | 747 } |
748 #if defined(DEBUG) | 748 #if defined(DEBUG) |
749 const String& getter_name = | 749 const String& getter_name = |
750 String::Handle(zone, Field::LookupGetterSymbol(field_name_)); | 750 String::Handle(zone, Field::LookupGetterSymbol(field_name_)); |
751 ASSERT(!getter_name.IsNull()); | 751 ASSERT(!getter_name.IsNull()); |
752 const Function& getter = | 752 const Function& getter = |
753 Function::Handle(zone, cls().LookupStaticFunction(getter_name)); | 753 Function::Handle(zone, cls().LookupStaticFunction(getter_name)); |
754 ASSERT(!getter.IsNull() && | 754 ASSERT(!getter.IsNull() && |
755 (getter.kind() == RawFunction::kImplicitStaticFinalGetter)); | 755 (getter.kind() == RawFunction::kImplicitStaticFinalGetter)); |
756 #endif | 756 #endif |
757 if (isolate->flags().type_checks()) { | 757 if (isolate->type_checks()) { |
758 rhs = new AssignableNode( | 758 rhs = new AssignableNode( |
759 field.token_pos(), | 759 field.token_pos(), |
760 rhs, | 760 rhs, |
761 AbstractType::ZoneHandle(zone, field.type()), | 761 AbstractType::ZoneHandle(zone, field.type()), |
762 String::ZoneHandle(zone, field.name())); | 762 String::ZoneHandle(zone, field.name())); |
763 } | 763 } |
764 return new StoreStaticFieldNode(token_pos(), field, rhs); | 764 return new StoreStaticFieldNode(token_pos(), field, rhs); |
765 } | 765 } |
766 // Didn't find a static setter or a static field. Make a call to | 766 // Didn't find a static setter or a static field. Make a call to |
767 // the non-existent setter to trigger a NoSuchMethodError at runtime. | 767 // the non-existent setter to trigger a NoSuchMethodError at runtime. |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
817 if (result.IsError() || result.IsNull()) { | 817 if (result.IsError() || result.IsNull()) { |
818 // TODO(turnidge): We could get better error messages by returning | 818 // TODO(turnidge): We could get better error messages by returning |
819 // the Error object directly to the parser. This will involve | 819 // the Error object directly to the parser. This will involve |
820 // replumbing all of the EvalConstExpr methods. | 820 // replumbing all of the EvalConstExpr methods. |
821 return NULL; | 821 return NULL; |
822 } | 822 } |
823 return &Instance::ZoneHandle(Instance::Cast(result).raw()); | 823 return &Instance::ZoneHandle(Instance::Cast(result).raw()); |
824 } | 824 } |
825 | 825 |
826 } // namespace dart | 826 } // namespace dart |
OLD | NEW |