Chromium Code Reviews| 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/cpu.h" | 10 #include "vm/cpu.h" |
| (...skipping 14437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 14448 | 14448 |
| 14449 | 14449 |
| 14450 RawInstance* Instance::CheckAndCanonicalize(const char** error_str) const { | 14450 RawInstance* Instance::CheckAndCanonicalize(const char** error_str) const { |
| 14451 ASSERT(!IsNull()); | 14451 ASSERT(!IsNull()); |
| 14452 if (this->IsCanonical()) { | 14452 if (this->IsCanonical()) { |
| 14453 return this->raw(); | 14453 return this->raw(); |
| 14454 } | 14454 } |
| 14455 if (!CheckAndCanonicalizeFields(error_str)) { | 14455 if (!CheckAndCanonicalizeFields(error_str)) { |
| 14456 return Instance::null(); | 14456 return Instance::null(); |
| 14457 } | 14457 } |
| 14458 Instance& result = Instance::Handle(); | 14458 Thread* thread = Thread::Current(); |
| 14459 const Class& cls = Class::Handle(this->clazz()); | 14459 Zone* zone = thread->zone(); |
| 14460 Array& constants = Array::Handle(cls.constants()); | 14460 Isolate* isolate = thread->isolate(); |
| 14461 Instance& result = Instance::Handle(zone); | |
| 14462 const Class& cls = Class::Handle(zone, this->clazz()); | |
| 14463 Array& constants = Array::Handle(zone, cls.constants()); | |
| 14461 const intptr_t constants_len = constants.Length(); | 14464 const intptr_t constants_len = constants.Length(); |
| 14462 // Linear search to see whether this value is already present in the | 14465 // Linear search to see whether this value is already present in the |
| 14463 // list of canonicalized constants. | 14466 // list of canonicalized constants. |
| 14464 intptr_t index = 0; | 14467 intptr_t index = 0; |
| 14465 while (index < constants_len) { | 14468 while (index < constants_len) { |
| 14466 result ^= constants.At(index); | 14469 result ^= constants.At(index); |
| 14467 if (result.IsNull()) { | 14470 if (result.IsNull()) { |
| 14468 break; | 14471 break; |
| 14469 } | 14472 } |
| 14470 if (this->CanonicalizeEquals(result)) { | 14473 if (this->CanonicalizeEquals(result)) { |
| 14471 ASSERT(result.IsCanonical()); | 14474 ASSERT(result.IsCanonical()); |
| 14472 return result.raw(); | 14475 return result.raw(); |
| 14473 } | 14476 } |
| 14474 index++; | 14477 index++; |
| 14475 } | 14478 } |
| 14476 // The value needs to be added to the list. Grow the list if | 14479 // The value needs to be added to the list. Grow the list if |
| 14477 // it is full. | 14480 // it is full. |
| 14478 result ^= this->raw(); | 14481 result ^= this->raw(); |
| 14479 if (result.IsNew()) { | 14482 if (result.IsNew() || |
| 14483 (result.InVMHeap() && (isolate != Dart::vm_isolate()))) { | |
| 14480 // Create a canonical object in old space. | 14484 // Create a canonical object in old space. |
|
srdjan
2015/10/05 18:06:36
Maybe comment here briefly why this is necessary.
siva
2015/10/05 21:51:05
Done.
| |
| 14481 result ^= Object::Clone(result, Heap::kOld); | 14485 result ^= Object::Clone(result, Heap::kOld); |
| 14482 } | 14486 } |
| 14483 ASSERT(result.IsOld()); | 14487 ASSERT(result.IsOld()); |
| 14484 cls.InsertCanonicalConstant(index, result); | 14488 cls.InsertCanonicalConstant(index, result); |
| 14485 result.SetCanonical(); | 14489 result.SetCanonical(); |
| 14486 return result.raw(); | 14490 return result.raw(); |
| 14487 } | 14491 } |
| 14488 | 14492 |
| 14489 | 14493 |
| 14490 RawType* Instance::GetType() const { | 14494 RawType* Instance::GetType() const { |
| (...skipping 7000 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 21491 return tag_label.ToCString(); | 21495 return tag_label.ToCString(); |
| 21492 } | 21496 } |
| 21493 | 21497 |
| 21494 | 21498 |
| 21495 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 21499 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
| 21496 Instance::PrintJSONImpl(stream, ref); | 21500 Instance::PrintJSONImpl(stream, ref); |
| 21497 } | 21501 } |
| 21498 | 21502 |
| 21499 | 21503 |
| 21500 } // namespace dart | 21504 } // namespace dart |
| OLD | NEW |