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

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

Issue 10389023: Fixed compilation time measurement, restructure some code. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 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
« no previous file with comments | « runtime/vm/object.cc ('k') | runtime/vm/opt_code_generator_ia32.h » ('j') | 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 "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/isolate.h" 8 #include "vm/isolate.h"
9 #include "vm/object.h" 9 #include "vm/object.h"
10 #include "vm/object_store.h" 10 #include "vm/object_store.h"
(...skipping 2364 matching lines...) Expand 10 before | Expand all | Expand 10 after
2375 EXPECT(str3.IsString()); 2375 EXPECT(str3.IsString());
2376 EXPECT(str3.IsOneByteString()); 2376 EXPECT(str3.IsOneByteString());
2377 str3 = OneByteString::null(); 2377 str3 = OneByteString::null();
2378 EXPECT(str3.IsString()); 2378 EXPECT(str3.IsString());
2379 EXPECT(!str3.IsOneByteString()); 2379 EXPECT(!str3.IsOneByteString());
2380 } 2380 }
2381 2381
2382 2382
2383 // only ia32 and x64 can run execution tests. 2383 // only ia32 and x64 can run execution tests.
2384 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) 2384 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
2385
2386 static Function* CreateFunction(const char* name) {
2387 const String& function_name = String::ZoneHandle(String::NewSymbol(name));
2388 Function& function = Function::ZoneHandle(
2389 Function::New(function_name, RawFunction::kFunction, true, false, 0));
2390 return &function;
2391 }
2392
2385 // Test for Code and Instruction object creation. 2393 // Test for Code and Instruction object creation.
2386 TEST_CASE(Code) { 2394 TEST_CASE(Code) {
2387 extern void GenerateIncrement(Assembler* assembler); 2395 extern void GenerateIncrement(Assembler* assembler);
2388 Assembler _assembler_; 2396 Assembler _assembler_;
2389 GenerateIncrement(&_assembler_); 2397 GenerateIncrement(&_assembler_);
2390 Code& code = Code::Handle(Code::FinalizeCode("Test_Code", &_assembler_)); 2398 Code& code = Code::Handle(Code::FinalizeCode(
2399 *CreateFunction("Test_Code"), &_assembler_));
2391 Instructions& instructions = Instructions::Handle(code.instructions()); 2400 Instructions& instructions = Instructions::Handle(code.instructions());
2392 typedef int (*IncrementCode)(); 2401 typedef int (*IncrementCode)();
2393 EXPECT_EQ(2, reinterpret_cast<IncrementCode>(instructions.EntryPoint())()); 2402 EXPECT_EQ(2, reinterpret_cast<IncrementCode>(instructions.EntryPoint())());
2394 uword entry_point = instructions.EntryPoint(); 2403 uword entry_point = instructions.EntryPoint();
2395 EXPECT_EQ(instructions.raw(), Instructions::FromEntryPoint(entry_point)); 2404 EXPECT_EQ(instructions.raw(), Instructions::FromEntryPoint(entry_point));
2396 } 2405 }
2397 2406
2398 2407
2399 // Test for Embedded String object in the instructions. 2408 // Test for Embedded String object in the instructions.
2400 TEST_CASE(EmbedStringInCode) { 2409 TEST_CASE(EmbedStringInCode) {
2401 extern void GenerateEmbedStringInCode(Assembler* assembler, const char* str); 2410 extern void GenerateEmbedStringInCode(Assembler* assembler, const char* str);
2402 const char* kHello = "Hello World!"; 2411 const char* kHello = "Hello World!";
2403 word expected_length = static_cast<word>(strlen(kHello)); 2412 word expected_length = static_cast<word>(strlen(kHello));
2404 Assembler _assembler_; 2413 Assembler _assembler_;
2405 GenerateEmbedStringInCode(&_assembler_, kHello); 2414 GenerateEmbedStringInCode(&_assembler_, kHello);
2406 Code& code = Code::Handle( 2415 Code& code = Code::Handle(Code::FinalizeCode(
2407 Code::FinalizeCode("Test_EmbedStringInCode", &_assembler_)); 2416 *CreateFunction("Test_EmbedStringInCode"), &_assembler_));
2408 Instructions& instructions = Instructions::Handle(code.instructions()); 2417 Instructions& instructions = Instructions::Handle(code.instructions());
2409 typedef uword (*EmbedStringCode)(); 2418 typedef uword (*EmbedStringCode)();
2410 uword retval = reinterpret_cast<EmbedStringCode>(instructions.EntryPoint())(); 2419 uword retval = reinterpret_cast<EmbedStringCode>(instructions.EntryPoint())();
2411 EXPECT((retval & kSmiTagMask) == kHeapObjectTag); 2420 EXPECT((retval & kSmiTagMask) == kHeapObjectTag);
2412 String& string_object = String::Handle(); 2421 String& string_object = String::Handle();
2413 string_object ^= reinterpret_cast<RawInstructions*>(retval); 2422 string_object ^= reinterpret_cast<RawInstructions*>(retval);
2414 EXPECT(string_object.Length() == expected_length); 2423 EXPECT(string_object.Length() == expected_length);
2415 for (int i = 0; i < expected_length; i ++) { 2424 for (int i = 0; i < expected_length; i ++) {
2416 EXPECT(string_object.CharAt(i) == kHello[i]); 2425 EXPECT(string_object.CharAt(i) == kHello[i]);
2417 } 2426 }
2418 } 2427 }
2419 2428
2420 2429
2421 // Test for Embedded Smi object in the instructions. 2430 // Test for Embedded Smi object in the instructions.
2422 TEST_CASE(EmbedSmiInCode) { 2431 TEST_CASE(EmbedSmiInCode) {
2423 extern void GenerateEmbedSmiInCode(Assembler* assembler, intptr_t value); 2432 extern void GenerateEmbedSmiInCode(Assembler* assembler, intptr_t value);
2424 const intptr_t kSmiTestValue = 5; 2433 const intptr_t kSmiTestValue = 5;
2425 Assembler _assembler_; 2434 Assembler _assembler_;
2426 GenerateEmbedSmiInCode(&_assembler_, kSmiTestValue); 2435 GenerateEmbedSmiInCode(&_assembler_, kSmiTestValue);
2427 Code& code = Code::Handle( 2436 Code& code = Code::Handle(Code::FinalizeCode(
2428 Code::FinalizeCode("Test_EmbedSmiInCode", &_assembler_)); 2437 *CreateFunction("Test_EmbedSmiInCode"), &_assembler_));
2429 Instructions& instructions = Instructions::Handle(code.instructions()); 2438 Instructions& instructions = Instructions::Handle(code.instructions());
2430 typedef intptr_t (*EmbedSmiCode)(); 2439 typedef intptr_t (*EmbedSmiCode)();
2431 intptr_t retval = 2440 intptr_t retval =
2432 reinterpret_cast<EmbedSmiCode>(instructions.EntryPoint())(); 2441 reinterpret_cast<EmbedSmiCode>(instructions.EntryPoint())();
2433 EXPECT((retval >> kSmiTagShift) == kSmiTestValue); 2442 EXPECT((retval >> kSmiTagShift) == kSmiTestValue);
2434 } 2443 }
2435 2444
2436 2445
2437 #if defined(ARCH_IS_64_BIT) 2446 #if defined(ARCH_IS_64_BIT)
2438 // Test for Embedded Smi object in the instructions. 2447 // Test for Embedded Smi object in the instructions.
2439 TEST_CASE(EmbedSmiIn64BitCode) { 2448 TEST_CASE(EmbedSmiIn64BitCode) {
2440 extern void GenerateEmbedSmiInCode(Assembler* assembler, intptr_t value); 2449 extern void GenerateEmbedSmiInCode(Assembler* assembler, intptr_t value);
2441 const intptr_t kSmiTestValue = 5L << 32; 2450 const intptr_t kSmiTestValue = 5L << 32;
2442 Assembler _assembler_; 2451 Assembler _assembler_;
2443 GenerateEmbedSmiInCode(&_assembler_, kSmiTestValue); 2452 GenerateEmbedSmiInCode(&_assembler_, kSmiTestValue);
2444 Code& code = Code::Handle( 2453 Code& code = Code::Handle(Code::FinalizeCode(
2445 Code::FinalizeCode("Test_EmbedSmiIn64BitCode", &_assembler_)); 2454 *CreateFunction("Test_EmbedSmiIn64BitCode"), &_assembler_));
2446 Instructions& instructions = Instructions::Handle(code.instructions()); 2455 Instructions& instructions = Instructions::Handle(code.instructions());
2447 typedef intptr_t (*EmbedSmiCode)(); 2456 typedef intptr_t (*EmbedSmiCode)();
2448 intptr_t retval = 2457 intptr_t retval =
2449 reinterpret_cast<EmbedSmiCode>(instructions.EntryPoint())(); 2458 reinterpret_cast<EmbedSmiCode>(instructions.EntryPoint())();
2450 EXPECT((retval >> kSmiTagShift) == kSmiTestValue); 2459 EXPECT((retval >> kSmiTagShift) == kSmiTestValue);
2451 } 2460 }
2452 #endif 2461 #endif
2453 2462
2454 2463
2455 TEST_CASE(ExceptionHandlers) { 2464 TEST_CASE(ExceptionHandlers) {
2456 const int kNumEntries = 6; 2465 const int kNumEntries = 6;
2457 // Add an exception handler table to the code. 2466 // Add an exception handler table to the code.
2458 ExceptionHandlers& exception_handlers = ExceptionHandlers::Handle(); 2467 ExceptionHandlers& exception_handlers = ExceptionHandlers::Handle();
2459 exception_handlers ^= ExceptionHandlers::New(kNumEntries); 2468 exception_handlers ^= ExceptionHandlers::New(kNumEntries);
2460 exception_handlers.SetHandlerEntry(0, 10, 20); 2469 exception_handlers.SetHandlerEntry(0, 10, 20);
2461 exception_handlers.SetHandlerEntry(1, 20, 30); 2470 exception_handlers.SetHandlerEntry(1, 20, 30);
2462 exception_handlers.SetHandlerEntry(2, 30, 40); 2471 exception_handlers.SetHandlerEntry(2, 30, 40);
2463 exception_handlers.SetHandlerEntry(3, 10, 40); 2472 exception_handlers.SetHandlerEntry(3, 10, 40);
2464 exception_handlers.SetHandlerEntry(4, 10, 80); 2473 exception_handlers.SetHandlerEntry(4, 10, 80);
2465 exception_handlers.SetHandlerEntry(5, 80, 150); 2474 exception_handlers.SetHandlerEntry(5, 80, 150);
2466 2475
2467 extern void GenerateIncrement(Assembler* assembler); 2476 extern void GenerateIncrement(Assembler* assembler);
2468 Assembler _assembler_; 2477 Assembler _assembler_;
2469 GenerateIncrement(&_assembler_); 2478 GenerateIncrement(&_assembler_);
2470 Code& code = Code::Handle(Code::FinalizeCode("Test_Code", &_assembler_)); 2479 Code& code = Code::Handle(Code::FinalizeCode(
2480 *CreateFunction("Test_Code"), &_assembler_));
2471 code.set_exception_handlers(exception_handlers); 2481 code.set_exception_handlers(exception_handlers);
2472 2482
2473 // Verify the exception handler table entries by accessing them. 2483 // Verify the exception handler table entries by accessing them.
2474 const ExceptionHandlers& handlers = 2484 const ExceptionHandlers& handlers =
2475 ExceptionHandlers::Handle(code.exception_handlers()); 2485 ExceptionHandlers::Handle(code.exception_handlers());
2476 EXPECT_EQ(kNumEntries, handlers.Length()); 2486 EXPECT_EQ(kNumEntries, handlers.Length());
2477 EXPECT_EQ(10, handlers.TryIndex(0)); 2487 EXPECT_EQ(10, handlers.TryIndex(0));
2478 EXPECT_EQ(20, handlers.HandlerPC(0)); 2488 EXPECT_EQ(20, handlers.HandlerPC(0));
2479 EXPECT_EQ(80, handlers.TryIndex(5)); 2489 EXPECT_EQ(80, handlers.TryIndex(5));
2480 EXPECT_EQ(150, handlers.HandlerPC(5)); 2490 EXPECT_EQ(150, handlers.HandlerPC(5));
2481 } 2491 }
2482 2492
2483 2493
2484 TEST_CASE(PcDescriptors) { 2494 TEST_CASE(PcDescriptors) {
2485 const int kNumEntries = 6; 2495 const int kNumEntries = 6;
2486 // Add PcDescriptors to the code. 2496 // Add PcDescriptors to the code.
2487 PcDescriptors& descriptors = PcDescriptors::Handle(); 2497 PcDescriptors& descriptors = PcDescriptors::Handle();
2488 descriptors ^= PcDescriptors::New(kNumEntries); 2498 descriptors ^= PcDescriptors::New(kNumEntries);
2489 descriptors.AddDescriptor(0, 10, PcDescriptors::kOther, 1, 20, 1); 2499 descriptors.AddDescriptor(0, 10, PcDescriptors::kOther, 1, 20, 1);
2490 descriptors.AddDescriptor(1, 20, PcDescriptors::kDeopt, 2, 30, 0); 2500 descriptors.AddDescriptor(1, 20, PcDescriptors::kDeopt, 2, 30, 0);
2491 descriptors.AddDescriptor(2, 30, PcDescriptors::kOther, 3, 40, 1); 2501 descriptors.AddDescriptor(2, 30, PcDescriptors::kOther, 3, 40, 1);
2492 descriptors.AddDescriptor(3, 10, PcDescriptors::kOther, 4, 40, 2); 2502 descriptors.AddDescriptor(3, 10, PcDescriptors::kOther, 4, 40, 2);
2493 descriptors.AddDescriptor(4, 10, PcDescriptors::kOther, 5, 80, 3); 2503 descriptors.AddDescriptor(4, 10, PcDescriptors::kOther, 5, 80, 3);
2494 descriptors.AddDescriptor(5, 80, PcDescriptors::kOther, 6, 150, 3); 2504 descriptors.AddDescriptor(5, 80, PcDescriptors::kOther, 6, 150, 3);
2495 2505
2496 extern void GenerateIncrement(Assembler* assembler); 2506 extern void GenerateIncrement(Assembler* assembler);
2497 Assembler _assembler_; 2507 Assembler _assembler_;
2498 GenerateIncrement(&_assembler_); 2508 GenerateIncrement(&_assembler_);
2499 Code& code = Code::Handle(Code::FinalizeCode("Test_Code", &_assembler_)); 2509 Code& code = Code::Handle(Code::FinalizeCode(
2510 *CreateFunction("Test_Code"), &_assembler_));
2500 code.set_pc_descriptors(descriptors); 2511 code.set_pc_descriptors(descriptors);
2501 2512
2502 // Verify the PcDescriptor entries by accessing them. 2513 // Verify the PcDescriptor entries by accessing them.
2503 const PcDescriptors& pc_descs = PcDescriptors::Handle(code.pc_descriptors()); 2514 const PcDescriptors& pc_descs = PcDescriptors::Handle(code.pc_descriptors());
2504 EXPECT_EQ(kNumEntries, pc_descs.Length()); 2515 EXPECT_EQ(kNumEntries, pc_descs.Length());
2505 EXPECT_EQ(1, pc_descs.TryIndex(0)); 2516 EXPECT_EQ(1, pc_descs.TryIndex(0));
2506 EXPECT_EQ(static_cast<uword>(10), pc_descs.PC(0)); 2517 EXPECT_EQ(static_cast<uword>(10), pc_descs.PC(0));
2507 EXPECT_EQ(1, pc_descs.NodeId(0)); 2518 EXPECT_EQ(1, pc_descs.NodeId(0));
2508 EXPECT_EQ(20, pc_descs.TokenIndex(0)); 2519 EXPECT_EQ(20, pc_descs.TokenIndex(0));
2509 EXPECT_EQ(3, pc_descs.TryIndex(5)); 2520 EXPECT_EQ(3, pc_descs.TryIndex(5));
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
2645 cache.GetCheck(0, &test_class, &test_targ_0, &test_targ_1, &test_result); 2656 cache.GetCheck(0, &test_class, &test_targ_0, &test_targ_1, &test_result);
2646 EXPECT_EQ(empty_class.raw(), test_class.raw()); 2657 EXPECT_EQ(empty_class.raw(), test_class.raw());
2647 EXPECT_EQ(targ_0.raw(), test_targ_0.raw()); 2658 EXPECT_EQ(targ_0.raw(), test_targ_0.raw());
2648 EXPECT_EQ(targ_1.raw(), test_targ_1.raw()); 2659 EXPECT_EQ(targ_1.raw(), test_targ_1.raw());
2649 EXPECT_EQ(Bool::True(), test_result.raw()); 2660 EXPECT_EQ(Bool::True(), test_result.raw());
2650 } 2661 }
2651 2662
2652 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). 2663 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64).
2653 2664
2654 } // namespace dart 2665 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.cc ('k') | runtime/vm/opt_code_generator_ia32.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698