| 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 | 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 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 108 stack_trace ^= Object::Clone(stack_trace, Heap::kOld); | 108 stack_trace ^= Object::Clone(stack_trace, Heap::kOld); |
| 109 } | 109 } |
| 110 return new ThrowNode(token_pos, | 110 return new ThrowNode(token_pos, |
| 111 new LiteralNode(token_pos, exception), | 111 new LiteralNode(token_pos, exception), |
| 112 new LiteralNode(token_pos, stack_trace)); | 112 new LiteralNode(token_pos, stack_trace)); |
| 113 } | 113 } |
| 114 | 114 |
| 115 | 115 |
| 116 LocalVariable* ParsedFunction::CreateExpressionTempVar(intptr_t token_pos) { | 116 LocalVariable* ParsedFunction::CreateExpressionTempVar(intptr_t token_pos) { |
| 117 return new LocalVariable(token_pos, | 117 return new LocalVariable(token_pos, |
| 118 String::ZoneHandle(Symbols::ExprTemp()), | 118 Symbols::ExprTemp(), |
| 119 Type::ZoneHandle(Type::DynamicType())); | 119 Type::ZoneHandle(Type::DynamicType())); |
| 120 } | 120 } |
| 121 | 121 |
| 122 | 122 |
| 123 void ParsedFunction::SetNodeSequence(SequenceNode* node_sequence) { | 123 void ParsedFunction::SetNodeSequence(SequenceNode* node_sequence) { |
| 124 ASSERT(node_sequence_ == NULL); | 124 ASSERT(node_sequence_ == NULL); |
| 125 ASSERT(node_sequence != NULL); | 125 ASSERT(node_sequence != NULL); |
| 126 node_sequence_ = node_sequence; | 126 node_sequence_ = node_sequence; |
| 127 } | 127 } |
| 128 | 128 |
| 129 | 129 |
| 130 LocalVariable* ParsedFunction::GetSavedArgumentsDescriptorVar() const { | 130 LocalVariable* ParsedFunction::GetSavedArgumentsDescriptorVar() const { |
| 131 const int num_parameters = function().NumParameters(); | 131 const int num_parameters = function().NumParameters(); |
| 132 LocalScope* scope = node_sequence()->scope(); | 132 LocalScope* scope = node_sequence()->scope(); |
| 133 if (scope->num_variables() > num_parameters) { | 133 if (scope->num_variables() > num_parameters) { |
| 134 LocalVariable* saved_args_desc_var = scope->VariableAt(num_parameters); | 134 LocalVariable* saved_args_desc_var = scope->VariableAt(num_parameters); |
| 135 ASSERT(saved_args_desc_var != NULL); | 135 ASSERT(saved_args_desc_var != NULL); |
| 136 // The scope of the formal parameters may also contain at this position | 136 // The scope of the formal parameters may also contain at this position |
| 137 // an alias for the saved arguments descriptor variable of the enclosing | 137 // an alias for the saved arguments descriptor variable of the enclosing |
| 138 // function (check its scope owner) or an internal variable such as the | 138 // function (check its scope owner) or an internal variable such as the |
| 139 // expression temp variable or the saved entry context variable (check its | 139 // expression temp variable or the saved entry context variable (check its |
| 140 // name). | 140 // name). |
| 141 if ((saved_args_desc_var->owner() == scope) && | 141 if ((saved_args_desc_var->owner() == scope) && |
| 142 saved_args_desc_var->name().StartsWith( | 142 saved_args_desc_var->name().StartsWith( |
| 143 String::Handle(Symbols::SavedArgDescVarPrefix()))) { | 143 Symbols::SavedArgDescVarPrefix())) { |
| 144 return saved_args_desc_var; | 144 return saved_args_desc_var; |
| 145 } | 145 } |
| 146 } | 146 } |
| 147 return NULL; | 147 return NULL; |
| 148 } | 148 } |
| 149 | 149 |
| 150 | 150 |
| 151 void ParsedFunction::AllocateVariables() { | 151 void ParsedFunction::AllocateVariables() { |
| 152 LocalScope* scope = node_sequence()->scope(); | 152 LocalScope* scope = node_sequence()->scope(); |
| 153 const intptr_t num_fixed_params = function().num_fixed_parameters(); | 153 const intptr_t num_fixed_params = function().num_fixed_parameters(); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 183 scope->AllocateVariables(first_parameter_index_, | 183 scope->AllocateVariables(first_parameter_index_, |
| 184 num_params, | 184 num_params, |
| 185 first_stack_local_index_, | 185 first_stack_local_index_, |
| 186 scope, | 186 scope, |
| 187 &context_owner); | 187 &context_owner); |
| 188 | 188 |
| 189 // If this function is not a closure function and if it contains captured | 189 // If this function is not a closure function and if it contains captured |
| 190 // variables, the context needs to be saved on entry and restored on exit. | 190 // variables, the context needs to be saved on entry and restored on exit. |
| 191 // Add and allocate a local variable to this purpose. | 191 // Add and allocate a local variable to this purpose. |
| 192 if ((context_owner != NULL) && !function().IsClosureFunction()) { | 192 if ((context_owner != NULL) && !function().IsClosureFunction()) { |
| 193 const String& context_var_name = | |
| 194 String::ZoneHandle(Symbols::SavedEntryContextVar()); | |
| 195 LocalVariable* context_var = | 193 LocalVariable* context_var = |
| 196 new LocalVariable(function().token_pos(), | 194 new LocalVariable(function().token_pos(), |
| 197 context_var_name, | 195 Symbols::SavedEntryContextVar(), |
| 198 Type::ZoneHandle(Type::DynamicType())); | 196 Type::ZoneHandle(Type::DynamicType())); |
| 199 context_var->set_index(next_free_frame_index--); | 197 context_var->set_index(next_free_frame_index--); |
| 200 scope->AddVariable(context_var); | 198 scope->AddVariable(context_var); |
| 201 set_saved_context_var(context_var); | 199 set_saved_context_var(context_var); |
| 202 } | 200 } |
| 203 | 201 |
| 204 // Frame indices are relative to the frame pointer and are decreasing. | 202 // Frame indices are relative to the frame pointer and are decreasing. |
| 205 ASSERT(next_free_frame_index <= first_stack_local_index_); | 203 ASSERT(next_free_frame_index <= first_stack_local_index_); |
| 206 num_stack_locals_ = first_stack_local_index_ - next_free_frame_index; | 204 num_stack_locals_ = first_stack_local_index_ - next_free_frame_index; |
| 207 } | 205 } |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 442 param.name_pos = name_pos; | 440 param.name_pos = name_pos; |
| 443 param.name = name; | 441 param.name = name; |
| 444 param.is_final = true; | 442 param.is_final = true; |
| 445 param.type = type; | 443 param.type = type; |
| 446 this->parameters->Add(param); | 444 this->parameters->Add(param); |
| 447 } | 445 } |
| 448 | 446 |
| 449 void AddReceiver(const Type* receiver_type) { | 447 void AddReceiver(const Type* receiver_type) { |
| 450 ASSERT(this->parameters->is_empty()); | 448 ASSERT(this->parameters->is_empty()); |
| 451 AddFinalParameter(receiver_type->token_pos(), | 449 AddFinalParameter(receiver_type->token_pos(), |
| 452 &Symbols::ThisHandle(), | 450 &Symbols::This(), |
| 453 receiver_type); | 451 receiver_type); |
| 454 } | 452 } |
| 455 | 453 |
| 456 void SetImplicitlyFinal() { | 454 void SetImplicitlyFinal() { |
| 457 implicitly_final = true; | 455 implicitly_final = true; |
| 458 } | 456 } |
| 459 | 457 |
| 460 int num_fixed_parameters; | 458 int num_fixed_parameters; |
| 461 int num_optional_parameters; | 459 int num_optional_parameters; |
| 462 bool has_optional_positional_parameters; | 460 bool has_optional_positional_parameters; |
| (...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 950 const String& field_name = *CurrentLiteral(); | 948 const String& field_name = *CurrentLiteral(); |
| 951 const Class& field_class = Class::ZoneHandle(func.Owner()); | 949 const Class& field_class = Class::ZoneHandle(func.Owner()); |
| 952 const Field& field = | 950 const Field& field = |
| 953 Field::ZoneHandle(field_class.LookupInstanceField(field_name)); | 951 Field::ZoneHandle(field_class.LookupInstanceField(field_name)); |
| 954 const AbstractType& field_type = AbstractType::ZoneHandle(field.type()); | 952 const AbstractType& field_type = AbstractType::ZoneHandle(field.type()); |
| 955 | 953 |
| 956 ParamList params; | 954 ParamList params; |
| 957 ASSERT(current_class().raw() == func.Owner()); | 955 ASSERT(current_class().raw() == func.Owner()); |
| 958 params.AddReceiver(ReceiverType(ident_pos)); | 956 params.AddReceiver(ReceiverType(ident_pos)); |
| 959 params.AddFinalParameter(ident_pos, | 957 params.AddFinalParameter(ident_pos, |
| 960 &String::ZoneHandle(Symbols::Value()), | 958 &Symbols::Value(), |
| 961 &field_type); | 959 &field_type); |
| 962 ASSERT(func.num_fixed_parameters() == 2); // receiver, value. | 960 ASSERT(func.num_fixed_parameters() == 2); // receiver, value. |
| 963 ASSERT(!func.HasOptionalParameters()); | 961 ASSERT(!func.HasOptionalParameters()); |
| 964 ASSERT(AbstractType::Handle(func.result_type()).IsVoidType()); | 962 ASSERT(AbstractType::Handle(func.result_type()).IsVoidType()); |
| 965 | 963 |
| 966 // Build local scope for function and populate with the formal parameters. | 964 // Build local scope for function and populate with the formal parameters. |
| 967 OpenFunctionBlock(func); | 965 OpenFunctionBlock(func); |
| 968 AddFormalParamsToScope(¶ms, current_block_->scope); | 966 AddFormalParamsToScope(¶ms, current_block_->scope); |
| 969 | 967 |
| 970 LoadLocalNode* receiver = | 968 LoadLocalNode* receiver = |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1115 // The parsed parameter type is actually the function result type. | 1113 // The parsed parameter type is actually the function result type. |
| 1116 const AbstractType& result_type = | 1114 const AbstractType& result_type = |
| 1117 AbstractType::Handle(parameter.type->raw()); | 1115 AbstractType::Handle(parameter.type->raw()); |
| 1118 | 1116 |
| 1119 // Finish parsing the function type parameter. | 1117 // Finish parsing the function type parameter. |
| 1120 ParamList func_params; | 1118 ParamList func_params; |
| 1121 | 1119 |
| 1122 // Add implicit closure object parameter. | 1120 // Add implicit closure object parameter. |
| 1123 func_params.AddFinalParameter( | 1121 func_params.AddFinalParameter( |
| 1124 TokenPos(), | 1122 TokenPos(), |
| 1125 &String::ZoneHandle(Symbols::ClosureParameter()), | 1123 &Symbols::ClosureParameter(), |
| 1126 &Type::ZoneHandle(Type::DynamicType())); | 1124 &Type::ZoneHandle(Type::DynamicType())); |
| 1127 | 1125 |
| 1128 const bool no_explicit_default_values = false; | 1126 const bool no_explicit_default_values = false; |
| 1129 ParseFormalParameterList(no_explicit_default_values, &func_params); | 1127 ParseFormalParameterList(no_explicit_default_values, &func_params); |
| 1130 | 1128 |
| 1131 // The field 'is_static' has no meaning for signature functions. | 1129 // The field 'is_static' has no meaning for signature functions. |
| 1132 const Function& signature_function = Function::Handle( | 1130 const Function& signature_function = Function::Handle( |
| 1133 Function::New(*parameter.name, | 1131 Function::New(*parameter.name, |
| 1134 RawFunction::kSignatureFunction, | 1132 RawFunction::kSignatureFunction, |
| 1135 /* is_static = */ false, | 1133 /* is_static = */ false, |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1298 arguments->names(), | 1296 arguments->names(), |
| 1299 NULL)) { | 1297 NULL)) { |
| 1300 super_func = Function::null(); | 1298 super_func = Function::null(); |
| 1301 } else if (super_func.IsNull() && resolve_getter) { | 1299 } else if (super_func.IsNull() && resolve_getter) { |
| 1302 const String& getter_name = String::ZoneHandle(Field::GetterName(name)); | 1300 const String& getter_name = String::ZoneHandle(Field::GetterName(name)); |
| 1303 super_func = Resolver::ResolveDynamicAnyArgs(super_class, getter_name); | 1301 super_func = Resolver::ResolveDynamicAnyArgs(super_class, getter_name); |
| 1304 ASSERT(super_func.IsNull() || | 1302 ASSERT(super_func.IsNull() || |
| 1305 (super_func.kind() != RawFunction::kConstImplicitGetter)); | 1303 (super_func.kind() != RawFunction::kConstImplicitGetter)); |
| 1306 } | 1304 } |
| 1307 if (super_func.IsNull()) { | 1305 if (super_func.IsNull()) { |
| 1308 const String& no_such_method_name = String::Handle(Symbols::NoSuchMethod()); | |
| 1309 super_func = | 1306 super_func = |
| 1310 Resolver::ResolveDynamicAnyArgs(super_class, no_such_method_name); | 1307 Resolver::ResolveDynamicAnyArgs(super_class, Symbols::NoSuchMethod()); |
| 1311 ASSERT(!super_func.IsNull()); | 1308 ASSERT(!super_func.IsNull()); |
| 1312 *is_no_such_method = true; | 1309 *is_no_such_method = true; |
| 1313 } else { | 1310 } else { |
| 1314 *is_no_such_method = false; | 1311 *is_no_such_method = false; |
| 1315 } | 1312 } |
| 1316 return super_func.raw(); | 1313 return super_func.raw(); |
| 1317 } | 1314 } |
| 1318 | 1315 |
| 1319 | 1316 |
| 1320 // Lookup class in the core lib which also contains various VM | 1317 // Lookup class in the core lib which also contains various VM |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1348 arguments->Add(new LiteralNode(args_pos, args_descriptor)); | 1345 arguments->Add(new LiteralNode(args_pos, args_descriptor)); |
| 1349 // The third argument is an array containing the original function arguments, | 1346 // The third argument is an array containing the original function arguments, |
| 1350 // including the receiver. | 1347 // including the receiver. |
| 1351 ArrayNode* args_array = new ArrayNode( | 1348 ArrayNode* args_array = new ArrayNode( |
| 1352 args_pos, Type::ZoneHandle(Type::ArrayType())); | 1349 args_pos, Type::ZoneHandle(Type::ArrayType())); |
| 1353 for (intptr_t i = 0; i < function_args.length(); i++) { | 1350 for (intptr_t i = 0; i < function_args.length(); i++) { |
| 1354 args_array->AddElement(function_args.NodeAt(i)); | 1351 args_array->AddElement(function_args.NodeAt(i)); |
| 1355 } | 1352 } |
| 1356 arguments->Add(args_array); | 1353 arguments->Add(args_array); |
| 1357 // Lookup the static InvocationMirror._allocateInvocationMirror method. | 1354 // Lookup the static InvocationMirror._allocateInvocationMirror method. |
| 1358 const Class& mirror_class = Class::Handle( | 1355 const Class& mirror_class = |
| 1359 LookupCoreClass(String::Handle(Symbols::InvocationMirror()))); | 1356 Class::Handle(LookupCoreClass(Symbols::InvocationMirror())); |
| 1360 ASSERT(!mirror_class.IsNull()); | 1357 ASSERT(!mirror_class.IsNull()); |
| 1361 const String& allocation_function_name = | |
| 1362 String::Handle(Symbols::AllocateInvocationMirror()); | |
| 1363 const Function& allocation_function = Function::ZoneHandle( | 1358 const Function& allocation_function = Function::ZoneHandle( |
| 1364 mirror_class.LookupStaticFunction(allocation_function_name)); | 1359 mirror_class.LookupStaticFunction(Symbols::AllocateInvocationMirror())); |
| 1365 ASSERT(!allocation_function.IsNull()); | 1360 ASSERT(!allocation_function.IsNull()); |
| 1366 return new StaticCallNode(call_pos, allocation_function, arguments); | 1361 return new StaticCallNode(call_pos, allocation_function, arguments); |
| 1367 } | 1362 } |
| 1368 | 1363 |
| 1369 | 1364 |
| 1370 ArgumentListNode* Parser::BuildNoSuchMethodArguments( | 1365 ArgumentListNode* Parser::BuildNoSuchMethodArguments( |
| 1371 intptr_t call_pos, | 1366 intptr_t call_pos, |
| 1372 const String& function_name, | 1367 const String& function_name, |
| 1373 const ArgumentListNode& function_args) { | 1368 const ArgumentListNode& function_args) { |
| 1374 ASSERT(function_args.length() >= 1); // The receiver is the first argument. | 1369 ASSERT(function_args.length() >= 1); // The receiver is the first argument. |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1599 const Class& super_class = Class::Handle(cls.SuperClass()); | 1594 const Class& super_class = Class::Handle(cls.SuperClass()); |
| 1600 // Omit the implicit super() if there is no super class (i.e. | 1595 // Omit the implicit super() if there is no super class (i.e. |
| 1601 // we're not compiling class Object), or if the super class is an | 1596 // we're not compiling class Object), or if the super class is an |
| 1602 // artificially generated "wrapper class" that has no constructor. | 1597 // artificially generated "wrapper class" that has no constructor. |
| 1603 if (super_class.IsNull() || | 1598 if (super_class.IsNull() || |
| 1604 (super_class.num_native_fields() > 0 && | 1599 (super_class.num_native_fields() > 0 && |
| 1605 Class::Handle(super_class.SuperClass()).IsObjectClass())) { | 1600 Class::Handle(super_class.SuperClass()).IsObjectClass())) { |
| 1606 return; | 1601 return; |
| 1607 } | 1602 } |
| 1608 String& ctor_name = String::Handle(super_class.Name()); | 1603 String& ctor_name = String::Handle(super_class.Name()); |
| 1609 ctor_name = String::Concat(ctor_name, Symbols::DotHandle()); | 1604 ctor_name = String::Concat(ctor_name, Symbols::Dot()); |
| 1610 ArgumentListNode* arguments = new ArgumentListNode(supercall_pos); | 1605 ArgumentListNode* arguments = new ArgumentListNode(supercall_pos); |
| 1611 // Implicit 'this' parameter is the first argument. | 1606 // Implicit 'this' parameter is the first argument. |
| 1612 AstNode* implicit_argument = new LoadLocalNode(supercall_pos, receiver); | 1607 AstNode* implicit_argument = new LoadLocalNode(supercall_pos, receiver); |
| 1613 arguments->Add(implicit_argument); | 1608 arguments->Add(implicit_argument); |
| 1614 // Implicit construction phase parameter is second argument. | 1609 // Implicit construction phase parameter is second argument. |
| 1615 AstNode* phase_parameter = | 1610 AstNode* phase_parameter = |
| 1616 new LiteralNode(supercall_pos, | 1611 new LiteralNode(supercall_pos, |
| 1617 Smi::ZoneHandle(Smi::New(Function::kCtorPhaseAll))); | 1612 Smi::ZoneHandle(Smi::New(Function::kCtorPhaseAll))); |
| 1618 arguments->Add(phase_parameter); | 1613 arguments->Add(phase_parameter); |
| 1619 const Function& super_ctor = Function::ZoneHandle( | 1614 const Function& super_ctor = Function::ZoneHandle( |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1639 | 1634 |
| 1640 AstNode* Parser::ParseSuperInitializer(const Class& cls, | 1635 AstNode* Parser::ParseSuperInitializer(const Class& cls, |
| 1641 LocalVariable* receiver) { | 1636 LocalVariable* receiver) { |
| 1642 TRACE_PARSER("ParseSuperInitializer"); | 1637 TRACE_PARSER("ParseSuperInitializer"); |
| 1643 ASSERT(CurrentToken() == Token::kSUPER); | 1638 ASSERT(CurrentToken() == Token::kSUPER); |
| 1644 const intptr_t supercall_pos = TokenPos(); | 1639 const intptr_t supercall_pos = TokenPos(); |
| 1645 ConsumeToken(); | 1640 ConsumeToken(); |
| 1646 const Class& super_class = Class::Handle(cls.SuperClass()); | 1641 const Class& super_class = Class::Handle(cls.SuperClass()); |
| 1647 ASSERT(!super_class.IsNull()); | 1642 ASSERT(!super_class.IsNull()); |
| 1648 String& ctor_name = String::Handle(super_class.Name()); | 1643 String& ctor_name = String::Handle(super_class.Name()); |
| 1649 ctor_name = String::Concat(ctor_name, Symbols::DotHandle()); | 1644 ctor_name = String::Concat(ctor_name, Symbols::Dot()); |
| 1650 if (CurrentToken() == Token::kPERIOD) { | 1645 if (CurrentToken() == Token::kPERIOD) { |
| 1651 ConsumeToken(); | 1646 ConsumeToken(); |
| 1652 ctor_name = String::Concat(ctor_name, | 1647 ctor_name = String::Concat(ctor_name, |
| 1653 *ExpectIdentifier("constructor name expected")); | 1648 *ExpectIdentifier("constructor name expected")); |
| 1654 } | 1649 } |
| 1655 if (CurrentToken() != Token::kLPAREN) { | 1650 if (CurrentToken() != Token::kLPAREN) { |
| 1656 ErrorMsg("parameter list expected"); | 1651 ErrorMsg("parameter list expected"); |
| 1657 } | 1652 } |
| 1658 | 1653 |
| 1659 ArgumentListNode* arguments = new ArgumentListNode(supercall_pos); | 1654 ArgumentListNode* arguments = new ArgumentListNode(supercall_pos); |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1858 | 1853 |
| 1859 | 1854 |
| 1860 void Parser::ParseConstructorRedirection(const Class& cls, | 1855 void Parser::ParseConstructorRedirection(const Class& cls, |
| 1861 LocalVariable* receiver) { | 1856 LocalVariable* receiver) { |
| 1862 TRACE_PARSER("ParseConstructorRedirection"); | 1857 TRACE_PARSER("ParseConstructorRedirection"); |
| 1863 ASSERT(CurrentToken() == Token::kTHIS); | 1858 ASSERT(CurrentToken() == Token::kTHIS); |
| 1864 const intptr_t call_pos = TokenPos(); | 1859 const intptr_t call_pos = TokenPos(); |
| 1865 ConsumeToken(); | 1860 ConsumeToken(); |
| 1866 String& ctor_name = String::Handle(cls.Name()); | 1861 String& ctor_name = String::Handle(cls.Name()); |
| 1867 | 1862 |
| 1868 ctor_name = String::Concat(ctor_name, Symbols::DotHandle()); | 1863 ctor_name = String::Concat(ctor_name, Symbols::Dot()); |
| 1869 if (CurrentToken() == Token::kPERIOD) { | 1864 if (CurrentToken() == Token::kPERIOD) { |
| 1870 ConsumeToken(); | 1865 ConsumeToken(); |
| 1871 ctor_name = String::Concat(ctor_name, | 1866 ctor_name = String::Concat(ctor_name, |
| 1872 *ExpectIdentifier("constructor name expected")); | 1867 *ExpectIdentifier("constructor name expected")); |
| 1873 } | 1868 } |
| 1874 if (CurrentToken() != Token::kLPAREN) { | 1869 if (CurrentToken() != Token::kLPAREN) { |
| 1875 ErrorMsg("parameter list expected"); | 1870 ErrorMsg("parameter list expected"); |
| 1876 } | 1871 } |
| 1877 | 1872 |
| 1878 ArgumentListNode* arguments = new ArgumentListNode(call_pos); | 1873 ArgumentListNode* arguments = new ArgumentListNode(call_pos); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1907 } | 1902 } |
| 1908 | 1903 |
| 1909 | 1904 |
| 1910 SequenceNode* Parser::MakeImplicitConstructor(const Function& func) { | 1905 SequenceNode* Parser::MakeImplicitConstructor(const Function& func) { |
| 1911 ASSERT(func.IsConstructor()); | 1906 ASSERT(func.IsConstructor()); |
| 1912 const intptr_t ctor_pos = TokenPos(); | 1907 const intptr_t ctor_pos = TokenPos(); |
| 1913 OpenFunctionBlock(func); | 1908 OpenFunctionBlock(func); |
| 1914 const Class& cls = Class::Handle(func.Owner()); | 1909 const Class& cls = Class::Handle(func.Owner()); |
| 1915 LocalVariable* receiver = new LocalVariable( | 1910 LocalVariable* receiver = new LocalVariable( |
| 1916 ctor_pos, | 1911 ctor_pos, |
| 1917 Symbols::ThisHandle(), | 1912 Symbols::This(), |
| 1918 Type::ZoneHandle(Type::DynamicType())); | 1913 Type::ZoneHandle(Type::DynamicType())); |
| 1919 current_block_->scope->AddVariable(receiver); | 1914 current_block_->scope->AddVariable(receiver); |
| 1920 | 1915 |
| 1921 LocalVariable* phase_parameter = new LocalVariable( | 1916 LocalVariable* phase_parameter = new LocalVariable( |
| 1922 ctor_pos, | 1917 ctor_pos, |
| 1923 String::ZoneHandle(Symbols::PhaseParameter()), | 1918 Symbols::PhaseParameter(), |
| 1924 Type::ZoneHandle(Type::SmiType())); | 1919 Type::ZoneHandle(Type::SmiType())); |
| 1925 current_block_->scope->AddVariable(phase_parameter); | 1920 current_block_->scope->AddVariable(phase_parameter); |
| 1926 | 1921 |
| 1927 // Parse expressions of instance fields that have an explicit | 1922 // Parse expressions of instance fields that have an explicit |
| 1928 // initializer expression. | 1923 // initializer expression. |
| 1929 // The receiver must not be visible to field initializer expressions. | 1924 // The receiver must not be visible to field initializer expressions. |
| 1930 receiver->set_invisible(true); | 1925 receiver->set_invisible(true); |
| 1931 GrowableArray<Field*> initialized_fields; | 1926 GrowableArray<Field*> initialized_fields; |
| 1932 ParseInitializedInstanceFields(cls, receiver, &initialized_fields); | 1927 ParseInitializedInstanceFields(cls, receiver, &initialized_fields); |
| 1933 receiver->set_invisible(false); | 1928 receiver->set_invisible(false); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1981 ASSERT(CurrentToken() == Token::kLPAREN); | 1976 ASSERT(CurrentToken() == Token::kLPAREN); |
| 1982 | 1977 |
| 1983 // Add implicit receiver parameter which is passed the allocated | 1978 // Add implicit receiver parameter which is passed the allocated |
| 1984 // but uninitialized instance to construct. | 1979 // but uninitialized instance to construct. |
| 1985 ASSERT(current_class().raw() == func.Owner()); | 1980 ASSERT(current_class().raw() == func.Owner()); |
| 1986 params.AddReceiver(ReceiverType(TokenPos())); | 1981 params.AddReceiver(ReceiverType(TokenPos())); |
| 1987 | 1982 |
| 1988 // Add implicit parameter for construction phase. | 1983 // Add implicit parameter for construction phase. |
| 1989 params.AddFinalParameter( | 1984 params.AddFinalParameter( |
| 1990 TokenPos(), | 1985 TokenPos(), |
| 1991 &String::ZoneHandle(Symbols::PhaseParameter()), | 1986 &Symbols::PhaseParameter(), |
| 1992 &Type::ZoneHandle(Type::SmiType())); | 1987 &Type::ZoneHandle(Type::SmiType())); |
| 1993 | 1988 |
| 1994 if (func.is_const()) { | 1989 if (func.is_const()) { |
| 1995 params.SetImplicitlyFinal(); | 1990 params.SetImplicitlyFinal(); |
| 1996 } | 1991 } |
| 1997 ParseFormalParameterList(allow_explicit_default_values, ¶ms); | 1992 ParseFormalParameterList(allow_explicit_default_values, ¶ms); |
| 1998 | 1993 |
| 1999 SetupDefaultsForOptionalParams(¶ms, default_parameter_values); | 1994 SetupDefaultsForOptionalParams(¶ms, default_parameter_values); |
| 2000 ASSERT(AbstractType::Handle(func.result_type()).IsResolved()); | 1995 ASSERT(AbstractType::Handle(func.result_type()).IsResolved()); |
| 2001 ASSERT(func.NumParameters() == params.parameters->length()); | 1996 ASSERT(func.NumParameters() == params.parameters->length()); |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2229 OpenFunctionBlock(func); // Build local scope for function. | 2224 OpenFunctionBlock(func); // Build local scope for function. |
| 2230 | 2225 |
| 2231 ParamList params; | 2226 ParamList params; |
| 2232 // An instance closure function may capture and access the receiver, but via | 2227 // An instance closure function may capture and access the receiver, but via |
| 2233 // the context and not via the first formal parameter. | 2228 // the context and not via the first formal parameter. |
| 2234 if (func.IsClosureFunction()) { | 2229 if (func.IsClosureFunction()) { |
| 2235 // The first parameter of a closure function is the closure object. | 2230 // The first parameter of a closure function is the closure object. |
| 2236 ASSERT(!func.is_const()); // Closure functions cannot be const. | 2231 ASSERT(!func.is_const()); // Closure functions cannot be const. |
| 2237 params.AddFinalParameter( | 2232 params.AddFinalParameter( |
| 2238 TokenPos(), | 2233 TokenPos(), |
| 2239 &String::ZoneHandle(Symbols::ClosureParameter()), | 2234 &Symbols::ClosureParameter(), |
| 2240 &Type::ZoneHandle(Type::DynamicType())); | 2235 &Type::ZoneHandle(Type::DynamicType())); |
| 2241 } else if (!func.is_static()) { | 2236 } else if (!func.is_static()) { |
| 2242 // Static functions do not have a receiver. | 2237 // Static functions do not have a receiver. |
| 2243 ASSERT(current_class().raw() == func.Owner()); | 2238 ASSERT(current_class().raw() == func.Owner()); |
| 2244 params.AddReceiver(ReceiverType(TokenPos())); | 2239 params.AddReceiver(ReceiverType(TokenPos())); |
| 2245 } else if (func.IsFactory()) { | 2240 } else if (func.IsFactory()) { |
| 2246 // The first parameter of a factory is the AbstractTypeArguments vector of | 2241 // The first parameter of a factory is the AbstractTypeArguments vector of |
| 2247 // the type of the instance to be allocated. | 2242 // the type of the instance to be allocated. |
| 2248 params.AddFinalParameter( | 2243 params.AddFinalParameter( |
| 2249 TokenPos(), | 2244 TokenPos(), |
| 2250 &String::ZoneHandle(Symbols::TypeArgumentsParameter()), | 2245 &Symbols::TypeArgumentsParameter(), |
| 2251 &Type::ZoneHandle(Type::DynamicType())); | 2246 &Type::ZoneHandle(Type::DynamicType())); |
| 2252 } | 2247 } |
| 2253 ASSERT((CurrentToken() == Token::kLPAREN) || func.IsGetterFunction()); | 2248 ASSERT((CurrentToken() == Token::kLPAREN) || func.IsGetterFunction()); |
| 2254 const bool allow_explicit_default_values = true; | 2249 const bool allow_explicit_default_values = true; |
| 2255 if (!func.IsGetterFunction()) { | 2250 if (!func.IsGetterFunction()) { |
| 2256 ParseFormalParameterList(allow_explicit_default_values, ¶ms); | 2251 ParseFormalParameterList(allow_explicit_default_values, ¶ms); |
| 2257 } else { | 2252 } else { |
| 2258 // TODO(hausner): Remove this once we no longer support the old | 2253 // TODO(hausner): Remove this once we no longer support the old |
| 2259 // getter syntax with explicit empty parameter list. | 2254 // getter syntax with explicit empty parameter list. |
| 2260 if (CurrentToken() == Token::kLPAREN) { | 2255 if (CurrentToken() == Token::kLPAREN) { |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2449 const intptr_t formal_param_pos = TokenPos(); | 2444 const intptr_t formal_param_pos = TokenPos(); |
| 2450 method->params.Clear(); | 2445 method->params.Clear(); |
| 2451 // Static functions do not have a receiver. | 2446 // Static functions do not have a receiver. |
| 2452 // The first parameter of a factory is the AbstractTypeArguments vector of | 2447 // The first parameter of a factory is the AbstractTypeArguments vector of |
| 2453 // the type of the instance to be allocated. | 2448 // the type of the instance to be allocated. |
| 2454 if (!method->has_static || method->IsConstructor()) { | 2449 if (!method->has_static || method->IsConstructor()) { |
| 2455 method->params.AddReceiver(ReceiverType(formal_param_pos)); | 2450 method->params.AddReceiver(ReceiverType(formal_param_pos)); |
| 2456 } else if (method->IsFactory()) { | 2451 } else if (method->IsFactory()) { |
| 2457 method->params.AddFinalParameter( | 2452 method->params.AddFinalParameter( |
| 2458 formal_param_pos, | 2453 formal_param_pos, |
| 2459 &String::ZoneHandle(Symbols::TypeArgumentsParameter()), | 2454 &Symbols::TypeArgumentsParameter(), |
| 2460 &Type::ZoneHandle(Type::DynamicType())); | 2455 &Type::ZoneHandle(Type::DynamicType())); |
| 2461 } | 2456 } |
| 2462 // Constructors have an implicit parameter for the construction phase. | 2457 // Constructors have an implicit parameter for the construction phase. |
| 2463 if (method->IsConstructor()) { | 2458 if (method->IsConstructor()) { |
| 2464 method->params.AddFinalParameter( | 2459 method->params.AddFinalParameter( |
| 2465 TokenPos(), | 2460 TokenPos(), |
| 2466 &String::ZoneHandle(Symbols::PhaseParameter()), | 2461 &Symbols::PhaseParameter(), |
| 2467 &Type::ZoneHandle(Type::SmiType())); | 2462 &Type::ZoneHandle(Type::SmiType())); |
| 2468 } | 2463 } |
| 2469 if (are_implicitly_final) { | 2464 if (are_implicitly_final) { |
| 2470 method->params.SetImplicitlyFinal(); | 2465 method->params.SetImplicitlyFinal(); |
| 2471 } | 2466 } |
| 2472 if (!method->IsGetter()) { | 2467 if (!method->IsGetter()) { |
| 2473 ParseFormalParameterList(allow_explicit_default_values, &method->params); | 2468 ParseFormalParameterList(allow_explicit_default_values, &method->params); |
| 2474 } | 2469 } |
| 2475 | 2470 |
| 2476 // Now that we know the parameter list, we can distinguish between the | 2471 // Now that we know the parameter list, we can distinguish between the |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2550 // Redirected constructor: either this(...) or this.xxx(...). | 2545 // Redirected constructor: either this(...) or this.xxx(...). |
| 2551 if (method->params.has_field_initializer) { | 2546 if (method->params.has_field_initializer) { |
| 2552 // Constructors that redirect to another constructor must not | 2547 // Constructors that redirect to another constructor must not |
| 2553 // initialize any fields using field initializer parameters. | 2548 // initialize any fields using field initializer parameters. |
| 2554 ErrorMsg(formal_param_pos, "Redirecting constructor " | 2549 ErrorMsg(formal_param_pos, "Redirecting constructor " |
| 2555 "may not use field initializer parameters"); | 2550 "may not use field initializer parameters"); |
| 2556 } | 2551 } |
| 2557 ConsumeToken(); // Colon. | 2552 ConsumeToken(); // Colon. |
| 2558 ExpectToken(Token::kTHIS); | 2553 ExpectToken(Token::kTHIS); |
| 2559 String& redir_name = String::ZoneHandle( | 2554 String& redir_name = String::ZoneHandle( |
| 2560 String::Concat(members->class_name(), Symbols::DotHandle())); | 2555 String::Concat(members->class_name(), Symbols::Dot())); |
| 2561 if (CurrentToken() == Token::kPERIOD) { | 2556 if (CurrentToken() == Token::kPERIOD) { |
| 2562 ConsumeToken(); | 2557 ConsumeToken(); |
| 2563 redir_name = String::Concat(redir_name, | 2558 redir_name = String::Concat(redir_name, |
| 2564 *ExpectIdentifier("constructor name expected")); | 2559 *ExpectIdentifier("constructor name expected")); |
| 2565 } | 2560 } |
| 2566 method->redirect_name = &redir_name; | 2561 method->redirect_name = &redir_name; |
| 2567 if (CurrentToken() != Token::kLPAREN) { | 2562 if (CurrentToken() != Token::kLPAREN) { |
| 2568 ErrorMsg("'(' expected"); | 2563 ErrorMsg("'(' expected"); |
| 2569 } | 2564 } |
| 2570 SkipToMatchingParenthesis(); | 2565 SkipToMatchingParenthesis(); |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2808 field->has_static, | 2803 field->has_static, |
| 2809 field->has_final, | 2804 field->has_final, |
| 2810 /* is_abstract = */ false, | 2805 /* is_abstract = */ false, |
| 2811 /* is_external = */ false, | 2806 /* is_external = */ false, |
| 2812 current_class(), | 2807 current_class(), |
| 2813 field->name_pos); | 2808 field->name_pos); |
| 2814 ParamList params; | 2809 ParamList params; |
| 2815 ASSERT(current_class().raw() == setter.Owner()); | 2810 ASSERT(current_class().raw() == setter.Owner()); |
| 2816 params.AddReceiver(ReceiverType(TokenPos())); | 2811 params.AddReceiver(ReceiverType(TokenPos())); |
| 2817 params.AddFinalParameter(TokenPos(), | 2812 params.AddFinalParameter(TokenPos(), |
| 2818 &String::ZoneHandle(Symbols::Value()), | 2813 &Symbols::Value(), |
| 2819 field->type); | 2814 field->type); |
| 2820 setter.set_result_type(Type::Handle(Type::VoidType())); | 2815 setter.set_result_type(Type::Handle(Type::VoidType())); |
| 2821 AddFormalParamsToFunction(¶ms, setter); | 2816 AddFormalParamsToFunction(¶ms, setter); |
| 2822 members->AddFunction(setter); | 2817 members->AddFunction(setter); |
| 2823 } | 2818 } |
| 2824 } | 2819 } |
| 2825 | 2820 |
| 2826 if (CurrentToken() != Token::kCOMMA) { | 2821 if (CurrentToken() != Token::kCOMMA) { |
| 2827 break; | 2822 break; |
| 2828 } | 2823 } |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2956 member.name_pos)); | 2951 member.name_pos)); |
| 2957 // The type arguments of the result type are set during finalization. | 2952 // The type arguments of the result type are set during finalization. |
| 2958 member.type = &Type::ZoneHandle(Type::New(result_type_class, | 2953 member.type = &Type::ZoneHandle(Type::New(result_type_class, |
| 2959 TypeArguments::Handle(), | 2954 TypeArguments::Handle(), |
| 2960 member.name_pos)); | 2955 member.name_pos)); |
| 2961 } else if (member.has_static) { | 2956 } else if (member.has_static) { |
| 2962 ErrorMsg(member.name_pos, "constructor cannot be static"); | 2957 ErrorMsg(member.name_pos, "constructor cannot be static"); |
| 2963 } | 2958 } |
| 2964 // We must be dealing with a constructor or named constructor. | 2959 // We must be dealing with a constructor or named constructor. |
| 2965 member.kind = RawFunction::kConstructor; | 2960 member.kind = RawFunction::kConstructor; |
| 2966 *member.name = String::Concat(*member.name, Symbols::DotHandle()); | 2961 *member.name = String::Concat(*member.name, Symbols::Dot()); |
| 2967 if (CurrentToken() == Token::kPERIOD) { | 2962 if (CurrentToken() == Token::kPERIOD) { |
| 2968 // Named constructor. | 2963 // Named constructor. |
| 2969 ConsumeToken(); | 2964 ConsumeToken(); |
| 2970 member.constructor_name = ExpectIdentifier("identifier expected"); | 2965 member.constructor_name = ExpectIdentifier("identifier expected"); |
| 2971 *member.name = String::Concat(*member.name, *member.constructor_name); | 2966 *member.name = String::Concat(*member.name, *member.constructor_name); |
| 2972 } | 2967 } |
| 2973 // Ensure that names are symbols. | 2968 // Ensure that names are symbols. |
| 2974 *member.name = Symbols::New(*member.name); | 2969 *member.name = Symbols::New(*member.name); |
| 2975 if (member.type == NULL) { | 2970 if (member.type == NULL) { |
| 2976 ASSERT(!member.has_factory); | 2971 ASSERT(!member.has_factory); |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3103 } | 3098 } |
| 3104 cls = Class::New(class_name, script_, classname_pos); | 3099 cls = Class::New(class_name, script_, classname_pos); |
| 3105 library_.AddClass(cls); | 3100 library_.AddClass(cls); |
| 3106 } else { | 3101 } else { |
| 3107 if (!obj.IsClass()) { | 3102 if (!obj.IsClass()) { |
| 3108 ErrorMsg(classname_pos, "'%s' is already defined", | 3103 ErrorMsg(classname_pos, "'%s' is already defined", |
| 3109 class_name.ToCString()); | 3104 class_name.ToCString()); |
| 3110 } | 3105 } |
| 3111 cls ^= obj.raw(); | 3106 cls ^= obj.raw(); |
| 3112 if (is_patch) { | 3107 if (is_patch) { |
| 3113 String& patch = String::Handle(Symbols::New("patch ")); | 3108 String& patch = String::Handle( |
| 3114 patch = String::Concat(patch, class_name); | 3109 String::Concat(Symbols::PatchSpace(), class_name)); |
| 3115 patch = Symbols::New(patch); | 3110 patch = Symbols::New(patch); |
| 3116 cls = Class::New(patch, script_, classname_pos); | 3111 cls = Class::New(patch, script_, classname_pos); |
| 3117 cls.set_library(library_); | 3112 cls.set_library(library_); |
| 3118 } else { | 3113 } else { |
| 3119 // Not patching a class, but it has been found. This must be one of the | 3114 // Not patching a class, but it has been found. This must be one of the |
| 3120 // pre-registered classes from object.cc or a duplicate definition. | 3115 // pre-registered classes from object.cc or a duplicate definition. |
| 3121 if (cls.functions() != Object::empty_array().raw()) { | 3116 if (cls.functions() != Object::empty_array().raw()) { |
| 3122 ErrorMsg(classname_pos, "class '%s' is already defined", | 3117 ErrorMsg(classname_pos, "class '%s' is already defined", |
| 3123 class_name.ToCString()); | 3118 class_name.ToCString()); |
| 3124 } | 3119 } |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3195 } | 3190 } |
| 3196 } | 3191 } |
| 3197 } | 3192 } |
| 3198 | 3193 |
| 3199 | 3194 |
| 3200 // Add an implicit constructor if no explicit constructor is present. | 3195 // Add an implicit constructor if no explicit constructor is present. |
| 3201 void Parser::AddImplicitConstructor(ClassDesc* class_desc) { | 3196 void Parser::AddImplicitConstructor(ClassDesc* class_desc) { |
| 3202 // The implicit constructor is unnamed, has no explicit parameter, | 3197 // The implicit constructor is unnamed, has no explicit parameter, |
| 3203 // and contains a supercall in the initializer list. | 3198 // and contains a supercall in the initializer list. |
| 3204 String& ctor_name = String::ZoneHandle( | 3199 String& ctor_name = String::ZoneHandle( |
| 3205 String::Concat(class_desc->class_name(), Symbols::DotHandle())); | 3200 String::Concat(class_desc->class_name(), Symbols::Dot())); |
| 3206 ctor_name = Symbols::New(ctor_name); | 3201 ctor_name = Symbols::New(ctor_name); |
| 3207 // The token position for the implicit constructor is the 'class' | 3202 // The token position for the implicit constructor is the 'class' |
| 3208 // keyword of the constructor's class. | 3203 // keyword of the constructor's class. |
| 3209 Function& ctor = Function::Handle( | 3204 Function& ctor = Function::Handle( |
| 3210 Function::New(ctor_name, | 3205 Function::New(ctor_name, |
| 3211 RawFunction::kConstructor, | 3206 RawFunction::kConstructor, |
| 3212 /* is_static = */ false, | 3207 /* is_static = */ false, |
| 3213 /* is_const = */ false, | 3208 /* is_const = */ false, |
| 3214 /* is_abstract = */ false, | 3209 /* is_abstract = */ false, |
| 3215 /* is_external = */ false, | 3210 /* is_external = */ false, |
| 3216 current_class(), | 3211 current_class(), |
| 3217 class_desc->token_pos())); | 3212 class_desc->token_pos())); |
| 3218 ParamList params; | 3213 ParamList params; |
| 3219 // Add implicit 'this' parameter. | 3214 // Add implicit 'this' parameter. |
| 3220 ASSERT(current_class().raw() == ctor.Owner()); | 3215 ASSERT(current_class().raw() == ctor.Owner()); |
| 3221 params.AddReceiver(ReceiverType(TokenPos())); | 3216 params.AddReceiver(ReceiverType(TokenPos())); |
| 3222 // Add implicit parameter for construction phase. | 3217 // Add implicit parameter for construction phase. |
| 3223 params.AddFinalParameter(TokenPos(), | 3218 params.AddFinalParameter(TokenPos(), |
| 3224 &String::ZoneHandle(Symbols::PhaseParameter()), | 3219 &Symbols::PhaseParameter(), |
| 3225 &Type::ZoneHandle(Type::SmiType())); | 3220 &Type::ZoneHandle(Type::SmiType())); |
| 3226 | 3221 |
| 3227 AddFormalParamsToFunction(¶ms, ctor); | 3222 AddFormalParamsToFunction(¶ms, ctor); |
| 3228 // The body of the constructor cannot modify the type of the constructed | 3223 // The body of the constructor cannot modify the type of the constructed |
| 3229 // instance, which is passed in as the receiver. | 3224 // instance, which is passed in as the receiver. |
| 3230 ctor.set_result_type(*((*params.parameters)[0].type)); | 3225 ctor.set_result_type(*((*params.parameters)[0].type)); |
| 3231 class_desc->AddFunction(ctor); | 3226 class_desc->AddFunction(ctor); |
| 3232 } | 3227 } |
| 3233 | 3228 |
| 3234 | 3229 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3295 | 3290 |
| 3296 | 3291 |
| 3297 void Parser::ParseFunctionTypeAlias( | 3292 void Parser::ParseFunctionTypeAlias( |
| 3298 const GrowableObjectArray& pending_classes) { | 3293 const GrowableObjectArray& pending_classes) { |
| 3299 TRACE_PARSER("ParseFunctionTypeAlias"); | 3294 TRACE_PARSER("ParseFunctionTypeAlias"); |
| 3300 ExpectToken(Token::kTYPEDEF); | 3295 ExpectToken(Token::kTYPEDEF); |
| 3301 | 3296 |
| 3302 // Allocate an abstract class to hold the type parameters and their bounds. | 3297 // Allocate an abstract class to hold the type parameters and their bounds. |
| 3303 // Make it the owner of the function type descriptor. | 3298 // Make it the owner of the function type descriptor. |
| 3304 const Class& alias_owner = Class::Handle( | 3299 const Class& alias_owner = Class::Handle( |
| 3305 Class::New(String::Handle(Symbols::New(":alias_owner")), | 3300 Class::New(Symbols::AliasOwner(), Script::Handle(), TokenPos())); |
| 3306 Script::Handle(), | |
| 3307 TokenPos())); | |
| 3308 | 3301 |
| 3309 alias_owner.set_is_abstract(); | 3302 alias_owner.set_is_abstract(); |
| 3310 alias_owner.set_library(library_); | 3303 alias_owner.set_library(library_); |
| 3311 set_current_class(alias_owner); | 3304 set_current_class(alias_owner); |
| 3312 | 3305 |
| 3313 // Parse the result type of the function type. | 3306 // Parse the result type of the function type. |
| 3314 AbstractType& result_type = Type::Handle(Type::DynamicType()); | 3307 AbstractType& result_type = Type::Handle(Type::DynamicType()); |
| 3315 if (CurrentToken() == Token::kVOID) { | 3308 if (CurrentToken() == Token::kVOID) { |
| 3316 ConsumeToken(); | 3309 ConsumeToken(); |
| 3317 result_type = Type::VoidType(); | 3310 result_type = Type::VoidType(); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 3336 } | 3329 } |
| 3337 // Parse the formal parameters of the function type. | 3330 // Parse the formal parameters of the function type. |
| 3338 if (CurrentToken() != Token::kLPAREN) { | 3331 if (CurrentToken() != Token::kLPAREN) { |
| 3339 ErrorMsg("formal parameter list expected"); | 3332 ErrorMsg("formal parameter list expected"); |
| 3340 } | 3333 } |
| 3341 ParamList func_params; | 3334 ParamList func_params; |
| 3342 | 3335 |
| 3343 // Add implicit closure object parameter. | 3336 // Add implicit closure object parameter. |
| 3344 func_params.AddFinalParameter( | 3337 func_params.AddFinalParameter( |
| 3345 TokenPos(), | 3338 TokenPos(), |
| 3346 &String::ZoneHandle(Symbols::ClosureParameter()), | 3339 &Symbols::ClosureParameter(), |
| 3347 &Type::ZoneHandle(Type::DynamicType())); | 3340 &Type::ZoneHandle(Type::DynamicType())); |
| 3348 | 3341 |
| 3349 const bool no_explicit_default_values = false; | 3342 const bool no_explicit_default_values = false; |
| 3350 ParseFormalParameterList(no_explicit_default_values, &func_params); | 3343 ParseFormalParameterList(no_explicit_default_values, &func_params); |
| 3351 // The field 'is_static' has no meaning for signature functions. | 3344 // The field 'is_static' has no meaning for signature functions. |
| 3352 Function& signature_function = Function::Handle( | 3345 Function& signature_function = Function::Handle( |
| 3353 Function::New(*alias_name, | 3346 Function::New(*alias_name, |
| 3354 RawFunction::kSignatureFunction, | 3347 RawFunction::kSignatureFunction, |
| 3355 /* is_static = */ false, | 3348 /* is_static = */ false, |
| 3356 /* is_const = */ false, | 3349 /* is_const = */ false, |
| (...skipping 720 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4077 } | 4070 } |
| 4078 | 4071 |
| 4079 | 4072 |
| 4080 void Parser::ParseLibraryName() { | 4073 void Parser::ParseLibraryName() { |
| 4081 ASSERT(CurrentToken() == Token::kLIBRARY); | 4074 ASSERT(CurrentToken() == Token::kLIBRARY); |
| 4082 ConsumeToken(); | 4075 ConsumeToken(); |
| 4083 String& lib_name = *ExpectIdentifier("library name expected"); | 4076 String& lib_name = *ExpectIdentifier("library name expected"); |
| 4084 if (CurrentToken() == Token::kPERIOD) { | 4077 if (CurrentToken() == Token::kPERIOD) { |
| 4085 while (CurrentToken() == Token::kPERIOD) { | 4078 while (CurrentToken() == Token::kPERIOD) { |
| 4086 ConsumeToken(); | 4079 ConsumeToken(); |
| 4087 lib_name = String::Concat(lib_name, Symbols::DotHandle()); | 4080 lib_name = String::Concat(lib_name, Symbols::Dot()); |
| 4088 lib_name = String::Concat(lib_name, | 4081 lib_name = String::Concat(lib_name, |
| 4089 *ExpectIdentifier("malformed library name")); | 4082 *ExpectIdentifier("malformed library name")); |
| 4090 } | 4083 } |
| 4091 lib_name = Symbols::New(lib_name); | 4084 lib_name = Symbols::New(lib_name); |
| 4092 } | 4085 } |
| 4093 library_.SetName(lib_name); | 4086 library_.SetName(lib_name); |
| 4094 ExpectSemicolon(); | 4087 ExpectSemicolon(); |
| 4095 } | 4088 } |
| 4096 | 4089 |
| 4097 | 4090 |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4316 // They need to be registered with class finalization after parsing | 4309 // They need to be registered with class finalization after parsing |
| 4317 // has been completed. | 4310 // has been completed. |
| 4318 Isolate* isolate = Isolate::Current(); | 4311 Isolate* isolate = Isolate::Current(); |
| 4319 ObjectStore* object_store = isolate->object_store(); | 4312 ObjectStore* object_store = isolate->object_store(); |
| 4320 const GrowableObjectArray& pending_classes = | 4313 const GrowableObjectArray& pending_classes = |
| 4321 GrowableObjectArray::Handle(isolate, object_store->pending_classes()); | 4314 GrowableObjectArray::Handle(isolate, object_store->pending_classes()); |
| 4322 SetPosition(0); | 4315 SetPosition(0); |
| 4323 is_top_level_ = true; | 4316 is_top_level_ = true; |
| 4324 TopLevel top_level; | 4317 TopLevel top_level; |
| 4325 Class& toplevel_class = Class::Handle( | 4318 Class& toplevel_class = Class::Handle( |
| 4326 Class::New(String::Handle(Symbols::TopLevel()), script_, TokenPos())); | 4319 Class::New(Symbols::TopLevel(), script_, TokenPos())); |
| 4327 toplevel_class.set_library(library_); | 4320 toplevel_class.set_library(library_); |
| 4328 | 4321 |
| 4329 if (is_library_source()) { | 4322 if (is_library_source()) { |
| 4330 ParseLibraryDefinition(); | 4323 ParseLibraryDefinition(); |
| 4331 } else if (is_part_source()) { | 4324 } else if (is_part_source()) { |
| 4332 ParsePartHeader(); | 4325 ParsePartHeader(); |
| 4333 } | 4326 } |
| 4334 | 4327 |
| 4335 while (true) { | 4328 while (true) { |
| 4336 set_current_class(Class::Handle()); // No current class. | 4329 set_current_class(Class::Handle()); // No current class. |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4537 new ReturnNode(TokenPos(), | 4530 new ReturnNode(TokenPos(), |
| 4538 new NativeBodyNode(TokenPos(), | 4531 new NativeBodyNode(TokenPos(), |
| 4539 Function::ZoneHandle(func.raw()), | 4532 Function::ZoneHandle(func.raw()), |
| 4540 native_name, | 4533 native_name, |
| 4541 native_function))); | 4534 native_function))); |
| 4542 } | 4535 } |
| 4543 | 4536 |
| 4544 | 4537 |
| 4545 LocalVariable* Parser::LookupReceiver(LocalScope* from_scope, bool test_only) { | 4538 LocalVariable* Parser::LookupReceiver(LocalScope* from_scope, bool test_only) { |
| 4546 ASSERT(!current_function().is_static()); | 4539 ASSERT(!current_function().is_static()); |
| 4547 return from_scope->LookupVariable(Symbols::ThisHandle(), test_only); | 4540 return from_scope->LookupVariable(Symbols::This(), test_only); |
| 4548 } | 4541 } |
| 4549 | 4542 |
| 4550 | 4543 |
| 4551 LocalVariable* Parser::LookupTypeArgumentsParameter(LocalScope* from_scope, | 4544 LocalVariable* Parser::LookupTypeArgumentsParameter(LocalScope* from_scope, |
| 4552 bool test_only) { | 4545 bool test_only) { |
| 4553 ASSERT(current_function().IsInFactoryScope()); | 4546 ASSERT(current_function().IsInFactoryScope()); |
| 4554 const String& param_name = String::Handle(Symbols::TypeArgumentsParameter()); | 4547 return from_scope->LookupVariable(Symbols::TypeArgumentsParameter(), |
| 4555 return from_scope->LookupVariable(param_name, test_only); | 4548 test_only); |
| 4556 } | 4549 } |
| 4557 LocalVariable* Parser::LookupPhaseParameter() { | 4550 LocalVariable* Parser::LookupPhaseParameter() { |
| 4558 const String& phase_name = | |
| 4559 String::Handle(Symbols::PhaseParameter()); | |
| 4560 const bool kTestOnly = false; | 4551 const bool kTestOnly = false; |
| 4561 return current_block_->scope->LookupVariable(phase_name, kTestOnly); | 4552 return current_block_->scope->LookupVariable(Symbols::PhaseParameter(), |
| 4553 kTestOnly); |
| 4562 } | 4554 } |
| 4563 | 4555 |
| 4564 | 4556 |
| 4565 void Parser::CaptureInstantiator() { | 4557 void Parser::CaptureInstantiator() { |
| 4566 ASSERT(current_block_->scope->function_level() > 0); | 4558 ASSERT(current_block_->scope->function_level() > 0); |
| 4567 const bool kTestOnly = false; | 4559 const bool kTestOnly = false; |
| 4568 // Side effect of lookup captures the instantiator variable. | 4560 // Side effect of lookup captures the instantiator variable. |
| 4569 LocalVariable* instantiator = NULL; | 4561 LocalVariable* instantiator = NULL; |
| 4570 if (current_function().IsInFactoryScope()) { | 4562 if (current_function().IsInFactoryScope()) { |
| 4571 instantiator = LookupTypeArgumentsParameter(current_block_->scope, | 4563 instantiator = LookupTypeArgumentsParameter(current_block_->scope, |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4729 AbstractType& result_type = AbstractType::Handle(); | 4721 AbstractType& result_type = AbstractType::Handle(); |
| 4730 const String* variable_name = NULL; | 4722 const String* variable_name = NULL; |
| 4731 const String* function_name = NULL; | 4723 const String* function_name = NULL; |
| 4732 | 4724 |
| 4733 result_type = Type::DynamicType(); | 4725 result_type = Type::DynamicType(); |
| 4734 | 4726 |
| 4735 intptr_t ident_pos = TokenPos(); | 4727 intptr_t ident_pos = TokenPos(); |
| 4736 if (FLAG_strict_function_literals) { | 4728 if (FLAG_strict_function_literals) { |
| 4737 if (is_literal) { | 4729 if (is_literal) { |
| 4738 ASSERT(CurrentToken() == Token::kLPAREN); | 4730 ASSERT(CurrentToken() == Token::kLPAREN); |
| 4739 function_name = &String::ZoneHandle(Symbols::AnonymousClosure()); | 4731 function_name = &Symbols::AnonymousClosure(); |
| 4740 } else { | 4732 } else { |
| 4741 if (CurrentToken() == Token::kVOID) { | 4733 if (CurrentToken() == Token::kVOID) { |
| 4742 ConsumeToken(); | 4734 ConsumeToken(); |
| 4743 result_type = Type::VoidType(); | 4735 result_type = Type::VoidType(); |
| 4744 } else if ((CurrentToken() == Token::kIDENT) && | 4736 } else if ((CurrentToken() == Token::kIDENT) && |
| 4745 (LookaheadToken(1) != Token::kLPAREN)) { | 4737 (LookaheadToken(1) != Token::kLPAREN)) { |
| 4746 result_type = ParseType(ClassFinalizer::kCanonicalize); | 4738 result_type = ParseType(ClassFinalizer::kCanonicalize); |
| 4747 } | 4739 } |
| 4748 ident_pos = TokenPos(); | 4740 ident_pos = TokenPos(); |
| 4749 variable_name = ExpectIdentifier("function name expected"); | 4741 variable_name = ExpectIdentifier("function name expected"); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 4761 } | 4753 } |
| 4762 ident_pos = TokenPos(); | 4754 ident_pos = TokenPos(); |
| 4763 if (IsIdentifier()) { | 4755 if (IsIdentifier()) { |
| 4764 variable_name = CurrentLiteral(); | 4756 variable_name = CurrentLiteral(); |
| 4765 function_name = variable_name; | 4757 function_name = variable_name; |
| 4766 ConsumeToken(); | 4758 ConsumeToken(); |
| 4767 } else { | 4759 } else { |
| 4768 if (!is_literal) { | 4760 if (!is_literal) { |
| 4769 ErrorMsg("function name expected"); | 4761 ErrorMsg("function name expected"); |
| 4770 } | 4762 } |
| 4771 function_name = &String::ZoneHandle(Symbols::AnonymousClosure()); | 4763 function_name = &Symbols::AnonymousClosure(); |
| 4772 } | 4764 } |
| 4773 } | 4765 } |
| 4774 | 4766 |
| 4775 if (CurrentToken() != Token::kLPAREN) { | 4767 if (CurrentToken() != Token::kLPAREN) { |
| 4776 ErrorMsg("'(' expected"); | 4768 ErrorMsg("'(' expected"); |
| 4777 } | 4769 } |
| 4778 intptr_t function_pos = TokenPos(); | 4770 intptr_t function_pos = TokenPos(); |
| 4779 | 4771 |
| 4780 // Check whether we have parsed this closure function before, in a previous | 4772 // Check whether we have parsed this closure function before, in a previous |
| 4781 // compilation. If so, reuse the function object, else create a new one | 4773 // compilation. If so, reuse the function object, else create a new one |
| (...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5402 // End of switch statement. | 5394 // End of switch statement. |
| 5403 break; | 5395 break; |
| 5404 } | 5396 } |
| 5405 if ((next_token == Token::kCASE) || (next_token == Token::kDEFAULT)) { | 5397 if ((next_token == Token::kCASE) || (next_token == Token::kDEFAULT)) { |
| 5406 // End of this case clause. If there is a possible fall-through to | 5398 // End of this case clause. If there is a possible fall-through to |
| 5407 // the next case clause, throw an implicit FallThroughError. | 5399 // the next case clause, throw an implicit FallThroughError. |
| 5408 if (!abrupt_completing_seen) { | 5400 if (!abrupt_completing_seen) { |
| 5409 ArgumentListNode* arguments = new ArgumentListNode(TokenPos()); | 5401 ArgumentListNode* arguments = new ArgumentListNode(TokenPos()); |
| 5410 arguments->Add(new LiteralNode( | 5402 arguments->Add(new LiteralNode( |
| 5411 TokenPos(), Integer::ZoneHandle(Integer::New(TokenPos())))); | 5403 TokenPos(), Integer::ZoneHandle(Integer::New(TokenPos())))); |
| 5412 const String& cls_name = String::Handle(Symbols::FallThroughError()); | |
| 5413 const String& func_name = String::Handle(Symbols::ThrowNew()); | |
| 5414 current_block_->statements->Add( | 5404 current_block_->statements->Add( |
| 5415 MakeStaticCall(cls_name, func_name, arguments)); | 5405 MakeStaticCall(Symbols::FallThroughError(), |
| 5406 Symbols::ThrowNew(), |
| 5407 arguments)); |
| 5416 } | 5408 } |
| 5417 break; | 5409 break; |
| 5418 } | 5410 } |
| 5419 // The next statement still belongs to this case. | 5411 // The next statement still belongs to this case. |
| 5420 AstNode* statement = ParseStatement(); | 5412 AstNode* statement = ParseStatement(); |
| 5421 if (statement != NULL) { | 5413 if (statement != NULL) { |
| 5422 current_block_->statements->Add(statement); | 5414 current_block_->statements->Add(statement); |
| 5423 abrupt_completing_seen |= IsAbruptCompleting(statement); | 5415 abrupt_completing_seen |= IsAbruptCompleting(statement); |
| 5424 } | 5416 } |
| 5425 } | 5417 } |
| (...skipping 23 matching lines...) Expand all Loading... |
| 5449 if (paren_found) { | 5441 if (paren_found) { |
| 5450 ExpectToken(Token::kRPAREN); | 5442 ExpectToken(Token::kRPAREN); |
| 5451 } | 5443 } |
| 5452 ExpectToken(Token::kLBRACE); | 5444 ExpectToken(Token::kLBRACE); |
| 5453 OpenBlock(); | 5445 OpenBlock(); |
| 5454 current_block_->scope->AddLabel(label); | 5446 current_block_->scope->AddLabel(label); |
| 5455 | 5447 |
| 5456 // Store switch expression in temporary local variable. | 5448 // Store switch expression in temporary local variable. |
| 5457 LocalVariable* temp_variable = | 5449 LocalVariable* temp_variable = |
| 5458 new LocalVariable(expr_pos, | 5450 new LocalVariable(expr_pos, |
| 5459 String::ZoneHandle(Symbols::New(":switch_expr")), | 5451 Symbols::SwitchExpr(), |
| 5460 Type::ZoneHandle(Type::DynamicType())); | 5452 Type::ZoneHandle(Type::DynamicType())); |
| 5461 current_block_->scope->AddVariable(temp_variable); | 5453 current_block_->scope->AddVariable(temp_variable); |
| 5462 AstNode* save_switch_expr = | 5454 AstNode* save_switch_expr = |
| 5463 new StoreLocalNode(expr_pos, temp_variable, switch_expr); | 5455 new StoreLocalNode(expr_pos, temp_variable, switch_expr); |
| 5464 current_block_->statements->Add(save_switch_expr); | 5456 current_block_->statements->Add(save_switch_expr); |
| 5465 | 5457 |
| 5466 // Parse case clauses | 5458 // Parse case clauses |
| 5467 bool default_seen = false; | 5459 bool default_seen = false; |
| 5468 while (true) { | 5460 while (true) { |
| 5469 // Check for statement label | 5461 // Check for statement label |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5580 } | 5572 } |
| 5581 } | 5573 } |
| 5582 ExpectToken(Token::kIN); | 5574 ExpectToken(Token::kIN); |
| 5583 const intptr_t collection_pos = TokenPos(); | 5575 const intptr_t collection_pos = TokenPos(); |
| 5584 AstNode* collection_expr = ParseExpr(kAllowConst, kConsumeCascades); | 5576 AstNode* collection_expr = ParseExpr(kAllowConst, kConsumeCascades); |
| 5585 ExpectToken(Token::kRPAREN); | 5577 ExpectToken(Token::kRPAREN); |
| 5586 | 5578 |
| 5587 OpenBlock(); // Implicit block around while loop. | 5579 OpenBlock(); // Implicit block around while loop. |
| 5588 | 5580 |
| 5589 // Generate implicit iterator variable and add to scope. | 5581 // Generate implicit iterator variable and add to scope. |
| 5590 const String& iterator_name = String::ZoneHandle(Symbols::ForInIter()); | |
| 5591 // We could set the type of the implicit iterator variable to Iterator<T> | 5582 // We could set the type of the implicit iterator variable to Iterator<T> |
| 5592 // where T is the type of the for loop variable. However, the type error | 5583 // where T is the type of the for loop variable. However, the type error |
| 5593 // would refer to the compiler generated iterator and could confuse the user. | 5584 // would refer to the compiler generated iterator and could confuse the user. |
| 5594 // It is better to leave the iterator untyped and postpone the type error | 5585 // It is better to leave the iterator untyped and postpone the type error |
| 5595 // until the loop variable is assigned to. | 5586 // until the loop variable is assigned to. |
| 5596 const AbstractType& iterator_type = Type::ZoneHandle(Type::DynamicType()); | 5587 const AbstractType& iterator_type = Type::ZoneHandle(Type::DynamicType()); |
| 5597 LocalVariable* iterator_var = | 5588 LocalVariable* iterator_var = |
| 5598 new LocalVariable(collection_pos, iterator_name, iterator_type); | 5589 new LocalVariable(collection_pos, Symbols::ForInIter(), iterator_type); |
| 5599 current_block_->scope->AddVariable(iterator_var); | 5590 current_block_->scope->AddVariable(iterator_var); |
| 5600 | 5591 |
| 5601 // Generate initialization of iterator variable. | 5592 // Generate initialization of iterator variable. |
| 5602 const String& iterator_method_name = | |
| 5603 String::ZoneHandle(Symbols::GetIterator()); | |
| 5604 ArgumentListNode* no_args = new ArgumentListNode(collection_pos); | 5593 ArgumentListNode* no_args = new ArgumentListNode(collection_pos); |
| 5605 AstNode* get_iterator = new InstanceCallNode( | 5594 AstNode* get_iterator = new InstanceCallNode( |
| 5606 collection_pos, collection_expr, iterator_method_name, no_args); | 5595 collection_pos, collection_expr, Symbols::GetIterator(), no_args); |
| 5607 AstNode* iterator_init = | 5596 AstNode* iterator_init = |
| 5608 new StoreLocalNode(collection_pos, iterator_var, get_iterator); | 5597 new StoreLocalNode(collection_pos, iterator_var, get_iterator); |
| 5609 current_block_->statements->Add(iterator_init); | 5598 current_block_->statements->Add(iterator_init); |
| 5610 | 5599 |
| 5611 // Generate while loop condition. | 5600 // Generate while loop condition. |
| 5612 AstNode* iterator_has_next = new InstanceGetterNode( | 5601 AstNode* iterator_has_next = new InstanceGetterNode( |
| 5613 collection_pos, | 5602 collection_pos, |
| 5614 new LoadLocalNode(collection_pos, iterator_var), | 5603 new LoadLocalNode(collection_pos, iterator_var), |
| 5615 String::ZoneHandle(Symbols::HasNext())); | 5604 Symbols::HasNext()); |
| 5616 | 5605 |
| 5617 // Parse the for loop body. Ideally, we would use ParseNestedStatement() | 5606 // Parse the for loop body. Ideally, we would use ParseNestedStatement() |
| 5618 // here, but that does not work well because we have to insert an implicit | 5607 // here, but that does not work well because we have to insert an implicit |
| 5619 // variable assignment and potentially a variable declaration in the | 5608 // variable assignment and potentially a variable declaration in the |
| 5620 // loop body. | 5609 // loop body. |
| 5621 OpenLoopBlock(); | 5610 OpenLoopBlock(); |
| 5622 current_block_->scope->AddLabel(label); | 5611 current_block_->scope->AddLabel(label); |
| 5623 | 5612 |
| 5624 AstNode* iterator_next = new InstanceCallNode( | 5613 AstNode* iterator_next = new InstanceCallNode( |
| 5625 collection_pos, | 5614 collection_pos, |
| 5626 new LoadLocalNode(collection_pos, iterator_var), | 5615 new LoadLocalNode(collection_pos, iterator_var), |
| 5627 String::ZoneHandle(Symbols::Next()), | 5616 Symbols::Next(), |
| 5628 no_args); | 5617 no_args); |
| 5629 | 5618 |
| 5630 // Generate assignment of next iterator value to loop variable. | 5619 // Generate assignment of next iterator value to loop variable. |
| 5631 AstNode* loop_var_assignment = NULL; | 5620 AstNode* loop_var_assignment = NULL; |
| 5632 if (loop_var != NULL) { | 5621 if (loop_var != NULL) { |
| 5633 // The for loop declares a new variable. Add it to the loop body scope. | 5622 // The for loop declares a new variable. Add it to the loop body scope. |
| 5634 current_block_->scope->AddVariable(loop_var); | 5623 current_block_->scope->AddVariable(loop_var); |
| 5635 loop_var_assignment = | 5624 loop_var_assignment = |
| 5636 new StoreLocalNode(loop_var_pos, loop_var, iterator_next); | 5625 new StoreLocalNode(loop_var_pos, loop_var, iterator_next); |
| 5637 } else { | 5626 } else { |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5750 return new StaticCallNode(arguments->token_pos(), func, arguments); | 5739 return new StaticCallNode(arguments->token_pos(), func, arguments); |
| 5751 } | 5740 } |
| 5752 | 5741 |
| 5753 | 5742 |
| 5754 AstNode* Parser::MakeAssertCall(intptr_t begin, intptr_t end) { | 5743 AstNode* Parser::MakeAssertCall(intptr_t begin, intptr_t end) { |
| 5755 ArgumentListNode* arguments = new ArgumentListNode(begin); | 5744 ArgumentListNode* arguments = new ArgumentListNode(begin); |
| 5756 arguments->Add(new LiteralNode(begin, | 5745 arguments->Add(new LiteralNode(begin, |
| 5757 Integer::ZoneHandle(Integer::New(begin)))); | 5746 Integer::ZoneHandle(Integer::New(begin)))); |
| 5758 arguments->Add(new LiteralNode(end, | 5747 arguments->Add(new LiteralNode(end, |
| 5759 Integer::ZoneHandle(Integer::New(end)))); | 5748 Integer::ZoneHandle(Integer::New(end)))); |
| 5760 const String& cls_name = String::Handle(Symbols::AssertionError()); | 5749 return MakeStaticCall(Symbols::AssertionError(), |
| 5761 const String& func_name = String::Handle(Symbols::ThrowNew()); | 5750 Symbols::ThrowNew(), |
| 5762 return MakeStaticCall(cls_name, func_name, arguments); | 5751 arguments); |
| 5763 } | 5752 } |
| 5764 | 5753 |
| 5765 | 5754 |
| 5766 AstNode* Parser::InsertClosureCallNodes(AstNode* condition) { | 5755 AstNode* Parser::InsertClosureCallNodes(AstNode* condition) { |
| 5767 if (condition->IsClosureNode() || | 5756 if (condition->IsClosureNode() || |
| 5768 (condition->IsStoreLocalNode() && | 5757 (condition->IsStoreLocalNode() && |
| 5769 condition->AsStoreLocalNode()->value()->IsClosureNode())) { | 5758 condition->AsStoreLocalNode()->value()->IsClosureNode())) { |
| 5770 EnsureExpressionTemp(); | 5759 EnsureExpressionTemp(); |
| 5771 // Function literal in assert implies a call. | 5760 // Function literal in assert implies a call. |
| 5772 const intptr_t pos = condition->token_pos(); | 5761 const intptr_t pos = condition->token_pos(); |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5910 // block. The context register is restored from this | 5899 // block. The context register is restored from this |
| 5911 // slot before processing the catch block handler. | 5900 // slot before processing the catch block handler. |
| 5912 // ':exception_var' - Used to save the current exception object that was | 5901 // ':exception_var' - Used to save the current exception object that was |
| 5913 // thrown. | 5902 // thrown. |
| 5914 // ':stacktrace_var' - Used to save the current stack trace object into which | 5903 // ':stacktrace_var' - Used to save the current stack trace object into which |
| 5915 // the stack trace was copied into when an exception was | 5904 // the stack trace was copied into when an exception was |
| 5916 // thrown. | 5905 // thrown. |
| 5917 // :exception_var and :stacktrace_var get set with the exception object | 5906 // :exception_var and :stacktrace_var get set with the exception object |
| 5918 // and the stacktrace object when an exception is thrown. | 5907 // and the stacktrace object when an exception is thrown. |
| 5919 // These three implicit variables can never be captured variables. | 5908 // These three implicit variables can never be captured variables. |
| 5920 const String& context_var_name = | |
| 5921 String::ZoneHandle(Symbols::SavedContextVar()); | |
| 5922 LocalVariable* context_var = | 5909 LocalVariable* context_var = |
| 5923 current_block_->scope->LocalLookupVariable(context_var_name); | 5910 current_block_->scope->LocalLookupVariable(Symbols::SavedContextVar()); |
| 5924 if (context_var == NULL) { | 5911 if (context_var == NULL) { |
| 5925 context_var = new LocalVariable(TokenPos(), | 5912 context_var = new LocalVariable(TokenPos(), |
| 5926 context_var_name, | 5913 Symbols::SavedContextVar(), |
| 5927 Type::ZoneHandle(Type::DynamicType())); | 5914 Type::ZoneHandle(Type::DynamicType())); |
| 5928 current_block_->scope->AddVariable(context_var); | 5915 current_block_->scope->AddVariable(context_var); |
| 5929 } | 5916 } |
| 5930 const String& catch_excp_var_name = | |
| 5931 String::ZoneHandle(Symbols::ExceptionVar()); | |
| 5932 LocalVariable* catch_excp_var = | 5917 LocalVariable* catch_excp_var = |
| 5933 current_block_->scope->LocalLookupVariable(catch_excp_var_name); | 5918 current_block_->scope->LocalLookupVariable(Symbols::ExceptionVar()); |
| 5934 if (catch_excp_var == NULL) { | 5919 if (catch_excp_var == NULL) { |
| 5935 catch_excp_var = new LocalVariable(TokenPos(), | 5920 catch_excp_var = new LocalVariable(TokenPos(), |
| 5936 catch_excp_var_name, | 5921 Symbols::ExceptionVar(), |
| 5937 Type::ZoneHandle(Type::DynamicType())); | 5922 Type::ZoneHandle(Type::DynamicType())); |
| 5938 current_block_->scope->AddVariable(catch_excp_var); | 5923 current_block_->scope->AddVariable(catch_excp_var); |
| 5939 } | 5924 } |
| 5940 const String& catch_trace_var_name = | |
| 5941 String::ZoneHandle(Symbols::StacktraceVar()); | |
| 5942 LocalVariable* catch_trace_var = | 5925 LocalVariable* catch_trace_var = |
| 5943 current_block_->scope->LocalLookupVariable(catch_trace_var_name); | 5926 current_block_->scope->LocalLookupVariable(Symbols::StacktraceVar()); |
| 5944 if (catch_trace_var == NULL) { | 5927 if (catch_trace_var == NULL) { |
| 5945 catch_trace_var = new LocalVariable(TokenPos(), | 5928 catch_trace_var = new LocalVariable(TokenPos(), |
| 5946 catch_trace_var_name, | 5929 Symbols::StacktraceVar(), |
| 5947 Type::ZoneHandle(Type::DynamicType())); | 5930 Type::ZoneHandle(Type::DynamicType())); |
| 5948 current_block_->scope->AddVariable(catch_trace_var); | 5931 current_block_->scope->AddVariable(catch_trace_var); |
| 5949 } | 5932 } |
| 5950 | 5933 |
| 5951 const intptr_t try_pos = TokenPos(); | 5934 const intptr_t try_pos = TokenPos(); |
| 5952 ConsumeToken(); // Consume the 'try'. | 5935 ConsumeToken(); // Consume the 'try'. |
| 5953 | 5936 |
| 5954 SourceLabel* try_label = NULL; | 5937 SourceLabel* try_label = NULL; |
| 5955 if (label_name != NULL) { | 5938 if (label_name != NULL) { |
| 5956 try_label = SourceLabel::New(try_pos, label_name, SourceLabel::kStatement); | 5939 try_label = SourceLabel::New(try_pos, label_name, SourceLabel::kStatement); |
| (...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6301 ExpectSemicolon(); | 6284 ExpectSemicolon(); |
| 6302 // Check if it is ok to do a rethrow. | 6285 // Check if it is ok to do a rethrow. |
| 6303 SourceLabel* label = current_block_->scope->LookupInnermostCatchLabel(); | 6286 SourceLabel* label = current_block_->scope->LookupInnermostCatchLabel(); |
| 6304 if (label == NULL || | 6287 if (label == NULL || |
| 6305 label->FunctionLevel() != current_block_->scope->function_level()) { | 6288 label->FunctionLevel() != current_block_->scope->function_level()) { |
| 6306 ErrorMsg(statement_pos, "rethrow of an exception is not valid here"); | 6289 ErrorMsg(statement_pos, "rethrow of an exception is not valid here"); |
| 6307 } | 6290 } |
| 6308 ASSERT(label->owner() != NULL); | 6291 ASSERT(label->owner() != NULL); |
| 6309 LocalScope* scope = label->owner()->parent(); | 6292 LocalScope* scope = label->owner()->parent(); |
| 6310 ASSERT(scope != NULL); | 6293 ASSERT(scope != NULL); |
| 6311 LocalVariable* excp_var = scope->LocalLookupVariable( | 6294 LocalVariable* excp_var = |
| 6312 String::ZoneHandle(Symbols::ExceptionVar())); | 6295 scope->LocalLookupVariable(Symbols::ExceptionVar()); |
| 6313 ASSERT(excp_var != NULL); | 6296 ASSERT(excp_var != NULL); |
| 6314 LocalVariable* trace_var = scope->LocalLookupVariable( | 6297 LocalVariable* trace_var = |
| 6315 String::ZoneHandle(Symbols::StacktraceVar())); | 6298 scope->LocalLookupVariable(Symbols::StacktraceVar()); |
| 6316 ASSERT(trace_var != NULL); | 6299 ASSERT(trace_var != NULL); |
| 6317 statement = new ThrowNode(statement_pos, | 6300 statement = new ThrowNode(statement_pos, |
| 6318 new LoadLocalNode(statement_pos, excp_var), | 6301 new LoadLocalNode(statement_pos, excp_var), |
| 6319 new LoadLocalNode(statement_pos, trace_var)); | 6302 new LoadLocalNode(statement_pos, trace_var)); |
| 6320 } else { | 6303 } else { |
| 6321 statement = ParseExpr(kAllowConst, kConsumeCascades); | 6304 statement = ParseExpr(kAllowConst, kConsumeCascades); |
| 6322 ExpectSemicolon(); | 6305 ExpectSemicolon(); |
| 6323 } | 6306 } |
| 6324 return statement; | 6307 return statement; |
| 6325 } | 6308 } |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6578 | 6561 |
| 6579 AstNode* Parser::ThrowTypeError(intptr_t type_pos, const AbstractType& type) { | 6562 AstNode* Parser::ThrowTypeError(intptr_t type_pos, const AbstractType& type) { |
| 6580 ASSERT(type.IsMalformed()); | 6563 ASSERT(type.IsMalformed()); |
| 6581 ArgumentListNode* arguments = new ArgumentListNode(type_pos); | 6564 ArgumentListNode* arguments = new ArgumentListNode(type_pos); |
| 6582 // Location argument. | 6565 // Location argument. |
| 6583 arguments->Add(new LiteralNode( | 6566 arguments->Add(new LiteralNode( |
| 6584 type_pos, Integer::ZoneHandle(Integer::New(type_pos)))); | 6567 type_pos, Integer::ZoneHandle(Integer::New(type_pos)))); |
| 6585 // Src value argument. | 6568 // Src value argument. |
| 6586 arguments->Add(new LiteralNode(type_pos, Instance::ZoneHandle())); | 6569 arguments->Add(new LiteralNode(type_pos, Instance::ZoneHandle())); |
| 6587 // Dst type name argument. | 6570 // Dst type name argument. |
| 6588 arguments->Add(new LiteralNode(type_pos, String::ZoneHandle( | 6571 arguments->Add(new LiteralNode(type_pos, Symbols::Malformed())); |
| 6589 Symbols::New("malformed")))); | |
| 6590 // Dst name argument. | 6572 // Dst name argument. |
| 6591 arguments->Add(new LiteralNode(type_pos, | 6573 arguments->Add(new LiteralNode(type_pos, Symbols::Empty())); |
| 6592 String::ZoneHandle(Symbols::Empty()))); | |
| 6593 // Malformed type error. | 6574 // Malformed type error. |
| 6594 const Error& error = Error::Handle(type.malformed_error()); | 6575 const Error& error = Error::Handle(type.malformed_error()); |
| 6595 arguments->Add(new LiteralNode(type_pos, String::ZoneHandle( | 6576 arguments->Add(new LiteralNode(type_pos, String::ZoneHandle( |
| 6596 Symbols::New(error.ToErrorCString())))); | 6577 Symbols::New(error.ToErrorCString())))); |
| 6597 const String& cls_name = String::Handle(Symbols::TypeError()); | 6578 return MakeStaticCall(Symbols::TypeError(), Symbols::ThrowNew(), arguments); |
| 6598 const String& func_name = String::Handle(Symbols::ThrowNew()); | |
| 6599 return MakeStaticCall(cls_name, func_name, arguments); | |
| 6600 } | 6579 } |
| 6601 | 6580 |
| 6602 | 6581 |
| 6603 // TODO(regis): Providing the argument values is not always feasible, since | 6582 // TODO(regis): Providing the argument values is not always feasible, since |
| 6604 // evaluating them could throw an error. | 6583 // evaluating them could throw an error. |
| 6605 // Should NoSuchMethodError reflect the argument count and names instead of | 6584 // Should NoSuchMethodError reflect the argument count and names instead of |
| 6606 // argument values? Or should the spec specify a different evaluation order? | 6585 // argument values? Or should the spec specify a different evaluation order? |
| 6607 AstNode* Parser::ThrowNoSuchMethodError(intptr_t call_pos, | 6586 AstNode* Parser::ThrowNoSuchMethodError(intptr_t call_pos, |
| 6608 const Class& cls, | 6587 const Class& cls, |
| 6609 const String& function_name) { | 6588 const String& function_name) { |
| 6610 ArgumentListNode* arguments = new ArgumentListNode(call_pos); | 6589 ArgumentListNode* arguments = new ArgumentListNode(call_pos); |
| 6611 // Object receiver. | 6590 // Object receiver. |
| 6612 // TODO(regis): For now, we pass a class literal of the unresolved | 6591 // TODO(regis): For now, we pass a class literal of the unresolved |
| 6613 // method's owner, but this is not specified and will probably change. | 6592 // method's owner, but this is not specified and will probably change. |
| 6614 Type& type = Type::ZoneHandle( | 6593 Type& type = Type::ZoneHandle( |
| 6615 Type::New(cls, TypeArguments::Handle(), call_pos, Heap::kOld)); | 6594 Type::New(cls, TypeArguments::Handle(), call_pos, Heap::kOld)); |
| 6616 type ^= ClassFinalizer::FinalizeType( | 6595 type ^= ClassFinalizer::FinalizeType( |
| 6617 current_class(), type, ClassFinalizer::kCanonicalize); | 6596 current_class(), type, ClassFinalizer::kCanonicalize); |
| 6618 arguments->Add(new LiteralNode(call_pos, type)); | 6597 arguments->Add(new LiteralNode(call_pos, type)); |
| 6619 // String memberName. | 6598 // String memberName. |
| 6620 arguments->Add(new LiteralNode( | 6599 arguments->Add(new LiteralNode( |
| 6621 call_pos, String::ZoneHandle(Symbols::New(function_name)))); | 6600 call_pos, String::ZoneHandle(Symbols::New(function_name)))); |
| 6622 // List arguments. | 6601 // List arguments. |
| 6623 arguments->Add(new LiteralNode(call_pos, Array::ZoneHandle())); | 6602 arguments->Add(new LiteralNode(call_pos, Array::ZoneHandle())); |
| 6624 // List argumentNames. | 6603 // List argumentNames. |
| 6625 arguments->Add(new LiteralNode(call_pos, Array::ZoneHandle())); | 6604 arguments->Add(new LiteralNode(call_pos, Array::ZoneHandle())); |
| 6626 // List existingArgumentNames. | 6605 // List existingArgumentNames. |
| 6627 arguments->Add(new LiteralNode(call_pos, Array::ZoneHandle())); | 6606 arguments->Add(new LiteralNode(call_pos, Array::ZoneHandle())); |
| 6628 const String& cls_name = String::Handle(Symbols::NoSuchMethodError()); | 6607 return MakeStaticCall(Symbols::NoSuchMethodError(), |
| 6629 const String& func_name = String::Handle(Symbols::ThrowNew()); | 6608 Symbols::ThrowNew(), |
| 6630 return MakeStaticCall(cls_name, func_name, arguments); | 6609 arguments); |
| 6631 } | 6610 } |
| 6632 | 6611 |
| 6633 | 6612 |
| 6634 AstNode* Parser::ParseBinaryExpr(int min_preced) { | 6613 AstNode* Parser::ParseBinaryExpr(int min_preced) { |
| 6635 TRACE_PARSER("ParseBinaryExpr"); | 6614 TRACE_PARSER("ParseBinaryExpr"); |
| 6636 ASSERT(min_preced >= 4); | 6615 ASSERT(min_preced >= 4); |
| 6637 AstNode* left_operand = ParseUnaryExpr(); | 6616 AstNode* left_operand = ParseUnaryExpr(); |
| 6638 if (left_operand->IsPrimaryNode() && | 6617 if (left_operand->IsPrimaryNode() && |
| 6639 (left_operand->AsPrimaryNode()->IsSuper())) { | 6618 (left_operand->AsPrimaryNode()->IsSuper())) { |
| 6640 ErrorMsg(left_operand->token_pos(), "illegal use of 'super'"); | 6619 ErrorMsg(left_operand->token_pos(), "illegal use of 'super'"); |
| (...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7170 // Check if there is a static field of the same name, it could be a closure | 7149 // Check if there is a static field of the same name, it could be a closure |
| 7171 // and so we try and invoke the closure. | 7150 // and so we try and invoke the closure. |
| 7172 AstNode* closure = NULL; | 7151 AstNode* closure = NULL; |
| 7173 const Field& field = Field::ZoneHandle(cls.LookupStaticField(func_name)); | 7152 const Field& field = Field::ZoneHandle(cls.LookupStaticField(func_name)); |
| 7174 Function& func = Function::ZoneHandle(); | 7153 Function& func = Function::ZoneHandle(); |
| 7175 if (field.IsNull()) { | 7154 if (field.IsNull()) { |
| 7176 // No field, check if we have an explicit getter function. | 7155 // No field, check if we have an explicit getter function. |
| 7177 const String& getter_name = | 7156 const String& getter_name = |
| 7178 String::ZoneHandle(Field::GetterName(func_name)); | 7157 String::ZoneHandle(Field::GetterName(func_name)); |
| 7179 const int kNumArguments = 0; // no arguments. | 7158 const int kNumArguments = 0; // no arguments. |
| 7180 const Array& kNoArgumentNames = Array::Handle(); | |
| 7181 func = Resolver::ResolveStatic(cls, | 7159 func = Resolver::ResolveStatic(cls, |
| 7182 getter_name, | 7160 getter_name, |
| 7183 kNumArguments, | 7161 kNumArguments, |
| 7184 kNoArgumentNames, | 7162 Object::empty_array(), |
| 7185 Resolver::kIsQualified); | 7163 Resolver::kIsQualified); |
| 7186 if (!func.IsNull()) { | 7164 if (!func.IsNull()) { |
| 7187 ASSERT(func.kind() != RawFunction::kConstImplicitGetter); | 7165 ASSERT(func.kind() != RawFunction::kConstImplicitGetter); |
| 7188 EnsureExpressionTemp(); | 7166 EnsureExpressionTemp(); |
| 7189 closure = new StaticGetterNode(call_pos, | 7167 closure = new StaticGetterNode(call_pos, |
| 7190 NULL, | 7168 NULL, |
| 7191 false, | 7169 false, |
| 7192 Class::ZoneHandle(cls.raw()), | 7170 Class::ZoneHandle(cls.raw()), |
| 7193 func_name); | 7171 func_name); |
| 7194 return new ClosureCallNode(call_pos, closure, arguments); | 7172 return new ClosureCallNode(call_pos, closure, arguments); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7256 const intptr_t call_pos = TokenPos(); | 7234 const intptr_t call_pos = TokenPos(); |
| 7257 const Field& field = Field::ZoneHandle(cls.LookupStaticField(field_name)); | 7235 const Field& field = Field::ZoneHandle(cls.LookupStaticField(field_name)); |
| 7258 Function& func = Function::ZoneHandle(); | 7236 Function& func = Function::ZoneHandle(); |
| 7259 if (Token::IsAssignmentOperator(CurrentToken())) { | 7237 if (Token::IsAssignmentOperator(CurrentToken())) { |
| 7260 // Make sure an assignment is legal. | 7238 // Make sure an assignment is legal. |
| 7261 if (field.IsNull()) { | 7239 if (field.IsNull()) { |
| 7262 // No field, check if we have an explicit setter function. | 7240 // No field, check if we have an explicit setter function. |
| 7263 const String& setter_name = | 7241 const String& setter_name = |
| 7264 String::ZoneHandle(Field::SetterName(field_name)); | 7242 String::ZoneHandle(Field::SetterName(field_name)); |
| 7265 const int kNumArguments = 1; // value. | 7243 const int kNumArguments = 1; // value. |
| 7266 const Array& kNoArgumentNames = Array::Handle(); | |
| 7267 func = Resolver::ResolveStatic(cls, | 7244 func = Resolver::ResolveStatic(cls, |
| 7268 setter_name, | 7245 setter_name, |
| 7269 kNumArguments, | 7246 kNumArguments, |
| 7270 kNoArgumentNames, | 7247 Object::empty_array(), |
| 7271 Resolver::kIsQualified); | 7248 Resolver::kIsQualified); |
| 7272 if (func.IsNull()) { | 7249 if (func.IsNull()) { |
| 7273 // No field or explicit setter function, throw a NoSuchMethodError. | 7250 // No field or explicit setter function, throw a NoSuchMethodError. |
| 7274 return ThrowNoSuchMethodError(ident_pos, cls, field_name); | 7251 return ThrowNoSuchMethodError(ident_pos, cls, field_name); |
| 7275 } | 7252 } |
| 7276 | 7253 |
| 7277 // Explicit setter function for the field found, field does not exist. | 7254 // Explicit setter function for the field found, field does not exist. |
| 7278 // Create a getter node first in case it is needed. If getter node | 7255 // Create a getter node first in case it is needed. If getter node |
| 7279 // is used as part of, e.g., "+=", and the explicit getter does not | 7256 // is used as part of, e.g., "+=", and the explicit getter does not |
| 7280 // exist, and error will be reported by the code generator. | 7257 // exist, and error will be reported by the code generator. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 7293 field_name.ToCString()); | 7270 field_name.ToCString()); |
| 7294 } | 7271 } |
| 7295 access = GenerateStaticFieldLookup(field, TokenPos()); | 7272 access = GenerateStaticFieldLookup(field, TokenPos()); |
| 7296 } | 7273 } |
| 7297 } else { // Not Token::IsAssignmentOperator(CurrentToken()). | 7274 } else { // Not Token::IsAssignmentOperator(CurrentToken()). |
| 7298 if (field.IsNull()) { | 7275 if (field.IsNull()) { |
| 7299 // No field, check if we have an explicit getter function. | 7276 // No field, check if we have an explicit getter function. |
| 7300 const String& getter_name = | 7277 const String& getter_name = |
| 7301 String::ZoneHandle(Field::GetterName(field_name)); | 7278 String::ZoneHandle(Field::GetterName(field_name)); |
| 7302 const int kNumArguments = 0; // no arguments. | 7279 const int kNumArguments = 0; // no arguments. |
| 7303 const Array& kNoArgumentNames = Array::Handle(); | |
| 7304 func = Resolver::ResolveStatic(cls, | 7280 func = Resolver::ResolveStatic(cls, |
| 7305 getter_name, | 7281 getter_name, |
| 7306 kNumArguments, | 7282 kNumArguments, |
| 7307 kNoArgumentNames, | 7283 Object::empty_array(), |
| 7308 Resolver::kIsQualified); | 7284 Resolver::kIsQualified); |
| 7309 if (func.IsNull()) { | 7285 if (func.IsNull()) { |
| 7310 // We might be referring to an implicit closure, check to see if | 7286 // We might be referring to an implicit closure, check to see if |
| 7311 // there is a function of the same name. | 7287 // there is a function of the same name. |
| 7312 func = cls.LookupStaticFunction(field_name); | 7288 func = cls.LookupStaticFunction(field_name); |
| 7313 if (func.IsNull()) { | 7289 if (func.IsNull()) { |
| 7314 // No field or explicit getter function, throw a NoSuchMethodError. | 7290 // No field or explicit getter function, throw a NoSuchMethodError. |
| 7315 return ThrowNoSuchMethodError(ident_pos, cls, field_name); | 7291 return ThrowNoSuchMethodError(ident_pos, cls, field_name); |
| 7316 } | 7292 } |
| 7317 access = CreateImplicitClosureNode(func, call_pos, NULL); | 7293 access = CreateImplicitClosureNode(func, call_pos, NULL); |
| (...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7717 // Returns true if ident resolves to a formal parameter of the current function | 7693 // Returns true if ident resolves to a formal parameter of the current function |
| 7718 // or of one of its enclosing functions. | 7694 // or of one of its enclosing functions. |
| 7719 // Make sure not to capture the formal parameter, since it is not accessed. | 7695 // Make sure not to capture the formal parameter, since it is not accessed. |
| 7720 bool Parser::IsFormalParameter(const String& ident, | 7696 bool Parser::IsFormalParameter(const String& ident, |
| 7721 Function* owner_function, | 7697 Function* owner_function, |
| 7722 LocalScope** owner_scope, | 7698 LocalScope** owner_scope, |
| 7723 intptr_t* local_index) { | 7699 intptr_t* local_index) { |
| 7724 if (current_block_ == NULL) { | 7700 if (current_block_ == NULL) { |
| 7725 return false; | 7701 return false; |
| 7726 } | 7702 } |
| 7727 if (ident.Equals(Symbols::ThisHandle())) { | 7703 if (ident.Equals(Symbols::This())) { |
| 7728 // 'this' is not a formal parameter. | 7704 // 'this' is not a formal parameter. |
| 7729 return false; | 7705 return false; |
| 7730 } | 7706 } |
| 7731 // Since an argument definition test does not use the value of the formal | 7707 // Since an argument definition test does not use the value of the formal |
| 7732 // parameter, there is no reason to capture it. | 7708 // parameter, there is no reason to capture it. |
| 7733 const bool kTestOnly = true; // No capturing. | 7709 const bool kTestOnly = true; // No capturing. |
| 7734 LocalVariable* local = | 7710 LocalVariable* local = |
| 7735 current_block_->scope->LookupVariable(ident, kTestOnly); | 7711 current_block_->scope->LookupVariable(ident, kTestOnly); |
| 7736 if (local == NULL) { | 7712 if (local == NULL) { |
| 7737 if (!current_function().IsLocalFunction()) { | 7713 if (!current_function().IsLocalFunction()) { |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7873 // This field has not been referenced yet and thus the value has | 7849 // This field has not been referenced yet and thus the value has |
| 7874 // not been evaluated. If the field is const, call the static getter method | 7850 // not been evaluated. If the field is const, call the static getter method |
| 7875 // to evaluate the expression and canonicalize the value. | 7851 // to evaluate the expression and canonicalize the value. |
| 7876 if (field.is_const()) { | 7852 if (field.is_const()) { |
| 7877 field.set_value(Object::transition_sentinel()); | 7853 field.set_value(Object::transition_sentinel()); |
| 7878 const String& field_name = String::Handle(field.name()); | 7854 const String& field_name = String::Handle(field.name()); |
| 7879 const String& getter_name = | 7855 const String& getter_name = |
| 7880 String::Handle(Field::GetterName(field_name)); | 7856 String::Handle(Field::GetterName(field_name)); |
| 7881 const Class& cls = Class::Handle(field.owner()); | 7857 const Class& cls = Class::Handle(field.owner()); |
| 7882 const int kNumArguments = 0; // no arguments. | 7858 const int kNumArguments = 0; // no arguments. |
| 7883 const Array& kNoArgumentNames = Array::Handle(); | |
| 7884 const Function& func = | 7859 const Function& func = |
| 7885 Function::Handle(Resolver::ResolveStatic(cls, | 7860 Function::Handle(Resolver::ResolveStatic(cls, |
| 7886 getter_name, | 7861 getter_name, |
| 7887 kNumArguments, | 7862 kNumArguments, |
| 7888 kNoArgumentNames, | 7863 Object::empty_array(), |
| 7889 Resolver::kIsQualified)); | 7864 Resolver::kIsQualified)); |
| 7890 ASSERT(!func.IsNull()); | 7865 ASSERT(!func.IsNull()); |
| 7891 ASSERT(func.kind() == RawFunction::kConstImplicitGetter); | 7866 ASSERT(func.kind() == RawFunction::kConstImplicitGetter); |
| 7892 Object& const_value = Object::Handle( | 7867 Object& const_value = Object::Handle( |
| 7893 DartEntry::InvokeStatic(func, Object::empty_array())); | 7868 DartEntry::InvokeStatic(func, Object::empty_array())); |
| 7894 if (const_value.IsError()) { | 7869 if (const_value.IsError()) { |
| 7895 const Error& error = Error::Cast(const_value); | 7870 const Error& error = Error::Cast(const_value); |
| 7896 if (error.IsUnhandledException()) { | 7871 if (error.IsUnhandledException()) { |
| 7897 field.set_value(Instance::Handle()); | 7872 field.set_value(Instance::Handle()); |
| 7898 // It is a compile-time error if evaluation of a compile-time constant | 7873 // It is a compile-time error if evaluation of a compile-time constant |
| (...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8529 Type& type = Type::ZoneHandle( | 8504 Type& type = Type::ZoneHandle( |
| 8530 Type::New(array_class, type_arguments, type_pos)); | 8505 Type::New(array_class, type_arguments, type_pos)); |
| 8531 type ^= ClassFinalizer::FinalizeType( | 8506 type ^= ClassFinalizer::FinalizeType( |
| 8532 current_class(), type, ClassFinalizer::kCanonicalize); | 8507 current_class(), type, ClassFinalizer::kCanonicalize); |
| 8533 ArrayNode* list = new ArrayNode(TokenPos(), type); | 8508 ArrayNode* list = new ArrayNode(TokenPos(), type); |
| 8534 | 8509 |
| 8535 // Parse the list elements. Note: there may be an optional extra | 8510 // Parse the list elements. Note: there may be an optional extra |
| 8536 // comma after the last element. | 8511 // comma after the last element. |
| 8537 if (!is_empty_literal) { | 8512 if (!is_empty_literal) { |
| 8538 const bool saved_mode = SetAllowFunctionLiterals(true); | 8513 const bool saved_mode = SetAllowFunctionLiterals(true); |
| 8539 const String& dst_name = String::ZoneHandle(Symbols::ListLiteralElement()); | |
| 8540 while (CurrentToken() != Token::kRBRACK) { | 8514 while (CurrentToken() != Token::kRBRACK) { |
| 8541 const intptr_t element_pos = TokenPos(); | 8515 const intptr_t element_pos = TokenPos(); |
| 8542 AstNode* element = ParseExpr(is_const, kConsumeCascades); | 8516 AstNode* element = ParseExpr(is_const, kConsumeCascades); |
| 8543 if (FLAG_enable_type_checks && | 8517 if (FLAG_enable_type_checks && |
| 8544 !is_const && | 8518 !is_const && |
| 8545 !element_type.IsDynamicType()) { | 8519 !element_type.IsDynamicType()) { |
| 8546 element = new AssignableNode(element_pos, | 8520 element = new AssignableNode(element_pos, |
| 8547 element, | 8521 element, |
| 8548 element_type, | 8522 element_type, |
| 8549 dst_name); | 8523 Symbols::ListLiteralElement()); |
| 8550 } | 8524 } |
| 8551 list->AddElement(element); | 8525 list->AddElement(element); |
| 8552 if (CurrentToken() == Token::kCOMMA) { | 8526 if (CurrentToken() == Token::kCOMMA) { |
| 8553 ConsumeToken(); | 8527 ConsumeToken(); |
| 8554 } else if (CurrentToken() != Token::kRBRACK) { | 8528 } else if (CurrentToken() != Token::kRBRACK) { |
| 8555 ErrorMsg("comma or ']' expected"); | 8529 ErrorMsg("comma or ']' expected"); |
| 8556 } | 8530 } |
| 8557 } | 8531 } |
| 8558 ExpectToken(Token::kRBRACK); | 8532 ExpectToken(Token::kRBRACK); |
| 8559 SetAllowFunctionLiterals(saved_mode); | 8533 SetAllowFunctionLiterals(saved_mode); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 8586 String::Handle(element_type.UserVisibleName()).ToCString()); | 8560 String::Handle(element_type.UserVisibleName()).ToCString()); |
| 8587 } | 8561 } |
| 8588 } | 8562 } |
| 8589 const_list.SetAt(i, elem->AsLiteralNode()->literal()); | 8563 const_list.SetAt(i, elem->AsLiteralNode()->literal()); |
| 8590 } | 8564 } |
| 8591 const_list ^= const_list.Canonicalize(); | 8565 const_list ^= const_list.Canonicalize(); |
| 8592 const_list.MakeImmutable(); | 8566 const_list.MakeImmutable(); |
| 8593 return new LiteralNode(literal_pos, const_list); | 8567 return new LiteralNode(literal_pos, const_list); |
| 8594 } else { | 8568 } else { |
| 8595 // Factory call at runtime. | 8569 // Factory call at runtime. |
| 8596 String& factory_class_name = String::Handle(Symbols::List()); | |
| 8597 const Class& factory_class = | 8570 const Class& factory_class = |
| 8598 Class::Handle(LookupCoreClass(factory_class_name)); | 8571 Class::Handle(LookupCoreClass(Symbols::List())); |
| 8599 ASSERT(!factory_class.IsNull()); | 8572 ASSERT(!factory_class.IsNull()); |
| 8600 const String& factory_method_name = | |
| 8601 String::Handle(Symbols::ListLiteralFactory()); | |
| 8602 const Function& factory_method = Function::ZoneHandle( | 8573 const Function& factory_method = Function::ZoneHandle( |
| 8603 factory_class.LookupFactory(factory_method_name)); | 8574 factory_class.LookupFactory(Symbols::ListLiteralFactory())); |
| 8604 ASSERT(!factory_method.IsNull()); | 8575 ASSERT(!factory_method.IsNull()); |
| 8605 if (!type_arguments.IsNull() && | 8576 if (!type_arguments.IsNull() && |
| 8606 !type_arguments.IsInstantiated() && | 8577 !type_arguments.IsInstantiated() && |
| 8607 (current_block_->scope->function_level() > 0)) { | 8578 (current_block_->scope->function_level() > 0)) { |
| 8608 // Make sure that the instantiator is captured. | 8579 // Make sure that the instantiator is captured. |
| 8609 CaptureInstantiator(); | 8580 CaptureInstantiator(); |
| 8610 } | 8581 } |
| 8611 AbstractTypeArguments& factory_type_args = | 8582 AbstractTypeArguments& factory_type_args = |
| 8612 AbstractTypeArguments::ZoneHandle(type_arguments.raw()); | 8583 AbstractTypeArguments::ZoneHandle(type_arguments.raw()); |
| 8613 // If the factory class extends other parameterized classes, adjust the | 8584 // If the factory class extends other parameterized classes, adjust the |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8725 ASSERT(map_type_arguments.IsNull() || (map_type_arguments.Length() == 2)); | 8696 ASSERT(map_type_arguments.IsNull() || (map_type_arguments.Length() == 2)); |
| 8726 map_type_arguments ^= map_type_arguments.Canonicalize(); | 8697 map_type_arguments ^= map_type_arguments.Canonicalize(); |
| 8727 | 8698 |
| 8728 // The kv_pair array is temporary and of element type dynamic. It is passed | 8699 // The kv_pair array is temporary and of element type dynamic. It is passed |
| 8729 // to the factory to initialize a properly typed map. | 8700 // to the factory to initialize a properly typed map. |
| 8730 ArrayNode* kv_pairs = new ArrayNode( | 8701 ArrayNode* kv_pairs = new ArrayNode( |
| 8731 TokenPos(), Type::ZoneHandle(Type::ArrayType())); | 8702 TokenPos(), Type::ZoneHandle(Type::ArrayType())); |
| 8732 | 8703 |
| 8733 // Parse the map entries. Note: there may be an optional extra | 8704 // Parse the map entries. Note: there may be an optional extra |
| 8734 // comma after the last entry. | 8705 // comma after the last entry. |
| 8735 const String& dst_name = String::ZoneHandle(Symbols::ListLiteralElement()); | |
| 8736 while (CurrentToken() != Token::kRBRACE) { | 8706 while (CurrentToken() != Token::kRBRACE) { |
| 8737 AstNode* key = NULL; | 8707 AstNode* key = NULL; |
| 8738 if (CurrentToken() == Token::kSTRING) { | 8708 if (CurrentToken() == Token::kSTRING) { |
| 8739 key = ParseStringLiteral(); | 8709 key = ParseStringLiteral(); |
| 8740 } | 8710 } |
| 8741 if (key == NULL) { | 8711 if (key == NULL) { |
| 8742 ErrorMsg("map entry key must be string literal"); | 8712 ErrorMsg("map entry key must be string literal"); |
| 8743 } else if (is_const && !key->IsLiteralNode()) { | 8713 } else if (is_const && !key->IsLiteralNode()) { |
| 8744 ErrorMsg("map entry key must be compile-time constant string"); | 8714 ErrorMsg("map entry key must be compile-time constant string"); |
| 8745 } | 8715 } |
| 8746 ExpectToken(Token::kCOLON); | 8716 ExpectToken(Token::kCOLON); |
| 8747 const bool saved_mode = SetAllowFunctionLiterals(true); | 8717 const bool saved_mode = SetAllowFunctionLiterals(true); |
| 8748 const intptr_t value_pos = TokenPos(); | 8718 const intptr_t value_pos = TokenPos(); |
| 8749 AstNode* value = ParseExpr(is_const, kConsumeCascades); | 8719 AstNode* value = ParseExpr(is_const, kConsumeCascades); |
| 8750 SetAllowFunctionLiterals(saved_mode); | 8720 SetAllowFunctionLiterals(saved_mode); |
| 8751 if (FLAG_enable_type_checks && | 8721 if (FLAG_enable_type_checks && |
| 8752 !is_const && | 8722 !is_const && |
| 8753 !value_type.IsDynamicType()) { | 8723 !value_type.IsDynamicType()) { |
| 8754 value = new AssignableNode(value_pos, | 8724 value = new AssignableNode(value_pos, |
| 8755 value, | 8725 value, |
| 8756 value_type, | 8726 value_type, |
| 8757 dst_name); | 8727 Symbols::ListLiteralElement()); |
| 8758 } | 8728 } |
| 8759 AddKeyValuePair(kv_pairs, is_const, key, value); | 8729 AddKeyValuePair(kv_pairs, is_const, key, value); |
| 8760 | 8730 |
| 8761 if (CurrentToken() == Token::kCOMMA) { | 8731 if (CurrentToken() == Token::kCOMMA) { |
| 8762 ConsumeToken(); | 8732 ConsumeToken(); |
| 8763 } else if (CurrentToken() != Token::kRBRACE) { | 8733 } else if (CurrentToken() != Token::kRBRACE) { |
| 8764 ErrorMsg("comma or '}' expected"); | 8734 ErrorMsg("comma or '}' expected"); |
| 8765 } | 8735 } |
| 8766 } | 8736 } |
| 8767 ASSERT(kv_pairs->length() % 2 == 0); | 8737 ASSERT(kv_pairs->length() % 2 == 0); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 8796 i >> 1, | 8766 i >> 1, |
| 8797 String::Handle(value_type.UserVisibleName()).ToCString()); | 8767 String::Handle(value_type.UserVisibleName()).ToCString()); |
| 8798 } | 8768 } |
| 8799 } | 8769 } |
| 8800 key_value_array.SetAt(i, arg->AsLiteralNode()->literal()); | 8770 key_value_array.SetAt(i, arg->AsLiteralNode()->literal()); |
| 8801 } | 8771 } |
| 8802 key_value_array ^= key_value_array.Canonicalize(); | 8772 key_value_array ^= key_value_array.Canonicalize(); |
| 8803 key_value_array.MakeImmutable(); | 8773 key_value_array.MakeImmutable(); |
| 8804 | 8774 |
| 8805 // Construct the map object. | 8775 // Construct the map object. |
| 8806 const String& immutable_map_class_name = | |
| 8807 String::Handle(Symbols::ImmutableMap()); | |
| 8808 const Class& immutable_map_class = | 8776 const Class& immutable_map_class = |
| 8809 Class::Handle(LookupCoreClass(immutable_map_class_name)); | 8777 Class::Handle(LookupCoreClass(Symbols::ImmutableMap())); |
| 8810 ASSERT(!immutable_map_class.IsNull()); | 8778 ASSERT(!immutable_map_class.IsNull()); |
| 8811 // If the immutable map class extends other parameterized classes, we need | 8779 // If the immutable map class extends other parameterized classes, we need |
| 8812 // to adjust the type argument vector. This is currently not the case. | 8780 // to adjust the type argument vector. This is currently not the case. |
| 8813 ASSERT(immutable_map_class.NumTypeArguments() == 2); | 8781 ASSERT(immutable_map_class.NumTypeArguments() == 2); |
| 8814 ArgumentListNode* constr_args = new ArgumentListNode(TokenPos()); | 8782 ArgumentListNode* constr_args = new ArgumentListNode(TokenPos()); |
| 8815 constr_args->Add(new LiteralNode(literal_pos, key_value_array)); | 8783 constr_args->Add(new LiteralNode(literal_pos, key_value_array)); |
| 8816 const String& constr_name = | 8784 const Function& map_constr = |
| 8817 String::Handle(Symbols::ImmutableMapConstructor()); | 8785 Function::ZoneHandle(immutable_map_class.LookupConstructor( |
| 8818 const Function& map_constr = Function::ZoneHandle( | 8786 Symbols::ImmutableMapConstructor())); |
| 8819 immutable_map_class.LookupConstructor(constr_name)); | |
| 8820 ASSERT(!map_constr.IsNull()); | 8787 ASSERT(!map_constr.IsNull()); |
| 8821 const Object& constructor_result = Object::Handle( | 8788 const Object& constructor_result = Object::Handle( |
| 8822 EvaluateConstConstructorCall(immutable_map_class, | 8789 EvaluateConstConstructorCall(immutable_map_class, |
| 8823 map_type_arguments, | 8790 map_type_arguments, |
| 8824 map_constr, | 8791 map_constr, |
| 8825 constr_args)); | 8792 constr_args)); |
| 8826 if (constructor_result.IsUnhandledException()) { | 8793 if (constructor_result.IsUnhandledException()) { |
| 8827 return GenerateRethrow(literal_pos, constructor_result); | 8794 return GenerateRethrow(literal_pos, constructor_result); |
| 8828 } else { | 8795 } else { |
| 8829 const Instance& const_instance = Instance::Cast(constructor_result); | 8796 const Instance& const_instance = Instance::Cast(constructor_result); |
| 8830 return new LiteralNode(literal_pos, | 8797 return new LiteralNode(literal_pos, |
| 8831 Instance::ZoneHandle(const_instance.raw())); | 8798 Instance::ZoneHandle(const_instance.raw())); |
| 8832 } | 8799 } |
| 8833 } else { | 8800 } else { |
| 8834 // Factory call at runtime. | 8801 // Factory call at runtime. |
| 8835 String& factory_class_name = String::Handle(Symbols::Map()); | |
| 8836 const Class& factory_class = | 8802 const Class& factory_class = |
| 8837 Class::Handle(LookupCoreClass(factory_class_name)); | 8803 Class::Handle(LookupCoreClass(Symbols::Map())); |
| 8838 ASSERT(!factory_class.IsNull()); | 8804 ASSERT(!factory_class.IsNull()); |
| 8839 const String& factory_method_name = | |
| 8840 String::Handle(Symbols::MapLiteralFactory()); | |
| 8841 const Function& factory_method = Function::ZoneHandle( | 8805 const Function& factory_method = Function::ZoneHandle( |
| 8842 factory_class.LookupFactory(factory_method_name)); | 8806 factory_class.LookupFactory(Symbols::MapLiteralFactory())); |
| 8843 ASSERT(!factory_method.IsNull()); | 8807 ASSERT(!factory_method.IsNull()); |
| 8844 if (!map_type_arguments.IsNull() && | 8808 if (!map_type_arguments.IsNull() && |
| 8845 !map_type_arguments.IsInstantiated() && | 8809 !map_type_arguments.IsInstantiated() && |
| 8846 (current_block_->scope->function_level() > 0)) { | 8810 (current_block_->scope->function_level() > 0)) { |
| 8847 // Make sure that the instantiator is captured. | 8811 // Make sure that the instantiator is captured. |
| 8848 CaptureInstantiator(); | 8812 CaptureInstantiator(); |
| 8849 } | 8813 } |
| 8850 AbstractTypeArguments& factory_type_args = | 8814 AbstractTypeArguments& factory_type_args = |
| 8851 AbstractTypeArguments::ZoneHandle(map_type_arguments.raw()); | 8815 AbstractTypeArguments::ZoneHandle(map_type_arguments.raw()); |
| 8852 // If the factory class extends other parameterized classes, adjust the | 8816 // If the factory class extends other parameterized classes, adjust the |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8901 } | 8865 } |
| 8902 | 8866 |
| 8903 | 8867 |
| 8904 static const String& BuildConstructorName(const String& type_class_name, | 8868 static const String& BuildConstructorName(const String& type_class_name, |
| 8905 const String* named_constructor) { | 8869 const String* named_constructor) { |
| 8906 // By convention, the static function implementing a named constructor 'C' | 8870 // By convention, the static function implementing a named constructor 'C' |
| 8907 // for class 'A' is labeled 'A.C', and the static function implementing the | 8871 // for class 'A' is labeled 'A.C', and the static function implementing the |
| 8908 // unnamed constructor for class 'A' is labeled 'A.'. | 8872 // unnamed constructor for class 'A' is labeled 'A.'. |
| 8909 // This convention prevents users from explicitly calling constructors. | 8873 // This convention prevents users from explicitly calling constructors. |
| 8910 String& constructor_name = | 8874 String& constructor_name = |
| 8911 String::Handle(String::Concat(type_class_name, Symbols::DotHandle())); | 8875 String::Handle(String::Concat(type_class_name, Symbols::Dot())); |
| 8912 if (named_constructor != NULL) { | 8876 if (named_constructor != NULL) { |
| 8913 constructor_name = String::Concat(constructor_name, *named_constructor); | 8877 constructor_name = String::Concat(constructor_name, *named_constructor); |
| 8914 } | 8878 } |
| 8915 return constructor_name; | 8879 return constructor_name; |
| 8916 } | 8880 } |
| 8917 | 8881 |
| 8918 | 8882 |
| 8919 AstNode* Parser::ParseNewOperator() { | 8883 AstNode* Parser::ParseNewOperator() { |
| 8920 TRACE_PARSER("ParseNewOperator"); | 8884 TRACE_PARSER("ParseNewOperator"); |
| 8921 const intptr_t new_pos = TokenPos(); | 8885 const intptr_t new_pos = TokenPos(); |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9044 | 9008 |
| 9045 // It is ok to call a factory method of an abstract class, but it is | 9009 // It is ok to call a factory method of an abstract class, but it is |
| 9046 // a dynamic error to instantiate an abstract class. | 9010 // a dynamic error to instantiate an abstract class. |
| 9047 ASSERT(!constructor.IsNull()); | 9011 ASSERT(!constructor.IsNull()); |
| 9048 if (type_class.is_abstract() && !constructor.IsFactory()) { | 9012 if (type_class.is_abstract() && !constructor.IsFactory()) { |
| 9049 ArgumentListNode* arguments = new ArgumentListNode(type_pos); | 9013 ArgumentListNode* arguments = new ArgumentListNode(type_pos); |
| 9050 arguments->Add(new LiteralNode( | 9014 arguments->Add(new LiteralNode( |
| 9051 TokenPos(), Integer::ZoneHandle(Integer::New(type_pos)))); | 9015 TokenPos(), Integer::ZoneHandle(Integer::New(type_pos)))); |
| 9052 arguments->Add(new LiteralNode( | 9016 arguments->Add(new LiteralNode( |
| 9053 TokenPos(), String::ZoneHandle(type_class_name.raw()))); | 9017 TokenPos(), String::ZoneHandle(type_class_name.raw()))); |
| 9054 const String& cls_name = | 9018 return MakeStaticCall(Symbols::AbstractClassInstantiationError(), |
| 9055 String::Handle(Symbols::AbstractClassInstantiationError()); | 9019 Symbols::ThrowNew(), |
| 9056 const String& func_name = String::Handle(Symbols::ThrowNew()); | 9020 arguments); |
| 9057 return MakeStaticCall(cls_name, func_name, arguments); | |
| 9058 } | 9021 } |
| 9059 String& error_message = String::Handle(); | 9022 String& error_message = String::Handle(); |
| 9060 if (!constructor.AreValidArguments(arguments_length, | 9023 if (!constructor.AreValidArguments(arguments_length, |
| 9061 arguments->names(), | 9024 arguments->names(), |
| 9062 &error_message)) { | 9025 &error_message)) { |
| 9063 const String& external_constructor_name = | 9026 const String& external_constructor_name = |
| 9064 (named_constructor ? constructor_name : type_class_name); | 9027 (named_constructor ? constructor_name : type_class_name); |
| 9065 if (is_const) { | 9028 if (is_const) { |
| 9066 ErrorMsg(call_pos, | 9029 ErrorMsg(call_pos, |
| 9067 "invalid arguments passed to constructor '%s' " | 9030 "invalid arguments passed to constructor '%s' " |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9128 (current_block_->scope->function_level() > 0)) { | 9091 (current_block_->scope->function_level() > 0)) { |
| 9129 // Make sure that the instantiator is captured. | 9092 // Make sure that the instantiator is captured. |
| 9130 CaptureInstantiator(); | 9093 CaptureInstantiator(); |
| 9131 } | 9094 } |
| 9132 // If the type argument vector is not instantiated, we verify in checked | 9095 // If the type argument vector is not instantiated, we verify in checked |
| 9133 // mode at runtime that it is within its declared bounds. | 9096 // mode at runtime that it is within its declared bounds. |
| 9134 new_object = CreateConstructorCallNode( | 9097 new_object = CreateConstructorCallNode( |
| 9135 new_pos, type_arguments, constructor, arguments); | 9098 new_pos, type_arguments, constructor, arguments); |
| 9136 } | 9099 } |
| 9137 if (!type_bound.IsNull()) { | 9100 if (!type_bound.IsNull()) { |
| 9138 const String& dst_name = String::ZoneHandle(Symbols::FactoryResult()); | 9101 new_object = new AssignableNode(new_pos, |
| 9139 new_object = new AssignableNode(new_pos, new_object, type_bound, dst_name); | 9102 new_object, |
| 9103 type_bound, |
| 9104 Symbols::FactoryResult()); |
| 9140 } | 9105 } |
| 9141 return new_object; | 9106 return new_object; |
| 9142 } | 9107 } |
| 9143 | 9108 |
| 9144 | 9109 |
| 9145 String& Parser::Interpolate(ArrayNode* values) { | 9110 String& Parser::Interpolate(ArrayNode* values) { |
| 9146 const String& class_name = String::Handle(Symbols::StringBase()); | 9111 const Class& cls = Class::Handle(LookupCoreClass(Symbols::StringBase())); |
| 9147 const Class& cls = Class::Handle(LookupCoreClass(class_name)); | |
| 9148 ASSERT(!cls.IsNull()); | 9112 ASSERT(!cls.IsNull()); |
| 9149 const String& func_name = String::Handle(Symbols::Interpolate()); | |
| 9150 const Function& func = | 9113 const Function& func = |
| 9151 Function::Handle(cls.LookupStaticFunction(func_name)); | 9114 Function::Handle(cls.LookupStaticFunction(Symbols::Interpolate())); |
| 9152 ASSERT(!func.IsNull()); | 9115 ASSERT(!func.IsNull()); |
| 9153 | 9116 |
| 9154 // Build the array of literal values to interpolate. | 9117 // Build the array of literal values to interpolate. |
| 9155 const Array& value_arr = Array::Handle(Array::New(values->length())); | 9118 const Array& value_arr = Array::Handle(Array::New(values->length())); |
| 9156 for (int i = 0; i < values->length(); i++) { | 9119 for (int i = 0; i < values->length(); i++) { |
| 9157 ASSERT(values->ElementAt(i)->IsLiteralNode()); | 9120 ASSERT(values->ElementAt(i)->IsLiteralNode()); |
| 9158 value_arr.SetAt(i, values->ElementAt(i)->AsLiteralNode()->literal()); | 9121 value_arr.SetAt(i, values->ElementAt(i)->AsLiteralNode()->literal()); |
| 9159 } | 9122 } |
| 9160 | 9123 |
| 9161 // Build argument array to pass to the interpolation function. | 9124 // Build argument array to pass to the interpolation function. |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9232 } | 9195 } |
| 9233 values->AddElement(expr); | 9196 values->AddElement(expr); |
| 9234 } | 9197 } |
| 9235 } | 9198 } |
| 9236 if (is_compiletime_const) { | 9199 if (is_compiletime_const) { |
| 9237 primary = new LiteralNode(literal_start, Interpolate(values)); | 9200 primary = new LiteralNode(literal_start, Interpolate(values)); |
| 9238 } else { | 9201 } else { |
| 9239 ArgumentListNode* interpolate_arg = | 9202 ArgumentListNode* interpolate_arg = |
| 9240 new ArgumentListNode(values->token_pos()); | 9203 new ArgumentListNode(values->token_pos()); |
| 9241 interpolate_arg->Add(values); | 9204 interpolate_arg->Add(values); |
| 9242 const String& cls_name = String::Handle(Symbols::StringBase()); | 9205 primary = MakeStaticCall(Symbols::StringBase(), |
| 9243 const String& func_name = String::Handle(Symbols::Interpolate()); | 9206 Symbols::Interpolate(), |
| 9244 primary = MakeStaticCall(cls_name, func_name, interpolate_arg); | 9207 interpolate_arg); |
| 9245 } | 9208 } |
| 9246 return primary; | 9209 return primary; |
| 9247 } | 9210 } |
| 9248 | 9211 |
| 9249 | 9212 |
| 9250 AstNode* Parser::ParseArgumentDefinitionTest() { | 9213 AstNode* Parser::ParseArgumentDefinitionTest() { |
| 9251 const intptr_t test_pos = TokenPos(); | 9214 const intptr_t test_pos = TokenPos(); |
| 9252 ConsumeToken(); | 9215 ConsumeToken(); |
| 9253 const intptr_t ident_pos = TokenPos(); | 9216 const intptr_t ident_pos = TokenPos(); |
| 9254 String* ident = ExpectIdentifier("parameter name expected"); | 9217 String* ident = ExpectIdentifier("parameter name expected"); |
| 9255 Function& owner_function = Function::Handle(); | 9218 Function& owner_function = Function::Handle(); |
| 9256 LocalScope* owner_scope; | 9219 LocalScope* owner_scope; |
| 9257 intptr_t param_index; | 9220 intptr_t param_index; |
| 9258 if (!IsFormalParameter(*ident, &owner_function, &owner_scope, ¶m_index)) { | 9221 if (!IsFormalParameter(*ident, &owner_function, &owner_scope, ¶m_index)) { |
| 9259 ErrorMsg(ident_pos, "formal parameter name expected"); | 9222 ErrorMsg(ident_pos, "formal parameter name expected"); |
| 9260 } | 9223 } |
| 9261 if (param_index < owner_function.num_fixed_parameters()) { | 9224 if (param_index < owner_function.num_fixed_parameters()) { |
| 9262 // The formal parameter is not optional, therefore the corresponding | 9225 // The formal parameter is not optional, therefore the corresponding |
| 9263 // argument is always passed and defined. | 9226 // argument is always passed and defined. |
| 9264 return new LiteralNode(test_pos, Bool::ZoneHandle(Bool::True())); | 9227 return new LiteralNode(test_pos, Bool::ZoneHandle(Bool::True())); |
| 9265 } | 9228 } |
| 9266 char name[64]; | 9229 char name[64]; |
| 9267 OS::SNPrint(name, 64, "%s_%"Pd"", | 9230 OS::SNPrint(name, 64, "%s_%"Pd"", |
| 9268 Symbols::Name(Symbols::kSavedArgDescVarPrefix), | 9231 Symbols::Name(Symbols::kSavedArgDescVarPrefixId), |
| 9269 owner_function.token_pos()); | 9232 owner_function.token_pos()); |
| 9270 const String& saved_args_desc_name = String::ZoneHandle(Symbols::New(name)); | 9233 const String& saved_args_desc_name = String::ZoneHandle(Symbols::New(name)); |
| 9271 LocalVariable* saved_args_desc_var = LookupLocalScope(saved_args_desc_name); | 9234 LocalVariable* saved_args_desc_var = LookupLocalScope(saved_args_desc_name); |
| 9272 if (saved_args_desc_var == NULL) { | 9235 if (saved_args_desc_var == NULL) { |
| 9273 ASSERT(owner_scope != NULL); | 9236 ASSERT(owner_scope != NULL); |
| 9274 saved_args_desc_var = | 9237 saved_args_desc_var = |
| 9275 new LocalVariable(owner_function.token_pos(), | 9238 new LocalVariable(owner_function.token_pos(), |
| 9276 saved_args_desc_name, | 9239 saved_args_desc_name, |
| 9277 Type::ZoneHandle(Type::ArrayType())); | 9240 Type::ZoneHandle(Type::ArrayType())); |
| 9278 saved_args_desc_var->set_is_final(); | 9241 saved_args_desc_var->set_is_final(); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9337 } else { | 9300 } else { |
| 9338 // This is a qualified identifier with a library prefix so resolve | 9301 // This is a qualified identifier with a library prefix so resolve |
| 9339 // the identifier locally in that library (we do not include the | 9302 // the identifier locally in that library (we do not include the |
| 9340 // libraries imported by that library). | 9303 // libraries imported by that library). |
| 9341 primary = ResolveIdentInPrefixScope(qual_ident.ident_pos, | 9304 primary = ResolveIdentInPrefixScope(qual_ident.ident_pos, |
| 9342 *qual_ident.lib_prefix, | 9305 *qual_ident.lib_prefix, |
| 9343 *qual_ident.ident); | 9306 *qual_ident.ident); |
| 9344 } | 9307 } |
| 9345 ASSERT(primary != NULL); | 9308 ASSERT(primary != NULL); |
| 9346 } else if (CurrentToken() == Token::kTHIS) { | 9309 } else if (CurrentToken() == Token::kTHIS) { |
| 9347 LocalVariable* local = LookupLocalScope(Symbols::ThisHandle()); | 9310 LocalVariable* local = LookupLocalScope(Symbols::This()); |
| 9348 if (local == NULL) { | 9311 if (local == NULL) { |
| 9349 ErrorMsg("receiver 'this' is not in scope"); | 9312 ErrorMsg("receiver 'this' is not in scope"); |
| 9350 } | 9313 } |
| 9351 primary = new LoadLocalNode(TokenPos(), local); | 9314 primary = new LoadLocalNode(TokenPos(), local); |
| 9352 ConsumeToken(); | 9315 ConsumeToken(); |
| 9353 } else if (CurrentToken() == Token::kINTEGER) { | 9316 } else if (CurrentToken() == Token::kINTEGER) { |
| 9354 const Integer& literal = Integer::ZoneHandle(CurrentIntegerLiteral()); | 9317 const Integer& literal = Integer::ZoneHandle(CurrentIntegerLiteral()); |
| 9355 primary = new LiteralNode(TokenPos(), literal); | 9318 primary = new LiteralNode(TokenPos(), literal); |
| 9356 ConsumeToken(); | 9319 ConsumeToken(); |
| 9357 } else if (CurrentToken() == Token::kTRUE) { | 9320 } else if (CurrentToken() == Token::kTRUE) { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9409 if (CurrentToken() == Token::kLPAREN) { | 9372 if (CurrentToken() == Token::kLPAREN) { |
| 9410 primary = ParseSuperCall(ident); | 9373 primary = ParseSuperCall(ident); |
| 9411 } else { | 9374 } else { |
| 9412 primary = ParseSuperFieldAccess(ident); | 9375 primary = ParseSuperFieldAccess(ident); |
| 9413 } | 9376 } |
| 9414 } else if ((CurrentToken() == Token::kLBRACK) || | 9377 } else if ((CurrentToken() == Token::kLBRACK) || |
| 9415 Token::CanBeOverloaded(CurrentToken()) || | 9378 Token::CanBeOverloaded(CurrentToken()) || |
| 9416 (CurrentToken() == Token::kNE)) { | 9379 (CurrentToken() == Token::kNE)) { |
| 9417 primary = ParseSuperOperator(); | 9380 primary = ParseSuperOperator(); |
| 9418 } else { | 9381 } else { |
| 9419 primary = new PrimaryNode(TokenPos(), | 9382 primary = new PrimaryNode(TokenPos(), Symbols::Super()); |
| 9420 String::ZoneHandle(Symbols::Super())); | |
| 9421 } | 9383 } |
| 9422 } else if (CurrentToken() == Token::kCONDITIONAL) { | 9384 } else if (CurrentToken() == Token::kCONDITIONAL) { |
| 9423 primary = ParseArgumentDefinitionTest(); | 9385 primary = ParseArgumentDefinitionTest(); |
| 9424 } else { | 9386 } else { |
| 9425 UnexpectedToken(); | 9387 UnexpectedToken(); |
| 9426 } | 9388 } |
| 9427 return primary; | 9389 return primary; |
| 9428 } | 9390 } |
| 9429 | 9391 |
| 9430 | 9392 |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9736 void Parser::SkipQualIdent() { | 9698 void Parser::SkipQualIdent() { |
| 9737 ASSERT(IsIdentifier()); | 9699 ASSERT(IsIdentifier()); |
| 9738 ConsumeToken(); | 9700 ConsumeToken(); |
| 9739 if (CurrentToken() == Token::kPERIOD) { | 9701 if (CurrentToken() == Token::kPERIOD) { |
| 9740 ConsumeToken(); // Consume the kPERIOD token. | 9702 ConsumeToken(); // Consume the kPERIOD token. |
| 9741 ExpectIdentifier("identifier expected after '.'"); | 9703 ExpectIdentifier("identifier expected after '.'"); |
| 9742 } | 9704 } |
| 9743 } | 9705 } |
| 9744 | 9706 |
| 9745 } // namespace dart | 9707 } // namespace dart |
| OLD | NEW |