OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "v8.h" | 5 #include "v8.h" |
6 | 6 |
7 #include "api.h" | 7 #include "api.h" |
8 #include "arguments.h" | 8 #include "arguments.h" |
9 #include "bootstrapper.h" | 9 #include "bootstrapper.h" |
10 #include "code-stubs.h" | 10 #include "code-stubs.h" |
(...skipping 525 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
536 MemCopy(reinterpret_cast<char*>(&thread_local_), from, sizeof(ThreadLocal)); | 536 MemCopy(reinterpret_cast<char*>(&thread_local_), from, sizeof(ThreadLocal)); |
537 return storage + ArchiveSpacePerThread(); | 537 return storage + ArchiveSpacePerThread(); |
538 } | 538 } |
539 | 539 |
540 | 540 |
541 int Debug::ArchiveSpacePerThread() { | 541 int Debug::ArchiveSpacePerThread() { |
542 return sizeof(ThreadLocal); | 542 return sizeof(ThreadLocal); |
543 } | 543 } |
544 | 544 |
545 | 545 |
546 // Frame structure (conforms InternalFrame structure): | |
547 // -- code | |
548 // -- SMI maker | |
549 // -- function (slot is called "context") | |
550 // -- frame base | |
551 Object** Debug::SetUpFrameDropperFrame(StackFrame* bottom_js_frame, | |
552 Handle<Code> code) { | |
553 ASSERT(bottom_js_frame->is_java_script()); | |
554 | |
555 Address fp = bottom_js_frame->fp(); | |
556 | |
557 // Move function pointer into "context" slot. | |
558 Memory::Object_at(fp + StandardFrameConstants::kContextOffset) = | |
559 Memory::Object_at(fp + JavaScriptFrameConstants::kFunctionOffset); | |
560 | |
561 Memory::Object_at(fp + InternalFrameConstants::kCodeOffset) = *code; | |
562 Memory::Object_at(fp + StandardFrameConstants::kMarkerOffset) = | |
563 Smi::FromInt(StackFrame::INTERNAL); | |
564 | |
565 return reinterpret_cast<Object**>(&Memory::Object_at( | |
566 fp + StandardFrameConstants::kContextOffset)); | |
567 } | |
568 | |
569 const int Debug::kFrameDropperFrameSize = 4; | |
570 | |
571 | |
572 void ScriptCache::Add(Handle<Script> script) { | 546 void ScriptCache::Add(Handle<Script> script) { |
573 GlobalHandles* global_handles = isolate_->global_handles(); | 547 GlobalHandles* global_handles = isolate_->global_handles(); |
574 // Create an entry in the hash map for the script. | 548 // Create an entry in the hash map for the script. |
575 int id = script->id()->value(); | 549 int id = script->id()->value(); |
576 HashMap::Entry* entry = | 550 HashMap::Entry* entry = |
577 HashMap::Lookup(reinterpret_cast<void*>(id), Hash(id), true); | 551 HashMap::Lookup(reinterpret_cast<void*>(id), Hash(id), true); |
578 if (entry->value != NULL) { | 552 if (entry->value != NULL) { |
579 ASSERT(*script == *reinterpret_cast<Script**>(entry->value)); | 553 ASSERT(*script == *reinterpret_cast<Script**>(entry->value)); |
580 return; | 554 return; |
581 } | 555 } |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
830 GlobalHandles::Destroy(Handle<Object>::cast(debug_context_).location()); | 804 GlobalHandles::Destroy(Handle<Object>::cast(debug_context_).location()); |
831 debug_context_ = Handle<Context>(); | 805 debug_context_ = Handle<Context>(); |
832 } | 806 } |
833 | 807 |
834 | 808 |
835 Object* Debug::Break(Arguments args) { | 809 Object* Debug::Break(Arguments args) { |
836 Heap* heap = isolate_->heap(); | 810 Heap* heap = isolate_->heap(); |
837 HandleScope scope(isolate_); | 811 HandleScope scope(isolate_); |
838 ASSERT(args.length() == 0); | 812 ASSERT(args.length() == 0); |
839 | 813 |
840 thread_local_.frame_drop_mode_ = FRAMES_UNTOUCHED; | 814 thread_local_.frame_drop_mode_ = LiveEdit::FRAMES_UNTOUCHED; |
841 | 815 |
842 // Get the top-most JavaScript frame. | 816 // Get the top-most JavaScript frame. |
843 JavaScriptFrameIterator it(isolate_); | 817 JavaScriptFrameIterator it(isolate_); |
844 JavaScriptFrame* frame = it.frame(); | 818 JavaScriptFrame* frame = it.frame(); |
845 | 819 |
846 // Just continue if breaks are disabled or debugger cannot be loaded. | 820 // Just continue if breaks are disabled or debugger cannot be loaded. |
847 if (disable_break()) { | 821 if (disable_break()) { |
848 SetAfterBreakTarget(frame); | 822 SetAfterBreakTarget(frame); |
849 return heap->undefined_value(); | 823 return heap->undefined_value(); |
850 } | 824 } |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
943 step_count = count; | 917 step_count = count; |
944 } | 918 } |
945 | 919 |
946 // Clear all current stepping setup. | 920 // Clear all current stepping setup. |
947 ClearStepping(); | 921 ClearStepping(); |
948 | 922 |
949 // Set up for the remaining steps. | 923 // Set up for the remaining steps. |
950 PrepareStep(step_action, step_count, StackFrame::NO_ID); | 924 PrepareStep(step_action, step_count, StackFrame::NO_ID); |
951 } | 925 } |
952 | 926 |
953 if (thread_local_.frame_drop_mode_ == FRAMES_UNTOUCHED) { | 927 if (thread_local_.frame_drop_mode_ == LiveEdit::FRAMES_UNTOUCHED) { |
954 SetAfterBreakTarget(frame); | 928 SetAfterBreakTarget(frame); |
955 } else if (thread_local_.frame_drop_mode_ == | 929 } else if (thread_local_.frame_drop_mode_ == |
956 FRAME_DROPPED_IN_IC_CALL) { | 930 LiveEdit::FRAME_DROPPED_IN_IC_CALL) { |
957 // We must have been calling IC stub. Do not go there anymore. | 931 // We must have been calling IC stub. Do not go there anymore. |
958 Code* plain_return = isolate_->builtins()->builtin( | 932 Code* plain_return = isolate_->builtins()->builtin( |
959 Builtins::kPlainReturn_LiveEdit); | 933 Builtins::kPlainReturn_LiveEdit); |
960 thread_local_.after_break_target_ = plain_return->entry(); | 934 thread_local_.after_break_target_ = plain_return->entry(); |
961 } else if (thread_local_.frame_drop_mode_ == | 935 } else if (thread_local_.frame_drop_mode_ == |
962 FRAME_DROPPED_IN_DEBUG_SLOT_CALL) { | 936 LiveEdit::FRAME_DROPPED_IN_DEBUG_SLOT_CALL) { |
963 // Debug break slot stub does not return normally, instead it manually | 937 // Debug break slot stub does not return normally, instead it manually |
964 // cleans the stack and jumps. We should patch the jump address. | 938 // cleans the stack and jumps. We should patch the jump address. |
965 Code* plain_return = isolate_->builtins()->builtin( | 939 Code* plain_return = isolate_->builtins()->builtin( |
966 Builtins::kFrameDropper_LiveEdit); | 940 Builtins::kFrameDropper_LiveEdit); |
967 thread_local_.after_break_target_ = plain_return->entry(); | 941 thread_local_.after_break_target_ = plain_return->entry(); |
968 } else if (thread_local_.frame_drop_mode_ == | 942 } else if (thread_local_.frame_drop_mode_ == |
969 FRAME_DROPPED_IN_DIRECT_CALL) { | 943 LiveEdit::FRAME_DROPPED_IN_DIRECT_CALL) { |
970 // Nothing to do, after_break_target is not used here. | 944 // Nothing to do, after_break_target is not used here. |
971 } else if (thread_local_.frame_drop_mode_ == | 945 } else if (thread_local_.frame_drop_mode_ == |
972 FRAME_DROPPED_IN_RETURN_CALL) { | 946 LiveEdit::FRAME_DROPPED_IN_RETURN_CALL) { |
973 Code* plain_return = isolate_->builtins()->builtin( | 947 Code* plain_return = isolate_->builtins()->builtin( |
974 Builtins::kFrameDropper_LiveEdit); | 948 Builtins::kFrameDropper_LiveEdit); |
975 thread_local_.after_break_target_ = plain_return->entry(); | 949 thread_local_.after_break_target_ = plain_return->entry(); |
976 } else { | 950 } else { |
977 UNREACHABLE(); | 951 UNREACHABLE(); |
978 } | 952 } |
979 | 953 |
980 return heap->undefined_value(); | 954 return heap->undefined_value(); |
981 } | 955 } |
982 | 956 |
(...skipping 1501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2484 return (it.rinfo()->pc() == | 2458 return (it.rinfo()->pc() == |
2485 addr - Assembler::kPatchReturnSequenceAddressOffset); | 2459 addr - Assembler::kPatchReturnSequenceAddressOffset); |
2486 } | 2460 } |
2487 it.next(); | 2461 it.next(); |
2488 } | 2462 } |
2489 return false; | 2463 return false; |
2490 } | 2464 } |
2491 | 2465 |
2492 | 2466 |
2493 void Debug::FramesHaveBeenDropped(StackFrame::Id new_break_frame_id, | 2467 void Debug::FramesHaveBeenDropped(StackFrame::Id new_break_frame_id, |
2494 FrameDropMode mode, | 2468 LiveEdit::FrameDropMode mode, |
2495 Object** restarter_frame_function_pointer) { | 2469 Object** restarter_frame_function_pointer) { |
2496 if (mode != CURRENTLY_SET_MODE) { | 2470 if (mode != LiveEdit::CURRENTLY_SET_MODE) { |
2497 thread_local_.frame_drop_mode_ = mode; | 2471 thread_local_.frame_drop_mode_ = mode; |
2498 } | 2472 } |
2499 thread_local_.break_frame_id_ = new_break_frame_id; | 2473 thread_local_.break_frame_id_ = new_break_frame_id; |
2500 thread_local_.restarter_frame_function_pointer_ = | 2474 thread_local_.restarter_frame_function_pointer_ = |
2501 restarter_frame_function_pointer; | 2475 restarter_frame_function_pointer; |
2502 } | 2476 } |
2503 | 2477 |
2504 | 2478 |
2505 const int Debug::FramePaddingLayout::kInitialSize = 1; | |
2506 | |
2507 | |
2508 // Any even value bigger than kInitialSize as needed for stack scanning. | |
2509 const int Debug::FramePaddingLayout::kPaddingValue = kInitialSize + 1; | |
2510 | |
2511 | |
2512 bool Debug::IsDebugGlobal(GlobalObject* global) { | 2479 bool Debug::IsDebugGlobal(GlobalObject* global) { |
2513 return IsLoaded() && global == debug_context()->global_object(); | 2480 return IsLoaded() && global == debug_context()->global_object(); |
2514 } | 2481 } |
2515 | 2482 |
2516 | 2483 |
2517 void Debug::ClearMirrorCache() { | 2484 void Debug::ClearMirrorCache() { |
2518 PostponeInterruptsScope postpone(isolate_); | 2485 PostponeInterruptsScope postpone(isolate_); |
2519 HandleScope scope(isolate_); | 2486 HandleScope scope(isolate_); |
2520 ASSERT(isolate_->context() == *Debug::debug_context()); | 2487 ASSERT(isolate_->context() == *Debug::debug_context()); |
2521 | 2488 |
(...skipping 1004 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3526 logger_->DebugEvent("Put", message.text()); | 3493 logger_->DebugEvent("Put", message.text()); |
3527 } | 3494 } |
3528 | 3495 |
3529 | 3496 |
3530 void LockingCommandMessageQueue::Clear() { | 3497 void LockingCommandMessageQueue::Clear() { |
3531 LockGuard<Mutex> lock_guard(&mutex_); | 3498 LockGuard<Mutex> lock_guard(&mutex_); |
3532 queue_.Clear(); | 3499 queue_.Clear(); |
3533 } | 3500 } |
3534 | 3501 |
3535 } } // namespace v8::internal | 3502 } } // namespace v8::internal |
OLD | NEW |