| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-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 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 void BreakLocationIterator::SetDebugBreak() { | 278 void BreakLocationIterator::SetDebugBreak() { |
| 279 // If there is already a break point here just return. This might happen if | 279 // If there is already a break point here just return. This might happen if |
| 280 // the same code is flooded with break points twice. Flooding the same | 280 // the same code is flooded with break points twice. Flooding the same |
| 281 // function twice might happen when stepping in a function with an exception | 281 // function twice might happen when stepping in a function with an exception |
| 282 // handler as the handler and the function is the same. | 282 // handler as the handler and the function is the same. |
| 283 if (IsDebugBreak()) { | 283 if (IsDebugBreak()) { |
| 284 return; | 284 return; |
| 285 } | 285 } |
| 286 | 286 |
| 287 if (RelocInfo::IsJSReturn(rmode())) { | 287 if (RelocInfo::IsJSReturn(rmode())) { |
| 288 // This path is currently only used on IA32 as JSExitFrame on ARM uses a | 288 // Patch the frame exit code with a break point. |
| 289 // stub. | 289 SetDebugBreakAtReturn(); |
| 290 // Patch the JS frame exit code with a debug break call. See | |
| 291 // VisitReturnStatement and ExitJSFrame in codegen-ia32.cc for the | |
| 292 // precise return instructions sequence. | |
| 293 ASSERT(Debug::kIa32JSReturnSequenceLength >= | |
| 294 Debug::kIa32CallInstructionLength); | |
| 295 rinfo()->patch_code_with_call(Debug::debug_break_return_entry()->entry(), | |
| 296 Debug::kIa32JSReturnSequenceLength - Debug::kIa32CallInstructionLength); | |
| 297 } else { | 290 } else { |
| 298 // Patch the original code with the current address as the current address | 291 // Patch the original code with the current address as the current address |
| 299 // might have changed by the inline caching since the code was copied. | 292 // might have changed by the inline caching since the code was copied. |
| 300 original_rinfo()->set_target_address(rinfo()->target_address()); | 293 original_rinfo()->set_target_address(rinfo()->target_address()); |
| 301 | 294 |
| 302 // Patch the code to invoke the builtin debug break function matching the | 295 // Patch the code to invoke the builtin debug break function matching the |
| 303 // calling convention used by the call site. | 296 // calling convention used by the call site. |
| 304 Handle<Code> dbgbrk_code(Debug::FindDebugBreak(rinfo())); | 297 Handle<Code> dbgbrk_code(Debug::FindDebugBreak(rinfo())); |
| 305 rinfo()->set_target_address(dbgbrk_code->entry()); | 298 rinfo()->set_target_address(dbgbrk_code->entry()); |
| 306 } | 299 } |
| 307 ASSERT(IsDebugBreak()); | 300 ASSERT(IsDebugBreak()); |
| 308 } | 301 } |
| 309 | 302 |
| 310 | 303 |
| 311 void BreakLocationIterator::ClearDebugBreak() { | 304 void BreakLocationIterator::ClearDebugBreak() { |
| 312 if (RelocInfo::IsJSReturn(rmode())) { | 305 if (RelocInfo::IsJSReturn(rmode())) { |
| 313 // Restore the JS frame exit code. | 306 // Restore the frame exit code. |
| 314 rinfo()->patch_code(original_rinfo()->pc(), | 307 ClearDebugBreakAtReturn(); |
| 315 Debug::kIa32JSReturnSequenceLength); | |
| 316 } else { | 308 } else { |
| 317 // Patch the code to the original invoke. | 309 // Patch the code to the original invoke. |
| 318 rinfo()->set_target_address(original_rinfo()->target_address()); | 310 rinfo()->set_target_address(original_rinfo()->target_address()); |
| 319 } | 311 } |
| 320 ASSERT(!IsDebugBreak()); | 312 ASSERT(!IsDebugBreak()); |
| 321 } | 313 } |
| 322 | 314 |
| 323 | 315 |
| 324 void BreakLocationIterator::PrepareStepIn() { | 316 void BreakLocationIterator::PrepareStepIn() { |
| 325 // Step in can only be prepared if currently positioned on an IC call or | 317 // Step in can only be prepared if currently positioned on an IC call or |
| (...skipping 26 matching lines...) Expand all Loading... |
| 352 | 344 |
| 353 | 345 |
| 354 bool BreakLocationIterator::HasBreakPoint() { | 346 bool BreakLocationIterator::HasBreakPoint() { |
| 355 return debug_info_->HasBreakPoint(code_position()); | 347 return debug_info_->HasBreakPoint(code_position()); |
| 356 } | 348 } |
| 357 | 349 |
| 358 | 350 |
| 359 // Check whether there is a debug break at the current position. | 351 // Check whether there is a debug break at the current position. |
| 360 bool BreakLocationIterator::IsDebugBreak() { | 352 bool BreakLocationIterator::IsDebugBreak() { |
| 361 if (RelocInfo::IsJSReturn(rmode())) { | 353 if (RelocInfo::IsJSReturn(rmode())) { |
| 362 // This is IA32 specific but works as long as the ARM version | 354 return IsDebugBreakAtReturn(); |
| 363 // still uses a stub for JSExitFrame. | |
| 364 // | |
| 365 // TODO(1240753): Make the test architecture independent or split | |
| 366 // parts of the debugger into architecture dependent files. | |
| 367 return (*(rinfo()->pc()) == 0xE8); | |
| 368 } else { | 355 } else { |
| 369 return Debug::IsDebugBreak(rinfo()->target_address()); | 356 return Debug::IsDebugBreak(rinfo()->target_address()); |
| 370 } | 357 } |
| 371 } | 358 } |
| 372 | 359 |
| 373 | 360 |
| 374 Object* BreakLocationIterator::BreakPointObjects() { | 361 Object* BreakLocationIterator::BreakPointObjects() { |
| 375 return debug_info_->GetBreakPointObjects(code_position()); | 362 return debug_info_->GetBreakPointObjects(code_position()); |
| 376 } | 363 } |
| 377 | 364 |
| (...skipping 1657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2035 } | 2022 } |
| 2036 | 2023 |
| 2037 | 2024 |
| 2038 void LockingMessageQueue::Clear() { | 2025 void LockingMessageQueue::Clear() { |
| 2039 ScopedLock sl(lock_); | 2026 ScopedLock sl(lock_); |
| 2040 queue_.Clear(); | 2027 queue_.Clear(); |
| 2041 } | 2028 } |
| 2042 | 2029 |
| 2043 | 2030 |
| 2044 } } // namespace v8::internal | 2031 } } // namespace v8::internal |
| OLD | NEW |