diff options
author | Sebastian Van Sande <sebastian@vansande.org> | 2017-04-04 11:58:15 +0200 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2017-04-19 19:56:18 +0200 |
commit | f97156623a140c3bbeee91a038bb727f39fc5948 (patch) | |
tree | 5a5649c0964a4e7b51ccf97668fa7e01ad639a0b | |
parent | a2843f2cf9556557da93dcc2c81b072dfe1c6759 (diff) | |
download | android-node-v8-f97156623a140c3bbeee91a038bb727f39fc5948.tar.gz android-node-v8-f97156623a140c3bbeee91a038bb727f39fc5948.tar.bz2 android-node-v8-f97156623a140c3bbeee91a038bb727f39fc5948.zip |
module: standardize strip shebang behaviour
When loading a module, Node needs to finds the end
of a shebang comment by searching for a \r or \n character.
This behaviour is now standardized into a dedicated
internal module function
Refs: https://github.com/nodejs/node/issues/12180
PR-URL: https://github.com/nodejs/node/pull/12202
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
-rw-r--r-- | lib/internal/bootstrap_node.js | 6 | ||||
-rw-r--r-- | lib/internal/module.js | 35 | ||||
-rw-r--r-- | lib/module.js | 29 |
3 files changed, 41 insertions, 29 deletions
diff --git a/lib/internal/bootstrap_node.js b/lib/internal/bootstrap_node.js index 6380506b72..744dfa93e5 100644 --- a/lib/internal/bootstrap_node.js +++ b/lib/internal/bootstrap_node.js @@ -449,8 +449,10 @@ const vm = NativeModule.require('vm'); const internalModule = NativeModule.require('internal/module'); - // remove shebang and BOM - source = internalModule.stripBOM(source.replace(/^#!.*/, '')); + // remove Shebang + source = internalModule.stripShebang(source); + // remove BOM + source = internalModule.stripBOM(source); // wrap it source = Module.wrap(source); // compile the script, this will throw if it fails diff --git a/lib/internal/module.js b/lib/internal/module.js index 8fc8dfbf32..a2f990ee64 100644 --- a/lib/internal/module.js +++ b/lib/internal/module.js @@ -3,6 +3,7 @@ exports = module.exports = { makeRequireFunction, stripBOM, + stripShebang, addBuiltinLibsToObject }; @@ -50,6 +51,40 @@ function stripBOM(content) { return content; } +/** + * Find end of shebang line and slice it off + */ +function stripShebang(content) { + // Remove shebang + var contLen = content.length; + if (contLen >= 2) { + if (content.charCodeAt(0) === 35/*#*/ && + content.charCodeAt(1) === 33/*!*/) { + if (contLen === 2) { + // Exact match + content = ''; + } else { + // Find end of shebang line and slice it off + var i = 2; + for (; i < contLen; ++i) { + var code = content.charCodeAt(i); + if (code === 10/*\n*/ || code === 13/*\r*/) + break; + } + if (i === contLen) + content = ''; + else { + // Note that this actually includes the newline character(s) in the + // new output. This duplicates the behavior of the regular expression + // that was previously used to replace the shebang line + content = content.slice(i); + } + } + } + } + return content; +} + exports.builtinLibs = [ 'assert', 'buffer', 'child_process', 'cluster', 'crypto', 'dgram', 'dns', 'domain', 'events', 'fs', 'http', 'https', 'net', 'os', 'path', 'punycode', diff --git a/lib/module.js b/lib/module.js index fe83cd0ecb..c4576a4bbd 100644 --- a/lib/module.js +++ b/lib/module.js @@ -537,33 +537,8 @@ var resolvedArgv; // the file. // Returns exception, if any. Module.prototype._compile = function(content, filename) { - // Remove shebang - var contLen = content.length; - if (contLen >= 2) { - if (content.charCodeAt(0) === 35/*#*/ && - content.charCodeAt(1) === 33/*!*/) { - if (contLen === 2) { - // Exact match - content = ''; - } else { - // Find end of shebang line and slice it off - var i = 2; - for (; i < contLen; ++i) { - var code = content.charCodeAt(i); - if (code === 10/*\n*/ || code === 13/*\r*/) - break; - } - if (i === contLen) - content = ''; - else { - // Note that this actually includes the newline character(s) in the - // new output. This duplicates the behavior of the regular expression - // that was previously used to replace the shebang line - content = content.slice(i); - } - } - } - } + + content = internalModule.stripShebang(content); // create wrapper function var wrapper = Module.wrap(content); |