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

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

Issue 1488773004: VM: More read-only handles for constant null-objects/-instances. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years 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 8 #ifndef DART_PRECOMPILED
9 9
10 #include "lib/invocation_mirror.h" 10 #include "lib/invocation_mirror.h"
(...skipping 2510 matching lines...) Expand 10 before | Expand all | Expand 10 after
2521 initializers->NodeAt(i)->AsStoreInstanceFieldNode(); 2521 initializers->NodeAt(i)->AsStoreInstanceFieldNode();
2522 if (initializer->field().raw() == field.raw()) { 2522 if (initializer->field().raw() == field.raw()) {
2523 found = true; 2523 found = true;
2524 break; 2524 break;
2525 } 2525 }
2526 } 2526 }
2527 } 2527 }
2528 2528
2529 if (found) continue; 2529 if (found) continue;
2530 2530
2531 field.RecordStore(Object::Handle(Z)); 2531 field.RecordStore(Object::null_object());
2532 } 2532 }
2533 } 2533 }
2534 2534
2535 2535
2536 AstNode* Parser::ParseExternalInitializedField(const Field& field) { 2536 AstNode* Parser::ParseExternalInitializedField(const Field& field) {
2537 // Only use this function if the initialized field originates 2537 // Only use this function if the initialized field originates
2538 // from a different class. We need to save and restore current 2538 // from a different class. We need to save and restore current
2539 // class, library, and token stream (script). 2539 // class, library, and token stream (script).
2540 ASSERT(current_class().raw() != field.origin()); 2540 ASSERT(current_class().raw() != field.origin());
2541 const Class& saved_class = Class::Handle(Z, current_class().raw()); 2541 const Class& saved_class = Class::Handle(Z, current_class().raw());
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
2688 GrowableArray<AstNode*> setter_args; 2688 GrowableArray<AstNode*> setter_args;
2689 setter_args.Add(init_value); 2689 setter_args.Add(init_value);
2690 ArrayNode* setter_args_array = new(Z) ArrayNode( 2690 ArrayNode* setter_args_array = new(Z) ArrayNode(
2691 init_pos, 2691 init_pos,
2692 Type::ZoneHandle(Z, Type::ArrayType()), 2692 Type::ZoneHandle(Z, Type::ArrayType()),
2693 setter_args); 2693 setter_args);
2694 nsm_args->Add(setter_args_array); 2694 nsm_args->Add(setter_args_array);
2695 2695
2696 // List argumentNames. 2696 // List argumentNames.
2697 // The missing implicit setter of the field has no argument names. 2697 // The missing implicit setter of the field has no argument names.
2698 nsm_args->Add(new(Z) LiteralNode(init_pos, Array::ZoneHandle(Z))); 2698 nsm_args->Add(new(Z) LiteralNode(init_pos, Object::null_array()));
2699 2699
2700 // List existingArgumentNames. 2700 // List existingArgumentNames.
2701 // There is no setter for the final field, thus there are 2701 // There is no setter for the final field, thus there are
2702 // no existing names. 2702 // no existing names.
2703 nsm_args->Add(new(Z) LiteralNode(init_pos, Array::ZoneHandle(Z))); 2703 nsm_args->Add(new(Z) LiteralNode(init_pos, Object::null_array()));
2704 2704
2705 AstNode* nsm_call = 2705 AstNode* nsm_call =
2706 MakeStaticCall(Symbols::NoSuchMethodError(), 2706 MakeStaticCall(Symbols::NoSuchMethodError(),
2707 Library::PrivateCoreLibName(Symbols::ThrowNew()), 2707 Library::PrivateCoreLibName(Symbols::ThrowNew()),
2708 nsm_args); 2708 nsm_args);
2709 2709
2710 LetNode* let = new(Z) LetNode(init_pos); 2710 LetNode* let = new(Z) LetNode(init_pos);
2711 let->AddNode(init_value); 2711 let->AddNode(init_value);
2712 let->AddNode(nsm_call); 2712 let->AddNode(nsm_call);
2713 result = let; 2713 result = let;
(...skipping 4725 matching lines...) Expand 10 before | Expand all | Expand 10 after
7439 ASSERT(expr->IsLiteralNode()); 7439 ASSERT(expr->IsLiteralNode());
7440 variable->SetConstValue(expr->AsLiteralNode()->literal()); 7440 variable->SetConstValue(expr->AsLiteralNode()->literal());
7441 } 7441 }
7442 } else if (is_final || is_const) { 7442 } else if (is_final || is_const) {
7443 ReportError(ident_pos, 7443 ReportError(ident_pos,
7444 "missing initialization of 'final' or 'const' variable"); 7444 "missing initialization of 'final' or 'const' variable");
7445 } else { 7445 } else {
7446 // Initialize variable with null. 7446 // Initialize variable with null.
7447 variable = new(Z) LocalVariable( 7447 variable = new(Z) LocalVariable(
7448 assign_pos, ident, type); 7448 assign_pos, ident, type);
7449 AstNode* null_expr = new(Z) LiteralNode(ident_pos, Instance::ZoneHandle(Z)); 7449 AstNode* null_expr = new(Z) LiteralNode(ident_pos, Object::null_instance());
7450 initialization = new(Z) StoreLocalNode( 7450 initialization = new(Z) StoreLocalNode(
7451 ident_pos, variable, null_expr); 7451 ident_pos, variable, null_expr);
7452 } 7452 }
7453 7453
7454 ASSERT(current_block_ != NULL); 7454 ASSERT(current_block_ != NULL);
7455 const intptr_t previous_pos = 7455 const intptr_t previous_pos =
7456 current_block_->scope->PreviousReferencePos(ident); 7456 current_block_->scope->PreviousReferencePos(ident);
7457 if (previous_pos >= 0) { 7457 if (previous_pos >= 0) {
7458 ASSERT(!script_.IsNull()); 7458 ASSERT(!script_.IsNull());
7459 if (previous_pos > ident_pos) { 7459 if (previous_pos > ident_pos) {
(...skipping 2821 matching lines...) Expand 10 before | Expand all | Expand 10 after
10281 method_name = Library::PrivateCoreLibName(Symbols::ThrowNew()).raw(); 10281 method_name = Library::PrivateCoreLibName(Symbols::ThrowNew()).raw();
10282 } else { 10282 } else {
10283 arguments->Add(new(Z) LiteralNode(type_pos, *prefix)); 10283 arguments->Add(new(Z) LiteralNode(type_pos, *prefix));
10284 method_name = Library::PrivateCoreLibName( 10284 method_name = Library::PrivateCoreLibName(
10285 Symbols::ThrowNewIfNotLoaded()).raw(); 10285 Symbols::ThrowNewIfNotLoaded()).raw();
10286 } 10286 }
10287 // Location argument. 10287 // Location argument.
10288 arguments->Add(new(Z) LiteralNode( 10288 arguments->Add(new(Z) LiteralNode(
10289 type_pos, Integer::ZoneHandle(Z, Integer::New(type_pos)))); 10289 type_pos, Integer::ZoneHandle(Z, Integer::New(type_pos))));
10290 // Src value argument. 10290 // Src value argument.
10291 arguments->Add(new(Z) LiteralNode(type_pos, Instance::ZoneHandle(Z))); 10291 arguments->Add(new(Z) LiteralNode(type_pos, Object::null_instance()));
10292 // Dst type name argument. 10292 // Dst type name argument.
10293 arguments->Add(new(Z) LiteralNode(type_pos, Symbols::Malformed())); 10293 arguments->Add(new(Z) LiteralNode(type_pos, Symbols::Malformed()));
10294 // Dst name argument. 10294 // Dst name argument.
10295 arguments->Add(new(Z) LiteralNode(type_pos, Symbols::Empty())); 10295 arguments->Add(new(Z) LiteralNode(type_pos, Symbols::Empty()));
10296 // Malformed type error or malbounded type error. 10296 // Malformed type error or malbounded type error.
10297 const Error& error = Error::Handle(Z, type.error()); 10297 const Error& error = Error::Handle(Z, type.error());
10298 ASSERT(!error.IsNull()); 10298 ASSERT(!error.IsNull());
10299 arguments->Add(new(Z) LiteralNode(type_pos, String::ZoneHandle(Z, 10299 arguments->Add(new(Z) LiteralNode(type_pos, String::ZoneHandle(Z,
10300 Symbols::New(error.ToErrorCString())))); 10300 Symbols::New(error.ToErrorCString()))));
10301 return MakeStaticCall(Symbols::TypeError(), method_name, arguments); 10301 return MakeStaticCall(Symbols::TypeError(), method_name, arguments);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
10340 // Smi invocation_type. 10340 // Smi invocation_type.
10341 if (cls.IsTopLevel()) { 10341 if (cls.IsTopLevel()) {
10342 ASSERT(im_call == InvocationMirror::kStatic || 10342 ASSERT(im_call == InvocationMirror::kStatic ||
10343 im_call == InvocationMirror::kTopLevel); 10343 im_call == InvocationMirror::kTopLevel);
10344 im_call = InvocationMirror::kTopLevel; 10344 im_call = InvocationMirror::kTopLevel;
10345 } 10345 }
10346 arguments->Add(new(Z) LiteralNode(call_pos, Smi::ZoneHandle(Z, 10346 arguments->Add(new(Z) LiteralNode(call_pos, Smi::ZoneHandle(Z,
10347 Smi::New(InvocationMirror::EncodeType(im_call, im_type))))); 10347 Smi::New(InvocationMirror::EncodeType(im_call, im_type)))));
10348 // List arguments. 10348 // List arguments.
10349 if (function_arguments == NULL) { 10349 if (function_arguments == NULL) {
10350 arguments->Add(new(Z) LiteralNode(call_pos, Array::ZoneHandle(Z))); 10350 arguments->Add(new(Z) LiteralNode(call_pos, Object::null_array()));
10351 } else { 10351 } else {
10352 ArrayNode* array = new(Z) ArrayNode( 10352 ArrayNode* array = new(Z) ArrayNode(
10353 call_pos, 10353 call_pos,
10354 Type::ZoneHandle(Z, Type::ArrayType()), 10354 Type::ZoneHandle(Z, Type::ArrayType()),
10355 function_arguments->nodes()); 10355 function_arguments->nodes());
10356 arguments->Add(array); 10356 arguments->Add(array);
10357 } 10357 }
10358 // List argumentNames. 10358 // List argumentNames.
10359 if (function_arguments == NULL) { 10359 if (function_arguments == NULL) {
10360 arguments->Add(new(Z) LiteralNode(call_pos, Array::ZoneHandle(Z))); 10360 arguments->Add(new(Z) LiteralNode(call_pos, Object::null_array()));
10361 } else { 10361 } else {
10362 arguments->Add(new(Z) LiteralNode(call_pos, function_arguments->names())); 10362 arguments->Add(new(Z) LiteralNode(call_pos, function_arguments->names()));
10363 } 10363 }
10364 10364
10365 // List existingArgumentNames. 10365 // List existingArgumentNames.
10366 // Check if there exists a function with the same name unless caller 10366 // Check if there exists a function with the same name unless caller
10367 // has done the lookup already. If there is a function with the same 10367 // has done the lookup already. If there is a function with the same
10368 // name but incompatible parameters, inform the NoSuchMethodError what the 10368 // name but incompatible parameters, inform the NoSuchMethodError what the
10369 // expected parameters are. 10369 // expected parameters are.
10370 Function& function = Function::Handle(Z); 10370 Function& function = Function::Handle(Z);
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
10553 } 10553 }
10554 } 10554 }
10555 } 10555 }
10556 } 10556 }
10557 if (binary_op == Token::kIFNULL) { 10557 if (binary_op == Token::kIFNULL) {
10558 // Handle a ?? b. 10558 // Handle a ?? b.
10559 LetNode* result = new(Z) LetNode(op_pos); 10559 LetNode* result = new(Z) LetNode(op_pos);
10560 LocalVariable* left_temp = result->AddInitializer(lhs); 10560 LocalVariable* left_temp = result->AddInitializer(lhs);
10561 const intptr_t no_pos = Scanner::kNoSourcePos; 10561 const intptr_t no_pos = Scanner::kNoSourcePos;
10562 LiteralNode* null_operand = 10562 LiteralNode* null_operand =
10563 new(Z) LiteralNode(no_pos, Instance::ZoneHandle(Z)); 10563 new(Z) LiteralNode(no_pos, Object::null_instance());
10564 LoadLocalNode* load_left_temp = new(Z) LoadLocalNode(no_pos, left_temp); 10564 LoadLocalNode* load_left_temp = new(Z) LoadLocalNode(no_pos, left_temp);
10565 ComparisonNode* null_compare = 10565 ComparisonNode* null_compare =
10566 new(Z) ComparisonNode(no_pos, 10566 new(Z) ComparisonNode(no_pos,
10567 Token::kNE_STRICT, 10567 Token::kNE_STRICT,
10568 load_left_temp, 10568 load_left_temp,
10569 null_operand); 10569 null_operand);
10570 result->AddNode(new(Z) ConditionalExprNode(op_pos, 10570 result->AddNode(new(Z) ConditionalExprNode(op_pos,
10571 null_compare, 10571 null_compare,
10572 load_left_temp, 10572 load_left_temp,
10573 rhs)); 10573 rhs));
(...skipping 1555 matching lines...) Expand 10 before | Expand all | Expand 10 after
12129 arg_values.SetAt(0, type_arguments); 12129 arg_values.SetAt(0, type_arguments);
12130 } 12130 }
12131 for (int i = 0; i < arguments->length(); i++) { 12131 for (int i = 0; i < arguments->length(); i++) {
12132 AstNode* arg = arguments->NodeAt(i); 12132 AstNode* arg = arguments->NodeAt(i);
12133 // Arguments have been evaluated to a literal value already. 12133 // Arguments have been evaluated to a literal value already.
12134 ASSERT(arg->IsLiteralNode()); 12134 ASSERT(arg->IsLiteralNode());
12135 arg_values.SetAt((i + kNumExtraArgs), arg->AsLiteralNode()->literal()); 12135 arg_values.SetAt((i + kNumExtraArgs), arg->AsLiteralNode()->literal());
12136 } 12136 }
12137 const Array& args_descriptor = Array::Handle(Z, 12137 const Array& args_descriptor = Array::Handle(Z,
12138 ArgumentsDescriptor::New(num_arguments, arguments->names())); 12138 ArgumentsDescriptor::New(num_arguments, arguments->names()));
12139 Object& result = Object::Handle(Z); 12139 const Object& result = Object::Handle(Z,
12140 result = DartEntry::InvokeFunction(constructor, arg_values, args_descriptor); 12140 DartEntry::InvokeFunction(constructor, arg_values, args_descriptor));
12141 if (result.IsError()) { 12141 if (result.IsError()) {
12142 // An exception may not occur in every parse attempt, i.e., the 12142 // An exception may not occur in every parse attempt, i.e., the
12143 // generated AST is not deterministic. Therefore mark the function as 12143 // generated AST is not deterministic. Therefore mark the function as
12144 // not optimizable. 12144 // not optimizable.
12145 current_function().SetIsOptimizable(false); 12145 current_function().SetIsOptimizable(false);
12146 if (result.IsUnhandledException()) { 12146 if (result.IsUnhandledException()) {
12147 return result.raw(); 12147 return result.raw();
12148 } else { 12148 } else {
12149 thread()->long_jump_base()->Jump(1, Error::Cast(result)); 12149 thread()->long_jump_base()->Jump(1, Error::Cast(result));
12150 UNREACHABLE(); 12150 UNREACHABLE();
(...skipping 1716 matching lines...) Expand 10 before | Expand all | Expand 10 after
13867 const Integer& literal = Integer::ZoneHandle(Z, CurrentIntegerLiteral()); 13867 const Integer& literal = Integer::ZoneHandle(Z, CurrentIntegerLiteral());
13868 primary = new(Z) LiteralNode(TokenPos(), literal); 13868 primary = new(Z) LiteralNode(TokenPos(), literal);
13869 ConsumeToken(); 13869 ConsumeToken();
13870 } else if (token == Token::kTRUE) { 13870 } else if (token == Token::kTRUE) {
13871 primary = new(Z) LiteralNode(TokenPos(), Bool::True()); 13871 primary = new(Z) LiteralNode(TokenPos(), Bool::True());
13872 ConsumeToken(); 13872 ConsumeToken();
13873 } else if (token == Token::kFALSE) { 13873 } else if (token == Token::kFALSE) {
13874 primary = new(Z) LiteralNode(TokenPos(), Bool::False()); 13874 primary = new(Z) LiteralNode(TokenPos(), Bool::False());
13875 ConsumeToken(); 13875 ConsumeToken();
13876 } else if (token == Token::kNULL) { 13876 } else if (token == Token::kNULL) {
13877 primary = new(Z) LiteralNode(TokenPos(), Instance::ZoneHandle(Z)); 13877 primary = new(Z) LiteralNode(TokenPos(), Object::null_instance());
13878 ConsumeToken(); 13878 ConsumeToken();
13879 } else if (token == Token::kLPAREN) { 13879 } else if (token == Token::kLPAREN) {
13880 ConsumeToken(); 13880 ConsumeToken();
13881 const bool saved_mode = SetAllowFunctionLiterals(true); 13881 const bool saved_mode = SetAllowFunctionLiterals(true);
13882 primary = ParseExpr(kAllowConst, kConsumeCascades); 13882 primary = ParseExpr(kAllowConst, kConsumeCascades);
13883 SetAllowFunctionLiterals(saved_mode); 13883 SetAllowFunctionLiterals(saved_mode);
13884 ExpectToken(Token::kRPAREN); 13884 ExpectToken(Token::kRPAREN);
13885 } else if (token == Token::kDOUBLE) { 13885 } else if (token == Token::kDOUBLE) {
13886 Double& double_value = Double::ZoneHandle(Z, CurrentDoubleLiteral()); 13886 const Double& double_value = Double::ZoneHandle(Z, CurrentDoubleLiteral());
13887 if (double_value.IsNull()) { 13887 if (double_value.IsNull()) {
13888 ReportError("invalid double literal"); 13888 ReportError("invalid double literal");
13889 } 13889 }
13890 primary = new(Z) LiteralNode(TokenPos(), double_value); 13890 primary = new(Z) LiteralNode(TokenPos(), double_value);
13891 ConsumeToken(); 13891 ConsumeToken();
13892 } else if (token == Token::kSTRING) { 13892 } else if (token == Token::kSTRING) {
13893 primary = ParseStringLiteral(true); 13893 primary = ParseStringLiteral(true);
13894 } else if (token == Token::kNEW) { 13894 } else if (token == Token::kNEW) {
13895 ConsumeToken(); 13895 ConsumeToken();
13896 primary = ParseNewOperator(Token::kNEW); 13896 primary = ParseNewOperator(Token::kNEW);
(...skipping 528 matching lines...) Expand 10 before | Expand all | Expand 10 after
14425 const ArgumentListNode& function_args, 14425 const ArgumentListNode& function_args,
14426 const LocalVariable* temp_for_last_arg, 14426 const LocalVariable* temp_for_last_arg,
14427 bool is_super_invocation) { 14427 bool is_super_invocation) {
14428 UNREACHABLE(); 14428 UNREACHABLE();
14429 return NULL; 14429 return NULL;
14430 } 14430 }
14431 14431
14432 } // namespace dart 14432 } // namespace dart
14433 14433
14434 #endif // DART_PRECOMPILED 14434 #endif // DART_PRECOMPILED
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