Skip to content

Commit 535753c

Browse files
committed
RC14; error correction
1 parent aa49f26 commit 535753c

File tree

3 files changed

+57
-32
lines changed

3 files changed

+57
-32
lines changed

src/aio.c

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -137,48 +137,63 @@ static void haio_finalizer(SEXP xptr) {
137137

138138
static SEXP mk_error_saio(const int xc, SEXP env) {
139139

140-
INTEGER(nano_error)[0] = xc;
141-
Rf_defineVar(nano_ResultSymbol, nano_error, ENCLOS(env));
142-
return nano_error;
140+
SEXP err = PROTECT(Rf_ScalarInteger(xc));
141+
SET_ATTRIB(err, nano_error);
142+
SET_OBJECT(err, 1);
143+
Rf_defineVar(nano_ResultSymbol, err, ENCLOS(env));
144+
UNPROTECT(1);
145+
return err;
143146

144147
}
145148

146149
static SEXP mk_error_raio(const int xc, SEXP env) {
147150

148-
INTEGER(nano_error)[0] = xc;
149-
Rf_defineVar(nano_RawSymbol, nano_error, ENCLOS(env));
150-
Rf_defineVar(nano_DataSymbol, nano_error, ENCLOS(env));
151-
return nano_error;
151+
SEXP err = PROTECT(Rf_ScalarInteger(xc));
152+
SET_ATTRIB(err, nano_error);
153+
SET_OBJECT(err, 1);
154+
Rf_defineVar(nano_RawSymbol, err, ENCLOS(env));
155+
Rf_defineVar(nano_DataSymbol, err, ENCLOS(env));
156+
UNPROTECT(1);
157+
return err;
152158

153159
}
154160

155161
static SEXP mk_error_haio(const int xc, SEXP env) {
156162

157-
INTEGER(nano_error)[0] = xc;
158-
Rf_defineVar(nano_StatusSymbol, nano_error, ENCLOS(env));
159-
Rf_defineVar(nano_IdSymbol, nano_error, ENCLOS(env));
160-
Rf_defineVar(nano_RawSymbol, nano_error, ENCLOS(env));
161-
Rf_defineVar(nano_ProtocolSymbol, nano_error, ENCLOS(env));
162-
return nano_error;
163+
SEXP err = PROTECT(Rf_ScalarInteger(xc));
164+
SET_ATTRIB(err, nano_error);
165+
SET_OBJECT(err, 1);
166+
Rf_defineVar(nano_StatusSymbol, err, ENCLOS(env));
167+
Rf_defineVar(nano_IdSymbol, err, ENCLOS(env));
168+
Rf_defineVar(nano_RawSymbol, err, ENCLOS(env));
169+
Rf_defineVar(nano_ProtocolSymbol, err, ENCLOS(env));
170+
UNPROTECT(1);
171+
return err;
163172

164173
}
165174

166175
static SEXP mk_error_data(const int xc) {
167176

168177
const char *names[] = {"data", ""};
169-
INTEGER(nano_error)[0] = xc;
170-
SEXP out = Rf_mkNamed(VECSXP, names);
171-
SET_VECTOR_ELT(out, 0, nano_error);
178+
SEXP out = PROTECT(Rf_mkNamed(VECSXP, names));
179+
SEXP err = Rf_ScalarInteger(xc);
180+
SET_ATTRIB(err, nano_error);
181+
SET_OBJECT(err, 1);
182+
SET_VECTOR_ELT(out, 0, err);
183+
UNPROTECT(1);
172184
return out;
173185

174186
}
175187

176188
static SEXP mk_error_result(const int xc) {
177189

178190
const char *names[] = {"result", ""};
179-
INTEGER(nano_error)[0] = xc;
180-
SEXP out = Rf_mkNamed(VECSXP, names);
181-
SET_VECTOR_ELT(out, 0, nano_error);
191+
SEXP out = PROTECT(Rf_mkNamed(VECSXP, names));
192+
SEXP err = Rf_ScalarInteger(xc);
193+
SET_ATTRIB(err, nano_error);
194+
SET_OBJECT(err, 1);
195+
SET_VECTOR_ELT(out, 0, err);
196+
UNPROTECT(1);
182197
return out;
183198

184199
}

src/core.c

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,31 +23,39 @@
2323

2424
SEXP mk_error(const int xc) {
2525

26-
INTEGER(nano_error)[0] = xc;
27-
return nano_error;
26+
SEXP err = Rf_ScalarInteger(xc);
27+
SET_ATTRIB(err, nano_error);
28+
SET_OBJECT(err, 1);
29+
return err;
2830

2931
}
3032

3133
SEXP mk_error_recv(const int xc) {
3234

3335
const char *names[] = {"raw", "data", ""};
34-
INTEGER(nano_error)[0] = xc;
35-
SEXP out = Rf_mkNamed(VECSXP, names);
36-
SET_VECTOR_ELT(out, 0, nano_error);
37-
SET_VECTOR_ELT(out, 1, nano_error);
36+
SEXP out = PROTECT(Rf_mkNamed(VECSXP, names));
37+
SEXP err = Rf_ScalarInteger(xc);
38+
SET_ATTRIB(err, nano_error);
39+
SET_OBJECT(err, 1);
40+
SET_VECTOR_ELT(out, 0, err);
41+
SET_VECTOR_ELT(out, 1, err);
42+
UNPROTECT(1);
3843
return out;
3944

4045
}
4146

4247
SEXP mk_error_ncurl(const int xc) {
4348

4449
const char *names[] = {"status", "headers", "raw", "data", ""};
45-
INTEGER(nano_error)[0] = xc;
46-
SEXP out = Rf_mkNamed(VECSXP, names);
47-
SET_VECTOR_ELT(out, 0, nano_error);
48-
SET_VECTOR_ELT(out, 1, nano_error);
49-
SET_VECTOR_ELT(out, 2, nano_error);
50-
SET_VECTOR_ELT(out, 3, nano_error);
50+
SEXP out = PROTECT(Rf_mkNamed(VECSXP, names));
51+
SEXP err = Rf_ScalarInteger(xc);
52+
SET_ATTRIB(err, nano_error);
53+
SET_OBJECT(err, 1);
54+
SET_VECTOR_ELT(out, 0, err);
55+
SET_VECTOR_ELT(out, 1, err);
56+
SET_VECTOR_ELT(out, 2, err);
57+
SET_VECTOR_ELT(out, 3, err);
58+
UNPROTECT(1);
5159
return out;
5260

5361
}

src/init.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,9 @@ static void PreserveObjects(void) {
8888
SETCADR(nano_aioNFuncs, Rf_lang5(nano_DotcallSymbol, nano_AioHttpSymbol, nano_DataSymbol, nano_ResponseSymbol, Rf_ScalarInteger(2)));
8989
SETCADDR(nano_aioNFuncs, Rf_lang5(nano_DotcallSymbol, nano_AioHttpSymbol, nano_DataSymbol, nano_ResponseSymbol, Rf_ScalarInteger(3)));
9090
SETCADDDR(nano_aioNFuncs, Rf_lang5(nano_DotcallSymbol, nano_AioHttpSymbol, nano_DataSymbol, nano_ResponseSymbol, Rf_ScalarInteger(4)));
91-
R_PreserveObject(nano_error = Rf_ScalarInteger(1));
91+
R_PreserveObject(nano_error = Rf_allocVector(LISTSXP, 1));
92+
SETCAR(nano_error, Rf_mkString("errorValue"));
93+
SET_TAG(nano_error, R_ClassSymbol);
9294
Rf_classgets(nano_error, Rf_mkString("errorValue"));
9395
R_PreserveObject(nano_ncurlAio = Rf_allocVector(STRSXP, 2));
9496
SET_STRING_ELT(nano_ncurlAio, 0, Rf_mkChar("ncurlAio"));

0 commit comments

Comments
 (0)