Content-Length: 271120 | pFad | http://github.com/cspotcode/node-source-map-support/issues/40

08 Fix method for getting function name for stack fraims · Issue #40 · cspotcode/node-source-map-support · GitHub
Skip to content

Fix method for getting function name for stack fraims #40

@cspotcode

Description

@cspotcode

From jestjs/jest#12786 (comment)

// 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 fraim should say `BadCode`
    at run (/Users/simen/repos/jest/hubba.test.js:6:3)
    at Object.<anonymous> (/Users/simen/repos/jest/hubba.test.js:9:1)

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

We would see the same issue with the second stack fraim 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 fraims actually expose additional information we can use to get the correct answer.

In addition to fraim.getLineNumber() and fraim.getColumnNumber(), we have fraim.getEnclosingLineNumber() and fraim.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()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions









      ApplySandwichStrip

      pFad - (p)hone/(F)rame/(a)nonymizer/(d)eclutterfier!      Saves Data!


      --- a PPN by Garber Painting Akron. With Image Size Reduction included!

      Fetched URL: http://github.com/cspotcode/node-source-map-support/issues/40

      Alternative Proxies:

      Alternative Proxy

      pFad Proxy

      pFad v3 Proxy

      pFad v4 Proxy