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); |
} |