How to set correct fileName for exceptions thrown from a function in a Function object

Tim Fox timvolpe at gmail.com
Wed Feb 18 10:00:39 UTC 2015


I've added a simple reproducer that you can run in the repl:

https://gist.github.com/purplefox/b03a2a6263c26e3206da

Another observation is that line number is reported as 6, when it should 
be 5 (assuming the first line is line 1 which is normal convention afaik)

On 18/02/15 09:40, Tim Fox wrote:
> Hi all,
>
> I'm currently using a CommonJS/npm modules require implementation 
> (npm-jvm) with Nashorn.
>
> Roughly, the way it works (and I'm sure you're already familiar with 
> this technique) is it takes the JavaScript module and wraps it in a 
> Function object:
>
> var body = readScriptAsText();
> var args   = ['exports', 'module', 'require', '__filename', '__dirname'];
> var func = new Function(args, body);
> func.apply(module, [module.exports, module, module.require, 
> module.filename, dir]); // Execute it - this works fine
>
> Now let's say the actual module (foomodule.js) we are loading contains 
> this:
>
> module.exports = function() {
>     var num = 234;
>     num.substr(1, 1); // Will throw TypeError here
> }
>
> I.e. it simply exports a function, which will throw a TypeError when 
> it's executed.
>
> When the exported function is executed it does indeed throw a TypeError:
>
> var f = require("foomodule");
>
> f(); // Throws TypeError
>
> Unfortunately the fileName field of the TypeError is set to 
> "<function>" not to "foomodule.js", which is unfriendly for the user.
>
> This is understandable as the Function object which wraps the module 
> doesn't know about "foomodule.js".
>
> So.. my question is.. how do I tell the Function object that the 
> "filename" it should use when exceptions are thrown from it is 
> "foomodule.js"?
>
> I have tried the following and none work:
>
> var func = new Function(args, body);
> func.name = "foomodule.js";
> func.fileName = "foomodule.js";
> func.displayName = "foomodule.js";
>
> Any insights would be greatly appreciated.
>
>
>
>



More information about the nashorn-dev mailing list