| 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/bootstrap.h" | 9 #include "vm/bootstrap.h" | 
| 10 #include "vm/class_finalizer.h" | 10 #include "vm/class_finalizer.h" | 
| (...skipping 6418 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6429 // Calling VM-internal helpers, uses implementation core library. | 6429 // Calling VM-internal helpers, uses implementation core library. | 
| 6430 AstNode* Parser::MakeStaticCall(const String& cls_name, | 6430 AstNode* Parser::MakeStaticCall(const String& cls_name, | 
| 6431                                 const String& func_name, | 6431                                 const String& func_name, | 
| 6432                                 ArgumentListNode* arguments) { | 6432                                 ArgumentListNode* arguments) { | 
| 6433   const Class& cls = Class::Handle(Library::LookupCoreClass(cls_name)); | 6433   const Class& cls = Class::Handle(Library::LookupCoreClass(cls_name)); | 
| 6434   ASSERT(!cls.IsNull()); | 6434   ASSERT(!cls.IsNull()); | 
| 6435   const Function& func = Function::ZoneHandle( | 6435   const Function& func = Function::ZoneHandle( | 
| 6436       Resolver::ResolveStatic(cls, | 6436       Resolver::ResolveStatic(cls, | 
| 6437                               func_name, | 6437                               func_name, | 
| 6438                               arguments->length(), | 6438                               arguments->length(), | 
| 6439                               arguments->names(), | 6439                               arguments->names())); | 
| 6440                               Resolver::kIsQualified)); |  | 
| 6441   ASSERT(!func.IsNull()); | 6440   ASSERT(!func.IsNull()); | 
| 6442   return new StaticCallNode(arguments->token_pos(), func, arguments); | 6441   return new StaticCallNode(arguments->token_pos(), func, arguments); | 
| 6443 } | 6442 } | 
| 6444 | 6443 | 
| 6445 | 6444 | 
| 6446 AstNode* Parser::MakeAssertCall(intptr_t begin, intptr_t end) { | 6445 AstNode* Parser::MakeAssertCall(intptr_t begin, intptr_t end) { | 
| 6447   ArgumentListNode* arguments = new ArgumentListNode(begin); | 6446   ArgumentListNode* arguments = new ArgumentListNode(begin); | 
| 6448   arguments->Add(new LiteralNode(begin, | 6447   arguments->Add(new LiteralNode(begin, | 
| 6449       Integer::ZoneHandle(Integer::New(begin)))); | 6448       Integer::ZoneHandle(Integer::New(begin)))); | 
| 6450   arguments->Add(new LiteralNode(end, | 6449   arguments->Add(new LiteralNode(end, | 
| (...skipping 1501 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 7952                                  intptr_t ident_pos) { | 7951                                  intptr_t ident_pos) { | 
| 7953   TRACE_PARSER("ParseStaticCall"); | 7952   TRACE_PARSER("ParseStaticCall"); | 
| 7954   const intptr_t call_pos = TokenPos(); | 7953   const intptr_t call_pos = TokenPos(); | 
| 7955   ASSERT(CurrentToken() == Token::kLPAREN); | 7954   ASSERT(CurrentToken() == Token::kLPAREN); | 
| 7956   ArgumentListNode* arguments = ParseActualParameters(NULL, kAllowConst); | 7955   ArgumentListNode* arguments = ParseActualParameters(NULL, kAllowConst); | 
| 7957   const int num_arguments = arguments->length(); | 7956   const int num_arguments = arguments->length(); | 
| 7958   const Function& func = Function::ZoneHandle( | 7957   const Function& func = Function::ZoneHandle( | 
| 7959       Resolver::ResolveStatic(cls, | 7958       Resolver::ResolveStatic(cls, | 
| 7960                               func_name, | 7959                               func_name, | 
| 7961                               num_arguments, | 7960                               num_arguments, | 
| 7962                               arguments->names(), | 7961                               arguments->names())); | 
| 7963                               Resolver::kIsQualified)); |  | 
| 7964   if (func.IsNull()) { | 7962   if (func.IsNull()) { | 
| 7965     // Check if there is a static field of the same name, it could be a closure | 7963     // Check if there is a static field of the same name, it could be a closure | 
| 7966     // and so we try and invoke the closure. | 7964     // and so we try and invoke the closure. | 
| 7967     AstNode* closure = NULL; | 7965     AstNode* closure = NULL; | 
| 7968     const Field& field = Field::ZoneHandle(cls.LookupStaticField(func_name)); | 7966     const Field& field = Field::ZoneHandle(cls.LookupStaticField(func_name)); | 
| 7969     Function& func = Function::ZoneHandle(); | 7967     Function& func = Function::ZoneHandle(); | 
| 7970     if (field.IsNull()) { | 7968     if (field.IsNull()) { | 
| 7971       // No field, check if we have an explicit getter function. | 7969       // No field, check if we have an explicit getter function. | 
| 7972       const String& getter_name = | 7970       const String& getter_name = | 
| 7973           String::ZoneHandle(Field::GetterName(func_name)); | 7971           String::ZoneHandle(Field::GetterName(func_name)); | 
| 7974       const int kNumArguments = 0;  // no arguments. | 7972       const int kNumArguments = 0;  // no arguments. | 
| 7975       func = Resolver::ResolveStatic(cls, | 7973       func = Resolver::ResolveStatic(cls, | 
| 7976                                      getter_name, | 7974                                      getter_name, | 
| 7977                                      kNumArguments, | 7975                                      kNumArguments, | 
| 7978                                      Object::empty_array(), | 7976                                      Object::empty_array()); | 
| 7979                                      Resolver::kIsQualified); |  | 
| 7980       if (!func.IsNull()) { | 7977       if (!func.IsNull()) { | 
| 7981         ASSERT(func.kind() != RawFunction::kImplicitStaticFinalGetter); | 7978         ASSERT(func.kind() != RawFunction::kImplicitStaticFinalGetter); | 
| 7982         EnsureSavedCurrentContext(); | 7979         EnsureSavedCurrentContext(); | 
| 7983         closure = new StaticGetterNode(call_pos, | 7980         closure = new StaticGetterNode(call_pos, | 
| 7984                                        NULL, | 7981                                        NULL, | 
| 7985                                        false, | 7982                                        false, | 
| 7986                                        Class::ZoneHandle(cls.raw()), | 7983                                        Class::ZoneHandle(cls.raw()), | 
| 7987                                        func_name); | 7984                                        func_name); | 
| 7988         return new ClosureCallNode(call_pos, closure, arguments); | 7985         return new ClosureCallNode(call_pos, closure, arguments); | 
| 7989       } | 7986       } | 
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 8077   const Field& field = Field::ZoneHandle(cls.LookupStaticField(field_name)); | 8074   const Field& field = Field::ZoneHandle(cls.LookupStaticField(field_name)); | 
| 8078   Function& func = Function::ZoneHandle(); | 8075   Function& func = Function::ZoneHandle(); | 
| 8079   if (field.IsNull()) { | 8076   if (field.IsNull()) { | 
| 8080     // No field, check if we have an explicit getter function. | 8077     // No field, check if we have an explicit getter function. | 
| 8081     const String& getter_name = | 8078     const String& getter_name = | 
| 8082         String::ZoneHandle(Field::GetterName(field_name)); | 8079         String::ZoneHandle(Field::GetterName(field_name)); | 
| 8083     const int kNumArguments = 0;  // no arguments. | 8080     const int kNumArguments = 0;  // no arguments. | 
| 8084     func = Resolver::ResolveStatic(cls, | 8081     func = Resolver::ResolveStatic(cls, | 
| 8085                                    getter_name, | 8082                                    getter_name, | 
| 8086                                    kNumArguments, | 8083                                    kNumArguments, | 
| 8087                                    Object::empty_array(), | 8084                                    Object::empty_array()); | 
| 8088                                    Resolver::kIsQualified); |  | 
| 8089     if (func.IsNull()) { | 8085     if (func.IsNull()) { | 
| 8090       // We might be referring to an implicit closure, check to see if | 8086       // We might be referring to an implicit closure, check to see if | 
| 8091       // there is a function of the same name. | 8087       // there is a function of the same name. | 
| 8092       func = cls.LookupStaticFunction(field_name); | 8088       func = cls.LookupStaticFunction(field_name); | 
| 8093       if (!func.IsNull()) { | 8089       if (!func.IsNull()) { | 
| 8094         access = CreateImplicitClosureNode(func, call_pos, NULL); | 8090         access = CreateImplicitClosureNode(func, call_pos, NULL); | 
| 8095       } else { | 8091       } else { | 
| 8096         // No function to closurize found found. | 8092         // No function to closurize found found. | 
| 8097         // This field access may turn out to be a call to the setter. | 8093         // This field access may turn out to be a call to the setter. | 
| 8098         // Create a getter call, which may later be turned into | 8094         // Create a getter call, which may later be turned into | 
| (...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 8648     // This field has not been referenced yet and thus the value has | 8644     // This field has not been referenced yet and thus the value has | 
| 8649     // not been evaluated. If the field is const, call the static getter method | 8645     // not been evaluated. If the field is const, call the static getter method | 
| 8650     // to evaluate the expression and canonicalize the value. | 8646     // to evaluate the expression and canonicalize the value. | 
| 8651     if (field.is_const()) { | 8647     if (field.is_const()) { | 
| 8652       field.set_value(Object::transition_sentinel()); | 8648       field.set_value(Object::transition_sentinel()); | 
| 8653       const int kNumArguments = 0;  // no arguments. | 8649       const int kNumArguments = 0;  // no arguments. | 
| 8654       const Function& func = | 8650       const Function& func = | 
| 8655           Function::Handle(Resolver::ResolveStatic(field_owner, | 8651           Function::Handle(Resolver::ResolveStatic(field_owner, | 
| 8656                                                    getter_name, | 8652                                                    getter_name, | 
| 8657                                                    kNumArguments, | 8653                                                    kNumArguments, | 
| 8658                                                    Object::empty_array(), | 8654                                                    Object::empty_array())); | 
| 8659                                                    Resolver::kIsQualified)); |  | 
| 8660       ASSERT(!func.IsNull()); | 8655       ASSERT(!func.IsNull()); | 
| 8661       ASSERT(func.kind() == RawFunction::kImplicitStaticFinalGetter); | 8656       ASSERT(func.kind() == RawFunction::kImplicitStaticFinalGetter); | 
| 8662       Object& const_value = Object::Handle( | 8657       Object& const_value = Object::Handle( | 
| 8663           DartEntry::InvokeFunction(func, Object::empty_array())); | 8658           DartEntry::InvokeFunction(func, Object::empty_array())); | 
| 8664       if (const_value.IsError()) { | 8659       if (const_value.IsError()) { | 
| 8665         const Error& error = Error::Cast(const_value); | 8660         const Error& error = Error::Cast(const_value); | 
| 8666         if (error.IsUnhandledException()) { | 8661         if (error.IsUnhandledException()) { | 
| 8667           // An exception may not occur in every parse attempt, i.e., the | 8662           // An exception may not occur in every parse attempt, i.e., the | 
| 8668           // generated AST is not deterministic. Therefore mark the function as | 8663           // generated AST is not deterministic. Therefore mark the function as | 
| 8669           // not optimizable. | 8664           // not optimizable. | 
| (...skipping 1918 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 10588 void Parser::SkipQualIdent() { | 10583 void Parser::SkipQualIdent() { | 
| 10589   ASSERT(IsIdentifier()); | 10584   ASSERT(IsIdentifier()); | 
| 10590   ConsumeToken(); | 10585   ConsumeToken(); | 
| 10591   if (CurrentToken() == Token::kPERIOD) { | 10586   if (CurrentToken() == Token::kPERIOD) { | 
| 10592     ConsumeToken();  // Consume the kPERIOD token. | 10587     ConsumeToken();  // Consume the kPERIOD token. | 
| 10593     ExpectIdentifier("identifier expected after '.'"); | 10588     ExpectIdentifier("identifier expected after '.'"); | 
| 10594   } | 10589   } | 
| 10595 } | 10590 } | 
| 10596 | 10591 | 
| 10597 }  // namespace dart | 10592 }  // namespace dart | 
| OLD | NEW | 
|---|