| 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 "lib/invocation_mirror.h" | 7 #include "lib/invocation_mirror.h" |
| 8 #include "vm/bigint_operations.h" | 8 #include "vm/bigint_operations.h" |
| 9 #include "vm/class_finalizer.h" | 9 #include "vm/class_finalizer.h" |
| 10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
| (...skipping 4179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4190 AddFormalParamsToFunction(¶ms, func); | 4190 AddFormalParamsToFunction(¶ms, func); |
| 4191 top_level->functions.Add(func); | 4191 top_level->functions.Add(func); |
| 4192 if (!is_patch) { | 4192 if (!is_patch) { |
| 4193 library_.AddObject(func, accessor_name); | 4193 library_.AddObject(func, accessor_name); |
| 4194 } else { | 4194 } else { |
| 4195 library_.ReplaceObject(func, accessor_name); | 4195 library_.ReplaceObject(func, accessor_name); |
| 4196 } | 4196 } |
| 4197 } | 4197 } |
| 4198 | 4198 |
| 4199 | 4199 |
| 4200 // TODO(hausner): Remove support for old library definition syntax. | |
| 4201 void Parser::ParseLibraryNameObsoleteSyntax() { | |
| 4202 if ((script_.kind() == RawScript::kLibraryTag) && | |
| 4203 (CurrentToken() != Token::kLEGACY_LIBRARY)) { | |
| 4204 // Handle error case early to get consistent error message. | |
| 4205 ExpectToken(Token::kLEGACY_LIBRARY); | |
| 4206 } | |
| 4207 if (CurrentToken() == Token::kLEGACY_LIBRARY) { | |
| 4208 ConsumeToken(); | |
| 4209 ExpectToken(Token::kLPAREN); | |
| 4210 if (CurrentToken() != Token::kSTRING) { | |
| 4211 ErrorMsg("library name expected"); | |
| 4212 } | |
| 4213 const String& name = *CurrentLiteral(); | |
| 4214 ConsumeToken(); | |
| 4215 ExpectToken(Token::kRPAREN); | |
| 4216 ExpectToken(Token::kSEMICOLON); | |
| 4217 library_.SetName(name); | |
| 4218 } | |
| 4219 } | |
| 4220 | |
| 4221 | 4200 |
| 4222 RawObject* Parser::CallLibraryTagHandler(Dart_LibraryTag tag, | 4201 RawObject* Parser::CallLibraryTagHandler(Dart_LibraryTag tag, |
| 4223 intptr_t token_pos, | 4202 intptr_t token_pos, |
| 4224 const String& url) { | 4203 const String& url) { |
| 4225 Isolate* isolate = Isolate::Current(); | 4204 Isolate* isolate = Isolate::Current(); |
| 4226 Dart_LibraryTagHandler handler = isolate->library_tag_handler(); | 4205 Dart_LibraryTagHandler handler = isolate->library_tag_handler(); |
| 4227 if (handler == NULL) { | 4206 if (handler == NULL) { |
| 4228 if (url.StartsWith(Symbols::DartScheme())) { | 4207 if (url.StartsWith(Symbols::DartScheme())) { |
| 4229 if (tag == kCanonicalizeUrl) { | 4208 if (tag == kCanonicalizeUrl) { |
| 4230 return url.raw(); | 4209 return url.raw(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 4245 } | 4224 } |
| 4246 if (tag == kCanonicalizeUrl) { | 4225 if (tag == kCanonicalizeUrl) { |
| 4247 if (!Dart_IsString(result)) { | 4226 if (!Dart_IsString(result)) { |
| 4248 ErrorMsg(token_pos, "library handler failed URI canonicalization"); | 4227 ErrorMsg(token_pos, "library handler failed URI canonicalization"); |
| 4249 } | 4228 } |
| 4250 } | 4229 } |
| 4251 return Api::UnwrapHandle(result); | 4230 return Api::UnwrapHandle(result); |
| 4252 } | 4231 } |
| 4253 | 4232 |
| 4254 | 4233 |
| 4255 // TODO(hausner): Remove support for old library definition syntax. | |
| 4256 void Parser::ParseLibraryImportObsoleteSyntax() { | |
| 4257 while (CurrentToken() == Token::kLEGACY_IMPORT) { | |
| 4258 const intptr_t import_pos = TokenPos(); | |
| 4259 ConsumeToken(); | |
| 4260 ExpectToken(Token::kLPAREN); | |
| 4261 if (CurrentToken() != Token::kSTRING) { | |
| 4262 ErrorMsg("library url expected"); | |
| 4263 } | |
| 4264 const String& url = *CurrentLiteral(); | |
| 4265 ConsumeToken(); | |
| 4266 String& prefix = String::Handle(); | |
| 4267 if (CurrentToken() == Token::kCOMMA) { | |
| 4268 ConsumeToken(); | |
| 4269 if (!IsLiteral("prefix")) { | |
| 4270 ErrorMsg("prefix: expected"); | |
| 4271 } | |
| 4272 ConsumeToken(); | |
| 4273 ExpectToken(Token::kCOLON); | |
| 4274 if (CurrentToken() != Token::kSTRING) { | |
| 4275 ErrorMsg("prefix expected"); | |
| 4276 } | |
| 4277 prefix = CurrentLiteral()->raw(); | |
| 4278 // TODO(asiva): Need to also check that prefix is not a reserved keyword. | |
| 4279 if (!Scanner::IsIdent(prefix)) { | |
| 4280 ErrorMsg("prefix should be an identifier"); | |
| 4281 } | |
| 4282 ConsumeToken(); | |
| 4283 } | |
| 4284 ExpectToken(Token::kRPAREN); | |
| 4285 ExpectToken(Token::kSEMICOLON); | |
| 4286 const String& canon_url = String::CheckedHandle( | |
| 4287 CallLibraryTagHandler(kCanonicalizeUrl, import_pos, url)); | |
| 4288 // Lookup the library URL. | |
| 4289 Library& library = Library::Handle(Library::LookupLibrary(canon_url)); | |
| 4290 if (library.IsNull()) { | |
| 4291 // Call the library tag handler to load the library. | |
| 4292 CallLibraryTagHandler(kImportTag, import_pos, canon_url); | |
| 4293 // If the library tag handler succeded without registering the | |
| 4294 // library we create an empty library to import. | |
| 4295 library = Library::LookupLibrary(canon_url); | |
| 4296 if (library.IsNull()) { | |
| 4297 library = Library::New(canon_url); | |
| 4298 library.Register(); | |
| 4299 } | |
| 4300 } | |
| 4301 // Add the import to the library. | |
| 4302 const Namespace& import = Namespace::Handle( | |
| 4303 Namespace::New(library, Array::Handle(), Array::Handle())); | |
| 4304 if (prefix.IsNull() || (prefix.Length() == 0)) { | |
| 4305 library_.AddImport(import); | |
| 4306 } else { | |
| 4307 LibraryPrefix& library_prefix = LibraryPrefix::Handle(); | |
| 4308 library_prefix = library_.LookupLocalLibraryPrefix(prefix); | |
| 4309 if (!library_prefix.IsNull()) { | |
| 4310 library_prefix.AddImport(import); | |
| 4311 } else { | |
| 4312 library_prefix = LibraryPrefix::New(prefix, import); | |
| 4313 library_.AddObject(library_prefix, prefix); | |
| 4314 } | |
| 4315 } | |
| 4316 } | |
| 4317 } | |
| 4318 | |
| 4319 | |
| 4320 // TODO(hausner): Remove support for old library definition syntax. | |
| 4321 void Parser::ParseLibraryIncludeObsoleteSyntax() { | |
| 4322 while (CurrentToken() == Token::kLEGACY_SOURCE) { | |
| 4323 const intptr_t source_pos = TokenPos(); | |
| 4324 ConsumeToken(); | |
| 4325 ExpectToken(Token::kLPAREN); | |
| 4326 if (CurrentToken() != Token::kSTRING) { | |
| 4327 ErrorMsg("source url expected"); | |
| 4328 } | |
| 4329 const String& url = *CurrentLiteral(); | |
| 4330 ConsumeToken(); | |
| 4331 ExpectToken(Token::kRPAREN); | |
| 4332 ExpectToken(Token::kSEMICOLON); | |
| 4333 const String& canon_url = String::CheckedHandle( | |
| 4334 CallLibraryTagHandler(kCanonicalizeUrl, source_pos, url)); | |
| 4335 CallLibraryTagHandler(kSourceTag, source_pos, canon_url); | |
| 4336 } | |
| 4337 } | |
| 4338 | |
| 4339 | |
| 4340 void Parser::ParseLibraryName() { | 4234 void Parser::ParseLibraryName() { |
| 4341 ASSERT(CurrentToken() == Token::kLIBRARY); | 4235 ASSERT(CurrentToken() == Token::kLIBRARY); |
| 4342 ConsumeToken(); | 4236 ConsumeToken(); |
| 4343 String& lib_name = *ExpectIdentifier("library name expected"); | 4237 String& lib_name = *ExpectIdentifier("library name expected"); |
| 4344 if (CurrentToken() == Token::kPERIOD) { | 4238 if (CurrentToken() == Token::kPERIOD) { |
| 4345 while (CurrentToken() == Token::kPERIOD) { | 4239 while (CurrentToken() == Token::kPERIOD) { |
| 4346 ConsumeToken(); | 4240 ConsumeToken(); |
| 4347 lib_name = String::Concat(lib_name, Symbols::Dot()); | 4241 lib_name = String::Concat(lib_name, Symbols::Dot()); |
| 4348 lib_name = String::Concat(lib_name, | 4242 lib_name = String::Concat(lib_name, |
| 4349 *ExpectIdentifier("malformed library name")); | 4243 *ExpectIdentifier("malformed library name")); |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4479 | 4373 |
| 4480 void Parser::ParseLibraryDefinition() { | 4374 void Parser::ParseLibraryDefinition() { |
| 4481 TRACE_PARSER("ParseLibraryDefinition"); | 4375 TRACE_PARSER("ParseLibraryDefinition"); |
| 4482 | 4376 |
| 4483 // Handle the script tag. | 4377 // Handle the script tag. |
| 4484 if (CurrentToken() == Token::kSCRIPTTAG) { | 4378 if (CurrentToken() == Token::kSCRIPTTAG) { |
| 4485 // Nothing to do for script tags except to skip them. | 4379 // Nothing to do for script tags except to skip them. |
| 4486 ConsumeToken(); | 4380 ConsumeToken(); |
| 4487 } | 4381 } |
| 4488 | 4382 |
| 4489 // TODO(hausner): Remove support for old library definition syntax. | |
| 4490 if ((CurrentToken() == Token::kLEGACY_LIBRARY) || | |
| 4491 (CurrentToken() == Token::kLEGACY_IMPORT) || | |
| 4492 (CurrentToken() == Token::kLEGACY_SOURCE)) { | |
| 4493 ParseLibraryNameObsoleteSyntax(); | |
| 4494 ParseLibraryImportObsoleteSyntax(); | |
| 4495 ParseLibraryIncludeObsoleteSyntax(); | |
| 4496 // Core lib has not been explicitly imported, so we implicitly | |
| 4497 // import it here. | |
| 4498 if (!library_.ImportsCorelib()) { | |
| 4499 Library& core_lib = Library::Handle(Library::CoreLibrary()); | |
| 4500 ASSERT(!core_lib.IsNull()); | |
| 4501 const Namespace& core_ns = Namespace::Handle( | |
| 4502 Namespace::New(core_lib, Array::Handle(), Array::Handle())); | |
| 4503 library_.AddImport(core_ns); | |
| 4504 } | |
| 4505 return; | |
| 4506 } | |
| 4507 | |
| 4508 ASSERT(script_.kind() != RawScript::kSourceTag); | 4383 ASSERT(script_.kind() != RawScript::kSourceTag); |
| 4509 | 4384 |
| 4510 // We may read metadata tokens that are part of the toplevel | 4385 // We may read metadata tokens that are part of the toplevel |
| 4511 // declaration that follows the library definitions. Therefore, we | 4386 // declaration that follows the library definitions. Therefore, we |
| 4512 // need to remember the position of the last token that was | 4387 // need to remember the position of the last token that was |
| 4513 // successfully consumed. | 4388 // successfully consumed. |
| 4514 intptr_t metadata_pos = TokenPos(); | 4389 intptr_t metadata_pos = TokenPos(); |
| 4515 SkipMetadata(); | 4390 SkipMetadata(); |
| 4516 if (CurrentToken() == Token::kLIBRARY) { | 4391 if (CurrentToken() == Token::kLIBRARY) { |
| 4517 if (is_patch_source()) { | 4392 if (is_patch_source()) { |
| (...skipping 5511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10029 void Parser::SkipQualIdent() { | 9904 void Parser::SkipQualIdent() { |
| 10030 ASSERT(IsIdentifier()); | 9905 ASSERT(IsIdentifier()); |
| 10031 ConsumeToken(); | 9906 ConsumeToken(); |
| 10032 if (CurrentToken() == Token::kPERIOD) { | 9907 if (CurrentToken() == Token::kPERIOD) { |
| 10033 ConsumeToken(); // Consume the kPERIOD token. | 9908 ConsumeToken(); // Consume the kPERIOD token. |
| 10034 ExpectIdentifier("identifier expected after '.'"); | 9909 ExpectIdentifier("identifier expected after '.'"); |
| 10035 } | 9910 } |
| 10036 } | 9911 } |
| 10037 | 9912 |
| 10038 } // namespace dart | 9913 } // namespace dart |
| OLD | NEW |