Skip to content

Commit b6eedde

Browse files
committed
Rewrite libeio After callback to use req->result instead of req->errorno for error checking
Conflicts: src/node_file.cc
1 parent ae20874 commit b6eedde

File tree

1 file changed

+38
-52
lines changed

1 file changed

+38
-52
lines changed

src/node_file.cc

Lines changed: 38 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -43,33 +43,28 @@ static int After(eio_req *req) {
4343

4444
ev_unref(EV_DEFAULT_UC);
4545

46-
int argc = 0;
47-
Local<Value> argv[6]; // 6 is the maximum number of args
48-
49-
if (req->errorno != 0) {
50-
argc = 1;
51-
switch (req->type) {
52-
case EIO_STAT:
53-
case EIO_LSTAT:
54-
case EIO_LINK:
55-
case EIO_UNLINK:
56-
case EIO_RMDIR:
57-
case EIO_RENAME:
58-
case EIO_READLINK:
59-
case EIO_OPEN:
60-
case EIO_CHMOD:
61-
case EIO_CHOWN:
62-
case EIO_MKDIR:
63-
argv[0] = ErrnoException(req->errorno, NULL, "", static_cast<const char*>(req->ptr1));
64-
break;
65-
default:
66-
argv[0] = ErrnoException(req->errorno);
46+
// there is always at least one argument. "error"
47+
int argc = 1;
48+
Local<Value> argv[2]; // 6 is the maximum number of args
49+
50+
// NOTE: This may be needed to be changed if something returns a -1
51+
// for a success, which is possible.
52+
if (req->result == -1) {
53+
// If the request doesn't have a path parameter set.
54+
if (!req->ptr1) {
55+
argv[0] = ErrnoException(req->errorno);
56+
} else {
57+
argv[0] = ErrnoException(req->errorno, NULL, "", static_cast<const char*>(req->ptr1));
6758
}
6859
} else {
69-
// Note: the error is always given the first argument of the callback.
70-
// If there is no error then then the first argument is null.
60+
// error value is empty or null for non-error.
7161
argv[0] = Local<Value>::New(Null());
62+
63+
// All have at least two args now.
64+
argc = 2;
65+
7266
switch (req->type) {
67+
// These all have no data to pass.
7368
case EIO_CLOSE:
7469
case EIO_RENAME:
7570
case EIO_UNLINK:
@@ -82,68 +77,59 @@ static int After(eio_req *req) {
8277
case EIO_SYMLINK:
8378
case EIO_CHMOD:
8479
case EIO_CHOWN:
85-
argc = 0;
80+
// These, however, don't.
81+
argc = 1;
8682
break;
8783

8884
case EIO_OPEN:
8985
case EIO_SENDFILE:
90-
argc = 2;
9186
argv[1] = Integer::New(req->result);
9287
break;
9388

9489
case EIO_WRITE:
95-
argc = 2;
9690
argv[1] = Integer::New(req->result);
9791
break;
9892

9993
case EIO_STAT:
10094
case EIO_LSTAT:
10195
case EIO_FSTAT:
102-
{
103-
struct stat *s = reinterpret_cast<struct stat*>(req->ptr2);
104-
argc = 2;
105-
argv[1] = BuildStatsObject(s);
96+
{
97+
struct stat *s = reinterpret_cast<struct stat*>(req->ptr2);
98+
argv[1] = BuildStatsObject(s);
99+
}
106100
break;
107-
}
108101

109102
case EIO_READLINK:
110-
{
111-
argc = 2;
112103
argv[1] = String::New(static_cast<char*>(req->ptr2), req->result);
113104
break;
114-
}
115105

116106
case EIO_READ:
117-
{
118107
// Buffer interface
119108
argv[1] = Integer::New(req->result);
120-
argc = 2;
121109
break;
122-
}
123110

124111
case EIO_READDIR:
125-
{
126-
char *namebuf = static_cast<char*>(req->ptr2);
127-
int nnames = req->result;
112+
{
113+
char *namebuf = static_cast<char*>(req->ptr2);
114+
int nnames = req->result;
128115

129-
Local<Array> names = Array::New(nnames);
116+
Local<Array> names = Array::New(nnames);
130117

131-
for (int i = 0; i < nnames; i++) {
132-
Local<String> name = String::New(namebuf);
133-
names->Set(Integer::New(i), name);
118+
for (int i = 0; i < nnames; i++) {
119+
Local<String> name = String::New(namebuf);
120+
names->Set(Integer::New(i), name);
134121
#ifndef NDEBUG
135-
namebuf += strlen(namebuf);
136-
assert(*namebuf == '\0');
137-
namebuf += 1;
122+
namebuf += strlen(namebuf);
123+
assert(*namebuf == '\0');
124+
namebuf += 1;
138125
#else
139-
namebuf += strlen(namebuf) + 1;
126+
namebuf += strlen(namebuf) + 1;
140127
#endif
141-
}
128+
}
142129

143-
argc = 2;
144-
argv[1] = names;
130+
argv[1] = names;
131+
}
145132
break;
146-
}
147133

148134
default:
149135
assert(0 && "Unhandled eio response");

0 commit comments

Comments
 (0)