]> git.eshelyaron.com Git - emacs.git/commitdiff
Adding binding pseudovector
authorAndrea Corallo <akrl@sdf.org>
Thu, 7 May 2020 18:50:37 +0000 (19:50 +0100)
committerAndrea Corallo <akrl@sdf.org>
Fri, 8 May 2020 13:30:12 +0000 (14:30 +0100)
src/lexspaces.c
src/lisp.h

index ed15a507f4d3437b17b38d1f45b27db5187f0458..feb0adfdaef05d7ce6b022981dc788c11791769d 100644 (file)
@@ -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.  */);
index 58ea559b281ad265cad25eb11794e68d11409bc0..15b1f8db9ca3947db8a4f09aa7fc6d2055ae0951 100644 (file)
@@ -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;
+
 \f
 /* 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 ();
 }
 
+\f
+/* 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 */