| 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 | 
|---|