Revision: 15322
Author: [email protected]
Date: Tue Jun 25 06:42:44 2013
Log: Provide list of step-in source positions in JS Debug API
[email protected]
Review URL: https://codereview.chromium.org/15960016
http://code.google.com/p/v8/source/detail?r=15322
Modified:
/branches/bleeding_edge/src/debug.cc
/branches/bleeding_edge/src/debug.h
/branches/bleeding_edge/src/mirror-debugger.js
/branches/bleeding_edge/src/runtime.cc
/branches/bleeding_edge/src/runtime.h
=======================================
--- /branches/bleeding_edge/src/debug.cc Thu Jun 13 02:27:09 2013
+++ /branches/bleeding_edge/src/debug.cc Tue Jun 25 06:42:44 2013
@@ -388,6 +388,20 @@
}
ASSERT(!IsDebugBreak());
}
+
+
+bool BreakLocationIterator::IsStepInLocation(Isolate* isolate) {
+ if (RelocInfo::IsConstructCall(rmode())) {
+ return true;
+ } else if (RelocInfo::IsCodeTarget(rmode())) {
+ HandleScope scope(debug_info_->GetIsolate());
+ Address target = rinfo()->target_address();
+ Handle<Code> target_code(Code::GetCodeFromTargetAddress(target));
+ return target_code->is_call_stub() ||
target_code->is_keyed_call_stub();
+ } else {
+ return false;
+ }
+}
void BreakLocationIterator::PrepareStepIn(Isolate* isolate) {
=======================================
--- /branches/bleeding_edge/src/debug.h Mon Jun 3 01:17:04 2013
+++ /branches/bleeding_edge/src/debug.h Tue Jun 25 06:42:44 2013
@@ -97,6 +97,7 @@
void ClearBreakPoint(Handle<Object> break_point_object);
void SetOneShot();
void ClearOneShot();
+ bool IsStepInLocation(Isolate* isolate);
void PrepareStepIn(Isolate* isolate);
bool IsExit() const;
bool HasBreakPoint();
=======================================
--- /branches/bleeding_edge/src/mirror-debugger.js Fri Mar 22 10:27:44 2013
+++ /branches/bleeding_edge/src/mirror-debugger.js Tue Jun 25 06:42:44 2013
@@ -1509,6 +1509,11 @@
};
+FrameDetails.prototype.stepInPositionsImpl = function() {
+ return %GetStepInPositions(this.break_id_, this.frameId());
+};
+
+
/**
* Mirror object for stack frames.
* @param {number} break_id The break id in the VM for which this frame is
@@ -1669,6 +1674,29 @@
};
+FrameMirror.prototype.stepInPositions = function() {
+ var script = this.func().script();
+ var funcOffset = this.func().sourcePosition_();
+
+ var stepInRaw = this.details_.stepInPositionsImpl();
+ var result = [];
+ if (stepInRaw) {
+ for (var i = 0; i < stepInRaw.length; i++) {
+ var posStruct = {};
+ var offset = script.locationFromPosition(funcOffset + stepInRaw[i],
+ true);
+ serializeLocationFields(offset, posStruct);
+ var item = {
+ position: posStruct
+ };
+ result.push(item);
+ }
+ }
+
+ return result;
+};
+
+
FrameMirror.prototype.evaluate = function(source, disable_break,
opt_context_object) {
var result = %DebugEvaluate(this.break_id_,
=======================================
--- /branches/bleeding_edge/src/runtime.cc Fri Jun 21 06:02:38 2013
+++ /branches/bleeding_edge/src/runtime.cc Tue Jun 25 06:42:44 2013
@@ -11776,6 +11776,58 @@
return Smi::FromInt(n);
}
+
+
+// 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(MaybeObject*, Runtime_GetStepInPositions) {
+ HandleScope scope(isolate);
+ ASSERT(args.length() == 2);
+
+ // Check arguments.
+ Object* check;
+ { MaybeObject* maybe_check = Runtime_CheckExecutionState(
+ RUNTIME_ARGUMENTS(isolate, args));
+ if (!maybe_check->ToObject(&check)) return maybe_check;
+ }
+ CONVERT_SMI_ARG_CHECKED(wrapped_id, 1);
+
+ // Get the frame where the debugging is performed.
+ StackFrame::Id id = UnwrapFrameId(wrapped_id);
+ JavaScriptFrameIterator frame_it(isolate, id);
+ JavaScriptFrame* frame = frame_it.frame();
+
+ Handle<SharedFunctionInfo> shared =
+
Handle<SharedFunctionInfo>(JSFunction::cast(frame->function())->shared());
+ Handle<DebugInfo> debug_info = Debug::GetDebugInfo(shared);
+
+ int len = 0;
+ Handle<JSArray> array(isolate->factory()->NewJSArray(10));
+ // Find the break point where execution has stopped.
+ BreakLocationIterator break_location_iterator(debug_info,
+ ALL_BREAK_LOCATIONS);
+
+ break_location_iterator.FindBreakLocationFromAddress(frame->pc());
+ int current_statement_pos = break_location_iterator.statement_position();
+
+ while (!break_location_iterator.Done()) {
+ if (break_location_iterator.IsStepInLocation(isolate)) {
+ Smi* position_value =
Smi::FromInt(break_location_iterator.position());
+ JSObject::SetElement(array, len,
+ Handle<Object>(position_value, isolate),
+ NONE, kNonStrictMode);
+ len++;
+ }
+ // Advance iterator.
+ break_location_iterator.Next();
+ if (current_statement_pos !=
+ break_location_iterator.statement_position()) {
+ break;
+ }
+ }
+ return *array;
+}
static const int kScopeDetailsTypeIndex = 0;
=======================================
--- /branches/bleeding_edge/src/runtime.h Fri Jun 21 06:02:38 2013
+++ /branches/bleeding_edge/src/runtime.h Tue Jun 25 06:42:44 2013
@@ -490,6 +490,7 @@
F(GetFrameCount, 1, 1) \
F(GetFrameDetails, 2, 1) \
F(GetScopeCount, 2, 1) \
+ F(GetStepInPositions, 2, 1) \
F(GetScopeDetails, 4, 1) \
F(GetFunctionScopeCount, 1, 1) \
F(GetFunctionScopeDetails, 2, 1) \
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.