| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 1088 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1099 Handle<JSFunction> check_break_point = | 1099 Handle<JSFunction> check_break_point = |
| 1100 Handle<JSFunction>(JSFunction::cast( | 1100 Handle<JSFunction>(JSFunction::cast( |
| 1101 debug_context()->global()->GetPropertyNoExceptionThrown( | 1101 debug_context()->global()->GetPropertyNoExceptionThrown( |
| 1102 *is_break_point_triggered_symbol))); | 1102 *is_break_point_triggered_symbol))); |
| 1103 | 1103 |
| 1104 // Get the break id as an object. | 1104 // Get the break id as an object. |
| 1105 Handle<Object> break_id = factory->NewNumberFromInt(Debug::break_id()); | 1105 Handle<Object> break_id = factory->NewNumberFromInt(Debug::break_id()); |
| 1106 | 1106 |
| 1107 // Call HandleBreakPointx. | 1107 // Call HandleBreakPointx. |
| 1108 bool caught_exception; | 1108 bool caught_exception; |
| 1109 const int argc = 2; | 1109 Handle<Object> argv[] = { break_id, break_point_object }; |
| 1110 Object** argv[argc] = { | |
| 1111 break_id.location(), | |
| 1112 reinterpret_cast<Object**>(break_point_object.location()) | |
| 1113 }; | |
| 1114 Handle<Object> result = Execution::TryCall(check_break_point, | 1110 Handle<Object> result = Execution::TryCall(check_break_point, |
| 1115 isolate_->js_builtins_object(), argc, argv, &caught_exception); | 1111 isolate_->js_builtins_object(), |
| 1112 ARRAY_SIZE(argv), |
| 1113 argv, |
| 1114 &caught_exception); |
| 1116 | 1115 |
| 1117 // If exception or non boolean result handle as not triggered | 1116 // If exception or non boolean result handle as not triggered |
| 1118 if (caught_exception || !result->IsBoolean()) { | 1117 if (caught_exception || !result->IsBoolean()) { |
| 1119 return false; | 1118 return false; |
| 1120 } | 1119 } |
| 1121 | 1120 |
| 1122 // Return whether the break point is triggered. | 1121 // Return whether the break point is triggered. |
| 1123 ASSERT(!result.is_null()); | 1122 ASSERT(!result.is_null()); |
| 1124 return (*result)->IsTrue(); | 1123 return (*result)->IsTrue(); |
| 1125 } | 1124 } |
| (...skipping 969 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2095 | 2094 |
| 2096 Debugger::~Debugger() { | 2095 Debugger::~Debugger() { |
| 2097 delete dispatch_handler_access_; | 2096 delete dispatch_handler_access_; |
| 2098 dispatch_handler_access_ = 0; | 2097 dispatch_handler_access_ = 0; |
| 2099 delete command_received_; | 2098 delete command_received_; |
| 2100 command_received_ = 0; | 2099 command_received_ = 0; |
| 2101 } | 2100 } |
| 2102 | 2101 |
| 2103 | 2102 |
| 2104 Handle<Object> Debugger::MakeJSObject(Vector<const char> constructor_name, | 2103 Handle<Object> Debugger::MakeJSObject(Vector<const char> constructor_name, |
| 2105 int argc, Object*** argv, | 2104 int argc, |
| 2105 Handle<Object> argv[], |
| 2106 bool* caught_exception) { | 2106 bool* caught_exception) { |
| 2107 ASSERT(isolate_->context() == *isolate_->debug()->debug_context()); | 2107 ASSERT(isolate_->context() == *isolate_->debug()->debug_context()); |
| 2108 | 2108 |
| 2109 // Create the execution state object. | 2109 // Create the execution state object. |
| 2110 Handle<String> constructor_str = | 2110 Handle<String> constructor_str = |
| 2111 isolate_->factory()->LookupSymbol(constructor_name); | 2111 isolate_->factory()->LookupSymbol(constructor_name); |
| 2112 Handle<Object> constructor( | 2112 Handle<Object> constructor( |
| 2113 isolate_->global()->GetPropertyNoExceptionThrown(*constructor_str)); | 2113 isolate_->global()->GetPropertyNoExceptionThrown(*constructor_str)); |
| 2114 ASSERT(constructor->IsJSFunction()); | 2114 ASSERT(constructor->IsJSFunction()); |
| 2115 if (!constructor->IsJSFunction()) { | 2115 if (!constructor->IsJSFunction()) { |
| 2116 *caught_exception = true; | 2116 *caught_exception = true; |
| 2117 return isolate_->factory()->undefined_value(); | 2117 return isolate_->factory()->undefined_value(); |
| 2118 } | 2118 } |
| 2119 Handle<Object> js_object = Execution::TryCall( | 2119 Handle<Object> js_object = Execution::TryCall( |
| 2120 Handle<JSFunction>::cast(constructor), | 2120 Handle<JSFunction>::cast(constructor), |
| 2121 Handle<JSObject>(isolate_->debug()->debug_context()->global()), | 2121 Handle<JSObject>(isolate_->debug()->debug_context()->global()), |
| 2122 argc, argv, caught_exception); | 2122 argc, |
| 2123 argv, |
| 2124 caught_exception); |
| 2123 return js_object; | 2125 return js_object; |
| 2124 } | 2126 } |
| 2125 | 2127 |
| 2126 | 2128 |
| 2127 Handle<Object> Debugger::MakeExecutionState(bool* caught_exception) { | 2129 Handle<Object> Debugger::MakeExecutionState(bool* caught_exception) { |
| 2128 // Create the execution state object. | 2130 // Create the execution state object. |
| 2129 Handle<Object> break_id = isolate_->factory()->NewNumberFromInt( | 2131 Handle<Object> break_id = isolate_->factory()->NewNumberFromInt( |
| 2130 isolate_->debug()->break_id()); | 2132 isolate_->debug()->break_id()); |
| 2131 const int argc = 1; | 2133 Handle<Object> argv[] = { break_id }; |
| 2132 Object** argv[argc] = { break_id.location() }; | |
| 2133 return MakeJSObject(CStrVector("MakeExecutionState"), | 2134 return MakeJSObject(CStrVector("MakeExecutionState"), |
| 2134 argc, argv, caught_exception); | 2135 ARRAY_SIZE(argv), |
| 2136 argv, |
| 2137 caught_exception); |
| 2135 } | 2138 } |
| 2136 | 2139 |
| 2137 | 2140 |
| 2138 Handle<Object> Debugger::MakeBreakEvent(Handle<Object> exec_state, | 2141 Handle<Object> Debugger::MakeBreakEvent(Handle<Object> exec_state, |
| 2139 Handle<Object> break_points_hit, | 2142 Handle<Object> break_points_hit, |
| 2140 bool* caught_exception) { | 2143 bool* caught_exception) { |
| 2141 // Create the new break event object. | 2144 // Create the new break event object. |
| 2142 const int argc = 2; | 2145 Handle<Object> argv[] = { exec_state, break_points_hit }; |
| 2143 Object** argv[argc] = { exec_state.location(), | |
| 2144 break_points_hit.location() }; | |
| 2145 return MakeJSObject(CStrVector("MakeBreakEvent"), | 2146 return MakeJSObject(CStrVector("MakeBreakEvent"), |
| 2146 argc, | 2147 ARRAY_SIZE(argv), |
| 2147 argv, | 2148 argv, |
| 2148 caught_exception); | 2149 caught_exception); |
| 2149 } | 2150 } |
| 2150 | 2151 |
| 2151 | 2152 |
| 2152 Handle<Object> Debugger::MakeExceptionEvent(Handle<Object> exec_state, | 2153 Handle<Object> Debugger::MakeExceptionEvent(Handle<Object> exec_state, |
| 2153 Handle<Object> exception, | 2154 Handle<Object> exception, |
| 2154 bool uncaught, | 2155 bool uncaught, |
| 2155 bool* caught_exception) { | 2156 bool* caught_exception) { |
| 2156 Factory* factory = isolate_->factory(); | 2157 Factory* factory = isolate_->factory(); |
| 2157 // Create the new exception event object. | 2158 // Create the new exception event object. |
| 2158 const int argc = 3; | 2159 Handle<Object> argv[] = { exec_state, |
| 2159 Object** argv[argc] = { exec_state.location(), | 2160 exception, |
| 2160 exception.location(), | 2161 uncaught ? factory->true_value() |
| 2161 uncaught ? factory->true_value().location() : | 2162 : factory->false_value() }; |
| 2162 factory->false_value().location()}; | |
| 2163 return MakeJSObject(CStrVector("MakeExceptionEvent"), | 2163 return MakeJSObject(CStrVector("MakeExceptionEvent"), |
| 2164 argc, argv, caught_exception); | 2164 ARRAY_SIZE(argv), |
| 2165 argv, |
| 2166 caught_exception); |
| 2165 } | 2167 } |
| 2166 | 2168 |
| 2167 | 2169 |
| 2168 Handle<Object> Debugger::MakeNewFunctionEvent(Handle<Object> function, | 2170 Handle<Object> Debugger::MakeNewFunctionEvent(Handle<Object> function, |
| 2169 bool* caught_exception) { | 2171 bool* caught_exception) { |
| 2170 // Create the new function event object. | 2172 // Create the new function event object. |
| 2171 const int argc = 1; | 2173 Handle<Object> argv[] = { function }; |
| 2172 Object** argv[argc] = { function.location() }; | |
| 2173 return MakeJSObject(CStrVector("MakeNewFunctionEvent"), | 2174 return MakeJSObject(CStrVector("MakeNewFunctionEvent"), |
| 2174 argc, argv, caught_exception); | 2175 ARRAY_SIZE(argv), |
| 2176 argv, |
| 2177 caught_exception); |
| 2175 } | 2178 } |
| 2176 | 2179 |
| 2177 | 2180 |
| 2178 Handle<Object> Debugger::MakeCompileEvent(Handle<Script> script, | 2181 Handle<Object> Debugger::MakeCompileEvent(Handle<Script> script, |
| 2179 bool before, | 2182 bool before, |
| 2180 bool* caught_exception) { | 2183 bool* caught_exception) { |
| 2181 Factory* factory = isolate_->factory(); | 2184 Factory* factory = isolate_->factory(); |
| 2182 // Create the compile event object. | 2185 // Create the compile event object. |
| 2183 Handle<Object> exec_state = MakeExecutionState(caught_exception); | 2186 Handle<Object> exec_state = MakeExecutionState(caught_exception); |
| 2184 Handle<Object> script_wrapper = GetScriptWrapper(script); | 2187 Handle<Object> script_wrapper = GetScriptWrapper(script); |
| 2185 const int argc = 3; | 2188 Handle<Object> argv[] = { exec_state, |
| 2186 Object** argv[argc] = { exec_state.location(), | 2189 script_wrapper, |
| 2187 script_wrapper.location(), | 2190 before ? factory->true_value() |
| 2188 before ? factory->true_value().location() : | 2191 : factory->false_value() }; |
| 2189 factory->false_value().location() }; | |
| 2190 | 2192 |
| 2191 return MakeJSObject(CStrVector("MakeCompileEvent"), | 2193 return MakeJSObject(CStrVector("MakeCompileEvent"), |
| 2192 argc, | 2194 ARRAY_SIZE(argv), |
| 2193 argv, | 2195 argv, |
| 2194 caught_exception); | 2196 caught_exception); |
| 2195 } | 2197 } |
| 2196 | 2198 |
| 2197 | 2199 |
| 2198 Handle<Object> Debugger::MakeScriptCollectedEvent(int id, | 2200 Handle<Object> Debugger::MakeScriptCollectedEvent(int id, |
| 2199 bool* caught_exception) { | 2201 bool* caught_exception) { |
| 2200 // Create the script collected event object. | 2202 // Create the script collected event object. |
| 2201 Handle<Object> exec_state = MakeExecutionState(caught_exception); | 2203 Handle<Object> exec_state = MakeExecutionState(caught_exception); |
| 2202 Handle<Object> id_object = Handle<Smi>(Smi::FromInt(id)); | 2204 Handle<Object> id_object = Handle<Smi>(Smi::FromInt(id)); |
| 2203 const int argc = 2; | 2205 Handle<Object> argv[] = { exec_state, id_object }; |
| 2204 Object** argv[argc] = { exec_state.location(), id_object.location() }; | |
| 2205 | 2206 |
| 2206 return MakeJSObject(CStrVector("MakeScriptCollectedEvent"), | 2207 return MakeJSObject(CStrVector("MakeScriptCollectedEvent"), |
| 2207 argc, | 2208 ARRAY_SIZE(argv), |
| 2208 argv, | 2209 argv, |
| 2209 caught_exception); | 2210 caught_exception); |
| 2210 } | 2211 } |
| 2211 | 2212 |
| 2212 | 2213 |
| 2213 void Debugger::OnException(Handle<Object> exception, bool uncaught) { | 2214 void Debugger::OnException(Handle<Object> exception, bool uncaught) { |
| 2214 HandleScope scope(isolate_); | 2215 HandleScope scope(isolate_); |
| 2215 Debug* debug = isolate_->debug(); | 2216 Debug* debug = isolate_->debug(); |
| 2216 | 2217 |
| 2217 // Bail out based on state or if there is no listener for this event | 2218 // Bail out based on state or if there is no listener for this event |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2348 return; | 2349 return; |
| 2349 } | 2350 } |
| 2350 ASSERT(update_script_break_points->IsJSFunction()); | 2351 ASSERT(update_script_break_points->IsJSFunction()); |
| 2351 | 2352 |
| 2352 // Wrap the script object in a proper JS object before passing it | 2353 // Wrap the script object in a proper JS object before passing it |
| 2353 // to JavaScript. | 2354 // to JavaScript. |
| 2354 Handle<JSValue> wrapper = GetScriptWrapper(script); | 2355 Handle<JSValue> wrapper = GetScriptWrapper(script); |
| 2355 | 2356 |
| 2356 // Call UpdateScriptBreakPoints expect no exceptions. | 2357 // Call UpdateScriptBreakPoints expect no exceptions. |
| 2357 bool caught_exception; | 2358 bool caught_exception; |
| 2358 const int argc = 1; | 2359 Handle<Object> argv[] = { wrapper }; |
| 2359 Object** argv[argc] = { reinterpret_cast<Object**>(wrapper.location()) }; | |
| 2360 Execution::TryCall(Handle<JSFunction>::cast(update_script_break_points), | 2360 Execution::TryCall(Handle<JSFunction>::cast(update_script_break_points), |
| 2361 Isolate::Current()->js_builtins_object(), argc, argv, | 2361 Isolate::Current()->js_builtins_object(), |
| 2362 &caught_exception); | 2362 ARRAY_SIZE(argv), |
| 2363 argv, |
| 2364 &caught_exception); |
| 2363 if (caught_exception) { | 2365 if (caught_exception) { |
| 2364 return; | 2366 return; |
| 2365 } | 2367 } |
| 2366 // Bail out based on state or if there is no listener for this event | 2368 // Bail out based on state or if there is no listener for this event |
| 2367 if (in_debugger && (after_compile_flags & SEND_WHEN_DEBUGGING) == 0) return; | 2369 if (in_debugger && (after_compile_flags & SEND_WHEN_DEBUGGING) == 0) return; |
| 2368 if (!Debugger::EventActive(v8::AfterCompile)) return; | 2370 if (!Debugger::EventActive(v8::AfterCompile)) return; |
| 2369 | 2371 |
| 2370 // Create the compile state object. | 2372 // Create the compile state object. |
| 2371 Handle<Object> event_data = MakeCompileEvent(script, | 2373 Handle<Object> event_data = MakeCompileEvent(script, |
| 2372 false, | 2374 false, |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2483 } | 2485 } |
| 2484 | 2486 |
| 2485 | 2487 |
| 2486 void Debugger::CallJSEventCallback(v8::DebugEvent event, | 2488 void Debugger::CallJSEventCallback(v8::DebugEvent event, |
| 2487 Handle<Object> exec_state, | 2489 Handle<Object> exec_state, |
| 2488 Handle<Object> event_data) { | 2490 Handle<Object> event_data) { |
| 2489 ASSERT(event_listener_->IsJSFunction()); | 2491 ASSERT(event_listener_->IsJSFunction()); |
| 2490 Handle<JSFunction> fun(Handle<JSFunction>::cast(event_listener_)); | 2492 Handle<JSFunction> fun(Handle<JSFunction>::cast(event_listener_)); |
| 2491 | 2493 |
| 2492 // Invoke the JavaScript debug event listener. | 2494 // Invoke the JavaScript debug event listener. |
| 2493 const int argc = 4; | 2495 Handle<Object> argv[] = { Handle<Object>(Smi::FromInt(event)), |
| 2494 Object** argv[argc] = { Handle<Object>(Smi::FromInt(event)).location(), | 2496 exec_state, |
| 2495 exec_state.location(), | 2497 event_data, |
| 2496 Handle<Object>::cast(event_data).location(), | 2498 event_listener_data_ }; |
| 2497 event_listener_data_.location() }; | |
| 2498 bool caught_exception; | 2499 bool caught_exception; |
| 2499 Execution::TryCall(fun, isolate_->global(), argc, argv, &caught_exception); | 2500 Execution::TryCall(fun, |
| 2501 isolate_->global(), |
| 2502 ARRAY_SIZE(argv), |
| 2503 argv, |
| 2504 &caught_exception); |
| 2500 // Silently ignore exceptions from debug event listeners. | 2505 // Silently ignore exceptions from debug event listeners. |
| 2501 } | 2506 } |
| 2502 | 2507 |
| 2503 | 2508 |
| 2504 Handle<Context> Debugger::GetDebugContext() { | 2509 Handle<Context> Debugger::GetDebugContext() { |
| 2505 never_unload_debugger_ = true; | 2510 never_unload_debugger_ = true; |
| 2506 EnterDebugger debugger; | 2511 EnterDebugger debugger; |
| 2507 return isolate_->debug()->debug_context(); | 2512 return isolate_->debug()->debug_context(); |
| 2508 } | 2513 } |
| 2509 | 2514 |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2858 return isolate_->factory()->undefined_value(); | 2863 return isolate_->factory()->undefined_value(); |
| 2859 } | 2864 } |
| 2860 | 2865 |
| 2861 // Create the execution state. | 2866 // Create the execution state. |
| 2862 bool caught_exception = false; | 2867 bool caught_exception = false; |
| 2863 Handle<Object> exec_state = MakeExecutionState(&caught_exception); | 2868 Handle<Object> exec_state = MakeExecutionState(&caught_exception); |
| 2864 if (caught_exception) { | 2869 if (caught_exception) { |
| 2865 return isolate_->factory()->undefined_value(); | 2870 return isolate_->factory()->undefined_value(); |
| 2866 } | 2871 } |
| 2867 | 2872 |
| 2868 static const int kArgc = 2; | 2873 Handle<Object> argv[] = { exec_state, data }; |
| 2869 Object** argv[kArgc] = { exec_state.location(), data.location() }; | |
| 2870 Handle<Object> result = Execution::Call( | 2874 Handle<Object> result = Execution::Call( |
| 2871 fun, | 2875 fun, |
| 2872 Handle<Object>(isolate_->debug()->debug_context_->global_proxy()), | 2876 Handle<Object>(isolate_->debug()->debug_context_->global_proxy()), |
| 2873 kArgc, | 2877 ARRAY_SIZE(argv), |
| 2874 argv, | 2878 argv, |
| 2875 pending_exception); | 2879 pending_exception); |
| 2876 return result; | 2880 return result; |
| 2877 } | 2881 } |
| 2878 | 2882 |
| 2879 | 2883 |
| 2880 static void StubMessageHandler2(const v8::Debug::Message& message) { | 2884 static void StubMessageHandler2(const v8::Debug::Message& message) { |
| 2881 // Simply ignore message. | 2885 // Simply ignore message. |
| 2882 } | 2886 } |
| 2883 | 2887 |
| (...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3321 { | 3325 { |
| 3322 Locker locker; | 3326 Locker locker; |
| 3323 Isolate::Current()->debugger()->CallMessageDispatchHandler(); | 3327 Isolate::Current()->debugger()->CallMessageDispatchHandler(); |
| 3324 } | 3328 } |
| 3325 } | 3329 } |
| 3326 } | 3330 } |
| 3327 | 3331 |
| 3328 #endif // ENABLE_DEBUGGER_SUPPORT | 3332 #endif // ENABLE_DEBUGGER_SUPPORT |
| 3329 | 3333 |
| 3330 } } // namespace v8::internal | 3334 } } // namespace v8::internal |
| OLD | NEW |