mirror of
				https://github.com/janet-lang/janet
				synced 2025-10-31 15:43:01 +00:00 
			
		
		
		
	Add marshal utilities for pointers.
This commit is contained in:
		| @@ -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 | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Calvin Rose
					Calvin Rose