Author: [email protected]
Date: Mon Mar 9 10:59:25 2009
New Revision: 1461
Modified:
branches/bleeding_edge/src/debug-delay.js
branches/bleeding_edge/src/messages.js
branches/bleeding_edge/test/cctest/test-api.cc
branches/bleeding_edge/test/mjsunit/debug-sourceinfo.js
Log:
Changed a function in the internal debugger JavaScript to return the full
source location instead of only the position.
Added an optional parameter to exclude/include the source line offset in
source location.
Extended a message test to include a test with source offset.
Review URL: http://codereview.chromium.org/39342
Modified: branches/bleeding_edge/src/debug-delay.js
==============================================================================
--- branches/bleeding_edge/src/debug-delay.js (original)
+++ branches/bleeding_edge/src/debug-delay.js Mon Mar 9 10:59:25 2009
@@ -437,10 +437,11 @@
return %FunctionGetScriptSourcePosition(f);
};
-Debug.findFunctionSourcePosition = function(func, opt_line, opt_column) {
+
+Debug.findFunctionSourceLocation = function(func, opt_line, opt_column) {
var script = %FunctionGetScript(func);
var script_offset = %FunctionGetScriptSourcePosition(func);
- return script.locationFromLine(opt_line, opt_column,
script_offset).position;
+ return script.locationFromLine(opt_line, opt_column, script_offset);
}
@@ -478,8 +479,10 @@
if (%FunctionIsAPIFunction(func)) {
throw new Error('Cannot set break point in native code.');
}
- var source_position = this.findFunctionSourcePosition(func, opt_line,
opt_column) -
- this.sourcePosition(func);
+ // Find source position relative to start of the function
+ var break_position =
+ this.findFunctionSourceLocation(func, opt_line, opt_column).position;
+ var source_position = break_position - this.sourcePosition(func);
// Find the script for the function.
var script = %FunctionGetScript(func);
// Break in builtin JavaScript code is not supported.
Modified: branches/bleeding_edge/src/messages.js
==============================================================================
--- branches/bleeding_edge/src/messages.js (original)
+++ branches/bleeding_edge/src/messages.js Mon Mar 9 10:59:25 2009
@@ -181,7 +181,7 @@
function GetLineNumber(message) {
if (message.startPos == -1) return -1;
- var location = message.script.locationFromPosition(message.startPos);
+ var location = message.script.locationFromPosition(message.startPos,
true);
if (location == null) return -1;
return location.line + 1;
}
@@ -190,7 +190,7 @@
// Returns the source code line containing the given source
// position, or the empty string if the position is invalid.
function GetSourceLine(message) {
- var location = message.script.locationFromPosition(message.startPos);
+ var location = message.script.locationFromPosition(message.startPos,
true);
if (location == null) return "";
location.restrict();
return location.sourceText();
@@ -230,10 +230,13 @@
/**
* Get information on a specific source position.
* @param {number} position The source position
+ * @param {boolean} include_resource_offset Set to true to have the
resource
+ * offset added to the location
* @return {SourceLocation}
* If line is negative or not in the source null is returned.
*/
-Script.prototype.locationFromPosition = function (position) {
+Script.prototype.locationFromPosition = function (position,
+ include_resource_offset)
{
var lineCount = this.lineCount();
var line = -1;
if (position <= this.line_ends[0]) {
@@ -256,9 +259,11 @@
var column = position - start;
// Adjust according to the offset within the resource.
- line += this.line_offset;
- if (line == this.line_offset) {
- column += this.column_offset;
+ if (include_resource_offset) {
+ line += this.line_offset;
+ if (line == this.line_offset) {
+ column += this.column_offset;
+ }
}
return new SourceLocation(this, position, line, column, start, end);
@@ -573,7 +578,7 @@
file = %FunctionGetScript(fun).data;
}
if (file) {
- var location = %FunctionGetScript(fun).locationFromPosition(pos);
+ var location = %FunctionGetScript(fun).locationFromPosition(pos,
true);
if (!isTopLevel) result += "(";
result += file;
if (location != null) {
Modified: branches/bleeding_edge/test/cctest/test-api.cc
==============================================================================
--- branches/bleeding_edge/test/cctest/test-api.cc (original)
+++ branches/bleeding_edge/test/cctest/test-api.cc Mon Mar 9 10:59:25 2009
@@ -5320,6 +5320,28 @@
}
+static void CheckTryCatchSourceInfo(v8::Handle<v8::Script> script,
+ char* resource_name,
+ int line_offset) {
+ v8::HandleScope scope;
+ v8::TryCatch try_catch;
+ v8::Handle<v8::Value> result = script->Run();
+ CHECK(result.IsEmpty());
+ CHECK(try_catch.HasCaught());
+ v8::Handle<v8::Message> message = try_catch.Message();
+ CHECK(!message.IsEmpty());
+ CHECK_EQ(10 + line_offset, message->GetLineNumber());
+ CHECK_EQ(91, message->GetStartPosition());
+ CHECK_EQ(92, message->GetEndPosition());
+ CHECK_EQ(2, message->GetStartColumn());
+ CHECK_EQ(3, message->GetEndColumn());
+ v8::String::AsciiValue line(message->GetSourceLine());
+ CHECK_EQ(" throw 'nirk';", *line);
+ v8::String::AsciiValue name(message->GetScriptResourceName());
+ CHECK_EQ(resource_name, *name);
+}
+
+
THREADED_TEST(TryCatchSourceInfo) {
v8::HandleScope scope;
LocalContext context;
@@ -5337,23 +5359,22 @@
"}\n"
"\n"
"Foo();\n");
- v8::Handle<v8::Script> script =
- v8::Script::Compile(source, v8::String::New("test.js"));
- v8::TryCatch try_catch;
- v8::Handle<v8::Value> result = script->Run();
- CHECK(result.IsEmpty());
- CHECK(try_catch.HasCaught());
- v8::Handle<v8::Message> message = try_catch.Message();
- CHECK(!message.IsEmpty());
- CHECK_EQ(10, message->GetLineNumber());
- CHECK_EQ(91, message->GetStartPosition());
- CHECK_EQ(92, message->GetEndPosition());
- CHECK_EQ(2, message->GetStartColumn());
- CHECK_EQ(3, message->GetEndColumn());
- v8::String::AsciiValue line(message->GetSourceLine());
- CHECK_EQ(" throw 'nirk';", *line);
- v8::String::AsciiValue name(message->GetScriptResourceName());
- CHECK_EQ("test.js", *name);
+
+ char* resource_name;
+ v8::Handle<v8::Script> script;
+ resource_name = "test.js";
+ script = v8::Script::Compile(source, v8::String::New(resource_name));
+ CheckTryCatchSourceInfo(script, resource_name, 0);
+
+ resource_name = "test1.js";
+ v8::ScriptOrigin origin1(v8::String::New(resource_name));
+ script = v8::Script::Compile(source, &origin1);
+ CheckTryCatchSourceInfo(script, resource_name, 0);
+
+ resource_name = "test2.js";
+ v8::ScriptOrigin origin2(v8::String::New(resource_name),
v8::Integer::New(7));
+ script = v8::Script::Compile(source, &origin2);
+ CheckTryCatchSourceInfo(script, resource_name, 7);
}
Modified: branches/bleeding_edge/test/mjsunit/debug-sourceinfo.js
==============================================================================
--- branches/bleeding_edge/test/mjsunit/debug-sourceinfo.js (original)
+++ branches/bleeding_edge/test/mjsunit/debug-sourceinfo.js Mon Mar 9
10:59:25 2009
@@ -175,18 +175,18 @@
assertEquals(0, script.locationFromLine(1, 12, start_b).column);
// Test the Debug.findSourcePosition which wraps SourceManager.
-assertEquals(0 + start_a, Debug.findFunctionSourcePosition(a, 0, 0));
-assertEquals(0 + start_b, Debug.findFunctionSourcePosition(b, 0, 0));
-assertEquals(6 + start_b, Debug.findFunctionSourcePosition(b, 1, 0));
-assertEquals(8 + start_b, Debug.findFunctionSourcePosition(b, 1, 2));
-assertEquals(18 + start_b, Debug.findFunctionSourcePosition(b, 2, 0));
-assertEquals(0 + start_c, Debug.findFunctionSourcePosition(c, 0, 0));
-assertEquals(7 + start_c, Debug.findFunctionSourcePosition(c, 1, 0));
-assertEquals(21 + start_c, Debug.findFunctionSourcePosition(c, 2, 0));
-assertEquals(38 + start_c, Debug.findFunctionSourcePosition(c, 3, 0));
-assertEquals(52 + start_c, Debug.findFunctionSourcePosition(c, 4, 0));
-assertEquals(69 + start_c, Debug.findFunctionSourcePosition(c, 5, 0));
-assertEquals(76 + start_c, Debug.findFunctionSourcePosition(c, 6, 0));
+assertEquals(0 + start_a, Debug.findFunctionSourceLocation(a, 0,
0).position);
+assertEquals(0 + start_b, Debug.findFunctionSourceLocation(b, 0,
0).position);
+assertEquals(6 + start_b, Debug.findFunctionSourceLocation(b, 1,
0).position);
+assertEquals(8 + start_b, Debug.findFunctionSourceLocation(b, 1,
2).position);
+assertEquals(18 + start_b, Debug.findFunctionSourceLocation(b, 2,
0).position);
+assertEquals(0 + start_c, Debug.findFunctionSourceLocation(c, 0,
0).position);
+assertEquals(7 + start_c, Debug.findFunctionSourceLocation(c, 1,
0).position);
+assertEquals(21 + start_c, Debug.findFunctionSourceLocation(c, 2,
0).position);
+assertEquals(38 + start_c, Debug.findFunctionSourceLocation(c, 3,
0).position);
+assertEquals(52 + start_c, Debug.findFunctionSourceLocation(c, 4,
0).position);
+assertEquals(69 + start_c, Debug.findFunctionSourceLocation(c, 5,
0).position);
+assertEquals(76 + start_c, Debug.findFunctionSourceLocation(c, 6,
0).position);
// Test source line and restriction. All the following tests start from
line 1
// column 2 in function b, which is the call to c.
--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---