From 0b1076a68e1eadba260cec8afc5acec618561c28 Mon Sep 17 00:00:00 2001 From: yangguo Date: Mon, 14 Dec 2015 01:35:18 -0800 Subject: [PATCH] [debugger] correctly find source position of implicit return statement. The parser reads one character beyond EOF to have an additional source position that the rewriter can use to insert the implicit return statement at the end of a script. If we break at that return statement, we need to be able to translate the source position to line and column number. R=jkummerow@chromium.org Review URL: https://codereview.chromium.org/1521953003 Cr-Commit-Position: refs/heads/master@{#32825} --- src/objects.cc | 10 ++++++---- test/mjsunit/debug-sourceinfo.js | 12 ++++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/objects.cc b/src/objects.cc index 67ccd31014..3dedb122c7 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -11352,11 +11352,13 @@ static void CalculateLineEndsImpl(Isolate* isolate, if (cache->IsLineTerminatorSequence(current, next)) line_ends->Add(i); } - if (src_len > 0 && cache->IsLineTerminatorSequence(src[src_len - 1], 0)) { - line_ends->Add(src_len - 1); - } else if (include_ending_line) { - // Even if the last line misses a line end, it is counted. + if (include_ending_line) { + // Include one character beyond the end of script. The rewriter uses that + // position for the implicit return statement. line_ends->Add(src_len); + } else if (src_len > 0 && + cache->IsLineTerminatorSequence(src[src_len - 1], 0)) { + line_ends->Add(src_len - 1); } } diff --git a/test/mjsunit/debug-sourceinfo.js b/test/mjsunit/debug-sourceinfo.js index 1dbe1b7a0a..e70dd20187 100644 --- a/test/mjsunit/debug-sourceinfo.js +++ b/test/mjsunit/debug-sourceinfo.js @@ -63,9 +63,9 @@ var comment_lines = 28; // This is the last position in the entire file (note: this equals // file size of - 1, since starting at 0). -var last_position = 11337; +var last_position = 11529; // This is the last line of entire file (note: starting at 0). -var last_line = 265; +var last_line = 269; // This is the last column of last line (note: starting at 0 and +1, due // to trailing ). var last_column = 1; @@ -244,18 +244,22 @@ assertEquals(70 + start_c, Debug.findFunctionSourceLocation(c, 6, 0).position); assertEquals(0 + start_d, Debug.findFunctionSourceLocation(d, 0, 0).position); assertEquals(6 + start_d, Debug.findFunctionSourceLocation(d, 1, 0).position); for (i = 1; i <= num_lines_d; i++) { - assertEquals(6 + (i * line_length_d) + start_d, Debug.findFunctionSourceLocation(d, (i + 1), 0).position); + assertEquals(6 + (i * line_length_d) + start_d, + Debug.findFunctionSourceLocation(d, (i + 1), 0).position); } assertEquals(158 + start_d, Debug.findFunctionSourceLocation(d, 17, 0).position); // Make sure invalid inputs work properly. assertEquals(0, script.locationFromPosition(-1).line); -assertEquals(null, script.locationFromPosition(last_position + 1)); +assertEquals(null, script.locationFromPosition(last_position + 2)); // Test last position. assertEquals(last_position, script.locationFromPosition(last_position).position); assertEquals(last_line, script.locationFromPosition(last_position).line); assertEquals(last_column, script.locationFromPosition(last_position).column); +assertEquals(last_line, script.locationFromPosition(last_position + 1).line); +assertEquals(last_column + 1, + script.locationFromPosition(last_position + 1).column); // Test that script.sourceLine(line) works. var location;