@@ -235,6 +235,94 @@ 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+ const uint64_t cursor = (uint64_t ) buf -> cur ;
271+ memcpy (buf -> buf + 8 , & cursor , sizeof (uint64_t ));
272+ SEXP call , out ;
273+
274+ if (vec ) {
275+
276+ PROTECT (call = Rf_lcons (CADR (hook ), Rf_cons (TAG (hook ), R_NilValue )));
277+ PROTECT (out = R_UnwindProtect (eval_safe , call , rl_reset , hook , NULL ));
278+ if (TYPEOF (out ) == RAWSXP ) {
279+ R_xlen_t xlen = XLENGTH (out );
280+ if (buf -> cur + xlen > buf -> len ) {
281+ buf -> len = buf -> cur + xlen ;
282+ buf -> buf = R_Realloc (buf -> buf , buf -> len , unsigned char );
283+ }
284+ memcpy (buf -> buf + buf -> cur , DATAPTR_RO (out ), xlen );
285+ buf -> cur += xlen ;
286+ }
287+ UNPROTECT (2 );
288+
289+ } else {
290+
291+ SEXP refList = TAG (hook );
292+ SEXP func = CADR (hook );
293+ R_xlen_t llen = Rf_xlength (refList );
294+ if (buf -> cur + sizeof (R_xlen_t ) > buf -> len ) {
295+ buf -> len = buf -> cur + NANONEXT_INIT_BUFSIZE ;
296+ buf -> buf = R_Realloc (buf -> buf , buf -> len , unsigned char );
297+ }
298+ memcpy (buf -> buf + buf -> cur , & llen , sizeof (R_xlen_t ));
299+ buf -> cur += sizeof (R_xlen_t );
300+
301+ for (R_xlen_t i = 0 ; i < llen ; i ++ ) {
302+ PROTECT (call = Rf_lcons (func , Rf_cons (NANO_VECTOR (refList )[i ], R_NilValue )));
303+ PROTECT (out = R_UnwindProtect (eval_safe , call , rl_reset , hook , NULL ));
304+ if (TYPEOF (out ) == RAWSXP ) {
305+ R_xlen_t xlen = XLENGTH (out );
306+ if (buf -> cur + xlen + sizeof (R_xlen_t ) > buf -> len ) {
307+ buf -> len = buf -> cur + xlen + sizeof (R_xlen_t );
308+ buf -> buf = R_Realloc (buf -> buf , buf -> len , unsigned char );
309+ }
310+ memcpy (buf -> buf + buf -> cur , & xlen , sizeof (R_xlen_t ));
311+ buf -> cur += sizeof (R_xlen_t );
312+ memcpy (buf -> buf + buf -> cur , DATAPTR_RO (out ), xlen );
313+ buf -> cur += xlen ;
314+ }
315+ UNPROTECT (2 );
316+ }
317+
318+ }
319+
320+ SET_TAG (hook , R_NilValue );
321+
322+ }
323+
324+ }
325+
238326void nano_serialize (nano_buf * buf , const SEXP object , SEXP hook ) {
239327
240328 NANO_ALLOC (buf , NANONEXT_INIT_BUFSIZE );
0 commit comments