| 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 "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/api.h" | 7 #include "src/api.h" |
| 8 #include "src/arguments.h" | 8 #include "src/arguments.h" |
| 9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
| 10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
| (...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 | 366 |
| 367 | 367 |
| 368 bool BreakLocationIterator::IsStepInLocation(Isolate* isolate) { | 368 bool BreakLocationIterator::IsStepInLocation(Isolate* isolate) { |
| 369 if (RelocInfo::IsConstructCall(original_rmode())) { | 369 if (RelocInfo::IsConstructCall(original_rmode())) { |
| 370 return true; | 370 return true; |
| 371 } else if (RelocInfo::IsCodeTarget(rmode())) { | 371 } else if (RelocInfo::IsCodeTarget(rmode())) { |
| 372 HandleScope scope(debug_info_->GetIsolate()); | 372 HandleScope scope(debug_info_->GetIsolate()); |
| 373 Address target = original_rinfo()->target_address(); | 373 Address target = original_rinfo()->target_address(); |
| 374 Handle<Code> target_code(Code::GetCodeFromTargetAddress(target)); | 374 Handle<Code> target_code(Code::GetCodeFromTargetAddress(target)); |
| 375 if (target_code->kind() == Code::STUB) { | 375 if (target_code->kind() == Code::STUB) { |
| 376 return target_code->major_key() == CodeStub::CallFunction; | 376 return CodeStub::GetMajorKey(*target_code) == CodeStub::CallFunction; |
| 377 } | 377 } |
| 378 return target_code->is_call_stub(); | 378 return target_code->is_call_stub(); |
| 379 } | 379 } |
| 380 return false; | 380 return false; |
| 381 } | 381 } |
| 382 | 382 |
| 383 | 383 |
| 384 void BreakLocationIterator::PrepareStepIn(Isolate* isolate) { | 384 void BreakLocationIterator::PrepareStepIn(Isolate* isolate) { |
| 385 #ifdef DEBUG | 385 #ifdef DEBUG |
| 386 HandleScope scope(isolate); | 386 HandleScope scope(isolate); |
| 387 // Step in can only be prepared if currently positioned on an IC call, | 387 // Step in can only be prepared if currently positioned on an IC call, |
| 388 // construct call or CallFunction stub call. | 388 // construct call or CallFunction stub call. |
| 389 Address target = rinfo()->target_address(); | 389 Address target = rinfo()->target_address(); |
| 390 Handle<Code> target_code(Code::GetCodeFromTargetAddress(target)); | 390 Handle<Code> target_code(Code::GetCodeFromTargetAddress(target)); |
| 391 // All the following stuff is needed only for assertion checks so the code | 391 // All the following stuff is needed only for assertion checks so the code |
| 392 // is wrapped in ifdef. | 392 // is wrapped in ifdef. |
| 393 Handle<Code> maybe_call_function_stub = target_code; | 393 Handle<Code> maybe_call_function_stub = target_code; |
| 394 if (IsDebugBreak()) { | 394 if (IsDebugBreak()) { |
| 395 Address original_target = original_rinfo()->target_address(); | 395 Address original_target = original_rinfo()->target_address(); |
| 396 maybe_call_function_stub = | 396 maybe_call_function_stub = |
| 397 Handle<Code>(Code::GetCodeFromTargetAddress(original_target)); | 397 Handle<Code>(Code::GetCodeFromTargetAddress(original_target)); |
| 398 } | 398 } |
| 399 bool is_call_function_stub = | 399 bool is_call_function_stub = |
| 400 (maybe_call_function_stub->kind() == Code::STUB && | 400 (maybe_call_function_stub->kind() == Code::STUB && |
| 401 maybe_call_function_stub->major_key() == CodeStub::CallFunction); | 401 CodeStub::GetMajorKey(*maybe_call_function_stub) == |
| 402 CodeStub::CallFunction); |
| 402 | 403 |
| 403 // Step in through construct call requires no changes to the running code. | 404 // Step in through construct call requires no changes to the running code. |
| 404 // Step in through getters/setters should already be prepared as well | 405 // Step in through getters/setters should already be prepared as well |
| 405 // because caller of this function (Debug::PrepareStep) is expected to | 406 // because caller of this function (Debug::PrepareStep) is expected to |
| 406 // flood the top frame's function with one shot breakpoints. | 407 // flood the top frame's function with one shot breakpoints. |
| 407 // Step in through CallFunction stub should also be prepared by caller of | 408 // Step in through CallFunction stub should also be prepared by caller of |
| 408 // this function (Debug::PrepareStep) which should flood target function | 409 // this function (Debug::PrepareStep) which should flood target function |
| 409 // with breakpoints. | 410 // with breakpoints. |
| 410 ASSERT(RelocInfo::IsConstructCall(rmode()) || | 411 ASSERT(RelocInfo::IsConstructCall(rmode()) || |
| 411 target_code->is_inline_cache_stub() || | 412 target_code->is_inline_cache_stub() || |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 468 } | 469 } |
| 469 } | 470 } |
| 470 if (RelocInfo::IsConstructCall(mode)) { | 471 if (RelocInfo::IsConstructCall(mode)) { |
| 471 if (code->has_function_cache()) { | 472 if (code->has_function_cache()) { |
| 472 return isolate->builtins()->CallConstructStub_Recording_DebugBreak(); | 473 return isolate->builtins()->CallConstructStub_Recording_DebugBreak(); |
| 473 } else { | 474 } else { |
| 474 return isolate->builtins()->CallConstructStub_DebugBreak(); | 475 return isolate->builtins()->CallConstructStub_DebugBreak(); |
| 475 } | 476 } |
| 476 } | 477 } |
| 477 if (code->kind() == Code::STUB) { | 478 if (code->kind() == Code::STUB) { |
| 478 ASSERT(code->major_key() == CodeStub::CallFunction); | 479 ASSERT(CodeStub::GetMajorKey(*code) == CodeStub::CallFunction); |
| 479 return isolate->builtins()->CallFunctionStub_DebugBreak(); | 480 return isolate->builtins()->CallFunctionStub_DebugBreak(); |
| 480 } | 481 } |
| 481 | 482 |
| 482 UNREACHABLE(); | 483 UNREACHABLE(); |
| 483 return Handle<Code>::null(); | 484 return Handle<Code>::null(); |
| 484 } | 485 } |
| 485 | 486 |
| 486 | 487 |
| 487 void BreakLocationIterator::SetDebugBreakAtIC() { | 488 void BreakLocationIterator::SetDebugBreakAtIC() { |
| 488 // Patch the original code with the current address as the current address | 489 // Patch the original code with the current address as the current address |
| (...skipping 923 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1412 // Check if target code is CallFunction stub. | 1413 // Check if target code is CallFunction stub. |
| 1413 Code* maybe_call_function_stub = code; | 1414 Code* maybe_call_function_stub = code; |
| 1414 // If there is a breakpoint at this line look at the original code to | 1415 // If there is a breakpoint at this line look at the original code to |
| 1415 // check if it is a CallFunction stub. | 1416 // check if it is a CallFunction stub. |
| 1416 if (it.IsDebugBreak()) { | 1417 if (it.IsDebugBreak()) { |
| 1417 Address original_target = it.original_rinfo()->target_address(); | 1418 Address original_target = it.original_rinfo()->target_address(); |
| 1418 maybe_call_function_stub = | 1419 maybe_call_function_stub = |
| 1419 Code::GetCodeFromTargetAddress(original_target); | 1420 Code::GetCodeFromTargetAddress(original_target); |
| 1420 } | 1421 } |
| 1421 if ((maybe_call_function_stub->kind() == Code::STUB && | 1422 if ((maybe_call_function_stub->kind() == Code::STUB && |
| 1422 maybe_call_function_stub->major_key() == CodeStub::CallFunction) || | 1423 CodeStub::GetMajorKey(maybe_call_function_stub) == |
| 1424 CodeStub::CallFunction) || |
| 1423 maybe_call_function_stub->kind() == Code::CALL_IC) { | 1425 maybe_call_function_stub->kind() == Code::CALL_IC) { |
| 1424 // Save reference to the code as we may need it to find out arguments | 1426 // Save reference to the code as we may need it to find out arguments |
| 1425 // count for 'step in' later. | 1427 // count for 'step in' later. |
| 1426 call_function_stub = Handle<Code>(maybe_call_function_stub); | 1428 call_function_stub = Handle<Code>(maybe_call_function_stub); |
| 1427 } | 1429 } |
| 1428 } | 1430 } |
| 1429 } else { | 1431 } else { |
| 1430 is_at_restarted_function = true; | 1432 is_at_restarted_function = true; |
| 1431 } | 1433 } |
| 1432 | 1434 |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1492 // Get the STUB key and extract major and minor key. | 1494 // Get the STUB key and extract major and minor key. |
| 1493 uint32_t key = Smi::cast(*obj)->value(); | 1495 uint32_t key = Smi::cast(*obj)->value(); |
| 1494 // Argc in the stub is the number of arguments passed - not the | 1496 // Argc in the stub is the number of arguments passed - not the |
| 1495 // expected arguments of the called function. | 1497 // expected arguments of the called function. |
| 1496 int call_function_arg_count = is_call_ic | 1498 int call_function_arg_count = is_call_ic |
| 1497 ? CallICStub::ExtractArgcFromMinorKey(CodeStub::MinorKeyFromKey(key)) | 1499 ? CallICStub::ExtractArgcFromMinorKey(CodeStub::MinorKeyFromKey(key)) |
| 1498 : CallFunctionStub::ExtractArgcFromMinorKey( | 1500 : CallFunctionStub::ExtractArgcFromMinorKey( |
| 1499 CodeStub::MinorKeyFromKey(key)); | 1501 CodeStub::MinorKeyFromKey(key)); |
| 1500 | 1502 |
| 1501 ASSERT(is_call_ic || | 1503 ASSERT(is_call_ic || |
| 1502 call_function_stub->major_key() == CodeStub::MajorKeyFromKey(key)); | 1504 CodeStub::GetMajorKey(*call_function_stub) == |
| 1505 CodeStub::MajorKeyFromKey(key)); |
| 1503 | 1506 |
| 1504 // Find target function on the expression stack. | 1507 // Find target function on the expression stack. |
| 1505 // Expression stack looks like this (top to bottom): | 1508 // Expression stack looks like this (top to bottom): |
| 1506 // argN | 1509 // argN |
| 1507 // ... | 1510 // ... |
| 1508 // arg0 | 1511 // arg0 |
| 1509 // Receiver | 1512 // Receiver |
| 1510 // Function to call | 1513 // Function to call |
| 1511 int expressions_count = frame->ComputeExpressionsCount(); | 1514 int expressions_count = frame->ComputeExpressionsCount(); |
| 1512 ASSERT(expressions_count - 2 - call_function_arg_count >= 0); | 1515 ASSERT(expressions_count - 2 - call_function_arg_count >= 0); |
| (...skipping 1884 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3397 logger_->DebugEvent("Put", message.text()); | 3400 logger_->DebugEvent("Put", message.text()); |
| 3398 } | 3401 } |
| 3399 | 3402 |
| 3400 | 3403 |
| 3401 void LockingCommandMessageQueue::Clear() { | 3404 void LockingCommandMessageQueue::Clear() { |
| 3402 base::LockGuard<base::Mutex> lock_guard(&mutex_); | 3405 base::LockGuard<base::Mutex> lock_guard(&mutex_); |
| 3403 queue_.Clear(); | 3406 queue_.Clear(); |
| 3404 } | 3407 } |
| 3405 | 3408 |
| 3406 } } // namespace v8::internal | 3409 } } // namespace v8::internal |
| OLD | NEW |