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 "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 Loading... |
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 Loading... |
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 |
OLD | NEW |