aboutsummaryrefslogtreecommitdiffstats
path: root/scheme-private.h
diff options
context:
space:
mode:
authorJustus Winter <[email protected]>2017-01-30 14:51:19 +0000
committerJustus Winter <[email protected]>2017-01-30 17:21:24 +0000
commit5809edef40acf1f8f0e71b69dcb10e1d5464f2a5 (patch)
treefe0145b8449cfc9dee55558f64c53809a6a7811a /scheme-private.h
parentgpgscm: Provide framework for immediate values. (diff)
downloadlibgpg-error-5809edef40acf1f8f0e71b69dcb10e1d5464f2a5.tar.gz
libgpg-error-5809edef40acf1f8f0e71b69dcb10e1d5464f2a5.zip
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 <[email protected]>
Diffstat (limited to '')
-rw-r--r--scheme-private.h4
1 files changed, 4 insertions, 0 deletions
diff --git a/scheme-private.h b/scheme-private.h
index aba2319..ad8f571 100644
--- a/scheme-private.h
+++ b/scheme-private.h
@@ -56,6 +56,10 @@ struct cell {
struct cell *_cdr;
} _cons;
struct {
+ size_t _length;
+ pointer _elements[0];
+ } _vector;
+ struct {
char *_data;
const foreign_object_vtable *_vtable;
} _foreign_object;