From 26e61c573801f3fde32446c704b2c2b72da6fdc7 Mon Sep 17 00:00:00 2001 From: Helmut Eller Date: Sun, 23 Jun 2024 15:34:55 +0200 Subject: [PATCH 4/6] Remove struct Lisp_Objfwd * src/lisp.h (struct Lisp_Objfwd): Deleted. (struct Lisp_Fwd): Replace it with objvar field. (DEFVAR_LISP, DEFVAR_LISP_NOPRO, DEFVAR_LISP_NOPROX): Use the field. * src/lread.c (defvar_lisp): Updated as needed. * src/pdumper.c (dump_field_fwd): Use the field. * src/data.c (XOBJVAR): Renamed and updated from XOBJFWD. (do_symval_forwarding, store_symval_forwarding): Use it. --- src/data.c | 16 ++++++++-------- src/lisp.h | 53 +++++++++++++++++++++------------------------------ src/lread.c | 2 +- src/pdumper.c | 6 +++--- 4 files changed, 34 insertions(+), 43 deletions(-) diff --git a/src/data.c b/src/data.c index 292a2f2cf06..af4802f54a0 100644 --- a/src/data.c +++ b/src/data.c @@ -73,11 +73,11 @@ XINTVAR (lispfwd a) eassert (INTFWDP (a)); return a->u.intvar; } -static struct Lisp_Objfwd const * -XOBJFWD (lispfwd a) +static Lisp_Object * +XOBJVAR (lispfwd a) { eassert (OBJFWDP (a)); - return &a->u.objfwd; + return a->u.objvar; } static void @@ -1339,7 +1339,7 @@ do_symval_forwarding (lispfwd valcontents) return (*XBOOLVAR (valcontents) ? Qt : Qnil); case Lisp_Fwd_Obj: - return *XOBJFWD (valcontents)->objvar; + return *XOBJVAR (valcontents); case Lisp_Fwd_Buffer_Obj: return per_buffer_value (current_buffer, @@ -1428,16 +1428,16 @@ store_symval_forwarding (lispfwd valcontents, Lisp_Object newval, break; case Lisp_Fwd_Obj: - *XOBJFWD (valcontents)->objvar = newval; + *XOBJVAR (valcontents) = newval; /* If this variable is a default for something stored in the buffer itself, such as default-fill-column, find the buffers that don't have local values for it and update them. */ - if (XOBJFWD (valcontents)->objvar > (Lisp_Object *) &buffer_defaults - && XOBJFWD (valcontents)->objvar < (Lisp_Object *) (&buffer_defaults + 1)) + if (XOBJVAR (valcontents) > (Lisp_Object *) &buffer_defaults + && XOBJVAR (valcontents) < (Lisp_Object *) (&buffer_defaults + 1)) { - int offset = ((char *) XOBJFWD (valcontents)->objvar + int offset = ((char *) XOBJVAR (valcontents) - (char *) &buffer_defaults); int idx = PER_BUFFER_IDX (offset); diff --git a/src/lisp.h b/src/lisp.h index a31079ad4bd..d0eef3e4aa1 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -3115,15 +3115,6 @@ #define INT_TO_INTEGER(expr) \ (EXPR_SIGNED (expr) ? make_int (expr) : make_uint (expr)) -/* Forwarding pointer to a Lisp_Object variable. - This is allowed only in the value cell of a symbol, - and it means that the symbol's value really lives in the - specified variable. */ -struct Lisp_Objfwd - { - Lisp_Object *objvar; - }; - /* Like Lisp_Objfwd except that value lives in a slot in the current buffer. Value is byte index of slot within buffer. */ struct Lisp_Buffer_Objfwd @@ -3190,7 +3181,7 @@ #define INT_TO_INTEGER(expr) \ { intmax_t *intvar; bool *boolvar; - struct Lisp_Objfwd objfwd; + Lisp_Object *objvar; struct Lisp_Buffer_Objfwd bufobjfwd; struct Lisp_Kboard_Objfwd kboardobjfwd; } u; @@ -3571,37 +3562,37 @@ call0 (Lisp_Object fn) All C code uses the `cons_cells_consed' name. This is all done this way to support indirection for multi-threaded Emacs. */ -#define DEFVAR_LISP(lname, vname, doc) \ - do { \ - static struct Lisp_Fwd const o_fwd \ - = {Lisp_Fwd_Obj, .u.objfwd = {&globals.f_##vname}}; \ - defvar_lisp (&o_fwd, lname); \ +#define DEFVAR_LISP(lname, vname, doc) \ + do { \ + static struct Lisp_Fwd const o_fwd \ + = {Lisp_Fwd_Obj, .u.objvar = &globals.f_##vname}; \ + defvar_lisp (&o_fwd, lname); \ } while (false) #ifdef HAVE_MPS -#define DEFVAR_LISP_NOPRO(lname, vname, doc) \ - do { \ - static struct Lisp_Fwd const o_fwd \ - = {Lisp_Fwd_Obj, .u.objfwd = {&globals.f_##vname}}; \ - defvar_lisp (&o_fwd, lname); \ +#define DEFVAR_LISP_NOPRO(lname, vname, doc) \ + do { \ + static struct Lisp_Fwd const o_fwd \ + = {Lisp_Fwd_Obj, .u.objvar = &globals.f_##vname}; \ + defvar_lisp (&o_fwd, lname); \ } while (false) -#define DEFVAR_LISP_NOPROX(lname, vname, doc) \ - do { \ - static struct Lisp_Objfwd const o_fwd \ - = {Lisp_Fwd_Obj, &globals.f_##vname}; \ - defvar_lisp_nopro (&o_fwd, lname); \ +#define DEFVAR_LISP_NOPROX(lname, vname, doc) \ + do { \ + static struct Lisp_Fwd const o_fwd \ + = {Lisp_Fwd_Obj, .u.objvar = &globals.f_##vname}; \ + defvar_lisp_nopro (&o_fwd, lname); \ } while (false) #else #define DEFVAR_LISP_NOPRO(lname, vname, doc) \ do { \ static struct Lisp_Fwd const o_fwd \ - = {Lisp_Fwd_Obj, .u.objfwd = {&globals.f_##vname}}; \ + = {Lisp_Fwd_Obj, .u.objvar = &globals.f_##vname}; \ defvar_lisp_nopro (&o_fwd, lname); \ } while (false) -#define DEFVAR_LISP_NOPROX(lname, vname, doc) \ - do { \ - static struct Lisp_Objfwd const o_fwd \ - = {Lisp_Fwd_Obj, &globals.f_##vname}; \ - defvar_lisp_nopro (&o_fwd, lname); \ +#define DEFVAR_LISP_NOPROX(lname, vname, doc) \ + do { \ + static struct Lisp_Fwd const o_fwd \ + = {Lisp_Fwd_Obj, u.objvar = &globals.f_##vname}; \ + defvar_lisp_nopro (&o_fwd, lname); \ } while (false) #endif #define DEFVAR_BOOL(lname, vname, doc) \ diff --git a/src/lread.c b/src/lread.c index db3f520c020..188922516ea 100644 --- a/src/lread.c +++ b/src/lread.c @@ -5507,7 +5507,7 @@ defvar_lisp (struct Lisp_Fwd const *o_fwd, char const *namestring) { eassert (o_fwd->type == Lisp_Fwd_Obj); defvar_lisp_nopro (o_fwd, namestring); - staticpro (o_fwd->u.objfwd.objvar); + staticpro (o_fwd->u.objvar); } /* Similar but define a variable whose value is the Lisp Object stored diff --git a/src/pdumper.c b/src/pdumper.c index 7bb7ecc7a07..d975c65ed59 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -2379,10 +2379,10 @@ dump_field_fwd (struct dump_context *ctx, void *out, const void *in_start, return; case Lisp_Fwd_Obj: { - const struct Lisp_Objfwd *fwd = &(*in_field)->u.objfwd; - if (NILP (Fgethash (dump_off_to_lisp (emacs_offset (fwd->objvar)), + const Lisp_Object *objvar = (*in_field)->u.objvar; + if (NILP (Fgethash (dump_off_to_lisp (emacs_offset (objvar)), ctx->staticpro_table, Qnil))) - dump_emacs_reloc_to_lv (ctx, fwd->objvar, *fwd->objvar); + dump_emacs_reloc_to_lv (ctx, objvar, *objvar); } return; case Lisp_Fwd_Kboard_Obj: -- 2.39.2