1919// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
2020// USE OR OTHER DEALINGS IN THE SOFTWARE.
2121
22+ #include " aliased_buffer.h"
2223#include " node_buffer.h"
2324#include " node_internals.h"
2425#include " node_stat_watcher.h"
4445
4546namespace node {
4647
47- void FillStatsArray (double * fields, const uv_stat_t * s) {
48- fields[0 ] = s->st_dev ;
49- fields[1 ] = s->st_mode ;
50- fields[2 ] = s->st_nlink ;
51- fields[3 ] = s->st_uid ;
52- fields[4 ] = s->st_gid ;
53- fields[5 ] = s->st_rdev ;
48+ void FillStatsArray (AliasedBuffer<double , v8::Float64Array>* fields_ptr,
49+ const uv_stat_t * s, int offset) {
50+ AliasedBuffer<double , v8::Float64Array>& fields = *fields_ptr;
51+ fields[offset + 0 ] = s->st_dev ;
52+ fields[offset + 1 ] = s->st_mode ;
53+ fields[offset + 2 ] = s->st_nlink ;
54+ fields[offset + 3 ] = s->st_uid ;
55+ fields[offset + 4 ] = s->st_gid ;
56+ fields[offset + 5 ] = s->st_rdev ;
5457#if defined(__POSIX__)
55- fields[6 ] = s->st_blksize ;
58+ fields[offset + 6 ] = s->st_blksize ;
5659#else
57- fields[6 ] = -1 ;
60+ fields[offset + 6 ] = -1 ;
5861#endif
59- fields[7 ] = s->st_ino ;
60- fields[8 ] = s->st_size ;
62+ fields[offset + 7 ] = s->st_ino ;
63+ fields[offset + 8 ] = s->st_size ;
6164#if defined(__POSIX__)
62- fields[9 ] = s->st_blocks ;
65+ fields[offset + 9 ] = s->st_blocks ;
6366#else
64- fields[9 ] = -1 ;
67+ fields[offset + 9 ] = -1 ;
6568#endif
6669// Dates.
6770// NO-LINT because the fields are 'long' and we just want to cast to `unsigned`
68- #define X (idx, name ) \
69- /* NOLINTNEXTLINE(runtime/int) */ \
70- fields[idx] = ((unsigned long )(s->st_ ##name.tv_sec ) * 1e3 ) + \
71- /* NOLINTNEXTLINE(runtime/int) */ \
72- ((unsigned long )(s->st_ ##name.tv_nsec ) / 1e6 ); \
71+ #define X (idx, name ) \
72+ /* NOLINTNEXTLINE(runtime/int) */ \
73+ fields[offset + idx] = ((unsigned long )(s->st_ ##name.tv_sec ) * 1e3 ) + \
74+ /* NOLINTNEXTLINE(runtime/int) */ \
75+ ((unsigned long )(s->st_ ##name.tv_nsec ) / 1e6 ); \
7376
7477 X (10 , atim)
7578 X (11 , mtim)
@@ -81,7 +84,6 @@ void FillStatsArray(double* fields, const uv_stat_t* s) {
8184namespace fs {
8285
8386using v8::Array;
84- using v8::ArrayBuffer;
8587using v8::Context;
8688using v8::Float64Array;
8789using v8::Function;
@@ -1295,22 +1297,6 @@ static void Mkdtemp(const FunctionCallbackInfo<Value>& args) {
12951297 }
12961298}
12971299
1298- void GetStatValues (const FunctionCallbackInfo<Value>& args) {
1299- Environment* env = Environment::GetCurrent (args);
1300- double * fields = env->fs_stats_field_array ();
1301- if (fields == nullptr ) {
1302- // stat fields contains twice the number of entries because `fs.StatWatcher`
1303- // needs room to store data for *two* `fs.Stats` instances.
1304- fields = new double [2 * 14 ];
1305- env->set_fs_stats_field_array (fields);
1306- }
1307- Local<ArrayBuffer> ab = ArrayBuffer::New (env->isolate (),
1308- fields,
1309- sizeof (double ) * 2 * 14 );
1310- Local<Float64Array> fields_array = Float64Array::New (ab, 0 , 2 * 14 );
1311- args.GetReturnValue ().Set (fields_array);
1312- }
1313-
13141300void InitFs (Local<Object> target,
13151301 Local<Value> unused,
13161302 Local<Context> context,
@@ -1356,7 +1342,9 @@ void InitFs(Local<Object> target,
13561342
13571343 env->SetMethod (target, " mkdtemp" , Mkdtemp);
13581344
1359- env->SetMethod (target, " getStatValues" , GetStatValues);
1345+ target->Set (context,
1346+ FIXED_ONE_BYTE_STRING (env->isolate (), " statValues" ),
1347+ env->fs_stats_field_array ()->GetJSArray ()).FromJust ();
13601348
13611349 StatWatcher::Initialize (env, target);
13621350
0 commit comments