| 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 3508 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3519     ConsumeToken(); | 3519     ConsumeToken(); | 
| 3520     ExpectToken(Token::kRPAREN); | 3520     ExpectToken(Token::kRPAREN); | 
| 3521     ExpectToken(Token::kSEMICOLON); | 3521     ExpectToken(Token::kSEMICOLON); | 
| 3522     library_.SetName(name); | 3522     library_.SetName(name); | 
| 3523   } | 3523   } | 
| 3524 } | 3524 } | 
| 3525 | 3525 | 
| 3526 | 3526 | 
| 3527 Dart_Handle Parser::CallLibraryTagHandler(Dart_LibraryTag tag, | 3527 Dart_Handle Parser::CallLibraryTagHandler(Dart_LibraryTag tag, | 
| 3528                                           intptr_t token_pos, | 3528                                           intptr_t token_pos, | 
| 3529                                           const String& url, | 3529                                           const String& url) { | 
| 3530                                           const Array& import_map) { |  | 
| 3531   Isolate* isolate = Isolate::Current(); | 3530   Isolate* isolate = Isolate::Current(); | 
| 3532   Dart_LibraryTagHandler handler = isolate->library_tag_handler(); | 3531   Dart_LibraryTagHandler handler = isolate->library_tag_handler(); | 
| 3533   if (handler == NULL) { | 3532   if (handler == NULL) { | 
| 3534     ErrorMsg(token_pos, "no library handler registered"); | 3533     ErrorMsg(token_pos, "no library handler registered"); | 
| 3535   } | 3534   } | 
| 3536   Dart_Handle result = handler(tag, | 3535   Dart_Handle result = handler(tag, | 
| 3537                                Api::NewHandle(isolate, library_.raw()), | 3536                                Api::NewHandle(isolate, library_.raw()), | 
| 3538                                Api::NewHandle(isolate, url.raw()), | 3537                                Api::NewHandle(isolate, url.raw())); | 
| 3539                                Api::NewHandle(isolate, import_map.raw())); |  | 
| 3540   if (Dart_IsError(result)) { | 3538   if (Dart_IsError(result)) { | 
| 3541     Error& prev_error = Error::Handle(); | 3539     Error& prev_error = Error::Handle(); | 
| 3542     prev_error ^= Api::UnwrapHandle(result); | 3540     prev_error ^= Api::UnwrapHandle(result); | 
| 3543     AppendErrorMsg(prev_error, token_pos, "library handler failed"); | 3541     AppendErrorMsg(prev_error, token_pos, "library handler failed"); | 
| 3544   } | 3542   } | 
| 3545   return result; | 3543   return result; | 
| 3546 } | 3544 } | 
| 3547 | 3545 | 
| 3548 | 3546 | 
| 3549 void Parser::ParseLibraryImport() { | 3547 void Parser::ParseLibraryImport() { | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
| 3569       } | 3567       } | 
| 3570       prefix = CurrentLiteral()->raw(); | 3568       prefix = CurrentLiteral()->raw(); | 
| 3571       // TODO(asiva): Need to also check that prefix is not a reserved keyword. | 3569       // TODO(asiva): Need to also check that prefix is not a reserved keyword. | 
| 3572       if (!Scanner::IsIdent(prefix)) { | 3570       if (!Scanner::IsIdent(prefix)) { | 
| 3573         ErrorMsg("prefix should be an identifier"); | 3571         ErrorMsg("prefix should be an identifier"); | 
| 3574       } | 3572       } | 
| 3575       ConsumeToken(); | 3573       ConsumeToken(); | 
| 3576     } | 3574     } | 
| 3577     ExpectToken(Token::kRPAREN); | 3575     ExpectToken(Token::kRPAREN); | 
| 3578     ExpectToken(Token::kSEMICOLON); | 3576     ExpectToken(Token::kSEMICOLON); | 
| 3579     const Array& import_map = Array::Handle(library_.import_map()); |  | 
| 3580     Dart_Handle handle = CallLibraryTagHandler(kCanonicalizeUrl, | 3577     Dart_Handle handle = CallLibraryTagHandler(kCanonicalizeUrl, | 
| 3581                                                import_pos, | 3578                                                import_pos, | 
| 3582                                                url, | 3579                                                url); | 
| 3583                                                import_map); |  | 
| 3584     const String& canon_url = String::CheckedHandle(Api::UnwrapHandle(handle)); | 3580     const String& canon_url = String::CheckedHandle(Api::UnwrapHandle(handle)); | 
| 3585     // Lookup the library URL. | 3581     // Lookup the library URL. | 
| 3586     Library& library = Library::Handle(Library::LookupLibrary(canon_url)); | 3582     Library& library = Library::Handle(Library::LookupLibrary(canon_url)); | 
| 3587     if (library.IsNull()) { | 3583     if (library.IsNull()) { | 
| 3588       // Call the library tag handler to load the library. | 3584       // Call the library tag handler to load the library. | 
| 3589       CallLibraryTagHandler(kImportTag, import_pos, canon_url, import_map); | 3585       CallLibraryTagHandler(kImportTag, import_pos, canon_url); | 
| 3590       // If the library tag handler succeded without registering the | 3586       // If the library tag handler succeded without registering the | 
| 3591       // library we create an empty library to import. | 3587       // library we create an empty library to import. | 
| 3592       library = Library::LookupLibrary(canon_url); | 3588       library = Library::LookupLibrary(canon_url); | 
| 3593       if (library.IsNull()) { | 3589       if (library.IsNull()) { | 
| 3594         library = Library::New(canon_url); | 3590         library = Library::New(canon_url); | 
| 3595         library.Register(); | 3591         library.Register(); | 
| 3596       } | 3592       } | 
| 3597     } | 3593     } | 
| 3598     // Add the import to the library. | 3594     // Add the import to the library. | 
| 3599     if (prefix.IsNull() || (prefix.Length() == 0)) { | 3595     if (prefix.IsNull() || (prefix.Length() == 0)) { | 
| 3600       library_.AddImport(library); | 3596       library_.AddImport(library); | 
| 3601     } else { | 3597     } else { | 
| 3602       LibraryPrefix& library_prefix = LibraryPrefix::Handle(); | 3598       LibraryPrefix& library_prefix = LibraryPrefix::Handle(); | 
| 3603       library_prefix = library_.LookupLocalLibraryPrefix(prefix); | 3599       library_prefix = library_.LookupLocalLibraryPrefix(prefix); | 
| 3604       if (!library_prefix.IsNull()) { | 3600       if (!library_prefix.IsNull()) { | 
| 3605         library_prefix.AddLibrary(library); | 3601         library_prefix.AddLibrary(library); | 
| 3606       } else { | 3602       } else { | 
| 3607         library_prefix = LibraryPrefix::New(prefix, library); | 3603         library_prefix = LibraryPrefix::New(prefix, library); | 
| 3608         library_.AddObject(library_prefix, prefix); | 3604         library_.AddObject(library_prefix, prefix); | 
| 3609       } | 3605       } | 
| 3610     } | 3606     } | 
| 3611   } | 3607   } | 
| 3612 } | 3608 } | 
| 3613 | 3609 | 
| 3614 | 3610 | 
| 3615 void Parser::ParseLibraryInclude() { | 3611 void Parser::ParseLibraryInclude() { | 
| 3616   TRACE_PARSER("ParseLibraryInclude"); | 3612   TRACE_PARSER("ParseLibraryInclude"); | 
| 3617   const Array& import_map = Array::Handle(library_.import_map()); |  | 
| 3618   while (CurrentToken() == Token::kSOURCE) { | 3613   while (CurrentToken() == Token::kSOURCE) { | 
| 3619     const intptr_t source_pos = token_index_; | 3614     const intptr_t source_pos = token_index_; | 
| 3620     ConsumeToken(); | 3615     ConsumeToken(); | 
| 3621     ExpectToken(Token::kLPAREN); | 3616     ExpectToken(Token::kLPAREN); | 
| 3622     if (CurrentToken() != Token::kSTRING) { | 3617     if (CurrentToken() != Token::kSTRING) { | 
| 3623       ErrorMsg("source url expected"); | 3618       ErrorMsg("source url expected"); | 
| 3624     } | 3619     } | 
| 3625     const String& url = *ParseImportStringLiteral(); | 3620     const String& url = *ParseImportStringLiteral(); | 
| 3626     ExpectToken(Token::kRPAREN); | 3621     ExpectToken(Token::kRPAREN); | 
| 3627     ExpectToken(Token::kSEMICOLON); | 3622     ExpectToken(Token::kSEMICOLON); | 
| 3628     Dart_Handle handle = CallLibraryTagHandler(kCanonicalizeUrl, | 3623     Dart_Handle handle = CallLibraryTagHandler(kCanonicalizeUrl, | 
| 3629                                                source_pos, | 3624                                                source_pos, | 
| 3630                                                url, | 3625                                                url); | 
| 3631                                                import_map); |  | 
| 3632     const String& canon_url = String::CheckedHandle(Api::UnwrapHandle(handle)); | 3626     const String& canon_url = String::CheckedHandle(Api::UnwrapHandle(handle)); | 
| 3633     CallLibraryTagHandler(kSourceTag, source_pos, canon_url, import_map); | 3627     CallLibraryTagHandler(kSourceTag, source_pos, canon_url); | 
| 3634   } | 3628   } | 
| 3635 } | 3629 } | 
| 3636 | 3630 | 
| 3637 | 3631 | 
| 3638 void Parser::ParseLibraryResource() { | 3632 void Parser::ParseLibraryResource() { | 
| 3639   TRACE_PARSER("ParseLibraryResource"); | 3633   TRACE_PARSER("ParseLibraryResource"); | 
| 3640   while (CurrentToken() == Token::kRESOURCE) { | 3634   while (CurrentToken() == Token::kRESOURCE) { | 
| 3641     // Currently the VM does ignore #resource library tags. They are only used | 3635     // Currently the VM does ignore #resource library tags. They are only used | 
| 3642     // by the IDE. | 3636     // by the IDE. | 
| 3643     ConsumeToken(); | 3637     ConsumeToken(); | 
| (...skipping 3549 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 7193   return var_or_field; | 7187   return var_or_field; | 
| 7194 } | 7188 } | 
| 7195 | 7189 | 
| 7196 | 7190 | 
| 7197 // Resolve variables used in an import string literal. | 7191 // Resolve variables used in an import string literal. | 
| 7198 // If the variable name cannot be resolved issue an error message. | 7192 // If the variable name cannot be resolved issue an error message. | 
| 7199 // Currently we only resolve against the global map which is passed in | 7193 // Currently we only resolve against the global map which is passed in | 
| 7200 // when the script is loaded. | 7194 // when the script is loaded. | 
| 7201 RawString* Parser::ResolveImportVar(intptr_t ident_pos, const String& ident) { | 7195 RawString* Parser::ResolveImportVar(intptr_t ident_pos, const String& ident) { | 
| 7202   TRACE_PARSER("ResolveImportVar"); | 7196   TRACE_PARSER("ResolveImportVar"); | 
| 7203   String& map_name = String::Handle(library_.LookupImportMap(ident)); | 7197   const Array& import_map = | 
| 7204   if (!map_name.IsNull()) { | 7198       Array::Handle(Isolate::Current()->object_store()->import_map()); | 
| 7205     return map_name.raw(); | 7199   if (!import_map.IsNull()) { | 
|  | 7200     intptr_t length = import_map.Length(); | 
|  | 7201     intptr_t index = 0; | 
|  | 7202     String& name = String::Handle(); | 
|  | 7203     while (index < (length - 1)) { | 
|  | 7204       name ^= import_map.At(index); | 
|  | 7205       if (name.Equals(ident)) { | 
|  | 7206         name ^= import_map.At(index + 1); | 
|  | 7207         return name.raw(); | 
|  | 7208       } | 
|  | 7209       index += 2; | 
|  | 7210     } | 
| 7206   } | 7211   } | 
| 7207   ErrorMsg(ident_pos, "import variable '%s' has not been defined", | 7212   ErrorMsg(ident_pos, "import variable '%s' has not been defined", | 
| 7208            ident.ToCString()); | 7213            ident.ToCString()); | 
| 7209   return String::null(); | 7214   return String::null(); | 
| 7210 } | 7215 } | 
| 7211 | 7216 | 
| 7212 | 7217 | 
| 7213 // Parses type = [ident "."] ident ["<" type { "," type } ">"], then resolve and | 7218 // Parses type = [ident "."] ident ["<" type { "," type } ">"], then resolve and | 
| 7214 // finalize it according to the given type finalization mode. | 7219 // finalize it according to the given type finalization mode. | 
| 7215 RawAbstractType* Parser::ParseType( | 7220 RawAbstractType* Parser::ParseType( | 
| (...skipping 1247 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 8463 void Parser::SkipQualIdent() { | 8468 void Parser::SkipQualIdent() { | 
| 8464   ASSERT(IsIdentifier()); | 8469   ASSERT(IsIdentifier()); | 
| 8465   ConsumeToken(); | 8470   ConsumeToken(); | 
| 8466   if (CurrentToken() == Token::kPERIOD) { | 8471   if (CurrentToken() == Token::kPERIOD) { | 
| 8467     ConsumeToken();  // Consume the kPERIOD token. | 8472     ConsumeToken();  // Consume the kPERIOD token. | 
| 8468     ExpectIdentifier("identifier expected after '.'"); | 8473     ExpectIdentifier("identifier expected after '.'"); | 
| 8469   } | 8474   } | 
| 8470 } | 8475 } | 
| 8471 | 8476 | 
| 8472 }  // namespace dart | 8477 }  // namespace dart | 
| OLD | NEW | 
|---|