diff --git a/src/core/ev.c b/src/core/ev.c index 28585d9f..17fe442e 100644 --- a/src/core/ev.c +++ b/src/core/ev.c @@ -401,7 +401,7 @@ static void janet_stream_marshal(void *p, JanetMarshalContext *ctx) { } janet_marshal_abstract(ctx, p); janet_marshal_int(ctx, (int32_t) s->flags); - janet_marshal_int64(ctx, (intptr_t) s->methods); + janet_marshal_ptr(ctx, s->methods); #ifdef JANET_WINDOWS /* TODO - ref counting to avoid situation where a handle is closed or GCed * while in transit, and it's value gets reused. DuplicateHandle does not work @@ -438,7 +438,7 @@ static void *janet_stream_unmarshal(JanetMarshalContext *ctx) { p->_mask = 0; p->state = NULL; p->flags = (uint32_t) janet_unmarshal_int(ctx); - p->methods = (void *) janet_unmarshal_int64(ctx); + p->methods = janet_unmarshal_ptr(ctx); #ifdef JANET_WINDOWS p->handle = (JanetHandle) janet_unmarshal_int64(ctx); #else diff --git a/src/core/marsh.c b/src/core/marsh.c index becab902..7e3e1db7 100644 --- a/src/core/marsh.c +++ b/src/core/marsh.c @@ -362,6 +362,15 @@ void janet_marshal_int(JanetMarshalContext *ctx, int32_t value) { pushint(st, value); } +/* Only use in unsafe - don't marshal pointers otherwise */ +void janet_marshal_ptr(JanetMarshalContext *ctx, const void *ptr) { + if (sizeof(ptr) == sizeof(int64_t)) { + janet_marshal_int64(ctx, (intptr_t) ptr); + } else { + janet_marshal_int(ctx, (intptr_t) ptr); + } +} + void janet_marshal_byte(JanetMarshalContext *ctx, uint8_t value) { MarshalState *st = (MarshalState *)(ctx->m_state); pushbyte(st, value); @@ -1165,6 +1174,15 @@ int64_t janet_unmarshal_int64(JanetMarshalContext *ctx) { return read64(st, &(ctx->data)); } +void *janet_unmarshal_ptr(JanetMarshalContext *ctx) { + UnmarshalState *st = (UnmarshalState *)(ctx->u_state); + if (sizeof(int64_t) == sizeof(void *)) { + return (void *) ((intptr_t) read64(st, &(ctx->data))); + } else { + return (void *) ((intptr_t) readint(st, &(ctx->data))); + } +} + uint8_t janet_unmarshal_byte(JanetMarshalContext *ctx) { UnmarshalState *st = (UnmarshalState *)(ctx->u_state); MARSH_EOS(st, ctx->data); diff --git a/src/include/janet.h b/src/include/janet.h index 3f6b8982..34cfa06a 100644 --- a/src/include/janet.h +++ b/src/include/janet.h @@ -2053,6 +2053,7 @@ JANET_API int janet_cryptorand(uint8_t *out, size_t n); JANET_API void janet_marshal_size(JanetMarshalContext *ctx, size_t value); JANET_API void janet_marshal_int(JanetMarshalContext *ctx, int32_t value); JANET_API void janet_marshal_int64(JanetMarshalContext *ctx, int64_t value); +JANET_API void janet_marshal_ptr(JanetMarshalContext *ctx, const void *value); JANET_API void janet_marshal_byte(JanetMarshalContext *ctx, uint8_t value); JANET_API void janet_marshal_bytes(JanetMarshalContext *ctx, const uint8_t *bytes, size_t len); JANET_API void janet_marshal_janet(JanetMarshalContext *ctx, Janet x); @@ -2062,6 +2063,7 @@ JANET_API void janet_unmarshal_ensure(JanetMarshalContext *ctx, size_t size); JANET_API size_t janet_unmarshal_size(JanetMarshalContext *ctx); JANET_API int32_t janet_unmarshal_int(JanetMarshalContext *ctx); JANET_API int64_t janet_unmarshal_int64(JanetMarshalContext *ctx); +JANET_API void *janet_unmarshal_ptr(JanetMarshalContext *ctx); JANET_API uint8_t janet_unmarshal_byte(JanetMarshalContext *ctx); JANET_API void janet_unmarshal_bytes(JanetMarshalContext *ctx, uint8_t *dest, size_t len); JANET_API Janet janet_unmarshal_janet(JanetMarshalContext *ctx);