| Index: runtime/vm/parser.cc
|
| ===================================================================
|
| --- runtime/vm/parser.cc (revision 34784)
|
| +++ runtime/vm/parser.cc (working copy)
|
| @@ -2007,9 +2007,9 @@
|
| }
|
|
|
|
|
| -AstNode* Parser::CreateImplicitClosureNode(const Function& func,
|
| - intptr_t token_pos,
|
| - AstNode* receiver) {
|
| +ClosureNode* Parser::CreateImplicitClosureNode(const Function& func,
|
| + intptr_t token_pos,
|
| + AstNode* receiver) {
|
| Function& implicit_closure_function =
|
| Function::ZoneHandle(func.ImplicitClosureFunction());
|
| if (receiver != NULL) {
|
| @@ -8040,9 +8040,10 @@
|
| if ((CurrentToken() == Token::kCASCADE) && consume_cascades) {
|
| return ParseCascades(expr);
|
| }
|
| - expr = LiteralIfStaticConst(expr);
|
| if (require_compiletime_const) {
|
| expr = FoldConstExpr(expr_pos, expr);
|
| + } else {
|
| + expr = LiteralIfStaticConst(expr);
|
| }
|
| return expr;
|
| }
|
| @@ -8392,11 +8393,14 @@
|
| }
|
| if (current_function().is_static() ||
|
| current_function().IsInFactoryScope()) {
|
| - return new StaticGetterNode(primary->token_pos(),
|
| - NULL, // No receiver.
|
| - false, // Not a super getter.
|
| - Class::ZoneHandle(current_class().raw()),
|
| - name);
|
| + StaticGetterNode* getter =
|
| + new StaticGetterNode(primary->token_pos(),
|
| + NULL, // No receiver.
|
| + false, // Not a super getter.
|
| + Class::ZoneHandle(current_class().raw()),
|
| + name);
|
| + getter->set_is_deferred(primary->is_deferred_reference());
|
| + return getter;
|
| } else {
|
| AstNode* receiver = LoadReceiver(primary->token_pos());
|
| return CallGetter(node->token_pos(), receiver, name);
|
| @@ -8408,13 +8412,15 @@
|
|
|
| AstNode* Parser::LoadClosure(PrimaryNode* primary) {
|
| ASSERT(primary->primary().IsFunction());
|
| - AstNode* closure = NULL;
|
| const Function& func =
|
| Function::CheckedZoneHandle(primary->primary().raw());
|
| const String& funcname = String::ZoneHandle(func.name());
|
| if (func.is_static()) {
|
| // Static function access.
|
| - closure = CreateImplicitClosureNode(func, primary->token_pos(), NULL);
|
| + ClosureNode* closure =
|
| + CreateImplicitClosureNode(func, primary->token_pos(), NULL);
|
| + closure->set_is_deferred(primary->is_deferred_reference());
|
| + return closure;
|
| } else {
|
| // Instance function access.
|
| if (parsing_metadata_) {
|
| @@ -8429,9 +8435,10 @@
|
| funcname.ToCString());
|
| }
|
| AstNode* receiver = LoadReceiver(primary->token_pos());
|
| - closure = CallGetter(primary->token_pos(), receiver, funcname);
|
| + return CallGetter(primary->token_pos(), receiver, funcname);
|
| }
|
| - return closure;
|
| + UNREACHABLE();
|
| + return NULL;
|
| }
|
|
|
|
|
| @@ -9260,28 +9267,46 @@
|
| parsed_function()->AddDeferredPrefix(prefix);
|
| }
|
| }
|
| + const bool is_deferred = prefix.is_deferred_load();
|
| if (obj.IsNull()) {
|
| // Unresolved prefixed primary identifier.
|
| return NULL;
|
| } else if (obj.IsClass()) {
|
| const Class& cls = Class::Cast(obj);
|
| - return new PrimaryNode(ident_pos, Class::ZoneHandle(cls.raw()));
|
| + PrimaryNode* primary =
|
| + new PrimaryNode(ident_pos, Class::ZoneHandle(cls.raw()));
|
| + primary->set_is_deferred(is_deferred);
|
| + return primary;
|
| } else if (obj.IsField()) {
|
| const Field& field = Field::Cast(obj);
|
| ASSERT(field.is_static());
|
| - return GenerateStaticFieldLookup(field, ident_pos);
|
| + AstNode* get_field = GenerateStaticFieldLookup(field, ident_pos);
|
| + ASSERT(get_field != NULL);
|
| + ASSERT(get_field->IsLoadStaticFieldNode() ||
|
| + get_field->IsStaticGetterNode());
|
| + if (get_field->IsLoadStaticFieldNode()) {
|
| + get_field->AsLoadStaticFieldNode()->set_is_deferred(is_deferred);
|
| + } else if (get_field->IsStaticGetterNode()) {
|
| + get_field->AsStaticGetterNode()->set_is_deferred(is_deferred);
|
| + }
|
| + return get_field;
|
| } else if (obj.IsFunction()) {
|
| const Function& func = Function::Cast(obj);
|
| ASSERT(func.is_static());
|
| if (func.IsGetterFunction() || func.IsSetterFunction()) {
|
| - return new StaticGetterNode(ident_pos,
|
| - /* receiver */ NULL,
|
| - /* is_super_getter */ false,
|
| - Class::ZoneHandle(func.Owner()),
|
| - ident);
|
| -
|
| + StaticGetterNode* getter =
|
| + new StaticGetterNode(ident_pos,
|
| + /* receiver */ NULL,
|
| + /* is_super_getter */ false,
|
| + Class::ZoneHandle(func.Owner()),
|
| + ident);
|
| + getter->set_is_deferred(is_deferred);
|
| + return getter;
|
| } else {
|
| - return new PrimaryNode(ident_pos, Function::ZoneHandle(func.raw()));
|
| + PrimaryNode* primary =
|
| + new PrimaryNode(ident_pos, Function::ZoneHandle(func.raw()));
|
| + primary->set_is_deferred(is_deferred);
|
| + return primary;
|
| }
|
| }
|
| // All possible object types are handled above.
|
|
|