cspotcode / cspotcode/node-source-map-support

Fix method for getting function name for stack frames

Offen
#40 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
JavaScript
Sterne
16
Forks
4
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

From https://github.com/facebook/jest/pull/12786#issuecomment-1114869813

```
// hubba.test.js
function BadCode() {
throw new Error('noo');
}

function run(fn) {
fn();
}

run(BadCode);
```
compiled to:
```
"use strict";

function BadCode() {
throw new Error('noo');
}

function run(fn) {
fn();
}

run(BadCode);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCYWRDb2RlIiwiRXJyb3IiLCJydW4iLCJmbiJdLCJzb3VyY2VzIjpbImh1YmJhLnRlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gQmFkQ29kZSgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdub28nKTtcbn1cblxuZnVuY3Rpb24gcnVuKGZuKSB7XG4gIGZuKCk7XG59XG5cbnJ1bihCYWRDb2RlKTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxTQUFTQSxPQUFULEdBQW1CO0VBQ2pCLE1BQU0sSUFBSUMsS0FBSixDQUFVLEtBQVYsQ0FBTjtBQUNEOztBQUVELFNBQVNDLEdBQVQsQ0FBYUMsRUFBYixFQUFpQjtFQUNmQSxFQUFFO0FBQ0g7O0FBRURELEdBQUcsQ0FBQ0YsT0FBRCxDQUFIIn0=
```

Stack trace with source-mapping is wrong:
```
Error: noo
at fn (/Users/simen/repos/jest/hubba.test.js:2:9) <----- this stack frame should say `BadCode`
at run (/Users/simen/repos/jest/hubba.test.js:6:3)
at Object. (/Users/simen/repos/jest/hubba.test.js:9:1)
```

source-map-support's algorithm for getting the name of a stack frame: it checks the location of the *next* stack frame. That is why the bug is showing us `at fn` when it should be showing us `at BadCode`. The stack frame happens within `BadCode`, but the location of the *next* stack frame is the invocation site: `fn()`

We would see the same issue with the second stack frame if we did `const runIt = run; runIt(BadCode)` Because it's checking the name at the callsite, it's not checking the invokee's name.

Pretty sure this is not correct and stack frames actually expose additional information we can use to get the correct answer.

In addition to `frame.getLineNumber()` and `frame.getColumnNumber()`, we have `frame.getEnclosingLineNumber()` and `frame.getEnclosingColumnNumber()` which are the location of the invoked function. For example:

```
// getEnclosing*Number() gives us location A
// get*Number() gives us location B
/*A*/function run() {}
/*B*/run()
```

Beitragsleitfaden

Beitragsleitfaden öffnen

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.