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

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

Issue 14962008: Fix issue 5275: The VM must always generate the most compact form of an integer (Smi, Mint or Bigin… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 7 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 | Annotate | Revision Log
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 "platform/assert.h" 5 #include "platform/assert.h"
6 #include "vm/assembler.h" 6 #include "vm/assembler.h"
7 #include "vm/bigint_operations.h" 7 #include "vm/bigint_operations.h"
8 #include "vm/class_finalizer.h" 8 #include "vm/class_finalizer.h"
9 #include "vm/isolate.h" 9 #include "vm/isolate.h"
10 #include "vm/object.h" 10 #include "vm/object.h"
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 EXPECT_EQ(5.0, smi.AsDoubleValue()); 229 EXPECT_EQ(5.0, smi.AsDoubleValue());
230 230
231 Smi& a = Smi::Handle(Smi::New(5)); 231 Smi& a = Smi::Handle(Smi::New(5));
232 Smi& b = Smi::Handle(Smi::New(3)); 232 Smi& b = Smi::Handle(Smi::New(3));
233 EXPECT_EQ(1, a.CompareWith(b)); 233 EXPECT_EQ(1, a.CompareWith(b));
234 EXPECT_EQ(-1, b.CompareWith(a)); 234 EXPECT_EQ(-1, b.CompareWith(a));
235 EXPECT_EQ(0, a.CompareWith(a)); 235 EXPECT_EQ(0, a.CompareWith(a));
236 236
237 Smi& c = Smi::Handle(Smi::New(-1)); 237 Smi& c = Smi::Handle(Smi::New(-1));
238 238
239 Mint& mint1 = Mint::Handle( 239 Mint& mint1 = Mint::Handle();
240 Mint::New(DART_2PART_UINT64_C(0x7FFFFFFF, 100))); 240 mint1 ^= Integer::New(DART_2PART_UINT64_C(0x7FFFFFFF, 100));
241 Mint& mint2 = Mint::Handle( 241 Mint& mint2 = Mint::Handle();
242 Mint::New(-DART_2PART_UINT64_C(0x7FFFFFFF, 100))); 242 mint2 ^= Integer::New(-DART_2PART_UINT64_C(0x7FFFFFFF, 100));
243 EXPECT_EQ(-1, a.CompareWith(mint1)); 243 EXPECT_EQ(-1, a.CompareWith(mint1));
244 EXPECT_EQ(1, a.CompareWith(mint2)); 244 EXPECT_EQ(1, a.CompareWith(mint2));
245 EXPECT_EQ(-1, c.CompareWith(mint1)); 245 EXPECT_EQ(-1, c.CompareWith(mint1));
246 EXPECT_EQ(1, c.CompareWith(mint2)); 246 EXPECT_EQ(1, c.CompareWith(mint2));
247 247
248 Bigint& big1 = Bigint::Handle(BigintOperations::NewFromCString( 248 Bigint& big1 = Bigint::Handle(BigintOperations::NewFromCString(
249 "10000000000000000000")); 249 "10000000000000000000"));
250 Bigint& big2 = Bigint::Handle(BigintOperations::NewFromCString( 250 Bigint& big2 = Bigint::Handle(BigintOperations::NewFromCString(
251 "-10000000000000000000")); 251 "-10000000000000000000"));
252 EXPECT_EQ(-1, a.CompareWith(big1)); 252 EXPECT_EQ(-1, a.CompareWith(big1));
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 } 300 }
301 301
302 302
303 TEST_CASE(Mint) { 303 TEST_CASE(Mint) {
304 // On 64-bit architectures a Smi is stored in a 64 bit word. A Midint cannot 304 // On 64-bit architectures a Smi is stored in a 64 bit word. A Midint cannot
305 // be allocated if it does fit into a Smi. 305 // be allocated if it does fit into a Smi.
306 #if !defined(ARCH_IS_64_BIT) 306 #if !defined(ARCH_IS_64_BIT)
307 { Mint& med = Mint::Handle(); 307 { Mint& med = Mint::Handle();
308 EXPECT(med.IsNull()); 308 EXPECT(med.IsNull());
309 int64_t v = DART_2PART_UINT64_C(1, 0); 309 int64_t v = DART_2PART_UINT64_C(1, 0);
310 med = Mint::New(v); 310 med ^= Integer::New(v);
311 EXPECT_EQ(v, med.value()); 311 EXPECT_EQ(v, med.value());
312 const String& smi_str = String::Handle(String::New("1")); 312 const String& smi_str = String::Handle(String::New("1"));
313 const String& mint1_str = String::Handle(String::New("2147419168")); 313 const String& mint1_str = String::Handle(String::New("2147419168"));
314 const String& mint2_str = String::Handle(String::New("-2147419168")); 314 const String& mint2_str = String::Handle(String::New("-2147419168"));
315 Integer& i = Integer::Handle(Integer::NewCanonical(smi_str)); 315 Integer& i = Integer::Handle(Integer::NewCanonical(smi_str));
316 EXPECT(i.IsSmi()); 316 EXPECT(i.IsSmi());
317 i = Integer::NewCanonical(mint1_str); 317 i = Integer::NewCanonical(mint1_str);
318 EXPECT(i.IsMint()); 318 EXPECT(i.IsMint());
319 EXPECT(!i.IsZero()); 319 EXPECT(!i.IsZero());
320 EXPECT(!i.IsNegative()); 320 EXPECT(!i.IsNegative());
321 i = Integer::NewCanonical(mint2_str); 321 i = Integer::NewCanonical(mint2_str);
322 EXPECT(i.IsMint()); 322 EXPECT(i.IsMint());
323 EXPECT(!i.IsZero()); 323 EXPECT(!i.IsZero());
324 EXPECT(i.IsNegative()); 324 EXPECT(i.IsNegative());
325 } 325 }
326 Integer& i = Integer::Handle(Mint::New(DART_2PART_UINT64_C(1, 0))); 326 Integer& i = Integer::Handle(Integer::New(DART_2PART_UINT64_C(1, 0)));
327 EXPECT(i.IsMint()); 327 EXPECT(i.IsMint());
328 EXPECT(!i.IsZero()); 328 EXPECT(!i.IsZero());
329 EXPECT(!i.IsNegative()); 329 EXPECT(!i.IsNegative());
330 Integer& i1 = Integer::Handle(Mint::New(DART_2PART_UINT64_C(1010, 0))); 330 Integer& i1 = Integer::Handle(Integer::New(DART_2PART_UINT64_C(1010, 0)));
331 Mint& i2 = Mint::Handle(Mint::New(DART_2PART_UINT64_C(1010, 0))); 331 Mint& i2 = Mint::Handle();
332 i2 ^= Integer::New(DART_2PART_UINT64_C(1010, 0));
332 EXPECT(i1.Equals(i2)); 333 EXPECT(i1.Equals(i2));
333 EXPECT(!i.Equals(i1)); 334 EXPECT(!i.Equals(i1));
334 int64_t test = DART_2PART_UINT64_C(1010, 0); 335 int64_t test = DART_2PART_UINT64_C(1010, 0);
335 EXPECT_EQ(test, i2.value()); 336 EXPECT_EQ(test, i2.value());
336 337
337 Mint& a = Mint::Handle(Mint::New(DART_2PART_UINT64_C(5, 0))); 338 Mint& a = Mint::Handle();
338 Mint& b = Mint::Handle(Mint::New(DART_2PART_UINT64_C(3, 0))); 339 a ^= Integer::New(DART_2PART_UINT64_C(5, 0));
340 Mint& b = Mint::Handle();
341 b ^= Integer::New(DART_2PART_UINT64_C(3, 0));
339 EXPECT_EQ(1, a.CompareWith(b)); 342 EXPECT_EQ(1, a.CompareWith(b));
340 EXPECT_EQ(-1, b.CompareWith(a)); 343 EXPECT_EQ(-1, b.CompareWith(a));
341 EXPECT_EQ(0, a.CompareWith(a)); 344 EXPECT_EQ(0, a.CompareWith(a));
342 345
343 Mint& c = Mint::Handle(Mint::New(-DART_2PART_UINT64_C(3, 0))); 346 Mint& c = Mint::Handle();
347 c ^= Integer::New(-DART_2PART_UINT64_C(3, 0));
344 Smi& smi1 = Smi::Handle(Smi::New(4)); 348 Smi& smi1 = Smi::Handle(Smi::New(4));
345 Smi& smi2 = Smi::Handle(Smi::New(-4)); 349 Smi& smi2 = Smi::Handle(Smi::New(-4));
346 EXPECT_EQ(1, a.CompareWith(smi1)); 350 EXPECT_EQ(1, a.CompareWith(smi1));
347 EXPECT_EQ(1, a.CompareWith(smi2)); 351 EXPECT_EQ(1, a.CompareWith(smi2));
348 EXPECT_EQ(-1, c.CompareWith(smi1)); 352 EXPECT_EQ(-1, c.CompareWith(smi1));
349 EXPECT_EQ(-1, c.CompareWith(smi2)); 353 EXPECT_EQ(-1, c.CompareWith(smi2));
350 354
351 Bigint& big1 = Bigint::Handle(BigintOperations::NewFromCString( 355 Bigint& big1 = Bigint::Handle(BigintOperations::NewFromCString(
352 "10000000000000000000")); 356 "10000000000000000000"));
353 Bigint& big2 = Bigint::Handle(BigintOperations::NewFromCString( 357 Bigint& big2 = Bigint::Handle(BigintOperations::NewFromCString(
354 "-10000000000000000000")); 358 "-10000000000000000000"));
355 EXPECT_EQ(-1, a.CompareWith(big1)); 359 EXPECT_EQ(-1, a.CompareWith(big1));
356 EXPECT_EQ(1, a.CompareWith(big2)); 360 EXPECT_EQ(1, a.CompareWith(big2));
357 EXPECT_EQ(-1, c.CompareWith(big1)); 361 EXPECT_EQ(-1, c.CompareWith(big1));
358 EXPECT_EQ(1, c.CompareWith(big2)); 362 EXPECT_EQ(1, c.CompareWith(big2));
359 363
360 int64_t mint_value = DART_2PART_UINT64_C(0x7FFFFFFF, 100); 364 int64_t mint_value = DART_2PART_UINT64_C(0x7FFFFFFF, 64);
361 Mint& mint1 = Mint::Handle(Mint::NewCanonical(mint_value)); 365 const String& mint_string = String::Handle(String::New("0x7FFFFFFF00000064"));
362 Mint& mint2 = Mint::Handle(Mint::NewCanonical(mint_value)); 366 Mint& mint1 = Mint::Handle();
367 mint1 ^= Integer::NewCanonical(mint_string);
368 Mint& mint2 = Mint::Handle();
369 mint2 ^= Integer::NewCanonical(mint_string);
363 EXPECT_EQ(mint1.value(), mint_value); 370 EXPECT_EQ(mint1.value(), mint_value);
364 EXPECT_EQ(mint2.value(), mint_value); 371 EXPECT_EQ(mint2.value(), mint_value);
365 EXPECT_EQ(mint1.raw(), mint2.raw()); 372 EXPECT_EQ(mint1.raw(), mint2.raw());
366 #endif 373 #endif
367 } 374 }
368 375
369 376
370 TEST_CASE(Double) { 377 TEST_CASE(Double) {
371 { 378 {
372 const double dbl_const = 5.0; 379 const double dbl_const = 5.0;
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
433 EXPECT(dbl2.IsNull()); 440 EXPECT(dbl2.IsNull());
434 } 441 }
435 } 442 }
436 443
437 444
438 TEST_CASE(Bigint) { 445 TEST_CASE(Bigint) {
439 Bigint& b = Bigint::Handle(); 446 Bigint& b = Bigint::Handle();
440 EXPECT(b.IsNull()); 447 EXPECT(b.IsNull());
441 const char* cstr = "18446744073709551615000"; 448 const char* cstr = "18446744073709551615000";
442 const String& test = String::Handle(String::New(cstr)); 449 const String& test = String::Handle(String::New(cstr));
443 b = Bigint::NewCanonical(test); 450 b ^= Integer::NewCanonical(test);
444 const char* str = b.ToCString(); 451 const char* str = b.ToCString();
445 EXPECT_STREQ(cstr, str); 452 EXPECT_STREQ(cstr, str);
446 453
447 int64_t t64 = DART_2PART_UINT64_C(1, 0); 454 int64_t t64 = DART_2PART_UINT64_C(1, 0);
448 Bigint& big = Bigint::Handle(); 455 Bigint& big = Bigint::Handle();
449 big = BigintOperations::NewFromInt64(t64); 456 big = BigintOperations::NewFromInt64(t64);
450 EXPECT_EQ(t64, big.AsInt64Value()); 457 EXPECT_EQ(t64, big.AsInt64Value());
451 big = BigintOperations::NewFromCString("10000000000000000000"); 458 big = BigintOperations::NewFromCString("10000000000000000000");
452 EXPECT_EQ(1e19, big.AsDoubleValue()); 459 EXPECT_EQ(1e19, big.AsDoubleValue());
453 460
(...skipping 2744 matching lines...) Expand 10 before | Expand all | Expand 10 after
3198 const Function& test7 = Function::Handle(GetFunction(class_a, "test7")); 3205 const Function& test7 = Function::Handle(GetFunction(class_a, "test7"));
3199 EXPECT_EQ(test1.SourceFingerprint(), test2.SourceFingerprint()); 3206 EXPECT_EQ(test1.SourceFingerprint(), test2.SourceFingerprint());
3200 EXPECT_NE(test1.SourceFingerprint(), test3.SourceFingerprint()); 3207 EXPECT_NE(test1.SourceFingerprint(), test3.SourceFingerprint());
3201 EXPECT_NE(test3.SourceFingerprint(), test4.SourceFingerprint()); 3208 EXPECT_NE(test3.SourceFingerprint(), test4.SourceFingerprint());
3202 EXPECT_NE(test4.SourceFingerprint(), test5.SourceFingerprint()); 3209 EXPECT_NE(test4.SourceFingerprint(), test5.SourceFingerprint());
3203 EXPECT_NE(test5.SourceFingerprint(), test6.SourceFingerprint()); 3210 EXPECT_NE(test5.SourceFingerprint(), test6.SourceFingerprint());
3204 EXPECT_EQ(test6.SourceFingerprint(), test7.SourceFingerprint()); 3211 EXPECT_EQ(test6.SourceFingerprint(), test7.SourceFingerprint());
3205 } 3212 }
3206 3213
3207 } // namespace dart 3214 } // namespace dart
OLDNEW
« runtime/vm/object.h ('K') | « runtime/vm/object.cc ('k') | runtime/vm/snapshot_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698