OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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/parser.h" | 5 #include "vm/parser.h" |
6 #include "vm/flags.h" | 6 #include "vm/flags.h" |
7 | 7 |
8 #ifndef DART_PRECOMPILED_RUNTIME | 8 #ifndef DART_PRECOMPILED_RUNTIME |
9 | 9 |
10 #include "lib/invocation_mirror.h" | 10 #include "lib/invocation_mirror.h" |
(...skipping 4547 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4558 cls.set_super_type(super_type); | 4558 cls.set_super_type(super_type); |
4559 | 4559 |
4560 if (CurrentToken() == Token::kIMPLEMENTS) { | 4560 if (CurrentToken() == Token::kIMPLEMENTS) { |
4561 ParseInterfaceList(cls); | 4561 ParseInterfaceList(cls); |
4562 } | 4562 } |
4563 | 4563 |
4564 if (is_patch) { | 4564 if (is_patch) { |
4565 cls.set_is_patch(); | 4565 cls.set_is_patch(); |
4566 // Apply the changes to the patched class looked up above. | 4566 // Apply the changes to the patched class looked up above. |
4567 ASSERT(obj.raw() == library_.LookupLocalObject(class_name)); | 4567 ASSERT(obj.raw() == library_.LookupLocalObject(class_name)); |
4568 // The patched class must not be finalized yet. | 4568 const Class& orig_class = Class::Cast(obj); |
4569 ASSERT(!Class::Cast(obj).is_finalized()); | 4569 if (orig_class.is_finalized()) { |
| 4570 orig_class.SetRefinalizeAfterPatch(); |
| 4571 pending_classes.Add(orig_class, Heap::kOld); |
| 4572 } |
4570 library_.AddPatchClass(cls); | 4573 library_.AddPatchClass(cls); |
4571 } | 4574 } |
4572 pending_classes.Add(cls, Heap::kOld); | 4575 pending_classes.Add(cls, Heap::kOld); |
4573 | 4576 |
4574 if (is_mixin_declaration) { | 4577 if (is_mixin_declaration) { |
4575 ExpectSemicolon(); | 4578 ExpectSemicolon(); |
4576 } else { | 4579 } else { |
4577 CheckToken(Token::kLBRACE); | 4580 CheckToken(Token::kLBRACE); |
4578 SkipBlock(); | 4581 SkipBlock(); |
4579 ExpectToken(Token::kRBRACE); | 4582 ExpectToken(Token::kRBRACE); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4627 AddImplicitConstructor(cls); | 4630 AddImplicitConstructor(cls); |
4628 } | 4631 } |
4629 | 4632 |
4630 if (cls.is_patch()) { | 4633 if (cls.is_patch()) { |
4631 // Apply the changes to the patched class looked up above. | 4634 // Apply the changes to the patched class looked up above. |
4632 Object& obj = Object::Handle(Z, library_.LookupLocalObject(class_name)); | 4635 Object& obj = Object::Handle(Z, library_.LookupLocalObject(class_name)); |
4633 // The patched class must not be finalized yet. | 4636 // The patched class must not be finalized yet. |
4634 const Class& orig_class = Class::Cast(obj); | 4637 const Class& orig_class = Class::Cast(obj); |
4635 ASSERT(!orig_class.is_finalized()); | 4638 ASSERT(!orig_class.is_finalized()); |
4636 Error& error = Error::Handle(Z); | 4639 Error& error = Error::Handle(Z); |
| 4640 // Check if this is a case of patching a class after it has already |
| 4641 // been finalized. |
| 4642 if (orig_class.is_refinalize_after_patch()) { |
| 4643 if (!cls.ValidatePostFinalizePatch(orig_class, &error)) { |
| 4644 Report::LongJumpF(error, script_, class_pos, |
| 4645 "patch validation failed, not applying patch.\n"); |
| 4646 } |
| 4647 } |
4637 if (!orig_class.ApplyPatch(cls, &error)) { | 4648 if (!orig_class.ApplyPatch(cls, &error)) { |
4638 Report::LongJumpF(error, script_, class_pos, "applying patch failed"); | 4649 Report::LongJumpF(error, script_, class_pos, "applying patch failed"); |
4639 } | 4650 } |
4640 } | 4651 } |
4641 } | 4652 } |
4642 | 4653 |
4643 | 4654 |
4644 void Parser::ParseEnumDefinition(const Class& cls) { | 4655 void Parser::ParseEnumDefinition(const Class& cls) { |
4645 TRACE_PARSER("ParseEnumDefinition"); | 4656 TRACE_PARSER("ParseEnumDefinition"); |
4646 INC_STAT(thread(), num_classes_parsed, 1); | 4657 INC_STAT(thread(), num_classes_parsed, 1); |
(...skipping 9815 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14462 const ArgumentListNode& function_args, | 14473 const ArgumentListNode& function_args, |
14463 const LocalVariable* temp_for_last_arg, | 14474 const LocalVariable* temp_for_last_arg, |
14464 bool is_super_invocation) { | 14475 bool is_super_invocation) { |
14465 UNREACHABLE(); | 14476 UNREACHABLE(); |
14466 return NULL; | 14477 return NULL; |
14467 } | 14478 } |
14468 | 14479 |
14469 } // namespace dart | 14480 } // namespace dart |
14470 | 14481 |
14471 #endif // DART_PRECOMPILED_RUNTIME | 14482 #endif // DART_PRECOMPILED_RUNTIME |
OLD | NEW |