@@ -62,7 +62,7 @@ static void nano_write_bytes(R_outpstream_t stream, void *src, int len) {
6262 Rf_error ("serialization exceeds max length of raw vector" );
6363 }
6464 do {
65- buf -> len = buf -> len * ( double ) ( buf -> len > 268435456 ? 1.2 : 2 ) ;
65+ buf -> len + = buf -> len > NANONEXT_SERIAL_THR ? NANONEXT_SERIAL_THR : buf -> len ;
6666 } while (buf -> len < req );
6767 buf -> buf = R_Realloc (buf -> buf , buf -> len , unsigned char );
6868 }
@@ -75,26 +75,12 @@ static void nano_write_bytes(R_outpstream_t stream, void *src, int len) {
7575static void nano_skip_bytes (R_outpstream_t stream , void * src , int len ) {
7676
7777 nano_buf * buf = (nano_buf * ) stream -> data ;
78- if (buf -> len <= NANONEXT_SERIAL_HEADERS ) {
78+ if (buf -> len < NANONEXT_INIT_BUFSIZE ) {
7979 buf -> len = -- buf -> len ? buf -> len : NANONEXT_INIT_BUFSIZE ;
80- return ;
81- }
82-
83- size_t req = buf -> cur + (size_t ) len ;
84- if (req > buf -> len ) {
85- if (req > R_XLEN_T_MAX ) {
86- if (buf -> len ) R_Free (buf -> buf );
87- Rf_error ("serialization exceeds max length of raw vector" );
88- }
89- do {
90- buf -> len = buf -> len * (double ) (buf -> len > 268435456 ? 1.2 : 2 );
91- } while (buf -> len < req );
92- buf -> buf = R_Realloc (buf -> buf , buf -> len , unsigned char );
80+ } else {
81+ nano_write_bytes (stream , src , len );
9382 }
9483
95- memcpy (buf -> buf + buf -> cur , src , len );
96- buf -> cur += len ;
97-
9884}
9985
10086static void nano_read_bytes (R_inpstream_t stream , void * dst , int len ) {
@@ -271,7 +257,7 @@ void nano_serialize_next(nano_buf *buf, const SEXP object) {
271257void nano_serialize_xdr (nano_buf * buf , const SEXP object , const int skip ) {
272258
273259 NANO_ALLOC (buf , NANONEXT_INIT_BUFSIZE );
274- buf -> len = skip ? NANONEXT_SERIAL_HEADERS : buf -> len ;
260+ if ( skip ) buf -> len = NANONEXT_SERIAL_HEADERS ;
275261
276262 struct R_outpstream_st output_stream ;
277263
@@ -1074,7 +1060,7 @@ SEXP rnng_recv(SEXP con, SEXP mode, SEXP block, SEXP bytes) {
10741060
10751061 xc = nng_recv (* sock , & buf , & sz , NNG_FLAG_ALLOC + (flags < 0 || * NANO_INTEGER (block ) != 1 ) * NNG_FLAG_NONBLOCK );
10761062 if (xc )
1077- return mk_error ( xc ) ;
1063+ goto exitlevel1 ;
10781064
10791065 res = nano_decode (buf , sz , mod );
10801066 nng_free (buf , sz );
@@ -1083,13 +1069,13 @@ SEXP rnng_recv(SEXP con, SEXP mode, SEXP block, SEXP bytes) {
10831069
10841070 nng_aio * aiop ;
10851071 if ((xc = nng_aio_alloc (& aiop , NULL , NULL )))
1086- return mk_error ( xc ) ;
1072+ goto exitlevel1 ;
10871073 nng_aio_set_timeout (aiop , flags );
10881074 nng_recv_aio (* sock , aiop );
10891075 nng_aio_wait (aiop );
10901076 if ((xc = nng_aio_result (aiop ))) {
10911077 nng_aio_free (aiop );
1092- return mk_error ( xc ) ;
1078+ goto exitlevel1 ;
10931079 }
10941080 nng_msg * msgp = nng_aio_get_msg (aiop );
10951081 nng_aio_free (aiop );
@@ -1110,14 +1096,14 @@ SEXP rnng_recv(SEXP con, SEXP mode, SEXP block, SEXP bytes) {
11101096 nng_aio * aiop ;
11111097
11121098 if ((xc = nng_aio_alloc (& aiop , NULL , NULL )))
1113- return mk_error ( xc ) ;
1099+ goto exitlevel1 ;
11141100 nng_aio_set_timeout (aiop , flags < 0 ? 0 : flags > 0 ? flags : (* NANO_INTEGER (block ) == 1 ) * NNG_DURATION_DEFAULT );
11151101 nng_ctx_recv (* ctxp , aiop );
11161102
11171103 nng_aio_wait (aiop );
11181104 if ((xc = nng_aio_result (aiop ))) {
11191105 nng_aio_free (aiop );
1120- return mk_error ( xc ) ;
1106+ goto exitlevel1 ;
11211107 }
11221108
11231109 msgp = nng_aio_get_msg (aiop );
@@ -1133,7 +1119,7 @@ SEXP rnng_recv(SEXP con, SEXP mode, SEXP block, SEXP bytes) {
11331119
11341120 xc = nng_ctx_recvmsg (* ctxp , & msgp , (flags < 0 || * NANO_INTEGER (block ) != 1 ) * NNG_FLAG_NONBLOCK );
11351121 if (xc )
1136- return mk_error ( xc ) ;
1122+ goto exitlevel1 ;
11371123
11381124 buf = nng_msg_body (msgp );
11391125 sz = nng_msg_len (msgp );
@@ -1145,14 +1131,14 @@ SEXP rnng_recv(SEXP con, SEXP mode, SEXP block, SEXP bytes) {
11451131 nng_aio * aiop ;
11461132
11471133 if ((xc = nng_aio_alloc (& aiop , NULL , NULL )))
1148- return mk_error ( xc ) ;
1134+ goto exitlevel1 ;
11491135 nng_aio_set_timeout (aiop , flags );
11501136 nng_ctx_recv (* ctxp , aiop );
11511137
11521138 nng_aio_wait (aiop );
11531139 if ((xc = nng_aio_result (aiop ))) {
11541140 nng_aio_free (aiop );
1155- return mk_error ( xc ) ;
1141+ goto exitlevel1 ;
11561142 }
11571143
11581144 msgp = nng_aio_get_msg (aiop );
@@ -1179,11 +1165,11 @@ SEXP rnng_recv(SEXP con, SEXP mode, SEXP block, SEXP bytes) {
11791165 iov .iov_buf = buf ;
11801166
11811167 if ((xc = nng_aio_alloc (& aiop , NULL , NULL )))
1182- goto exitlevel1 ;
1168+ goto exitlevel2 ;
11831169
11841170 if ((xc = nng_aio_set_iov (aiop , 1u , & iov ))) {
11851171 nng_aio_free (aiop );
1186- goto exitlevel1 ;
1172+ goto exitlevel2 ;
11871173 }
11881174
11891175 nng_aio_set_timeout (aiop , flags ? flags : (* NANO_INTEGER (block ) != 0 ) * NNG_DURATION_DEFAULT );
@@ -1192,7 +1178,7 @@ SEXP rnng_recv(SEXP con, SEXP mode, SEXP block, SEXP bytes) {
11921178 nng_aio_wait (aiop );
11931179 if ((xc = nng_aio_result (aiop ))) {
11941180 nng_aio_free (aiop );
1195- goto exitlevel1 ;
1181+ goto exitlevel2 ;
11961182 }
11971183
11981184 sz = nng_aio_count (aiop );
@@ -1206,8 +1192,9 @@ SEXP rnng_recv(SEXP con, SEXP mode, SEXP block, SEXP bytes) {
12061192
12071193 return res ;
12081194
1209- exitlevel1 :
1195+ exitlevel2 :
12101196 R_Free (buf );
1197+ exitlevel1 :
12111198 return mk_error (xc );
12121199
12131200}
0 commit comments