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 5106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5117 StorePointer(&raw_ptr()->source_class_, value.raw()); | 5117 StorePointer(&raw_ptr()->source_class_, value.raw()); |
5118 } | 5118 } |
5119 | 5119 |
5120 | 5120 |
5121 bool Function::HasBreakpoint() const { | 5121 bool Function::HasBreakpoint() const { |
5122 return Isolate::Current()->debugger()->HasBreakpoint(*this); | 5122 return Isolate::Current()->debugger()->HasBreakpoint(*this); |
5123 } | 5123 } |
5124 | 5124 |
5125 | 5125 |
5126 void Function::SetInstructions(const Code& value) const { | 5126 void Function::SetInstructions(const Code& value) const { |
5127 StorePointer(&raw_ptr()->instructions_, value.instructions()); | 5127 StorePointer(&raw_ptr()->code_, value.raw()); |
5128 } | 5128 } |
5129 | 5129 |
5130 void Function::AttachCode(const Code& value) const { | 5130 void Function::AttachCode(const Code& value) const { |
5131 SetInstructions(value); | 5131 SetInstructions(value); |
5132 ASSERT(Function::Handle(value.function()).IsNull() || | 5132 ASSERT(Function::Handle(value.function()).IsNull() || |
5133 (value.function() == this->raw())); | 5133 (value.function() == this->raw())); |
5134 value.set_owner(*this); | 5134 value.set_owner(*this); |
5135 } | 5135 } |
5136 | 5136 |
5137 | 5137 |
5138 bool Function::HasCode() const { | 5138 bool Function::HasCode() const { |
5139 ASSERT(raw_ptr()->instructions_ != Instructions::null()); | 5139 ASSERT(raw_ptr()->code_ != Code::null()); |
5140 StubCode* stub_code = Isolate::Current()->stub_code(); | 5140 StubCode* stub_code = Isolate::Current()->stub_code(); |
5141 return raw_ptr()->instructions_ != | 5141 return raw_ptr()->code_ != stub_code->LazyCompile_entry()->code(); |
5142 stub_code->LazyCompile_entry()->code()->ptr()->instructions_; | |
5143 } | 5142 } |
5144 | 5143 |
5145 | 5144 |
5146 void Function::ClearCode() const { | 5145 void Function::ClearCode() const { |
5147 ASSERT(ic_data_array() == Array::null()); | 5146 ASSERT(ic_data_array() == Array::null()); |
5148 StorePointer(&raw_ptr()->unoptimized_code_, Code::null()); | 5147 StorePointer(&raw_ptr()->unoptimized_code_, Code::null()); |
5149 StubCode* stub_code = Isolate::Current()->stub_code(); | 5148 StubCode* stub_code = Isolate::Current()->stub_code(); |
5150 StorePointer(&raw_ptr()->instructions_, | 5149 StorePointer(&raw_ptr()->code_, |
5151 Code::Handle(stub_code->LazyCompile_entry()->code()).instructions()); | 5150 stub_code->LazyCompile_entry()->code()); |
5152 } | 5151 } |
5153 | 5152 |
5154 | 5153 |
5155 void Function::SwitchToUnoptimizedCode() const { | 5154 void Function::SwitchToUnoptimizedCode() const { |
5156 ASSERT(HasOptimizedCode()); | 5155 ASSERT(HasOptimizedCode()); |
5157 Thread* thread = Thread::Current(); | 5156 Thread* thread = Thread::Current(); |
5158 Isolate* isolate = thread->isolate(); | 5157 Isolate* isolate = thread->isolate(); |
5159 Zone* zone = thread->zone(); | 5158 Zone* zone = thread->zone(); |
5160 const Code& current_code = Code::Handle(zone, CurrentCode()); | 5159 const Code& current_code = Code::Handle(zone, CurrentCode()); |
5161 | 5160 |
(...skipping 1424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6586 const Object& obj = Object::Handle(raw_ptr()->owner_); | 6585 const Object& obj = Object::Handle(raw_ptr()->owner_); |
6587 if (obj.IsClass()) { | 6586 if (obj.IsClass()) { |
6588 return Class::Cast(obj).script(); | 6587 return Class::Cast(obj).script(); |
6589 } | 6588 } |
6590 ASSERT(obj.IsPatchClass()); | 6589 ASSERT(obj.IsPatchClass()); |
6591 return PatchClass::Cast(obj).Script(); | 6590 return PatchClass::Cast(obj).Script(); |
6592 } | 6591 } |
6593 | 6592 |
6594 | 6593 |
6595 bool Function::HasOptimizedCode() const { | 6594 bool Function::HasOptimizedCode() const { |
6596 return HasCode() && Code::Handle(Instructions::Handle( | 6595 return HasCode() && Code::Handle(CurrentCode()).is_optimized(); |
6597 raw_ptr()->instructions_).code()).is_optimized(); | |
6598 } | 6596 } |
6599 | 6597 |
6600 | 6598 |
6601 RawString* Function::PrettyName() const { | 6599 RawString* Function::PrettyName() const { |
6602 const String& str = String::Handle(name()); | 6600 const String& str = String::Handle(name()); |
6603 return String::IdentifierPrettyName(str); | 6601 return String::IdentifierPrettyName(str); |
6604 } | 6602 } |
6605 | 6603 |
6606 | 6604 |
6607 const char* Function::QualifiedUserVisibleNameCString() const { | 6605 const char* Function::QualifiedUserVisibleNameCString() const { |
(...skipping 6023 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12631 for (intptr_t i = 0; i < pointer_offsets.length(); i++) { | 12629 for (intptr_t i = 0; i < pointer_offsets.length(); i++) { |
12632 intptr_t offset_in_instrs = pointer_offsets[i]; | 12630 intptr_t offset_in_instrs = pointer_offsets[i]; |
12633 code.SetPointerOffsetAt(i, offset_in_instrs); | 12631 code.SetPointerOffsetAt(i, offset_in_instrs); |
12634 uword addr = region.start() + offset_in_instrs; | 12632 uword addr = region.start() + offset_in_instrs; |
12635 const Object* object = *reinterpret_cast<Object**>(addr); | 12633 const Object* object = *reinterpret_cast<Object**>(addr); |
12636 instrs.raw()->StorePointer(reinterpret_cast<RawObject**>(addr), | 12634 instrs.raw()->StorePointer(reinterpret_cast<RawObject**>(addr), |
12637 object->raw()); | 12635 object->raw()); |
12638 } | 12636 } |
12639 | 12637 |
12640 // Hook up Code and Instructions objects. | 12638 // Hook up Code and Instructions objects. |
12641 instrs.set_code(code.raw()); | |
12642 code.set_instructions(instrs.raw()); | 12639 code.set_instructions(instrs.raw()); |
12643 code.set_is_alive(true); | 12640 code.set_is_alive(true); |
12644 | 12641 |
12645 // Set object pool in Instructions object. | 12642 // Set object pool in Instructions object. |
12646 INC_STAT(Isolate::Current(), | 12643 INC_STAT(Isolate::Current(), |
12647 total_code_size, object_pool.Length() * sizeof(uintptr_t)); | 12644 total_code_size, object_pool.Length() * sizeof(uintptr_t)); |
12648 instrs.set_object_pool(object_pool.raw()); | 12645 code.set_object_pool(object_pool.raw()); |
12649 | 12646 |
12650 if (FLAG_write_protect_code) { | 12647 if (FLAG_write_protect_code) { |
12651 uword address = RawObject::ToAddr(instrs.raw()); | 12648 uword address = RawObject::ToAddr(instrs.raw()); |
12652 bool status = VirtualMemory::Protect( | 12649 bool status = VirtualMemory::Protect( |
12653 reinterpret_cast<void*>(address), | 12650 reinterpret_cast<void*>(address), |
12654 instrs.raw()->Size(), | 12651 instrs.raw()->Size(), |
12655 VirtualMemory::kReadExecute); | 12652 VirtualMemory::kReadExecute); |
12656 ASSERT(status); | 12653 ASSERT(status); |
12657 } | 12654 } |
12658 } | 12655 } |
(...skipping 21 matching lines...) Expand all Loading... |
12680 assembler, | 12677 assembler, |
12681 optimized); | 12678 optimized); |
12682 } else { | 12679 } else { |
12683 return FinalizeCode("", assembler); | 12680 return FinalizeCode("", assembler); |
12684 } | 12681 } |
12685 } | 12682 } |
12686 | 12683 |
12687 | 12684 |
12688 // Check if object matches find condition. | 12685 // Check if object matches find condition. |
12689 bool Code::FindRawCodeVisitor::FindObject(RawObject* obj) const { | 12686 bool Code::FindRawCodeVisitor::FindObject(RawObject* obj) const { |
12690 return RawInstructions::ContainsPC(obj, pc_); | 12687 return RawCode::ContainsPC(obj, pc_); |
12691 } | 12688 } |
12692 | 12689 |
12693 | 12690 |
12694 RawCode* Code::LookupCodeInIsolate(Isolate* isolate, uword pc) { | 12691 RawCode* Code::LookupCodeInIsolate(Isolate* isolate, uword pc) { |
12695 ASSERT((isolate == Isolate::Current()) || (isolate == Dart::vm_isolate())); | 12692 ASSERT((isolate == Isolate::Current()) || (isolate == Dart::vm_isolate())); |
12696 NoSafepointScope no_safepoint; | 12693 NoSafepointScope no_safepoint; |
12697 FindRawCodeVisitor visitor(pc); | 12694 FindRawCodeVisitor visitor(pc); |
12698 RawInstructions* instr; | 12695 RawObject* instr; |
12699 if (isolate->heap() == NULL) { | 12696 if (isolate->heap() == NULL) { |
12700 return Code::null(); | 12697 return Code::null(); |
12701 } | 12698 } |
12702 instr = isolate->heap()->FindObjectInCodeSpace(&visitor); | 12699 instr = isolate->heap()->FindOldObject(&visitor); |
12703 if (instr != Instructions::null()) { | 12700 if (instr != Code::null()) { |
12704 return instr->ptr()->code_; | 12701 return static_cast<RawCode*>(instr); |
12705 } | 12702 } |
12706 return Code::null(); | 12703 return Code::null(); |
12707 } | 12704 } |
12708 | 12705 |
12709 | 12706 |
12710 RawCode* Code::LookupCode(uword pc) { | 12707 RawCode* Code::LookupCode(uword pc) { |
12711 return LookupCodeInIsolate(Isolate::Current(), pc); | 12708 return LookupCodeInIsolate(Isolate::Current(), pc); |
12712 } | 12709 } |
12713 | 12710 |
12714 | 12711 |
(...skipping 8259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
20974 return tag_label.ToCString(); | 20971 return tag_label.ToCString(); |
20975 } | 20972 } |
20976 | 20973 |
20977 | 20974 |
20978 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 20975 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
20979 Instance::PrintJSONImpl(stream, ref); | 20976 Instance::PrintJSONImpl(stream, ref); |
20980 } | 20977 } |
20981 | 20978 |
20982 | 20979 |
20983 } // namespace dart | 20980 } // namespace dart |
OLD | NEW |