@@ -99,19 +99,24 @@ SEXP rawOneString(unsigned char *bytes, R_xlen_t nbytes, R_xlen_t *np) {
9999
100100SEXP nano_decode (unsigned char * buf , const size_t sz , const int mod , const int kpr ) {
101101
102- int p = 0 , tryErr = 0 ;
102+ int tryErr = 0 ;
103103 SEXP raw , data ;
104104
105105 switch (mod ) {
106106 case 1 :
107- PROTECT (raw = Rf_allocVector (RAWSXP , sz )); p ++ ;
107+ PROTECT (raw = Rf_allocVector (RAWSXP , sz ));
108108 memcpy (RAW (raw ), buf , sz );
109109 SEXP expr ;
110- PROTECT (expr = Rf_lang2 (nano_UnserSymbol , raw )); p ++ ;
111- PROTECT (data = R_tryEval (expr , R_BaseEnv , & tryErr )); p ++ ;
110+ PROTECT (expr = Rf_lang2 (nano_UnserSymbol , raw ));
111+ data = R_tryEval (expr , R_BaseEnv , & tryErr );
112+ UNPROTECT (1 );
113+ if (tryErr ) {
114+ data = raw ;
115+ raw = R_NilValue ;
116+ }
112117 break ;
113118 case 2 :
114- PROTECT (data = Rf_allocVector (STRSXP , sz )); p ++ ;
119+ PROTECT (data = Rf_allocVector (STRSXP , sz ));
115120 R_xlen_t i , m , nbytes = sz , np = 0 ;
116121 for (i = 0 , m = 0 ; i < sz ; i ++ ) {
117122 SEXP onechar = rawOneString (buf , nbytes , & np );
@@ -122,63 +127,56 @@ SEXP nano_decode(unsigned char *buf, const size_t sz, const int mod, const int k
122127 SETLENGTH (data , m );
123128 break ;
124129 case 3 :
125- PROTECT (data = Rf_allocVector (CPLXSXP , sz / (sizeof (double ) * 2 ))); p ++ ;
130+ PROTECT (data = Rf_allocVector (CPLXSXP , sz / (sizeof (double ) * 2 )));
126131 memcpy (COMPLEX (data ), buf , sz );
127132 break ;
128133 case 4 :
129- PROTECT (data = Rf_allocVector (REALSXP , sz / sizeof (double ))); p ++ ;
134+ PROTECT (data = Rf_allocVector (REALSXP , sz / sizeof (double )));
130135 memcpy (REAL (data ), buf , sz );
131136 break ;
132137 case 5 :
133- PROTECT (data = Rf_allocVector (INTSXP , sz / sizeof (int ))); p ++ ;
138+ PROTECT (data = Rf_allocVector (INTSXP , sz / sizeof (int )));
134139 memcpy (INTEGER (data ), buf , sz );
135140 break ;
136141 case 6 :
137- PROTECT (data = Rf_allocVector (LGLSXP , sz / sizeof (int ))); p ++ ;
142+ PROTECT (data = Rf_allocVector (LGLSXP , sz / sizeof (int )));
138143 memcpy (LOGICAL (data ), buf , sz );
139144 break ;
140145 case 7 :
141- PROTECT (data = Rf_allocVector (REALSXP , sz / sizeof (double ))); p ++ ;
146+ PROTECT (data = Rf_allocVector (REALSXP , sz / sizeof (double )));
142147 memcpy (REAL (data ), buf , sz );
143148 break ;
144149 case 8 :
145- PROTECT (data = Rf_allocVector (RAWSXP , sz )); p ++ ;
150+ PROTECT (data = Rf_allocVector (RAWSXP , sz ));
146151 memcpy (RAW (data ), buf , sz );
147152 break ;
148153 default :
149- PROTECT (data = R_NilValue ); p ++ ;
150- break ;
154+ PROTECT (data = R_NilValue );
151155 }
152156
153157 if (kpr ) {
154-
155158 SEXP out ;
156159 const char * names [] = {"raw" , "data" , "" };
157-
158160 switch (mod ) {
159161 case 1 :
160- if (tryErr ) {
161- PROTECT (data = raw ); p ++ ;
162- PROTECT (raw = R_NilValue ); p ++ ;
163- }
162+ PROTECT (data );
164163 break ;
165164 case 8 :
166- PROTECT (raw = data ); p ++ ;
165+ PROTECT (raw = data );
167166 break ;
168167 default :
169- PROTECT (raw = Rf_allocVector (RAWSXP , sz )); p ++ ;
168+ PROTECT (raw = Rf_allocVector (RAWSXP , sz ));
170169 memcpy (RAW (raw ), buf , sz );
171170 }
172-
173- PROTECT (out = Rf_mkNamed (VECSXP , names )); p ++ ;
171+ PROTECT (out = Rf_mkNamed (VECSXP , names ));
174172 SET_VECTOR_ELT (out , 0 , raw );
175173 SET_VECTOR_ELT (out , 1 , data );
176174
177- UNPROTECT (p );
175+ UNPROTECT (3 );
178176 return out ;
179177 }
180178
181- UNPROTECT (p );
179+ UNPROTECT (1 );
182180 return data ;
183181
184182}
@@ -741,7 +739,7 @@ SEXP rnng_stream_send(SEXP stream, SEXP data, SEXP timeout) {
741739 const R_xlen_t xlen = Rf_xlength (enc );
742740 unsigned char * dp = RAW (enc );
743741
744- const int frames = LOGICAL (Rf_getAttrib (stream , nano_TextframesSymbol ))[ 0 ] ;
742+ const int frames = * LOGICAL (Rf_getAttrib (stream , nano_TextframesSymbol ));
745743 iov .iov_len = frames == 1 ? xlen - 1 : xlen ;
746744 iov .iov_buf = dp ;
747745
@@ -781,7 +779,6 @@ SEXP rnng_stream_recv(SEXP stream, SEXP mode, SEXP timeout, SEXP keep, SEXP byte
781779 int xc ;
782780 nng_iov iov ;
783781 nng_aio * aiop ;
784- size_t sz ;
785782 SEXP res ;
786783
787784 iov .iov_len = xlen ;
@@ -811,8 +808,7 @@ SEXP rnng_stream_recv(SEXP stream, SEXP mode, SEXP timeout, SEXP keep, SEXP byte
811808 return mk_error (xc );
812809 }
813810
814- sz = nng_aio_count (aiop );
815- res = nano_decode (iov .iov_buf , sz , mod , kpr );
811+ res = nano_decode (iov .iov_buf , nng_aio_count (aiop ), mod , kpr );
816812 nng_aio_free (aiop );
817813 R_Free (iov .iov_buf );
818814
0 commit comments