Chromium Code Reviews| Index: runtime/vm/parser.cc |
| =================================================================== |
| --- runtime/vm/parser.cc (revision 18894) |
| +++ runtime/vm/parser.cc (working copy) |
| @@ -4252,12 +4252,18 @@ |
| } |
| -Dart_Handle Parser::CallLibraryTagHandler(Dart_LibraryTag tag, |
| +RawObject* Parser::CallLibraryTagHandler(Dart_LibraryTag tag, |
| intptr_t token_pos, |
| const String& url) { |
| Isolate* isolate = Isolate::Current(); |
| Dart_LibraryTagHandler handler = isolate->library_tag_handler(); |
| if (handler == NULL) { |
| + if (url.StartsWith(Symbols::DartScheme())) { |
| + if (tag == kCanonicalizeUrl) { |
| + return url.raw(); |
| + } |
| + return Object::null(); |
| + } |
| ErrorMsg(token_pos, "no library handler registered"); |
| } |
| Dart_Handle result = handler(tag, |
| @@ -4267,8 +4273,14 @@ |
| Error& prev_error = Error::Handle(); |
| prev_error ^= Api::UnwrapHandle(result); |
| AppendErrorMsg(prev_error, token_pos, "library handler failed"); |
| + UNREACHABLE(); |
|
siva
2013/02/23 00:11:03
Why UNREACHABLE here (AppendErrorMsg already has o
Ivan Posva
2013/02/25 22:20:14
I wanted to make it clear that we will not be able
|
| } |
| - return result; |
| + if (tag == kCanonicalizeUrl) { |
| + if (!Dart_IsString(result)) { |
| + ErrorMsg(token_pos, "library handler failed URI canonicalization"); |
| + } |
| + } |
| + return Api::UnwrapHandle(result); |
| } |
| @@ -4303,10 +4315,8 @@ |
| } |
| ExpectToken(Token::kRPAREN); |
| ExpectToken(Token::kSEMICOLON); |
| - Dart_Handle handle = CallLibraryTagHandler(kCanonicalizeUrl, |
| - import_pos, |
| - url); |
| - const String& canon_url = String::CheckedHandle(Api::UnwrapHandle(handle)); |
| + const String& canon_url = String::CheckedHandle( |
| + CallLibraryTagHandler(kCanonicalizeUrl, import_pos, url)); |
| // Lookup the library URL. |
| Library& library = Library::Handle(Library::LookupLibrary(canon_url)); |
| if (library.IsNull()) { |
| @@ -4352,10 +4362,8 @@ |
| ConsumeToken(); |
| ExpectToken(Token::kRPAREN); |
| ExpectToken(Token::kSEMICOLON); |
| - Dart_Handle handle = CallLibraryTagHandler(kCanonicalizeUrl, |
| - source_pos, |
| - url); |
| - const String& canon_url = String::CheckedHandle(Api::UnwrapHandle(handle)); |
| + const String& canon_url = String::CheckedHandle( |
| + CallLibraryTagHandler(kCanonicalizeUrl, source_pos, url)); |
| CallLibraryTagHandler(kSourceTag, source_pos, canon_url); |
| } |
| } |
| @@ -4442,9 +4450,8 @@ |
| ExpectSemicolon(); |
| // Canonicalize library URL. |
| - Dart_Handle handle = |
| - CallLibraryTagHandler(kCanonicalizeUrl, import_pos, url); |
| - const String& canon_url = String::CheckedHandle(Api::UnwrapHandle(handle)); |
| + const String& canon_url = String::CheckedHandle( |
| + CallLibraryTagHandler(kCanonicalizeUrl, import_pos, url)); |
| // Lookup the library URL. |
| Library& library = Library::Handle(Library::LookupLibrary(canon_url)); |
| if (library.IsNull()) { |
| @@ -4496,9 +4503,8 @@ |
| const String& url = *CurrentLiteral(); |
| ConsumeToken(); |
| ExpectSemicolon(); |
| - Dart_Handle handle = |
| - CallLibraryTagHandler(kCanonicalizeUrl, source_pos, url); |
| - const String& canon_url = String::CheckedHandle(Api::UnwrapHandle(handle)); |
| + const String& canon_url = String::CheckedHandle( |
| + CallLibraryTagHandler(kCanonicalizeUrl, source_pos, url)); |
| CallLibraryTagHandler(kSourceTag, source_pos, canon_url); |
| } |