void pony_serialise(pony_ctx_t* ctx, void* p, void* out) { // This can raise an error. assert(ctx->stack == NULL); ctx->trace_object = ponyint_serialise_object; ctx->trace_actor = ponyint_serialise_actor; ctx->serialise_size = 0; pony_traceunknown(ctx, p, PONY_TRACE_MUTABLE); ponyint_gc_handlestack(ctx); ponyint_array_t* r = (ponyint_array_t*)out; r->size = ctx->serialise_size; r->alloc = r->size; r->ptr = (char*)ponyint_pool_alloc_size(r->size); size_t i = HASHMAP_BEGIN; serialise_t* s; while((s = ponyint_serialise_next(&ctx->serialise, &i)) != NULL) { if(s->t != NULL) s->t->serialise(ctx, (void*)s->key, r->ptr, s->value, s->mutability); } ctx->serialise_size = 0; ponyint_serialise_destroy(&ctx->serialise); }
void* pony_deserialise(pony_ctx_t* ctx, void* in) { // This can raise an error. ponyint_array_t* r = (ponyint_array_t*)in; ctx->serialise_buffer = r->ptr; ctx->serialise_size = r->size; void* object = pony_deserialise_offset(ctx, NULL, 0); ponyint_gc_handlestack(ctx); ctx->serialise_size = 0; ponyint_serialise_destroy(&ctx->serialise); return object; }
static void serialise_cleanup(pony_ctx_t* ctx) { ponyint_gc_discardstack(ctx); ctx->serialise_size = 0; ponyint_serialise_destroy(&ctx->serialise); }