@@ -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