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

Side by Side Diff: dart/runtime/vm/flow_graph_type_propagator.cc

Issue 60733003: Version 0.8.10.6 (Closed) Base URL: http://dart.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 1 month 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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/flow_graph_type_propagator.h" 5 #include "vm/flow_graph_type_propagator.h"
6 6
7 #include "vm/cha.h" 7 #include "vm/cha.h"
8 #include "vm/bit_vector.h" 8 #include "vm/bit_vector.h"
9 #include "vm/il_printer.h" 9 #include "vm/il_printer.h"
10 10
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after
408 408
409 if (other->ToNullableCid() == kNullCid) { 409 if (other->ToNullableCid() == kNullCid) {
410 return; 410 return;
411 } 411 }
412 412
413 if (ToNullableCid() != other->ToNullableCid()) { 413 if (ToNullableCid() != other->ToNullableCid()) {
414 ASSERT(cid_ != kNullCid); 414 ASSERT(cid_ != kNullCid);
415 cid_ = kDynamicCid; 415 cid_ = kDynamicCid;
416 } 416 }
417 417
418 Error& malformed_error = Error::Handle(); 418 const AbstractType* compile_type = ToAbstractType();
419 if (ToAbstractType()->IsMoreSpecificThan(*other->ToAbstractType(), 419 const AbstractType* other_compile_type = other->ToAbstractType();
420 &malformed_error)) { 420 if (compile_type->IsMoreSpecificThan(*other_compile_type, NULL)) {
421 type_ = other->ToAbstractType(); 421 type_ = other_compile_type;
422 } else if (other->ToAbstractType()->IsMoreSpecificThan(*ToAbstractType(), 422 } else if (other_compile_type->IsMoreSpecificThan(*compile_type, NULL)) {
423 &malformed_error)) { 423 // Nothing to do.
424 // Nothing to do.
425 } else { 424 } else {
426 // Can't unify. 425 // Can't unify.
427 type_ = &Type::ZoneHandle(Type::DynamicType()); 426 type_ = &Type::ZoneHandle(Type::DynamicType());
428 } 427 }
429 ASSERT(malformed_error.IsNull());
430 } 428 }
431 429
432 430
433 static bool IsNullableCid(intptr_t cid) { 431 static bool IsNullableCid(intptr_t cid) {
434 ASSERT(cid != kIllegalCid); 432 ASSERT(cid != kIllegalCid);
435 return cid == kNullCid || cid == kDynamicCid; 433 return cid == kNullCid || cid == kDynamicCid;
436 } 434 }
437 435
438 436
439 CompileType CompileType::Create(intptr_t cid, const AbstractType& type) { 437 CompileType CompileType::Create(intptr_t cid, const AbstractType& type) {
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
608 *is_instance = IsNull(); 606 *is_instance = IsNull();
609 return HasDecidableNullability(); 607 return HasDecidableNullability();
610 } 608 }
611 609
612 // If the value can be null then we can't eliminate the 610 // If the value can be null then we can't eliminate the
613 // check unless null is allowed. 611 // check unless null is allowed.
614 if (is_nullable_ && !is_nullable) { 612 if (is_nullable_ && !is_nullable) {
615 return false; 613 return false;
616 } 614 }
617 615
618 Error& malformed_error = Error::Handle(); 616 *is_instance = compile_type.IsMoreSpecificThan(type, NULL);
619 *is_instance = compile_type.IsMoreSpecificThan(type, &malformed_error); 617 return *is_instance;
620 return malformed_error.IsNull() && *is_instance;
621 } 618 }
622 619
623 620
624 bool CompileType::IsMoreSpecificThan(const AbstractType& other) { 621 bool CompileType::IsMoreSpecificThan(const AbstractType& other) {
625 if (IsNone() || other.IsMalformed()) { 622 if (IsNone()) {
626 return false; 623 return false;
627 } 624 }
628 625
629 if (other.IsVoidType()) { 626 if (other.IsVoidType()) {
630 // The only value assignable to void is null. 627 // The only value assignable to void is null.
631 return IsNull(); 628 return IsNull();
632 } 629 }
633 630
634 Error& malformed_error = Error::Handle(); 631 return ToAbstractType()->IsMoreSpecificThan(other, NULL);
635 const bool is_more_specific =
636 ToAbstractType()->IsMoreSpecificThan(other, &malformed_error);
637 return malformed_error.IsNull() && is_more_specific;
638 } 632 }
639 633
640 634
641 CompileType* Value::Type() { 635 CompileType* Value::Type() {
642 if (reaching_type_ == NULL) { 636 if (reaching_type_ == NULL) {
643 reaching_type_ = definition()->Type(); 637 reaching_type_ = definition()->Type();
644 } 638 }
645 return reaching_type_; 639 return reaching_type_;
646 } 640 }
647 641
(...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after
1212 return CompileType::FromCid(kDoubleCid); 1206 return CompileType::FromCid(kDoubleCid);
1213 } 1207 }
1214 1208
1215 1209
1216 CompileType InvokeMathCFunctionInstr::ComputeType() const { 1210 CompileType InvokeMathCFunctionInstr::ComputeType() const {
1217 return CompileType::FromCid(kDoubleCid); 1211 return CompileType::FromCid(kDoubleCid);
1218 } 1212 }
1219 1213
1220 1214
1221 } // namespace dart 1215 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698