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

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

Issue 2708213004: Introduce a flag --limit-ints-to-64-bits in the VM in order to investigate the (Closed)
Patch Set: work in progress Created 3 years, 10 months 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
« no previous file with comments | « runtime/vm/flag_list.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 19150 matching lines...) Expand 10 before | Expand all | Expand 10 after
19161 result.set_digits( 19161 result.set_digits(
19162 TypedData::Handle(zone, TypedData::EmptyUint32Array(thread))); 19162 TypedData::Handle(zone, TypedData::EmptyUint32Array(thread)));
19163 } 19163 }
19164 result.SetNeg(neg); 19164 result.SetNeg(neg);
19165 result.SetUsed(used); 19165 result.SetUsed(used);
19166 return result.raw(); 19166 return result.raw();
19167 } 19167 }
19168 19168
19169 19169
19170 RawBigint* Bigint::NewFromInt64(int64_t value, Heap::Space space) { 19170 RawBigint* Bigint::NewFromInt64(int64_t value, Heap::Space space) {
19171 // Currently only used to convert Smi or Mint to hex String, therefore do
19172 // not throw RangeError if --limit-ints-to-64-bits.
19171 const TypedData& digits = TypedData::Handle(NewDigits(2, space)); 19173 const TypedData& digits = TypedData::Handle(NewDigits(2, space));
19172 bool neg; 19174 bool neg;
19173 uint64_t abs_value; 19175 uint64_t abs_value;
19174 if (value < 0) { 19176 if (value < 0) {
19175 neg = true; 19177 neg = true;
19176 abs_value = -value; 19178 abs_value = -value;
19177 } else { 19179 } else {
19178 neg = false; 19180 neg = false;
19179 abs_value = value; 19181 abs_value = value;
19180 } 19182 }
19181 SetDigitAt(digits, 0, static_cast<uint32_t>(abs_value)); 19183 SetDigitAt(digits, 0, static_cast<uint32_t>(abs_value));
19182 SetDigitAt(digits, 1, static_cast<uint32_t>(abs_value >> 32)); 19184 SetDigitAt(digits, 1, static_cast<uint32_t>(abs_value >> 32));
19183 return New(neg, 2, digits, space); 19185 return New(neg, 2, digits, space);
19184 } 19186 }
19185 19187
19186 19188
19187 RawBigint* Bigint::NewFromUint64(uint64_t value, Heap::Space space) { 19189 RawBigint* Bigint::NewFromUint64(uint64_t value, Heap::Space space) {
19190 if (FLAG_limit_ints_to_64_bits) {
19191 Exceptions::ThrowRangeErrorMsg(
19192 "Integer operand requires conversion to Bigint");
19193 }
19188 const TypedData& digits = TypedData::Handle(NewDigits(2, space)); 19194 const TypedData& digits = TypedData::Handle(NewDigits(2, space));
19189 SetDigitAt(digits, 0, static_cast<uint32_t>(value)); 19195 SetDigitAt(digits, 0, static_cast<uint32_t>(value));
19190 SetDigitAt(digits, 1, static_cast<uint32_t>(value >> 32)); 19196 SetDigitAt(digits, 1, static_cast<uint32_t>(value >> 32));
19191 return New(false, 2, digits, space); 19197 return New(false, 2, digits, space);
19192 } 19198 }
19193 19199
19194 19200
19195 RawBigint* Bigint::NewFromShiftedInt64(int64_t value, 19201 RawBigint* Bigint::NewFromShiftedInt64(int64_t value,
19196 intptr_t shift, 19202 intptr_t shift,
19197 Heap::Space space) { 19203 Heap::Space space) {
19204 if (FLAG_limit_ints_to_64_bits) {
19205 // The allocated Bigint value is not necessarily out of range, but it may
19206 // be used as an operand in an operation resulting in a Bigint.
19207 Exceptions::ThrowRangeErrorMsg(
19208 "Integer operand requires conversion to Bigint");
19209 }
19198 ASSERT(kBitsPerDigit == 32); 19210 ASSERT(kBitsPerDigit == 32);
19199 ASSERT(shift >= 0); 19211 ASSERT(shift >= 0);
19200 const intptr_t digit_shift = shift / kBitsPerDigit; 19212 const intptr_t digit_shift = shift / kBitsPerDigit;
19201 const intptr_t bit_shift = shift % kBitsPerDigit; 19213 const intptr_t bit_shift = shift % kBitsPerDigit;
19202 const intptr_t used = 3 + digit_shift; 19214 const intptr_t used = 3 + digit_shift;
19203 const TypedData& digits = TypedData::Handle(NewDigits(used, space)); 19215 const TypedData& digits = TypedData::Handle(NewDigits(used, space));
19204 bool neg; 19216 bool neg;
19205 uint64_t abs_value; 19217 uint64_t abs_value;
19206 if (value < 0) { 19218 if (value < 0) {
19207 neg = true; 19219 neg = true;
(...skipping 10 matching lines...) Expand all
19218 SetDigitAt(digits, 1 + digit_shift, 19230 SetDigitAt(digits, 1 + digit_shift,
19219 static_cast<uint32_t>(abs_value >> (32 - bit_shift))); 19231 static_cast<uint32_t>(abs_value >> (32 - bit_shift)));
19220 SetDigitAt(digits, 2 + digit_shift, 19232 SetDigitAt(digits, 2 + digit_shift,
19221 (bit_shift == 0) ? 0 : static_cast<uint32_t>(abs_value >> 19233 (bit_shift == 0) ? 0 : static_cast<uint32_t>(abs_value >>
19222 (64 - bit_shift))); 19234 (64 - bit_shift)));
19223 return New(neg, used, digits, space); 19235 return New(neg, used, digits, space);
19224 } 19236 }
19225 19237
19226 19238
19227 RawBigint* Bigint::NewFromCString(const char* str, Heap::Space space) { 19239 RawBigint* Bigint::NewFromCString(const char* str, Heap::Space space) {
19240 // Allow parser to scan Bigint literal, even with --limit-ints-to-64-bits.
19228 ASSERT(str != NULL); 19241 ASSERT(str != NULL);
19229 bool neg = false; 19242 bool neg = false;
19230 TypedData& digits = TypedData::Handle(); 19243 TypedData& digits = TypedData::Handle();
19231 if (str[0] == '-') { 19244 if (str[0] == '-') {
19232 ASSERT(str[1] != '-'); 19245 ASSERT(str[1] != '-');
19233 neg = true; 19246 neg = true;
19234 str++; 19247 str++;
19235 } 19248 }
19236 intptr_t used; 19249 intptr_t used;
19237 const intptr_t str_length = strlen(str); 19250 const intptr_t str_length = strlen(str);
19238 if ((str_length >= 2) && (str[0] == '0') && 19251 if ((str_length >= 2) && (str[0] == '0') &&
19239 ((str[1] == 'x') || (str[1] == 'X'))) { 19252 ((str[1] == 'x') || (str[1] == 'X'))) {
19240 digits = NewDigitsFromHexCString(&str[2], &used, space); 19253 digits = NewDigitsFromHexCString(&str[2], &used, space);
19241 } else { 19254 } else {
19242 digits = NewDigitsFromDecCString(str, &used, space); 19255 digits = NewDigitsFromDecCString(str, &used, space);
19243 } 19256 }
19244 return New(neg, used, digits, space); 19257 return New(neg, used, digits, space);
19245 } 19258 }
19246 19259
19247 19260
19248 RawBigint* Bigint::NewCanonical(const String& str) { 19261 RawBigint* Bigint::NewCanonical(const String& str) {
19262 // Allow parser to scan Bigint literal, even with --limit-ints-to-64-bits.
19249 Thread* thread = Thread::Current(); 19263 Thread* thread = Thread::Current();
19250 Zone* zone = thread->zone(); 19264 Zone* zone = thread->zone();
19251 Isolate* isolate = thread->isolate(); 19265 Isolate* isolate = thread->isolate();
19252 const Bigint& value = 19266 const Bigint& value =
19253 Bigint::Handle(zone, Bigint::NewFromCString(str.ToCString(), Heap::kOld)); 19267 Bigint::Handle(zone, Bigint::NewFromCString(str.ToCString(), Heap::kOld));
19254 const Class& cls = 19268 const Class& cls =
19255 Class::Handle(zone, isolate->object_store()->bigint_class()); 19269 Class::Handle(zone, isolate->object_store()->bigint_class());
19256 intptr_t index = 0; 19270 intptr_t index = 0;
19257 Bigint& canonical_value = Bigint::Handle(zone); 19271 Bigint& canonical_value = Bigint::Handle(zone);
19258 canonical_value ^= cls.LookupCanonicalBigint(zone, value, &index); 19272 canonical_value ^= cls.LookupCanonicalBigint(zone, value, &index);
(...skipping 3633 matching lines...) Expand 10 before | Expand all | Expand 10 after
22892 return UserTag::null(); 22906 return UserTag::null();
22893 } 22907 }
22894 22908
22895 22909
22896 const char* UserTag::ToCString() const { 22910 const char* UserTag::ToCString() const {
22897 const String& tag_label = String::Handle(label()); 22911 const String& tag_label = String::Handle(label());
22898 return tag_label.ToCString(); 22912 return tag_label.ToCString();
22899 } 22913 }
22900 22914
22901 } // namespace dart 22915 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/flag_list.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698