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

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

Issue 10827288: - Support for patching of class methods and fields. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 4 months 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 | Annotate | Revision Log
OLDNEW
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 6
7 #include "vm/bigint_operations.h" 7 #include "vm/bigint_operations.h"
8 #include "vm/class_finalizer.h" 8 #include "vm/class_finalizer.h"
9 #include "vm/compiler.h" 9 #include "vm/compiler.h"
10 #include "vm/compiler_stats.h" 10 #include "vm/compiler_stats.h"
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 intptr_t token_position) 250 intptr_t token_position)
251 : script_(script), 251 : script_(script),
252 tokens_iterator_(TokenStream::Handle(script.tokens()), token_position), 252 tokens_iterator_(TokenStream::Handle(script.tokens()), token_position),
253 token_kind_(Token::kILLEGAL), 253 token_kind_(Token::kILLEGAL),
254 current_block_(NULL), 254 current_block_(NULL),
255 is_top_level_(false), 255 is_top_level_(false),
256 current_member_(NULL), 256 current_member_(NULL),
257 allow_function_literals_(true), 257 allow_function_literals_(true),
258 current_function_(function), 258 current_function_(function),
259 innermost_function_(Function::Handle(function.raw())), 259 innermost_function_(Function::Handle(function.raw())),
260 current_class_(Class::Handle(current_function_.owner())), 260 current_class_(Class::Handle(current_function_.Owner())),
261 library_(Library::Handle(current_class_.library())), 261 library_(Library::Handle(current_class_.library())),
262 try_blocks_list_(NULL), 262 try_blocks_list_(NULL),
263 expression_temp_(NULL) { 263 expression_temp_(NULL) {
264 ASSERT(tokens_iterator_.IsValid()); 264 ASSERT(tokens_iterator_.IsValid());
265 ASSERT(!function.IsNull()); 265 ASSERT(!function.IsNull());
266 if (FLAG_enable_type_checks) { 266 if (FLAG_enable_type_checks) {
267 EnsureExpressionTemp(); 267 EnsureExpressionTemp();
268 } 268 }
269 } 269 }
270 270
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after
649 } 649 }
650 } 650 }
651 651
652 652
653 void Parser::ParseFunction(ParsedFunction* parsed_function) { 653 void Parser::ParseFunction(ParsedFunction* parsed_function) {
654 TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer); 654 TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer);
655 Isolate* isolate = Isolate::Current(); 655 Isolate* isolate = Isolate::Current();
656 ASSERT(isolate->long_jump_base()->IsSafeToJump()); 656 ASSERT(isolate->long_jump_base()->IsSafeToJump());
657 ASSERT(parsed_function != NULL); 657 ASSERT(parsed_function != NULL);
658 const Function& func = parsed_function->function(); 658 const Function& func = parsed_function->function();
659 const Class& cls = Class::Handle(isolate, func.owner()); 659 const Script& script = Script::Handle(isolate, func.script());
660 const Script& script = Script::Handle(isolate, cls.script());
661 Parser parser(script, func, func.token_pos()); 660 Parser parser(script, func, func.token_pos());
662 SequenceNode* node_sequence = NULL; 661 SequenceNode* node_sequence = NULL;
663 Array& default_parameter_values = Array::Handle(isolate, Array::null()); 662 Array& default_parameter_values = Array::Handle(isolate, Array::null());
664 switch (func.kind()) { 663 switch (func.kind()) {
665 case RawFunction::kRegularFunction: 664 case RawFunction::kRegularFunction:
666 case RawFunction::kClosureFunction: 665 case RawFunction::kClosureFunction:
667 case RawFunction::kGetterFunction: 666 case RawFunction::kGetterFunction:
668 case RawFunction::kSetterFunction: 667 case RawFunction::kSetterFunction:
669 case RawFunction::kConstructor: 668 case RawFunction::kConstructor:
670 node_sequence = parser.ParseFunc(func, default_parameter_values); 669 node_sequence = parser.ParseFunc(func, default_parameter_values);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
730 ParamList params; 729 ParamList params;
731 ASSERT(func.num_fixed_parameters() == 0); // static. 730 ASSERT(func.num_fixed_parameters() == 0); // static.
732 ASSERT(func.num_optional_parameters() == 0); 731 ASSERT(func.num_optional_parameters() == 0);
733 ASSERT(AbstractType::Handle(func.result_type()).IsResolved()); 732 ASSERT(AbstractType::Handle(func.result_type()).IsResolved());
734 733
735 // Build local scope for function and populate with the formal parameters. 734 // Build local scope for function and populate with the formal parameters.
736 OpenFunctionBlock(func); 735 OpenFunctionBlock(func);
737 AddFormalParamsToScope(&params, current_block_->scope); 736 AddFormalParamsToScope(&params, current_block_->scope);
738 737
739 const String& field_name = *ExpectIdentifier("field name expected"); 738 const String& field_name = *ExpectIdentifier("field name expected");
740 const Class& field_class = Class::Handle(func.owner()); 739 const Class& field_class = Class::Handle(func.Owner());
741 const Field& field = 740 const Field& field =
742 Field::ZoneHandle(field_class.LookupStaticField(field_name)); 741 Field::ZoneHandle(field_class.LookupStaticField(field_name));
743 742
744 // Static const fields must have an initializer. 743 // Static const fields must have an initializer.
745 ExpectToken(Token::kASSIGN); 744 ExpectToken(Token::kASSIGN);
746 745
747 // We don't want to use ParseConstExpr() here because we don't want 746 // We don't want to use ParseConstExpr() here because we don't want
748 // the constant folding code to create, compile and execute a code 747 // the constant folding code to create, compile and execute a code
749 // fragment to evaluate the expression. Instead, we just make sure 748 // fragment to evaluate the expression. Instead, we just make sure
750 // the static const field initializer is a constant expression and 749 // the static const field initializer is a constant expression and
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
835 } 834 }
836 835
837 836
838 // Create AstNodes for an implicit instance getter method: 837 // Create AstNodes for an implicit instance getter method:
839 // LoadLocalNode 0 ('this'); 838 // LoadLocalNode 0 ('this');
840 // LoadInstanceFieldNode (field_name); 839 // LoadInstanceFieldNode (field_name);
841 // ReturnNode (field's value); 840 // ReturnNode (field's value);
842 SequenceNode* Parser::ParseInstanceGetter(const Function& func) { 841 SequenceNode* Parser::ParseInstanceGetter(const Function& func) {
843 TRACE_PARSER("ParseInstanceGetter"); 842 TRACE_PARSER("ParseInstanceGetter");
844 ParamList params; 843 ParamList params;
845 ASSERT(current_class().raw() == func.owner()); 844 ASSERT(current_class().raw() == func.Owner());
846 params.AddReceiver(ReceiverType(TokenPos())); 845 params.AddReceiver(ReceiverType(TokenPos()));
847 ASSERT(func.num_fixed_parameters() == 1); // receiver. 846 ASSERT(func.num_fixed_parameters() == 1); // receiver.
848 ASSERT(func.num_optional_parameters() == 0); 847 ASSERT(func.num_optional_parameters() == 0);
849 ASSERT(AbstractType::Handle(func.result_type()).IsResolved()); 848 ASSERT(AbstractType::Handle(func.result_type()).IsResolved());
850 849
851 // Build local scope for function and populate with the formal parameters. 850 // Build local scope for function and populate with the formal parameters.
852 OpenFunctionBlock(func); 851 OpenFunctionBlock(func);
853 AddFormalParamsToScope(&params, current_block_->scope); 852 AddFormalParamsToScope(&params, current_block_->scope);
854 853
855 // Receiver is local 0. 854 // Receiver is local 0.
856 LocalVariable* receiver = current_block_->scope->VariableAt(0); 855 LocalVariable* receiver = current_block_->scope->VariableAt(0);
857 LoadLocalNode* load_receiver = new LoadLocalNode(TokenPos(), receiver); 856 LoadLocalNode* load_receiver = new LoadLocalNode(TokenPos(), receiver);
858 // TokenPos() returns the function's token position which points to the 857 // TokenPos() returns the function's token position which points to the
859 // name of the field; 858 // name of the field;
860 ASSERT(IsIdentifier()); 859 ASSERT(IsIdentifier());
861 const String& field_name = *CurrentLiteral(); 860 const String& field_name = *CurrentLiteral();
862 const Class& field_class = Class::Handle(func.owner()); 861 const Class& field_class = Class::Handle(func.Owner());
863 const Field& field = 862 const Field& field =
864 Field::ZoneHandle(field_class.LookupInstanceField(field_name)); 863 Field::ZoneHandle(field_class.LookupInstanceField(field_name));
865 864
866 LoadInstanceFieldNode* load_field = 865 LoadInstanceFieldNode* load_field =
867 new LoadInstanceFieldNode(TokenPos(), load_receiver, field); 866 new LoadInstanceFieldNode(TokenPos(), load_receiver, field);
868 867
869 ReturnNode* return_node = new ReturnNode(TokenPos(), load_field); 868 ReturnNode* return_node = new ReturnNode(TokenPos(), load_field);
870 current_block_->statements->Add(return_node); 869 current_block_->statements->Add(return_node);
871 return CloseBlock(); 870 return CloseBlock();
872 } 871 }
873 872
874 873
875 // Create AstNodes for an implicit instance setter method: 874 // Create AstNodes for an implicit instance setter method:
876 // LoadLocalNode 0 ('this') 875 // LoadLocalNode 0 ('this')
877 // LoadLocalNode 1 ('value') 876 // LoadLocalNode 1 ('value')
878 // SetInstanceField (field_name); 877 // SetInstanceField (field_name);
879 // ReturnNode (void); 878 // ReturnNode (void);
880 SequenceNode* Parser::ParseInstanceSetter(const Function& func) { 879 SequenceNode* Parser::ParseInstanceSetter(const Function& func) {
881 TRACE_PARSER("ParseInstanceSetter"); 880 TRACE_PARSER("ParseInstanceSetter");
882 // TokenPos() returns the function's token position which points to 881 // TokenPos() returns the function's token position which points to
883 // the name of the field; we can use it to form the field_name. 882 // the name of the field; we can use it to form the field_name.
884 const String& field_name = *CurrentLiteral(); 883 const String& field_name = *CurrentLiteral();
885 const Class& field_class = Class::ZoneHandle(func.owner()); 884 const Class& field_class = Class::ZoneHandle(func.Owner());
886 const Field& field = 885 const Field& field =
887 Field::ZoneHandle(field_class.LookupInstanceField(field_name)); 886 Field::ZoneHandle(field_class.LookupInstanceField(field_name));
888 const AbstractType& field_type = AbstractType::ZoneHandle(field.type()); 887 const AbstractType& field_type = AbstractType::ZoneHandle(field.type());
889 888
890 ParamList params; 889 ParamList params;
891 ASSERT(current_class().raw() == func.owner()); 890 ASSERT(current_class().raw() == func.Owner());
892 params.AddReceiver(ReceiverType(TokenPos())); 891 params.AddReceiver(ReceiverType(TokenPos()));
893 params.AddFinalParameter(TokenPos(), 892 params.AddFinalParameter(TokenPos(),
894 &String::ZoneHandle(Symbols::Value()), 893 &String::ZoneHandle(Symbols::Value()),
895 &field_type); 894 &field_type);
896 ASSERT(func.num_fixed_parameters() == 2); // receiver, value. 895 ASSERT(func.num_fixed_parameters() == 2); // receiver, value.
897 ASSERT(func.num_optional_parameters() == 0); 896 ASSERT(func.num_optional_parameters() == 0);
898 ASSERT(AbstractType::Handle(func.result_type()).IsVoidType()); 897 ASSERT(AbstractType::Handle(func.result_type()).IsVoidType());
899 898
900 // Build local scope for function and populate with the formal parameters. 899 // Build local scope for function and populate with the formal parameters.
901 OpenFunctionBlock(func); 900 OpenFunctionBlock(func);
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
1181 } 1180 }
1182 String& native_name = *CurrentLiteral(); 1181 String& native_name = *CurrentLiteral();
1183 ConsumeToken(); 1182 ConsumeToken();
1184 ExpectSemicolon(); 1183 ExpectSemicolon();
1185 return native_name; 1184 return native_name;
1186 } 1185 }
1187 1186
1188 1187
1189 void Parser::CheckFunctionIsCallable(intptr_t token_pos, 1188 void Parser::CheckFunctionIsCallable(intptr_t token_pos,
1190 const Function& function) { 1189 const Function& function) {
1191 if (Class::Handle(function.owner()).is_interface()) { 1190 if (Class::Handle(function.Owner()).is_interface()) {
1192 ErrorMsg(token_pos, "cannot call function of interface '%s'", 1191 ErrorMsg(token_pos, "cannot call function of interface '%s'",
1193 function.ToFullyQualifiedCString()); 1192 function.ToFullyQualifiedCString());
1194 } 1193 }
1195 } 1194 }
1196 1195
1197 1196
1198 // Resolve and return the dynamic function of the given name in the superclass. 1197 // Resolve and return the dynamic function of the given name in the superclass.
1199 // If it is not found, return noSuchMethod and set is_no_such_method to true. 1198 // If it is not found, return noSuchMethod and set is_no_such_method to true.
1200 RawFunction* Parser::GetSuperFunction(intptr_t token_pos, 1199 RawFunction* Parser::GetSuperFunction(intptr_t token_pos,
1201 const String& name, 1200 const String& name,
(...skipping 570 matching lines...) Expand 10 before | Expand all | Expand 10 after
1772 ASSERT(func.IsConstructor()); 1771 ASSERT(func.IsConstructor());
1773 const intptr_t ctor_pos = TokenPos(); 1772 const intptr_t ctor_pos = TokenPos();
1774 1773
1775 // Implicit 'this' is the only parameter/local variable. 1774 // Implicit 'this' is the only parameter/local variable.
1776 OpenFunctionBlock(func); 1775 OpenFunctionBlock(func);
1777 1776
1778 // Parse expressions of instance fields that have an explicit 1777 // Parse expressions of instance fields that have an explicit
1779 // initializers. 1778 // initializers.
1780 GrowableArray<FieldInitExpression> initializers; 1779 GrowableArray<FieldInitExpression> initializers;
1781 GrowableArray<Field*> initialized_fields; 1780 GrowableArray<Field*> initialized_fields;
1782 Class& cls = Class::Handle(func.owner()); 1781 Class& cls = Class::Handle(func.Owner());
1783 ParseInitializedInstanceFields(cls, &initializers, &initialized_fields); 1782 ParseInitializedInstanceFields(cls, &initializers, &initialized_fields);
1784 1783
1785 LocalVariable* receiver = new LocalVariable( 1784 LocalVariable* receiver = new LocalVariable(
1786 ctor_pos, 1785 ctor_pos,
1787 String::ZoneHandle(Symbols::This()), 1786 String::ZoneHandle(Symbols::This()),
1788 Type::ZoneHandle(Type::DynamicType())); 1787 Type::ZoneHandle(Type::DynamicType()));
1789 current_block_->scope->AddVariable(receiver); 1788 current_block_->scope->AddVariable(receiver);
1790 1789
1791 LocalVariable* phase_parameter = new LocalVariable( 1790 LocalVariable* phase_parameter = new LocalVariable(
1792 ctor_pos, 1791 ctor_pos,
(...skipping 25 matching lines...) Expand all
1818 1817
1819 // Parser is at the opening parenthesis of the formal parameter declaration 1818 // Parser is at the opening parenthesis of the formal parameter declaration
1820 // of function. Parse the formal parameters, initializers and code. 1819 // of function. Parse the formal parameters, initializers and code.
1821 SequenceNode* Parser::ParseConstructor(const Function& func, 1820 SequenceNode* Parser::ParseConstructor(const Function& func,
1822 Array& default_parameter_values) { 1821 Array& default_parameter_values) {
1823 TRACE_PARSER("ParseConstructor"); 1822 TRACE_PARSER("ParseConstructor");
1824 ASSERT(func.IsConstructor()); 1823 ASSERT(func.IsConstructor());
1825 ASSERT(!func.IsFactory()); 1824 ASSERT(!func.IsFactory());
1826 ASSERT(!func.is_static()); 1825 ASSERT(!func.is_static());
1827 ASSERT(!func.IsLocalFunction()); 1826 ASSERT(!func.IsLocalFunction());
1828 const Class& cls = Class::Handle(func.owner()); 1827 const Class& cls = Class::Handle(func.Owner());
1829 ASSERT(!cls.IsNull()); 1828 ASSERT(!cls.IsNull());
1830 1829
1831 if (CurrentToken() == Token::kCLASS) { 1830 if (CurrentToken() == Token::kCLASS) {
1832 // Special case: implicit constructor. 1831 // Special case: implicit constructor.
1833 // The parser adds an implicit default constructor when a class 1832 // The parser adds an implicit default constructor when a class
1834 // does not have any explicit constructor or factory (see 1833 // does not have any explicit constructor or factory (see
1835 // Parser::CheckConstructors). The token position of this implicit 1834 // Parser::CheckConstructors). The token position of this implicit
1836 // constructor points to the 'class' keyword, which is followed 1835 // constructor points to the 'class' keyword, which is followed
1837 // by the name of the class (which is also the constructor name). 1836 // by the name of the class (which is also the constructor name).
1838 // There is no source text to parse. We just build the 1837 // There is no source text to parse. We just build the
1839 // sequence node by hand. 1838 // sequence node by hand.
1840 return MakeImplicitConstructor(func); 1839 return MakeImplicitConstructor(func);
1841 } 1840 }
1842 1841
1843 OpenFunctionBlock(func); 1842 OpenFunctionBlock(func);
1844 ParamList params; 1843 ParamList params;
1845 const bool allow_explicit_default_values = true; 1844 const bool allow_explicit_default_values = true;
1846 ASSERT(CurrentToken() == Token::kLPAREN); 1845 ASSERT(CurrentToken() == Token::kLPAREN);
1847 1846
1848 // Add implicit receiver parameter which is passed the allocated 1847 // Add implicit receiver parameter which is passed the allocated
1849 // but uninitialized instance to construct. 1848 // but uninitialized instance to construct.
1850 ASSERT(current_class().raw() == func.owner()); 1849 ASSERT(current_class().raw() == func.Owner());
1851 params.AddReceiver(ReceiverType(TokenPos())); 1850 params.AddReceiver(ReceiverType(TokenPos()));
1852 1851
1853 // Add implicit parameter for construction phase. 1852 // Add implicit parameter for construction phase.
1854 params.AddFinalParameter( 1853 params.AddFinalParameter(
1855 TokenPos(), 1854 TokenPos(),
1856 &String::ZoneHandle(Symbols::PhaseParameter()), 1855 &String::ZoneHandle(Symbols::PhaseParameter()),
1857 &Type::ZoneHandle(Type::IntInterface())); 1856 &Type::ZoneHandle(Type::IntInterface()));
1858 1857
1859 if (func.is_const()) { 1858 if (func.is_const()) {
1860 params.SetImplicitlyFinal(); 1859 params.SetImplicitlyFinal();
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
2089 ASSERT(!func.IsConstructor()); 2088 ASSERT(!func.IsConstructor());
2090 OpenFunctionBlock(func); // Build local scope for function. 2089 OpenFunctionBlock(func); // Build local scope for function.
2091 2090
2092 ParamList params; 2091 ParamList params;
2093 // Static functions do not have a receiver. 2092 // Static functions do not have a receiver.
2094 // An instance closure may capture and access the receiver, but via the 2093 // An instance closure may capture and access the receiver, but via the
2095 // context and not via the first formal parameter. 2094 // context and not via the first formal parameter.
2096 // The first parameter of a factory is the AbstractTypeArguments vector of 2095 // The first parameter of a factory is the AbstractTypeArguments vector of
2097 // the type of the instance to be allocated. 2096 // the type of the instance to be allocated.
2098 if (!func.is_static() && !func.IsClosureFunction()) { 2097 if (!func.is_static() && !func.IsClosureFunction()) {
2099 ASSERT(current_class().raw() == func.owner()); 2098 ASSERT(current_class().raw() == func.Owner());
2100 params.AddReceiver(ReceiverType(TokenPos())); 2099 params.AddReceiver(ReceiverType(TokenPos()));
2101 } else if (func.IsFactory()) { 2100 } else if (func.IsFactory()) {
2102 params.AddFinalParameter( 2101 params.AddFinalParameter(
2103 TokenPos(), 2102 TokenPos(),
2104 &String::ZoneHandle(Symbols::TypeArgumentsParameter()), 2103 &String::ZoneHandle(Symbols::TypeArgumentsParameter()),
2105 &Type::ZoneHandle(Type::DynamicType())); 2104 &Type::ZoneHandle(Type::DynamicType()));
2106 } 2105 }
2107 ASSERT((CurrentToken() == Token::kLPAREN) || func.IsGetterFunction()); 2106 ASSERT((CurrentToken() == Token::kLPAREN) || func.IsGetterFunction());
2108 const bool allow_explicit_default_values = true; 2107 const bool allow_explicit_default_values = true;
2109 if (!func.IsGetterFunction()) { 2108 if (!func.IsGetterFunction()) {
(...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after
2619 if (!field->has_static) { 2618 if (!field->has_static) {
2620 String& getter_name = String::Handle(Field::GetterSymbol(*field->name)); 2619 String& getter_name = String::Handle(Field::GetterSymbol(*field->name));
2621 getter = Function::New(getter_name, RawFunction::kImplicitGetter, 2620 getter = Function::New(getter_name, RawFunction::kImplicitGetter,
2622 field->has_static, 2621 field->has_static,
2623 field->has_final, 2622 field->has_final,
2624 /* is_abstract = */ false, 2623 /* is_abstract = */ false,
2625 /* is_external = */ false, 2624 /* is_external = */ false,
2626 current_class(), 2625 current_class(),
2627 field->name_pos); 2626 field->name_pos);
2628 ParamList params; 2627 ParamList params;
2629 ASSERT(current_class().raw() == getter.owner()); 2628 ASSERT(current_class().raw() == getter.Owner());
2630 params.AddReceiver(ReceiverType(TokenPos())); 2629 params.AddReceiver(ReceiverType(TokenPos()));
2631 getter.set_result_type(*field->type); 2630 getter.set_result_type(*field->type);
2632 AddFormalParamsToFunction(&params, getter); 2631 AddFormalParamsToFunction(&params, getter);
2633 members->AddFunction(getter); 2632 members->AddFunction(getter);
2634 if (!field->has_final) { 2633 if (!field->has_final) {
2635 // Build a setter accessor for non-const fields. 2634 // Build a setter accessor for non-const fields.
2636 String& setter_name = String::Handle(Field::SetterSymbol(*field->name)); 2635 String& setter_name = String::Handle(Field::SetterSymbol(*field->name));
2637 setter = Function::New(setter_name, RawFunction::kImplicitSetter, 2636 setter = Function::New(setter_name, RawFunction::kImplicitSetter,
2638 field->has_static, 2637 field->has_static,
2639 field->has_final, 2638 field->has_final,
2640 /* is_abstract = */ false, 2639 /* is_abstract = */ false,
2641 /* is_external = */ false, 2640 /* is_external = */ false,
2642 current_class(), 2641 current_class(),
2643 field->name_pos); 2642 field->name_pos);
2644 ParamList params; 2643 ParamList params;
2645 ASSERT(current_class().raw() == setter.owner()); 2644 ASSERT(current_class().raw() == setter.Owner());
2646 params.AddReceiver(ReceiverType(TokenPos())); 2645 params.AddReceiver(ReceiverType(TokenPos()));
2647 params.AddFinalParameter(TokenPos(), 2646 params.AddFinalParameter(TokenPos(),
2648 &String::ZoneHandle(Symbols::Value()), 2647 &String::ZoneHandle(Symbols::Value()),
2649 field->type); 2648 field->type);
2650 setter.set_result_type(Type::Handle(Type::VoidType())); 2649 setter.set_result_type(Type::Handle(Type::VoidType()));
2651 AddFormalParamsToFunction(&params, setter); 2650 AddFormalParamsToFunction(&params, setter);
2652 members->AddFunction(setter); 2651 members->AddFunction(setter);
2653 } 2652 }
2654 } 2653 }
2655 2654
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after
2918 UnexpectedToken(); 2917 UnexpectedToken();
2919 } 2918 }
2920 current_member_ = NULL; 2919 current_member_ = NULL;
2921 members->AddMember(member); 2920 members->AddMember(member);
2922 } 2921 }
2923 2922
2924 2923
2925 void Parser::ParseClassDefinition(const GrowableObjectArray& pending_classes) { 2924 void Parser::ParseClassDefinition(const GrowableObjectArray& pending_classes) {
2926 TRACE_PARSER("ParseClassDefinition"); 2925 TRACE_PARSER("ParseClassDefinition");
2927 const intptr_t class_pos = TokenPos(); 2926 const intptr_t class_pos = TokenPos();
2927 bool is_patch = false;
2928 if (is_patch_source() &&
2929 (CurrentToken() == Token::kIDENT) &&
2930 CurrentLiteral()->Equals("patch")) {
2931 ConsumeToken();
2932 is_patch = true;
2933 }
2928 ExpectToken(Token::kCLASS); 2934 ExpectToken(Token::kCLASS);
2929 const intptr_t classname_pos = TokenPos(); 2935 const intptr_t classname_pos = TokenPos();
2930 String& class_name = *ExpectTypeIdentifier("class name expected"); 2936 String& class_name = *ExpectTypeIdentifier("class name expected");
2931 if (FLAG_trace_parser) { 2937 if (FLAG_trace_parser) {
2932 OS::Print("TopLevel parsing class '%s'\n", class_name.ToCString()); 2938 OS::Print("TopLevel parsing class '%s'\n", class_name.ToCString());
2933 } 2939 }
2934 Class& cls = Class::Handle(); 2940 Class& cls = Class::Handle();
2935 Object& obj = Object::Handle(library_.LookupObject(class_name)); 2941 Object& obj = Object::Handle(library_.LookupObject(class_name));
2936 if (obj.IsNull()) { 2942 if (obj.IsNull()) {
2943 if (is_patch) {
2944 ErrorMsg(classname_pos, "missing class '%s' cannot be patched",
2945 class_name.ToCString());
2946 }
2937 cls = Class::New(class_name, script_, classname_pos); 2947 cls = Class::New(class_name, script_, classname_pos);
2938 library_.AddClass(cls); 2948 library_.AddClass(cls);
2939 } else { 2949 } else {
2940 if (!obj.IsClass()) { 2950 if (!obj.IsClass()) {
2941 ErrorMsg(classname_pos, "'%s' is already defined", 2951 ErrorMsg(classname_pos, "'%s' is already defined",
2942 class_name.ToCString()); 2952 class_name.ToCString());
2943 } 2953 }
2944 cls ^= obj.raw(); 2954 cls ^= obj.raw();
2945 if (cls.is_interface()) { 2955 if (cls.is_interface()) {
2946 ErrorMsg(classname_pos, "'%s' is already defined as interface", 2956 ErrorMsg(classname_pos, "'%s' %s",
2947 class_name.ToCString()); 2957 class_name.ToCString(),
2948 } else if (cls.functions() != Object::empty_array()) { 2958 is_patch ?
2959 "is already defined as interface" :
2960 "interface cannot be patched");
2961 } else if (!is_patch && (cls.functions() != Object::empty_array())) {
2949 ErrorMsg(classname_pos, "class '%s' is already defined", 2962 ErrorMsg(classname_pos, "class '%s' is already defined",
2950 class_name.ToCString()); 2963 class_name.ToCString());
siva 2012/08/15 00:16:04 I suppose it is an error to have multiple patch cl
Ivan Posva 2012/08/15 06:50:39 Currently this error cannot be identified as I am
2964 } else if (is_patch) {
2965 String& patch = String::Handle(Symbols::New("patch "));
2966 patch = String::Concat(patch, class_name);
2967 patch = Symbols::New(patch);
2968 cls = Class::New(patch, script_, classname_pos);
2969 } else {
2970 // Not patching a class, but it has been found. This must be one of the
2971 // pre-registered classes from object.cc or a duplicate definition.
2972 if (cls.functions() != Object::empty_array()) {
2973 ErrorMsg(classname_pos, "class '%s' is already defined",
2974 class_name.ToCString());
2975 }
siva 2012/08/15 00:16:04 There seems to be a duplication of this is already
Ivan Posva 2012/08/15 06:50:40 Merge-conflict resolution error. Thanks for notici
2976 // Pre-registered classes need their scripts connected at this time.
2977 cls.set_script(script_);
2951 } 2978 }
2952 // Pre-registered classes need their scripts connected at this time.
2953 cls.set_script(script_);
2954 } 2979 }
2955 ASSERT(!cls.IsNull()); 2980 ASSERT(!cls.IsNull());
2956 ASSERT(cls.functions() == Object::empty_array()); 2981 ASSERT(cls.functions() == Object::empty_array());
2957 set_current_class(cls); 2982 set_current_class(cls);
2958 ParseTypeParameters(cls); 2983 ParseTypeParameters(cls);
2959 Type& super_type = Type::Handle(); 2984 Type& super_type = Type::Handle();
2960 if (CurrentToken() == Token::kEXTENDS) { 2985 if (CurrentToken() == Token::kEXTENDS) {
2961 ConsumeToken(); 2986 ConsumeToken();
2962 const intptr_t type_pos = TokenPos(); 2987 const intptr_t type_pos = TokenPos();
2963 const AbstractType& type = AbstractType::Handle( 2988 const AbstractType& type = AbstractType::Handle(
(...skipping 25 matching lines...) Expand all
2989 AddInterfaces(interfaces_pos, cls, interfaces); 3014 AddInterfaces(interfaces_pos, cls, interfaces);
2990 } 3015 }
2991 3016
2992 ExpectToken(Token::kLBRACE); 3017 ExpectToken(Token::kLBRACE);
2993 ClassDesc members(cls, class_name, false, class_pos); 3018 ClassDesc members(cls, class_name, false, class_pos);
2994 while (CurrentToken() != Token::kRBRACE) { 3019 while (CurrentToken() != Token::kRBRACE) {
2995 ParseClassMemberDefinition(&members); 3020 ParseClassMemberDefinition(&members);
2996 } 3021 }
2997 ExpectToken(Token::kRBRACE); 3022 ExpectToken(Token::kRBRACE);
2998 3023
2999 CheckConstructors(&members); 3024 if (!is_patch) {
3025 // Do not install implicit constructors.
hausner 2012/08/14 18:25:06 Why?
Ivan Posva 2012/08/15 06:50:40 If a patch class does not patch a constructor, it
3026 CheckConstructors(&members);
3027 }
3000 3028
3001 Array& array = Array::Handle(); 3029 Array& array = Array::Handle();
3002 array = Array::MakeArray(members.fields()); 3030 array = Array::MakeArray(members.fields());
3003 cls.SetFields(array); 3031 cls.SetFields(array);
3004 3032
3005 // Creating a new array for functions marks the class as parsed. 3033 // Creating a new array for functions marks the class as parsed.
3006 array = Array::MakeArray(members.functions()); 3034 array = Array::MakeArray(members.functions());
3007 cls.SetFunctions(array); 3035 cls.SetFunctions(array);
3008 3036
3009 pending_classes.Add(cls, Heap::kOld); 3037 if (!is_patch) {
3038 pending_classes.Add(cls, Heap::kOld);
3039 } else {
3040 // Lookup the patched class and apply the changes.
3041 obj = library_.LookupObject(class_name);
3042 Class::Cast(obj).ApplyPatch(cls);
3043 }
3010 } 3044 }
3011 3045
3012 3046
3013 // 1. Add an implicit constructor if no explicit constructor is present. 3047 // 1. Add an implicit constructor if no explicit constructor is present.
3014 // 2. Check for cycles in constructor redirection. 3048 // 2. Check for cycles in constructor redirection.
3015 void Parser::CheckConstructors(ClassDesc* class_desc) { 3049 void Parser::CheckConstructors(ClassDesc* class_desc) {
3016 // Add an implicit constructor if no explicit constructor is present. 3050 // Add an implicit constructor if no explicit constructor is present.
3017 if (!class_desc->has_constructor()) { 3051 if (!class_desc->has_constructor()) {
3018 // The implicit constructor is unnamed, has no explicit parameter, 3052 // The implicit constructor is unnamed, has no explicit parameter,
3019 // and contains a supercall in the initializer list. 3053 // and contains a supercall in the initializer list.
3020 String& ctor_name = String::ZoneHandle( 3054 String& ctor_name = String::ZoneHandle(
3021 String::Concat(class_desc->class_name(), 3055 String::Concat(class_desc->class_name(),
3022 String::Handle(Symbols::Dot()))); 3056 String::Handle(Symbols::Dot())));
3023 ctor_name = Symbols::New(ctor_name); 3057 ctor_name = Symbols::New(ctor_name);
3024 // The token position for the implicit constructor is the 'class' 3058 // The token position for the implicit constructor is the 'class'
3025 // keyword of the constructor's class. 3059 // keyword of the constructor's class.
3026 Function& ctor = Function::Handle( 3060 Function& ctor = Function::Handle(
3027 Function::New(ctor_name, 3061 Function::New(ctor_name,
3028 RawFunction::kConstructor, 3062 RawFunction::kConstructor,
3029 /* is_static = */ false, 3063 /* is_static = */ false,
3030 /* is_const = */ false, 3064 /* is_const = */ false,
3031 /* is_abstract = */ false, 3065 /* is_abstract = */ false,
3032 /* is_external = */ false, 3066 /* is_external = */ false,
3033 current_class(), 3067 current_class(),
3034 class_desc->token_pos())); 3068 class_desc->token_pos()));
3035 ParamList params; 3069 ParamList params;
3036 // Add implicit 'this' parameter. 3070 // Add implicit 'this' parameter.
3037 ASSERT(current_class().raw() == ctor.owner()); 3071 ASSERT(current_class().raw() == ctor.Owner());
3038 params.AddReceiver(ReceiverType(TokenPos())); 3072 params.AddReceiver(ReceiverType(TokenPos()));
3039 // Add implicit parameter for construction phase. 3073 // Add implicit parameter for construction phase.
3040 params.AddFinalParameter( 3074 params.AddFinalParameter(
3041 TokenPos(), 3075 TokenPos(),
3042 &String::ZoneHandle(Symbols::PhaseParameter()), 3076 &String::ZoneHandle(Symbols::PhaseParameter()),
3043 &Type::ZoneHandle(Type::IntInterface())); 3077 &Type::ZoneHandle(Type::IntInterface()));
3044 3078
3045 AddFormalParamsToFunction(&params, ctor); 3079 AddFormalParamsToFunction(&params, ctor);
3046 // The body of the constructor cannot modify the type of the constructed 3080 // The body of the constructor cannot modify the type of the constructed
3047 // instance, which is passed in as the receiver. 3081 // instance, which is passed in as the receiver.
(...skipping 659 matching lines...) Expand 10 before | Expand all | Expand 10 after
3707 3741
3708 3742
3709 void Parser::ParseTopLevelAccessor(TopLevel* top_level) { 3743 void Parser::ParseTopLevelAccessor(TopLevel* top_level) {
3710 TRACE_PARSER("ParseTopLevelAccessor"); 3744 TRACE_PARSER("ParseTopLevelAccessor");
3711 const bool is_static = true; 3745 const bool is_static = true;
3712 bool is_external = false; 3746 bool is_external = false;
3713 bool is_patch = false; 3747 bool is_patch = false;
3714 AbstractType& result_type = AbstractType::Handle(); 3748 AbstractType& result_type = AbstractType::Handle();
3715 if (is_patch_source() && 3749 if (is_patch_source() &&
3716 (CurrentToken() == Token::kIDENT) && 3750 (CurrentToken() == Token::kIDENT) &&
3717 (CurrentLiteral()->Equals("patch"))) { 3751 CurrentLiteral()->Equals("patch")) {
3718 ConsumeToken(); 3752 ConsumeToken();
3719 is_patch = true; 3753 is_patch = true;
3720 } else if (CurrentToken() == Token::kEXTERNAL) { 3754 } else if (CurrentToken() == Token::kEXTERNAL) {
3721 ConsumeToken(); 3755 ConsumeToken();
3722 is_external = true; 3756 is_external = true;
3723 } 3757 }
3724 bool is_getter = (CurrentToken() == Token::kGET); 3758 bool is_getter = (CurrentToken() == Token::kGET);
3725 if (CurrentToken() == Token::kGET || 3759 if (CurrentToken() == Token::kGET ||
3726 CurrentToken() == Token::kSET) { 3760 CurrentToken() == Token::kSET) {
3727 ConsumeToken(); 3761 ConsumeToken();
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after
3999 ParseClassDefinition(pending_classes); 4033 ParseClassDefinition(pending_classes);
4000 } else if ((CurrentToken() == Token::kTYPEDEF) && 4034 } else if ((CurrentToken() == Token::kTYPEDEF) &&
4001 (LookaheadToken(1) != Token::kLPAREN)) { 4035 (LookaheadToken(1) != Token::kLPAREN)) {
4002 ParseFunctionTypeAlias(pending_classes); 4036 ParseFunctionTypeAlias(pending_classes);
4003 } else if (CurrentToken() == Token::kINTERFACE) { 4037 } else if (CurrentToken() == Token::kINTERFACE) {
4004 ParseInterfaceDefinition(pending_classes); 4038 ParseInterfaceDefinition(pending_classes);
4005 } else if ((CurrentToken() == Token::kABSTRACT) && 4039 } else if ((CurrentToken() == Token::kABSTRACT) &&
4006 (LookaheadToken(1) == Token::kCLASS)) { 4040 (LookaheadToken(1) == Token::kCLASS)) {
4007 ConsumeToken(); // Consume and ignore 'abstract'. 4041 ConsumeToken(); // Consume and ignore 'abstract'.
4008 ParseClassDefinition(pending_classes); 4042 ParseClassDefinition(pending_classes);
4043 } else if (is_patch_source() &&
4044 (CurrentToken() == Token::kIDENT) &&
4045 CurrentLiteral()->Equals("patch") &&
4046 (LookaheadToken(1) == Token::kCLASS)) {
4047 ParseClassDefinition(pending_classes);
4009 } else { 4048 } else {
4010 set_current_class(toplevel_class); 4049 set_current_class(toplevel_class);
4011 if (IsVariableDeclaration()) { 4050 if (IsVariableDeclaration()) {
4012 ParseTopLevelVariable(&top_level); 4051 ParseTopLevelVariable(&top_level);
4013 } else if (IsFunctionDeclaration()) { 4052 } else if (IsFunctionDeclaration()) {
4014 ParseTopLevelFunction(&top_level); 4053 ParseTopLevelFunction(&top_level);
4015 } else if (IsTopLevelAccessor()) { 4054 } else if (IsTopLevelAccessor()) {
4016 ParseTopLevelAccessor(&top_level); 4055 ParseTopLevelAccessor(&top_level);
4017 } else if (CurrentToken() == Token::kEOS) { 4056 } else if (CurrentToken() == Token::kEOS) {
4018 break; 4057 break;
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
4161 } 4200 }
4162 } 4201 }
4163 } 4202 }
4164 4203
4165 4204
4166 // Builds ReturnNode/NativeBodyNode for a native function. 4205 // Builds ReturnNode/NativeBodyNode for a native function.
4167 void Parser::ParseNativeFunctionBlock(const ParamList* params, 4206 void Parser::ParseNativeFunctionBlock(const ParamList* params,
4168 const Function& func) { 4207 const Function& func) {
4169 func.set_is_native(true); 4208 func.set_is_native(true);
4170 TRACE_PARSER("ParseNativeFunctionBlock"); 4209 TRACE_PARSER("ParseNativeFunctionBlock");
4171 const Class& cls = Class::Handle(func.owner()); 4210 const Class& cls = Class::Handle(func.Owner());
4172 const int num_parameters = params->parameters->length(); 4211 const int num_parameters = params->parameters->length();
4173 const bool is_instance_closure = func.IsImplicitInstanceClosureFunction(); 4212 const bool is_instance_closure = func.IsImplicitInstanceClosureFunction();
4174 int num_params_for_resolution = num_parameters; 4213 int num_params_for_resolution = num_parameters;
4175 4214
4176 // Parse the function name out. 4215 // Parse the function name out.
4177 const intptr_t native_pos = TokenPos(); 4216 const intptr_t native_pos = TokenPos();
4178 const String& native_name = ParseNativeDeclaration(); 4217 const String& native_name = ParseNativeDeclaration();
4179 4218
4180 if (is_instance_closure) { 4219 if (is_instance_closure) {
4181 num_params_for_resolution += 1; // account for 'this' when resolving. 4220 num_params_for_resolution += 1; // account for 'this' when resolving.
(...skipping 2903 matching lines...) Expand 10 before | Expand all | Expand 10 after
7085 selector = new LoadIndexedNode(bracket_pos, array, index); 7124 selector = new LoadIndexedNode(bracket_pos, array, index);
7086 } else if (CurrentToken() == Token::kLPAREN) { 7125 } else if (CurrentToken() == Token::kLPAREN) {
7087 if (left->IsPrimaryNode()) { 7126 if (left->IsPrimaryNode()) {
7088 PrimaryNode* primary = left->AsPrimaryNode(); 7127 PrimaryNode* primary = left->AsPrimaryNode();
7089 const intptr_t primary_pos = primary->token_pos(); 7128 const intptr_t primary_pos = primary->token_pos();
7090 if (primary->primary().IsFunction()) { 7129 if (primary->primary().IsFunction()) {
7091 Function& func = Function::CheckedHandle(primary->primary().raw()); 7130 Function& func = Function::CheckedHandle(primary->primary().raw());
7092 String& func_name = String::ZoneHandle(func.name()); 7131 String& func_name = String::ZoneHandle(func.name());
7093 if (func.is_static()) { 7132 if (func.is_static()) {
7094 // Parse static function call. 7133 // Parse static function call.
7095 Class& cls = Class::Handle(func.owner()); 7134 Class& cls = Class::Handle(func.Owner());
7096 selector = ParseStaticCall(cls, func_name, primary_pos); 7135 selector = ParseStaticCall(cls, func_name, primary_pos);
7097 } else { 7136 } else {
7098 // Dynamic function call on implicit "this" parameter. 7137 // Dynamic function call on implicit "this" parameter.
7099 if (current_function().is_static()) { 7138 if (current_function().is_static()) {
7100 ErrorMsg(primary_pos, 7139 ErrorMsg(primary_pos,
7101 "cannot access instance method '%s' " 7140 "cannot access instance method '%s' "
7102 "from static function", 7141 "from static function",
7103 func_name.ToCString()); 7142 func_name.ToCString());
7104 } 7143 }
7105 selector = ParseInstanceCall(LoadReceiver(primary_pos), func_name); 7144 selector = ParseInstanceCall(LoadReceiver(primary_pos), func_name);
(...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after
7641 } 7680 }
7642 } 7681 }
7643 if (!obj.IsNull()) { 7682 if (!obj.IsNull()) {
7644 ASSERT(obj.IsFunction()); 7683 ASSERT(obj.IsFunction());
7645 const Function& func = Function::Cast(obj); 7684 const Function& func = Function::Cast(obj);
7646 ASSERT(func.is_static()); 7685 ASSERT(func.is_static());
7647 ASSERT(AbstractType::Handle(func.result_type()).IsResolved()); 7686 ASSERT(AbstractType::Handle(func.result_type()).IsResolved());
7648 return new StaticGetterNode(qual_ident.ident_pos, 7687 return new StaticGetterNode(qual_ident.ident_pos,
7649 NULL, 7688 NULL,
7650 false, 7689 false,
7651 Class::ZoneHandle(func.owner()), 7690 Class::ZoneHandle(func.Owner()),
7652 *qual_ident.ident); 7691 *qual_ident.ident);
7653 } 7692 }
7654 if (qual_ident.lib_prefix != NULL) { 7693 if (qual_ident.lib_prefix != NULL) {
7655 return NULL; 7694 return NULL;
7656 } 7695 }
7657 // Lexically unresolved primary identifiers are referenced by their name. 7696 // Lexically unresolved primary identifiers are referenced by their name.
7658 return new PrimaryNode(qual_ident.ident_pos, *qual_ident.ident); 7697 return new PrimaryNode(qual_ident.ident_pos, *qual_ident.ident);
7659 } 7698 }
7660 7699
7661 7700
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
7837 } 7876 }
7838 } 7877 }
7839 return type.raw(); 7878 return type.raw();
7840 } 7879 }
7841 7880
7842 7881
7843 void Parser::CheckConstructorCallTypeArguments( 7882 void Parser::CheckConstructorCallTypeArguments(
7844 intptr_t pos, Function& constructor, 7883 intptr_t pos, Function& constructor,
7845 const AbstractTypeArguments& type_arguments) { 7884 const AbstractTypeArguments& type_arguments) {
7846 if (!type_arguments.IsNull()) { 7885 if (!type_arguments.IsNull()) {
7847 const Class& constructor_class = Class::Handle(constructor.owner()); 7886 const Class& constructor_class = Class::Handle(constructor.Owner());
7848 ASSERT(!constructor_class.IsNull()); 7887 ASSERT(!constructor_class.IsNull());
7849 ASSERT(constructor_class.is_finalized()); 7888 ASSERT(constructor_class.is_finalized());
7850 // Do not report the expected vs. actual number of type arguments, because 7889 // Do not report the expected vs. actual number of type arguments, because
7851 // the type argument vector is flattened and raw types are allowed. 7890 // the type argument vector is flattened and raw types are allowed.
7852 if (type_arguments.Length() != constructor_class.NumTypeArguments()) { 7891 if (type_arguments.Length() != constructor_class.NumTypeArguments()) {
7853 ErrorMsg(pos, "wrong number of type arguments passed to constructor"); 7892 ErrorMsg(pos, "wrong number of type arguments passed to constructor");
7854 } 7893 }
7855 } 7894 }
7856 } 7895 }
7857 7896
(...skipping 1196 matching lines...) Expand 10 before | Expand all | Expand 10 after
9054 void Parser::SkipQualIdent() { 9093 void Parser::SkipQualIdent() {
9055 ASSERT(IsIdentifier()); 9094 ASSERT(IsIdentifier());
9056 ConsumeToken(); 9095 ConsumeToken();
9057 if (CurrentToken() == Token::kPERIOD) { 9096 if (CurrentToken() == Token::kPERIOD) {
9058 ConsumeToken(); // Consume the kPERIOD token. 9097 ConsumeToken(); // Consume the kPERIOD token.
9059 ExpectIdentifier("identifier expected after '.'"); 9098 ExpectIdentifier("identifier expected after '.'");
9060 } 9099 }
9061 } 9100 }
9062 9101
9063 } // namespace dart 9102 } // namespace dart
OLDNEW
« runtime/vm/object.cc ('K') | « runtime/vm/object_test.cc ('k') | runtime/vm/raw_object.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698