path: replace duplicate conditions by functions

It will also remove useless "code" variables by inlining
path.charCodeAt.

PR-URL: https://github.com/nodejs/node/pull/18693
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Tobias Nießen <tniessen@tnie.de>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Jon Moss <me@jonathanmoss.me>
Reviewed-By: Anatoli Papirovski <apapirovski@mac.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
Sergey Golovin 2018-02-10 14:02:13 +03:00 committed by Ruben Bridgewater
parent 590eacecaa
commit b404aa56c0
No known key found for this signature in database
GPG Key ID: F07496B3EB3C1762

View File

@ -40,6 +40,15 @@ function assertPath(path) {
}
}
function isPathSeparator(code) {
return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;
}
function isWindowsDeviceRoot(code) {
return code >= CHAR_UPPERCASE_A && code <= CHAR_UPPERCASE_Z ||
code >= CHAR_LOWERCASE_A && code <= CHAR_LOWERCASE_Z;
}
// Resolves . and .. elements in a path with directory names
function normalizeStringWin32(path, allowAboveRoot) {
var res = '';
@ -50,11 +59,12 @@ function normalizeStringWin32(path, allowAboveRoot) {
for (var i = 0; i <= path.length; ++i) {
if (i < path.length)
code = path.charCodeAt(i);
else if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH)
else if (isPathSeparator(code))
break;
else
code = CHAR_FORWARD_SLASH;
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
if (isPathSeparator(code)) {
if (lastSlash === i - 1 || dots === 1) {
// NOOP
} else if (lastSlash !== i - 1 && dots === 2) {
@ -228,28 +238,26 @@ const win32 = {
var len = path.length;
var rootEnd = 0;
var code = path.charCodeAt(0);
var device = '';
var isAbsolute = false;
const code = path.charCodeAt(0);
// Try to match a root
if (len > 1) {
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
if (isPathSeparator(code)) {
// Possible UNC root
// If we started with a separator, we know we at least have an
// absolute path of some kind (UNC or otherwise)
isAbsolute = true;
code = path.charCodeAt(1);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
if (isPathSeparator(path.charCodeAt(1))) {
// Matched double path separator at beginning
var j = 2;
var last = j;
// Match 1 or more non-path separators
for (; j < len; ++j) {
code = path.charCodeAt(j);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH)
if (isPathSeparator(path.charCodeAt(j)))
break;
}
if (j < len && j !== last) {
@ -258,8 +266,7 @@ const win32 = {
last = j;
// Match 1 or more path separators
for (; j < len; ++j) {
code = path.charCodeAt(j);
if (code !== CHAR_FORWARD_SLASH && code !== CHAR_BACKWARD_SLASH)
if (!isPathSeparator(path.charCodeAt(j)))
break;
}
if (j < len && j !== last) {
@ -267,11 +274,7 @@ const win32 = {
last = j;
// Match 1 or more non-path separators
for (; j < len; ++j) {
code = path.charCodeAt(j);
const isPathSeparator =
code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;
if (isPathSeparator)
if (isPathSeparator(path.charCodeAt(j)))
break;
}
if (j === len) {
@ -290,16 +293,14 @@ const win32 = {
} else {
rootEnd = 1;
}
} else if ((code >= CHAR_UPPERCASE_A && code <= CHAR_UPPERCASE_Z) ||
(code >= CHAR_LOWERCASE_A && code <= CHAR_LOWERCASE_Z)) {
} else if (isWindowsDeviceRoot(code)) {
// Possible device root
if (path.charCodeAt(1) === CHAR_COLON) {
device = path.slice(0, 2);
rootEnd = 2;
if (len > 2) {
code = path.charCodeAt(2);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
if (isPathSeparator(path.charCodeAt(2))) {
// Treat separator following drive name as an absolute path
// indicator
isAbsolute = true;
@ -308,7 +309,7 @@ const win32 = {
}
}
}
} else if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
} else if (isPathSeparator(code)) {
// `path` contains just a path separator
rootEnd = 1;
isAbsolute = true;
@ -351,28 +352,26 @@ const win32 = {
if (len === 0)
return '.';
var rootEnd = 0;
var code = path.charCodeAt(0);
var device;
var isAbsolute = false;
const code = path.charCodeAt(0);
// Try to match a root
if (len > 1) {
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
if (isPathSeparator(code)) {
// Possible UNC root
// If we started with a separator, we know we at least have an absolute
// path of some kind (UNC or otherwise)
isAbsolute = true;
code = path.charCodeAt(1);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
if (isPathSeparator(path.charCodeAt(1))) {
// Matched double path separator at beginning
var j = 2;
var last = j;
// Match 1 or more non-path separators
for (; j < len; ++j) {
code = path.charCodeAt(j);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH)
if (isPathSeparator(path.charCodeAt(j)))
break;
}
if (j < len && j !== last) {
@ -381,8 +380,7 @@ const win32 = {
last = j;
// Match 1 or more path separators
for (; j < len; ++j) {
code = path.charCodeAt(j);
if (code !== CHAR_FORWARD_SLASH && code !== CHAR_BACKWARD_SLASH)
if (!isPathSeparator(path.charCodeAt(j)))
break;
}
if (j < len && j !== last) {
@ -390,8 +388,7 @@ const win32 = {
last = j;
// Match 1 or more non-path separators
for (; j < len; ++j) {
code = path.charCodeAt(j);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH)
if (isPathSeparator(path.charCodeAt(j)))
break;
}
if (j === len) {
@ -411,16 +408,14 @@ const win32 = {
} else {
rootEnd = 1;
}
} else if ((code >= CHAR_UPPERCASE_A && code <= CHAR_UPPERCASE_Z) ||
(code >= CHAR_LOWERCASE_A && code <= CHAR_LOWERCASE_Z)) {
} else if (isWindowsDeviceRoot(code)) {
// Possible device root
if (path.charCodeAt(1) === CHAR_COLON) {
device = path.slice(0, 2);
rootEnd = 2;
if (len > 2) {
code = path.charCodeAt(2);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
if (isPathSeparator(path.charCodeAt(2))) {
// Treat separator following drive name as an absolute path
// indicator
isAbsolute = true;
@ -429,15 +424,12 @@ const win32 = {
}
}
}
} else if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
} else if (isPathSeparator(code)) {
// `path` contains just a path separator, exit early to avoid unnecessary
// work
return '\\';
}
code = path.charCodeAt(len - 1);
var trailingSeparator =
(code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH);
var tail;
if (rootEnd < len)
tail = normalizeStringWin32(path.slice(rootEnd), !isAbsolute);
@ -445,7 +437,7 @@ const win32 = {
tail = '';
if (tail.length === 0 && !isAbsolute)
tail = '.';
if (tail.length > 0 && trailingSeparator)
if (tail.length > 0 && isPathSeparator(path.charCodeAt(len - 1)))
tail += '\\';
if (device === undefined) {
if (isAbsolute) {
@ -476,16 +468,15 @@ const win32 = {
const len = path.length;
if (len === 0)
return false;
var code = path.charCodeAt(0);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
const code = path.charCodeAt(0);
if (isPathSeparator(code)) {
return true;
} else if ((code >= CHAR_UPPERCASE_A && code <= CHAR_UPPERCASE_Z) ||
(code >= CHAR_LOWERCASE_A && code <= CHAR_LOWERCASE_Z)) {
} else if (isWindowsDeviceRoot(code)) {
// Possible device root
if (len > 2 && path.charCodeAt(1) === CHAR_COLON) {
code = path.charCodeAt(2);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH)
if (isPathSeparator(path.charCodeAt(2)))
return true;
}
}
@ -528,17 +519,14 @@ const win32 = {
// path.join('//server', 'share') -> '\\\\server\\share\\')
var needsReplace = true;
var slashCount = 0;
var code = firstPart.charCodeAt(0);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
if (isPathSeparator(firstPart.charCodeAt(0))) {
++slashCount;
const firstLen = firstPart.length;
if (firstLen > 1) {
code = firstPart.charCodeAt(1);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
if (isPathSeparator(firstPart.charCodeAt(1))) {
++slashCount;
if (firstLen > 2) {
code = firstPart.charCodeAt(2);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH)
if (isPathSeparator(firstPart.charCodeAt(2)))
++slashCount;
else {
// We matched a UNC path in the first part
@ -551,8 +539,7 @@ const win32 = {
if (needsReplace) {
// Find any more consecutive slashes we need to replace
for (; slashCount < joined.length; ++slashCount) {
code = joined.charCodeAt(slashCount);
if (code !== CHAR_FORWARD_SLASH && code !== CHAR_BACKWARD_SLASH)
if (!isPathSeparator(joined.charCodeAt(slashCount)))
break;
}
@ -699,19 +686,17 @@ const win32 = {
const resolvedPath = win32.resolve(path);
if (resolvedPath.length >= 3) {
var code = resolvedPath.charCodeAt(0);
if (code === CHAR_BACKWARD_SLASH) {
if (resolvedPath.charCodeAt(0) === CHAR_BACKWARD_SLASH) {
// Possible UNC root
if (resolvedPath.charCodeAt(1) === CHAR_BACKWARD_SLASH) {
code = resolvedPath.charCodeAt(2);
const code = resolvedPath.charCodeAt(2);
if (code !== CHAR_QUESTION_MARK && code !== CHAR_DOT) {
// Matched non-long UNC root, convert the path to a long UNC path
return '\\\\?\\UNC\\' + resolvedPath.slice(2);
}
}
} else if ((code >= CHAR_UPPERCASE_A && code <= CHAR_UPPERCASE_Z) ||
(code >= CHAR_LOWERCASE_A && code <= CHAR_LOWERCASE_Z)) {
} else if (isWindowsDeviceRoot(resolvedPath.charCodeAt(0))) {
// Possible device root
if (resolvedPath.charCodeAt(1) === CHAR_COLON &&
@ -734,24 +719,22 @@ const win32 = {
var end = -1;
var matchedSlash = true;
var offset = 0;
var code = path.charCodeAt(0);
const code = path.charCodeAt(0);
// Try to match a root
if (len > 1) {
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
if (isPathSeparator(code)) {
// Possible UNC root
rootEnd = offset = 1;
code = path.charCodeAt(1);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
if (isPathSeparator(path.charCodeAt(1))) {
// Matched double path separator at beginning
var j = 2;
var last = j;
// Match 1 or more non-path separators
for (; j < len; ++j) {
code = path.charCodeAt(j);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH)
if (isPathSeparator(path.charCodeAt(j)))
break;
}
if (j < len && j !== last) {
@ -759,8 +742,7 @@ const win32 = {
last = j;
// Match 1 or more path separators
for (; j < len; ++j) {
code = path.charCodeAt(j);
if (code !== CHAR_FORWARD_SLASH && code !== CHAR_BACKWARD_SLASH)
if (!isPathSeparator(path.charCodeAt(j)))
break;
}
if (j < len && j !== last) {
@ -768,8 +750,7 @@ const win32 = {
last = j;
// Match 1 or more non-path separators
for (; j < len; ++j) {
code = path.charCodeAt(j);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH)
if (isPathSeparator(path.charCodeAt(j)))
break;
}
if (j === len) {
@ -786,28 +767,25 @@ const win32 = {
}
}
}
} else if ((code >= CHAR_UPPERCASE_A && code <= CHAR_UPPERCASE_Z) ||
(code >= CHAR_LOWERCASE_A && code <= CHAR_LOWERCASE_Z)) {
} else if (isWindowsDeviceRoot(code)) {
// Possible device root
if (path.charCodeAt(1) === CHAR_COLON) {
rootEnd = offset = 2;
if (len > 2) {
code = path.charCodeAt(2);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH)
if (isPathSeparator(path.charCodeAt(2)))
rootEnd = offset = 3;
}
}
}
} else if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
} else if (isPathSeparator(code)) {
// `path` contains just a path separator, exit early to avoid
// unnecessary work
return path;
}
for (var i = len - 1; i >= offset; --i) {
code = path.charCodeAt(i);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
if (isPathSeparator(path.charCodeAt(i))) {
if (!matchedSlash) {
end = i;
break;
@ -842,8 +820,7 @@ const win32 = {
// disregarded
if (path.length >= 2) {
const drive = path.charCodeAt(0);
if ((drive >= CHAR_UPPERCASE_A && drive <= CHAR_UPPERCASE_Z) ||
(drive >= CHAR_LOWERCASE_A && drive <= CHAR_LOWERCASE_Z)) {
if (isWindowsDeviceRoot(drive)) {
if (path.charCodeAt(1) === CHAR_COLON)
start = 2;
}
@ -856,7 +833,7 @@ const win32 = {
var firstNonSlashEnd = -1;
for (i = path.length - 1; i >= start; --i) {
const code = path.charCodeAt(i);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
if (isPathSeparator(code)) {
// If we reached a path separator that was not part of a set of path
// separators at the end of the string, stop now
if (!matchedSlash) {
@ -895,8 +872,7 @@ const win32 = {
return path.slice(start, end);
} else {
for (i = path.length - 1; i >= start; --i) {
const code = path.charCodeAt(i);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
if (isPathSeparator(path.charCodeAt(i))) {
// If we reached a path separator that was not part of a set of path
// separators at the end of the string, stop now
if (!matchedSlash) {
@ -932,18 +908,16 @@ const win32 = {
// Check for a drive letter prefix so as not to mistake the following
// path separator as an extra separator at the end of the path that can be
// disregarded
if (path.length >= 2) {
const code = path.charCodeAt(0);
if (path.charCodeAt(1) === CHAR_COLON &&
((code >= CHAR_UPPERCASE_A && code <= CHAR_UPPERCASE_Z) ||
(code >= CHAR_LOWERCASE_A && code <= CHAR_LOWERCASE_Z))) {
if (path.length >= 2 &&
path.charCodeAt(1) === CHAR_COLON &&
isWindowsDeviceRoot(path.charCodeAt(0))) {
start = startPart = 2;
}
}
for (var i = path.length - 1; i >= start; --i) {
const code = path.charCodeAt(i);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
if (isPathSeparator(code)) {
// If we reached a path separator that was not part of a set of path
// separators at the end of the string, stop now
if (!matchedSlash) {
@ -1003,23 +977,21 @@ const win32 = {
var len = path.length;
var rootEnd = 0;
var code = path.charCodeAt(0);
let code = path.charCodeAt(0);
// Try to match a root
if (len > 1) {
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
if (isPathSeparator(code)) {
// Possible UNC root
code = path.charCodeAt(1);
rootEnd = 1;
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
if (isPathSeparator(path.charCodeAt(1))) {
// Matched double path separator at beginning
var j = 2;
var last = j;
// Match 1 or more non-path separators
for (; j < len; ++j) {
code = path.charCodeAt(j);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH)
if (isPathSeparator(path.charCodeAt(j)))
break;
}
if (j < len && j !== last) {
@ -1027,8 +999,7 @@ const win32 = {
last = j;
// Match 1 or more path separators
for (; j < len; ++j) {
code = path.charCodeAt(j);
if (code !== CHAR_FORWARD_SLASH && code !== CHAR_BACKWARD_SLASH)
if (!isPathSeparator(path.charCodeAt(j)))
break;
}
if (j < len && j !== last) {
@ -1036,8 +1007,7 @@ const win32 = {
last = j;
// Match 1 or more non-path separators
for (; j < len; ++j) {
code = path.charCodeAt(j);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH)
if (isPathSeparator(path.charCodeAt(j)))
break;
}
if (j === len) {
@ -1052,15 +1022,13 @@ const win32 = {
}
}
}
} else if ((code >= CHAR_UPPERCASE_A && code <= CHAR_UPPERCASE_Z) ||
(code >= CHAR_LOWERCASE_A && code <= CHAR_LOWERCASE_Z)) {
} else if (isWindowsDeviceRoot(code)) {
// Possible device root
if (path.charCodeAt(1) === CHAR_COLON) {
rootEnd = 2;
if (len > 2) {
code = path.charCodeAt(2);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
if (isPathSeparator(path.charCodeAt(2))) {
if (len === 3) {
// `path` contains just a drive root, exit early to avoid
// unnecessary work
@ -1077,7 +1045,7 @@ const win32 = {
}
}
}
} else if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
} else if (isPathSeparator(code)) {
// `path` contains just a path separator, exit early to avoid
// unnecessary work
ret.root = ret.dir = path;
@ -1100,7 +1068,7 @@ const win32 = {
// Get non-dir info
for (; i >= rootEnd; --i) {
code = path.charCodeAt(i);
if (code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH) {
if (isPathSeparator(code)) {
// If we reached a path separator that was not part of a set of path
// separators at the end of the string, stop now
if (!matchedSlash) {
@ -1363,13 +1331,11 @@ const posix = {
assertPath(path);
if (path.length === 0)
return '.';
var code = path.charCodeAt(0);
var hasRoot = (code === CHAR_FORWARD_SLASH);
const hasRoot = path.charCodeAt(0) === CHAR_FORWARD_SLASH;
var end = -1;
var matchedSlash = true;
for (var i = path.length - 1; i >= 1; --i) {
code = path.charCodeAt(i);
if (code === CHAR_FORWARD_SLASH) {
if (path.charCodeAt(i) === CHAR_FORWARD_SLASH) {
if (!matchedSlash) {
end = i;
break;
@ -1534,8 +1500,7 @@ const posix = {
var ret = { root: '', dir: '', base: '', ext: '', name: '' };
if (path.length === 0)
return ret;
var code = path.charCodeAt(0);
var isAbsolute = (code === CHAR_FORWARD_SLASH);
var isAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH;
var start;
if (isAbsolute) {
ret.root = '/';
@ -1555,7 +1520,7 @@ const posix = {
// Get non-dir info
for (; i >= start; --i) {
code = path.charCodeAt(i);
const code = path.charCodeAt(i);
if (code === CHAR_FORWARD_SLASH) {
// If we reached a path separator that was not part of a set of path
// separators at the end of the string, stop now