Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(159)

Side by Side Diff: src/debug.cc

Issue 231883007: Return MaybeHandle from Invoke. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 756 matching lines...) Expand 10 before | Expand all | Expand 10 after
767 NATIVES_CODE); 767 NATIVES_CODE);
768 768
769 // Silently ignore stack overflows during compilation. 769 // Silently ignore stack overflows during compilation.
770 if (function_info.is_null()) { 770 if (function_info.is_null()) {
771 ASSERT(isolate->has_pending_exception()); 771 ASSERT(isolate->has_pending_exception());
772 isolate->clear_pending_exception(); 772 isolate->clear_pending_exception();
773 return false; 773 return false;
774 } 774 }
775 775
776 // Execute the shared function in the debugger context. 776 // Execute the shared function in the debugger context.
777 bool caught_exception;
778 Handle<JSFunction> function = 777 Handle<JSFunction> function =
779 factory->NewFunctionFromSharedFunctionInfo(function_info, context); 778 factory->NewFunctionFromSharedFunctionInfo(function_info, context);
780 779
781 Handle<Object> exception = 780 Handle<Object> exception;
782 Execution::TryCall(function, 781 bool caught_exception = !Execution::TryCall(
783 Handle<Object>(context->global_object(), isolate), 782 function,
784 0, 783 Handle<Object>(context->global_object(), isolate),
785 NULL, 784 0,
786 &caught_exception); 785 NULL).ToHandle(&exception);
787 786
788 // Check for caught exceptions. 787 // Check for caught exceptions.
789 if (caught_exception) { 788 if (caught_exception) {
790 ASSERT(!isolate->has_pending_exception()); 789 ASSERT(!isolate->has_pending_exception());
791 MessageLocation computed_location; 790 MessageLocation computed_location;
792 isolate->ComputeLocation(&computed_location); 791 isolate->ComputeLocation(&computed_location);
793 Handle<Object> message = MessageHandler::MakeMessageObject( 792 Handle<Object> message = MessageHandler::MakeMessageObject(
794 isolate, "error_loading_debugger", &computed_location, 793 isolate, "error_loading_debugger", &computed_location,
795 Vector<Handle<Object> >::empty(), Handle<JSArray>()); 794 Vector<Handle<Object> >::empty(), Handle<JSArray>());
796 ASSERT(!isolate->has_pending_exception()); 795 ASSERT(!isolate->has_pending_exception());
797 if (!exception.is_null()) { 796 if (!exception.is_null()) {
Igor Sheludko 2014/04/10 15:14:42 I think exception can't be null here anymore.
798 isolate->set_pending_exception(*exception); 797 isolate->set_pending_exception(*exception);
799 MessageHandler::ReportMessage(isolate, NULL, message); 798 MessageHandler::ReportMessage(isolate, NULL, message);
800 isolate->clear_pending_exception(); 799 isolate->clear_pending_exception();
801 } 800 }
802 return false; 801 return false;
803 } 802 }
804 803
805 // Mark this script as native and return successfully. 804 // Mark this script as native and return successfully.
806 Handle<Script> script(Script::cast(function->shared()->script())); 805 Handle<Script> script(Script::cast(function->shared()->script()));
807 script->set_type(Smi::FromInt(Script::TYPE_NATIVE)); 806 script->set_type(Smi::FromInt(Script::TYPE_NATIVE));
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
1118 STATIC_ASCII_VECTOR("IsBreakPointTriggered")); 1117 STATIC_ASCII_VECTOR("IsBreakPointTriggered"));
1119 Handle<GlobalObject> debug_global(debug_context()->global_object()); 1118 Handle<GlobalObject> debug_global(debug_context()->global_object());
1120 Handle<JSFunction> check_break_point = 1119 Handle<JSFunction> check_break_point =
1121 Handle<JSFunction>::cast(GlobalObject::GetPropertyNoExceptionThrown( 1120 Handle<JSFunction>::cast(GlobalObject::GetPropertyNoExceptionThrown(
1122 debug_global, is_break_point_triggered_string)); 1121 debug_global, is_break_point_triggered_string));
1123 1122
1124 // Get the break id as an object. 1123 // Get the break id as an object.
1125 Handle<Object> break_id = factory->NewNumberFromInt(Debug::break_id()); 1124 Handle<Object> break_id = factory->NewNumberFromInt(Debug::break_id());
1126 1125
1127 // Call HandleBreakPointx. 1126 // Call HandleBreakPointx.
1128 bool caught_exception;
1129 Handle<Object> argv[] = { break_id, break_point_object }; 1127 Handle<Object> argv[] = { break_id, break_point_object };
1130 Handle<Object> result = Execution::TryCall(check_break_point, 1128 Handle<Object> result;
1131 isolate_->js_builtins_object(), 1129 bool caught_exception = !Execution::TryCall(
1132 ARRAY_SIZE(argv), 1130 check_break_point,
1133 argv, 1131 isolate_->js_builtins_object(),
1134 &caught_exception); 1132 ARRAY_SIZE(argv),
1133 argv).ToHandle(&result);
1135 1134
1136 // If exception or non boolean result handle as not triggered 1135 // If exception or non boolean result handle as not triggered
1137 if (caught_exception || !result->IsBoolean()) { 1136 if (caught_exception || !result->IsBoolean()) {
1138 return false; 1137 return false;
1139 } 1138 }
1140 1139
1141 // Return whether the break point is triggered. 1140 // Return whether the break point is triggered.
1142 ASSERT(!result.is_null()); 1141 ASSERT(!result.is_null());
Igor Sheludko 2014/04/10 15:14:42 While we are here: It's too late to ASSERT this an
1143 return (*result)->IsTrue(); 1142 return (*result)->IsTrue();
Igor Sheludko 2014/04/10 15:14:42 return result->IsTrue();
1144 } 1143 }
1145 1144
1146 1145
1147 // Check whether the function has debug information. 1146 // Check whether the function has debug information.
1148 bool Debug::HasDebugInfo(Handle<SharedFunctionInfo> shared) { 1147 bool Debug::HasDebugInfo(Handle<SharedFunctionInfo> shared) {
1149 return !shared->debug_info()->IsUndefined(); 1148 return !shared->debug_info()->IsUndefined();
1150 } 1149 }
1151 1150
1152 1151
1153 // Return the debug info for this function. EnsureDebugInfo must be called 1152 // Return the debug info for this function. EnsureDebugInfo must be called
(...skipping 1305 matching lines...) Expand 10 before | Expand all | Expand 10 after
2459 PostponeInterruptsScope postpone(isolate_); 2458 PostponeInterruptsScope postpone(isolate_);
2460 HandleScope scope(isolate_); 2459 HandleScope scope(isolate_);
2461 ASSERT(isolate_->context() == *Debug::debug_context()); 2460 ASSERT(isolate_->context() == *Debug::debug_context());
2462 2461
2463 // Clear the mirror cache. 2462 // Clear the mirror cache.
2464 Handle<String> function_name = isolate_->factory()->InternalizeOneByteString( 2463 Handle<String> function_name = isolate_->factory()->InternalizeOneByteString(
2465 STATIC_ASCII_VECTOR("ClearMirrorCache")); 2464 STATIC_ASCII_VECTOR("ClearMirrorCache"));
2466 Handle<Object> fun = GlobalObject::GetPropertyNoExceptionThrown( 2465 Handle<Object> fun = GlobalObject::GetPropertyNoExceptionThrown(
2467 isolate_->global_object(), function_name); 2466 isolate_->global_object(), function_name);
2468 ASSERT(fun->IsJSFunction()); 2467 ASSERT(fun->IsJSFunction());
2469 bool caught_exception; 2468 Execution::TryCall(
2470 Execution::TryCall(Handle<JSFunction>::cast(fun), 2469 Handle<JSFunction>::cast(fun),
2471 Handle<JSObject>(Debug::debug_context()->global_object()), 2470 Handle<JSObject>(Debug::debug_context()->global_object()),
2472 0, NULL, &caught_exception); 2471 0,
2472 NULL);
2473 } 2473 }
2474 2474
2475 2475
2476 void Debug::CreateScriptCache() { 2476 void Debug::CreateScriptCache() {
2477 Heap* heap = isolate_->heap(); 2477 Heap* heap = isolate_->heap();
2478 HandleScope scope(isolate_); 2478 HandleScope scope(isolate_);
2479 2479
2480 // Perform two GCs to get rid of all unreferenced scripts. The first GC gets 2480 // Perform two GCs to get rid of all unreferenced scripts. The first GC gets
2481 // rid of all the cached script wrappers and the second gets rid of the 2481 // rid of all the cached script wrappers and the second gets rid of the
2482 // scripts which are no longer referenced. The second also sweeps precisely, 2482 // scripts which are no longer referenced. The second also sweeps precisely,
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
2583 command_queue_(isolate->logger(), kQueueInitialSize), 2583 command_queue_(isolate->logger(), kQueueInitialSize),
2584 command_received_(0), 2584 command_received_(0),
2585 event_command_queue_(isolate->logger(), kQueueInitialSize), 2585 event_command_queue_(isolate->logger(), kQueueInitialSize),
2586 isolate_(isolate) { 2586 isolate_(isolate) {
2587 } 2587 }
2588 2588
2589 2589
2590 Debugger::~Debugger() {} 2590 Debugger::~Debugger() {}
2591 2591
2592 2592
2593 Handle<Object> Debugger::MakeJSObject(Vector<const char> constructor_name, 2593 MaybeHandle<Object> Debugger::MakeJSObject(
2594 int argc, 2594 Vector<const char> constructor_name,
2595 Handle<Object> argv[], 2595 int argc,
2596 bool* caught_exception) { 2596 Handle<Object> argv[]) {
2597 ASSERT(isolate_->context() == *isolate_->debug()->debug_context()); 2597 ASSERT(isolate_->context() == *isolate_->debug()->debug_context());
2598 2598
2599 // Create the execution state object. 2599 // Create the execution state object.
2600 Handle<String> constructor_str = 2600 Handle<String> constructor_str =
2601 isolate_->factory()->InternalizeUtf8String(constructor_name); 2601 isolate_->factory()->InternalizeUtf8String(constructor_name);
2602 ASSERT(!constructor_str.is_null()); 2602 ASSERT(!constructor_str.is_null());
2603 Handle<Object> constructor = GlobalObject::GetPropertyNoExceptionThrown( 2603 Handle<Object> constructor = GlobalObject::GetPropertyNoExceptionThrown(
2604 isolate_->global_object(), constructor_str); 2604 isolate_->global_object(), constructor_str);
2605 ASSERT(constructor->IsJSFunction()); 2605 ASSERT(constructor->IsJSFunction());
2606 if (!constructor->IsJSFunction()) { 2606 if (!constructor->IsJSFunction()) return MaybeHandle<Object>();
2607 *caught_exception = true; 2607 return Execution::TryCall(
2608 return isolate_->factory()->undefined_value();
2609 }
2610 Handle<Object> js_object = Execution::TryCall(
2611 Handle<JSFunction>::cast(constructor), 2608 Handle<JSFunction>::cast(constructor),
2612 Handle<JSObject>(isolate_->debug()->debug_context()->global_object()), 2609 Handle<JSObject>(isolate_->debug()->debug_context()->global_object()),
2613 argc, 2610 argc,
2614 argv, 2611 argv);
2615 caught_exception);
2616 return js_object;
2617 } 2612 }
2618 2613
2619 2614
2620 Handle<Object> Debugger::MakeExecutionState(bool* caught_exception) { 2615 MaybeHandle<Object> Debugger::MakeExecutionState() {
2621 // Create the execution state object. 2616 // Create the execution state object.
2622 Handle<Object> break_id = isolate_->factory()->NewNumberFromInt( 2617 Handle<Object> break_id = isolate_->factory()->NewNumberFromInt(
2623 isolate_->debug()->break_id()); 2618 isolate_->debug()->break_id());
2624 Handle<Object> argv[] = { break_id }; 2619 Handle<Object> argv[] = { break_id };
2625 return MakeJSObject(CStrVector("MakeExecutionState"), 2620 return MakeJSObject(CStrVector("MakeExecutionState"), ARRAY_SIZE(argv), argv);
2626 ARRAY_SIZE(argv),
2627 argv,
2628 caught_exception);
2629 } 2621 }
2630 2622
2631 2623
2632 Handle<Object> Debugger::MakeBreakEvent(Handle<Object> exec_state, 2624 MaybeHandle<Object> Debugger::MakeBreakEvent(Handle<Object> break_points_hit) {
2633 Handle<Object> break_points_hit, 2625 Handle<Object> exec_state;
2634 bool* caught_exception) { 2626 ASSIGN_RETURN_ON_EXCEPTION(
2627 isolate_, exec_state, MakeExecutionState(), Object);
2635 // Create the new break event object. 2628 // Create the new break event object.
2636 Handle<Object> argv[] = { exec_state, break_points_hit }; 2629 Handle<Object> argv[] = { exec_state, break_points_hit };
2637 return MakeJSObject(CStrVector("MakeBreakEvent"), 2630 return MakeJSObject(CStrVector("MakeBreakEvent"), ARRAY_SIZE(argv), argv);
2638 ARRAY_SIZE(argv),
2639 argv,
2640 caught_exception);
2641 } 2631 }
2642 2632
2643 2633
2644 Handle<Object> Debugger::MakeExceptionEvent(Handle<Object> exec_state, 2634 MaybeHandle<Object> Debugger::MakeExceptionEvent(Handle<Object> exception,
2645 Handle<Object> exception, 2635 bool uncaught) {
2646 bool uncaught, 2636 Handle<Object> exec_state;
2647 bool* caught_exception) { 2637 ASSIGN_RETURN_ON_EXCEPTION(
2648 Factory* factory = isolate_->factory(); 2638 isolate_, exec_state, MakeExecutionState(), Object);
2649 // Create the new exception event object. 2639 // Create the new exception event object.
2650 Handle<Object> argv[] = { exec_state, 2640 Handle<Object> argv[] = { exec_state,
2651 exception, 2641 exception,
2652 factory->ToBoolean(uncaught) }; 2642 isolate_->factory()->ToBoolean(uncaught) };
2653 return MakeJSObject(CStrVector("MakeExceptionEvent"), 2643 return MakeJSObject(CStrVector("MakeExceptionEvent"), ARRAY_SIZE(argv), argv);
2654 ARRAY_SIZE(argv),
2655 argv,
2656 caught_exception);
2657 } 2644 }
2658 2645
2659 2646
2660 Handle<Object> Debugger::MakeNewFunctionEvent(Handle<Object> function, 2647 MaybeHandle<Object> Debugger::MakeCompileEvent(Handle<Script> script,
2661 bool* caught_exception) { 2648 bool before) {
2662 // Create the new function event object.
2663 Handle<Object> argv[] = { function };
2664 return MakeJSObject(CStrVector("MakeNewFunctionEvent"),
2665 ARRAY_SIZE(argv),
2666 argv,
2667 caught_exception);
2668 }
2669
2670
2671 Handle<Object> Debugger::MakeCompileEvent(Handle<Script> script,
2672 bool before,
2673 bool* caught_exception) {
2674 Factory* factory = isolate_->factory(); 2649 Factory* factory = isolate_->factory();
2675 // Create the compile event object. 2650 // Create the compile event object.
2676 Handle<Object> exec_state = MakeExecutionState(caught_exception); 2651 Handle<Object> exec_state;
2652 ASSIGN_RETURN_ON_EXCEPTION(
2653 isolate_, exec_state, MakeExecutionState(), Object);
2677 Handle<Object> script_wrapper = GetScriptWrapper(script); 2654 Handle<Object> script_wrapper = GetScriptWrapper(script);
2678 Handle<Object> argv[] = { exec_state, 2655 Handle<Object> argv[] = { exec_state,
2679 script_wrapper, 2656 script_wrapper,
2680 factory->ToBoolean(before) }; 2657 factory->ToBoolean(before) };
2681 return MakeJSObject(CStrVector("MakeCompileEvent"), 2658 return MakeJSObject(CStrVector("MakeCompileEvent"), ARRAY_SIZE(argv), argv);
2682 ARRAY_SIZE(argv),
2683 argv,
2684 caught_exception);
2685 } 2659 }
2686 2660
2687 2661
2688 Handle<Object> Debugger::MakeScriptCollectedEvent(int id, 2662 MaybeHandle<Object> Debugger::MakeScriptCollectedEvent(int id) {
2689 bool* caught_exception) {
2690 // Create the script collected event object. 2663 // Create the script collected event object.
2691 Handle<Object> exec_state = MakeExecutionState(caught_exception); 2664 Handle<Object> exec_state;
2665 ASSIGN_RETURN_ON_EXCEPTION(
2666 isolate_, exec_state, MakeExecutionState(), Object);
2692 Handle<Object> id_object = Handle<Smi>(Smi::FromInt(id), isolate_); 2667 Handle<Object> id_object = Handle<Smi>(Smi::FromInt(id), isolate_);
2693 Handle<Object> argv[] = { exec_state, id_object }; 2668 Handle<Object> argv[] = { exec_state, id_object };
2694 2669
2695 return MakeJSObject(CStrVector("MakeScriptCollectedEvent"), 2670 return MakeJSObject(
2696 ARRAY_SIZE(argv), 2671 CStrVector("MakeScriptCollectedEvent"), ARRAY_SIZE(argv), argv);
2697 argv,
2698 caught_exception);
2699 } 2672 }
2700 2673
2701 2674
2702 void Debugger::OnException(Handle<Object> exception, bool uncaught) { 2675 void Debugger::OnException(Handle<Object> exception, bool uncaught) {
2703 HandleScope scope(isolate_); 2676 HandleScope scope(isolate_);
2704 Debug* debug = isolate_->debug(); 2677 Debug* debug = isolate_->debug();
2705 2678
2706 // Bail out based on state or if there is no listener for this event 2679 // Bail out based on state or if there is no listener for this event
2707 if (debug->InDebugger()) return; 2680 if (debug->InDebugger()) return;
2708 if (!Debugger::EventActive(v8::Exception)) return; 2681 if (!Debugger::EventActive(v8::Exception)) return;
2709 2682
2710 // Bail out if exception breaks are not active 2683 // Bail out if exception breaks are not active
2711 if (uncaught) { 2684 if (uncaught) {
2712 // Uncaught exceptions are reported by either flags. 2685 // Uncaught exceptions are reported by either flags.
2713 if (!(debug->break_on_uncaught_exception() || 2686 if (!(debug->break_on_uncaught_exception() ||
2714 debug->break_on_exception())) return; 2687 debug->break_on_exception())) return;
2715 } else { 2688 } else {
2716 // Caught exceptions are reported is activated. 2689 // Caught exceptions are reported is activated.
2717 if (!debug->break_on_exception()) return; 2690 if (!debug->break_on_exception()) return;
2718 } 2691 }
2719 2692
2720 // Enter the debugger. 2693 // Enter the debugger.
2721 EnterDebugger debugger(isolate_); 2694 EnterDebugger debugger(isolate_);
2722 if (debugger.FailedToEnter()) return; 2695 if (debugger.FailedToEnter()) return;
2723 2696
2724 // Clear all current stepping setup. 2697 // Clear all current stepping setup.
2725 debug->ClearStepping(); 2698 debug->ClearStepping();
2726 // Create the event data object. 2699 // Create the event data object.
2727 bool caught_exception = false;
2728 Handle<Object> exec_state = MakeExecutionState(&caught_exception);
2729 Handle<Object> event_data; 2700 Handle<Object> event_data;
2730 if (!caught_exception) {
2731 event_data = MakeExceptionEvent(exec_state, exception, uncaught,
2732 &caught_exception);
2733 }
2734 // Bail out and don't call debugger if exception. 2701 // Bail out and don't call debugger if exception.
2735 if (caught_exception) { 2702 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
2736 return; 2703 isolate_, event_data, MakeExceptionEvent(exception, uncaught),
2737 } 2704 /* void */ ;);
2738 2705
2739 // Process debug event. 2706 // Process debug event.
2740 ProcessDebugEvent(v8::Exception, Handle<JSObject>::cast(event_data), false); 2707 ProcessDebugEvent(v8::Exception, Handle<JSObject>::cast(event_data), false);
2741 // Return to continue execution from where the exception was thrown. 2708 // Return to continue execution from where the exception was thrown.
2742 } 2709 }
2743 2710
2744 2711
2745 void Debugger::OnDebugBreak(Handle<Object> break_points_hit, 2712 void Debugger::OnDebugBreak(Handle<Object> break_points_hit,
2746 bool auto_continue) { 2713 bool auto_continue) {
2747 HandleScope scope(isolate_); 2714 HandleScope scope(isolate_);
2748 2715
2749 // Debugger has already been entered by caller. 2716 // Debugger has already been entered by caller.
2750 ASSERT(isolate_->context() == *isolate_->debug()->debug_context()); 2717 ASSERT(isolate_->context() == *isolate_->debug()->debug_context());
2751 2718
2752 // Bail out if there is no listener for this event 2719 // Bail out if there is no listener for this event
2753 if (!Debugger::EventActive(v8::Break)) return; 2720 if (!Debugger::EventActive(v8::Break)) return;
2754 2721
2755 // Debugger must be entered in advance. 2722 // Debugger must be entered in advance.
2756 ASSERT(isolate_->context() == *isolate_->debug()->debug_context()); 2723 ASSERT(isolate_->context() == *isolate_->debug()->debug_context());
2757 2724
2758 // Create the event data object. 2725 // Create the event data object.
2759 bool caught_exception = false;
2760 Handle<Object> exec_state = MakeExecutionState(&caught_exception);
2761 Handle<Object> event_data; 2726 Handle<Object> event_data;
2762 if (!caught_exception) {
2763 event_data = MakeBreakEvent(exec_state, break_points_hit,
2764 &caught_exception);
2765 }
2766 // Bail out and don't call debugger if exception. 2727 // Bail out and don't call debugger if exception.
2767 if (caught_exception) { 2728 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
2768 return; 2729 isolate_, event_data, MakeBreakEvent(break_points_hit), /* void */ ;);
2769 }
2770 2730
2771 // Process debug event. 2731 // Process debug event.
2772 ProcessDebugEvent(v8::Break, 2732 ProcessDebugEvent(v8::Break,
2773 Handle<JSObject>::cast(event_data), 2733 Handle<JSObject>::cast(event_data),
2774 auto_continue); 2734 auto_continue);
2775 } 2735 }
2776 2736
2777 2737
2778 void Debugger::OnBeforeCompile(Handle<Script> script) { 2738 void Debugger::OnBeforeCompile(Handle<Script> script) {
2779 HandleScope scope(isolate_); 2739 HandleScope scope(isolate_);
2780 2740
2781 // Bail out based on state or if there is no listener for this event 2741 // Bail out based on state or if there is no listener for this event
2782 if (isolate_->debug()->InDebugger()) return; 2742 if (isolate_->debug()->InDebugger()) return;
2783 if (compiling_natives()) return; 2743 if (compiling_natives()) return;
2784 if (!EventActive(v8::BeforeCompile)) return; 2744 if (!EventActive(v8::BeforeCompile)) return;
2785 2745
2786 // Enter the debugger. 2746 // Enter the debugger.
2787 EnterDebugger debugger(isolate_); 2747 EnterDebugger debugger(isolate_);
2788 if (debugger.FailedToEnter()) return; 2748 if (debugger.FailedToEnter()) return;
2789 2749
2790 // Create the event data object. 2750 // Create the event data object.
2791 bool caught_exception = false; 2751 Handle<Object> event_data;
2792 Handle<Object> event_data = MakeCompileEvent(script, true, &caught_exception);
2793 // Bail out and don't call debugger if exception. 2752 // Bail out and don't call debugger if exception.
2794 if (caught_exception) { 2753 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
2795 return; 2754 isolate_, event_data, MakeCompileEvent(script, true), /* void */ ;);
2796 }
2797 2755
2798 // Process debug event. 2756 // Process debug event.
2799 ProcessDebugEvent(v8::BeforeCompile, 2757 ProcessDebugEvent(v8::BeforeCompile,
2800 Handle<JSObject>::cast(event_data), 2758 Handle<JSObject>::cast(event_data),
2801 true); 2759 true);
2802 } 2760 }
2803 2761
2804 2762
2805 // Handle debugger actions when a new script is compiled. 2763 // Handle debugger actions when a new script is compiled.
2806 void Debugger::OnAfterCompile(Handle<Script> script, 2764 void Debugger::OnAfterCompile(Handle<Script> script,
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2838 if (!update_script_break_points->IsJSFunction()) { 2796 if (!update_script_break_points->IsJSFunction()) {
2839 return; 2797 return;
2840 } 2798 }
2841 ASSERT(update_script_break_points->IsJSFunction()); 2799 ASSERT(update_script_break_points->IsJSFunction());
2842 2800
2843 // Wrap the script object in a proper JS object before passing it 2801 // Wrap the script object in a proper JS object before passing it
2844 // to JavaScript. 2802 // to JavaScript.
2845 Handle<JSValue> wrapper = GetScriptWrapper(script); 2803 Handle<JSValue> wrapper = GetScriptWrapper(script);
2846 2804
2847 // Call UpdateScriptBreakPoints expect no exceptions. 2805 // Call UpdateScriptBreakPoints expect no exceptions.
2848 bool caught_exception;
2849 Handle<Object> argv[] = { wrapper }; 2806 Handle<Object> argv[] = { wrapper };
2850 Execution::TryCall(Handle<JSFunction>::cast(update_script_break_points), 2807 if (Execution::TryCall(
2851 isolate_->js_builtins_object(), 2808 Handle<JSFunction>::cast(update_script_break_points),
2852 ARRAY_SIZE(argv), 2809 isolate_->js_builtins_object(),
2853 argv, 2810 ARRAY_SIZE(argv),
2854 &caught_exception); 2811 argv).is_null()) {
2855 if (caught_exception) {
2856 return; 2812 return;
2857 } 2813 }
2858 // Bail out based on state or if there is no listener for this event 2814 // Bail out based on state or if there is no listener for this event
2859 if (in_debugger && (after_compile_flags & SEND_WHEN_DEBUGGING) == 0) return; 2815 if (in_debugger && (after_compile_flags & SEND_WHEN_DEBUGGING) == 0) return;
2860 if (!Debugger::EventActive(v8::AfterCompile)) return; 2816 if (!Debugger::EventActive(v8::AfterCompile)) return;
2861 2817
2862 // Create the compile state object. 2818 // Create the compile state object.
2863 Handle<Object> event_data = MakeCompileEvent(script, 2819 Handle<Object> event_data;
2864 false,
2865 &caught_exception);
2866 // Bail out and don't call debugger if exception. 2820 // Bail out and don't call debugger if exception.
2867 if (caught_exception) { 2821 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
2868 return; 2822 isolate_, event_data, MakeCompileEvent(script, false), /* void */ ;);
2869 } 2823
2870 // Process debug event. 2824 // Process debug event.
2871 ProcessDebugEvent(v8::AfterCompile, 2825 ProcessDebugEvent(v8::AfterCompile, Handle<JSObject>::cast(event_data), true);
2872 Handle<JSObject>::cast(event_data),
2873 true);
2874 } 2826 }
2875 2827
2876 2828
2877 void Debugger::OnScriptCollected(int id) { 2829 void Debugger::OnScriptCollected(int id) {
2878 HandleScope scope(isolate_); 2830 HandleScope scope(isolate_);
2879 2831
2880 // No more to do if not debugging. 2832 // No more to do if not debugging.
2881 if (isolate_->debug()->InDebugger()) return; 2833 if (isolate_->debug()->InDebugger()) return;
2882 if (!IsDebuggerActive()) return; 2834 if (!IsDebuggerActive()) return;
2883 if (!Debugger::EventActive(v8::ScriptCollected)) return; 2835 if (!Debugger::EventActive(v8::ScriptCollected)) return;
2884 2836
2885 // Enter the debugger. 2837 // Enter the debugger.
2886 EnterDebugger debugger(isolate_); 2838 EnterDebugger debugger(isolate_);
2887 if (debugger.FailedToEnter()) return; 2839 if (debugger.FailedToEnter()) return;
2888 2840
2889 // Create the script collected state object. 2841 // Create the script collected state object.
2890 bool caught_exception = false; 2842 Handle<Object> event_data;
2891 Handle<Object> event_data = MakeScriptCollectedEvent(id,
2892 &caught_exception);
2893 // Bail out and don't call debugger if exception. 2843 // Bail out and don't call debugger if exception.
2894 if (caught_exception) { 2844 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
2895 return; 2845 isolate_, event_data, MakeScriptCollectedEvent(id), /* void */ ;);
2896 }
2897 2846
2898 // Process debug event. 2847 // Process debug event.
2899 ProcessDebugEvent(v8::ScriptCollected, 2848 ProcessDebugEvent(v8::ScriptCollected,
2900 Handle<JSObject>::cast(event_data), 2849 Handle<JSObject>::cast(event_data),
2901 true); 2850 true);
2902 } 2851 }
2903 2852
2904 2853
2905 void Debugger::ProcessDebugEvent(v8::DebugEvent event, 2854 void Debugger::ProcessDebugEvent(v8::DebugEvent event,
2906 Handle<JSObject> event_data, 2855 Handle<JSObject> event_data,
2907 bool auto_continue) { 2856 bool auto_continue) {
2908 HandleScope scope(isolate_); 2857 HandleScope scope(isolate_);
2909 2858
2910 // Clear any pending debug break if this is a real break. 2859 // Clear any pending debug break if this is a real break.
2911 if (!auto_continue) { 2860 if (!auto_continue) {
2912 isolate_->debug()->clear_interrupt_pending(DEBUGBREAK); 2861 isolate_->debug()->clear_interrupt_pending(DEBUGBREAK);
2913 } 2862 }
2914 2863
2915 // Create the execution state. 2864 // Create the execution state.
2916 bool caught_exception = false; 2865 Handle<Object> exec_state;
2917 Handle<Object> exec_state = MakeExecutionState(&caught_exception); 2866 // Bail out and don't call debugger if exception.
2918 if (caught_exception) { 2867 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
2919 return; 2868 isolate_, exec_state, MakeExecutionState(), /* void */ ;);
2920 }
2921 // First notify the message handler if any. 2869 // First notify the message handler if any.
2922 if (message_handler_ != NULL) { 2870 if (message_handler_ != NULL) {
2923 NotifyMessageHandler(event, 2871 NotifyMessageHandler(event,
2924 Handle<JSObject>::cast(exec_state), 2872 Handle<JSObject>::cast(exec_state),
2925 event_data, 2873 event_data,
2926 auto_continue); 2874 auto_continue);
2927 } 2875 }
2928 // Notify registered debug event listener. This can be either a C or 2876 // Notify registered debug event listener. This can be either a C or
2929 // a JavaScript function. Don't call event listener for v8::Break 2877 // a JavaScript function. Don't call event listener for v8::Break
2930 // here, if it's only a debug command -- they will be processed later. 2878 // here, if it's only a debug command -- they will be processed later.
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
2981 Handle<Object> exec_state, 2929 Handle<Object> exec_state,
2982 Handle<Object> event_data) { 2930 Handle<Object> event_data) {
2983 ASSERT(event_listener_->IsJSFunction()); 2931 ASSERT(event_listener_->IsJSFunction());
2984 Handle<JSFunction> fun(Handle<JSFunction>::cast(event_listener_)); 2932 Handle<JSFunction> fun(Handle<JSFunction>::cast(event_listener_));
2985 2933
2986 // Invoke the JavaScript debug event listener. 2934 // Invoke the JavaScript debug event listener.
2987 Handle<Object> argv[] = { Handle<Object>(Smi::FromInt(event), isolate_), 2935 Handle<Object> argv[] = { Handle<Object>(Smi::FromInt(event), isolate_),
2988 exec_state, 2936 exec_state,
2989 event_data, 2937 event_data,
2990 event_listener_data_ }; 2938 event_listener_data_ };
2991 bool caught_exception;
2992 Execution::TryCall(fun, 2939 Execution::TryCall(fun,
2993 isolate_->global_object(), 2940 isolate_->global_object(),
2994 ARRAY_SIZE(argv), 2941 ARRAY_SIZE(argv),
2995 argv, 2942 argv);
2996 &caught_exception);
2997 // Silently ignore exceptions from debug event listeners. 2943 // Silently ignore exceptions from debug event listeners.
2998 } 2944 }
2999 2945
3000 2946
3001 Handle<Context> Debugger::GetDebugContext() { 2947 Handle<Context> Debugger::GetDebugContext() {
3002 never_unload_debugger_ = true; 2948 never_unload_debugger_ = true;
3003 EnterDebugger debugger(isolate_); 2949 EnterDebugger debugger(isolate_);
3004 return isolate_->debug()->debug_context(); 2950 return isolate_->debug()->debug_context();
3005 } 2951 }
3006 2952
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after
3340 3286
3341 bool Debugger::IsDebuggerActive() { 3287 bool Debugger::IsDebuggerActive() {
3342 LockGuard<RecursiveMutex> with(debugger_access_); 3288 LockGuard<RecursiveMutex> with(debugger_access_);
3343 3289
3344 return message_handler_ != NULL || 3290 return message_handler_ != NULL ||
3345 !event_listener_.is_null() || 3291 !event_listener_.is_null() ||
3346 force_debugger_active_; 3292 force_debugger_active_;
3347 } 3293 }
3348 3294
3349 3295
3350 Handle<Object> Debugger::Call(Handle<JSFunction> fun, 3296 MaybeHandle<Object> Debugger::Call(Handle<JSFunction> fun,
3351 Handle<Object> data, 3297 Handle<Object> data) {
3352 bool* pending_exception) {
3353 // When calling functions in the debugger prevent it from beeing unloaded. 3298 // When calling functions in the debugger prevent it from beeing unloaded.
3354 Debugger::never_unload_debugger_ = true; 3299 Debugger::never_unload_debugger_ = true;
3355 3300
3356 // Enter the debugger. 3301 // Enter the debugger.
3357 EnterDebugger debugger(isolate_); 3302 EnterDebugger debugger(isolate_);
3358 if (debugger.FailedToEnter()) { 3303 if (debugger.FailedToEnter()) {
3359 return isolate_->factory()->undefined_value(); 3304 return isolate_->factory()->undefined_value();
3360 } 3305 }
3361 3306
3362 // Create the execution state. 3307 // Create the execution state.
3363 bool caught_exception = false; 3308 Handle<Object> exec_state;
3364 Handle<Object> exec_state = MakeExecutionState(&caught_exception); 3309 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
3365 if (caught_exception) { 3310 isolate_, exec_state,
3366 return isolate_->factory()->undefined_value(); 3311 MakeExecutionState(),
3367 } 3312 isolate_->factory()->undefined_value());
3368 3313
3369 Handle<Object> argv[] = { exec_state, data }; 3314 Handle<Object> argv[] = { exec_state, data };
3370 Handle<Object> result = Execution::Call( 3315 return Execution::Call(
3371 isolate_, 3316 isolate_,
3372 fun, 3317 fun,
3373 Handle<Object>(isolate_->debug()->debug_context_->global_proxy(), 3318 Handle<Object>(isolate_->debug()->debug_context_->global_proxy(),
3374 isolate_), 3319 isolate_),
3375 ARRAY_SIZE(argv), 3320 ARRAY_SIZE(argv),
3376 argv, 3321 argv);
3377 pending_exception);
3378 return result;
3379 } 3322 }
3380 3323
3381 3324
3382 static void StubMessageHandler2(const v8::Debug::Message& message) { 3325 static void StubMessageHandler2(const v8::Debug::Message& message) {
3383 // Simply ignore message. 3326 // Simply ignore message.
3384 } 3327 }
3385 3328
3386 3329
3387 bool Debugger::StartAgent(const char* name, int port, 3330 bool Debugger::StartAgent(const char* name, int port,
3388 bool wait_for_connection) { 3331 bool wait_for_connection) {
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
3597 v8::EscapableHandleScope scope( 3540 v8::EscapableHandleScope scope(
3598 reinterpret_cast<v8::Isolate*>(event_data_->GetIsolate())); 3541 reinterpret_cast<v8::Isolate*>(event_data_->GetIsolate()));
3599 3542
3600 if (IsEvent()) { 3543 if (IsEvent()) {
3601 // Call toJSONProtocol on the debug event object. 3544 // Call toJSONProtocol on the debug event object.
3602 Handle<Object> fun = 3545 Handle<Object> fun =
3603 GetProperty(event_data_, "toJSONProtocol").ToHandleChecked(); 3546 GetProperty(event_data_, "toJSONProtocol").ToHandleChecked();
3604 if (!fun->IsJSFunction()) { 3547 if (!fun->IsJSFunction()) {
3605 return v8::Handle<v8::String>(); 3548 return v8::Handle<v8::String>();
3606 } 3549 }
3607 bool caught_exception; 3550 Handle<Object> json;
3608 Handle<Object> json = Execution::TryCall(Handle<JSFunction>::cast(fun), 3551 bool caught_exception = !Execution::TryCall(
3609 event_data_, 3552 Handle<JSFunction>::cast(fun),
3610 0, NULL, &caught_exception); 3553 event_data_,
3554 0,
3555 NULL).ToHandle(&json);
3611 if (caught_exception || !json->IsString()) { 3556 if (caught_exception || !json->IsString()) {
3612 return v8::Handle<v8::String>(); 3557 return v8::Handle<v8::String>();
3613 } 3558 }
3614 return scope.Escape(v8::Utils::ToLocal(Handle<String>::cast(json))); 3559 return scope.Escape(v8::Utils::ToLocal(Handle<String>::cast(json)));
3615 } else { 3560 } else {
3616 return v8::Utils::ToLocal(response_json_); 3561 return v8::Utils::ToLocal(response_json_);
3617 } 3562 }
3618 } 3563 }
3619 3564
3620 3565
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
3809 { 3754 {
3810 Locker locker(reinterpret_cast<v8::Isolate*>(isolate_)); 3755 Locker locker(reinterpret_cast<v8::Isolate*>(isolate_));
3811 isolate_->debugger()->CallMessageDispatchHandler(); 3756 isolate_->debugger()->CallMessageDispatchHandler();
3812 } 3757 }
3813 } 3758 }
3814 } 3759 }
3815 3760
3816 #endif // ENABLE_DEBUGGER_SUPPORT 3761 #endif // ENABLE_DEBUGGER_SUPPORT
3817 3762
3818 } } // namespace v8::internal 3763 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/debug.h ('k') | src/debug-debugger.js » ('j') | src/execution.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698