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 3734 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3745 ASSERT(raw_ptr()->allocation_stub_ == Code::null()); | 3745 ASSERT(raw_ptr()->allocation_stub_ == Code::null()); |
3746 StorePointer(&raw_ptr()->allocation_stub_, value.raw()); | 3746 StorePointer(&raw_ptr()->allocation_stub_, value.raw()); |
3747 } | 3747 } |
3748 | 3748 |
3749 | 3749 |
3750 void Class::DisableAllocationStub() const { | 3750 void Class::DisableAllocationStub() const { |
3751 const Code& existing_stub = Code::Handle(allocation_stub()); | 3751 const Code& existing_stub = Code::Handle(allocation_stub()); |
3752 if (existing_stub.IsNull()) { | 3752 if (existing_stub.IsNull()) { |
3753 return; | 3753 return; |
3754 } | 3754 } |
3755 ASSERT(!CodePatcher::IsEntryPatched(existing_stub)); | 3755 ASSERT(!existing_stub.IsDisabled()); |
3756 // Patch the stub so that the next caller will regenerate the stub. | 3756 // Change the stub so that the next caller will regenerate the stub. |
3757 CodePatcher::PatchEntry( | 3757 existing_stub.DisableStubCode(); |
3758 existing_stub, | |
3759 Code::Handle(StubCode::FixAllocationStubTarget_entry()->code())); | |
3760 // Disassociate the existing stub from class. | 3758 // Disassociate the existing stub from class. |
3761 StorePointer(&raw_ptr()->allocation_stub_, Code::null()); | 3759 StorePointer(&raw_ptr()->allocation_stub_, Code::null()); |
3762 } | 3760 } |
3763 | 3761 |
3764 | 3762 |
3765 bool Class::IsFunctionClass() const { | 3763 bool Class::IsFunctionClass() const { |
3766 return raw() == Type::Handle(Type::Function()).type_class(); | 3764 return raw() == Type::Handle(Type::Function()).type_class(); |
3767 } | 3765 } |
3768 | 3766 |
3769 | 3767 |
(...skipping 1536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5306 Thread* thread = Thread::Current(); | 5304 Thread* thread = Thread::Current(); |
5307 Isolate* isolate = thread->isolate(); | 5305 Isolate* isolate = thread->isolate(); |
5308 Zone* zone = thread->zone(); | 5306 Zone* zone = thread->zone(); |
5309 const Code& current_code = Code::Handle(zone, CurrentCode()); | 5307 const Code& current_code = Code::Handle(zone, CurrentCode()); |
5310 | 5308 |
5311 if (FLAG_trace_deoptimization_verbose) { | 5309 if (FLAG_trace_deoptimization_verbose) { |
5312 THR_Print("Disabling optimized code: '%s' entry: %#" Px "\n", | 5310 THR_Print("Disabling optimized code: '%s' entry: %#" Px "\n", |
5313 ToFullyQualifiedCString(), | 5311 ToFullyQualifiedCString(), |
5314 current_code.EntryPoint()); | 5312 current_code.EntryPoint()); |
5315 } | 5313 } |
5316 // Patch entry of the optimized code. | 5314 current_code.DisableDartCode(); |
5317 CodePatcher::PatchEntry( | |
5318 current_code, Code::Handle(StubCode::FixCallersTarget_entry()->code())); | |
5319 const Error& error = Error::Handle(zone, | 5315 const Error& error = Error::Handle(zone, |
5320 Compiler::EnsureUnoptimizedCode(thread, *this)); | 5316 Compiler::EnsureUnoptimizedCode(thread, *this)); |
5321 if (!error.IsNull()) { | 5317 if (!error.IsNull()) { |
5322 Exceptions::PropagateError(error); | 5318 Exceptions::PropagateError(error); |
5323 } | 5319 } |
5324 const Code& unopt_code = Code::Handle(zone, unoptimized_code()); | 5320 const Code& unopt_code = Code::Handle(zone, unoptimized_code()); |
5325 AttachCode(unopt_code); | 5321 AttachCode(unopt_code); |
5326 CodePatcher::RestoreEntry(unopt_code); | 5322 unopt_code.Enable(); |
5327 isolate->TrackDeoptimizedCode(current_code); | 5323 isolate->TrackDeoptimizedCode(current_code); |
5328 } | 5324 } |
5329 | 5325 |
5330 | 5326 |
5331 void Function::set_unoptimized_code(const Code& value) const { | 5327 void Function::set_unoptimized_code(const Code& value) const { |
5332 ASSERT(value.IsNull() || !value.is_optimized()); | 5328 ASSERT(value.IsNull() || !value.is_optimized()); |
5333 StorePointer(&raw_ptr()->unoptimized_code_, value.raw()); | 5329 StorePointer(&raw_ptr()->unoptimized_code_, value.raw()); |
5334 } | 5330 } |
5335 | 5331 |
5336 | 5332 |
(...skipping 5235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10572 // this to happen, so make sure we die loudly if we find | 10568 // this to happen, so make sure we die loudly if we find |
10573 // ourselves here. | 10569 // ourselves here. |
10574 UNIMPLEMENTED(); | 10570 UNIMPLEMENTED(); |
10575 } | 10571 } |
10576 | 10572 |
10577 virtual void ReportSwitchingCode(const Code& code) { | 10573 virtual void ReportSwitchingCode(const Code& code) { |
10578 if (FLAG_trace_deoptimization || FLAG_trace_deoptimization_verbose) { | 10574 if (FLAG_trace_deoptimization || FLAG_trace_deoptimization_verbose) { |
10579 THR_Print("Prefix '%s': disabling %s code for %s function '%s'\n", | 10575 THR_Print("Prefix '%s': disabling %s code for %s function '%s'\n", |
10580 String::Handle(prefix_.name()).ToCString(), | 10576 String::Handle(prefix_.name()).ToCString(), |
10581 code.is_optimized() ? "optimized" : "unoptimized", | 10577 code.is_optimized() ? "optimized" : "unoptimized", |
10582 CodePatcher::IsEntryPatched(code) ? "patched" : "unpatched", | 10578 code.IsDisabled() ? "'patched'" : "'unpatched'", |
10583 Function::Handle(code.function()).ToCString()); | 10579 Function::Handle(code.function()).ToCString()); |
10584 } | 10580 } |
10585 } | 10581 } |
10586 | 10582 |
10587 private: | 10583 private: |
10588 const LibraryPrefix& prefix_; | 10584 const LibraryPrefix& prefix_; |
10589 DISALLOW_COPY_AND_ASSIGN(PrefixDependentArray); | 10585 DISALLOW_COPY_AND_ASSIGN(PrefixDependentArray); |
10590 }; | 10586 }; |
10591 | 10587 |
10592 | 10588 |
(...skipping 2685 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13278 return obj.IsNull(); | 13274 return obj.IsNull(); |
13279 } | 13275 } |
13280 | 13276 |
13281 | 13277 |
13282 bool Code::IsFunctionCode() const { | 13278 bool Code::IsFunctionCode() const { |
13283 const Object& obj = Object::Handle(owner()); | 13279 const Object& obj = Object::Handle(owner()); |
13284 return obj.IsFunction(); | 13280 return obj.IsFunction(); |
13285 } | 13281 } |
13286 | 13282 |
13287 | 13283 |
| 13284 void Code::DisableDartCode() const { |
| 13285 ASSERT(IsFunctionCode()); |
| 13286 ASSERT(instructions() == active_instructions()); |
| 13287 const Code& new_code = |
| 13288 Code::Handle(StubCode::FixCallersTarget_entry()->code()); |
| 13289 set_active_instructions(new_code.instructions()); |
| 13290 } |
| 13291 |
| 13292 |
| 13293 void Code::DisableStubCode() const { |
| 13294 ASSERT(IsAllocationStubCode()); |
| 13295 ASSERT(instructions() == active_instructions()); |
| 13296 const Code& new_code = |
| 13297 Code::Handle(StubCode::FixAllocationStubTarget_entry()->code()); |
| 13298 set_active_instructions(new_code.instructions()); |
| 13299 } |
| 13300 |
| 13301 |
13288 void Code::PrintJSONImpl(JSONStream* stream, bool ref) const { | 13302 void Code::PrintJSONImpl(JSONStream* stream, bool ref) const { |
13289 JSONObject jsobj(stream); | 13303 JSONObject jsobj(stream); |
13290 AddCommonObjectProperties(&jsobj, "Code", ref); | 13304 AddCommonObjectProperties(&jsobj, "Code", ref); |
13291 jsobj.AddFixedServiceId("code/%" Px64"-%" Px "", | 13305 jsobj.AddFixedServiceId("code/%" Px64"-%" Px "", |
13292 compile_timestamp(), | 13306 compile_timestamp(), |
13293 EntryPoint()); | 13307 EntryPoint()); |
13294 const String& user_name = String::Handle(PrettyName()); | 13308 const String& user_name = String::Handle(PrettyName()); |
13295 const String& vm_name = String::Handle(Name()); | 13309 const String& vm_name = String::Handle(Name()); |
13296 AddNameProperties(&jsobj, user_name, vm_name); | 13310 AddNameProperties(&jsobj, user_name, vm_name); |
13297 const bool is_stub = IsStubCode() || IsAllocationStubCode(); | 13311 const bool is_stub = IsStubCode() || IsAllocationStubCode(); |
(...skipping 8157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
21455 return tag_label.ToCString(); | 21469 return tag_label.ToCString(); |
21456 } | 21470 } |
21457 | 21471 |
21458 | 21472 |
21459 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 21473 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
21460 Instance::PrintJSONImpl(stream, ref); | 21474 Instance::PrintJSONImpl(stream, ref); |
21461 } | 21475 } |
21462 | 21476 |
21463 | 21477 |
21464 } // namespace dart | 21478 } // namespace dart |
OLD | NEW |