Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 12001 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 12012 Object* check; | 12012 Object* check; |
| 12013 { MaybeObject* maybe_check = Runtime_CheckExecutionState( | 12013 { MaybeObject* maybe_check = Runtime_CheckExecutionState( |
| 12014 RUNTIME_ARGUMENTS(isolate, args)); | 12014 RUNTIME_ARGUMENTS(isolate, args)); |
| 12015 if (!maybe_check->ToObject(&check)) return maybe_check; | 12015 if (!maybe_check->ToObject(&check)) return maybe_check; |
| 12016 } | 12016 } |
| 12017 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1); | 12017 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1); |
| 12018 | 12018 |
| 12019 // Get the frame where the debugging is performed. | 12019 // Get the frame where the debugging is performed. |
| 12020 StackFrame::Id id = UnwrapFrameId(wrapped_id); | 12020 StackFrame::Id id = UnwrapFrameId(wrapped_id); |
| 12021 JavaScriptFrameIterator frame_it(isolate, id); | 12021 JavaScriptFrameIterator frame_it(isolate, id); |
| 12022 if (frame_it.done()) { | |
|
Yang
2013/08/26 13:52:02
you could use RUNTIME_CHECK(!frame_it.done()) here
Peter.Rybin
2013/08/31 16:58:07
I guess you meant RUNTIME_ASSERT
Done
| |
| 12023 return isolate->ThrowIllegalOperation(); | |
| 12024 } | |
| 12025 | |
| 12022 JavaScriptFrame* frame = frame_it.frame(); | 12026 JavaScriptFrame* frame = frame_it.frame(); |
| 12023 | 12027 |
| 12024 Handle<JSFunction> fun = | 12028 Handle<JSFunction> fun = |
| 12025 Handle<JSFunction>(frame->function()); | 12029 Handle<JSFunction>(frame->function()); |
| 12026 Handle<SharedFunctionInfo> shared = | 12030 Handle<SharedFunctionInfo> shared = |
| 12027 Handle<SharedFunctionInfo>(fun->shared()); | 12031 Handle<SharedFunctionInfo>(fun->shared()); |
| 12028 | 12032 |
| 12029 if (!isolate->debug()->EnsureDebugInfo(shared, fun)) { | 12033 if (!isolate->debug()->EnsureDebugInfo(shared, fun)) { |
| 12030 return isolate->heap()->undefined_value(); | 12034 return isolate->heap()->undefined_value(); |
| 12031 } | 12035 } |
| 12032 | 12036 |
| 12033 Handle<DebugInfo> debug_info = Debug::GetDebugInfo(shared); | 12037 Handle<DebugInfo> debug_info = Debug::GetDebugInfo(shared); |
| 12034 | 12038 |
| 12035 int len = 0; | 12039 int len = 0; |
| 12036 Handle<JSArray> array(isolate->factory()->NewJSArray(10)); | 12040 Handle<JSArray> array(isolate->factory()->NewJSArray(10)); |
| 12037 // Find the break point where execution has stopped. | 12041 // Find the break point where execution has stopped. |
| 12038 BreakLocationIterator break_location_iterator(debug_info, | 12042 BreakLocationIterator break_location_iterator(debug_info, |
| 12039 ALL_BREAK_LOCATIONS); | 12043 ALL_BREAK_LOCATIONS); |
| 12040 | 12044 |
| 12041 break_location_iterator.FindBreakLocationFromAddress(frame->pc()); | 12045 break_location_iterator.FindBreakLocationFromAddress(frame->pc() - 1); |
| 12042 int current_statement_pos = break_location_iterator.statement_position(); | 12046 int current_statement_pos = break_location_iterator.statement_position(); |
| 12043 | 12047 |
| 12044 while (!break_location_iterator.Done()) { | 12048 while (!break_location_iterator.Done()) { |
| 12049 bool accept; | |
| 12045 if (break_location_iterator.pc() > frame->pc()) { | 12050 if (break_location_iterator.pc() > frame->pc()) { |
| 12051 accept = true; | |
| 12052 } else { | |
| 12053 StackFrame::Id break_frame_id = isolate->debug()->break_frame_id(); | |
| 12054 // The break point is near our pc. Could be a step-in possibility, | |
| 12055 // that is currently taken by active debugger call. | |
| 12056 if (break_frame_id == StackFrame::NO_ID) { | |
| 12057 // We are not stepping. | |
| 12058 accept = false; | |
| 12059 } else { | |
| 12060 JavaScriptFrameIterator additional_frame_it(isolate, break_frame_id); | |
| 12061 // If our frame is a top frame and we are stepping, we can do step-in | |
| 12062 // at this place. | |
| 12063 accept = additional_frame_it.frame()->id() == id; | |
| 12064 } | |
| 12065 } | |
| 12066 if (accept) { | |
| 12046 if (break_location_iterator.IsStepInLocation(isolate)) { | 12067 if (break_location_iterator.IsStepInLocation(isolate)) { |
| 12047 Smi* position_value = Smi::FromInt(break_location_iterator.position()); | 12068 Smi* position_value = Smi::FromInt(break_location_iterator.position()); |
| 12048 JSObject::SetElement(array, len, | 12069 JSObject::SetElement(array, len, |
| 12049 Handle<Object>(position_value, isolate), | 12070 Handle<Object>(position_value, isolate), |
| 12050 NONE, kNonStrictMode); | 12071 NONE, kNonStrictMode); |
| 12051 len++; | 12072 len++; |
| 12052 } | 12073 } |
| 12053 } | 12074 } |
| 12054 // Advance iterator. | 12075 // Advance iterator. |
| 12055 break_location_iterator.Next(); | 12076 break_location_iterator.Next(); |
| (...skipping 2425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 14481 // Handle last resort GC and make sure to allow future allocations | 14502 // Handle last resort GC and make sure to allow future allocations |
| 14482 // to grow the heap without causing GCs (if possible). | 14503 // to grow the heap without causing GCs (if possible). |
| 14483 isolate->counters()->gc_last_resort_from_js()->Increment(); | 14504 isolate->counters()->gc_last_resort_from_js()->Increment(); |
| 14484 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, | 14505 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, |
| 14485 "Runtime::PerformGC"); | 14506 "Runtime::PerformGC"); |
| 14486 } | 14507 } |
| 14487 } | 14508 } |
| 14488 | 14509 |
| 14489 | 14510 |
| 14490 } } // namespace v8::internal | 14511 } } // namespace v8::internal |
| OLD | NEW |