Subject: bug#78637: 30.1.90; Calling setopt during init loads cus-start over and over

From: Eli Zaretskii <[email-masked]>
Date: Sat, 31 May 2025 20:23:39 +0300

> Cc: [email-masked], [email-masked]
> Date: Sat, 31 May 2025 11:17:04 -0400
> From:  Stefan Monnier via "Bug reports for GNU Emacs,
>  the Swiss army knife of text editors" <[email-masked]>
> 
> > While trying to improve Emacs startup time at my site, I noticed that
> > cus-start was being loaded repeatedly, each time setopt was called.
> 
> I don't see this, but I do see `cus-start` being (re)loaded when the
> first `setopt` is executed.
> 
> This comes from the weird conditional below:
> 
>     (unless dump-mode
>       (provide 'cus-start))
> 
> This dates back to
> 
>     commit 4883633e7b4416a0da1a63bc7fd0c4081bdc7837
>     Author: Richard M. Stallman <[email-masked]>
>     Date:   Sat May 31 00:54:10 1997 +0000
>     
>         Arrange to load it once during dumping,
>         and again if needed by cus-edit.el.
>         (custom-start-quote): Don't define as separate function.
>         (load-path): Improve the :type.
>         (delete-exited-processes): Fix group to processes-basics.
> 
> I have no idea why, but it's not a new problem.
> 
> Maybe the repeated-loading you're seeing is due to `dump-mode` being
> non-nil in your Emacs build?  If that's the case, do you have any idea
> why that would be the case (it's rather unusual).

No dump-mode is nil at this stage.

I think I'm beginning to understand why this happens: somehow loading
cus-start signals an error, so we never get to the provide part.
E.g., if I change the init file to say this:

  (setq force-load-messages t)
  (require 'cus-start)
  (dotimes (_ 25)
    (setopt make-backup-files nil))

then starting "emacs" shows the *Warnings* buffer with this text:

  Wrong type argument: listp, t

  To ensure normal operation, you should investigate and remove the
  cause of the error in your initialization file.  Start Emacs with
  the ‘--debug-init’ option to view a complete error backtrace.

I also see that wrong-type-argument error signaled if I run the recipe
under GDB with a breakpoint on Fsignal.  The backtrace is below, if it
helps.  It seems Emacs is trying to do the equivalent of

  (member transient-mark-mode t)

But I cannot figure out which part of cus-start causes this.  Any
ideas?

Here's the backtrace from the error Emacs signals and some additional
data from snooping around:

  (gdb) bt
  #0  Fsignal (error_symbol=85536, data=-4611686018187727616) at eval.c:1820
  #1  0x00955a95 in xsignal (error_symbol=85536, data=-4611686018187727616)
      at lisp.h:4845
  #2  0x0095bb1a in xsignal2 (error_symbol=85536, arg1=49488, arg2=48)
      at eval.c:1988
  #3  0x0092e545 in wrong_type_argument (predicate=49488, value=48) at data.c:135
  #4  0x00967a07 in CHECK_LIST_END (x=48, y=48) at lisp.h:3368
  #5  0x0096eef5 in Fmemq (elt=138077904, list=48) at fns.c:1923
  #6  0x0096ebeb in Fmember (elt=138077904, list=48) at fns.c:1905
  #7  0x009d14c6 in exec_byte_code (fun=-6917529027483966176,
      args_template=1026, nargs=3, args=0xa020440) at bytecode.c:1604
  #8  0x009cc8d7 in Fbyte_code (bytestr=-9223372036650939888,
      vector=-6917529027437457712, maxdepth=4611686018427387933)
      at bytecode.c:329
  #9  0x0095dff5 in eval_sub (form=-4611686018187654016) at eval.c:2604
  #10 0x009afade in readevalloop (readcharfun=37056, infile0=0x628cb04,
      sourcename=-9223372036650939824, printflag=false, unibyte=0, readfun=0,
      start=0, end=0) at lread.c:2543
  #11 0x009acdba in Fload (file=-9223372036698239704, noerror=0, nomessage=48,
      nosuffix=0, must_suffix=48) at lread.c:1731
  #12 0x009ad1c0 in save_match_data_load (file=-9223372036698239704, noerror=0,
      nomessage=48, nosuffix=0, must_suffix=48) at lread.c:1783
  #13 0x0095d0c9 in load_with_autoload_queue (file=-9223372036698239704,
      noerror=0, nomessage=48, nosuffix=0, must_suffix=48) at eval.c:2382
  #14 0x00977eb5 in Frequire (feature=138111896, filename=0, noerror=0)
      at fns.c:3771
  #15 0x009600d3 in funcall_subr (subr=0x105bc40 <Srequire>, numargs=1,
      args=0xa020320) at eval.c:3165
  #16 0x009cd90d in exec_byte_code (fun=-6917529027484546136, args_template=257,
      nargs=1, args=0xa0202e0) at bytecode.c:812
  #17 0x0096094f in funcall_lambda (fun=-6917529027438039424, nargs=2,
      arg_vector=0x628d470) at eval.c:3252
  #18 0x0096076a in apply_lambda (fun=-6917529027438039424,
      args=-4611686018298105856, count=1280) at eval.c:3215
  #19 0x0095e517 in eval_sub (form=-4611686018298105872) at eval.c:2645
  #20 0x00956ba6 in Fprogn (body=0) at eval.c:439
  #21 0x00959483 in Flet (args=-4611686018298106016) at eval.c:1109
  #22 0x0095dbc3 in eval_sub (form=-4611686018298106032) at eval.c:2549
  #23 0x00956ba6 in Fprogn (body=-4611686018298006720) at eval.c:439
  #24 0x00956bf2 in prog_ignore (body=-4611686018298106080) at eval.c:450
  #25 0x0095951a in Fwhile (args=-4611686018298106064) at eval.c:1130
  #26 0x0095dbc3 in eval_sub (form=-4611686018298106048) at eval.c:2549
  #27 0x00956ba6 in Fprogn (body=0) at eval.c:439
  #28 0x00959483 in Flet (args=-4611686018298106288) at eval.c:1109
  #29 0x0095dbc3 in eval_sub (form=-4611686018298106304) at eval.c:2549
  #30 0x009aee16 in readevalloop_eager_expand_eval (val=-4611686018298006624,
      macroexpand=44400) at lread.c:2359
  #31 0x009afac4 in readevalloop (readcharfun=-6917529027437162840, infile0=0x0,
      sourcename=-9223372036650853472, printflag=false, unibyte=0, readfun=0,
      start=0, end=0) at lread.c:2541
  #32 0x009affc2 in Feval_buffer (buffer=-6917529027437162840, printflag=0,
      filename=-9223372036650853472, unibyte=0, do_allow_print=48)
      at lread.c:2616
  #33 0x009601c0 in funcall_subr (subr=0x105d040 <Seval_buffer>, numargs=5,
      args=0xa020280) at eval.c:3169
  #34 0x009cd90d in exec_byte_code (fun=-6917529027484017368, args_template=257,
      nargs=1, args=0xa020288) at bytecode.c:812
  #35 0x0096094f in funcall_lambda (fun=-6917529027483359632, nargs=4,
      arg_vector=0x628eb88) at eval.c:3252
  #36 0x0095fa15 in funcall_general (fun=-6917529027483359632, numargs=4,
      args=0x628eb88) at eval.c:3044
  #37 0x0095fd3e in Ffuncall (nargs=5, args=0x628eb80) at eval.c:3093
  #38 0x009ac862 in Fload (file=-9223372036698322936, noerror=138689728,
      nomessage=138689664, nosuffix=0, must_suffix=0) at lread.c:1619
  #39 0x009601c0 in funcall_subr (subr=0x105cfc0 <Sload>, numargs=3,
      args=0xa0201d8) at eval.c:3169
  #40 0x009cd90d in exec_byte_code (fun=-6917529027484481064, args_template=513,
      nargs=1, args=0xa020238) at bytecode.c:812
  #41 0x0096094f in funcall_lambda (fun=-6917529027478952400, nargs=0,
      arg_vector=0x628f5a0) at eval.c:3252
  #42 0x0096076a in apply_lambda (fun=-6917529027478952400, args=0, count=128)
      at eval.c:3215
  #43 0x0095e517 in eval_sub (form=-4611686018263554520) at eval.c:2645
  #44 0x0095d5f0 in Feval (form=-4611686018263554520, lexical=48) at eval.c:2462
  #45 0x008646d7 in top_level_2 () at keyboard.c:1184
  #46 0x0095aa2d in internal_condition_case (bfun=0x86464e <top_level_2>,
      handlers=144, hfun=0x863c02 <cmd_error>) at eval.c:1613
  #47 0x0086476a in top_level_1 (ignore=0) at keyboard.c:1196
  #48 0x00959ab2 in internal_catch (tag=75552, func=0x8646f6 <top_level_1>,
      arg=0) at eval.c:1292
  #49 0x00864541 in command_loop () at keyboard.c:1145
  #50 0x00863662 in recursive_edit_1 () at keyboard.c:754
  #51 0x00863900 in Frecursive_edit () at keyboard.c:837
  #52 0x0085ea23 in main (argc=1, argv=0x7bf25c0) at emacs.c:2646

  Lisp Backtrace:
  "add-to-list" (0xa020428)
  "byte-code" (0x628c270)
  "require" (0xa020320)
  "custom-load-symbol" (0xa0202d8)
  "setopt--set" (0x628d470)
  "let" (0x628d840)
  "while" (0x628da80)
  "let" (0x628dd10)
  "eval-buffer" (0xa020280)
  "load-with-code-conversion" (0x628eb88)
  "load" (0xa0201d8)
  0xc2418f8 PVEC_CLOSURE
  "startup--load-user-init-file" (0xa0200c8)
  "command-line" (0xa020048)
  "normal-top-level" (0x628f5a0)
  (gdb) fr 7
  #7  0x009d14c6 in exec_byte_code (fun=-6917529027483966176,
      args_template=1026, nargs=3, args=0xa020440) at bytecode.c:1604
  1604                TOP = Fmember (TOP, v1);
  (gdb) pp TOP
  transient-mark-mode
  (gdb) pp v1
  t
  (gdb) fr 9
  #9  0x0095dff5 in eval_sub (form=-4611686018187654016) at eval.c:2604
  2604                  val = (XSUBR (fun)->function.a3
  (gdb) p form
  $12 = -4611686018187654016
  (gdb) xcar
  $13 = 0x83ad218
  (gdb) xtype
  Lisp_Symbol
  (gdb) xsymbol
  $14 = (struct Lisp_Symbol *) 0x953f378
  "byte-code"
  (gdb) p form
  $15 = -4611686018187654016
  (gdb) xcdr
  $16 = 0xc00000000e4a0c70
  (gdb) xcar
  $17 = 0x800000000c264a10
  (gdb) xtype
  Lisp_String
  (gdb) xprintbytestr $17->u.s
  Bytecode: Non-integral right operand for "@" operator.