| 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 4199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4210 const char* Class::ToCString() const { | 4210 const char* Class::ToCString() const { |
| 4211 const Library& lib = Library::Handle(library()); | 4211 const Library& lib = Library::Handle(library()); |
| 4212 const char* library_name = lib.IsNull() ? "" : lib.ToCString(); | 4212 const char* library_name = lib.IsNull() ? "" : lib.ToCString(); |
| 4213 const char* patch_prefix = is_patch() ? "Patch " : ""; | 4213 const char* patch_prefix = is_patch() ? "Patch " : ""; |
| 4214 const char* class_name = String::Handle(Name()).ToCString(); | 4214 const char* class_name = String::Handle(Name()).ToCString(); |
| 4215 return OS::SCreate(Thread::Current()->zone(), | 4215 return OS::SCreate(Thread::Current()->zone(), |
| 4216 "%s %sClass: %s", library_name, patch_prefix, class_name); | 4216 "%s %sClass: %s", library_name, patch_prefix, class_name); |
| 4217 } | 4217 } |
| 4218 | 4218 |
| 4219 | 4219 |
| 4220 // Returns an instance of Double or Double::null(). |
| 4221 // 'index' points to either: |
| 4222 // - constants_list_ position of found element, or |
| 4223 // - constants_list_ position where new canonical can be inserted. |
| 4224 RawDouble* Class::LookupCanonicalDouble( |
| 4225 Zone* zone, double value, intptr_t* index) const { |
| 4226 ASSERT(this->raw() == Isolate::Current()->object_store()->double_class()); |
| 4227 const Array& constants = Array::Handle(zone, this->constants()); |
| 4228 const intptr_t constants_len = constants.Length(); |
| 4229 // Linear search to see whether this value is already present in the |
| 4230 // list of canonicalized constants. |
| 4231 Double& canonical_value = Double::Handle(zone); |
| 4232 while (*index < constants_len) { |
| 4233 canonical_value ^= constants.At(*index); |
| 4234 if (canonical_value.IsNull()) { |
| 4235 break; |
| 4236 } |
| 4237 if (canonical_value.BitwiseEqualsToDouble(value)) { |
| 4238 ASSERT(canonical_value.IsCanonical()); |
| 4239 return canonical_value.raw(); |
| 4240 } |
| 4241 *index = *index + 1; |
| 4242 } |
| 4243 return Double::null(); |
| 4244 } |
| 4245 |
| 4246 |
| 4247 RawMint* Class::LookupCanonicalMint( |
| 4248 Zone* zone, int64_t value, intptr_t* index) const { |
| 4249 ASSERT(this->raw() == Isolate::Current()->object_store()->mint_class()); |
| 4250 const Array& constants = Array::Handle(zone, this->constants()); |
| 4251 const intptr_t constants_len = constants.Length(); |
| 4252 // Linear search to see whether this value is already present in the |
| 4253 // list of canonicalized constants. |
| 4254 Mint& canonical_value = Mint::Handle(zone); |
| 4255 while (*index < constants_len) { |
| 4256 canonical_value ^= constants.At(*index); |
| 4257 if (canonical_value.IsNull()) { |
| 4258 break; |
| 4259 } |
| 4260 if (canonical_value.value() == value) { |
| 4261 ASSERT(canonical_value.IsCanonical()); |
| 4262 return canonical_value.raw(); |
| 4263 } |
| 4264 *index = *index + 1; |
| 4265 } |
| 4266 return Mint::null(); |
| 4267 } |
| 4268 |
| 4269 |
| 4270 RawBigint* Class::LookupCanonicalBigint(Zone* zone, |
| 4271 const Bigint& value, |
| 4272 intptr_t* index) const { |
| 4273 ASSERT(this->raw() == Isolate::Current()->object_store()->bigint_class()); |
| 4274 const Array& constants = Array::Handle(zone, this->constants()); |
| 4275 const intptr_t constants_len = constants.Length(); |
| 4276 // Linear search to see whether this value is already present in the |
| 4277 // list of canonicalized constants. |
| 4278 Bigint& canonical_value = Bigint::Handle(zone); |
| 4279 while (*index < constants_len) { |
| 4280 canonical_value ^= constants.At(*index); |
| 4281 if (canonical_value.IsNull()) { |
| 4282 break; |
| 4283 } |
| 4284 if (canonical_value.Equals(value)) { |
| 4285 ASSERT(canonical_value.IsCanonical()); |
| 4286 return canonical_value.raw(); |
| 4287 } |
| 4288 *index = *index + 1; |
| 4289 } |
| 4290 return Bigint::null(); |
| 4291 } |
| 4292 |
| 4293 |
| 4294 RawInstance* Class::LookupCanonicalInstance(Zone* zone, |
| 4295 const Instance& value, |
| 4296 intptr_t* index) const { |
| 4297 ASSERT(this->raw() == value.clazz()); |
| 4298 const Array& constants = Array::Handle(zone, this->constants()); |
| 4299 const intptr_t constants_len = constants.Length(); |
| 4300 // Linear search to see whether this value is already present in the |
| 4301 // list of canonicalized constants. |
| 4302 Instance& canonical_value = Instance::Handle(zone); |
| 4303 while (*index < constants_len) { |
| 4304 canonical_value ^= constants.At(*index); |
| 4305 if (canonical_value.IsNull()) { |
| 4306 break; |
| 4307 } |
| 4308 if (value.CanonicalizeEquals(canonical_value)) { |
| 4309 ASSERT(canonical_value.IsCanonical()); |
| 4310 return canonical_value.raw(); |
| 4311 } |
| 4312 *index = *index + 1; |
| 4313 } |
| 4314 return Instance::null(); |
| 4315 } |
| 4316 |
| 4317 |
| 4220 void Class::InsertCanonicalConstant(intptr_t index, | 4318 void Class::InsertCanonicalConstant(intptr_t index, |
| 4221 const Instance& constant) const { | 4319 const Instance& constant) const { |
| 4222 // The constant needs to be added to the list. Grow the list if it is full. | 4320 // The constant needs to be added to the list. Grow the list if it is full. |
| 4223 Array& canonical_list = Array::Handle(constants()); | 4321 Array& canonical_list = Array::Handle(constants()); |
| 4224 const intptr_t list_len = canonical_list.Length(); | 4322 const intptr_t list_len = canonical_list.Length(); |
| 4225 if (index >= list_len) { | 4323 if (index >= list_len) { |
| 4226 const intptr_t new_length = (list_len == 0) ? 4 : list_len + 4; | 4324 const intptr_t new_length = (list_len == 0) ? 4 : list_len + 4; |
| 4227 const Array& new_canonical_list = | 4325 const Array& new_canonical_list = |
| 4228 Array::Handle(Array::Grow(canonical_list, new_length, Heap::kOld)); | 4326 Array::Handle(Array::Grow(canonical_list, new_length, Heap::kOld)); |
| 4229 set_constants(new_canonical_list); | 4327 set_constants(new_canonical_list); |
| (...skipping 10175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14405 return this->raw(); | 14503 return this->raw(); |
| 14406 } | 14504 } |
| 14407 if (!CheckAndCanonicalizeFields(error_str)) { | 14505 if (!CheckAndCanonicalizeFields(error_str)) { |
| 14408 return Instance::null(); | 14506 return Instance::null(); |
| 14409 } | 14507 } |
| 14410 Thread* thread = Thread::Current(); | 14508 Thread* thread = Thread::Current(); |
| 14411 Zone* zone = thread->zone(); | 14509 Zone* zone = thread->zone(); |
| 14412 Isolate* isolate = thread->isolate(); | 14510 Isolate* isolate = thread->isolate(); |
| 14413 Instance& result = Instance::Handle(zone); | 14511 Instance& result = Instance::Handle(zone); |
| 14414 const Class& cls = Class::Handle(zone, this->clazz()); | 14512 const Class& cls = Class::Handle(zone, this->clazz()); |
| 14415 Array& constants = Array::Handle(zone, cls.constants()); | |
| 14416 const intptr_t constants_len = constants.Length(); | |
| 14417 // Linear search to see whether this value is already present in the | |
| 14418 // list of canonicalized constants. | |
| 14419 intptr_t index = 0; | 14513 intptr_t index = 0; |
| 14420 while (index < constants_len) { | 14514 result ^= cls.LookupCanonicalInstance(zone, *this, &index); |
| 14421 result ^= constants.At(index); | 14515 if (!result.IsNull()) { |
| 14422 if (result.IsNull()) { | 14516 return result.raw(); |
| 14423 break; | 14517 } |
| 14518 { |
| 14519 SafepointMutexLocker ml(isolate->constant_canonicalization_mutex()); |
| 14520 // Retry lookup. |
| 14521 { |
| 14522 Instance& temp_result = Instance::Handle(zone, |
| 14523 cls.LookupCanonicalInstance(zone, *this, &index)); |
| 14524 if (!temp_result.IsNull()) { |
| 14525 return temp_result.raw(); |
| 14526 } |
| 14424 } | 14527 } |
| 14425 if (this->CanonicalizeEquals(result)) { | 14528 |
| 14426 ASSERT(result.IsCanonical()); | 14529 // The value needs to be added to the list. Grow the list if |
| 14427 return result.raw(); | 14530 // it is full. |
| 14531 result ^= this->raw(); |
| 14532 if (result.IsNew() || |
| 14533 (result.InVMHeap() && (isolate != Dart::vm_isolate()))) { |
| 14534 /** |
| 14535 * When a snapshot is generated on a 64 bit architecture and then read |
| 14536 * into a 32 bit architecture, values which are Smi on the 64 bit |
| 14537 * architecture could potentially be converted to Mint objects, however |
| 14538 * since Smi values do not have any notion of canonical bits we lose |
| 14539 * that information when the object becomes a Mint. |
| 14540 * Some of these values could be literal values and end up in the |
| 14541 * VM isolate heap. Later when these values are referenced in a |
| 14542 * constant list we try to ensure that all the objects in the list |
| 14543 * are canonical and try to canonicalize them. When these Mint objects |
| 14544 * are encountered they do not have the canonical bit set and |
| 14545 * canonicalizing them won't work as the VM heap is read only now. |
| 14546 * In these cases we clone the object into the isolate and then |
| 14547 * canonicalize it. |
| 14548 */ |
| 14549 // Create a canonical object in old space. |
| 14550 result ^= Object::Clone(result, Heap::kOld); |
| 14428 } | 14551 } |
| 14429 index++; | 14552 ASSERT(result.IsOld()); |
| 14553 |
| 14554 result.SetCanonical(); |
| 14555 cls.InsertCanonicalConstant(index, result); |
| 14556 return result.raw(); |
| 14430 } | 14557 } |
| 14431 // The value needs to be added to the list. Grow the list if | |
| 14432 // it is full. | |
| 14433 result ^= this->raw(); | |
| 14434 if (result.IsNew() || | |
| 14435 (result.InVMHeap() && (isolate != Dart::vm_isolate()))) { | |
| 14436 /** | |
| 14437 * When a snapshot is generated on a 64 bit architecture and then read | |
| 14438 * into a 32 bit architecture, values which are Smi on the 64 bit | |
| 14439 * architecture could potentially be converted to Mint objects, however | |
| 14440 * since Smi values do not have any notion of canonical bits we lose | |
| 14441 * that information when the object becomes a Mint. | |
| 14442 * Some of these values could be literal values and end up in the | |
| 14443 * VM isolate heap. Later when these values are referenced in a | |
| 14444 * constant list we try to ensure that all the objects in the list | |
| 14445 * are canonical and try to canonicalize them. When these Mint objects | |
| 14446 * are encountered they do not have the canonical bit set and | |
| 14447 * canonicalizing them won't work as the VM heap is read only now. | |
| 14448 * In these cases we clone the object into the isolate and then | |
| 14449 * canonicalize it. | |
| 14450 */ | |
| 14451 // Create a canonical object in old space. | |
| 14452 result ^= Object::Clone(result, Heap::kOld); | |
| 14453 } | |
| 14454 ASSERT(result.IsOld()); | |
| 14455 cls.InsertCanonicalConstant(index, result); | |
| 14456 result.SetCanonical(); | |
| 14457 return result.raw(); | |
| 14458 } | 14558 } |
| 14459 | 14559 |
| 14460 | 14560 |
| 14461 RawAbstractType* Instance::GetType() const { | 14561 RawAbstractType* Instance::GetType() const { |
| 14462 if (IsNull()) { | 14562 if (IsNull()) { |
| 14463 return Type::NullType(); | 14563 return Type::NullType(); |
| 14464 } | 14564 } |
| 14465 const Class& cls = Class::Handle(clazz()); | 14565 const Class& cls = Class::Handle(clazz()); |
| 14466 if (cls.IsClosureClass()) { | 14566 if (cls.IsClosureClass()) { |
| 14467 const Function& signature = | 14567 const Function& signature = |
| (...skipping 3184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 17652 result ^= raw; | 17752 result ^= raw; |
| 17653 } | 17753 } |
| 17654 result.set_value(val); | 17754 result.set_value(val); |
| 17655 return result.raw(); | 17755 return result.raw(); |
| 17656 } | 17756 } |
| 17657 | 17757 |
| 17658 | 17758 |
| 17659 RawMint* Mint::NewCanonical(int64_t value) { | 17759 RawMint* Mint::NewCanonical(int64_t value) { |
| 17660 // Do not allocate a Mint if Smi would do. | 17760 // Do not allocate a Mint if Smi would do. |
| 17661 ASSERT(!Smi::IsValid(value)); | 17761 ASSERT(!Smi::IsValid(value)); |
| 17662 const Class& cls = | 17762 Thread* thread = Thread::Current(); |
| 17663 Class::Handle(Isolate::Current()->object_store()->mint_class()); | 17763 Zone* zone = thread->zone(); |
| 17664 const Array& constants = Array::Handle(cls.constants()); | 17764 Isolate* isolate = thread->isolate(); |
| 17665 const intptr_t constants_len = constants.Length(); | 17765 const Class& cls = Class::Handle(zone, isolate->object_store()->mint_class()); |
| 17666 // Linear search to see whether this value is already present in the | 17766 Mint& canonical_value = Mint::Handle(zone); |
| 17667 // list of canonicalized constants. | |
| 17668 Mint& canonical_value = Mint::Handle(); | |
| 17669 intptr_t index = 0; | 17767 intptr_t index = 0; |
| 17670 while (index < constants_len) { | 17768 canonical_value ^= cls.LookupCanonicalMint(zone, value, &index); |
| 17671 canonical_value ^= constants.At(index); | 17769 if (!canonical_value.IsNull()) { |
| 17672 if (canonical_value.IsNull()) { | 17770 return canonical_value.raw(); |
| 17673 break; | 17771 } |
| 17772 { |
| 17773 SafepointMutexLocker ml(isolate->constant_canonicalization_mutex()); |
| 17774 // Retry lookup. |
| 17775 { |
| 17776 const Mint& result = |
| 17777 Mint::Handle(zone, cls.LookupCanonicalMint(zone, value, &index)); |
| 17778 if (!result.IsNull()) { |
| 17779 return result.raw(); |
| 17780 } |
| 17674 } | 17781 } |
| 17675 if (canonical_value.value() == value) { | 17782 canonical_value = Mint::New(value, Heap::kOld); |
| 17676 ASSERT(canonical_value.IsCanonical()); | 17783 canonical_value.SetCanonical(); |
| 17677 return canonical_value.raw(); | 17784 // The value needs to be added to the constants list. Grow the list if |
| 17678 } | 17785 // it is full. |
| 17679 index++; | 17786 cls.InsertCanonicalConstant(index, canonical_value); |
| 17787 return canonical_value.raw(); |
| 17680 } | 17788 } |
| 17681 // The value needs to be added to the constants list. Grow the list if | |
| 17682 // it is full. | |
| 17683 canonical_value = Mint::New(value, Heap::kOld); | |
| 17684 cls.InsertCanonicalConstant(index, canonical_value); | |
| 17685 canonical_value.SetCanonical(); | |
| 17686 return canonical_value.raw(); | |
| 17687 } | 17789 } |
| 17688 | 17790 |
| 17689 | 17791 |
| 17690 bool Mint::Equals(const Instance& other) const { | 17792 bool Mint::Equals(const Instance& other) const { |
| 17691 if (this->raw() == other.raw()) { | 17793 if (this->raw() == other.raw()) { |
| 17692 // Both handles point to the same raw instance. | 17794 // Both handles point to the same raw instance. |
| 17693 return true; | 17795 return true; |
| 17694 } | 17796 } |
| 17695 if (!other.IsMint() || other.IsNull()) { | 17797 if (!other.IsMint() || other.IsNull()) { |
| 17696 return false; | 17798 return false; |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 17800 RawDouble* Double::New(const String& str, Heap::Space space) { | 17902 RawDouble* Double::New(const String& str, Heap::Space space) { |
| 17801 double double_value; | 17903 double double_value; |
| 17802 if (!CStringToDouble(str.ToCString(), str.Length(), &double_value)) { | 17904 if (!CStringToDouble(str.ToCString(), str.Length(), &double_value)) { |
| 17803 return Double::Handle().raw(); | 17905 return Double::Handle().raw(); |
| 17804 } | 17906 } |
| 17805 return New(double_value, space); | 17907 return New(double_value, space); |
| 17806 } | 17908 } |
| 17807 | 17909 |
| 17808 | 17910 |
| 17809 RawDouble* Double::NewCanonical(double value) { | 17911 RawDouble* Double::NewCanonical(double value) { |
| 17810 const Class& cls = | 17912 Thread* thread = Thread::Current(); |
| 17811 Class::Handle(Isolate::Current()->object_store()->double_class()); | 17913 Zone* zone = thread->zone(); |
| 17812 const Array& constants = Array::Handle(cls.constants()); | 17914 Isolate* isolate = thread->isolate(); |
| 17813 const intptr_t constants_len = constants.Length(); | 17915 const Class& cls = Class::Handle(isolate->object_store()->double_class()); |
| 17814 // Linear search to see whether this value is already present in the | 17916 // Linear search to see whether this value is already present in the |
| 17815 // list of canonicalized constants. | 17917 // list of canonicalized constants. |
| 17816 Double& canonical_value = Double::Handle(); | 17918 Double& canonical_value = Double::Handle(zone); |
| 17817 intptr_t index = 0; | 17919 intptr_t index = 0; |
| 17818 while (index < constants_len) { | 17920 |
| 17819 canonical_value ^= constants.At(index); | 17921 canonical_value ^= cls.LookupCanonicalDouble(zone, value, &index); |
| 17820 if (canonical_value.IsNull()) { | 17922 if (!canonical_value.IsNull()) { |
| 17821 break; | 17923 return canonical_value.raw(); |
| 17924 } |
| 17925 { |
| 17926 SafepointMutexLocker ml(isolate->constant_canonicalization_mutex()); |
| 17927 // Retry lookup. |
| 17928 { |
| 17929 const Double& result = |
| 17930 Double::Handle(zone, cls.LookupCanonicalDouble(zone, value, &index)); |
| 17931 if (!result.IsNull()) { |
| 17932 return result.raw(); |
| 17933 } |
| 17822 } | 17934 } |
| 17823 if (canonical_value.BitwiseEqualsToDouble(value)) { | 17935 canonical_value = Double::New(value, Heap::kOld); |
| 17824 return canonical_value.raw(); | 17936 canonical_value.SetCanonical(); |
| 17825 } | 17937 // The value needs to be added to the constants list. Grow the list if |
| 17826 index++; | 17938 // it is full. |
| 17939 cls.InsertCanonicalConstant(index, canonical_value); |
| 17940 return canonical_value.raw(); |
| 17827 } | 17941 } |
| 17828 // The value needs to be added to the constants list. Grow the list if | |
| 17829 // it is full. | |
| 17830 canonical_value = Double::New(value, Heap::kOld); | |
| 17831 cls.InsertCanonicalConstant(index, canonical_value); | |
| 17832 canonical_value.SetCanonical(); | |
| 17833 return canonical_value.raw(); | |
| 17834 } | 17942 } |
| 17835 | 17943 |
| 17836 | 17944 |
| 17837 RawDouble* Double::NewCanonical(const String& str) { | 17945 RawDouble* Double::NewCanonical(const String& str) { |
| 17838 double double_value; | 17946 double double_value; |
| 17839 if (!CStringToDouble(str.ToCString(), str.Length(), &double_value)) { | 17947 if (!CStringToDouble(str.ToCString(), str.Length(), &double_value)) { |
| 17840 return Double::Handle().raw(); | 17948 return Double::Handle().raw(); |
| 17841 } | 17949 } |
| 17842 return NewCanonical(double_value); | 17950 return NewCanonical(double_value); |
| 17843 } | 17951 } |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 18104 ((str[1] == 'x') || (str[1] == 'X'))) { | 18212 ((str[1] == 'x') || (str[1] == 'X'))) { |
| 18105 digits = NewDigitsFromHexCString(&str[2], &used, space); | 18213 digits = NewDigitsFromHexCString(&str[2], &used, space); |
| 18106 } else { | 18214 } else { |
| 18107 digits = NewDigitsFromDecCString(str, &used, space); | 18215 digits = NewDigitsFromDecCString(str, &used, space); |
| 18108 } | 18216 } |
| 18109 return New(neg, used, digits, space); | 18217 return New(neg, used, digits, space); |
| 18110 } | 18218 } |
| 18111 | 18219 |
| 18112 | 18220 |
| 18113 RawBigint* Bigint::NewCanonical(const String& str) { | 18221 RawBigint* Bigint::NewCanonical(const String& str) { |
| 18222 Thread* thread = Thread::Current(); |
| 18223 Zone* zone = thread->zone(); |
| 18224 Isolate* isolate = thread->isolate(); |
| 18114 const Bigint& value = Bigint::Handle( | 18225 const Bigint& value = Bigint::Handle( |
| 18115 Bigint::NewFromCString(str.ToCString(), Heap::kOld)); | 18226 zone, Bigint::NewFromCString(str.ToCString(), Heap::kOld)); |
| 18116 const Class& cls = | 18227 const Class& cls = |
| 18117 Class::Handle(Isolate::Current()->object_store()->bigint_class()); | 18228 Class::Handle(zone, isolate->object_store()->bigint_class()); |
| 18118 const Array& constants = Array::Handle(cls.constants()); | |
| 18119 const intptr_t constants_len = constants.Length(); | |
| 18120 // Linear search to see whether this value is already present in the | |
| 18121 // list of canonicalized constants. | |
| 18122 Bigint& canonical_value = Bigint::Handle(); | |
| 18123 intptr_t index = 0; | 18229 intptr_t index = 0; |
| 18124 while (index < constants_len) { | 18230 const Bigint& canonical_value = |
| 18125 canonical_value ^= constants.At(index); | 18231 Bigint::Handle(zone, cls.LookupCanonicalBigint(zone, value, &index)); |
| 18126 if (canonical_value.IsNull()) { | 18232 if (!canonical_value.IsNull()) { |
| 18127 break; | 18233 return canonical_value.raw(); |
| 18234 } |
| 18235 { |
| 18236 SafepointMutexLocker ml(isolate->constant_canonicalization_mutex()); |
| 18237 // Retry lookup. |
| 18238 { |
| 18239 const Bigint& result = |
| 18240 Bigint::Handle(zone, cls.LookupCanonicalBigint(zone, value, &index)); |
| 18241 if (!result.IsNull()) { |
| 18242 return result.raw(); |
| 18243 } |
| 18128 } | 18244 } |
| 18129 if (canonical_value.Equals(value)) { | 18245 value.SetCanonical(); |
| 18130 return canonical_value.raw(); | 18246 // The value needs to be added to the constants list. Grow the list if |
| 18131 } | 18247 // it is full. |
| 18132 index++; | 18248 cls.InsertCanonicalConstant(index, value); |
| 18249 return value.raw(); |
| 18133 } | 18250 } |
| 18134 // The value needs to be added to the constants list. Grow the list if | |
| 18135 // it is full. | |
| 18136 cls.InsertCanonicalConstant(index, value); | |
| 18137 value.SetCanonical(); | |
| 18138 return value.raw(); | |
| 18139 } | 18251 } |
| 18140 | 18252 |
| 18141 | 18253 |
| 18142 RawTypedData* Bigint::NewDigitsFromHexCString(const char* str, intptr_t* used, | 18254 RawTypedData* Bigint::NewDigitsFromHexCString(const char* str, intptr_t* used, |
| 18143 Heap::Space space) { | 18255 Heap::Space space) { |
| 18144 const int kBitsPerHexDigit = 4; | 18256 const int kBitsPerHexDigit = 4; |
| 18145 const int kHexDigitsPerDigit = 8; | 18257 const int kHexDigitsPerDigit = 8; |
| 18146 const int kBitsPerDigit = kBitsPerHexDigit * kHexDigitsPerDigit; | 18258 const int kBitsPerDigit = kBitsPerHexDigit * kHexDigitsPerDigit; |
| 18147 intptr_t hex_i = strlen(str); // Terminating byte excluded. | 18259 intptr_t hex_i = strlen(str); // Terminating byte excluded. |
| 18148 if ((hex_i <= 0) || (hex_i >= kMaxInt32)) { | 18260 if ((hex_i <= 0) || (hex_i >= kMaxInt32)) { |
| (...skipping 3608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 21757 return UserTag::null(); | 21869 return UserTag::null(); |
| 21758 } | 21870 } |
| 21759 | 21871 |
| 21760 | 21872 |
| 21761 const char* UserTag::ToCString() const { | 21873 const char* UserTag::ToCString() const { |
| 21762 const String& tag_label = String::Handle(label()); | 21874 const String& tag_label = String::Handle(label()); |
| 21763 return tag_label.ToCString(); | 21875 return tag_label.ToCString(); |
| 21764 } | 21876 } |
| 21765 | 21877 |
| 21766 } // namespace dart | 21878 } // namespace dart |
| OLD | NEW |