Index: runtime/vm/parser.cc |
=================================================================== |
--- runtime/vm/parser.cc (revision 19011) |
+++ runtime/vm/parser.cc (working copy) |
@@ -4252,23 +4252,36 @@ |
} |
-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, |
Api::NewHandle(isolate, library_.raw()), |
Api::NewHandle(isolate, url.raw())); |
if (Dart_IsError(result)) { |
+ // In case of an error we append an explanatory error message to the |
+ // error obtained from the library tag handler. |
Error& prev_error = Error::Handle(); |
prev_error ^= Api::UnwrapHandle(result); |
AppendErrorMsg(prev_error, token_pos, "library handler failed"); |
} |
- return result; |
+ if (tag == kCanonicalizeUrl) { |
+ if (!Dart_IsString(result)) { |
+ ErrorMsg(token_pos, "library handler failed URI canonicalization"); |
+ } |
+ } |
+ return Api::UnwrapHandle(result); |
} |
@@ -4303,10 +4316,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 +4363,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 +4451,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 +4504,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); |
} |
@@ -4533,6 +4540,7 @@ |
const bool is_script = (script_.kind() == RawScript::kScriptTag); |
const bool is_library = (script_.kind() == RawScript::kLibraryTag); |
+ const bool is_patch = (script_.kind() == RawScript::kPatchTag); |
ASSERT(script_.kind() != RawScript::kSourceTag); |
// We may read metadata tokens that are part of the toplevel |
@@ -4542,6 +4550,9 @@ |
intptr_t metadata_pos = TokenPos(); |
SkipMetadata(); |
if (CurrentToken() == Token::kLIBRARY) { |
+ if (is_patch) { |
+ ErrorMsg("patch cannot override library name"); |
+ } |
ParseLibraryName(); |
metadata_pos = TokenPos(); |
SkipMetadata(); |
@@ -4617,7 +4628,7 @@ |
Class::New(Symbols::TopLevel(), script_, TokenPos())); |
toplevel_class.set_library(library_); |
- if (is_library_source()) { |
+ if (is_library_source() || is_patch_source()) { |
ParseLibraryDefinition(); |
} else if (is_part_source()) { |
ParsePartHeader(); |