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 15195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15206 RawInteger* Integer::NewCanonical(const String& str) { | 15206 RawInteger* Integer::NewCanonical(const String& str) { |
15207 // We are not supposed to have integers represented as two byte strings. | 15207 // We are not supposed to have integers represented as two byte strings. |
15208 ASSERT(str.IsOneByteString()); | 15208 ASSERT(str.IsOneByteString()); |
15209 int64_t value; | 15209 int64_t value; |
15210 if (!OS::StringToInt64(str.ToCString(), &value)) { | 15210 if (!OS::StringToInt64(str.ToCString(), &value)) { |
15211 const Bigint& big = Bigint::Handle(Bigint::NewCanonical(str)); | 15211 const Bigint& big = Bigint::Handle(Bigint::NewCanonical(str)); |
15212 ASSERT(!BigintOperations::FitsIntoSmi(big)); | 15212 ASSERT(!BigintOperations::FitsIntoSmi(big)); |
15213 ASSERT(!BigintOperations::FitsIntoInt64(big)); | 15213 ASSERT(!BigintOperations::FitsIntoInt64(big)); |
15214 return big.raw(); | 15214 return big.raw(); |
15215 } | 15215 } |
15216 if ((value <= Smi::kMaxValue) && (value >= Smi::kMinValue)) { | 15216 if (Smi::IsValid(value)) { |
15217 return Smi::New(value); | 15217 return Smi::New(static_cast<intptr_t>(value)); |
15218 } | 15218 } |
15219 return Mint::NewCanonical(value); | 15219 return Mint::NewCanonical(value); |
15220 } | 15220 } |
15221 | 15221 |
15222 | 15222 |
15223 // dart2js represents integers as double precision floats, which can represent | 15223 // dart2js represents integers as double precision floats, which can represent |
15224 // anything in the range -2^53 ... 2^53. | 15224 // anything in the range -2^53 ... 2^53. |
15225 static bool IsJavascriptInt(int64_t value) { | 15225 static bool IsJavascriptInt(int64_t value) { |
15226 return ((-0x20000000000000LL <= value) && (value <= 0x20000000000000LL)); | 15226 return ((-0x20000000000000LL <= value) && (value <= 0x20000000000000LL)); |
15227 } | 15227 } |
15228 | 15228 |
15229 | 15229 |
15230 RawInteger* Integer::New(int64_t value, Heap::Space space, const bool silent) { | 15230 RawInteger* Integer::New(int64_t value, Heap::Space space, const bool silent) { |
15231 const bool is_smi = (value <= Smi::kMaxValue) && (value >= Smi::kMinValue); | 15231 const bool is_smi = Smi::IsValid(value); |
15232 if (!silent && | 15232 if (!silent && |
15233 FLAG_throw_on_javascript_int_overflow && | 15233 FLAG_throw_on_javascript_int_overflow && |
15234 !IsJavascriptInt(value)) { | 15234 !IsJavascriptInt(value)) { |
15235 const Integer& i = is_smi ? Integer::Handle(Smi::New(value)) | 15235 const Integer& i = is_smi ? |
15236 : Integer::Handle(Mint::New(value)); | 15236 Integer::Handle(Smi::New(static_cast<intptr_t>(value))) : |
| 15237 Integer::Handle(Mint::New(value)); |
15237 ThrowJavascriptIntegerOverflow(i); | 15238 ThrowJavascriptIntegerOverflow(i); |
15238 } | 15239 } |
15239 if (is_smi) { | 15240 if (is_smi) { |
15240 return Smi::New(value); | 15241 return Smi::New(static_cast<intptr_t>(value)); |
15241 } | 15242 } |
15242 return Mint::New(value, space); | 15243 return Mint::New(value, space); |
15243 } | 15244 } |
15244 | 15245 |
15245 | 15246 |
15246 RawInteger* Integer::NewFromUint64(uint64_t value, Heap::Space space) { | 15247 RawInteger* Integer::NewFromUint64(uint64_t value, Heap::Space space) { |
15247 if (value > static_cast<uint64_t>(Mint::kMaxValue)) { | 15248 if (value > static_cast<uint64_t>(Mint::kMaxValue)) { |
15248 if (FLAG_throw_on_javascript_int_overflow) { | 15249 if (FLAG_throw_on_javascript_int_overflow) { |
15249 const Integer &i = | 15250 const Integer &i = |
15250 Integer::Handle(BigintOperations::NewFromUint64(value)); | 15251 Integer::Handle(BigintOperations::NewFromUint64(value)); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15307 RawInteger* Integer::AsValidInteger() const { | 15308 RawInteger* Integer::AsValidInteger() const { |
15308 if (FLAG_throw_on_javascript_int_overflow && | 15309 if (FLAG_throw_on_javascript_int_overflow && |
15309 CheckJavascriptIntegerOverflow()) { | 15310 CheckJavascriptIntegerOverflow()) { |
15310 ThrowJavascriptIntegerOverflow(*this); | 15311 ThrowJavascriptIntegerOverflow(*this); |
15311 } | 15312 } |
15312 if (IsSmi()) return raw(); | 15313 if (IsSmi()) return raw(); |
15313 if (IsMint()) { | 15314 if (IsMint()) { |
15314 Mint& mint = Mint::Handle(); | 15315 Mint& mint = Mint::Handle(); |
15315 mint ^= raw(); | 15316 mint ^= raw(); |
15316 if (Smi::IsValid(mint.value())) { | 15317 if (Smi::IsValid(mint.value())) { |
15317 return Smi::New(mint.value()); | 15318 return Smi::New(static_cast<intptr_t>(mint.value())); |
15318 } else { | 15319 } else { |
15319 return raw(); | 15320 return raw(); |
15320 } | 15321 } |
15321 } | 15322 } |
15322 ASSERT(IsBigint()); | 15323 ASSERT(IsBigint()); |
15323 Bigint& big_value = Bigint::Handle(); | 15324 Bigint& big_value = Bigint::Handle(); |
15324 big_value ^= raw(); | 15325 big_value ^= raw(); |
15325 if (BigintOperations::FitsIntoSmi(big_value)) { | 15326 if (BigintOperations::FitsIntoSmi(big_value)) { |
15326 return BigintOperations::ToSmi(big_value); | 15327 return BigintOperations::ToSmi(big_value); |
15327 } else if (BigintOperations::FitsIntoInt64(big_value)) { | 15328 } else if (BigintOperations::FitsIntoInt64(big_value)) { |
(...skipping 3836 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19164 return tag_label.ToCString(); | 19165 return tag_label.ToCString(); |
19165 } | 19166 } |
19166 | 19167 |
19167 | 19168 |
19168 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 19169 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
19169 Instance::PrintJSONImpl(stream, ref); | 19170 Instance::PrintJSONImpl(stream, ref); |
19170 } | 19171 } |
19171 | 19172 |
19172 | 19173 |
19173 } // namespace dart | 19174 } // namespace dart |
OLD | NEW |