@@ -235,6 +235,93 @@ SEXP rawToChar(const unsigned char *buf, const size_t sz) {
235235
236236}
237237
238+ void nano_serialize_old (nano_buf * buf , const SEXP object , SEXP hook ) {
239+
240+ NANO_ALLOC (buf , NANONEXT_INIT_BUFSIZE );
241+ const int reg = hook != R_NilValue ;
242+ int vec ;
243+
244+ vec = reg ? NANO_INTEGER (CADDDR (hook )) : 0 ;
245+ buf -> buf [0 ] = 0x7 ;
246+ buf -> buf [1 ] = (uint8_t ) vec ;
247+ buf -> buf [2 ] = special_bit ;
248+ buf -> cur += 16 ;
249+
250+ struct R_outpstream_st output_stream ;
251+
252+ R_InitOutPStream (
253+ & output_stream ,
254+ (R_pstream_data_t ) buf ,
255+ #ifdef WORDS_BIGENDIAN
256+ R_pstream_xdr_format ,
257+ #else
258+ R_pstream_binary_format ,
259+ #endif
260+ NANONEXT_SERIAL_VER ,
261+ NULL ,
262+ nano_write_bytes ,
263+ reg ? nano_inHook : NULL ,
264+ reg ? hook : R_NilValue
265+ );
266+
267+ R_Serialize (object , & output_stream );
268+
269+ if (reg && TAG (hook ) != R_NilValue ) {
270+ ((uint64_t * ) (buf -> buf ))[1 ] = (uint64_t ) buf -> cur ;
271+ SEXP call , out ;
272+
273+ if (vec ) {
274+
275+ PROTECT (call = Rf_lcons (CADR (hook ), Rf_cons (TAG (hook ), R_NilValue )));
276+ PROTECT (out = R_UnwindProtect (eval_safe , call , rl_reset , hook , NULL ));
277+ if (TYPEOF (out ) == RAWSXP ) {
278+ R_xlen_t xlen = XLENGTH (out );
279+ if (buf -> cur + xlen > buf -> len ) {
280+ buf -> len = buf -> cur + xlen ;
281+ buf -> buf = R_Realloc (buf -> buf , buf -> len , unsigned char );
282+ }
283+ memcpy (buf -> buf + buf -> cur , DATAPTR_RO (out ), xlen );
284+ buf -> cur += xlen ;
285+ }
286+ UNPROTECT (2 );
287+
288+ } else {
289+
290+ SEXP refList = TAG (hook );
291+ SEXP func = CADR (hook );
292+ R_xlen_t llen = Rf_xlength (refList );
293+ if (buf -> cur + sizeof (R_xlen_t ) > buf -> len ) {
294+ buf -> len = buf -> cur + NANONEXT_INIT_BUFSIZE ;
295+ buf -> buf = R_Realloc (buf -> buf , buf -> len , unsigned char );
296+ }
297+ memcpy (buf -> buf + buf -> cur , & llen , sizeof (R_xlen_t ));
298+ buf -> cur += sizeof (R_xlen_t );
299+
300+ for (R_xlen_t i = 0 ; i < llen ; i ++ ) {
301+ PROTECT (call = Rf_lcons (func , Rf_cons (NANO_VECTOR (refList )[i ], R_NilValue )));
302+ PROTECT (out = R_UnwindProtect (eval_safe , call , rl_reset , hook , NULL ));
303+ if (TYPEOF (out ) == RAWSXP ) {
304+ R_xlen_t xlen = XLENGTH (out );
305+ if (buf -> cur + xlen + sizeof (R_xlen_t ) > buf -> len ) {
306+ buf -> len = buf -> cur + xlen + sizeof (R_xlen_t );
307+ buf -> buf = R_Realloc (buf -> buf , buf -> len , unsigned char );
308+ }
309+ memcpy (buf -> buf + buf -> cur , & xlen , sizeof (R_xlen_t ));
310+ buf -> cur += sizeof (R_xlen_t );
311+ memcpy (buf -> buf + buf -> cur , DATAPTR_RO (out ), xlen );
312+ buf -> cur += xlen ;
313+ }
314+ UNPROTECT (2 );
315+ }
316+
317+ }
318+
319+ SET_TAG (hook , R_NilValue );
320+
321+ }
322+
323+ }
324+
238325void nano_serialize (nano_buf * buf , const SEXP object , SEXP hook ) {
239326
240327 NANO_ALLOC (buf , NANONEXT_INIT_BUFSIZE );
0 commit comments