| OLD | NEW |
| 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/object.h" | 5 #include "vm/object.h" |
| 6 | 6 |
| 7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
| 8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
| 9 #include "vm/assembler.h" | 9 #include "vm/assembler.h" |
| 10 #include "vm/become.h" | 10 #include "vm/become.h" |
| (...skipping 13502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13513 obj = from_array.At(i); | 13513 obj = from_array.At(i); |
| 13514 cloned_array.SetAt(i, obj); | 13514 cloned_array.SetAt(i, obj); |
| 13515 } | 13515 } |
| 13516 result.set_ic_data_array(cloned_array); | 13516 result.set_ic_data_array(cloned_array); |
| 13517 // Copy deoptimization reasons. | 13517 // Copy deoptimization reasons. |
| 13518 result.SetDeoptReasons(from.DeoptReasons()); | 13518 result.SetDeoptReasons(from.DeoptReasons()); |
| 13519 return result.raw(); | 13519 return result.raw(); |
| 13520 } | 13520 } |
| 13521 | 13521 |
| 13522 | 13522 |
| 13523 static Token::Kind RecognizeArithmeticOp(const String& name) { | |
| 13524 ASSERT(name.IsSymbol()); | |
| 13525 if (name.raw() == Symbols::Plus().raw()) { | |
| 13526 return Token::kADD; | |
| 13527 } else if (name.raw() == Symbols::Minus().raw()) { | |
| 13528 return Token::kSUB; | |
| 13529 } else if (name.raw() == Symbols::Star().raw()) { | |
| 13530 return Token::kMUL; | |
| 13531 } else if (name.raw() == Symbols::Slash().raw()) { | |
| 13532 return Token::kDIV; | |
| 13533 } else if (name.raw() == Symbols::TruncDivOperator().raw()) { | |
| 13534 return Token::kTRUNCDIV; | |
| 13535 } else if (name.raw() == Symbols::Percent().raw()) { | |
| 13536 return Token::kMOD; | |
| 13537 } else if (name.raw() == Symbols::BitOr().raw()) { | |
| 13538 return Token::kBIT_OR; | |
| 13539 } else if (name.raw() == Symbols::Ampersand().raw()) { | |
| 13540 return Token::kBIT_AND; | |
| 13541 } else if (name.raw() == Symbols::Caret().raw()) { | |
| 13542 return Token::kBIT_XOR; | |
| 13543 } else if (name.raw() == Symbols::LeftShiftOperator().raw()) { | |
| 13544 return Token::kSHL; | |
| 13545 } else if (name.raw() == Symbols::RightShiftOperator().raw()) { | |
| 13546 return Token::kSHR; | |
| 13547 } else if (name.raw() == Symbols::Tilde().raw()) { | |
| 13548 return Token::kBIT_NOT; | |
| 13549 } else if (name.raw() == Symbols::UnaryMinus().raw()) { | |
| 13550 return Token::kNEGATE; | |
| 13551 } | |
| 13552 return Token::kILLEGAL; | |
| 13553 } | |
| 13554 | |
| 13555 | |
| 13556 bool ICData::HasRangeFeedback() const { | |
| 13557 const String& target = String::Handle(target_name()); | |
| 13558 const Token::Kind token_kind = RecognizeArithmeticOp(target); | |
| 13559 if (!Token::IsBinaryArithmeticOperator(token_kind) && | |
| 13560 !Token::IsUnaryArithmeticOperator(token_kind)) { | |
| 13561 return false; | |
| 13562 } | |
| 13563 | |
| 13564 bool initialized = false; | |
| 13565 const intptr_t len = NumberOfChecks(); | |
| 13566 GrowableArray<intptr_t> class_ids; | |
| 13567 for (intptr_t i = 0; i < len; i++) { | |
| 13568 if (IsUsedAt(i)) { | |
| 13569 initialized = true; | |
| 13570 GetClassIdsAt(i, &class_ids); | |
| 13571 for (intptr_t j = 0; j < class_ids.length(); j++) { | |
| 13572 const intptr_t cid = class_ids[j]; | |
| 13573 if ((cid != kSmiCid) && (cid != kMintCid)) { | |
| 13574 return false; | |
| 13575 } | |
| 13576 } | |
| 13577 } | |
| 13578 } | |
| 13579 | |
| 13580 return initialized; | |
| 13581 } | |
| 13582 | |
| 13583 | |
| 13584 ICData::RangeFeedback ICData::DecodeRangeFeedbackAt(intptr_t idx) const { | |
| 13585 ASSERT((0 <= idx) && (idx < 3)); | |
| 13586 const uint32_t raw_feedback = | |
| 13587 RangeFeedbackBits::decode(raw_ptr()->state_bits_); | |
| 13588 const uint32_t feedback = | |
| 13589 (raw_feedback >> (idx * kBitsPerRangeFeedback)) & kRangeFeedbackMask; | |
| 13590 if ((feedback & kInt64RangeBit) != 0) { | |
| 13591 return kInt64Range; | |
| 13592 } | |
| 13593 | |
| 13594 if ((feedback & kUint32RangeBit) != 0) { | |
| 13595 if ((feedback & kSignedRangeBit) == 0) { | |
| 13596 return kUint32Range; | |
| 13597 } | |
| 13598 | |
| 13599 // Check if Smi is large enough to accomodate Int33: a mixture of Uint32 | |
| 13600 // and negative Int32 values. | |
| 13601 return (kSmiBits < 33) ? kInt64Range : kSmiRange; | |
| 13602 } | |
| 13603 | |
| 13604 if ((feedback & kInt32RangeBit) != 0) { | |
| 13605 return kInt32Range; | |
| 13606 } | |
| 13607 | |
| 13608 return kSmiRange; | |
| 13609 } | |
| 13610 | |
| 13611 | |
| 13612 Code::Comments& Code::Comments::New(intptr_t count) { | 13523 Code::Comments& Code::Comments::New(intptr_t count) { |
| 13613 Comments* comments; | 13524 Comments* comments; |
| 13614 if (count < 0 || count > (kIntptrMax / kNumberOfEntries)) { | 13525 if (count < 0 || count > (kIntptrMax / kNumberOfEntries)) { |
| 13615 // This should be caught before we reach here. | 13526 // This should be caught before we reach here. |
| 13616 FATAL1("Fatal error in Code::Comments::New: invalid count %" Pd "\n", | 13527 FATAL1("Fatal error in Code::Comments::New: invalid count %" Pd "\n", |
| 13617 count); | 13528 count); |
| 13618 } | 13529 } |
| 13619 if (count == 0) { | 13530 if (count == 0) { |
| 13620 comments = new Comments(Object::empty_array()); | 13531 comments = new Comments(Object::empty_array()); |
| 13621 } else { | 13532 } else { |
| (...skipping 9046 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 22668 return UserTag::null(); | 22579 return UserTag::null(); |
| 22669 } | 22580 } |
| 22670 | 22581 |
| 22671 | 22582 |
| 22672 const char* UserTag::ToCString() const { | 22583 const char* UserTag::ToCString() const { |
| 22673 const String& tag_label = String::Handle(label()); | 22584 const String& tag_label = String::Handle(label()); |
| 22674 return tag_label.ToCString(); | 22585 return tag_label.ToCString(); |
| 22675 } | 22586 } |
| 22676 | 22587 |
| 22677 } // namespace dart | 22588 } // namespace dart |
| OLD | NEW |