diff --git a/src/node.cc b/src/node.cc index 882c72a67eb330..f4218ca6795933 100644 --- a/src/node.cc +++ b/src/node.cc @@ -1585,6 +1585,7 @@ void AppendExceptionLine(Environment* env, } // Print (filename):(line number): (message). + ScriptOrigin origin = message->GetScriptOrigin(); node::Utf8Value filename(env->isolate(), message->GetScriptResourceName()); const char* filename_string = *filename; int linenum = message->GetLineNumber(); @@ -1613,8 +1614,16 @@ void AppendExceptionLine(Environment* env, // sourceline to 78 characters, and we end up not providing very much // useful debugging info to the user if we remove 62 characters. + int script_start = + (linenum - origin.ResourceLineOffset()->Value()) == 1 ? + origin.ResourceColumnOffset()->Value() : 0; int start = message->GetStartColumn(env->context()).FromMaybe(0); int end = message->GetEndColumn(env->context()).FromMaybe(0); + if (start >= script_start) { + CHECK_GE(end, start); + start -= script_start; + end -= script_start; + } char arrow[1024]; int max_off = sizeof(arrow) - 2; diff --git a/test/parallel/test-vm-context.js b/test/parallel/test-vm-context.js index 33116f52bb08e7..a9cf7a1c8adab5 100644 --- a/test/parallel/test-vm-context.js +++ b/test/parallel/test-vm-context.js @@ -72,13 +72,14 @@ assert.strictEqual(script.runInContext(ctx), false); // Error on the first line of a module should // have the correct line and column number assert.throws(() => { - vm.runInContext('throw new Error()', context, { + vm.runInContext(' throw new Error()', context, { filename: 'expected-filename.js', lineOffset: 32, columnOffset: 123 }); }, (err) => { - return /expected-filename\.js:33:130/.test(err.stack); + return /^ \^/m.test(err.stack) && + /expected-filename\.js:33:131/.test(err.stack); }, 'Expected appearance of proper offset in Error stack'); // https://github.com/nodejs/node/issues/6158