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

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

Issue 1493693002: Make ?? a compile-time constant operator. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Fix test, runs in dart2js and analyzer. 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
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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/ast.h" 5 #include "vm/ast.h"
6 #include "vm/compiler.h" 6 #include "vm/compiler.h"
7 #include "vm/dart_entry.h" 7 #include "vm/dart_entry.h"
8 #include "vm/isolate.h" 8 #include "vm/isolate.h"
9 #include "vm/object_store.h" 9 #include "vm/object_store.h"
10 #include "vm/resolver.h" 10 #include "vm/resolver.h"
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 case Token::kSUB: 305 case Token::kSUB:
306 case Token::kMUL: 306 case Token::kMUL:
307 case Token::kDIV: 307 case Token::kDIV:
308 case Token::kMOD: 308 case Token::kMOD:
309 case Token::kTRUNCDIV: 309 case Token::kTRUNCDIV:
310 case Token::kBIT_OR: 310 case Token::kBIT_OR:
311 case Token::kBIT_XOR: 311 case Token::kBIT_XOR:
312 case Token::kBIT_AND: 312 case Token::kBIT_AND:
313 case Token::kSHL: 313 case Token::kSHL:
314 case Token::kSHR: 314 case Token::kSHR:
315 case Token::kIFNULL:
315 return this->left()->IsPotentiallyConst() && 316 return this->left()->IsPotentiallyConst() &&
316 this->right()->IsPotentiallyConst(); 317 this->right()->IsPotentiallyConst();
317 default: 318 default:
318 UNREACHABLE(); 319 UNREACHABLE();
319 return false; 320 return false;
320 } 321 }
321 } 322 }
322 323
323 324
324 const Instance* BinaryOpNode::EvalConstExpr() const { 325 const Instance* BinaryOpNode::EvalConstExpr() const {
325 const Instance* left_val = this->left()->EvalConstExpr(); 326 const Instance* left_val = this->left()->EvalConstExpr();
326 if (left_val == NULL) { 327 if (left_val == NULL) {
327 return NULL; 328 return NULL;
328 } 329 }
329 if (!left_val->IsNumber() && !left_val->IsBool() && !left_val->IsString()) { 330 if (!left_val->IsNumber() && !left_val->IsBool() && !left_val->IsString() &&
331 kind_ != Token::kIFNULL) {
330 return NULL; 332 return NULL;
331 } 333 }
332 const Instance* right_val = this->right()->EvalConstExpr(); 334 const Instance* right_val = this->right()->EvalConstExpr();
333 if (right_val == NULL) { 335 if (right_val == NULL) {
334 return NULL; 336 return NULL;
335 } 337 }
336 switch (kind_) { 338 switch (kind_) {
337 case Token::kADD: 339 case Token::kADD:
338 if (left_val->IsString()) { 340 if (left_val->IsString()) {
339 return right_val->IsString() ? left_val : NULL; 341 return right_val->IsString() ? left_val : NULL;
(...skipping 24 matching lines...) Expand all
364 right_val->IsInteger()) { 366 right_val->IsInteger()) {
365 return right_val; 367 return right_val;
366 } 368 }
367 return NULL; 369 return NULL;
368 case Token::kOR: 370 case Token::kOR:
369 case Token::kAND: 371 case Token::kAND:
370 if (left_val->IsBool() && right_val->IsBool()) { 372 if (left_val->IsBool() && right_val->IsBool()) {
371 return left_val; 373 return left_val;
372 } 374 }
373 return NULL; 375 return NULL;
376 case Token::kIFNULL:
377 if (left_val->IsNull()) return right_val;
Ivan Posva 2015/12/03 21:29:04 {} as is the style elsewhere in this file.
Lasse Reichstein Nielsen 2015/12/04 12:11:46 Done.
378 return left_val;
374 default: 379 default:
375 UNREACHABLE(); 380 UNREACHABLE();
376 return NULL; 381 return NULL;
377 } 382 }
378 return NULL; 383 return NULL;
379 } 384 }
380 385
381 386
382 AstNode* UnaryOpNode::UnaryOpOrLiteral(intptr_t token_pos, 387 AstNode* UnaryOpNode::UnaryOpOrLiteral(intptr_t token_pos,
383 Token::Kind kind, 388 Token::Kind kind,
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after
763 if (result.IsError() || result.IsNull()) { 768 if (result.IsError() || result.IsNull()) {
764 // TODO(turnidge): We could get better error messages by returning 769 // TODO(turnidge): We could get better error messages by returning
765 // the Error object directly to the parser. This will involve 770 // the Error object directly to the parser. This will involve
766 // replumbing all of the EvalConstExpr methods. 771 // replumbing all of the EvalConstExpr methods.
767 return NULL; 772 return NULL;
768 } 773 }
769 return &Instance::ZoneHandle(Instance::Cast(result).raw()); 774 return &Instance::ZoneHandle(Instance::Cast(result).raw());
770 } 775 }
771 776
772 } // namespace dart 777 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698