Skip to content

Commit d4b53ec

Browse files
committed
RC9c; final prep
1 parent 4eaa140 commit d4b53ec

File tree

1 file changed

+41
-54
lines changed

1 file changed

+41
-54
lines changed

src/aio.c

Lines changed: 41 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ SEXP rnng_recv_aio(SEXP con, SEXP mode, SEXP timeout, SEXP keep, SEXP bytes, SEX
617617
}
618618

619619
PROTECT(aio);
620-
SEXP env, datafun;
620+
SEXP env, fun;
621621
#if defined(R_VERSION) && R_VERSION >= R_Version(4, 1, 0)
622622
PROTECT(env = R_NewEnv(clo, 0, 4));
623623
#else
@@ -629,19 +629,18 @@ SEXP rnng_recv_aio(SEXP con, SEXP mode, SEXP timeout, SEXP keep, SEXP bytes, SEX
629629
Rf_defineVar(nano_StateSymbol, keep, env);
630630

631631
if (kpr) {
632-
SEXP rawfun;
633-
PROTECT(rawfun = Rf_allocSExp(CLOSXP));
634-
SET_FORMALS(rawfun, nano_aioFormals);
635-
SET_BODY(rawfun, CADDR(nano_aioFuncs));
636-
SET_CLOENV(rawfun, clo);
637-
R_MakeActiveBinding(nano_RawSymbol, rawfun, env);
632+
PROTECT(fun = Rf_allocSExp(CLOSXP));
633+
SET_FORMALS(fun, nano_aioFormals);
634+
SET_BODY(fun, CADDR(nano_aioFuncs));
635+
SET_CLOENV(fun, clo);
636+
R_MakeActiveBinding(nano_RawSymbol, fun, env);
638637
UNPROTECT(1);
639638
}
640-
PROTECT(datafun = Rf_allocSExp(CLOSXP));
641-
SET_FORMALS(datafun, nano_aioFormals);
642-
SET_BODY(datafun, CADR(nano_aioFuncs));
643-
SET_CLOENV(datafun, clo);
644-
R_MakeActiveBinding(nano_DataSymbol, datafun, env);
639+
PROTECT(fun = Rf_allocSExp(CLOSXP));
640+
SET_FORMALS(fun, nano_aioFormals);
641+
SET_BODY(fun, CADR(nano_aioFuncs));
642+
SET_CLOENV(fun, clo);
643+
R_MakeActiveBinding(nano_DataSymbol, fun, env);
645644
Rf_classgets(env, nano_recvAio);
646645

647646
UNPROTECT(3);
@@ -740,7 +739,7 @@ SEXP rnng_ncurl_aio(SEXP http, SEXP convert, SEXP method, SEXP headers, SEXP dat
740739
PROTECT(aio = R_MakeExternalPtr(haio, nano_AioSymbol, R_NilValue));
741740
R_RegisterCFinalizerEx(aio, haio_finalizer, TRUE);
742741

743-
SEXP env;
742+
SEXP env, fun;
744743
#if defined(R_VERSION) && R_VERSION >= R_Version(4, 1, 0)
745744
PROTECT(env = R_NewEnv(clo, 0, 5));
746745
#else
@@ -749,32 +748,23 @@ SEXP rnng_ncurl_aio(SEXP http, SEXP convert, SEXP method, SEXP headers, SEXP dat
749748
REPROTECT(env = Rf_eval(env, clo), pxi);
750749
#endif
751750
Rf_defineVar(nano_AioSymbol, aio, env);
752-
753-
SEXP fun;
754-
PROTECT(fun = Rf_allocSExp(CLOSXP));
755-
SET_FORMALS(fun, nano_aioFormals);
756-
SET_BODY(fun, CAR(nano_aioNFuncs));
757-
SET_CLOENV(fun, clo);
758-
R_MakeActiveBinding(nano_StatusSymbol, fun, env);
759-
PROTECT(fun = Rf_allocSExp(CLOSXP));
760-
SET_FORMALS(fun, nano_aioFormals);
761-
SET_BODY(fun, CADR(nano_aioNFuncs));
762-
SET_CLOENV(fun, clo);
763-
R_MakeActiveBinding(nano_HeadersSymbol, fun, env);
764-
PROTECT(fun = Rf_allocSExp(CLOSXP));
765-
SET_FORMALS(fun, nano_aioFormals);
766-
SET_BODY(fun, CADDR(nano_aioNFuncs));
767-
SET_CLOENV(fun, clo);
768-
R_MakeActiveBinding(nano_RawSymbol, fun, env);
769-
PROTECT(fun = Rf_allocSExp(CLOSXP));
770-
SET_FORMALS(fun, nano_aioFormals);
771-
SET_BODY(fun, CADDDR(nano_aioNFuncs));
772-
SET_CLOENV(fun, clo);
773-
R_MakeActiveBinding(nano_DataSymbol, fun, env);
774-
751+
SEXP funlist = nano_aioNFuncs;
752+
for (int i = 0; i < 4; i++, funlist = CDR(funlist)) {
753+
PROTECT(fun = Rf_allocSExp(CLOSXP));
754+
SET_FORMALS(fun, nano_aioFormals);
755+
SET_BODY(fun, CAR(funlist));
756+
SET_CLOENV(fun, clo);
757+
switch (i) {
758+
case 0: R_MakeActiveBinding(nano_StatusSymbol, fun, env);
759+
case 1: R_MakeActiveBinding(nano_HeadersSymbol, fun, env);
760+
case 2: R_MakeActiveBinding(nano_RawSymbol, fun, env);
761+
case 3: R_MakeActiveBinding(nano_DataSymbol, fun, env);
762+
}
763+
UNPROTECT(1);
764+
}
775765
Rf_classgets(env, nano_ncurlAio);
776766

777-
UNPROTECT(6);
767+
UNPROTECT(2);
778768
return env;
779769

780770
exitlevel7:
@@ -825,7 +815,7 @@ SEXP rnng_aio_http(SEXP env, SEXP response, SEXP which) {
825815

826816
void *dat;
827817
size_t sz;
828-
SEXP vec, cvec = R_NilValue, rvec = R_NilValue;
818+
SEXP out, vec, cvec = R_NilValue, rvec = R_NilValue;
829819
nano_handle *handle = (nano_handle *) haio->data;
830820

831821
uint16_t code = nng_http_res_get_status(handle->res);
@@ -868,15 +858,13 @@ SEXP rnng_aio_http(SEXP env, SEXP response, SEXP which) {
868858
if (code >= 300 && code < 400) {
869859
cvec = Rf_mkString(nng_http_res_get_header(handle->res, "Location"));
870860
} else if (haio->mode) {
871-
SEXP expr;
872861
int xc;
873-
PROTECT(expr = Rf_lang2(nano_RtcSymbol, vec));
874-
cvec = R_tryEvalSilent(expr, R_BaseEnv, &xc);
862+
PROTECT(cvec = Rf_lang2(nano_RtcSymbol, vec));
863+
cvec = R_tryEvalSilent(cvec, R_BaseEnv, &xc);
875864
UNPROTECT(1);
876865
}
877866
Rf_defineVar(nano_ProtocolSymbol, cvec, ENCLOS(env));
878867

879-
SEXP out;
880868
switch (typ) {
881869
case 0: out = Rf_findVarInFrame(ENCLOS(env), nano_StatusSymbol); break;
882870
case 1: out = Rf_findVarInFrame(ENCLOS(env), nano_IdSymbol); break;
@@ -944,7 +932,7 @@ SEXP rnng_request(SEXP con, SEXP data, SEXP sendmode, SEXP recvmode, SEXP timeou
944932
PROTECT(aio = R_MakeExternalPtr(raio, nano_AioSymbol, R_NilValue));
945933
R_RegisterCFinalizerEx(aio, raio_finalizer, TRUE);
946934

947-
SEXP env, datafun;
935+
SEXP env, fun;
948936
#if defined(R_VERSION) && R_VERSION >= R_Version(4, 1, 0)
949937
PROTECT(env = R_NewEnv(clo, 0, 4));
950938
#else
@@ -959,19 +947,18 @@ SEXP rnng_request(SEXP con, SEXP data, SEXP sendmode, SEXP recvmode, SEXP timeou
959947
Rf_defineVar(nano_StateSymbol, keep, env);
960948

961949
if (kpr) {
962-
SEXP rawfun;
963-
PROTECT(rawfun = Rf_allocSExp(CLOSXP));
964-
SET_FORMALS(rawfun, nano_aioFormals);
965-
SET_BODY(rawfun, CADDR(nano_aioFuncs));
966-
SET_CLOENV(rawfun, clo);
967-
R_MakeActiveBinding(nano_RawSymbol, rawfun, env);
950+
PROTECT(fun = Rf_allocSExp(CLOSXP));
951+
SET_FORMALS(fun, nano_aioFormals);
952+
SET_BODY(fun, CADDR(nano_aioFuncs));
953+
SET_CLOENV(fun, clo);
954+
R_MakeActiveBinding(nano_RawSymbol, fun, env);
968955
UNPROTECT(1);
969956
}
970-
PROTECT(datafun = Rf_allocSExp(CLOSXP));
971-
SET_FORMALS(datafun, nano_aioFormals);
972-
SET_BODY(datafun, CADR(nano_aioFuncs));
973-
SET_CLOENV(datafun, clo);
974-
R_MakeActiveBinding(nano_DataSymbol, datafun, env);
957+
PROTECT(fun = Rf_allocSExp(CLOSXP));
958+
SET_FORMALS(fun, nano_aioFormals);
959+
SET_BODY(fun, CADR(nano_aioFuncs));
960+
SET_CLOENV(fun, clo);
961+
R_MakeActiveBinding(nano_DataSymbol, fun, env);
975962
Rf_classgets(env, nano_recvAio);
976963

977964
UNPROTECT(4);

0 commit comments

Comments
 (0)