From 5809edef40acf1f8f0e71b69dcb10e1d5464f2a5 Mon Sep 17 00:00:00 2001 From: Justus Winter Date: Mon, 30 Jan 2017 15:51:19 +0100 Subject: gpgscm: Use a compact vector representation. * tests/gpgscm/scheme-private.h (struct cell): Add a compact vector representation. * tests/gpgscm/scheme.c (vector_length): Use new representation. (vector_size): New macro. (get_vector_object): Use the new representation. (fill_vector): Likewise. (vector_elem): Likewise. (set_vector_elem): Likewise. (mark): Likewise. (gc): Likewise. Be careful not to confuse immediate values for type flags. (finalize_cell): Vectors now require finalization. -- Previously, vectors were represented using consecutive cons cells, wasting one word per cell for the type information. Fix that by using a flat array. Previously, a vector of size N required 1 + (n + 1) / 2 cells. Now it uses 1 + (n - 1 + 2) / 3 cells. Signed-off-by: Justus Winter --- scheme-private.h | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'scheme-private.h') diff --git a/scheme-private.h b/scheme-private.h index aba2319..ad8f571 100644 --- a/scheme-private.h +++ b/scheme-private.h @@ -55,6 +55,10 @@ struct cell { struct cell *_car; struct cell *_cdr; } _cons; + struct { + size_t _length; + pointer _elements[0]; + } _vector; struct { char *_data; const foreign_object_vtable *_vtable; -- cgit v1.2.3