summaryrefslogtreecommitdiff
path: root/lib/fs.js
diff options
context:
space:
mode:
authorLivia Medeiros <74449973+LiviaMedeiros@users.noreply.github.com>2022-06-30 16:30:53 +0800
committerGitHub <noreply@github.com>2022-06-30 09:30:53 +0100
commite0705be41c3ebe80229693ecaf7cd71850137ae7 (patch)
tree41f9fc998afe78df1d3ad3c39e98387adc4e4b9c /lib/fs.js
parent3b0995e6ecf580d9cecd25817f4fee4f56e423b9 (diff)
downloadnode-new-e0705be41c3ebe80229693ecaf7cd71850137ae7.tar.gz
fs: refactor realpath with Map and Set
PR-URL: https://github.com/nodejs/node/pull/43569 Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: Darshan Sen <raisinten@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'lib/fs.js')
-rw-r--r--lib/fs.js44
1 files changed, 22 insertions, 22 deletions
diff --git a/lib/fs.js b/lib/fs.js
index ba1b3597bd..874b625943 100644
--- a/lib/fs.js
+++ b/lib/fs.js
@@ -33,13 +33,13 @@ const {
BigIntPrototypeToString,
MathMax,
Number,
- ObjectCreate,
ObjectDefineProperties,
ObjectDefineProperty,
Promise,
ReflectApply,
RegExpPrototypeExec,
SafeMap,
+ SafeSet,
String,
StringPrototypeCharCodeAt,
StringPrototypeIndexOf,
@@ -2486,8 +2486,8 @@ function realpathSync(p, options) {
return maybeCachedResult;
}
- const seenLinks = ObjectCreate(null);
- const knownHard = ObjectCreate(null);
+ const seenLinks = new SafeMap();
+ const knownHard = new SafeSet();
const original = p;
// Current character position in p
@@ -2508,7 +2508,7 @@ function realpathSync(p, options) {
const ctx = { path: base };
binding.lstat(pathModule.toNamespacedPath(base), false, undefined, ctx);
handleErrorFromBinding(ctx);
- knownHard[base] = true;
+ knownHard.add(base);
}
// Walk down the path, swapping out linked path parts for their real
@@ -2530,7 +2530,7 @@ function realpathSync(p, options) {
}
// Continue if not a symlink, break if a pipe/socket
- if (knownHard[base] || cache?.get(base) === base) {
+ if (knownHard.has(base) || cache?.get(base) === base) {
if (isFileType(binding.statValues, S_IFIFO) ||
isFileType(binding.statValues, S_IFSOCK)) {
break;
@@ -2552,7 +2552,7 @@ function realpathSync(p, options) {
handleErrorFromBinding(ctx);
if (!isFileType(stats, S_IFLNK)) {
- knownHard[base] = true;
+ knownHard.add(base);
cache?.set(base, base);
continue;
}
@@ -2565,8 +2565,8 @@ function realpathSync(p, options) {
const dev = BigIntPrototypeToString(stats[0], 32);
const ino = BigIntPrototypeToString(stats[7], 32);
id = `${dev}:${ino}`;
- if (seenLinks[id]) {
- linkTarget = seenLinks[id];
+ if (seenLinks.has(id)) {
+ linkTarget = seenLinks.get(id);
}
}
if (linkTarget === null) {
@@ -2579,7 +2579,7 @@ function realpathSync(p, options) {
resolvedLink = pathModule.resolve(previous, linkTarget);
cache?.set(base, resolvedLink);
- if (!isWindows) seenLinks[id] = linkTarget;
+ if (!isWindows) seenLinks.set(id, linkTarget);
}
// Resolve the link, then start over
@@ -2590,11 +2590,11 @@ function realpathSync(p, options) {
pos = current.length;
// On windows, check that the root exists. On unix there is no need.
- if (isWindows && !knownHard[base]) {
+ if (isWindows && !knownHard.has(base)) {
const ctx = { path: base };
binding.lstat(pathModule.toNamespacedPath(base), false, undefined, ctx);
handleErrorFromBinding(ctx);
- knownHard[base] = true;
+ knownHard.add(base);
}
}
@@ -2639,8 +2639,8 @@ function realpath(p, options, callback) {
validatePath(p);
p = pathModule.resolve(p);
- const seenLinks = ObjectCreate(null);
- const knownHard = ObjectCreate(null);
+ const seenLinks = new SafeMap();
+ const knownHard = new SafeSet();
// Current character position in p
let pos;
@@ -2655,10 +2655,10 @@ function realpath(p, options, callback) {
pos = current.length;
// On windows, check that the root exists. On unix there is no need.
- if (isWindows && !knownHard[base]) {
+ if (isWindows && !knownHard.has(base)) {
fs.lstat(base, (err, stats) => {
if (err) return callback(err);
- knownHard[base] = true;
+ knownHard.add(base);
LOOP();
});
} else {
@@ -2688,7 +2688,7 @@ function realpath(p, options, callback) {
}
// Continue if not a symlink, break if a pipe/socket
- if (knownHard[base]) {
+ if (knownHard.has(base)) {
if (isFileType(binding.statValues, S_IFIFO) ||
isFileType(binding.statValues, S_IFSOCK)) {
return callback(null, encodeRealpathResult(p, options));
@@ -2704,7 +2704,7 @@ function realpath(p, options, callback) {
// If not a symlink, skip to the next path part
if (!stats.isSymbolicLink()) {
- knownHard[base] = true;
+ knownHard.add(base);
return process.nextTick(LOOP);
}
@@ -2716,15 +2716,15 @@ function realpath(p, options, callback) {
const dev = BigIntPrototypeToString(stats.dev, 32);
const ino = BigIntPrototypeToString(stats.ino, 32);
id = `${dev}:${ino}`;
- if (seenLinks[id]) {
- return gotTarget(null, seenLinks[id]);
+ if (seenLinks.has(id)) {
+ return gotTarget(null, seenLinks.get(id));
}
}
fs.stat(base, (err) => {
if (err) return callback(err);
fs.readlink(base, (err, target) => {
- if (!isWindows) seenLinks[id] = target;
+ if (!isWindows) seenLinks.set(id, target);
gotTarget(err, target);
});
});
@@ -2743,10 +2743,10 @@ function realpath(p, options, callback) {
pos = current.length;
// On windows, check that the root exists. On unix there is no need.
- if (isWindows && !knownHard[base]) {
+ if (isWindows && !knownHard.has(base)) {
fs.lstat(base, (err) => {
if (err) return callback(err);
- knownHard[base] = true;
+ knownHard.add(base);
LOOP();
});
} else {