diff options
Diffstat (limited to 'deps/v8/src/runtime/runtime-debug.cc')
-rw-r--r-- | deps/v8/src/runtime/runtime-debug.cc | 114 |
1 files changed, 44 insertions, 70 deletions
diff --git a/deps/v8/src/runtime/runtime-debug.cc b/deps/v8/src/runtime/runtime-debug.cc index c29ea9a35d..ad8375a8d4 100644 --- a/deps/v8/src/runtime/runtime-debug.cc +++ b/deps/v8/src/runtime/runtime-debug.cc @@ -5,11 +5,13 @@ #include "src/runtime/runtime-utils.h" #include "src/arguments.h" -#include "src/debug/debug.h" #include "src/debug/debug-evaluate.h" #include "src/debug/debug-frames.h" #include "src/debug/debug-scopes.h" +#include "src/debug/debug.h" #include "src/frames-inl.h" +#include "src/interpreter/bytecodes.h" +#include "src/interpreter/interpreter.h" #include "src/isolate-inl.h" #include "src/runtime/runtime.h" @@ -18,11 +20,39 @@ namespace internal { RUNTIME_FUNCTION(Runtime_DebugBreak) { SealHandleScope shs(isolate); - DCHECK(args.length() == 0); + DCHECK(args.length() == 1); + CONVERT_ARG_HANDLE_CHECKED(Object, value, 0); + isolate->debug()->set_return_value(value); + // Get the top-most JavaScript frame. JavaScriptFrameIterator it(isolate); - isolate->debug()->Break(args, it.frame()); - return isolate->debug()->SetAfterBreakTarget(it.frame()); + isolate->debug()->Break(it.frame()); + + isolate->debug()->SetAfterBreakTarget(it.frame()); + return *isolate->debug()->return_value(); +} + +RUNTIME_FUNCTION(Runtime_DebugBreakOnBytecode) { + SealHandleScope shs(isolate); + DCHECK(args.length() == 1); + CONVERT_ARG_HANDLE_CHECKED(Object, value, 0); + isolate->debug()->set_return_value(value); + + // Get the top-most JavaScript frame. + JavaScriptFrameIterator it(isolate); + isolate->debug()->Break(it.frame()); + + // Return the handler from the original bytecode array. + DCHECK(it.frame()->is_interpreted()); + InterpretedFrame* interpreted_frame = + reinterpret_cast<InterpretedFrame*>(it.frame()); + SharedFunctionInfo* shared = interpreted_frame->function()->shared(); + BytecodeArray* bytecode_array = shared->bytecode_array(); + int bytecode_offset = interpreted_frame->GetBytecodeOffset(); + interpreter::Bytecode bytecode = + interpreter::Bytecodes::FromByte(bytecode_array->get(bytecode_offset)); + return isolate->interpreter()->GetBytecodeHandler( + bytecode, interpreter::OperandScale::kSingle); } @@ -302,8 +332,8 @@ RUNTIME_FUNCTION(Runtime_DebugGetPropertyDetails) { if (name->AsArrayIndex(&index)) { Handle<FixedArray> details = isolate->factory()->NewFixedArray(2); Handle<Object> element_or_char; - ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, element_or_char, - Object::GetElement(isolate, obj, index)); + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( + isolate, element_or_char, JSReceiver::GetElement(isolate, obj, index)); details->set(0, *element_or_char); details->set(1, PropertyDetails::Empty().AsSmi()); return *isolate->factory()->NewJSArrayWithElements(details); @@ -418,8 +448,8 @@ RUNTIME_FUNCTION(Runtime_DebugIndexedInterceptorElementValue) { RUNTIME_ASSERT(obj->HasIndexedInterceptor()); CONVERT_NUMBER_CHECKED(uint32_t, index, Uint32, args[1]); Handle<Object> result; - ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, - Object::GetElement(isolate, obj, index)); + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( + isolate, result, JSReceiver::GetElement(isolate, obj, index)); return *result; } @@ -554,7 +584,11 @@ RUNTIME_FUNCTION(Runtime_GetFrameDetails) { // Use the value from the stack. if (scope_info->LocalIsSynthetic(i)) continue; locals->set(local * 2, scope_info->LocalName(i)); - locals->set(local * 2 + 1, *(frame_inspector.GetExpression(i))); + Handle<Object> value = frame_inspector.GetExpression(i); + // TODO(yangguo): We convert optimized out values to {undefined} when they + // are passed to the debugger. Eventually we should handle them somehow. + if (value->IsOptimizedOut()) value = isolate->factory()->undefined_value(); + locals->set(local * 2 + 1, *value); local++; } if (local < local_count) { @@ -587,31 +621,7 @@ RUNTIME_FUNCTION(Runtime_GetFrameDetails) { // to the frame information. Handle<Object> return_value = isolate->factory()->undefined_value(); if (at_return) { - StackFrameIterator it2(isolate); - Address internal_frame_sp = NULL; - while (!it2.done()) { - if (it2.frame()->is_internal()) { - internal_frame_sp = it2.frame()->sp(); - } else { - if (it2.frame()->is_java_script()) { - if (it2.frame()->id() == it.frame()->id()) { - // The internal frame just before the JavaScript frame contains the - // value to return on top. A debug break at return will create an - // internal frame to store the return value (eax/rax/r0) before - // entering the debug break exit frame. - if (internal_frame_sp != NULL) { - return_value = - Handle<Object>(Memory::Object_at(internal_frame_sp), isolate); - break; - } - } - } - - // Indicate that the previous frame was not an internal frame. - internal_frame_sp = NULL; - } - it2.Advance(); - } + return_value = isolate->debug()->return_value(); } // Now advance to the arguments adapter frame (if any). It contains all @@ -740,33 +750,6 @@ RUNTIME_FUNCTION(Runtime_GetScopeCount) { } -// Returns the list of step-in positions (text offset) in a function of the -// stack frame in a range from the current debug break position to the end -// of the corresponding statement. -RUNTIME_FUNCTION(Runtime_GetStepInPositions) { - HandleScope scope(isolate); - DCHECK(args.length() == 2); - CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); - RUNTIME_ASSERT(isolate->debug()->CheckExecutionState(break_id)); - - CONVERT_SMI_ARG_CHECKED(wrapped_id, 1); - - // Get the frame where the debugging is performed. - StackFrame::Id id = DebugFrameHelper::UnwrapFrameId(wrapped_id); - JavaScriptFrameIterator frame_it(isolate, id); - RUNTIME_ASSERT(!frame_it.done()); - - List<int> positions; - isolate->debug()->GetStepinPositions(frame_it.frame(), id, &positions); - Factory* factory = isolate->factory(); - Handle<FixedArray> array = factory->NewFixedArray(positions.length()); - for (int i = 0; i < positions.length(); ++i) { - array->set(i, Smi::FromInt(positions[i])); - } - return *factory->NewJSArrayWithElements(array, FAST_SMI_ELEMENTS); -} - - // Return an array with scope details // args[0]: number: break id // args[1]: number: frame index @@ -1652,15 +1635,6 @@ RUNTIME_FUNCTION(Runtime_DebugPopPromise) { } -RUNTIME_FUNCTION(Runtime_DebugPromiseEvent) { - DCHECK(args.length() == 1); - HandleScope scope(isolate); - CONVERT_ARG_HANDLE_CHECKED(JSObject, data, 0); - isolate->debug()->OnPromiseEvent(data); - return isolate->heap()->undefined_value(); -} - - RUNTIME_FUNCTION(Runtime_DebugAsyncTaskEvent) { DCHECK(args.length() == 1); HandleScope scope(isolate); |