@@ -94,6 +94,7 @@ using v8::MaybeLocal;
94
94
using v8::Number;
95
95
using v8::Object;
96
96
using v8::String;
97
+ using v8::Undefined;
97
98
using v8::Value;
98
99
99
100
#ifndef MIN
@@ -102,32 +103,16 @@ using v8::Value;
102
103
103
104
#define GET_OFFSET (a ) ((a)->IsNumber () ? (a)->IntegerValue() : -1)
104
105
105
- FSReqWrap* FSReqWrap::New(Environment* env,
106
- Local<Object> req,
107
- const char * syscall,
108
- const char * data,
109
- enum encoding encoding,
110
- Ownership ownership) {
111
- const bool copy = (data != nullptr && ownership == COPY);
112
- const size_t size = copy ? 1 + strlen (data) : 0 ;
113
- FSReqWrap* that;
114
- char * const storage = new char [sizeof (*that) + size];
115
- that = new (storage) FSReqWrap (env, req, syscall, data, encoding);
116
- if (copy)
117
- that->data_ = static_cast <char *>(memcpy (that->inline_data (), data, size));
118
- return that;
106
+ void FSReqWrap::Reject(Local<Value> reject) {
107
+ MakeCallback (env ()->oncomplete_string (), 1 , &reject);
119
108
}
120
109
121
-
122
- void FSReqWrap::Dispose () {
123
- this ->~FSReqWrap ();
124
- delete[] reinterpret_cast <char *>(this );
110
+ void FSReqWrap::FillStatsArray (const uv_stat_t * stat) {
111
+ node::FillStatsArray (env ()->fs_stats_field_array (), stat);
125
112
}
126
113
127
-
128
- void FSReqWrap::Reject (Local<Value> reject) {
129
- Local<Value> argv[1 ] { reject };
130
- MakeCallback (env ()->oncomplete_string (), arraysize (argv), argv);
114
+ void FSReqWrap::ResolveStat () {
115
+ Resolve (Undefined (env ()->isolate ()));
131
116
}
132
117
133
118
void FSReqWrap::Resolve (Local<Value> value) {
@@ -138,9 +123,26 @@ void FSReqWrap::Resolve(Local<Value> value) {
138
123
MakeCallback (env ()->oncomplete_string (), arraysize (argv), argv);
139
124
}
140
125
126
+ void FSReqWrap::Init (const char * syscall,
127
+ const char * data,
128
+ size_t len,
129
+ enum encoding encoding) {
130
+ syscall_ = syscall;
131
+ encoding_ = encoding;
132
+
133
+ if (data != nullptr ) {
134
+ CHECK_EQ (data_, nullptr );
135
+ buffer_.AllocateSufficientStorage (len + 1 );
136
+ buffer_.SetLengthAndZeroTerminate (len);
137
+ memcpy (*buffer_, data, len);
138
+ data_ = *buffer_;
139
+ }
140
+ }
141
+
141
142
void NewFSReqWrap (const FunctionCallbackInfo<Value>& args) {
142
143
CHECK (args.IsConstructCall ());
143
- ClearWrap (args.This ());
144
+ Environment* env = Environment::GetCurrent (args.GetIsolate ());
145
+ new FSReqWrap (env, args.This ());
144
146
}
145
147
146
148
@@ -150,12 +152,11 @@ FSReqAfterScope::FSReqAfterScope(FSReqWrap* wrap, uv_fs_t* req)
150
152
handle_scope_(wrap->env ()->isolate()),
151
153
context_scope_(wrap->env ()->context()) {
152
154
CHECK_EQ (wrap_->req (), req);
153
- wrap_->ReleaseEarly (); // Free memory that's no longer used now.
154
155
}
155
156
156
157
FSReqAfterScope::~FSReqAfterScope () {
157
158
uv_fs_req_cleanup (wrap_->req ());
158
- wrap_-> Dispose () ;
159
+ delete wrap_;
159
160
}
160
161
161
162
// TODO(joyeecheung): create a normal context object, and
@@ -195,12 +196,10 @@ void AfterNoArgs(uv_fs_t* req) {
195
196
void AfterStat (uv_fs_t * req) {
196
197
FSReqWrap* req_wrap = static_cast <FSReqWrap*>(req->data );
197
198
FSReqAfterScope after (req_wrap, req);
198
- Environment* env = req_wrap->env ();
199
199
200
200
if (after.Proceed ()) {
201
- FillStatsArray (env->fs_stats_field_array (),
202
- static_cast <const uv_stat_t *>(req->ptr ));
203
- req_wrap->Resolve (Undefined (req_wrap->env ()->isolate ()));
201
+ req_wrap->FillStatsArray (&req->statbuf );
202
+ req_wrap->ResolveStat ();
204
203
}
205
204
}
206
205
@@ -222,7 +221,7 @@ void AfterStringPath(uv_fs_t* req) {
222
221
if (after.Proceed ()) {
223
222
link = StringBytes::Encode (req_wrap->env ()->isolate (),
224
223
static_cast <const char *>(req->path ),
225
- req_wrap->encoding_ ,
224
+ req_wrap->encoding () ,
226
225
&error);
227
226
if (link.IsEmpty ())
228
227
req_wrap->Reject (error);
@@ -241,7 +240,7 @@ void AfterStringPtr(uv_fs_t* req) {
241
240
if (after.Proceed ()) {
242
241
link = StringBytes::Encode (req_wrap->env ()->isolate (),
243
242
static_cast <const char *>(req->ptr ),
244
- req_wrap->encoding_ ,
243
+ req_wrap->encoding () ,
245
244
&error);
246
245
if (link.IsEmpty ())
247
246
req_wrap->Reject (error);
@@ -278,7 +277,7 @@ void AfterScanDir(uv_fs_t* req) {
278
277
MaybeLocal<Value> filename =
279
278
StringBytes::Encode (env->isolate (),
280
279
ent.name ,
281
- req_wrap->encoding_ ,
280
+ req_wrap->encoding () ,
282
281
&error);
283
282
if (filename.IsEmpty ())
284
283
return req_wrap->Reject (error);
@@ -317,12 +316,12 @@ class fs_req_wrap {
317
316
template <typename Func, typename ... Args>
318
317
inline FSReqWrap* AsyncDestCall (Environment* env,
319
318
const FunctionCallbackInfo<Value>& args,
320
- const char * syscall, const char * dest,
321
- enum encoding enc, FSReqWrap::Ownership ownership,
322
- uv_fs_cb after, Func fn, Args... fn_args) {
319
+ const char * syscall, const char * dest, size_t len,
320
+ enum encoding enc, uv_fs_cb after, Func fn, Args... fn_args) {
323
321
Local<Object> req = args[args.Length () - 1 ].As <Object>();
324
- FSReqWrap* req_wrap = FSReqWrap::New (env, req,
325
- syscall, dest, enc, ownership);
322
+ FSReqWrap* req_wrap = Unwrap<FSReqWrap>(req);
323
+ CHECK_NE (req_wrap, nullptr );
324
+ req_wrap->Init (syscall, dest, len, enc);
326
325
int err = fn (env->event_loop (), req_wrap->req (), fn_args..., after);
327
326
req_wrap->Dispatched ();
328
327
if (err < 0 ) {
@@ -339,38 +338,16 @@ inline FSReqWrap* AsyncDestCall(Environment* env,
339
338
return req_wrap;
340
339
}
341
340
342
- // Defaults to COPY ownership.
343
- template <typename Func, typename ... Args>
344
- inline FSReqWrap* AsyncDestCall (Environment* env,
345
- const FunctionCallbackInfo<Value>& args,
346
- const char * syscall, const char * dest, enum encoding enc,
347
- uv_fs_cb after, Func fn, Args... fn_args) {
348
- return AsyncDestCall (env, args,
349
- syscall, dest, enc, FSReqWrap::COPY,
350
- after, fn, fn_args...);
351
- }
352
-
353
341
template <typename Func, typename ... Args>
354
342
inline FSReqWrap* AsyncCall (Environment* env,
355
343
const FunctionCallbackInfo<Value>& args,
356
- const char * syscall, enum encoding enc, FSReqWrap::Ownership ownership,
344
+ const char * syscall, enum encoding enc,
357
345
uv_fs_cb after, Func fn, Args... fn_args) {
358
346
return AsyncDestCall (env, args,
359
- syscall, nullptr , enc, ownership ,
347
+ syscall, nullptr , 0 , enc ,
360
348
after, fn, fn_args...);
361
349
}
362
350
363
- // Defaults to COPY ownership.
364
- template <typename Func, typename ... Args>
365
- inline FSReqWrap* AsyncCall (Environment* env,
366
- const FunctionCallbackInfo<Value>& args,
367
- const char * syscall, enum encoding enc,
368
- uv_fs_cb after, Func fn, Args... fn_args) {
369
- return AsyncCall (env, args,
370
- syscall, enc, FSReqWrap::COPY,
371
- after, fn, fn_args...);
372
- }
373
-
374
351
// Template counterpart of SYNC_CALL, except that it only puts
375
352
// the error number and the syscall in the context instead of
376
353
// creating an error in the C++ land.
@@ -623,8 +600,8 @@ static void Symlink(const FunctionCallbackInfo<Value>& args) {
623
600
624
601
if (args[3 ]->IsObject ()) { // symlink(target, path, flags, req)
625
602
CHECK_EQ (args.Length (), 4 );
626
- AsyncDestCall (env, args, " symlink" , *path, UTF8, AfterNoArgs ,
627
- uv_fs_symlink, *target, *path, flags);
603
+ AsyncDestCall (env, args, " symlink" , *path, path. length (), UTF8 ,
604
+ AfterNoArgs, uv_fs_symlink, *target, *path, flags);
628
605
} else { // symlink(target, path, flags)
629
606
SYNC_DEST_CALL (symlink, *target, *path, *target, *path, flags)
630
607
}
@@ -643,8 +620,8 @@ static void Link(const FunctionCallbackInfo<Value>& args) {
643
620
644
621
if (args[2 ]->IsObject ()) { // link(src, dest, req)
645
622
CHECK_EQ (args.Length (), 3 );
646
- AsyncDestCall (env, args, " link" , *dest, UTF8, AfterNoArgs ,
647
- uv_fs_link, *src, *dest);
623
+ AsyncDestCall (env, args, " link" , *dest, dest. length (), UTF8 ,
624
+ AfterNoArgs, uv_fs_link, *src, *dest);
648
625
} else { // link(src, dest)
649
626
SYNC_DEST_CALL (link, *src, *dest, *src, *dest)
650
627
}
@@ -695,8 +672,8 @@ static void Rename(const FunctionCallbackInfo<Value>& args) {
695
672
696
673
if (args[2 ]->IsObject ()) {
697
674
CHECK_EQ (args.Length (), 3 );
698
- AsyncDestCall (env, args, " rename" , *new_path, UTF8, AfterNoArgs ,
699
- uv_fs_rename, *old_path, *new_path);
675
+ AsyncDestCall (env, args, " rename" , *new_path, new_path. length () ,
676
+ UTF8, AfterNoArgs, uv_fs_rename, *old_path, *new_path);
700
677
} else {
701
678
SYNC_DEST_CALL (rename, *old_path, *new_path, *old_path, *new_path)
702
679
}
@@ -1041,7 +1018,6 @@ static void WriteString(const FunctionCallbackInfo<Value>& args) {
1041
1018
char * buf = nullptr ;
1042
1019
int64_t pos;
1043
1020
size_t len;
1044
- FSReqWrap::Ownership ownership = FSReqWrap::COPY;
1045
1021
1046
1022
// will assign buf and len if string was external
1047
1023
if (!StringBytes::GetExternalParts (string,
@@ -1053,16 +1029,14 @@ static void WriteString(const FunctionCallbackInfo<Value>& args) {
1053
1029
// StorageSize may return too large a char, so correct the actual length
1054
1030
// by the write size
1055
1031
len = StringBytes::Write (env->isolate (), buf, len, args[1 ], enc);
1056
- ownership = FSReqWrap::MOVE;
1057
1032
}
1058
1033
pos = GET_OFFSET (args[2 ]);
1059
1034
1060
1035
uv_buf_t uvbuf = uv_buf_init (const_cast <char *>(buf), len);
1061
1036
1062
1037
if (args[4 ]->IsObject ()) {
1063
1038
CHECK_EQ (args.Length (), 5 );
1064
- AsyncCall (env, args,
1065
- " write" , UTF8, ownership, AfterInteger,
1039
+ AsyncCall (env, args, " write" , UTF8, AfterInteger,
1066
1040
uv_fs_write, fd, &uvbuf, 1 , pos);
1067
1041
} else {
1068
1042
// SYNC_CALL returns on error. Make sure to always free the memory.
@@ -1071,7 +1045,7 @@ static void WriteString(const FunctionCallbackInfo<Value>& args) {
1071
1045
inline ~Delete () { delete[] pointer_; }
1072
1046
char * const pointer_;
1073
1047
};
1074
- Delete delete_on_return (ownership == FSReqWrap::MOVE ? buf : nullptr );
1048
+ Delete delete_on_return (buf);
1075
1049
SYNC_CALL (write, nullptr , fd, &uvbuf, 1 , pos)
1076
1050
return args.GetReturnValue ().Set (SYNC_RESULT);
1077
1051
}
@@ -1373,7 +1347,7 @@ void InitFs(Local<Object> target,
1373
1347
Local<String> wrapString =
1374
1348
FIXED_ONE_BYTE_STRING (env->isolate (), " FSReqWrap" );
1375
1349
fst->SetClassName (wrapString);
1376
- target->Set (wrapString, fst->GetFunction ());
1350
+ target->Set (context, wrapString, fst->GetFunction ()). FromJust ( );
1377
1351
}
1378
1352
1379
1353
} // namespace fs
0 commit comments