From 67e28d9f1060fd41c2e187e017b26a2d474b6075 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Thu, 7 May 2020 19:50:37 +0100 Subject: [PATCH] Adding binding pseudovector --- src/lexspaces.c | 2 ++ src/lisp.h | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/src/lexspaces.c b/src/lexspaces.c index ed15a507f4d..feb0adfdaef 100644 --- a/src/lexspaces.c +++ b/src/lexspaces.c @@ -31,6 +31,8 @@ DEFUN ("in-lexspace", Fin_lexspace, Sin_lexspace, 1, 1, 0, void syms_of_lexspaces (void) { + DEFSYM (Qbinding, "binding"); + DEFSYM (Qel, "el"); DEFVAR_LISP ("current-lexspace-name", Vcurrent_lexspace_name, doc: /* Internal use. */); diff --git a/src/lisp.h b/src/lisp.h index 58ea559b281..15b1f8db9ca 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -786,6 +786,7 @@ INLINE void Lisp_Intfwd, etc.). The pointer is packaged inside a struct to help static checking. */ typedef struct { void const *fwdptr; } lispfwd; + /* Interned state of a symbol. */ @@ -1103,6 +1104,7 @@ enum pvec_type PVEC_MUTEX, PVEC_CONDVAR, PVEC_MODULE_FUNCTION, + PVEC_BINDING, /* These should be last, for internal_equal and sxhash_obj. */ PVEC_COMPILED, @@ -2936,6 +2938,12 @@ RECORDP (Lisp_Object a) return PSEUDOVECTORP (a, PVEC_RECORD); } +INLINE bool +BINDINGP (Lisp_Object a) +{ + return PSEUDOVECTORP (a, PVEC_BINDING); +} + INLINE void CHECK_RECORD (Lisp_Object x) { @@ -5035,6 +5043,41 @@ maybe_gc (void) maybe_garbage_collect (); } + +/* Lexspaces and binding. */ + +#define MAX_LEXSPACES 256 + +struct Lisp_Binding +{ + union vectorlike_header header; + Lisp_Object b[MAX_LEXSPACES]; +}; + +INLINE void +CHECK_BINDING (Lisp_Object b) +{ + CHECK_TYPE (BINDINGP (b), Qbinding, b); +} + +INLINE struct Lisp_Binding * +XBINDING (Lisp_Object b) +{ + eassert (BINDINGP (b)); + return XUNTAG (b, Lisp_Vectorlike, struct Lisp_Binding); +} + +INLINE Lisp_Object +make_binding (void) +{ + struct Lisp_Binding *binding = + ALLOCATE_ZEROED_PSEUDOVECTOR (struct Lisp_Binding, + b[MAX_LEXSPACES], PVEC_BINDING); + for (EMACS_INT i = 0; i < MAX_LEXSPACES; i++) + binding->b[i] = Qunbound; + return make_lisp_ptr (binding, Lisp_Vectorlike); +} + INLINE_HEADER_END #endif /* EMACS_LISP_H */ -- 2.39.5