From 7c66e438e1fd9e5002301a5088950eebd11cd075 Mon Sep 17 00:00:00 2001 From: "kr.angelov" Date: Sun, 9 Feb 2014 19:07:15 +0000 Subject: [PATCH] GuVariant is now plain uintptr_t instead of a structure to make it easier to write Haskell bindings --- src/runtime/c/gu/variant.c | 20 ++++++++++---------- src/runtime/c/gu/variant.h | 15 ++++----------- src/runtime/c/pgf/data.h | 2 +- 3 files changed, 15 insertions(+), 22 deletions(-) diff --git a/src/runtime/c/gu/variant.c b/src/runtime/c/gu/variant.c index 0a72eccdb..e4c5a342e 100644 --- a/src/runtime/c/gu/variant.c +++ b/src/runtime/c/gu/variant.c @@ -33,11 +33,11 @@ gu_alloc_variant(uint8_t tag, size_t size, uint8_t* alloc = gu_malloc_aligned(pool, align + size, align); alloc[align - 1] = tag; void* p = &alloc[align]; - variant_out->p = (uintptr_t)p; + *variant_out = (uintptr_t)p; return p; } void* p = gu_malloc_aligned(pool, size, align); - variant_out->p = ((uintptr_t)p) | (tag + 1); + *variant_out = ((uintptr_t)p) | (tag + 1); return p; } @@ -57,9 +57,9 @@ gu_variant_tag(GuVariant variant) if (gu_variant_is_null(variant)) { return GU_VARIANT_NULL; } - int u = variant.p % GU_VARIANT_ALIGNMENT; + int u = variant % GU_VARIANT_ALIGNMENT; if (u == 0) { - uint8_t* mem = (uint8_t*)variant.p; + uint8_t* mem = (uint8_t*)variant; return mem[-1]; } return u - 1; @@ -71,7 +71,7 @@ gu_variant_data(GuVariant variant) if (gu_variant_is_null(variant)) { return NULL; } - return (void*)gu_align_backward(variant.p, GU_VARIANT_ALIGNMENT); + return (void*)gu_align_backward(variant, GU_VARIANT_ALIGNMENT); } GuVariantInfo gu_variant_open(GuVariant variant) @@ -88,10 +88,10 @@ GuVariant gu_variant_close(GuVariantInfo info) GuVariant variant; if (((size_t)info.tag) > GU_VARIANT_ALIGNMENT - 2) { - variant.p = (uintptr_t)info.data; + variant = (uintptr_t)info.data; assert(gu_variant_tag(variant) == info.tag); } else { - variant.p = ((uintptr_t)info.data) | (info.tag + 1); + variant = ((uintptr_t)info.data) | (info.tag + 1); } return variant; @@ -100,12 +100,12 @@ GuVariant gu_variant_close(GuVariantInfo info) int gu_variant_intval(GuVariant variant) { - int u = variant.p % GU_VARIANT_ALIGNMENT; + int u = variant % GU_VARIANT_ALIGNMENT; if (u == 0) { - int* mem = (int*)variant.p; + int* mem = (int*)variant; return *mem; } - return (variant.p / GU_VARIANT_ALIGNMENT); + return (variant / GU_VARIANT_ALIGNMENT); } const GuVariant gu_null_variant = { (GuWord) NULL }; diff --git a/src/runtime/c/gu/variant.h b/src/runtime/c/gu/variant.h index 91665279d..bc9f45315 100644 --- a/src/runtime/c/gu/variant.h +++ b/src/runtime/c/gu/variant.h @@ -33,7 +33,7 @@ * @{ */ -typedef struct GuVariant GuVariant; +typedef uintptr_t GuVariant; void* gu_alloc_variant(uint8_t tag, @@ -84,32 +84,25 @@ struct GuVariantInfo { GuVariantInfo gu_variant_open(GuVariant variant); GuVariant gu_variant_close(GuVariantInfo info); -/** @privatesection */ -struct GuVariant { - uintptr_t p; - /**< @private */ -}; - /** @} */ static inline void* gu_variant_to_ptr(GuVariant variant) { - return (void*)variant.p; + return (void*) variant; } static inline GuVariant gu_variant_from_ptr(const void* p) { - GuVariant v = { (uintptr_t)p }; - return v; + return (uintptr_t) p; } extern const GuVariant gu_null_variant; static inline bool gu_variant_is_null(GuVariant v) { - return ((void*)v.p == NULL); + return ((void*)v == NULL); } diff --git a/src/runtime/c/pgf/data.h b/src/runtime/c/pgf/data.h index 6bfd5d334..6b1dd1780 100644 --- a/src/runtime/c/pgf/data.h +++ b/src/runtime/c/pgf/data.h @@ -159,7 +159,7 @@ typedef struct PgfItem PgfItem; typedef GuMap PgfCallbacksMap; extern GU_DECLARE_TYPE(PgfCallbacksMap, GuMap); -typedef struct GuVariant PgfSymbol; +typedef GuVariant PgfSymbol; typedef enum { PGF_SYMBOL_CAT,