| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/parser.h" | 5 #include "vm/parser.h" |
| 6 #include "vm/flags.h" | 6 #include "vm/flags.h" |
| 7 | 7 |
| 8 #ifndef DART_PRECOMPILED_RUNTIME | 8 #ifndef DART_PRECOMPILED_RUNTIME |
| 9 | 9 |
| 10 #include "lib/invocation_mirror.h" | 10 #include "lib/invocation_mirror.h" |
| (...skipping 1318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1329 } | 1329 } |
| 1330 expr = GenerateStaticFieldLookup(field, ident_pos); | 1330 expr = GenerateStaticFieldLookup(field, ident_pos); |
| 1331 } | 1331 } |
| 1332 } | 1332 } |
| 1333 if (expr->EvalConstExpr() == NULL) { | 1333 if (expr->EvalConstExpr() == NULL) { |
| 1334 ReportError(expr_pos, "expression must be a compile-time constant"); | 1334 ReportError(expr_pos, "expression must be a compile-time constant"); |
| 1335 } | 1335 } |
| 1336 const Instance& val = EvaluateConstExpr(expr_pos, expr); | 1336 const Instance& val = EvaluateConstExpr(expr_pos, expr); |
| 1337 meta_values.Add(val, Heap::kOld); | 1337 meta_values.Add(val, Heap::kOld); |
| 1338 } | 1338 } |
| 1339 return Array::MakeArray(meta_values); | 1339 return Array::MakeFixedLength(meta_values); |
| 1340 } | 1340 } |
| 1341 | 1341 |
| 1342 | 1342 |
| 1343 SequenceNode* Parser::ParseStaticInitializer() { | 1343 SequenceNode* Parser::ParseStaticInitializer() { |
| 1344 ExpectIdentifier("field name expected"); | 1344 ExpectIdentifier("field name expected"); |
| 1345 CheckToken(Token::kASSIGN, "field initialier expected"); | 1345 CheckToken(Token::kASSIGN, "field initialier expected"); |
| 1346 ConsumeToken(); | 1346 ConsumeToken(); |
| 1347 OpenFunctionBlock(parsed_function()->function()); | 1347 OpenFunctionBlock(parsed_function()->function()); |
| 1348 TokenPosition expr_pos = TokenPos(); | 1348 TokenPosition expr_pos = TokenPos(); |
| 1349 AstNode* expr = ParseExpr(kAllowConst, kConsumeCascades); | 1349 AstNode* expr = ParseExpr(kAllowConst, kConsumeCascades); |
| (...skipping 3617 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4967 ParseClassMemberDefinition(&members, metadata_pos); | 4967 ParseClassMemberDefinition(&members, metadata_pos); |
| 4968 } | 4968 } |
| 4969 ExpectToken(Token::kRBRACE); | 4969 ExpectToken(Token::kRBRACE); |
| 4970 | 4970 |
| 4971 if (cls.LookupTypeParameter(class_name) != TypeParameter::null()) { | 4971 if (cls.LookupTypeParameter(class_name) != TypeParameter::null()) { |
| 4972 ReportError(class_pos, "class name conflicts with type parameter '%s'", | 4972 ReportError(class_pos, "class name conflicts with type parameter '%s'", |
| 4973 class_name.ToCString()); | 4973 class_name.ToCString()); |
| 4974 } | 4974 } |
| 4975 CheckConstructors(&members); | 4975 CheckConstructors(&members); |
| 4976 | 4976 |
| 4977 // Need to compute this here since MakeArray() will clear the | 4977 // Need to compute this here since MakeFixedLength() will clear the |
| 4978 // functions array in members. | 4978 // functions array in members. |
| 4979 const bool need_implicit_constructor = | 4979 const bool need_implicit_constructor = |
| 4980 !members.has_constructor() && !cls.is_patch(); | 4980 !members.has_constructor() && !cls.is_patch(); |
| 4981 | 4981 |
| 4982 cls.AddFields(members.fields()); | 4982 cls.AddFields(members.fields()); |
| 4983 | 4983 |
| 4984 // Creating a new array for functions marks the class as parsed. | 4984 // Creating a new array for functions marks the class as parsed. |
| 4985 Array& array = Array::Handle(Z, members.MakeFunctionsArray()); | 4985 Array& array = Array::Handle(Z, members.MakeFunctionsArray()); |
| 4986 cls.SetFunctions(array); | 4986 cls.SetFunctions(array); |
| 4987 | 4987 |
| (...skipping 735 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5723 ConsumeToken(); | 5723 ConsumeToken(); |
| 5724 TokenPosition interface_pos = TokenPos(); | 5724 TokenPosition interface_pos = TokenPos(); |
| 5725 interface = ParseType(ClassFinalizer::kResolveTypeParameters); | 5725 interface = ParseType(ClassFinalizer::kResolveTypeParameters); |
| 5726 if (interface.IsTypeParameter()) { | 5726 if (interface.IsTypeParameter()) { |
| 5727 ReportError(interface_pos, | 5727 ReportError(interface_pos, |
| 5728 "type parameter '%s' may not be used in interface list", | 5728 "type parameter '%s' may not be used in interface list", |
| 5729 String::Handle(Z, interface.UserVisibleName()).ToCString()); | 5729 String::Handle(Z, interface.UserVisibleName()).ToCString()); |
| 5730 } | 5730 } |
| 5731 all_interfaces.Add(interface, Heap::kOld); | 5731 all_interfaces.Add(interface, Heap::kOld); |
| 5732 } while (CurrentToken() == Token::kCOMMA); | 5732 } while (CurrentToken() == Token::kCOMMA); |
| 5733 cls_interfaces = Array::MakeArray(all_interfaces); | 5733 cls_interfaces = Array::MakeFixedLength(all_interfaces); |
| 5734 cls.set_interfaces(cls_interfaces); | 5734 cls.set_interfaces(cls_interfaces); |
| 5735 } | 5735 } |
| 5736 | 5736 |
| 5737 | 5737 |
| 5738 RawAbstractType* Parser::ParseMixins(const AbstractType& super_type) { | 5738 RawAbstractType* Parser::ParseMixins(const AbstractType& super_type) { |
| 5739 TRACE_PARSER("ParseMixins"); | 5739 TRACE_PARSER("ParseMixins"); |
| 5740 ASSERT(CurrentToken() == Token::kWITH); | 5740 ASSERT(CurrentToken() == Token::kWITH); |
| 5741 const GrowableObjectArray& mixin_types = | 5741 const GrowableObjectArray& mixin_types = |
| 5742 GrowableObjectArray::Handle(Z, GrowableObjectArray::New(Heap::kOld)); | 5742 GrowableObjectArray::Handle(Z, GrowableObjectArray::New(Heap::kOld)); |
| 5743 AbstractType& mixin_type = AbstractType::Handle(Z); | 5743 AbstractType& mixin_type = AbstractType::Handle(Z); |
| 5744 do { | 5744 do { |
| 5745 ConsumeToken(); | 5745 ConsumeToken(); |
| 5746 mixin_type = ParseType(ClassFinalizer::kResolveTypeParameters); | 5746 mixin_type = ParseType(ClassFinalizer::kResolveTypeParameters); |
| 5747 if (mixin_type.IsDynamicType()) { | 5747 if (mixin_type.IsDynamicType()) { |
| 5748 // The string 'dynamic' is not resolved yet at this point, but a malformed | 5748 // The string 'dynamic' is not resolved yet at this point, but a malformed |
| 5749 // type mapped to dynamic can be encountered here. | 5749 // type mapped to dynamic can be encountered here. |
| 5750 ReportError(mixin_type.token_pos(), "illegal mixin of a malformed type"); | 5750 ReportError(mixin_type.token_pos(), "illegal mixin of a malformed type"); |
| 5751 } | 5751 } |
| 5752 if (mixin_type.IsTypeParameter()) { | 5752 if (mixin_type.IsTypeParameter()) { |
| 5753 ReportError(mixin_type.token_pos(), | 5753 ReportError(mixin_type.token_pos(), |
| 5754 "mixin type '%s' may not be a type parameter", | 5754 "mixin type '%s' may not be a type parameter", |
| 5755 String::Handle(Z, mixin_type.UserVisibleName()).ToCString()); | 5755 String::Handle(Z, mixin_type.UserVisibleName()).ToCString()); |
| 5756 } | 5756 } |
| 5757 mixin_types.Add(mixin_type, Heap::kOld); | 5757 mixin_types.Add(mixin_type, Heap::kOld); |
| 5758 } while (CurrentToken() == Token::kCOMMA); | 5758 } while (CurrentToken() == Token::kCOMMA); |
| 5759 return MixinAppType::New(super_type, | 5759 return MixinAppType::New( |
| 5760 Array::Handle(Z, Array::MakeArray(mixin_types))); | 5760 super_type, Array::Handle(Z, Array::MakeFixedLength(mixin_types))); |
| 5761 } | 5761 } |
| 5762 | 5762 |
| 5763 | 5763 |
| 5764 void Parser::ParseTopLevelVariable(TopLevel* top_level, | 5764 void Parser::ParseTopLevelVariable(TopLevel* top_level, |
| 5765 const Object& owner, | 5765 const Object& owner, |
| 5766 TokenPosition metadata_pos) { | 5766 TokenPosition metadata_pos) { |
| 5767 TRACE_PARSER("ParseTopLevelVariable"); | 5767 TRACE_PARSER("ParseTopLevelVariable"); |
| 5768 const bool is_const = (CurrentToken() == Token::kCONST); | 5768 const bool is_const = (CurrentToken() == Token::kCONST); |
| 5769 // Const fields are implicitly final. | 5769 // Const fields are implicitly final. |
| 5770 const bool is_final = is_const || (CurrentToken() == Token::kFINAL); | 5770 const bool is_final = is_const || (CurrentToken() == Token::kFINAL); |
| (...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6279 CheckToken(Token::kSTRING, "library url expected"); | 6279 CheckToken(Token::kSTRING, "library url expected"); |
| 6280 AstNode* conditional_url_literal = ParseStringLiteral(false); | 6280 AstNode* conditional_url_literal = ParseStringLiteral(false); |
| 6281 | 6281 |
| 6282 // If there was already a condition that triggered, don't try to match | 6282 // If there was already a condition that triggered, don't try to match |
| 6283 // again. | 6283 // again. |
| 6284 if (condition_triggered) { | 6284 if (condition_triggered) { |
| 6285 continue; | 6285 continue; |
| 6286 } | 6286 } |
| 6287 // Check if this conditional line overrides the default import. | 6287 // Check if this conditional line overrides the default import. |
| 6288 const String& key = String::Handle(String::ConcatAll( | 6288 const String& key = String::Handle(String::ConcatAll( |
| 6289 Array::Handle(Array::MakeArray(pieces)), allocation_space_)); | 6289 Array::Handle(Array::MakeFixedLength(pieces)), allocation_space_)); |
| 6290 const String& value = | 6290 const String& value = |
| 6291 (valueNode == NULL) | 6291 (valueNode == NULL) |
| 6292 ? Symbols::True() | 6292 ? Symbols::True() |
| 6293 : String::Cast(valueNode->AsLiteralNode()->literal()); | 6293 : String::Cast(valueNode->AsLiteralNode()->literal()); |
| 6294 // Call the embedder to supply us with the environment. | 6294 // Call the embedder to supply us with the environment. |
| 6295 const String& env_value = | 6295 const String& env_value = |
| 6296 String::Handle(Api::GetEnvironmentValue(T, key)); | 6296 String::Handle(Api::GetEnvironmentValue(T, key)); |
| 6297 if (!env_value.IsNull() && env_value.Equals(value)) { | 6297 if (!env_value.IsNull() && env_value.Equals(value)) { |
| 6298 condition_triggered = true; | 6298 condition_triggered = true; |
| 6299 url_literal = conditional_url_literal; | 6299 url_literal = conditional_url_literal; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6338 ConsumeToken(); | 6338 ConsumeToken(); |
| 6339 ParseIdentList(&show_list); | 6339 ParseIdentList(&show_list); |
| 6340 } else if (IsSymbol(Symbols::Hide())) { | 6340 } else if (IsSymbol(Symbols::Hide())) { |
| 6341 ConsumeToken(); | 6341 ConsumeToken(); |
| 6342 ParseIdentList(&hide_list); | 6342 ParseIdentList(&hide_list); |
| 6343 } else { | 6343 } else { |
| 6344 break; | 6344 break; |
| 6345 } | 6345 } |
| 6346 } | 6346 } |
| 6347 if (show_list.Length() > 0) { | 6347 if (show_list.Length() > 0) { |
| 6348 show_names = Array::MakeArray(show_list); | 6348 show_names = Array::MakeFixedLength(show_list); |
| 6349 } | 6349 } |
| 6350 if (hide_list.Length() > 0) { | 6350 if (hide_list.Length() > 0) { |
| 6351 hide_names = Array::MakeArray(hide_list); | 6351 hide_names = Array::MakeFixedLength(hide_list); |
| 6352 } | 6352 } |
| 6353 } | 6353 } |
| 6354 ExpectSemicolon(); | 6354 ExpectSemicolon(); |
| 6355 | 6355 |
| 6356 // Canonicalize library URL. | 6356 // Canonicalize library URL. |
| 6357 const String& canon_url = String::CheckedHandle( | 6357 const String& canon_url = String::CheckedHandle( |
| 6358 CallLibraryTagHandler(Dart_kCanonicalizeUrl, import_pos, url)); | 6358 CallLibraryTagHandler(Dart_kCanonicalizeUrl, import_pos, url)); |
| 6359 | 6359 |
| 6360 // Create a new library if it does not exist yet. | 6360 // Create a new library if it does not exist yet. |
| 6361 Library& library = Library::Handle(Z, Library::LookupLibrary(T, canon_url)); | 6361 Library& library = Library::Handle(Z, Library::LookupLibrary(T, canon_url)); |
| (...skipping 4012 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10374 tokens_iterator_.SetCurrentPosition(finally_pos); | 10374 tokens_iterator_.SetCurrentPosition(finally_pos); |
| 10375 rethrow_clause = EnsureFinallyClause( | 10375 rethrow_clause = EnsureFinallyClause( |
| 10376 parse, is_async, exception_var, stack_trace_var, | 10376 parse, is_async, exception_var, stack_trace_var, |
| 10377 is_async ? saved_exception_var : exception_var, | 10377 is_async ? saved_exception_var : exception_var, |
| 10378 is_async ? saved_stack_trace_var : stack_trace_var); | 10378 is_async ? saved_stack_trace_var : stack_trace_var); |
| 10379 } | 10379 } |
| 10380 } | 10380 } |
| 10381 | 10381 |
| 10382 CatchClauseNode* catch_clause = new (Z) CatchClauseNode( | 10382 CatchClauseNode* catch_clause = new (Z) CatchClauseNode( |
| 10383 handler_pos, catch_handler_list, | 10383 handler_pos, catch_handler_list, |
| 10384 Array::ZoneHandle(Z, Array::MakeArray(handler_types)), context_var, | 10384 Array::ZoneHandle(Z, Array::MakeFixedLength(handler_types)), context_var, |
| 10385 exception_var, stack_trace_var, | 10385 exception_var, stack_trace_var, |
| 10386 is_async ? saved_exception_var : exception_var, | 10386 is_async ? saved_exception_var : exception_var, |
| 10387 is_async ? saved_stack_trace_var : stack_trace_var, | 10387 is_async ? saved_stack_trace_var : stack_trace_var, |
| 10388 (finally_clause != NULL) ? AllocateTryIndex() | 10388 (finally_clause != NULL) ? AllocateTryIndex() |
| 10389 : CatchClauseNode::kInvalidTryIndex, | 10389 : CatchClauseNode::kInvalidTryIndex, |
| 10390 needs_stack_trace); | 10390 needs_stack_trace); |
| 10391 | 10391 |
| 10392 // Now create the try/catch ast node and return it. If there is a label | 10392 // Now create the try/catch ast node and return it. If there is a label |
| 10393 // on the try/catch, close the block that's embedding the try statement | 10393 // on the try/catch, close the block that's embedding the try statement |
| 10394 // and attach the label to it. | 10394 // and attach the label to it. |
| (...skipping 1340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11735 ReportError("named argument expected"); | 11735 ReportError("named argument expected"); |
| 11736 } | 11736 } |
| 11737 arguments->Add(ParseExpr(require_const, kConsumeCascades)); | 11737 arguments->Add(ParseExpr(require_const, kConsumeCascades)); |
| 11738 } while (CurrentToken() == Token::kCOMMA); | 11738 } while (CurrentToken() == Token::kCOMMA); |
| 11739 } else { | 11739 } else { |
| 11740 ConsumeToken(); | 11740 ConsumeToken(); |
| 11741 } | 11741 } |
| 11742 ExpectToken(Token::kRPAREN); | 11742 ExpectToken(Token::kRPAREN); |
| 11743 SetAllowFunctionLiterals(saved_mode); | 11743 SetAllowFunctionLiterals(saved_mode); |
| 11744 if (named_argument_seen) { | 11744 if (named_argument_seen) { |
| 11745 arguments->set_names(Array::Handle(Z, Array::MakeArray(names))); | 11745 arguments->set_names(Array::Handle(Z, Array::MakeFixedLength(names))); |
| 11746 } | 11746 } |
| 11747 return arguments; | 11747 return arguments; |
| 11748 } | 11748 } |
| 11749 | 11749 |
| 11750 | 11750 |
| 11751 AstNode* Parser::ParseStaticCall(const Class& cls, | 11751 AstNode* Parser::ParseStaticCall(const Class& cls, |
| 11752 const String& func_name, | 11752 const String& func_name, |
| 11753 TokenPosition ident_pos, | 11753 TokenPosition ident_pos, |
| 11754 const TypeArguments& func_type_args, | 11754 const TypeArguments& func_type_args, |
| 11755 const LibraryPrefix* prefix) { | 11755 const LibraryPrefix* prefix) { |
| (...skipping 3557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15313 TokenPosition* start, | 15313 TokenPosition* start, |
| 15314 TokenPosition* end) { | 15314 TokenPosition* end) { |
| 15315 UNREACHABLE(); | 15315 UNREACHABLE(); |
| 15316 return false; | 15316 return false; |
| 15317 } | 15317 } |
| 15318 | 15318 |
| 15319 | 15319 |
| 15320 } // namespace dart | 15320 } // namespace dart |
| 15321 | 15321 |
| 15322 #endif // DART_PRECOMPILED_RUNTIME | 15322 #endif // DART_PRECOMPILED_RUNTIME |
| OLD | NEW |