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

Side by Side Diff: runtime/vm/parser.cc

Issue 1317753004: Eliminate LocalVarDescriptors in some corner cases (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 3 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 unified diff | Download patch
« no previous file with comments | « runtime/vm/object.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "platform/utils.h" 8 #include "platform/utils.h"
9 #include "vm/ast_transformer.h" 9 #include "vm/ast_transformer.h"
10 #include "vm/bootstrap.h" 10 #include "vm/bootstrap.h"
(...skipping 1134 matching lines...) Expand 10 before | Expand all | Expand 10 after
1145 // TODO(koda): Should there be a StackZone here? 1145 // TODO(koda): Should there be a StackZone here?
1146 Zone* zone = thread->zone(); 1146 Zone* zone = thread->zone();
1147 1147
1148 const Class& script_cls = Class::Handle(zone, field.origin()); 1148 const Class& script_cls = Class::Handle(zone, field.origin());
1149 const Script& script = Script::Handle(zone, script_cls.script()); 1149 const Script& script = Script::Handle(zone, script_cls.script());
1150 1150
1151 const String& field_name = String::Handle(zone, field.name()); 1151 const String& field_name = String::Handle(zone, field.name());
1152 String& init_name = String::Handle(zone, 1152 String& init_name = String::Handle(zone,
1153 Symbols::FromConcat(Symbols::InitPrefix(), field_name)); 1153 Symbols::FromConcat(Symbols::InitPrefix(), field_name));
1154 1154
1155 Object& initializer_owner = Object::Handle(field.owner());
1156 if (field.owner() != field.origin()) {
1157 initializer_owner =
1158 PatchClass::New(Class::Handle(field.owner()), script_cls);
1159 }
1160
1155 const Function& initializer = Function::ZoneHandle(zone, 1161 const Function& initializer = Function::ZoneHandle(zone,
1156 Function::New(init_name, 1162 Function::New(init_name,
1157 RawFunction::kRegularFunction, 1163 RawFunction::kImplicitStaticFinalGetter,
1158 true, // static 1164 true, // static
1159 false, // !const 1165 false, // !const
1160 false, // !abstract 1166 false, // !abstract
1161 false, // !external 1167 false, // !external
1162 false, // !native 1168 false, // !native
1163 Class::Handle(field.owner()), 1169 initializer_owner,
1164 field.token_pos())); 1170 field.token_pos()));
1165 initializer.set_result_type(AbstractType::Handle(zone, field.type())); 1171 initializer.set_result_type(AbstractType::Handle(zone, field.type()));
1166 // Static initializer functions are hidden from the user. 1172 // Static initializer functions are hidden from the user.
1167 // Since they are only executed once, we avoid optimizing 1173 // Since they are only executed once, we avoid optimizing
1168 // and inlining them. After the field is initialized, the 1174 // and inlining them. After the field is initialized, the
1169 // compiler can eliminate the call to the static initializer. 1175 // compiler can eliminate the call to the static initializer.
1170 initializer.set_is_reflectable(false); 1176 initializer.set_is_reflectable(false);
1171 initializer.set_is_debuggable(false); 1177 initializer.set_is_debuggable(false);
1172 initializer.SetIsOptimizable(false); 1178 initializer.SetIsOptimizable(false);
1173 initializer.set_is_inlinable(false); 1179 initializer.set_is_inlinable(false);
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
1242 1248
1243 // Build local scope for function and populate with the formal parameters. 1249 // Build local scope for function and populate with the formal parameters.
1244 OpenFunctionBlock(func); 1250 OpenFunctionBlock(func);
1245 AddFormalParamsToScope(&params, current_block_->scope); 1251 AddFormalParamsToScope(&params, current_block_->scope);
1246 1252
1247 intptr_t ident_pos = TokenPos(); 1253 intptr_t ident_pos = TokenPos();
1248 const String& field_name = *ExpectIdentifier("field name expected"); 1254 const String& field_name = *ExpectIdentifier("field name expected");
1249 const Class& field_class = Class::Handle(Z, func.Owner()); 1255 const Class& field_class = Class::Handle(Z, func.Owner());
1250 const Field& field = 1256 const Field& field =
1251 Field::ZoneHandle(Z, field_class.LookupStaticField(field_name)); 1257 Field::ZoneHandle(Z, field_class.LookupStaticField(field_name));
1258 ASSERT(!field.IsNull());
1252 1259
1253 // Static final fields must have an initializer. 1260 // Static final fields must have an initializer.
1254 ExpectToken(Token::kASSIGN); 1261 ExpectToken(Token::kASSIGN);
1255 1262
1256 const intptr_t expr_pos = TokenPos(); 1263 const intptr_t expr_pos = TokenPos();
1257 if (field.is_const()) { 1264 if (field.is_const()) {
1258 // We don't want to use ParseConstExpr() here because we don't want 1265 // We don't want to use ParseConstExpr() here because we don't want
1259 // the constant folding code to create, compile and execute a code 1266 // the constant folding code to create, compile and execute a code
1260 // fragment to evaluate the expression. Instead, we just make sure 1267 // fragment to evaluate the expression. Instead, we just make sure
1261 // the static const field initializer is a constant expression and 1268 // the static const field initializer is a constant expression and
(...skipping 13001 matching lines...) Expand 10 before | Expand all | Expand 10 after
14263 void Parser::SkipQualIdent() { 14270 void Parser::SkipQualIdent() {
14264 ASSERT(IsIdentifier()); 14271 ASSERT(IsIdentifier());
14265 ConsumeToken(); 14272 ConsumeToken();
14266 if (CurrentToken() == Token::kPERIOD) { 14273 if (CurrentToken() == Token::kPERIOD) {
14267 ConsumeToken(); // Consume the kPERIOD token. 14274 ConsumeToken(); // Consume the kPERIOD token.
14268 ExpectIdentifier("identifier expected after '.'"); 14275 ExpectIdentifier("identifier expected after '.'");
14269 } 14276 }
14270 } 14277 }
14271 14278
14272 } // namespace dart 14279 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698