Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4491)

Unified Diff: runtime/vm/parser.cc

Issue 12321082: - Properly load the core libraries as libraries and not as scripts. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();

Powered by Google App Engine
This is Rietveld 408576698