New Proposal: ES Call Stack

Ranando King kingmph at gmail.com
Mon Jan 14 03:02:29 UTC 2019


ES used to have Function.caller for traversing the call stack, but
apparently this was very problematic for engine development and prevented
various optimizations. So now it doesn't work in strict mode which makes it
useless for code involving `"use strict"` or `class`. One of the main use
cases for such functionality was being able to determine where a given
function was called from.

I was thinking of a global static class that is able to uniquely identify
each execution context on the call stack without giving any access to the
context objects themselves. I was thinking of maybe something like this:

```js
class CallStackEntry {
  #className;    //Name of the class or null
  #functionName; //Name of the function or null
  #fileName;     //Name of the source file or null
  #line;         //Source line number
  #offset;       //Source character offset on the line
  #id;           //Symbol
  get fileName() { return this.#filename; }
  get line() { return this.#line; }
  get offset() { return this.#offset; }
  get id() { return this.#id; }
  constructor(_fileName, _line_, _offset, _id) {
    this.#fileName = _fileName;
    this.#line = _line;
    this.#offset = _offset;
    this.#id = _id;
  }
}

class CallStack {
  static #callStack = []; //Internally managed
  static get stackLimit() {...}
  static set stackLimit(v) {...}
  static get stack() {
    //return the call stack as an array of CallStackEntry objects
  }
}
```

With something like this, security-type software would be able to clearly
identify functions without granting any access rights to the corresponding
function.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20190113/212e4218/attachment.html>


More information about the es-discuss mailing list