diff --git a/src/node.cc b/src/node.cc index 6c1b11d4caa..9883a5c5248 100644 --- a/src/node.cc +++ b/src/node.cc @@ -1731,6 +1731,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(); @@ -1759,8 +1760,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 7e5404796e7..29e3a86fab5 100644 --- a/test/parallel/test-vm-context.js +++ b/test/parallel/test-vm-context.js @@ -93,13 +93,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