OLD | NEW |
1 // Copyright 2007-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2007-2008 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 4217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4228 v8::Integer::New(7)); | 4228 v8::Integer::New(7)); |
4229 v8::Script::Compile(v8::String::New("CheckSourceLine(7)"), &origin)->Run(); | 4229 v8::Script::Compile(v8::String::New("CheckSourceLine(7)"), &origin)->Run(); |
4230 v8::Script::Compile(v8::String::New("function f() {\n" | 4230 v8::Script::Compile(v8::String::New("function f() {\n" |
4231 " CheckSourceLine(8)\n" | 4231 " CheckSourceLine(8)\n" |
4232 " CheckSourceLine(9)\n" | 4232 " CheckSourceLine(9)\n" |
4233 " CheckSourceLine(10)\n" | 4233 " CheckSourceLine(10)\n" |
4234 "}; f()"), &origin)->Run(); | 4234 "}; f()"), &origin)->Run(); |
4235 } | 4235 } |
4236 | 4236 |
4237 | 4237 |
| 4238 // Debugger message handler which counts the number of breaks. |
| 4239 static void SendContinueCommand(); |
| 4240 static void MessageHandlerBreakPointHitCount( |
| 4241 const v8::Debug::Message& message) { |
| 4242 if (message.IsEvent() && message.GetEvent() == v8::Break) { |
| 4243 // Count the number of breaks. |
| 4244 break_point_hit_count++; |
| 4245 |
| 4246 SendContinueCommand(); |
| 4247 } |
| 4248 } |
| 4249 |
| 4250 |
4238 // Test that clearing the debug event listener actually clears all break points | 4251 // Test that clearing the debug event listener actually clears all break points |
4239 // and related information. | 4252 // and related information. |
4240 TEST(DebuggerUnload) { | 4253 TEST(DebuggerUnload) { |
4241 v8::HandleScope scope; | |
4242 DebugLocalContext env; | 4254 DebugLocalContext env; |
4243 | 4255 |
4244 // Check debugger is unloaded before it is used. | 4256 // Check debugger is unloaded before it is used. |
4245 CheckDebuggerUnloaded(); | 4257 CheckDebuggerUnloaded(); |
4246 | 4258 |
4247 // Add debug event listener. | 4259 // Set a debug event listener. |
| 4260 break_point_hit_count = 0; |
4248 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, | 4261 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, |
4249 v8::Undefined()); | 4262 v8::Undefined()); |
4250 // Create a couple of functions for the test. | 4263 { |
4251 v8::Local<v8::Function> foo = | 4264 v8::HandleScope scope; |
4252 CompileFunction(&env, "function foo(){x=1}", "foo"); | 4265 // Create a couple of functions for the test. |
4253 v8::Local<v8::Function> bar = | 4266 v8::Local<v8::Function> foo = |
4254 CompileFunction(&env, "function bar(){y=2}", "bar"); | 4267 CompileFunction(&env, "function foo(){x=1}", "foo"); |
| 4268 v8::Local<v8::Function> bar = |
| 4269 CompileFunction(&env, "function bar(){y=2}", "bar"); |
4255 | 4270 |
4256 // Set some break points. | 4271 // Set some break points. |
4257 SetBreakPoint(foo, 0); | 4272 SetBreakPoint(foo, 0); |
4258 SetBreakPoint(foo, 4); | 4273 SetBreakPoint(foo, 4); |
4259 SetBreakPoint(bar, 0); | 4274 SetBreakPoint(bar, 0); |
4260 SetBreakPoint(bar, 4); | 4275 SetBreakPoint(bar, 4); |
4261 | 4276 |
4262 // Make sure that the break points are there. | 4277 // Make sure that the break points are there. |
4263 break_point_hit_count = 0; | 4278 break_point_hit_count = 0; |
4264 foo->Call(env->Global(), 0, NULL); | 4279 foo->Call(env->Global(), 0, NULL); |
4265 CHECK_EQ(2, break_point_hit_count); | 4280 CHECK_EQ(2, break_point_hit_count); |
4266 bar->Call(env->Global(), 0, NULL); | 4281 bar->Call(env->Global(), 0, NULL); |
4267 CHECK_EQ(4, break_point_hit_count); | 4282 CHECK_EQ(4, break_point_hit_count); |
4268 | 4283 } |
4269 // Remove the debug event listener without clearing breakpoints. | 4284 |
| 4285 // Remove the debug event listener without clearing breakpoints. Do this |
| 4286 // outside a handle scope. |
4270 v8::Debug::SetDebugEventListener(NULL); | 4287 v8::Debug::SetDebugEventListener(NULL); |
4271 CheckDebuggerUnloaded(true); | 4288 CheckDebuggerUnloaded(true); |
4272 | 4289 |
4273 // Set a new debug event listener. | 4290 // Now set a debug message handler. |
4274 v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount, | |
4275 v8::Undefined()); | |
4276 // Check that the break points was actually cleared. | |
4277 break_point_hit_count = 0; | 4291 break_point_hit_count = 0; |
4278 foo->Call(env->Global(), 0, NULL); | 4292 v8::Debug::SetMessageHandler2(MessageHandlerBreakPointHitCount); |
4279 CHECK_EQ(0, break_point_hit_count); | 4293 { |
| 4294 v8::HandleScope scope; |
4280 | 4295 |
4281 // Set break points and run again. | 4296 // Get the test functions again. |
4282 SetBreakPoint(foo, 0); | 4297 v8::Local<v8::Function> foo = |
4283 SetBreakPoint(foo, 4); | 4298 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo"))); |
4284 foo->Call(env->Global(), 0, NULL); | 4299 v8::Local<v8::Function> bar = |
4285 CHECK_EQ(2, break_point_hit_count); | 4300 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("foo"))); |
4286 | 4301 |
4287 // Remove the debug event listener without clearing breakpoints again. | 4302 foo->Call(env->Global(), 0, NULL); |
4288 v8::Debug::SetDebugEventListener(NULL); | 4303 CHECK_EQ(0, break_point_hit_count); |
| 4304 |
| 4305 // Set break points and run again. |
| 4306 SetBreakPoint(foo, 0); |
| 4307 SetBreakPoint(foo, 4); |
| 4308 foo->Call(env->Global(), 0, NULL); |
| 4309 CHECK_EQ(2, break_point_hit_count); |
| 4310 } |
| 4311 |
| 4312 // Remove the debug message handler without clearing breakpoints. Do this |
| 4313 // outside a handle scope. |
| 4314 v8::Debug::SetMessageHandler2(NULL); |
4289 CheckDebuggerUnloaded(true); | 4315 CheckDebuggerUnloaded(true); |
4290 } | 4316 } |
4291 | 4317 |
4292 | 4318 |
4293 // Sends continue command to the debugger. | 4319 // Sends continue command to the debugger. |
4294 static void SendContinueCommand() { | 4320 static void SendContinueCommand() { |
4295 const int kBufferSize = 1000; | 4321 const int kBufferSize = 1000; |
4296 uint16_t buffer[kBufferSize]; | 4322 uint16_t buffer[kBufferSize]; |
4297 const char* command_continue = | 4323 const char* command_continue = |
4298 "{\"seq\":0," | 4324 "{\"seq\":0," |
(...skipping 925 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5224 v8::Local<v8::Function> f = | 5250 v8::Local<v8::Function> f = |
5225 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f"))); | 5251 v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f"))); |
5226 f->Call(env->Global(), 0, NULL); | 5252 f->Call(env->Global(), 0, NULL); |
5227 | 5253 |
5228 // Setting message handler to NULL should cause debugger unload. | 5254 // Setting message handler to NULL should cause debugger unload. |
5229 v8::Debug::SetMessageHandler2(NULL); | 5255 v8::Debug::SetMessageHandler2(NULL); |
5230 CheckDebuggerUnloaded(); | 5256 CheckDebuggerUnloaded(); |
5231 | 5257 |
5232 CHECK_EQ(1, exception_event_count); | 5258 CHECK_EQ(1, exception_event_count); |
5233 } | 5259 } |
OLD | NEW |