--- node-v18.12.1/lib/internal/fs/utils.js.old 2022-11-04 11:13:14.000000000 -0500
+++ node-v18.12.1/lib/internal/fs/utils.js 2023-01-01 18:07:20.292441829 -0600
@@ -12,7 +12,6 @@
NumberIsFinite,
NumberIsInteger,
MathMin,
- MathRound,
ObjectIs,
ObjectPrototypeHasOwnProperty,
ObjectSetPrototypeOf,
@@ -40,7 +39,7 @@
} = require('internal/errors');
const {
isArrayBufferView,
- isBigInt64Array,
+ isBigUint64Array,
isDate,
isUint8Array,
} = require('internal/util/types');
@@ -455,16 +454,14 @@
return sec * kNsPerSecBigInt + nsec;
}
-// The Date constructor performs Math.floor() on the absolute value
-// of the timestamp: https://tc39.es/ecma262/#sec-timeclip
+// The Date constructor performs Math.floor() to the timestamp.
+// https://tc39.es/ecma262/#sec-timeclip
// Since there may be a precision loss when the timestamp is
// converted to a floating point number, we manually round
// the timestamp here before passing it to Date().
// Refs: https://github.com/nodejs/node/pull/12607
-// Refs: https://github.com/nodejs/node/pull/43714
function dateFromMs(ms) {
- // Coercing to number, ms can be bigint
- return new Date(MathRound(Number(ms)));
+ return new Date(Number(ms) + 0.5);
}
function BigIntStats(dev, mode, nlink, uid, gid, rdev, blksize,
@@ -529,12 +526,12 @@
};
/**
- * @param {Float64Array | BigInt64Array} stats
+ * @param {Float64Array | BigUint64Array} stats
* @param {number} offset
* @returns {BigIntStats | Stats}
*/
function getStatsFromBinding(stats, offset = 0) {
- if (isBigInt64Array(stats)) {
+ if (isBigUint64Array(stats)) {
return new BigIntStats(
stats[0 + offset], stats[1 + offset], stats[2 + offset],
stats[3 + offset], stats[4 + offset], stats[5 + offset],
--- node-v18.12.1/src/aliased_buffer.h.old 2022-11-04 11:13:14.000000000 -0500
+++ node-v18.12.1/src/aliased_buffer.h 2023-01-01 18:08:01.407999936 -0600
@@ -306,7 +306,7 @@
typedef AliasedBufferBase<uint8_t, v8::Uint8Array> AliasedUint8Array;
typedef AliasedBufferBase<uint32_t, v8::Uint32Array> AliasedUint32Array;
typedef AliasedBufferBase<double, v8::Float64Array> AliasedFloat64Array;
-typedef AliasedBufferBase<int64_t, v8::BigInt64Array> AliasedBigInt64Array;
+typedef AliasedBufferBase<int64_t, v8::BigUint64Array> AliasedBigUint64Array;
} // namespace node
#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
--- node-v18.12.1/src/node_file-inl.h.old 2022-11-04 11:13:14.000000000 -0500
+++ node-v18.12.1/src/node_file-inl.h 2023-01-01 18:09:07.830823990 -0600
@@ -90,18 +90,9 @@
fields->SetValue(offset + static_cast<size_t>(FsStatsOffset::stat_offset), \
static_cast<NativeT>(stat))
-// On win32, time is stored in uint64_t and starts from 1601-01-01.
-// libuv calculates tv_sec and tv_nsec from it and converts to signed long,
-// which causes Y2038 overflow. On the other platforms it is safe to treat
-// negative values as pre-epoch time.
-#ifdef _WIN32
#define SET_FIELD_WITH_TIME_STAT(stat_offset, stat) \
/* NOLINTNEXTLINE(runtime/int) */ \
SET_FIELD_WITH_STAT(stat_offset, static_cast<unsigned long>(stat))
-#else
-#define SET_FIELD_WITH_TIME_STAT(stat_offset, stat) \
- SET_FIELD_WITH_STAT(stat_offset, static_cast<double>(stat))
-#endif // _WIN32
SET_FIELD_WITH_STAT(kDev, s->st_dev);
SET_FIELD_WITH_STAT(kMode, s->st_mode);
@@ -242,7 +233,7 @@
Environment* env = binding_data->env();
if (value->StrictEquals(env->fs_use_promises_symbol())) {
if (use_bigint) {
- return FSReqPromise<AliasedBigInt64Array>::New(binding_data, use_bigint);
+ return FSReqPromise<AliasedBigUint64Array>::New(binding_data, use_bigint);
} else {
return FSReqPromise<AliasedFloat64Array>::New(binding_data, use_bigint);
}
--- node-v18.12.1/src/node_file.h.old 2022-11-04 11:13:14.000000000 -0500
+++ node-v18.12.1/src/node_file.h 2023-01-01 18:09:24.888981123 -0600
@@ -18,7 +18,7 @@
explicit BindingData(Environment* env, v8::Local<v8::Object> wrap);
AliasedFloat64Array stats_field_array;
- AliasedBigInt64Array stats_field_bigint_array;
+ AliasedBigUint64Array stats_field_bigint_array;
std::vector<BaseObjectPtr<FileHandleReadWrap>>
file_handle_read_wrap_freelist;
--- node-v18.12.1/test/parallel/test-fs-stat-date.mjs.old 2022-11-04 11:13:14.000000000 -0500
+++ node-v18.12.1/test/parallel/test-fs-stat-date.mjs 1969-12-31 18:00:00.000000000 -0600
@@ -1,95 +0,0 @@
-import * as common from '../common/index.mjs';
-
-// Test timestamps returned by fsPromises.stat and fs.statSync
-
-import fs from 'node:fs';
-import fsPromises from 'node:fs/promises';
-import path from 'node:path';
-import assert from 'node:assert';
-import tmpdir from '../common/tmpdir.js';
-
-// On some platforms (for example, ppc64) boundaries are tighter
-// than usual. If we catch these errors, skip corresponding test.
-const ignoredErrors = new Set(['EINVAL', 'EOVERFLOW']);
-
-tmpdir.refresh();
-const filepath = path.resolve(tmpdir.path, 'timestamp');
-
-await (await fsPromises.open(filepath, 'w')).close();
-
-// Perform a trivial check to determine if filesystem supports setting
-// and retrieving atime and mtime. If it doesn't, skip the test.
-await fsPromises.utimes(filepath, 2, 2);
-const { atimeMs, mtimeMs } = await fsPromises.stat(filepath);
-if (atimeMs !== 2000 || mtimeMs !== 2000) {
- common.skip(`Unsupported filesystem (atime=${atimeMs}, mtime=${mtimeMs})`);
-}
-
-// Date might round down timestamp
-function closeEnough(actual, expected, margin) {
- // On ppc64, value is rounded to seconds
- if (process.arch === 'ppc64') {
- margin += 1000;
- }
-
- // Filesystems without support for timestamps before 1970-01-01, such as NFSv3,
- // should return 0 for negative numbers. Do not treat it as error.
- if (actual === 0 && expected < 0) {
- console.log(`ignored 0 while expecting ${expected}`);
- return;
- }
-
- assert.ok(Math.abs(Number(actual - expected)) < margin,
- `expected ${expected} ± ${margin}, got ${actual}`);
-}
-
-async function runTest(atime, mtime, margin = 0) {
- margin += Number.EPSILON;
- try {
- await fsPromises.utimes(filepath, new Date(atime), new Date(mtime));
- } catch (e) {
- if (ignoredErrors.has(e.code)) return;
- throw e;
- }
-
- const stats = await fsPromises.stat(filepath);
- closeEnough(stats.atimeMs, atime, margin);
- closeEnough(stats.mtimeMs, mtime, margin);
- closeEnough(stats.atime.getTime(), new Date(atime).getTime(), margin);
- closeEnough(stats.mtime.getTime(), new Date(mtime).getTime(), margin);
-
- const statsBigint = await fsPromises.stat(filepath, { bigint: true });
- closeEnough(statsBigint.atimeMs, BigInt(atime), margin);
- closeEnough(statsBigint.mtimeMs, BigInt(mtime), margin);
- closeEnough(statsBigint.atime.getTime(), new Date(atime).getTime(), margin);
- closeEnough(statsBigint.mtime.getTime(), new Date(mtime).getTime(), margin);
-
- const statsSync = fs.statSync(filepath);
- closeEnough(statsSync.atimeMs, atime, margin);
- closeEnough(statsSync.mtimeMs, mtime, margin);
- closeEnough(statsSync.atime.getTime(), new Date(atime).getTime(), margin);
- closeEnough(statsSync.mtime.getTime(), new Date(mtime).getTime(), margin);
-
- const statsSyncBigint = fs.statSync(filepath, { bigint: true });
- closeEnough(statsSyncBigint.atimeMs, BigInt(atime), margin);
- closeEnough(statsSyncBigint.mtimeMs, BigInt(mtime), margin);
- closeEnough(statsSyncBigint.atime.getTime(), new Date(atime).getTime(), margin);
- closeEnough(statsSyncBigint.mtime.getTime(), new Date(mtime).getTime(), margin);
-}
-
-// Too high/low numbers produce too different results on different platforms
-{
- // TODO(LiviaMedeiros): investigate outdated stat time on FreeBSD.
- // On Windows, filetime is stored and handled differently. Supporting dates
- // after Y2038 is preferred over supporting dates before 1970-01-01.
- if (!common.isFreeBSD && !common.isWindows) {
- await runTest(-40691, -355, 1); // Potential precision loss on 32bit
- await runTest(-355, -40691, 1); // Potential precision loss on 32bit
- await runTest(-1, -1);
- }
- await runTest(0, 0);
- await runTest(1, 1);
- await runTest(355, 40691, 1); // Precision loss on 32bit
- await runTest(40691, 355, 1); // Precision loss on 32bit
- await runTest(1713037251360, 1713037251360, 1); // Precision loss
-}
diff -ur a/src/node_file.h b/src/node_file.h
--- a/src/node_file.h 2023-03-20 21:33:20.806694666 +0000
+++ b/src/node_file.h 2023-03-20 21:34:14.388701175 +0000
@@ -62,7 +62,7 @@
AliasedBigUint64Array stats_field_bigint_array;
AliasedFloat64Array statfs_field_array;
- AliasedBigInt64Array statfs_field_bigint_array;
+ AliasedBigUint64Array statfs_field_bigint_array;
std::vector<BaseObjectPtr<FileHandleReadWrap>>
file_handle_read_wrap_freelist;