Skip to content

Commit

Permalink
path: fix POSIX path.resolve() perf regression
Browse files Browse the repository at this point in the history
  • Loading branch information
mscdex committed Apr 3, 2021
1 parent a44392d commit ed62b39
Showing 1 changed file with 20 additions and 12 deletions.
32 changes: 20 additions & 12 deletions lib/path.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ const {
validateString,
} = require('internal/validators');

const platformIsWin32 = (process.platform === 'win32');

function isPathSeparator(code) {
return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;
}
Expand Down Expand Up @@ -1011,24 +1013,30 @@ const win32 = {
posix: null
};

const posixCwd = (() => {
if (platformIsWin32) {
// Converts Windows' backslash path separators to POSIX forward slashes
// and truncates any drive indicator
const regexp = /\\\\/g;
return () => {
const cwd = StringPrototypeReplace(process.cwd(), regexp, '/');
return StringPrototypeSlice(cwd, StringPrototypeIndexOf(cwd, '/'));
};
}

// We're already on POSIX, no need for any transformations
return () => process.cwd();
})();

const regexp = /\\\\/g;
const posix = {
// path.resolve([from ...], to)
resolve(...args) {
let resolvedPath = '';
let resolvedAbsolute = false;

for (let i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) {
let path;
if (i >= 0) {
path = args[i];
} else {
const _ = StringPrototypeReplace(
process.cwd(),
new RegExp(`\\${module.exports.sep}`, 'g'),
posix.sep
);
path = StringPrototypeSlice(_, StringPrototypeIndexOf(_, posix.sep));
}
const path = i >= 0 ? args[i] : posixCwd();

validateString(path, 'path');

Expand Down Expand Up @@ -1431,4 +1439,4 @@ posix.posix = win32.posix = posix;
win32._makeLong = win32.toNamespacedPath;
posix._makeLong = posix.toNamespacedPath;

module.exports = process.platform === 'win32' ? win32 : posix;
module.exports = platformIsWin32 ? win32 : posix;

0 comments on commit ed62b39

Please sign in to comment.