From 355449d8b6499f19a4dd9542446b552471773e46 Mon Sep 17 00:00:00 2001 From: Sebastian Van Sande Date: Tue, 4 Apr 2017 11:58:15 +0200 Subject: [PATCH] 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 --- lib/internal/bootstrap_node.js | 6 ++++-- lib/internal/module.js | 35 ++++++++++++++++++++++++++++++++++ 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 b4ed16573e1e07..cd4e38b97707bc 100644 --- a/lib/internal/bootstrap_node.js +++ b/lib/internal/bootstrap_node.js @@ -447,8 +447,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 8fc8dfbf327e61..a2f990ee643073 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 fe83cd0ecb8a26..c4576a4bbdd654 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);