From 8bde5c7018fde91cc7140777107bacfb3febb170 Mon Sep 17 00:00:00 2001 From: David Thompson Date: Sun, 28 Feb 2016 16:11:35 -0500 Subject: [PATCH] struct: Add support for unboxed signed integers and doubles. * libguile/struct.c (scm_make_struct_layout): Enable 'i' and 'd' cases. (scm_is_valid_vtable_layout): Add 'i' and 'd' cases. (scm_struct_init): Initialize signed integer and double fields. (scm_struct_ref): Enable 'i' and 'd' cases. Update 'd' case to use scm_from_double instead of obsolete scm_make_real. (scm_struct_set_x): Enable 'i' and 'd' cases. Update 'd' case to use SCM_NUM2DOUBLE instead of obsolete scm_num2dbl. --- libguile/struct.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/libguile/struct.c b/libguile/struct.c index 8bfbcf4..c50019c 100644 --- a/libguile/struct.c +++ b/libguile/struct.c @@ -100,10 +100,8 @@ SCM_DEFINE (scm_make_struct_layout, "make-struct-layout", 1, 0, 0, { case 'u': case 'p': -#if 0 case 'i': case 'd': -#endif case 's': break; default: @@ -219,6 +217,8 @@ scm_is_valid_vtable_layout (SCM layout) switch (c_layout[n]) { case 'u': + case 'i': + case 'd': case 'p': case 's': switch (c_layout[n+1]) @@ -360,6 +360,26 @@ scm_struct_init (SCM handle, SCM layout, size_t n_tail, } break; + case 'i': + if ((prot != 'r' && prot != 'w') || inits_idx == n_inits) + *mem = 0; + else + { + *mem = scm_to_long (SCM_PACK (inits[inits_idx])); + inits_idx++; + } + break; + + case 'd': + if ((prot != 'r' && prot != 'w') || inits_idx == n_inits) + *mem = 0.0; + else + { + *((double *) mem) = scm_to_double (SCM_PACK (inits[inits_idx])); + inits_idx++; + } + break; + case 'p': if ((prot != 'r' && prot != 'w') || inits_idx == n_inits) *mem = SCM_UNPACK (SCM_BOOL_F); @@ -761,15 +781,13 @@ SCM_DEFINE (scm_struct_ref, "struct-ref", 2, 0, 0, answer = scm_from_ulong (data[p]); break; -#if 0 case 'i': answer = scm_from_long (data[p]); break; case 'd': - answer = scm_make_real (*((double *)&(data[p]))); + answer = scm_from_double (*((double *)&(data[p]))); break; -#endif case 's': case 'p': @@ -844,15 +862,13 @@ SCM_DEFINE (scm_struct_set_x, "struct-set!", 3, 0, 0, data[p] = SCM_NUM2ULONG (3, val); break; -#if 0 case 'i': data[p] = SCM_NUM2LONG (3, val); break; case 'd': - *((double *)&(data[p])) = scm_num2dbl (val, (char *)SCM_ARG3); + *((double *)&(data[p])) = SCM_NUM2DOUBLE (3, val); break; -#endif case 'p': data[p] = SCM_UNPACK (val); -- 2.6.3