mirror of
https://github.com/zebrajr/node.git
synced 2026-01-15 12:15:26 +00:00
path: fix POSIX path.resolve() perf regression
PR-URL: https://github.com/nodejs/node/pull/38064 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: Evan Lucas <evanlucas@me.com> Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
This commit is contained in:
32
lib/path.js
32
lib/path.js
@@ -23,7 +23,6 @@
|
||||
|
||||
const {
|
||||
FunctionPrototypeBind,
|
||||
RegExp,
|
||||
StringPrototypeCharCodeAt,
|
||||
StringPrototypeIndexOf,
|
||||
StringPrototypeLastIndexOf,
|
||||
@@ -48,6 +47,8 @@ const {
|
||||
validateString,
|
||||
} = require('internal/validators');
|
||||
|
||||
const platformIsWin32 = (process.platform === 'win32');
|
||||
|
||||
function isPathSeparator(code) {
|
||||
return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;
|
||||
}
|
||||
@@ -1011,6 +1012,21 @@ 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 posix = {
|
||||
// path.resolve([from ...], to)
|
||||
resolve(...args) {
|
||||
@@ -1018,17 +1034,7 @@ const posix = {
|
||||
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');
|
||||
|
||||
@@ -1431,4 +1437,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;
|
||||
|
||||
Reference in New Issue
Block a user