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

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

Issue 2135683002: Do not reload when we are evaluating a constant expression during compilation (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 5 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 | « no previous file | 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 #include "vm/flags.h" 6 #include "vm/flags.h"
7 7
8 #ifndef DART_PRECOMPILED_RUNTIME 8 #ifndef DART_PRECOMPILED_RUNTIME
9 9
10 #include "lib/invocation_mirror.h" 10 #include "lib/invocation_mirror.h"
(...skipping 12212 matching lines...) Expand 10 before | Expand all | Expand 10 after
12223 } else { 12223 } else {
12224 // The implicit static getter will throw the exception if necessary. 12224 // The implicit static getter will throw the exception if necessary.
12225 return new(Z) StaticGetterNode( 12225 return new(Z) StaticGetterNode(
12226 field_ref_pos, NULL, field_owner, field_name); 12226 field_ref_pos, NULL, field_owner, field_name);
12227 } 12227 }
12228 } else if (value.raw() == Object::sentinel().raw()) { 12228 } else if (value.raw() == Object::sentinel().raw()) {
12229 // This field has not been referenced yet and thus the value has 12229 // This field has not been referenced yet and thus the value has
12230 // not been evaluated. If the field is const, call the static getter method 12230 // not been evaluated. If the field is const, call the static getter method
12231 // to evaluate the expression and canonicalize the value. 12231 // to evaluate the expression and canonicalize the value.
12232 if (field.is_const()) { 12232 if (field.is_const()) {
12233 NoReloadScope no_reload_scope(isolate(), thread());
12233 field.SetStaticValue(Object::transition_sentinel()); 12234 field.SetStaticValue(Object::transition_sentinel());
12234 const int kNumArguments = 0; // no arguments. 12235 const int kNumArguments = 0; // no arguments.
12235 const Function& func = Function::Handle(Z, 12236 const Function& func = Function::Handle(Z,
12236 Resolver::ResolveStatic(field_owner, 12237 Resolver::ResolveStatic(field_owner,
12237 getter_name, 12238 getter_name,
12238 kNumArguments, 12239 kNumArguments,
12239 Object::empty_array())); 12240 Object::empty_array()));
12240 ASSERT(!func.IsNull()); 12241 ASSERT(!func.IsNull());
12241 ASSERT(func.kind() == RawFunction::kImplicitStaticFinalGetter); 12242 ASSERT(func.kind() == RawFunction::kImplicitStaticFinalGetter);
12242 Object& const_value = Object::Handle(Z); 12243 Object& const_value = Object::Handle(Z);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
12280 return new(Z) StaticGetterNode( 12281 return new(Z) StaticGetterNode(
12281 field_ref_pos, NULL, field_owner, field_name); 12282 field_ref_pos, NULL, field_owner, field_name);
12282 } 12283 }
12283 12284
12284 12285
12285 RawObject* Parser::EvaluateConstConstructorCall( 12286 RawObject* Parser::EvaluateConstConstructorCall(
12286 const Class& type_class, 12287 const Class& type_class,
12287 const TypeArguments& type_arguments, 12288 const TypeArguments& type_arguments,
12288 const Function& constructor, 12289 const Function& constructor,
12289 ArgumentListNode* arguments) { 12290 ArgumentListNode* arguments) {
12291 NoReloadScope no_reload_scope(isolate(), thread());
12290 // Factories have one extra argument: the type arguments. 12292 // Factories have one extra argument: the type arguments.
12291 // Constructors have 1 extra arguments: receiver. 12293 // Constructors have 1 extra arguments: receiver.
12292 const int kNumExtraArgs = 1; 12294 const int kNumExtraArgs = 1;
12293 const int num_arguments = arguments->length() + kNumExtraArgs; 12295 const int num_arguments = arguments->length() + kNumExtraArgs;
12294 const Array& arg_values = 12296 const Array& arg_values =
12295 Array::Handle(Z, Array::New(num_arguments, Heap::kOld)); 12297 Array::Handle(Z, Array::New(num_arguments, Heap::kOld));
12296 Instance& instance = Instance::Handle(Z); 12298 Instance& instance = Instance::Handle(Z);
12297 if (!constructor.IsFactory()) { 12299 if (!constructor.IsFactory()) {
12298 instance = Instance::New(type_class, Heap::kOld); 12300 instance = Instance::New(type_class, Heap::kOld);
12299 if (!type_arguments.IsNull()) { 12301 if (!type_arguments.IsNull()) {
(...skipping 1494 matching lines...) Expand 10 before | Expand all | Expand 10 after
13794 } 13796 }
13795 if (!type_bound.IsNull()) { 13797 if (!type_bound.IsNull()) {
13796 new_object = new(Z) AssignableNode( 13798 new_object = new(Z) AssignableNode(
13797 new_pos, new_object, type_bound, Symbols::FactoryResult()); 13799 new_pos, new_object, type_bound, Symbols::FactoryResult());
13798 } 13800 }
13799 return new_object; 13801 return new_object;
13800 } 13802 }
13801 13803
13802 13804
13803 String& Parser::Interpolate(const GrowableArray<AstNode*>& values) { 13805 String& Parser::Interpolate(const GrowableArray<AstNode*>& values) {
13806 NoReloadScope no_reload_scope(isolate(), thread());
13804 const Class& cls = Class::Handle( 13807 const Class& cls = Class::Handle(
13805 Z, Library::LookupCoreClass(Symbols::StringBase())); 13808 Z, Library::LookupCoreClass(Symbols::StringBase()));
13806 ASSERT(!cls.IsNull()); 13809 ASSERT(!cls.IsNull());
13807 const Function& func = Function::Handle(Z, cls.LookupStaticFunction( 13810 const Function& func = Function::Handle(Z, cls.LookupStaticFunction(
13808 Library::PrivateCoreLibName(Symbols::Interpolate()))); 13811 Library::PrivateCoreLibName(Symbols::Interpolate())));
13809 ASSERT(!func.IsNull()); 13812 ASSERT(!func.IsNull());
13810 13813
13811 // Build the array of literal values to interpolate. 13814 // Build the array of literal values to interpolate.
13812 const Array& value_arr = Array::Handle(Z, 13815 const Array& value_arr = Array::Handle(Z,
13813 Array::New(values.length(), Heap::kOld)); 13816 Array::New(values.length(), Heap::kOld));
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
14141 UnexpectedToken(); 14144 UnexpectedToken();
14142 } 14145 }
14143 return primary; 14146 return primary;
14144 } 14147 }
14145 14148
14146 14149
14147 // Evaluate expression in expr and return the value. The expression must 14150 // Evaluate expression in expr and return the value. The expression must
14148 // be a compile time constant. 14151 // be a compile time constant.
14149 const Instance& Parser::EvaluateConstExpr(TokenPosition expr_pos, 14152 const Instance& Parser::EvaluateConstExpr(TokenPosition expr_pos,
14150 AstNode* expr) { 14153 AstNode* expr) {
14154 NoReloadScope no_reload_scope(isolate(), thread());
14151 if (expr->IsLiteralNode()) { 14155 if (expr->IsLiteralNode()) {
14152 return expr->AsLiteralNode()->literal(); 14156 return expr->AsLiteralNode()->literal();
14153 } else if (expr->IsLoadLocalNode() && 14157 } else if (expr->IsLoadLocalNode() &&
14154 expr->AsLoadLocalNode()->local().IsConst()) { 14158 expr->AsLoadLocalNode()->local().IsConst()) {
14155 return *expr->AsLoadLocalNode()->local().ConstValue(); 14159 return *expr->AsLoadLocalNode()->local().ConstValue();
14156 } else if (expr->IsLoadStaticFieldNode()) { 14160 } else if (expr->IsLoadStaticFieldNode()) {
14157 const Field& field = expr->AsLoadStaticFieldNode()->field(); 14161 const Field& field = expr->AsLoadStaticFieldNode()->field();
14158 // We already checked that this field is const and has been 14162 // We already checked that this field is const and has been
14159 // initialized. 14163 // initialized.
14160 ASSERT(field.is_const()); 14164 ASSERT(field.is_const());
(...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after
14636 const ArgumentListNode& function_args, 14640 const ArgumentListNode& function_args,
14637 const LocalVariable* temp_for_last_arg, 14641 const LocalVariable* temp_for_last_arg,
14638 bool is_super_invocation) { 14642 bool is_super_invocation) {
14639 UNREACHABLE(); 14643 UNREACHABLE();
14640 return NULL; 14644 return NULL;
14641 } 14645 }
14642 14646
14643 } // namespace dart 14647 } // namespace dart
14644 14648
14645 #endif // DART_PRECOMPILED_RUNTIME 14649 #endif // DART_PRECOMPILED_RUNTIME
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698