| 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/globals.h" | 6 #include "vm/globals.h" |
| 7 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) | 7 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) |
| 8 | 8 |
| 9 #include "vm/ast.h" | 9 #include "vm/ast.h" |
| 10 #include "vm/assembler.h" | 10 #include "vm/assembler.h" |
| 11 #include "vm/code_descriptors.h" | 11 #include "vm/code_descriptors.h" |
| 12 #include "vm/code_generator.h" | 12 #include "vm/compiler.h" |
| 13 #include "vm/dart_entry.h" | 13 #include "vm/dart_entry.h" |
| 14 #include "vm/native_entry.h" | 14 #include "vm/native_entry.h" |
| 15 #include "vm/parser.h" |
| 15 #include "vm/unit_test.h" | 16 #include "vm/unit_test.h" |
| 16 | 17 |
| 17 namespace dart { | 18 namespace dart { |
| 18 | 19 |
| 19 static const intptr_t kPos = Scanner::kDummyTokenIndex; | 20 static const intptr_t kPos = Scanner::kDummyTokenIndex; |
| 20 | 21 |
| 21 | 22 |
| 22 CODEGEN_TEST_GENERATE(StackmapCodegen, test) { | 23 CODEGEN_TEST_GENERATE(StackmapCodegen, test) { |
| 23 Assembler assembler; | 24 Assembler assembler; |
| 24 const String& function_name = String::ZoneHandle(String::NewSymbol("test")); | 25 const String& function_name = String::ZoneHandle(String::NewSymbol("test")); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 44 parsed_function.set_instantiator(NULL); | 45 parsed_function.set_instantiator(NULL); |
| 45 parsed_function.set_default_parameter_values(Array::Handle()); | 46 parsed_function.set_default_parameter_values(Array::Handle()); |
| 46 parsed_function.AllocateVariables(); | 47 parsed_function.AllocateVariables(); |
| 47 bool retval; | 48 bool retval; |
| 48 Isolate* isolate = Isolate::Current(); | 49 Isolate* isolate = Isolate::Current(); |
| 49 EXPECT(isolate != NULL); | 50 EXPECT(isolate != NULL); |
| 50 LongJump* base = isolate->long_jump_base(); | 51 LongJump* base = isolate->long_jump_base(); |
| 51 LongJump jump; | 52 LongJump jump; |
| 52 isolate->set_long_jump_base(&jump); | 53 isolate->set_long_jump_base(&jump); |
| 53 if (setjmp(*jump.Set()) == 0) { | 54 if (setjmp(*jump.Set()) == 0) { |
| 54 CodeGenerator code_gen(&assembler, parsed_function); | |
| 55 | |
| 56 // Build some stack map entries. | 55 // Build some stack map entries. |
| 57 StackmapBuilder* builder = new StackmapBuilder(); | 56 StackmapBuilder* builder = new StackmapBuilder(); |
| 58 EXPECT(builder != NULL); | 57 EXPECT(builder != NULL); |
| 59 builder->SetSlotAsObject(0); | 58 builder->SetSlotAsObject(0); |
| 60 EXPECT(builder->IsSlotObject(0)); | 59 EXPECT(builder->IsSlotObject(0)); |
| 61 builder->AddEntry(0); // Add a stack map entry at pc offset 0. | 60 builder->AddEntry(0); // Add a stack map entry at pc offset 0. |
| 62 builder->SetSlotAsValue(1); | 61 builder->SetSlotAsValue(1); |
| 63 EXPECT(!builder->IsSlotObject(1)); | 62 EXPECT(!builder->IsSlotObject(1)); |
| 64 builder->SetSlotAsObject(2); | 63 builder->SetSlotAsObject(2); |
| 65 builder->AddEntry(1); // Add a stack map entry at pc offset 1. | 64 builder->AddEntry(1); // Add a stack map entry at pc offset 1. |
| 66 EXPECT(builder->IsSlotObject(2)); | 65 EXPECT(builder->IsSlotObject(2)); |
| 67 builder->SetSlotRangeAsObject(3, 5); | 66 builder->SetSlotRangeAsObject(3, 5); |
| 68 for (intptr_t i = 3; i <= 5; i++) { | 67 for (intptr_t i = 3; i <= 5; i++) { |
| 69 EXPECT(builder->IsSlotObject(i)); | 68 EXPECT(builder->IsSlotObject(i)); |
| 70 } | 69 } |
| 71 builder->AddEntry(2); // Add a stack map entry at pc offset 2. | 70 builder->AddEntry(2); // Add a stack map entry at pc offset 2. |
| 72 builder->SetSlotRangeAsValue(6, 9); | 71 builder->SetSlotRangeAsValue(6, 9); |
| 73 for (intptr_t i = 6; i <= 9; i++) { | 72 for (intptr_t i = 6; i <= 9; i++) { |
| 74 EXPECT(!builder->IsSlotObject(i)); | 73 EXPECT(!builder->IsSlotObject(i)); |
| 75 } | 74 } |
| 76 builder->SetSlotAsObject(10); | 75 builder->SetSlotAsObject(10); |
| 77 builder->AddEntry(3); // Add a stack map entry at pc offset 3. | 76 builder->AddEntry(3); // Add a stack map entry at pc offset 3. |
| 78 code_gen.GenerateCode(); | 77 |
| 79 const char* function_fullname = function.ToFullyQualifiedCString(); | 78 const Error& error = |
| 80 const Code& code = | 79 Error::Handle(Compiler::CompileParsedFunction(parsed_function)); |
| 81 Code::Handle(Code::FinalizeCode(function_fullname, &assembler)); | 80 EXPECT(error.IsNull()); |
| 81 const Code& code = Code::Handle(function.CurrentCode()); |
| 82 |
| 82 const Array& stack_maps = Array::Handle(builder->FinalizeStackmaps(code)); | 83 const Array& stack_maps = Array::Handle(builder->FinalizeStackmaps(code)); |
| 83 code.set_stackmaps(stack_maps); | 84 code.set_stackmaps(stack_maps); |
| 84 function.SetCode(code); | |
| 85 const Array& stack_map_list = Array::Handle(code.stackmaps()); | 85 const Array& stack_map_list = Array::Handle(code.stackmaps()); |
| 86 EXPECT(!stack_map_list.IsNull()); | 86 EXPECT(!stack_map_list.IsNull()); |
| 87 Stackmap& stack_map = Stackmap::Handle(); | 87 Stackmap& stack_map = Stackmap::Handle(); |
| 88 EXPECT_EQ(4, stack_map_list.Length()); | 88 EXPECT_EQ(4, stack_map_list.Length()); |
| 89 | 89 |
| 90 // Validate the first stack map entry. | 90 // Validate the first stack map entry. |
| 91 stack_map ^= stack_map_list.At(0); | 91 stack_map ^= stack_map_list.At(0); |
| 92 EXPECT(stack_map.IsObject(0)); | 92 EXPECT(stack_map.IsObject(0)); |
| 93 EXPECT_EQ(0, stack_map.MinimumBitOffset()); | 93 EXPECT_EQ(0, stack_map.MinimumBitOffset()); |
| 94 EXPECT_EQ(0, stack_map.MaximumBitOffset()); | 94 EXPECT_EQ(0, stack_map.MaximumBitOffset()); |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 GrowableArray<const Object*> arguments; | 210 GrowableArray<const Object*> arguments; |
| 211 const Array& kNoArgumentNames = Array::Handle(); | 211 const Array& kNoArgumentNames = Array::Handle(); |
| 212 Object& result = Object::Handle(); | 212 Object& result = Object::Handle(); |
| 213 result = DartEntry::InvokeStatic(function_foo, arguments, kNoArgumentNames); | 213 result = DartEntry::InvokeStatic(function_foo, arguments, kNoArgumentNames); |
| 214 EXPECT(!result.IsError()); | 214 EXPECT(!result.IsError()); |
| 215 } | 215 } |
| 216 | 216 |
| 217 } // namespace dart | 217 } // namespace dart |
| 218 | 218 |
| 219 #endif // defined TARGET_ARCH_IA32 || defined(TARGET_ARCH_X64) | 219 #endif // defined TARGET_ARCH_IA32 || defined(TARGET_ARCH_X64) |
| OLD | NEW |