unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* MPS: Win64 testers?
@ 2024-07-24 15:45 Pip Cet
  2024-07-25  7:16 ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Pip Cet @ 2024-07-24 15:45 UTC (permalink / raw)
  To: Emacs Devel

Is anyone building the scratch/igc branch for/on win64 systems? I'm trying to do that on wine/msys2/mingw64 (not an actual Windows installation), and there are a number of issues that need to be fixed, and I'm wondering whether I'm the first person to run into them. Quite possibly, they're specific to wine.

- mps doesn't compile with GCC (and, when it does, needs to be told that a machine word is unsigned long long, not unsigned long)
- _setjmp_ex assumes 16-byte alignment of jmp_buf to store the XMM registers, but we allocate handlers with 8-byte alignment in MPS builds.

Is this a wine bug, or is the MPS build currently non-functional on win64?

Pip



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-24 15:45 Pip Cet
@ 2024-07-25  7:16 ` Eli Zaretskii
  2024-07-25 15:39   ` Pip Cet
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-07-25  7:16 UTC (permalink / raw)
  To: Pip Cet; +Cc: emacs-devel

> Date: Wed, 24 Jul 2024 15:45:18 +0000
> From: Pip Cet <pipcet@protonmail.com>
> 
> Is anyone building the scratch/igc branch for/on win64 systems? I'm trying to do that on wine/msys2/mingw64 (not an actual Windows installation), and there are a number of issues that need to be fixed, and I'm wondering whether I'm the first person to run into them. Quite possibly, they're specific to wine.

I think you are indeed the first one.  I use 32-bit MinGW, and for
that I have a working build of MPS (and can share the diffs if someone
wants them), but a 64-bit MinGW build of MPS will need other changes,
at least in some cases.

> - mps doesn't compile with GCC (and, when it does, needs to be told that a machine word is unsigned long long, not unsigned long)

Right.  I wonder why they didn't use intprtr_t or somesuch to begin
with.

> - _setjmp_ex assumes 16-byte alignment of jmp_buf to store the XMM registers, but we allocate handlers with 8-byte alignment in MPS builds.

Where and how do you see that?



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
@ 2024-07-25  9:45 Angelo Graziosi
  2024-07-25 10:02 ` Stefan Kangas
  2024-07-25 11:35 ` Eli Zaretskii
  0 siblings, 2 replies; 119+ messages in thread
From: Angelo Graziosi @ 2024-07-25  9:45 UTC (permalink / raw)
  To: emacs-devel

I thought I had built this branch but it seems I need '-lmps' library 
and '--with-mps' configure option and on MSYS2 there is not package 
referring to that library....

Using

./configure --with-mps

still produces

Does Emacs use -lmps?                                   no

Ciao,
  Angelo.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-25  9:45 MPS: Win64 testers? Angelo Graziosi
@ 2024-07-25 10:02 ` Stefan Kangas
  2024-07-25 11:35 ` Eli Zaretskii
  1 sibling, 0 replies; 119+ messages in thread
From: Stefan Kangas @ 2024-07-25 10:02 UTC (permalink / raw)
  To: Angelo Graziosi, emacs-devel

Angelo Graziosi <angelo.g0@libero.it> writes:

> I thought I had built this branch but it seems I need '-lmps' library
> and '--with-mps' configure option and on MSYS2 there is not package
> referring to that library....
>
> Using
>
> ./configure --with-mps
>
> still produces
>
> Does Emacs use -lmps?                                   no

I think it would be useful if someone could write down more detailed
build instructions in admin/igc.org.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-25  9:45 MPS: Win64 testers? Angelo Graziosi
  2024-07-25 10:02 ` Stefan Kangas
@ 2024-07-25 11:35 ` Eli Zaretskii
  2024-07-27 14:22   ` Angelo Graziosi
  1 sibling, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-07-25 11:35 UTC (permalink / raw)
  To: Angelo Graziosi; +Cc: emacs-devel

> Date: Thu, 25 Jul 2024 11:45:10 +0200
> From: Angelo Graziosi <angelo.g0@libero.it>
> 
> I thought I had built this branch but it seems I need '-lmps' library 
> and '--with-mps' configure option and on MSYS2 there is not package 
> referring to that library....

Yes, you'll for now need to build that library yourself.

> Using
> 
> ./configure --with-mps
> 
> still produces
> 
> Does Emacs use -lmps?                                   no

That's expected, since you don't have the library installed.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-25  7:16 ` Eli Zaretskii
@ 2024-07-25 15:39   ` Pip Cet
  2024-07-27  8:02     ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Pip Cet @ 2024-07-25 15:39 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

On Thursday, July 25th, 2024 at 07:16, Eli Zaretskii <eliz@gnu.org> wrote:
> > Date: Wed, 24 Jul 2024 15:45:18 +0000
> 
> > From: Pip Cet pipcet@protonmail.com
> >
> > Is anyone building the scratch/igc branch for/on win64 systems? I'm trying to do that on wine/msys2/mingw64 (not an actual Windows installation), and there are a number of issues that need to be fixed, and I'm wondering whether I'm the first person to run into them. Quite possibly, they're specific to wine.
> 
> I think you are indeed the first one. I use 32-bit MinGW, and for
> that I have a working build of MPS (and can share the diffs if someone
> wants them), but a 64-bit MinGW build of MPS will need other changes,
> at least in some cases.

It'd be great if you could share the diffs, so I could see where I've gone wrong! I've got the 64-bit build with mps to start by now, but haven't really tested it for stability much. It survives a few garbage collection cycles, at least.

As a general question, would there be interest in CI for such systems? I'm setting up something locally, but I've been trying to be careful so that the Dockerfiles I'm using should work on x86_64 GNU/Linux machines generally.

> > - _setjmp_ex assumes 16-byte alignment of jmp_buf to store the XMM registers, but we allocate handlers with 8-byte alignment in MPS builds.
> 
> Where and how do you see that?

I'm not quite sure what you're asking. I saw this trying to run things in wine in a docker image on an x86_64 GNU/Linux machine, ran it in gdb.exe, found the instruction causing the segfault, and fixed things so it wouldn't.

https://gitlab.winehq.org/wine/wine/-/blob/master/dlls/winecrt0/setjmp.c#L123 is the instruction that segfaulted here. I'm not sure whether that's what you were asking.

The jump buffer is declared with 16-byte alignment here: https://gitlab.winehq.org/wine/wine/-/blob/master/include/msvcrt/setjmp.h#L50

A side effect of this is that LISP_ALIGNMENT is 16, which breaks MPS because vectorlike_nbytes rounds up to a multiple of LISP_ALIGNMENT, not just GCALIGNMENT.

Looking over my diff, here's what I had to fix to get things to the current stage on msys and msys2 (using MSYSTEM=MINGW64).

- disable the sanity check in the Makefile, because backticks/pipes don't work properly
- make WINDRES include the --use-temp-file flag, for the same reason
- wrap the add-name-to-file calls in loadup.el in with-demoted-errors (link problems?)
- force LISP_ALIGNMENT to be 8, not 16
- change my local generation size settings to be much more conservative for the msys build. I think scratch/igc is fine, though.
- make sys_setjmp and sys_longjmp use a larger buffer and memmove() the data in it so it's 16-byte aligned
- disable the failure exit on close_stream failure in sysdep.c, and silently ignore such errors
- trace the extra 'ztrillion' bignum in timefns.c
- for the msys build, run autogen.sh outside of wine, since there are virtual memory issues inflooping the process otherwise

I must confess I know little about the UCRT64 default MSYSTEM value. Maybe it doesn't have the same problems.

If anyone wants to study or reuse any of my efforts, let me know and I'll provide a link to a public repository that can be used. Note that my Wine build environment, as far as I know, uses only free software, so it's in the "technically free OS" category. (The Android build uses the SDK, which claims to be decidedly non-free but makes an exception for those components which are indeed free; that means it's possible to build Android APKs without paying for it, using non-free software, and run them on technically free Android versions if you can find those. AFAIK, the macOS build requires non-free and expensive software both to compile and to run the executable?)

Pip



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-25 15:39   ` Pip Cet
@ 2024-07-27  8:02     ` Eli Zaretskii
  2024-07-27 10:42       ` Pip Cet
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-07-27  8:02 UTC (permalink / raw)
  To: Pip Cet; +Cc: emacs-devel

> Date: Thu, 25 Jul 2024 15:39:51 +0000
> From: Pip Cet <pipcet@protonmail.com>
> Cc: emacs-devel@gnu.org
> 
> On Thursday, July 25th, 2024 at 07:16, Eli Zaretskii <eliz@gnu.org> wrote:
> > I think you are indeed the first one. I use 32-bit MinGW, and for
> > that I have a working build of MPS (and can share the diffs if someone
> > wants them), but a 64-bit MinGW build of MPS will need other changes,
> > at least in some cases.
> 
> It'd be great if you could share the diffs, so I could see where I've gone wrong! I've got the 64-bit build with mps to start by now, but haven't really tested it for stability much. It survives a few garbage collection cycles, at least.

My diffs are attached below.  Note that they are for the 32-bit MinGW
build, so not all of them are relevant for a 64-bit MinGW build, and
some stuff for a 64-bit build is missing and you will have to add it.
For example, the code/w3i3gc.gmk file is only for the 32-bit build;
you will need to create code/w3i6gc.gmk instead.  You'll also need to
add the 64-bit MinGW fragment to code/mpstd.h (where I added the stuff
for the 32-bit MinGW).

To build, I did the following from the MSYS Bash prompt:

  $ cd code
  $ make -f w3i3gc.gmk

To run the test suite, I did the following from the cmd window:

  d:\usr\...\mps-release-1.118.0\code>..\tool\testrun.bat w3i3gc cool testrun

(where "..." stands for the specific place I have the sources, which
is immaterial for the purposes of this discussion).

To install, say from the MSYS Bash:

  $ make install

> As a general question, would there be interest in CI for such systems? I'm setting up something locally, but I've been trying to be careful so that the Dockerfiles I'm using should work on x86_64 GNU/Linux machines generally.

I think it will be useful, but I don't know how much effort it will
need from you, so I cannot say if it's justified at this stage.

> > > - _setjmp_ex assumes 16-byte alignment of jmp_buf to store the XMM registers, but we allocate handlers with 8-byte alignment in MPS builds.
> > 
> > Where and how do you see that?
> 
> I'm not quite sure what you're asking. I saw this trying to run things in wine in a docker image on an x86_64 GNU/Linux machine, ran it in gdb.exe, found the instruction causing the segfault, and fixed things so it wouldn't.
> 
> https://gitlab.winehq.org/wine/wine/-/blob/master/dlls/winecrt0/setjmp.c#L123 is the instruction that segfaulted here. I'm not sure whether that's what you were asking.
> 
> The jump buffer is declared with 16-byte alignment here: https://gitlab.winehq.org/wine/wine/-/blob/master/include/msvcrt/setjmp.h#L50
> 
> A side effect of this is that LISP_ALIGNMENT is 16, which breaks MPS because vectorlike_nbytes rounds up to a multiple of LISP_ALIGNMENT, not just GCALIGNMENT.

If the "_setjmp_ex assumes 16-byte alignment of jmp_buf to store the
XMM registers" part is about what Wine does, then my question is where
did you see that "we allocate handlers with 8-byte alignment in MPS
builds"?

> Looking over my diff, here's what I had to fix to get things to the current stage on msys and msys2 (using MSYSTEM=MINGW64).
> 
> - disable the sanity check in the Makefile, because backticks/pipes don't work properly

How so? what doesn't work?  By "makefile", which Makefile do you mean?
the one in Emacs or the one in MPS?

> - make WINDRES include the --use-temp-file flag, for the same reason

Is this in Emacs Makefiles?  I guess Wine is not a good emulation of
Windows, then.

> - wrap the add-name-to-file calls in loadup.el in with-demoted-errors (link problems?)

I have no idea.  Maybe hard links are not properly emulated by Wine?

> - force LISP_ALIGNMENT to be 8, not 16

Does this mean 'struct Lisp_*' structures are 16-byte aligned in the
64-bit MinGW build?  If not, what forces LISP_ALIGNMENT to be 16?

> - change my local generation size settings to be much more conservative for the msys build. I think scratch/igc is fine, though.

Don't understand what this means, sorry.  What are your "local
generation size settings"?

> - make sys_setjmp and sys_longjmp use a larger buffer and memmove() the data in it so it's 16-byte aligned

Why would this be any different from a non-MPS build for 64-bit MinGW?

> - disable the failure exit on close_stream failure in sysdep.c, and silently ignore such errors

I guess you are using UCRT?  These problems with UCRT are known, but
no one came up with an explanation for them yet.  What happens if you
link against MSVCRT instead?

> - trace the extra 'ztrillion' bignum in timefns.c

What happens if you don't?

> - for the msys build, run autogen.sh outside of wine, since there are virtual memory issues inflooping the process otherwise

Sounds like Wine is not a good idea at all...

Here are the diffs I promised.

--- ./code/comm.gmk~0	2023-07-11 13:01:52.000000000 +0300
+++ ./code/comm.gmk	2024-04-23 15:07:15.288562200 +0300
@@ -72,7 +72,7 @@ endif
 
 # TELEMETRY TARGETS
 
-EVENT_TARGETS = mpseventcnv mpseventpy mpseventsql mpseventtxt
+EVENT_TARGETS = mpseventcnv$(EXEEXT) mpseventpy$(EXEEXT) mpseventsql$(EXEEXT) mpseventtxt$(EXEEXT)
 
 
 # EXTRA TARGETS
@@ -80,7 +80,7 @@ EVENT_TARGETS = mpseventcnv mpseventpy m
 # Don't build mpseventsql by default (might not have sqlite3 installed),
 # but do build the other event target.
 
-EXTRA_TARGETS ?= $(filter-out mpseventsql,$(EVENT_TARGETS))
+EXTRA_TARGETS ?= $(filter-out mpseventsql$(EXEEXT),$(EVENT_TARGETS))
 
 
 #
@@ -161,7 +161,11 @@ POOLN = pooln.c
 MV2 = poolmv2.c
 MVFF = poolmvff.c
 TESTLIB = testlib.c
+ifneq ($(PFM),w3i3gc)
 TESTTHR = testthrix.c
+else
+TESTTHR = testthrw3.c
+endif
 FMTDY = fmtdy.c fmtno.c
 FMTDYTST = fmtdy.c fmtno.c fmtdytst.c
 FMTHETST = fmthe.c fmtdy.c fmtno.c fmtdytst.c
@@ -253,57 +257,61 @@ LIB_TARGETS=mps.a mpsplan.a
 # Test executables go in TEST_TARGETS.
 
 TEST_TARGETS=\
-    abqtest \
-    addrobj \
-    airtest \
-    amcss \
-    amcsshe \
-    amcssth \
-    amsss \
-    amssshe \
-    apss \
-    arenacv \
-    awlut \
-    awluthe \
-    awlutth \
-    btcv \
-    bttest \
-    djbench \
-    extcon \
-    finalcv \
-    finaltest \
-    forktest \
-    fotest \
-    gcbench \
-    landtest \
-    locbwcss \
-    lockcov \
-    lockut \
-    locusss \
-    locv \
-    messtest \
-    mpmss \
-    mpsicv \
-    mv2test \
-    nailboardtest \
-    poolncv \
-    qs \
-    sacss \
-    segsmss \
-    sncss \
-    steptest \
-    tagtest \
-    teletest \
-    walkt0 \
-    zcoll \
-    zmess \
-    ztfm
+    abqtest$(EXEEXT) \
+    addrobj$(EXEEXT) \
+    airtest$(EXEEXT) \
+    amcss$(EXEEXT) \
+    amcsshe$(EXEEXT) \
+    amcssth$(EXEEXT) \
+    amsss$(EXEEXT) \
+    amssshe$(EXEEXT) \
+    apss$(EXEEXT) \
+    arenacv$(EXEEXT) \
+    awlut$(EXEEXT) \
+    awluthe$(EXEEXT) \
+    awlutth$(EXEEXT) \
+    btcv$(EXEEXT) \
+    bttest$(EXEEXT) \
+    djbench$(EXEEXT) \
+    extcon$(EXEEXT) \
+    finalcv$(EXEEXT) \
+    finaltest$(EXEEXT) \
+    fotest$(EXEEXT) \
+    gcbench$(EXEEXT) \
+    landtest$(EXEEXT) \
+    locbwcss$(EXEEXT) \
+    lockcov$(EXEEXT) \
+    lockut$(EXEEXT) \
+    locusss$(EXEEXT) \
+    locv$(EXEEXT) \
+    messtest$(EXEEXT) \
+    mpmss$(EXEEXT) \
+    mpsicv$(EXEEXT) \
+    mv2test$(EXEEXT) \
+    nailboardtest$(EXEEXT) \
+    poolncv$(EXEEXT) \
+    qs$(EXEEXT) \
+    sacss$(EXEEXT) \
+    segsmss$(EXEEXT) \
+    sncss$(EXEEXT) \
+    steptest$(EXEEXT) \
+    tagtest$(EXEEXT) \
+    teletest$(EXEEXT) \
+    walkt0$(EXEEXT) \
+    zcoll$(EXEEXT) \
+    zmess$(EXEEXT) \
+    ztfm$(EXEEXT)
+
+ifneq ($(PFM),w3i3gc)
+TEST_TARGETS = $(TEST_TARGETS) forktest$(EXEEXT) 
+
+endif
 
 # This target records programs that we were once able to build but
 # can't at the moment:
 
 UNBUILDABLE_TARGETS=\
-    replay # depends on the EPVM pool
+    replay$(EXEEXT) # depends on the EPVM pool
 
 ALL_TARGETS=$(LIB_TARGETS) $(TEST_TARGETS) $(EXTRA_TARGETS)
 
@@ -446,154 +454,154 @@ $(PFM)/cool/mps.a: $(MPMOBJ)
 
 ifdef VARIETY
 
-$(PFM)/$(VARIETY)/abqtest: $(PFM)/$(VARIETY)/abqtest.o \
+$(PFM)/$(VARIETY)/abqtest$(EXEEXT): $(PFM)/$(VARIETY)/abqtest.o \
 	$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/addrobj: $(PFM)/$(VARIETY)/addrobj.o \
+$(PFM)/$(VARIETY)/addrobj$(EXEEXT): $(PFM)/$(VARIETY)/addrobj.o \
 	$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/airtest: $(PFM)/$(VARIETY)/airtest.o \
+$(PFM)/$(VARIETY)/airtest$(EXEEXT): $(PFM)/$(VARIETY)/airtest.o \
 	$(FMTSCMOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/amcss: $(PFM)/$(VARIETY)/amcss.o \
+$(PFM)/$(VARIETY)/amcss$(EXEEXT): $(PFM)/$(VARIETY)/amcss.o \
 	$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/amcsshe: $(PFM)/$(VARIETY)/amcsshe.o \
+$(PFM)/$(VARIETY)/amcsshe$(EXEEXT): $(PFM)/$(VARIETY)/amcsshe.o \
 	$(FMTHETSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/amcssth: $(PFM)/$(VARIETY)/amcssth.o \
+$(PFM)/$(VARIETY)/amcssth$(EXEEXT): $(PFM)/$(VARIETY)/amcssth.o \
 	$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(TESTTHROBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/amsss: $(PFM)/$(VARIETY)/amsss.o \
+$(PFM)/$(VARIETY)/amsss$(EXEEXT): $(PFM)/$(VARIETY)/amsss.o \
 	$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/amssshe: $(PFM)/$(VARIETY)/amssshe.o \
+$(PFM)/$(VARIETY)/amssshe$(EXEEXT): $(PFM)/$(VARIETY)/amssshe.o \
 	$(FMTHETSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/apss: $(PFM)/$(VARIETY)/apss.o \
+$(PFM)/$(VARIETY)/apss$(EXEEXT): $(PFM)/$(VARIETY)/apss.o \
 	$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/arenacv: $(PFM)/$(VARIETY)/arenacv.o \
+$(PFM)/$(VARIETY)/arenacv$(EXEEXT): $(PFM)/$(VARIETY)/arenacv.o \
 	$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/awlut: $(PFM)/$(VARIETY)/awlut.o \
+$(PFM)/$(VARIETY)/awlut$(EXEEXT): $(PFM)/$(VARIETY)/awlut.o \
 	$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(TESTTHROBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/awluthe: $(PFM)/$(VARIETY)/awluthe.o \
+$(PFM)/$(VARIETY)/awluthe$(EXEEXT): $(PFM)/$(VARIETY)/awluthe.o \
         $(FMTHETSTOBJ) $(TESTLIBOBJ) $(TESTTHROBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/awlutth: $(PFM)/$(VARIETY)/awlutth.o \
+$(PFM)/$(VARIETY)/awlutth$(EXEEXT): $(PFM)/$(VARIETY)/awlutth.o \
 	$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(TESTTHROBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/btcv: $(PFM)/$(VARIETY)/btcv.o \
+$(PFM)/$(VARIETY)/btcv$(EXEEXT): $(PFM)/$(VARIETY)/btcv.o \
 	$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/bttest: $(PFM)/$(VARIETY)/bttest.o \
+$(PFM)/$(VARIETY)/bttest$(EXEEXT): $(PFM)/$(VARIETY)/bttest.o \
 	$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/djbench: $(PFM)/$(VARIETY)/djbench.o \
+$(PFM)/$(VARIETY)/djbench$(EXEEXT): $(PFM)/$(VARIETY)/djbench.o \
 	$(TESTLIBOBJ) $(TESTTHROBJ)
 
-$(PFM)/$(VARIETY)/extcon: $(PFM)/$(VARIETY)/extcon.o \
+$(PFM)/$(VARIETY)/extcon$(EXEEXT): $(PFM)/$(VARIETY)/extcon.o \
 	$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/finalcv: $(PFM)/$(VARIETY)/finalcv.o \
+$(PFM)/$(VARIETY)/finalcv$(EXEEXT): $(PFM)/$(VARIETY)/finalcv.o \
 	$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/finaltest: $(PFM)/$(VARIETY)/finaltest.o \
+$(PFM)/$(VARIETY)/finaltest$(EXEEXT): $(PFM)/$(VARIETY)/finaltest.o \
 	$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/forktest: $(PFM)/$(VARIETY)/forktest.o \
+$(PFM)/$(VARIETY)/forktest$(EXEEXT): $(PFM)/$(VARIETY)/forktest.o \
 	$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/fotest: $(PFM)/$(VARIETY)/fotest.o \
+$(PFM)/$(VARIETY)/fotest$(EXEEXT): $(PFM)/$(VARIETY)/fotest.o \
 	$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/gcbench: $(PFM)/$(VARIETY)/gcbench.o \
+$(PFM)/$(VARIETY)/gcbench$(EXEEXT): $(PFM)/$(VARIETY)/gcbench.o \
 	$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(TESTTHROBJ)
 
-$(PFM)/$(VARIETY)/landtest: $(PFM)/$(VARIETY)/landtest.o \
+$(PFM)/$(VARIETY)/landtest$(EXEEXT): $(PFM)/$(VARIETY)/landtest.o \
 	$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/locbwcss: $(PFM)/$(VARIETY)/locbwcss.o \
+$(PFM)/$(VARIETY)/locbwcss$(EXEEXT): $(PFM)/$(VARIETY)/locbwcss.o \
 	$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/lockcov: $(PFM)/$(VARIETY)/lockcov.o \
+$(PFM)/$(VARIETY)/lockcov$(EXEEXT): $(PFM)/$(VARIETY)/lockcov.o \
 	$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/lockut: $(PFM)/$(VARIETY)/lockut.o \
+$(PFM)/$(VARIETY)/lockut$(EXEEXT): $(PFM)/$(VARIETY)/lockut.o \
 	$(TESTLIBOBJ) $(TESTTHROBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/locusss: $(PFM)/$(VARIETY)/locusss.o \
+$(PFM)/$(VARIETY)/locusss$(EXEEXT): $(PFM)/$(VARIETY)/locusss.o \
 	$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/locv: $(PFM)/$(VARIETY)/locv.o \
+$(PFM)/$(VARIETY)/locv$(EXEEXT): $(PFM)/$(VARIETY)/locv.o \
 	$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/messtest: $(PFM)/$(VARIETY)/messtest.o \
+$(PFM)/$(VARIETY)/messtest$(EXEEXT): $(PFM)/$(VARIETY)/messtest.o \
 	$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/mpmss: $(PFM)/$(VARIETY)/mpmss.o \
+$(PFM)/$(VARIETY)/mpmss$(EXEEXT): $(PFM)/$(VARIETY)/mpmss.o \
 	$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/mpsicv: $(PFM)/$(VARIETY)/mpsicv.o \
+$(PFM)/$(VARIETY)/mpsicv$(EXEEXT): $(PFM)/$(VARIETY)/mpsicv.o \
 	$(FMTDYTSTOBJ) $(FMTHETSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/mv2test: $(PFM)/$(VARIETY)/mv2test.o \
+$(PFM)/$(VARIETY)/mv2test$(EXEEXT): $(PFM)/$(VARIETY)/mv2test.o \
 	$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/nailboardtest: $(PFM)/$(VARIETY)/nailboardtest.o \
+$(PFM)/$(VARIETY)/nailboardtest$(EXEEXT): $(PFM)/$(VARIETY)/nailboardtest.o \
 	$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/poolncv: $(PFM)/$(VARIETY)/poolncv.o \
+$(PFM)/$(VARIETY)/poolncv$(EXEEXT): $(PFM)/$(VARIETY)/poolncv.o \
 	$(POOLNOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/qs: $(PFM)/$(VARIETY)/qs.o \
+$(PFM)/$(VARIETY)/qs$(EXEEXT): $(PFM)/$(VARIETY)/qs.o \
 	$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/sacss: $(PFM)/$(VARIETY)/sacss.o \
+$(PFM)/$(VARIETY)/sacss$(EXEEXT): $(PFM)/$(VARIETY)/sacss.o \
 	$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/segsmss: $(PFM)/$(VARIETY)/segsmss.o \
+$(PFM)/$(VARIETY)/segsmss$(EXEEXT): $(PFM)/$(VARIETY)/segsmss.o \
 	$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/sncss: $(PFM)/$(VARIETY)/sncss.o \
+$(PFM)/$(VARIETY)/sncss$(EXEEXT): $(PFM)/$(VARIETY)/sncss.o \
 	$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/steptest: $(PFM)/$(VARIETY)/steptest.o \
+$(PFM)/$(VARIETY)/steptest$(EXEEXT): $(PFM)/$(VARIETY)/steptest.o \
 	$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/tagtest: $(PFM)/$(VARIETY)/tagtest.o \
+$(PFM)/$(VARIETY)/tagtest$(EXEEXT): $(PFM)/$(VARIETY)/tagtest.o \
 	$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/teletest: $(PFM)/$(VARIETY)/teletest.o \
+$(PFM)/$(VARIETY)/teletest$(EXEEXT): $(PFM)/$(VARIETY)/teletest.o \
 	$(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/walkt0: $(PFM)/$(VARIETY)/walkt0.o \
+$(PFM)/$(VARIETY)/walkt0$(EXEEXT): $(PFM)/$(VARIETY)/walkt0.o \
 	$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/zcoll: $(PFM)/$(VARIETY)/zcoll.o \
+$(PFM)/$(VARIETY)/zcoll$(EXEEXT): $(PFM)/$(VARIETY)/zcoll.o \
 	$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/zmess: $(PFM)/$(VARIETY)/zmess.o \
+$(PFM)/$(VARIETY)/zmess$(EXEEXT): $(PFM)/$(VARIETY)/zmess.o \
 	$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/ztfm: $(PFM)/$(VARIETY)/ztfm.o \
+$(PFM)/$(VARIETY)/ztfm$(EXEEXT): $(PFM)/$(VARIETY)/ztfm.o \
 	$(FMTDYTSTOBJ) $(TESTLIBOBJ) $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/mpseventcnv: $(PFM)/$(VARIETY)/eventcnv.o \
+$(PFM)/$(VARIETY)/mpseventcnv$(EXEEXT): $(PFM)/$(VARIETY)/eventcnv.o \
   $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/mpseventpy: $(PFM)/$(VARIETY)/eventpy.o \
+$(PFM)/$(VARIETY)/mpseventpy$(EXEEXT): $(PFM)/$(VARIETY)/eventpy.o \
   $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/mpseventtxt: $(PFM)/$(VARIETY)/eventtxt.o \
+$(PFM)/$(VARIETY)/mpseventtxt$(EXEEXT): $(PFM)/$(VARIETY)/eventtxt.o \
   $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/mpseventsql: $(PFM)/$(VARIETY)/eventsql.o \
+$(PFM)/$(VARIETY)/mpseventsql$(EXEEXT): $(PFM)/$(VARIETY)/eventsql.o \
   $(PFM)/$(VARIETY)/mps.a
 
-$(PFM)/$(VARIETY)/replay: $(PFM)/$(VARIETY)/replay.o \
+$(PFM)/$(VARIETY)/replay$(EXEEXT): $(PFM)/$(VARIETY)/replay.o \
   $(PFM)/$(VARIETY)/eventrep.o \
   $(PFM)/$(VARIETY)/table.o \
   $(PFM)/$(VARIETY)/mps.a
@@ -656,18 +664,18 @@ ifdef TARGET
 # %%VARIETY: When adding a new variety, add the dependencies files for it
 # here.
 ifeq ($(VARIETY),rash)
-include $(PFM)/$(VARIETY)/mps.d
+-include $(PFM)/$(VARIETY)/mps.d
 else
 ifeq ($(VARIETY),hot)
-include $(PFM)/$(VARIETY)/mps.d
+-include $(PFM)/$(VARIETY)/mps.d
 else
-include $(MPM:%.c=$(PFM)/$(VARIETY)/%.d)
+-include $(MPM:%.c=$(PFM)/$(VARIETY)/%.d)
 endif # VARIETY != hot
 endif # VARIETY != rash
 
 # %%PART: When adding a new part, add the dependencies file for the
 # new part here.
-include \
+-include \
     $(FMTDY:%.c=$(PFM)/$(VARIETY)/%.d) \
     $(FMTDYTST:%.c=$(PFM)/$(VARIETY)/%.d) \
     $(FMTHETST:%.c=$(PFM)/$(VARIETY)/%.d) \
@@ -698,11 +706,11 @@ $(PFM)/$(VARIETY)/%.a:
 
 # Executable
 
-$(PFM)/$(VARIETY)/%:
+$(PFM)/$(VARIETY)/%$(EXEEXT):
 	$(ECHO) "$(PFM): $@"
 	$(CC) $(CFLAGSSTRICT) $(LINKFLAGS) -o $@ $^ $(LIBS)
 
-$(PFM)/$(VARIETY)/mpseventsql:
+$(PFM)/$(VARIETY)/mpseventsql$(EXEEXT):
 	$(ECHO) "$(PFM): $@"
 	$(CC) $(CFLAGSLAX) $(LINKFLAGS) -o $@ $^ $(LIBS) -lsqlite3
 
--- ./code/lockw3.c~0	2023-07-11 13:01:52.000000000 +0300
+++ ./code/lockw3.c	2024-04-23 13:11:22.497139900 +0300
@@ -33,6 +33,25 @@ SRCID(lockw3, "$Id$");
 
 #if defined(LOCK)
 
+#ifdef __MINGW32__
+# if defined __MINGW32_VERSION && __MINGW32_VERSION >= 5000000L
+
+   /* mingw.org's MinGW doesn't have this stuff in its headers.  */
+   typedef struct _RTL_RUN_ONCE { PVOID Ptr; } RTL_RUN_ONCE, *PRTL_RUN_ONCE;
+   typedef DWORD (WINAPI *PRTL_RUN_ONCE_INIT_FN)(PRTL_RUN_ONCE, PVOID, PVOID *);
+
+#  define RTL_RUN_ONCE_INIT {0}
+#  define INIT_ONCE_STATIC_INIT RTL_RUN_ONCE_INIT
+
+   typedef RTL_RUN_ONCE INIT_ONCE;
+   typedef PRTL_RUN_ONCE PINIT_ONCE;
+   typedef WINBOOL (WINAPI *PINIT_ONCE_FN) (PINIT_ONCE InitOnce, PVOID Parameter, PVOID *Context);
+
+   WINBASEAPI WINBOOL WINAPI InitOnceExecuteOnce (PINIT_ONCE InitOnce, PINIT_ONCE_FN InitFn, PVOID Parameter, LPVOID *Context);
+
+# endif	/* __MINGW32_VERSION >= 5000000L */
+#endif	/* __MINGW32__ */
+
 /* .lock.win32: Win32 lock structure; uses CRITICAL_SECTION */
 typedef struct LockStruct {
   Sig sig;                      /* design.mps.sig.field */
--- ./code/mps.c~0	2023-07-11 13:01:52.000000000 +0300
+++ ./code/mps.c	2024-04-23 13:56:08.221252500 +0300
@@ -228,9 +228,9 @@
 #include "prmclii6.c"   /* x86-64 for Linux mutator context */
 #include "span.c"       /* generic stack probe */
 
-/* Windows on IA-32 with Microsoft Visual Studio or Pelles C */
+/* Windows on IA-32 with Microsoft Visual Studio or Pelles C or GCC */
 
-#elif defined(MPS_PF_W3I3MV) || defined(MPS_PF_W3I3PC)
+#elif defined(MPS_PF_W3I3MV) || defined(MPS_PF_W3I3PC) || defined(MPS_PF_W3I3GC)
 
 #include "lockw3.c"     /* Windows locks */
 #include "thw3.c"       /* Windows threading */
--- ./code/mpsiw3.c~0	2023-07-11 13:01:52.000000000 +0300
+++ ./code/mpsiw3.c	2024-04-23 13:45:23.212499000 +0300
@@ -20,6 +20,11 @@ SRCID(mpsiw3, "$Id$");
 /* This is defined in protw3.c */
 extern LONG WINAPI ProtSEHfilter(LPEXCEPTION_POINTERS info);
 
+/* These seem to be unused, but MinGW GCC complains about lack of
+   previous prototype.  */
+LONG mps_SEH_filter(LPEXCEPTION_POINTERS, void **, size_t *);
+void mps_SEH_handler(void *, size_t);
+
 LONG mps_SEH_filter(LPEXCEPTION_POINTERS info,
                     void **hp_o, size_t *hs_o)
 {
--- ./code/mpstd.h~0	2023-07-11 13:01:52.000000000 +0300
+++ ./code/mpstd.h	2024-04-23 17:07:42.606079400 +0300
@@ -392,6 +392,22 @@
 #define MPS_PF_ALIGN    8
 
 
+#elif defined(__MINGW32__) && defined(_X86_) && defined(__GNUC__)
+#if defined(CONFIG_PF_STRING) && ! defined(CONFIG_PF_W3I3GC)
+#error "specified CONFIG_PF_... inconsistent with detected w3i3gc"
+#endif
+#define MPS_PF_W3I3GC
+#define MPS_PF_STRING   "w3i3gc"
+#define MPS_OS_W3
+#define MPS_ARCH_I3
+#define MPS_BUILD_GC
+#define MPS_T_WORD      unsigned long
+#define MPS_T_ULONGEST  unsigned long
+#define MPS_WORD_WIDTH  32
+#define MPS_WORD_SHIFT  5
+#define MPS_PF_ALIGN    4
+
+
 #else
 #error "The MPS Kit does not have a configuration for this platform out of the box; see manual/build.txt"
 #endif
--- ./code/protw3.c~0	2023-07-11 13:01:52.000000000 +0300
+++ ./code/protw3.c	2024-04-23 13:47:36.490634000 +0300
@@ -36,6 +36,7 @@ void ProtSet(Addr base, Addr limit, Acce
     NOTREACHED;
 }
 
+LONG WINAPI ProtSEHfilter(LPEXCEPTION_POINTERS);
 
 LONG WINAPI ProtSEHfilter(LPEXCEPTION_POINTERS info)
 {
--- ./code/spw3i3.c~0	2023-07-11 13:01:52.000000000 +0300
+++ ./code/spw3i3.c	2024-04-23 09:22:39.390462300 +0300
@@ -27,11 +27,20 @@
 
 void StackProbe(Size depth)
 {
+#ifdef __GNUC__
+  __asm__ volatile ("mov %0, %%eax\n\t"
+		    "neg %%eax\n\t"
+		    "mov (%%esp,%%eax,4), %%eax" /* do the actual probe */
+		    :	/* no outputs */
+		    : "r" (depth)
+  		    : "eax");
+#else	/* MSVC */
   __asm {
     mov  eax, depth
     neg  eax
     mov  eax, [esp+eax*4] /* do the actual probe */
   }
+#endif
 }
 
 
--- ./code/testlib.c~0	2023-07-11 13:01:52.000000000 +0300
+++ ./code/testlib.c	2024-04-23 17:02:34.566980300 +0300
@@ -221,7 +221,14 @@ double rnd_double(void)
 
 static unsigned sizelog2(size_t size)
 {
+#ifdef __MINGW32__
+  /* For some reason, MinGW sometimes produces a value slightly
+     smaller than the expected one, so we round up to the next FP
+     value.  */
+  return (unsigned)(log((double)size) / log(2.0) * (1.0 + __DBL_EPSILON__));
+#else
   return (unsigned)(log((double)size) / log(2.0));
+#endif
 }
 
 size_t rnd_grain(size_t arena_size)
@@ -232,17 +239,17 @@ size_t rnd_grain(size_t arena_size)
   return rnd_align(sizeof(void *), (size_t)1 << sizelog2(arena_size >> MPS_WORD_SHIFT));
 }
 
-size_t rnd_align(size_t min, size_t max)
+size_t rnd_align(size_t minv, size_t maxv)
 {
-  unsigned log2min = sizelog2(min);
-  unsigned log2max = sizelog2(max);
-  Insist(min <= max);
-  Insist((size_t)1 << log2min == min);
-  Insist((size_t)1 << log2max == max);
+  unsigned log2min = sizelog2(minv);
+  unsigned log2max = sizelog2(maxv);
+  Insist(minv <= maxv);
+  Insist((size_t)1 << log2min == minv);
+  Insist((size_t)1 << log2max == maxv);
   if (log2min < log2max)
-    return min << (rnd() % (log2max - log2min + 1));
+    return minv << (rnd() % (log2max - log2min + 1));
   else
-    return min;
+    return minv;
 }
 
 double rnd_pause_time(void)
--- ./code/testlib.h~0	2023-07-11 13:01:52.000000000 +0300
+++ ./code/testlib.h	2024-04-23 14:31:30.269692800 +0300
@@ -71,7 +71,7 @@
  * <https://docs.microsoft.com/en-gb/cpp/c-runtime-library/reference/alloca>
  */
 
-#if defined(MPS_OS_W3)
+#if defined(MPS_OS_W3) && !defined(__GNUC__)
 
 #define alloca _alloca
 
@@ -86,7 +86,7 @@
  * This macro version may evaluate the name argument twice.
  */
 
-#if defined(MPS_OS_W3)
+#if defined(MPS_OS_W3) && !defined(__GNUC__)
 
 #define setenv(name, value, overwrite) \
     (((overwrite) || !getenv(name)) ? _putenv_s(name, value) : 0)
--- ./code/thw3.c~0	2023-07-11 13:01:52.000000000 +0300
+++ ./code/thw3.c	2024-04-23 13:50:59.803414400 +0300
@@ -259,7 +259,7 @@ Res ThreadDescribe(Thread thread, mps_li
 }
 
 
-Res ThreadScan(ScanState ss, Thread thread, Word *stackCold,
+Res ThreadScan(ScanState ss, Thread thread, void *stackCold,
                mps_area_scan_t scan_area, void *closure)
 {
   DWORD id;
@@ -285,7 +285,7 @@ Res ThreadScan(ScanState ss, Thread thre
     stackPtr = MutatorContextSP(&context);
     /* .stack.align */
     stackBase  = (Word *)AddrAlignUp(stackPtr, sizeof(Word));
-    stackLimit = stackCold;
+    stackLimit = (Word *)stackCold;
     if (stackBase >= stackLimit)
       return ResOK;    /* .stack.below-bottom */
 
--- code/mingw.gmk~0	1970-01-01 02:00:00.000000000 +0200
+++ code/mingw.gmk	2024-04-23 14:29:54.439945000 +0300
@@ -0,0 +1,80 @@
+# -*- makefile -*-
+#
+# mingw.gmk: GNUMAKEFILE FRAGMENT FOR MinGW GCC
+#
+# $Id$
+# Copyright (c) 2001-2020 Ravenbrook Limited.  See end of file for license.
+#
+# This file is included by platform makefiles that use the GNU CC
+# compiler.  It defines the compiler-specific variables that the
+# common makefile fragment (<code/comm.gmk>) requires.
+
+CC = gcc
+CFLAGSDEBUG = -Og -gdwarf-4 -g3
+CFLAGSOPT = -O2 -gdwarf-4 -g3
+EXEEXT = .exe
+
+# Warnings that might be enabled by clients <design/config/#.warning.impl>.
+CFLAGSCOMPILER := \
+-Waggregate-return \
+-Wall \
+-Wcast-qual \
+-Werror \
+-Wextra \
+-Winline \
+-Wmissing-prototypes \
+-Wnested-externs \
+-Wpointer-arith \
+-Wshadow \
+-Wstrict-aliasing=2 \
+-Wstrict-prototypes \
+-Wswitch-default \
+-Wwrite-strings
+CFLAGSCOMPILERSTRICT := -std=gnu89 -pedantic
+
+# A different set of compiler flags for less strict compilation, for
+# instance when we need to #include a third-party header file that
+# won't fly with -ansi -pedantic.  Use sparingly!
+CFLAGSCOMPILERLAX :=
+
+# gcc -MM generates a dependency line of the form:
+#   thing.o : thing.c ...
+# The sed line converts this into:
+#   <pfm>/<variety>/thing.o <pfm>/<variety>/thing.d : thing.c ...
+# If interrupted, this is liable to leave a zero-length file behind.
+
+define gendep
+$(SHELL) -ec "$(CC) $(CFLAGSSTRICT) -MM $< | \
+	sed '/:/s!$*.o!$(@D)/& $(@D)/$*.d!' > $@"
+[ -s $@ ] || rm -f $@
+endef
+
+
+# C. COPYRIGHT AND LICENSE
+#
+# Copyright (C) 2001-2020 Ravenbrook Limited <https://www.ravenbrook.com/>.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the
+#    distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
--- code/w3i3gc.gmk~0	1970-01-01 02:00:00.000000000 +0200
+++ code/w3i3gc.gmk	2024-04-23 14:40:10.709906400 +0300
@@ -0,0 +1,74 @@
+# -*- makefile -*-
+#
+# w3i3gc.gmk: BUILD FOR Windows/x86/MinGW PLATFORM
+#
+# $Id$
+# Copyright (c) 2001-2020 Ravenbrook Limited.  See end of file for license.
+
+PFM = w3i3gc
+
+MPMPF = \
+    lockw3.c \
+    mpsiw3.c \
+    prmci3.c \
+    prmcw3.c \
+    prmcw3i3.c \
+    protw3.c \
+    spw3i3.c \
+    thw3.c \
+    vmw3.c
+
+include mingw.gmk
+include comm.gmk
+
+# Installation stuff copied from ../Makefile.in
+
+prefix=d:/usr
+INSTALL_PROGRAM = /bin/install -c
+INSTALL_DATA = /bin/install -c -m 644
+MPS_TARGET_NAME = w3i3gc
+
+build-via-make:
+	$(MAKE) -f $(MPS_TARGET_NAME).gmk EXTRA_TARGETS="$(EXTRA_TARGETS)"
+
+install-make-build: make-install-dirs build-via-make
+	$(INSTALL_DATA) mps*.h $(prefix)/include/
+	$(INSTALL_DATA) $(MPS_TARGET_NAME)/cool/mps.a $(prefix)/lib/libmps-debug.a
+	$(INSTALL_DATA) $(MPS_TARGET_NAME)/hot/mps.a $(prefix)/lib/libmps.a
+	for PROGRAM in $(EXTRA_TARGETS); do $(INSTALL_PROGRAM) $(MPS_TARGET_NAME)/hot/$$PROGRAM $(prefix)/bin/$$PROGRAM; done
+
+make-install-dirs:
+	mkdir -p $(prefix)/bin
+	mkdir -p $(prefix)/lib
+	mkdir -p $(prefix)/include
+
+install: install-make-build
+
+# C. COPYRIGHT AND LICENSE
+#
+# Copyright (C) 2001-2020 Ravenbrook Limited <https://www.ravenbrook.com/>.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the
+#    distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-27  8:02     ` Eli Zaretskii
@ 2024-07-27 10:42       ` Pip Cet
  2024-07-27 12:14         ` Eli Zaretskii
  2024-07-27 16:09         ` Michael Albinus
  0 siblings, 2 replies; 119+ messages in thread
From: Pip Cet @ 2024-07-27 10:42 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

On Saturday, July 27th, 2024 at 08:02, Eli Zaretskii <eliz@gnu.org> wrote:
> > Date: Thu, 25 Jul 2024 15:39:51 +0000
> 
> > From: Pip Cet pipcet@protonmail.com
> > Cc: emacs-devel@gnu.org
> > 
> > On Thursday, July 25th, 2024 at 07:16, Eli Zaretskii eliz@gnu.org wrote:
> > 
> > > I think you are indeed the first one. I use 32-bit MinGW, and for
> > > that I have a working build of MPS (and can share the diffs if someone
> > > wants them), but a 64-bit MinGW build of MPS will need other changes,
> > > at least in some cases.
> > 
> > It'd be great if you could share the diffs, so I could see where I've gone wrong! I've got the 64-bit build with mps to start by now, but haven't really tested it for stability much. It survives a few garbage collection cycles, at least.
> 
> 
> My diffs are attached below.

Thanks!

> Note that they are for the 32-bit MinGW
> build, so not all of them are relevant for a 64-bit MinGW build, and
> some stuff for a 64-bit build is missing and you will have to add it.

Understood.

> For example, the code/w3i3gc.gmk file is only for the 32-bit build;
> you will need to create code/w3i6gc.gmk instead. You'll also need to
> add the 64-bit MinGW fragment to code/mpstd.h (where I added the stuff
> for the 32-bit MinGW).
> 
> To build, I did the following from the MSYS Bash prompt:
> 
> $ cd code
> $ make -f w3i3gc.gmk
> 
> To run the test suite, I did the following from the cmd window:
> 
> d:\usr\...\mps-release-1.118.0\code>..\tool\testrun.bat w3i3gc cool testrun
> 
> 
> (where "..." stands for the specific place I have the sources, which
> is immaterial for the purposes of this discussion).
> 
> To install, say from the MSYS Bash:
> 
> $ make install
> 
> > As a general question, would there be interest in CI for such systems? I'm setting up something locally, but I've been trying to be careful so that the Dockerfiles I'm using should work on x86_64 GNU/Linux machines generally.
> 
> 
> I think it will be useful, but I don't know how much effort it will
> need from you, so I cannot say if it's justified at this stage.

What is the state of Emacs CI generally? emba.gnu.org doesn't even appear to be reachable at this point...

> > > > - _setjmp_ex assumes 16-byte alignment of jmp_buf to store the XMM registers, but we allocate handlers with 8-byte alignment in MPS builds.
> > > 
> > > Where and how do you see that?
> > 
> > I'm not quite sure what you're asking. I saw this trying to run things in wine in a docker image on an x86_64 GNU/Linux machine, ran it in gdb.exe, found the instruction causing the segfault, and fixed things so it wouldn't.
> > 
> > https://gitlab.winehq.org/wine/wine/-/blob/master/dlls/winecrt0/setjmp.c#L123 is the instruction that segfaulted here. I'm not sure whether that's what you were asking.
> > 
> > The jump buffer is declared with 16-byte alignment here: https://gitlab.winehq.org/wine/wine/-/blob/master/include/msvcrt/setjmp.h#L50
> > 
> > A side effect of this is that LISP_ALIGNMENT is 16, which breaks MPS because vectorlike_nbytes rounds up to a multiple of LISP_ALIGNMENT, not just GCALIGNMENT.
> 
> 
> If the "_setjmp_ex assumes 16-byte alignment of jmp_buf to store the
> XMM registers" part is about what Wine does, then my question is where
> did you see that "we allocate handlers with 8-byte alignment in MPS
> builds"?

All our pools are aligned to IGC_ALIGN, which is GCALIGNMENT, which is 8 bytes on this system.

> > Looking over my diff, here's what I had to fix to get things to the current stage on msys and msys2 (using MSYSTEM=MINGW64).
> > 
> > - disable the sanity check in the Makefile, because backticks/pipes don't work properly
> How so? what doesn't work? By "makefile", which Makefile do you mean?
> the one in Emacs or the one in MPS?

It's the Emacs Makefile. I haven't investigated properly, but it seems output to stdout and stderr is sometimes dropped.

> > - make WINDRES include the --use-temp-file flag, for the same reason

> Is this in Emacs Makefiles? I guess Wine is not a good emulation of
> Windows, then.

Yes.

> > - wrap the add-name-to-file calls in loadup.el in with-demoted-errors (link problems?)
> 
> I have no idea. Maybe hard links are not properly emulated by Wine?
> 
> > - force LISP_ALIGNMENT to be 8, not 16
> 
> 
> Does this mean 'struct Lisp_*' structures are 16-byte aligned in the
> 64-bit MinGW build? If not, what forces LISP_ALIGNMENT to be 16?

emacs_align_type contains struct thread_state, which contains a jmpbuf, which is 16-byte aligned.

> > - change my local generation size settings to be much more conservative for the msys build. I think scratch/igc is fine, though.
> 
> Don't understand what this means, sorry. What are your "local
> generation size settings"?

Ignore that, it's not in scratch/igc and not required for it. Sorry.

> > - make sys_setjmp and sys_longjmp use a larger buffer and memmove() the data in it so it's 16-byte aligned
> 
> Why would this be any different from a non-MPS build for 64-bit MinGW?

Because non-MPS allocates handlers with xmalloc(), which is 16-byte aligned, and the jmpbuf in it is, too. I expect the change is required on MPS builds on native Windows, too, though, because that also specifies 16-byte alignment for jmpbuf, IIUC.

> > - disable the failure exit on close_stream failure in sysdep.c, and silently ignore such errors
> I guess you are using UCRT? These problems with UCRT are known, but
> no one came up with an explanation for them yet. What happens if you
> link against MSVCRT instead?

I'm using the msys2-docker-experimental image with MSYSTEM=MINGW64. I don't know whether that means I'm using UCRT, sorry. If I use MSYSTEM=UCRT64, I get many more and different problems...

> > - trace the extra 'ztrillion' bignum in timefns.c
> What happens if you don't?

Oops, sorry, bignum tracing isn't in scratch/igc. So ignore that one, too.

> > - for the msys build, run autogen.sh outside of wine, since there are virtual memory issues inflooping the process otherwise
> 
> Sounds like Wine is not a good idea at all...

Specifically, I'm seeing messages such as this one:

      0 [main] perl 508 fork_copy: linked dll data/bss pass 0 failed, 0x56CDE000..0x56CFE794, done 0, windows pid 1352, Win32 error 5

The library in question is msys-perl5_8.dll, and using rebase.exe (from cygwin?) to rebase it to 0x7000000 appears to help.

I tend to agree that using wine for 32-bit mingw is problematic. Using it for 64-bit systems seems fine.

> Here are the diffs I promised.

Thanks again!

Pip



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-27 10:42       ` Pip Cet
@ 2024-07-27 12:14         ` Eli Zaretskii
  2024-07-27 15:49           ` Pip Cet
  2024-07-27 16:09         ` Michael Albinus
  1 sibling, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-07-27 12:14 UTC (permalink / raw)
  To: Pip Cet; +Cc: emacs-devel

> Date: Sat, 27 Jul 2024 10:42:12 +0000
> From: Pip Cet <pipcet@protonmail.com>
> Cc: emacs-devel@gnu.org
> 
> > If the "_setjmp_ex assumes 16-byte alignment of jmp_buf to store the
> > XMM registers" part is about what Wine does, then my question is where
> > did you see that "we allocate handlers with 8-byte alignment in MPS
> > builds"?
> 
> All our pools are aligned to IGC_ALIGN, which is GCALIGNMENT, which is 8 bytes on this system.
> [...]
> > > - force LISP_ALIGNMENT to be 8, not 16
> > 
> > 
> > Does this mean 'struct Lisp_*' structures are 16-byte aligned in the
> > 64-bit MinGW build? If not, what forces LISP_ALIGNMENT to be 16?
> 
> emacs_align_type contains struct thread_state, which contains a jmpbuf, which is 16-byte aligned.

And that is specific to MS-Windows?  Don't Posix systems store XMM
registers in jmpbuf as well?

> > > - make sys_setjmp and sys_longjmp use a larger buffer and memmove() the data in it so it's 16-byte aligned
> > 
> > Why would this be any different from a non-MPS build for 64-bit MinGW?
> 
> Because non-MPS allocates handlers with xmalloc(), which is 16-byte aligned, and the jmpbuf in it is, too. I expect the change is required on MPS builds on native Windows, too, though, because that also specifies 16-byte alignment for jmpbuf, IIUC.

Maybe the way you made MPS compile with MinGW64 is incorrect, because
it ought to return the same alignment as malloc on the target
platform?  What is the value of MPS_PF_ALIGN you used for building
MPS?  Also, did the library pass the test suite?  I had some failures
until I set MPS_PF_ALIGN to the right value (8 for the 32-bit build).

> > > - disable the failure exit on close_stream failure in sysdep.c, and silently ignore such errors
> > I guess you are using UCRT? These problems with UCRT are known, but
> > no one came up with an explanation for them yet. What happens if you
> > link against MSVCRT instead?
> 
> I'm using the msys2-docker-experimental image with MSYSTEM=MINGW64. I don't know whether that means I'm using UCRT, sorry. If I use MSYSTEM=UCRT64, I get many more and different problems...

There are no problems with close_stream when linking against MSVCRT,
AFAIK.  Problems such as what you report were only reported in UCRT
build.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-25 11:35 ` Eli Zaretskii
@ 2024-07-27 14:22   ` Angelo Graziosi
  0 siblings, 0 replies; 119+ messages in thread
From: Angelo Graziosi @ 2024-07-27 14:22 UTC (permalink / raw)
  To: Pip Cet; +Cc: emacs-devel


> I'm using the msys2-docker-experimental image with MSYSTEM=MINGW64. I don't 
> know whether that means I'm using UCRT, sorry. If I use MSYSTEM=UCRT64, I get 
> many more and different problems...

I build Emacs master regularly for UCRT64 using the patches that MSYS2 
people uses for Emacs 29:

https://github.com/msys2/MINGW-packages/blob/master/mingw-w64-emacs/001-ucrt.patch

https://github.com/msys2/MINGW-packages/blob/master/mingw-w64-emacs/002-clang-fixes.patch

they still applies to master (just some Hunk #1 succeeded message).

You have to build from *UCRT64 shell* or set

MSYSTEM="UCRT64"
PATH="/ucrt64/bin:$PATH"

in a build script (so, mimicking that shell). As you have seen, this 
does not produce warnings...



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-27 12:14         ` Eli Zaretskii
@ 2024-07-27 15:49           ` Pip Cet
  2024-07-27 16:10             ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Pip Cet @ 2024-07-27 15:49 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

On Saturday, July 27th, 2024 at 12:14, Eli Zaretskii <eliz@gnu.org> wrote:
> > Date: Sat, 27 Jul 2024 10:42:12 +0000
> 
> > From: Pip Cet pipcet@protonmail.com
> > Cc: emacs-devel@gnu.org
> > 
> > > If the "_setjmp_ex assumes 16-byte alignment of jmp_buf to store the
> > > XMM registers" part is about what Wine does, then my question is where
> > > did you see that "we allocate handlers with 8-byte alignment in MPS
> > > builds"?
> > 
> > All our pools are aligned to IGC_ALIGN, which is GCALIGNMENT, which is 8 bytes on this system.
> > [...]
> > 
> > > > - force LISP_ALIGNMENT to be 8, not 16
> > > 
> > > Does this mean 'struct Lisp_*' structures are 16-byte aligned in the
> > > 64-bit MinGW build? If not, what forces LISP_ALIGNMENT to be 16?
> > 
> > emacs_align_type contains struct thread_state, which contains a jmpbuf, which is 16-byte aligned.
> 
> 
> And that is specific to MS-Windows? Don't Posix systems store XMM
> registers in jmpbuf as well?

The SYSV ABI declares all XMM registers to be caller-saved, which means on such systems we don't store the XMM registers in a jmpbuf.

> > > > - make sys_setjmp and sys_longjmp use a larger buffer and memmove() the data in it so it's 16-byte aligned
> > > 
> > > Why would this be any different from a non-MPS build for 64-bit MinGW?
> > 
> > Because non-MPS allocates handlers with xmalloc(), which is 16-byte aligned, and the jmpbuf in it is, too. I expect the change is required on MPS builds on native Windows, too, though, because that also specifies 16-byte alignment for jmpbuf, IIUC.
> 
> Maybe the way you made MPS compile with MinGW64 is incorrect,

Very possible.

> because
> it ought to return the same alignment as malloc on the target
> platform?

I'm not sure that's correct, I think it assumes you pass the right value for MPS_KEY_FMT_ALIGN. Currently the code passes 8, which is necessary to keep conses at a mere 24 bytes.

> What is the value of MPS_PF_ALIGN you used for building
> MPS? Also, did the library pass the test suite? I had some failures
> until I set MPS_PF_ALIGN to the right value (8 for the 32-bit build).

The patch you sent has it at 4, though?

> > > > - disable the failure exit on close_stream failure in sysdep.c, and silently ignore such errors
> > > > I guess you are using UCRT? These problems with UCRT are known, but
> > > > no one came up with an explanation for them yet. What happens if you
> > > > link against MSVCRT instead?
> > 
> > I'm using the msys2-docker-experimental image with MSYSTEM=MINGW64. I don't know whether that means I'm using UCRT, sorry. If I use MSYSTEM=UCRT64, I get many more and different problems...
> 
> There are no problems with close_stream when linking against MSVCRT,
> AFAIK. Problems such as what you report were only reported in UCRT
> build.

I think the problem is init_ntproc in w32.c, which closes stdin, stdout, stderr, then calls _fdopen and assumes the result will live in stdin, stdout, stderr again. If I disable that code the backtick problem goes away:

    fclose (stdin);
    fclose (stdout);
    fclose (stderr);

    if (stdin_save != INVALID_HANDLE_VALUE)
      _open_osfhandle ((intptr_t) stdin_save, O_TEXT);
    else
      _open ("nul", O_TEXT | O_NOINHERIT | O_RDONLY);
    _fdopen (0, "r");

I believe that last line should, possibly, on some systems, be

    stdin = _fdopen (0, "r");

but I'm not sure the variable (or macro) stdin is an lvalue. That's probably why close_stream(stdout) and close_stream(stderr) fail, too: the streams they refer to are already closed, and the new streams we should be using instead were discarded.

Pip



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-27 10:42       ` Pip Cet
  2024-07-27 12:14         ` Eli Zaretskii
@ 2024-07-27 16:09         ` Michael Albinus
  2024-07-28 13:22           ` Pip Cet
  1 sibling, 1 reply; 119+ messages in thread
From: Michael Albinus @ 2024-07-27 16:09 UTC (permalink / raw)
  To: Pip Cet; +Cc: Eli Zaretskii, emacs-devel

Pip Cet <pipcet@protonmail.com> writes:

Hi,

> What is the state of Emacs CI generally? emba.gnu.org doesn't even appear to be reachable at this point...

emba.gnu.org is in a bad state I cannot fix myself. I've asked several
times for help from people who are knowing GitLab better than I do. No
response, unfortunately.

> Pip

Best regards, Michael.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-27 15:49           ` Pip Cet
@ 2024-07-27 16:10             ` Eli Zaretskii
  2024-07-27 16:56               ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-07-27 16:10 UTC (permalink / raw)
  To: Pip Cet; +Cc: emacs-devel

> Date: Sat, 27 Jul 2024 15:49:59 +0000
> From: Pip Cet <pipcet@protonmail.com>
> Cc: emacs-devel@gnu.org
> 
> > > > > - force LISP_ALIGNMENT to be 8, not 16
> > > > 
> > > > Does this mean 'struct Lisp_*' structures are 16-byte aligned in the
> > > > 64-bit MinGW build? If not, what forces LISP_ALIGNMENT to be 16?
> > > 
> > > emacs_align_type contains struct thread_state, which contains a jmpbuf, which is 16-byte aligned.
> > 
> > 
> > And that is specific to MS-Windows? Don't Posix systems store XMM
> > registers in jmpbuf as well?
> 
> The SYSV ABI declares all XMM registers to be caller-saved, which means on such systems we don't store the XMM registers in a jmpbuf.
> 
> > > > > - make sys_setjmp and sys_longjmp use a larger buffer and memmove() the data in it so it's 16-byte aligned
> > > > 
> > > > Why would this be any different from a non-MPS build for 64-bit MinGW?
> > > 
> > > Because non-MPS allocates handlers with xmalloc(), which is 16-byte aligned, and the jmpbuf in it is, too. I expect the change is required on MPS builds on native Windows, too, though, because that also specifies 16-byte alignment for jmpbuf, IIUC.
> > 
> > Maybe the way you made MPS compile with MinGW64 is incorrect,
> 
> Very possible.
> 
> > because
> > it ought to return the same alignment as malloc on the target
> > platform?
> 
> I'm not sure that's correct, I think it assumes you pass the right value for MPS_KEY_FMT_ALIGN. Currently the code passes 8, which is necessary to keep conses at a mere 24 bytes.
> 
> > What is the value of MPS_PF_ALIGN you used for building
> > MPS? Also, did the library pass the test suite? I had some failures
> > until I set MPS_PF_ALIGN to the right value (8 for the 32-bit build).
> 
> The patch you sent has it at 4, though?

Yes, because some tests failed with 8.

But note that the MSVC 64-bit build uses 16.

> > > > > - disable the failure exit on close_stream failure in sysdep.c, and silently ignore such errors
> > > > > I guess you are using UCRT? These problems with UCRT are known, but
> > > > > no one came up with an explanation for them yet. What happens if you
> > > > > link against MSVCRT instead?
> > > 
> > > I'm using the msys2-docker-experimental image with MSYSTEM=MINGW64. I don't know whether that means I'm using UCRT, sorry. If I use MSYSTEM=UCRT64, I get many more and different problems...
> > 
> > There are no problems with close_stream when linking against MSVCRT,
> > AFAIK. Problems such as what you report were only reported in UCRT
> > build.
> 
> I think the problem is init_ntproc in w32.c, which closes stdin, stdout, stderr, then calls _fdopen and assumes the result will live in stdin, stdout, stderr again. If I disable that code the backtick problem goes away:
> 
>     fclose (stdin);
>     fclose (stdout);
>     fclose (stderr);
> 
>     if (stdin_save != INVALID_HANDLE_VALUE)
>       _open_osfhandle ((intptr_t) stdin_save, O_TEXT);
>     else
>       _open ("nul", O_TEXT | O_NOINHERIT | O_RDONLY);
>     _fdopen (0, "r");

Why do you think it's a problem?  And why do you think the assumption
of fdopen is incorrect?  It is confirmed by the source code of MSVCRT.

> I believe that last line should, possibly, on some systems, be
> 
>     stdin = _fdopen (0, "r");
> 
> but I'm not sure the variable (or macro) stdin is an lvalue. That's probably why close_stream(stdout) and close_stream(stderr) fail, too: the streams they refer to are already closed, and the new streams we should be using instead were discarded.

But this never fails in MinGW builds on Windows.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-27 16:10             ` Eli Zaretskii
@ 2024-07-27 16:56               ` Eli Zaretskii
  2024-07-27 18:27                 ` Pip Cet
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-07-27 16:56 UTC (permalink / raw)
  To: pipcet; +Cc: emacs-devel

> Date: Sat, 27 Jul 2024 19:10:50 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> Cc: emacs-devel@gnu.org
> 
> > I think the problem is init_ntproc in w32.c, which closes stdin, stdout, stderr, then calls _fdopen and assumes the result will live in stdin, stdout, stderr again. If I disable that code the backtick problem goes away:
> > 
> >     fclose (stdin);
> >     fclose (stdout);
> >     fclose (stderr);
> > 
> >     if (stdin_save != INVALID_HANDLE_VALUE)
> >       _open_osfhandle ((intptr_t) stdin_save, O_TEXT);
> >     else
> >       _open ("nul", O_TEXT | O_NOINHERIT | O_RDONLY);
> >     _fdopen (0, "r");
> 
> Why do you think it's a problem?  And why do you think the assumption
> of fdopen is incorrect?  It is confirmed by the source code of MSVCRT.
> 
> > I believe that last line should, possibly, on some systems, be
> > 
> >     stdin = _fdopen (0, "r");
> > 
> > but I'm not sure the variable (or macro) stdin is an lvalue. That's probably why close_stream(stdout) and close_stream(stderr) fail, too: the streams they refer to are already closed, and the new streams we should be using instead were discarded.
> 
> But this never fails in MinGW builds on Windows.

And if I change w32.c like below:

diff --git a/src/w32.c b/src/w32.c
index 31ffa30..c28a234 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -10517,20 +10517,21 @@ init_ntproc (int dumping)
     fclose (stdout);
     fclose (stderr);
 
+    int fd;
     if (stdin_save != INVALID_HANDLE_VALUE)
-      _open_osfhandle ((intptr_t) stdin_save, O_TEXT);
+      fd = _open_osfhandle ((intptr_t) stdin_save, O_TEXT);
     else
       _open ("nul", O_TEXT | O_NOINHERIT | O_RDONLY);
     _fdopen (0, "r");
 
     if (stdout_save != INVALID_HANDLE_VALUE)
-      _open_osfhandle ((intptr_t) stdout_save, O_TEXT);
+      fd = _open_osfhandle ((intptr_t) stdout_save, O_TEXT);
     else
       _open ("nul", O_TEXT | O_NOINHERIT | O_WRONLY);
     _fdopen (1, "w");
 
     if (stderr_save != INVALID_HANDLE_VALUE)
-      _open_osfhandle ((intptr_t) stderr_save, O_TEXT);
+      fd = _open_osfhandle ((intptr_t) stderr_save, O_TEXT);
     else
       _open ("nul", O_TEXT | O_NOINHERIT | O_WRONLY);
     _fdopen (2, "w");

then stepping through this code I see that fd is first assigned zero,
then 1, then 2.  As expected, because any decent emulation of Posix
file descriptors must keep this semantics: file descriptors are reused
starting from the lowest available slot.

Do you see something different in your build?



^ permalink raw reply related	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-27 16:56               ` Eli Zaretskii
@ 2024-07-27 18:27                 ` Pip Cet
  2024-07-27 18:50                   ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Pip Cet @ 2024-07-27 18:27 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

On Saturday, July 27th, 2024 at 16:56, Eli Zaretskii <eliz@gnu.org> wrote:
> then stepping through this code I see that fd is first assigned zero,
> then 1, then 2. As expected, because any decent emulation of Posix
> file descriptors must keep this semantics: file descriptors are reused
> starting from the lowest available slot.
> 
> Do you see something different in your build?

_open_osfhandle returns 0 for the first FD, but _fdopen returns 0x7b281160, while stdin is 0x7b281100.

I believe that _fdopen (0, "r") returns stdin if it has previously been closed is an implementation detail of Windows that Emacs relies on, and that wine fails to properly emulate. IMHO, this is a wine bug, but Emacs also shouldn't rely on it unless it's documented as part of the API; I don't know whether it is.

Pip



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-27 18:27                 ` Pip Cet
@ 2024-07-27 18:50                   ` Eli Zaretskii
  2024-07-27 20:22                     ` Pip Cet
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-07-27 18:50 UTC (permalink / raw)
  To: Pip Cet; +Cc: emacs-devel

> Date: Sat, 27 Jul 2024 18:27:43 +0000
> From: Pip Cet <pipcet@protonmail.com>
> Cc: emacs-devel@gnu.org
> 
> On Saturday, July 27th, 2024 at 16:56, Eli Zaretskii <eliz@gnu.org> wrote:
> > then stepping through this code I see that fd is first assigned zero,
> > then 1, then 2. As expected, because any decent emulation of Posix
> > file descriptors must keep this semantics: file descriptors are reused
> > starting from the lowest available slot.
> > 
> > Do you see something different in your build?
> 
> _open_osfhandle returns 0 for the first FD, but _fdopen returns 0x7b281160, while stdin is 0x7b281100.

Not on my system.  Here _fdopen returns a pointer to the same FILE
object as the original std* streams.  And it is also expected, since
the source code of MSVCRT explicitly shows that _fdopen calls a
routine that looks up a vacant stream slot, and that routine examines
the _iob[] array in the ascending order of indices, from zero to max,
until it finds an unused slot.

> I believe that _fdopen (0, "r") returns stdin if it has previously been closed is an implementation detail of Windows that Emacs relies on, and that wine fails to properly emulate. IMHO, this is a wine bug, but Emacs also shouldn't rely on it unless it's documented as part of the API; I don't know whether it is.

I believe this is how every Posix-like allocation of FILE objects
should behave.  I'm astonished that Wine doesn't work like that, since
it's the easiest way.

Moreover, the MS documentation says about the standard streams:

  These pointers are constants, and can't be assigned new values.

So you cannot do "stdin = _fdopen (...);" and hope for all the
references to stdin in the rest of the program to use the new value of
the stream pointer.  IOW, what Emacs does is the only way of doing
that.




^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-27 18:50                   ` Eli Zaretskii
@ 2024-07-27 20:22                     ` Pip Cet
  2024-07-28  5:25                       ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Pip Cet @ 2024-07-27 20:22 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

On Saturday, July 27th, 2024 at 18:50, Eli Zaretskii <eliz@gnu.org> wrote:
> > Date: Sat, 27 Jul 2024 18:27:43 +0000
> 
> > From: Pip Cet pipcet@protonmail.com
> > Cc: emacs-devel@gnu.org
> > 
> > On Saturday, July 27th, 2024 at 16:56, Eli Zaretskii eliz@gnu.org wrote:
> > 
> > > then stepping through this code I see that fd is first assigned zero,
> > > then 1, then 2. As expected, because any decent emulation of Posix
> > > file descriptors must keep this semantics: file descriptors are reused
> > > starting from the lowest available slot.
> > > 
> > > Do you see something different in your build?
> > 
> > _open_osfhandle returns 0 for the first FD, but _fdopen returns 0x7b281160, while stdin is 0x7b281100.
> 
> 
> Not on my system. Here _fdopen returns a pointer to the same FILE
> object as the original std* streams. And it is also expected, since
> the source code of MSVCRT explicitly shows that _fdopen calls a
> routine that looks up a vacant stream slot, and that routine examines
> the _iob[] array in the ascending order of indices, from zero to max,
> until it finds an unused slot.

Wine does the same thing, except it starts at index 3:

  for (i = 3; i < MSVCRT_max_streams; i++)
  {
    file = msvcrt_get_file(i);
    if (!file)
      return NULL;

    if (file->_flag == 0)
    {
      if (i == MSVCRT_stream_idx)
      {
          CRITICAL_SECTION *cs = file_get_cs(file);
          if (cs)
          {
              InitializeCriticalSectionEx(cs, 0, RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO);
              cs->DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": file_crit.crit");
          }
          MSVCRT_stream_idx++;
      }
      return file;
    }
  }

It's been that way since 2004, if the git history is to be believed.

Fixing wine (single-character fixes are my favorite) to start at index 0 makes things work.

> > I believe that _fdopen (0, "r") returns stdin if it has previously been closed is an implementation detail of Windows that Emacs relies on, and that wine fails to properly emulate. IMHO, this is a wine bug, but Emacs also shouldn't rely on it unless it's documented as part of the API; I don't know whether it is.
> 
> 
> I believe this is how every Posix-like allocation of FILE objects
> should behave. I'm astonished that Wine doesn't work like that, since
> it's the easiest way.
> 
> Moreover, the MS documentation says about the standard streams:
> 
> These pointers are constants, and can't be assigned new values.
> 
> So you cannot do "stdin = _fdopen (...);" and hope for all the
> references to stdin in the rest of the program to use the new value of
> the stream pointer. IOW, what Emacs does is the only way of doing
> that.

Well, there's freopen, but no fdreopen, so you're probably right...

Pip



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-27 20:22                     ` Pip Cet
@ 2024-07-28  5:25                       ` Eli Zaretskii
  2024-07-28 13:00                         ` Pip Cet
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-07-28  5:25 UTC (permalink / raw)
  To: Pip Cet; +Cc: emacs-devel

> Date: Sat, 27 Jul 2024 20:22:34 +0000
> From: Pip Cet <pipcet@protonmail.com>
> Cc: emacs-devel@gnu.org
> 
> On Saturday, July 27th, 2024 at 18:50, Eli Zaretskii <eliz@gnu.org> wrote:
> > > Date: Sat, 27 Jul 2024 18:27:43 +0000
> > 
> > > From: Pip Cet pipcet@protonmail.com
> > > Cc: emacs-devel@gnu.org
> > > 
> > > On Saturday, July 27th, 2024 at 16:56, Eli Zaretskii eliz@gnu.org wrote:
> > > 
> > > > then stepping through this code I see that fd is first assigned zero,
> > > > then 1, then 2. As expected, because any decent emulation of Posix
> > > > file descriptors must keep this semantics: file descriptors are reused
> > > > starting from the lowest available slot.
> > > > 
> > > > Do you see something different in your build?
> > > 
> > > _open_osfhandle returns 0 for the first FD, but _fdopen returns 0x7b281160, while stdin is 0x7b281100.
> > 
> > 
> > Not on my system. Here _fdopen returns a pointer to the same FILE
> > object as the original std* streams. And it is also expected, since
> > the source code of MSVCRT explicitly shows that _fdopen calls a
> > routine that looks up a vacant stream slot, and that routine examines
> > the _iob[] array in the ascending order of indices, from zero to max,
> > until it finds an unused slot.
> 
> Wine does the same thing, except it starts at index 3:
> 
>   for (i = 3; i < MSVCRT_max_streams; i++)
>   {
>     file = msvcrt_get_file(i);
>     if (!file)
>       return NULL;
> 
>     if (file->_flag == 0)
>     {
>       if (i == MSVCRT_stream_idx)
>       {
>           CRITICAL_SECTION *cs = file_get_cs(file);
>           if (cs)
>           {
>               InitializeCriticalSectionEx(cs, 0, RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO);
>               cs->DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": file_crit.crit");
>           }
>           MSVCRT_stream_idx++;
>       }
>       return file;
>     }
>   }
> 
> It's been that way since 2004, if the git history is to be believed.

I guess they have some unsolved issues with the standard streams,
which is why they don't dare reusing their slots.  Which means closing
these standard streams is a no-no on Wine.

But if this is what Wine does, then what do you get from the various
fprintf debugging code in Emacs?  For example, if you build with the
"--enable-checking='yes,glyphs'" option, you get the trace-redisplay
command which outputs debugging information about redisplay to stderr,
and also the dump-glyph-matrix command which prints the glyph matrix
to stderr.  Do these print-outs still work although stderr was closed
in init_ntproc?

Or maybe under Wine closing a standard stream has no effect, and the
stream remains open?  But then why does close_output_streams reports
errors?



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-28  5:25                       ` Eli Zaretskii
@ 2024-07-28 13:00                         ` Pip Cet
  2024-07-28 14:20                           ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Pip Cet @ 2024-07-28 13:00 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

On Sunday, July 28th, 2024 at 05:25, Eli Zaretskii <eliz@gnu.org> wrote:
> > Date: Sat, 27 Jul 2024 20:22:34 +0000
> > From: Pip Cet pipcet@protonmail.com
> > Cc: emacs-devel@gnu.org
> > It's been that way since 2004, if the git history is to be believed.
> 
> I guess they have some unsolved issues with the standard streams,
> which is why they don't dare reusing their slots. Which means closing
> these standard streams is a no-no on Wine.

I don't know. I suspect they just never thought (20 years ago!) that anyone would want to close a standard stream. Any idea what UCRT does?

> But if this is what Wine does, then what do you get from the various
> fprintf debugging code in Emacs? For example, if you build with the
> "--enable-checking='yes,glyphs'" option, you get the trace-redisplay
> command which outputs debugging information about redisplay to stderr,
> and also the dump-glyph-matrix command which prints the glyph matrix
> to stderr. Do these print-outs still work although stderr was closed
> in init_ntproc?

I tried with GDB, and fprintf(stderr, ...) stops working in init_ntproc.

> Or maybe under Wine closing a standard stream has no effect, and the
> stream remains open? But then why does close_output_streams reports
> errors?

The FILE object remains assigned to its FD but loses its writable/readable flag, so fwrite returns -1/EBADF.  fclose() returns -1 (though it's spelled EOF in the source code) and doesn't set errno.

As for the code in question, if I understand it correctly, the current Windows idiom would be simply (I assume _open_osfhandle clears the flag?):

SetHandleInformation (GetStdHandle (STD_INPUT_HANDLE), HANDLE_FLAG_INHERIT, 0);

The version information for availability of "SetHandleInformation" and "DuplicateHandle" is the same, so any idea why we're not just doing that, or is it just lost in history?

Pip



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-27 16:09         ` Michael Albinus
@ 2024-07-28 13:22           ` Pip Cet
  0 siblings, 0 replies; 119+ messages in thread
From: Pip Cet @ 2024-07-28 13:22 UTC (permalink / raw)
  To: Michael Albinus; +Cc: Eli Zaretskii, emacs-devel

On Saturday, July 27th, 2024 at 16:09, Michael Albinus <michael.albinus@gmx.de> wrote:
> Pip Cet pipcet@protonmail.com writes:
> > What is the state of Emacs CI generally? emba.gnu.org doesn't even appear to be reachable at this point...
> 
> emba.gnu.org is in a bad state I cannot fix myself. I've asked several
> times for help from people who are knowing GitLab better than I do. No
> response, unfortunately.

Oh. That's a pity. Were those requests public? If so, do you have a link?

Would switching to forgejo be an option, maybe? That _claims_ to be easy to set up, and it's also the platform I'm playing with right now; and there seems to be a strong focus on keeping the project free in more than the technical sense, which is what irritates me about gitlab.com.

(The SourceHut software is also free, but doesn't claim to be, and isn't, easy to set up.)

No idea whether resources for such experiments are available though, and I don't know about the use of GNU resources for CI for free reimplementations of non-free operating systems, either with a wholly free toolchain (Wine) or a decidedly non-free SDK (Android-based); my understanding is that any significant development work for macOS requires non-free Apple software and a developer's license that you have to pay for, so I assume that one's out of the question.

I can volunteer to look at things as a one-off effort, but can't take over any regular or recurring maintenance work at this point.

Pip



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-28 13:00                         ` Pip Cet
@ 2024-07-28 14:20                           ` Eli Zaretskii
  2024-07-28 15:00                             ` Pip Cet
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-07-28 14:20 UTC (permalink / raw)
  To: Pip Cet; +Cc: emacs-devel

> Date: Sun, 28 Jul 2024 13:00:20 +0000
> From: Pip Cet <pipcet@protonmail.com>
> Cc: emacs-devel@gnu.org
> 
> On Sunday, July 28th, 2024 at 05:25, Eli Zaretskii <eliz@gnu.org> wrote:
> > > Date: Sat, 27 Jul 2024 20:22:34 +0000
> > > From: Pip Cet pipcet@protonmail.com
> > > Cc: emacs-devel@gnu.org
> > > It's been that way since 2004, if the git history is to be believed.
> > 
> > I guess they have some unsolved issues with the standard streams,
> > which is why they don't dare reusing their slots. Which means closing
> > these standard streams is a no-no on Wine.
> 
> I don't know. I suspect they just never thought (20 years ago!) that anyone would want to close a standard stream. Any idea what UCRT does?

It seems to be doing the same as MSVCRT, at least if the UCRT sources
available out there are to be believed.

> > But if this is what Wine does, then what do you get from the various
> > fprintf debugging code in Emacs? For example, if you build with the
> > "--enable-checking='yes,glyphs'" option, you get the trace-redisplay
> > command which outputs debugging information about redisplay to stderr,
> > and also the dump-glyph-matrix command which prints the glyph matrix
> > to stderr. Do these print-outs still work although stderr was closed
> > in init_ntproc?
> 
> I tried with GDB, and fprintf(stderr, ...) stops working in init_ntproc.

So they do fclose the stream, just don't provide a way of reopening a
standard stream.

Is there any way for a program running on Wine to detect that this is
what happens? like some special version number or something?  If so,
I'd just avoid all that code in init_ntproc on Wine, since leaving the
standard streams inheritable is a much smaller trouble than losing the
standard streams.

> As for the code in question, if I understand it correctly, the current Windows idiom would be simply (I assume _open_osfhandle clears the flag?):
> 
> SetHandleInformation (GetStdHandle (STD_INPUT_HANDLE), HANDLE_FLAG_INHERIT, 0);

I'm not sure you can do this without closing the stream, since the
program has already started by that time.  And SetHandleInformation is
only available since Windows 2K, so we'd need to call it through a
function pointer.  Not sure if that is justified just to support Wine
(which probably has quite a few other incompatibilities).

> The version information for availability of "SetHandleInformation" and "DuplicateHandle" is the same, so any idea why we're not just doing that, or is it just lost in history?

See above: we still strive to support Windows 9X and NT.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-28 14:20                           ` Eli Zaretskii
@ 2024-07-28 15:00                             ` Pip Cet
  2024-07-28 15:20                               ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Pip Cet @ 2024-07-28 15:00 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel, rms@gnu.org

On Sunday, July 28th, 2024 at 14:20, Eli Zaretskii <eliz@gnu.org> wrote:
> > Date: Sun, 28 Jul 2024 13:00:20 +0000
> 
> > From: Pip Cet pipcet@protonmail.com
> > Cc: emacs-devel@gnu.org
> > 
> > On Sunday, July 28th, 2024 at 05:25, Eli Zaretskii eliz@gnu.org wrote:
> > 
> > > > Date: Sat, 27 Jul 2024 20:22:34 +0000
> > > > From: Pip Cet pipcet@protonmail.com
> > > > Cc: emacs-devel@gnu.org
> > > > It's been that way since 2004, if the git history is to be believed.
> > > 
> > > I guess they have some unsolved issues with the standard streams,
> > > which is why they don't dare reusing their slots. Which means closing
> > > these standard streams is a no-no on Wine.
> > 
> > I don't know. I suspect they just never thought (20 years ago!) that anyone would want to close a standard stream. Any idea what UCRT does?
> 
> It seems to be doing the same as MSVCRT, at least if the UCRT sources
> available out there are to be believed.

By my reading of the source code I found, it's doing the same as Wine, not as MSVCRT.

> > > But if this is what Wine does, then what do you get from the various
> > > fprintf debugging code in Emacs? For example, if you build with the
> > > "--enable-checking='yes,glyphs'" option, you get the trace-redisplay
> > > command which outputs debugging information about redisplay to stderr,
> > > and also the dump-glyph-matrix command which prints the glyph matrix
> > > to stderr. Do these print-outs still work although stderr was closed
> > > in init_ntproc?
> > 
> > I tried with GDB, and fprintf(stderr, ...) stops working in init_ntproc.
> 
> So they do fclose the stream, just don't provide a way of reopening a
> standard stream.

Not in the way we want, no, unless I missed it.

> Is there any way for a program running on Wine to detect that this is
> what happens? like some special version number or something? If so,
> I'd just avoid all that code in init_ntproc on Wine, since leaving the
> standard streams inheritable is a much smaller trouble than losing the
> standard streams.

I don't think we should have Wine-specific workarounds, particularly not for such questionable code. IIUC, Wine discourages attempts of programs to detect whether they're running on Wine or Microsoft Windows.
 
> > As for the code in question, if I understand it correctly, the current Windows idiom would be simply (I assume _open_osfhandle clears the flag?):
> > 
> > SetHandleInformation (GetStdHandle (STD_INPUT_HANDLE), HANDLE_FLAG_INHERIT, 0);
> 
> I'm not sure you can do this without closing the stream, since the
> program has already started by that time. And SetHandleInformation is
> only available since Windows 2K, so we'd need to call it through a
> function pointer.

Thanks. Microsoft doesn't appear to provide version information pre-Windows-2000...

> Not sure if that is justified just to support Wine

And UCRT, if and when the time comes. And any other implementation of the Windows API that doesn't provide bug-for-bug compatibility with MSVCRT.

Wine is the only significant free implementation of the Windows API, so I disagree with the "just". If I understand RMS correctly, whether there is a free implementation of an OS is an important factor in deciding to redirect resources to supporting it in GNU software.

> (which probably has quite a few other incompatibilities).

I'm aware of the windres problem, but I suspect there are a few others. However, we can't discover them unless we fix the build first, and I am successfully running both mingw/msys/i386 builds and mingw64/msys2/x86_64 builds locally.

> > The version information for availability of "SetHandleInformation" and "DuplicateHandle" is the same, so any idea why we're not just doing that, or is it just lost in history?
> 
> See above: we still strive to support Windows 9X and NT.

You're right, thanks. Do we have people testing such systems?

Pip



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-28 15:00                             ` Pip Cet
@ 2024-07-28 15:20                               ` Eli Zaretskii
  2024-07-28 20:22                                 ` Pip Cet
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-07-28 15:20 UTC (permalink / raw)
  To: Pip Cet; +Cc: emacs-devel, rms

> Date: Sun, 28 Jul 2024 15:00:52 +0000
> From: Pip Cet <pipcet@protonmail.com>
> Cc: emacs-devel@gnu.org, "rms@gnu.org" <rms@gnu.org>
> 
> > It seems to be doing the same as MSVCRT, at least if the UCRT sources
> > available out there are to be believed.
> 
> By my reading of the source code I found, it's doing the same as Wine, not as MSVCRT.

If someone steps through that code in the UCRT build and reports that
fdopen returns a different FILE pointer, I will believe you.

> > Is there any way for a program running on Wine to detect that this is
> > what happens? like some special version number or something? If so,
> > I'd just avoid all that code in init_ntproc on Wine, since leaving the
> > standard streams inheritable is a much smaller trouble than losing the
> > standard streams.
> 
> I don't think we should have Wine-specific workarounds, particularly not for such questionable code. IIUC, Wine discourages attempts of programs to detect whether they're running on Wine or Microsoft Windows.

We don't have to behave like Wine intends us to behave.  We have our
own considerations.  So I don't really care whether Wine endorses
detection of Wine, if we decide we need that.

> > > As for the code in question, if I understand it correctly, the current Windows idiom would be simply (I assume _open_osfhandle clears the flag?):
> > > 
> > > SetHandleInformation (GetStdHandle (STD_INPUT_HANDLE), HANDLE_FLAG_INHERIT, 0);
> > 
> > I'm not sure you can do this without closing the stream, since the
> > program has already started by that time. And SetHandleInformation is
> > only available since Windows 2K, so we'd need to call it through a
> > function pointer.
> 
> Thanks. Microsoft doesn't appear to provide version information pre-Windows-2000...

I use this resource to overcome the deficiencies of the official docs:

  http://winapi.freetechsecrets.com/win32/

> > Not sure if that is justified just to support Wine
> 
> And UCRT, if and when the time comes.

If that's the same problem, which we are not yet sure.  And, as I
said, support for UCRT will only become official if someone volunteers
to come on board and handle that build.

> And any other implementation of the Windows API that doesn't provide bug-for-bug compatibility with MSVCRT.

For now, only the MSVCRT support is official.

> Wine is the only significant free implementation of the Windows API, so I disagree with the "just". If I understand RMS correctly, whether there is a free implementation of an OS is an important factor in deciding to redirect resources to supporting it in GNU software.

Such decisions can only be relevant if there are resources to allocate
and redirect.  Since we don't have them, this is entirely academic.
For now, the only person who actively works on the Windows port is
myself, and I'm unable to support UCRT, for more than one reason.

> > > The version information for availability of "SetHandleInformation" and "DuplicateHandle" is the same, so any idea why we're not just doing that, or is it just lost in history?
> > 
> > See above: we still strive to support Windows 9X and NT.
> 
> You're right, thanks. Do we have people testing such systems?

We do, although not as much as I'd like to.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-28 15:20                               ` Eli Zaretskii
@ 2024-07-28 20:22                                 ` Pip Cet
  2024-07-29 11:25                                   ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Pip Cet @ 2024-07-28 20:22 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel, rms

On Sunday, July 28th, 2024 at 15:20, Eli Zaretskii <eliz@gnu.org> wrote:
> > Date: Sun, 28 Jul 2024 15:00:52 +0000
> 
> > From: Pip Cet pipcet@protonmail.com
> > Cc: emacs-devel@gnu.org, "rms@gnu.org" rms@gnu.org
> > 
> > > It seems to be doing the same as MSVCRT, at least if the UCRT sources
> > > available out there are to be believed.
> > 
> > By my reading of the source code I found, it's doing the same as Wine, not as MSVCRT.
> 
> If someone steps through that code in the UCRT build and reports that
> fdopen returns a different FILE pointer, I will believe you.

I've verified this by running a GitHub action (I won't provide a link because it's probably impossible to use without running proprietary GitHub JavaScript), though I couldn't work out how to make clang link against msvcrt rather than its own libraries.

The result of 

  printf("%p\n", stdin);
  fclose(stdin);
  int fd = _open ("nul", _O_RDWR);
  printf("%d = 0\n", fd);
  FILE *f = _fdopen (fd, "r");
  printf("%p = %p\n", stdin, f);
  return 0;

is, for a MINGW32-built msvcrt binary on windows-latest:

  761f7600
  0 = 0
  761f7600 = 761f7600

but, for a UCRT64-built ucrt binary on windows-latest:

  00007FF8E7E9E4A0
  0 = 0
  00007FF8E7E9E4A0 = 000001F74AFF5660

> > > Is there any way for a program running on Wine to detect that this is
> > > what happens? like some special version number or something? If so,
> > > I'd just avoid all that code in init_ntproc on Wine, since leaving the
> > > standard streams inheritable is a much smaller trouble than losing the
> > > standard streams.
> > 
> > I don't think we should have Wine-specific workarounds, particularly not for such questionable code. IIUC, Wine discourages attempts of programs to detect whether they're running on Wine or Microsoft Windows.
> 
> 
> We don't have to behave like Wine intends us to behave. We have our
> own considerations. So I don't really care whether Wine endorses
> detection of Wine, if we decide we need that.

Let's see whether the Wine people want to provide bug-for-bug compatibility in this case first?

> > > > As for the code in question, if I understand it correctly, the current Windows idiom would be simply (I assume _open_osfhandle clears the flag?):
> > > > 
> > > > SetHandleInformation (GetStdHandle (STD_INPUT_HANDLE), HANDLE_FLAG_INHERIT, 0);
> > > 
> > > I'm not sure you can do this without closing the stream, since the
> > > program has already started by that time. And SetHandleInformation is
> > > only available since Windows 2K, so we'd need to call it through a
> > > function pointer.
> > 
> > Thanks. Microsoft doesn't appear to provide version information pre-Windows-2000...
> 
> I use this resource to overcome the deficiencies of the official docs:
> 
> http://winapi.freetechsecrets.com/win32/

Thanks for the link!

> > > Not sure if that is justified just to support Wine
> > 
> > And UCRT, if and when the time comes.
> 
> If that's the same problem, which we are not yet sure.

Of course.

> And, as I
> said, support for UCRT will only become official if someone volunteers
> to come on board and handle that build.

That's what I meant by "if and when the time comes".

> > And any other implementation of the Windows API that doesn't provide bug-for-bug compatibility with MSVCRT.
>
> For now, only the MSVCRT support is official.

Of course, and I think it's more likely it will cease being official than other builds becoming official.

> > Wine is the only significant free implementation of the Windows API, so I disagree with the "just". If I understand RMS correctly, whether there is a free implementation of an OS is an important factor in deciding to redirect resources to supporting it in GNU software.
>  
> Such decisions can only be relevant if there are resources to allocate
> and redirect.

I think the community of Emacs developers decides by consensus (or bickering) what to work on. My understanding was that we're considering whether to stop working on at least some variants of the Windows port.

> Since we don't have them, this is entirely academic.

Well, I disagree. Official guidance by the GNU Emacs project does have some influence on what volunteers will work on. I consider that a resource.

> For now, the only person who actively works on the Windows port is
> myself, and I'm unable to support UCRT, for more than one reason.

Are you working on MINGW64 systems at all, or is it mingw exclusively?

Pip



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-28 20:22                                 ` Pip Cet
@ 2024-07-29 11:25                                   ` Eli Zaretskii
  2024-07-31  6:18                                     ` Pip Cet
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-07-29 11:25 UTC (permalink / raw)
  To: Pip Cet; +Cc: emacs-devel, rms

> Date: Sun, 28 Jul 2024 20:22:40 +0000
> From: Pip Cet <pipcet@protonmail.com>
> Cc: emacs-devel@gnu.org, rms@gnu.org
> 
> On Sunday, July 28th, 2024 at 15:20, Eli Zaretskii <eliz@gnu.org> wrote:
> > > By my reading of the source code I found, it's doing the same as Wine, not as MSVCRT.
> > 
> > If someone steps through that code in the UCRT build and reports that
> > fdopen returns a different FILE pointer, I will believe you.
> 
> I've verified this by running a GitHub action (I won't provide a link because it's probably impossible to use without running proprietary GitHub JavaScript), though I couldn't work out how to make clang link against msvcrt rather than its own libraries.

Thanks, but this is just a first small step in the right direction.
We need this verified with Emacs, not a small separate test program,
and we need then some serious testing of whatever solution we decide
to implement.  All of that requires a volunteer who will take upon
him/herself to implement and test the possible solutions on the actual
platform, and then maintaining that and the rest of UCRT-specific
stuff for some reasonably observable future.  IOW, this needs a
dedicated support person.

> > And, as I
> > said, support for UCRT will only become official if someone volunteers
> > to come on board and handle that build.
> 
> That's what I meant by "if and when the time comes".
> 
> > > And any other implementation of the Windows API that doesn't provide bug-for-bug compatibility with MSVCRT.
> >
> > For now, only the MSVCRT support is official.
> 
> Of course, and I think it's more likely it will cease being official than other builds becoming official.
> 
> > > Wine is the only significant free implementation of the Windows API, so I disagree with the "just". If I understand RMS correctly, whether there is a free implementation of an OS is an important factor in deciding to redirect resources to supporting it in GNU software.
> >  
> > Such decisions can only be relevant if there are resources to allocate
> > and redirect.
> 
> I think the community of Emacs developers decides by consensus (or bickering) what to work on. My understanding was that we're considering whether to stop working on at least some variants of the Windows port.

The community of Emacs developers cannot allocate resources that don't
exist.  And even when they do exist, the ability of the community to
redirect those resources is limited by the opinions and limitations of
the people whose resources need to be redirected.

> > Since we don't have them, this is entirely academic.
> 
> Well, I disagree. Official guidance by the GNU Emacs project does have some influence on what volunteers will work on. I consider that a resource.

I'm around for enough time to know that it is almost never a resource
we can control.  And the effectiveness of such guidance is severely
limited even in easier cases, see the recent arguments about naming
packages and similar stuff.

> > For now, the only person who actively works on the Windows port is
> > myself, and I'm unable to support UCRT, for more than one reason.
> 
> Are you working on MINGW64 systems at all, or is it mingw exclusively?

I'm using MinGW and don't intend to install MinGW64 any time soon.
And, as I said earlier on the list, even supporting the MSVCRT build
is becoming too much if I have to do that alone, together with my main
responsibilities here.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-29 11:25                                   ` Eli Zaretskii
@ 2024-07-31  6:18                                     ` Pip Cet
  2024-07-31 14:02                                       ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Pip Cet @ 2024-07-31  6:18 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel, rms

On Monday, July 29th, 2024 at 11:25, Eli Zaretskii <eliz@gnu.org> wrote:
> > Date: Sun, 28 Jul 2024 20:22:40 +0000
>
> > From: Pip Cet pipcet@protonmail.com
> > Cc: emacs-devel@gnu.org, rms@gnu.org
> >
> > On Sunday, July 28th, 2024 at 15:20, Eli Zaretskii eliz@gnu.org wrote:
> >
> > > > By my reading of the source code I found, it's doing the same as Wine, not as MSVCRT.
> > >
> > > If someone steps through that code in the UCRT build and reports that
> > > fdopen returns a different FILE pointer, I will believe you.
> >
> > I've verified this by running a GitHub action (I won't provide a link because it's probably impossible to use without running proprietary GitHub JavaScript), though I couldn't work out how to make clang link against msvcrt rather than its own libraries.
>
> Thanks, but this is just a first small step in the right direction.
> We need this verified with Emacs, not a small separate test program,
> and we need then some serious testing of whatever solution we decide
> to implement.

I think the bar is slightly lower than that: the code in Emacs is clearly buggy, because it relies on strange and peculiar implementation details that go far beyond anything guaranteed by the API (and that may break at any point on new systems). Replacing it is necessary.

> All of that requires a volunteer who will take upon
> him/herself to implement and test the possible solutions on the actual
> platform, and then maintaining that and the rest of UCRT-specific
> stuff for some reasonably observable future.

This isn't UCRT-specific, and, as far as I'm concerned, "the actual platform" is Wine, not Microsoft Windows. If a UCRT build works on wine, it's quite likely to work on Microsoft Windows machines, too.

> IOW, this needs a
> dedicated support person.

That's desirable, yes, but hardly necessary. There's a difference between fixing obvious bugs that will prevent builds from ever working and deciding a platform is "officially" supported.

FWIW, I've tested my UCRT build on Microsoft's proprietary Windows, briefly, and it starts up and appears to work. However, I cannot do so on a regular basis.

> > > And, as I
> > > said, support for UCRT will only become official if someone volunteers
> > > to come on board and handle that build.
> >
> > That's what I meant by "if and when the time comes".
> >
> > > > And any other implementation of the Windows API that doesn't provide bug-for-bug compatibility with MSVCRT.
> > >
> > > For now, only the MSVCRT support is official.
> >
> > Of course, and I think it's more likely it will cease being official than other builds becoming official.
> >
> > > > Wine is the only significant free implementation of the Windows API, so I disagree with the "just". If I understand RMS correctly, whether there is a free implementation of an OS is an important factor in deciding to redirect resources to supporting it in GNU software.
> > >
> > > Such decisions can only be relevant if there are resources to allocate
> > > and redirect.
> >
> > I think the community of Emacs developers decides by consensus (or bickering) what to work on. My understanding was that we're considering whether to stop working on at least some variants of the Windows port.
>
> The community of Emacs developers cannot allocate resources that don't
> exist. And even when they do exist, the ability of the community to
> redirect those resources is limited by the opinions and limitations of
> the people whose resources need to be redirected.

One thing we can certainly stop doing is to discourage people from even looking at stuff. Closing actual bugs as "wontfix" without a sensible explanation, for example, seems counterproductive to me.

> > > Since we don't have them, this is entirely academic.
> >
> > Well, I disagree. Official guidance by the GNU Emacs project does have some influence on what volunteers will work on. I consider that a resource.
>
> I'm around for enough time to know that it is almost never a resource
> we can control. And the effectiveness of such guidance is severely
> limited even in easier cases, see the recent arguments about naming
> packages and similar stuff.
>
> > > For now, the only person who actively works on the Windows port is
> > > myself, and I'm unable to support UCRT, for more than one reason.
> >
> > Are you working on MINGW64 systems at all, or is it mingw exclusively?
>
>
> I'm using MinGW and don't intend to install MinGW64 any time soon.

Maybe it's time to make that port unofficial, or at least to stop directing people to it rather than the MinGW64 port.

Pip



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-31  6:18                                     ` Pip Cet
@ 2024-07-31 14:02                                       ` Eli Zaretskii
  2024-07-31 19:04                                         ` Sebastián Monía
  2024-08-03  7:50                                         ` pipcet
  0 siblings, 2 replies; 119+ messages in thread
From: Eli Zaretskii @ 2024-07-31 14:02 UTC (permalink / raw)
  To: Pip Cet; +Cc: emacs-devel, rms

> Date: Wed, 31 Jul 2024 06:18:16 +0000
> From: Pip Cet <pipcet@protonmail.com>
> Cc: emacs-devel@gnu.org, rms@gnu.org
> 
> > Thanks, but this is just a first small step in the right direction.
> > We need this verified with Emacs, not a small separate test program,
> > and we need then some serious testing of whatever solution we decide
> > to implement.
> 
> I think the bar is slightly lower than that: the code in Emacs is clearly buggy, because it relies on strange and peculiar implementation details that go far beyond anything guaranteed by the API (and that may break at any point on new systems). Replacing it is necessary.

I disagree.

> > All of that requires a volunteer who will take upon
> > him/herself to implement and test the possible solutions on the actual
> > platform, and then maintaining that and the rest of UCRT-specific
> > stuff for some reasonably observable future.
> 
> This isn't UCRT-specific, and, as far as I'm concerned, "the actual platform" is Wine, not Microsoft Windows. If a UCRT build works on wine, it's quite likely to work on Microsoft Windows machines, too.

Not relevant to the requirement of having a dedicated support person.

> > IOW, this needs a
> > dedicated support person.
> 
> That's desirable, yes, but hardly necessary.

I disagree, and that's not for you to decide, with all due respect.

> There's a difference between fixing obvious bugs that will prevent builds from ever working and deciding a platform is "officially" supported.

This bug is far from "obvious", and finding a fix for it that will do
what the original code does requires non-trivial testing.  Until that
is done, I don't trust the proposed solution (and it was not a
complete proposal anyway).

> FWIW, I've tested my UCRT build on Microsoft's proprietary Windows, briefly, and it starts up and appears to work. However, I cannot do so on a regular basis.

I know.  Neither can I.  Which is why the basic requirement to have a
dedicated support person on board still stands.

> > The community of Emacs developers cannot allocate resources that don't
> > exist. And even when they do exist, the ability of the community to
> > redirect those resources is limited by the opinions and limitations of
> > the people whose resources need to be redirected.
> 
> One thing we can certainly stop doing is to discourage people from even looking at stuff. Closing actual bugs as "wontfix" without a sensible explanation, for example, seems counterproductive to me.

Which bugs where "closed as wontfix without a sensible explanation"?

> > I'm using MinGW and don't intend to install MinGW64 any time soon.
> 
> Maybe it's time to make that port unofficial, or at least to stop directing people to it rather than the MinGW64 port.

We have been advertising MinGW64 (with MSVCRT) for a long time, see
nt/INSTALL.W64.  But since it doesn't support Windows versions older
than Vista (or maybe even that is not supported anymore), we also
advertise MinGW, which does.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-31 14:02                                       ` Eli Zaretskii
@ 2024-07-31 19:04                                         ` Sebastián Monía
  2024-08-01  5:00                                           ` Eli Zaretskii
  2024-08-03  7:50                                         ` pipcet
  1 sibling, 1 reply; 119+ messages in thread
From: Sebastián Monía @ 2024-07-31 19:04 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Pip Cet, emacs-devel



>> Date: Wed, 31 Jul 2024 06:18:16 +0000
>> From: Pip Cet <pipcet@protonmail.com>
>> Cc: emacs-devel@gnu.org, rms@gnu.org

> We have been advertising MinGW64 (with MSVCRT) for a long time, see
> nt/INSTALL.W64.  But since it doesn't support Windows versions older
> than Vista (or maybe even that is not supported anymore), we also
> advertise MinGW, which does.

Is there any advantage to using UCRT (just had to look up what it is :))
instead of the current approach of MinGW/MinGW64 builds?

I've been using MinGW64 to build Emacs from scratch whenever I am forced
to work in Windows, with no hiccups.

Thanks,
Seb



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-31 19:04                                         ` Sebastián Monía
@ 2024-08-01  5:00                                           ` Eli Zaretskii
  0 siblings, 0 replies; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-01  5:00 UTC (permalink / raw)
  To: Sebastián Monía; +Cc: pipcet, emacs-devel

> From: Sebastián Monía <sebastian@sebasmonia.com>
> Cc: Pip Cet <pipcet@protonmail.com>,  emacs-devel@gnu.org
> Date: Wed, 31 Jul 2024 15:04:12 -0400
> 
> >> Date: Wed, 31 Jul 2024 06:18:16 +0000
> >> From: Pip Cet <pipcet@protonmail.com>
> >> Cc: emacs-devel@gnu.org, rms@gnu.org
> 
> > We have been advertising MinGW64 (with MSVCRT) for a long time, see
> > nt/INSTALL.W64.  But since it doesn't support Windows versions older
> > than Vista (or maybe even that is not supported anymore), we also
> > advertise MinGW, which does.
> 
> Is there any advantage to using UCRT (just had to look up what it is :))
> instead of the current approach of MinGW/MinGW64 builds?

TBH, I don't know enough about the differences.  UCRT is supposed to
be more modern, and so more compatible with ANSI C and perhaps also
with Posix.  (However, MinGW has for a very long time a support
library which provides ANSI C compliant implementations of various
functions, so this problem is largely solved even without UCRT.)

The fact that we don't have experts who can answer these questions is
one serious indication that dedicated support persons are needed if we
want to be able to use whatever good features UCRT provides to Emacs's
benefit.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-07-31 14:02                                       ` Eli Zaretskii
  2024-07-31 19:04                                         ` Sebastián Monía
@ 2024-08-03  7:50                                         ` pipcet
  2024-08-03  9:23                                           ` Eli Zaretskii
  1 sibling, 1 reply; 119+ messages in thread
From: pipcet @ 2024-08-03  7:50 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel, rms

"Eli Zaretskii" <eliz@gnu.org> writes:

>> Date: Wed, 31 Jul 2024 06:18:16 +0000
>> From: Pip Cet <pipcet@protonmail.com>
>> Cc: emacs-devel@gnu.org, rms@gnu.org
>>
>> > Thanks, but this is just a first small step in the right direction.
>> > We need this verified with Emacs, not a small separate test program,
>> > and we need then some serious testing of whatever solution we decide
>> > to implement.
>>
>> I think the bar is slightly lower than that: the code in Emacs is
>> clearly buggy, because it relies on strange and peculiar
>> implementation details that go far beyond anything guaranteed by the
>> API (and that may break at any point on new systems). Replacing it
>> is necessary.
>
> I disagree.

If you disagree that it relies on details that aren't guaranteed by the
API, can you provide an API reference that backs you up?

>> > All of that requires a volunteer who will take upon
>> > him/herself to implement and test the possible solutions on the actual
>> > platform, and then maintaining that and the rest of UCRT-specific
>> > stuff for some reasonably observable future.
>>
>> This isn't UCRT-specific, and, as far as I'm concerned, "the actual
>> platform" is Wine, not Microsoft Windows. If a UCRT build works on
>> wine, it's quite likely to work on Microsoft Windows machines, too.
>
> Not relevant to the requirement of having a dedicated support person.

We don't need a dedicated UCRT support person to unbreak Emacs on
Wine. That's, again, an opinion.

>> > IOW, this needs a
>> > dedicated support person.
>>
>> That's desirable, yes, but hardly necessary.
>
> I disagree, and that's not for you to decide, with all due respect.

I was trying to express an opinion (that fixing a bug shouldn't have to
wait for a test person we haven't driven away yet), not make a
decision. That part is up to you.

>
>> There's a difference between fixing obvious bugs that will prevent builds from ever working and deciding a platform is "officially" supported.
>
> This bug is far from "obvious", and finding a fix for it that will do
> what the original code does requires non-trivial testing.  Until that
> is done, I don't trust the proposed solution (and it was not a
> complete proposal anyway).

I agree that there is a proposed solution we can use, so far. But, yes,
the bug itself is obvious. Throwing away the return value of _fdopen is
simply not something the API allows you to do.

>> FWIW, I've tested my UCRT build on Microsoft's proprietary Windows, briefly, and it starts up and appears to work. However, I cannot do so on a regular basis.
>
> I know.  Neither can I.  Which is why the basic requirement to have a
> dedicated support person on board still stands.

I think it's the other way around: if we fix what UCRT bugs we can, we
can actually look for testers in earnest. But, again, that's an opinion,
and the decision is yours.

>> > The community of Emacs developers cannot allocate resources that don't
>> > exist. And even when they do exist, the ability of the community to
>> > redirect those resources is limited by the opinions and limitations of
>> > the people whose resources need to be redirected.
>>
>> One thing we can certainly stop doing is to discourage people from
>> even looking at stuff. Closing actual bugs as "wontfix" without a
>> sensible explanation, for example, seems counterproductive to me.
>
> Which bugs where "closed as wontfix without a sensible explanation"?

72335

>> > I'm using MinGW and don't intend to install MinGW64 any time soon.
>>
>> Maybe it's time to make that port unofficial, or at least to stop directing people to it rather than the MinGW64 port.
>
> We have been advertising MinGW64 (with MSVCRT) for a long time, see
> nt/INSTALL.W64.  But since it doesn't support Windows versions older
> than Vista (or maybe even that is not supported anymore), we also
> advertise MinGW, which does.

Indeed, but people look at nt/INSTALL first, usually, and that's about
an entirely different port which hardly anyone considers usable at this
point, as far as I can tell.

Pip




^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-03  7:50                                         ` pipcet
@ 2024-08-03  9:23                                           ` Eli Zaretskii
  2024-08-03 15:17                                             ` pipcet
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-03  9:23 UTC (permalink / raw)
  To: pipcet; +Cc: emacs-devel, rms

> Date: Sat, 03 Aug 2024 07:50:21 +0000
> From: pipcet@protonmail.com
> Cc: emacs-devel@gnu.org, rms@gnu.org
> 
> "Eli Zaretskii" <eliz@gnu.org> writes:
> 
> >> Date: Wed, 31 Jul 2024 06:18:16 +0000
> >> From: Pip Cet <pipcet@protonmail.com>
> >> Cc: emacs-devel@gnu.org, rms@gnu.org
> >>
> >> > Thanks, but this is just a first small step in the right direction.
> >> > We need this verified with Emacs, not a small separate test program,
> >> > and we need then some serious testing of whatever solution we decide
> >> > to implement.
> >>
> >> I think the bar is slightly lower than that: the code in Emacs is
> >> clearly buggy, because it relies on strange and peculiar
> >> implementation details that go far beyond anything guaranteed by the
> >> API (and that may break at any point on new systems). Replacing it
> >> is necessary.
> >
> > I disagree.
> 
> If you disagree that it relies on details that aren't guaranteed by the
> API, can you provide an API reference that backs you up?

I disagree that the bar is lower than what I described.  The existing
code relies on undocumented features, yes, but we have quite a lot of
that in the Windows and MSDOS ports, and there's nothing in particular
wrong with that.  When the undocumented features stop working in some
situations, we need to find a solution for those situations, and those
solutions must be tested within Emacs, not a toy test program, and
they must be tested thoroughly, including (in this case) the
verification that the handle is not inherited by Emacs sub-processes.

> >> One thing we can certainly stop doing is to discourage people from
> >> even looking at stuff. Closing actual bugs as "wontfix" without a
> >> sensible explanation, for example, seems counterproductive to me.
> >
> > Which bugs where "closed as wontfix without a sensible explanation"?
> 
> 72335

That bug is not closed.

> >> > I'm using MinGW and don't intend to install MinGW64 any time soon.
> >>
> >> Maybe it's time to make that port unofficial, or at least to stop directing people to it rather than the MinGW64 port.
> >
> > We have been advertising MinGW64 (with MSVCRT) for a long time, see
> > nt/INSTALL.W64.  But since it doesn't support Windows versions older
> > than Vista (or maybe even that is not supported anymore), we also
> > advertise MinGW, which does.
> 
> Indeed, but people look at nt/INSTALL first, usually

If they read it, it tells them that those instructions are for older
versions of Windows.

> and that's about an entirely different port which hardly anyone
> considers usable at this point, as far as I can tell.

It isn't an entirely different port, no.  The code commonality between
the two is close to 100%, and so is the functionality, the only
difference is that one is 32-bit, the other 64-bit.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-03  9:23                                           ` Eli Zaretskii
@ 2024-08-03 15:17                                             ` pipcet
  2024-08-03 16:07                                               ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: pipcet @ 2024-08-03 15:17 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel, rms

"Eli Zaretskii" <eliz@gnu.org> writes:

>> Date: Sat, 03 Aug 2024 07:50:21 +0000
>> From: pipcet@protonmail.com
>> Cc: emacs-devel@gnu.org, rms@gnu.org
>>
>> "Eli Zaretskii" <eliz@gnu.org> writes:
>>
>> >> Date: Wed, 31 Jul 2024 06:18:16 +0000
>> >> From: Pip Cet <pipcet@protonmail.com>
>> >> Cc: emacs-devel@gnu.org, rms@gnu.org
>> >>
>> >> > Thanks, but this is just a first small step in the right direction.
>> >> > We need this verified with Emacs, not a small separate test program,
>> >> > and we need then some serious testing of whatever solution we decide
>> >> > to implement.
>> >>
>> >> I think the bar is slightly lower than that: the code in Emacs is
>> >> clearly buggy, because it relies on strange and peculiar
>> >> implementation details that go far beyond anything guaranteed by the
>> >> API (and that may break at any point on new systems). Replacing it
>> >> is necessary.
>> >
>> > I disagree.
>>
>> If you disagree that it relies on details that aren't guaranteed by the
>> API, can you provide an API reference that backs you up?
>
> I disagree that the bar is lower than what I described.  The existing
> code relies on undocumented features, yes, but we have quite a lot of
> that in the Windows and MSDOS ports, and there's nothing in particular
> wrong with that.  When the undocumented features stop working in some
> situations, we need to find a solution for those situations, and those
> solutions must be tested within Emacs, not a toy test program, and
> they must be tested thoroughly, including (in this case) the
> verification that the handle is not inherited by Emacs sub-processes.

Thank you. I think I finally understand your position.

>> >> One thing we can certainly stop doing is to discourage people from
>> >> even looking at stuff. Closing actual bugs as "wontfix" without a
>> >> sensible explanation, for example, seems counterproductive to me.
>> >
>> > Which bugs where "closed as wontfix without a sensible explanation"?
>>
>> 72335
>
> That bug is not closed.

Oh, I see. You're right, I should have said "marked as wontfix". Thanks
for correcting me.

>> >> > I'm using MinGW and don't intend to install MinGW64 any time soon.
>> >>
>> >> Maybe it's time to make that port unofficial, or at least to stop directing people to it rather than the MinGW64 port.
>> >
>> > We have been advertising MinGW64 (with MSVCRT) for a long time, see
>> > nt/INSTALL.W64.  But since it doesn't support Windows versions older
>> > than Vista (or maybe even that is not supported anymore), we also
>> > advertise MinGW, which does.
>>
>> Indeed, but people look at nt/INSTALL first, usually
>
> If they read it, it tells them that those instructions are for older
> versions of Windows.

I think a typical user will look at INSTALL first, which directs them to
nt/INSTALL, which finally directs them to the file they were looking for
in the first place, if they know enough to realize that MinGW and
MinGW64 are different things. I think skipping one of those files would
be a good thing, and increase the probability of successful builds.

>
>> and that's about an entirely different port which hardly anyone
>> considers usable at this point, as far as I can tell.
>
> It isn't an entirely different port, no.  The code commonality between
> the two is close to 100%, and so is the functionality, the only
> difference is that one is 32-bit, the other 64-bit.

What I meant was that building according to the nt/INSTALL instructions
will produce something people won't be happy with, with very rare
exceptions, because it uses an entirely different toolchain, produces a
32-bit binary, and doesn't support as many features for a naive build
(such as native compilation).

As for the test person issue, would it be possible to start a new thread
on emacs-devel with a detailed call for volunteers for testing Emacs on
64-bit versions of Microsoft Windows? I think it would be great if we
could make it clear to people that support for such systems is dependent
on someone volunteering to test a provided ZIP file once in a while
(maybe we can limit ourselves to one test per week or so), running a few
lines of elisp but mostly reporting back on whether bin/emacs.exe
starts up at all.

Maybe it would also help to offer people the chance to respond by
private email rather than on the list?

What do you think?

Pip




^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-03 15:17                                             ` pipcet
@ 2024-08-03 16:07                                               ` Eli Zaretskii
  0 siblings, 0 replies; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-03 16:07 UTC (permalink / raw)
  To: pipcet; +Cc: emacs-devel, rms

> Date: Sat, 03 Aug 2024 15:17:31 +0000
> From: pipcet@protonmail.com
> Cc: emacs-devel@gnu.org, rms@gnu.org
> 
> "Eli Zaretskii" <eliz@gnu.org> writes:
> 
> > It isn't an entirely different port, no.  The code commonality between
> > the two is close to 100%, and so is the functionality, the only
> > difference is that one is 32-bit, the other 64-bit.
> 
> What I meant was that building according to the nt/INSTALL instructions
> will produce something people won't be happy with, with very rare
> exceptions, because it uses an entirely different toolchain, produces a
> 32-bit binary, and doesn't support as many features for a naive build
> (such as native compilation).

No, the MinGW build supports all the features when it runs on the same
system as the MinGW64 build.  That includes native compilation (I have
it enabled in all my production builds, including the one where I'm
typing this, which is a 32-bit MinGW build with large-ints).

> As for the test person issue, would it be possible to start a new thread
> on emacs-devel with a detailed call for volunteers for testing Emacs on
> 64-bit versions of Microsoft Windows?

I already did that, see

  https://lists.gnu.org/archive/html/emacs-devel/2024-07/msg01072.html

Feel free to post there with the additional bits about UCRT.

This is not the first time I post about the need for UCRT support,
either, there were a couple of discussions in the past.

IOW, it isn't like the issue isn't known.

> Maybe it would also help to offer people the chance to respond by
> private email rather than on the list?

Why? the job is definitely a public one, it cannot be done in private
email.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
@ 2024-08-06  3:04 Quang Kien Nguyen
  2024-08-06  7:03 ` Quang Kien Nguyen
                   ` (2 more replies)
  0 siblings, 3 replies; 119+ messages in thread
From: Quang Kien Nguyen @ 2024-08-06  3:04 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel, pipcet

[-- Attachment #1: Type: text/plain, Size: 1269 bytes --]

> > As for the code in question, if I understand it correctly, the current
> > Windows idiom would be simply (I assume _open_osfhandle clears the flag?):
> >
> > SetHandleInformation (GetStdHandle (STD_INPUT_HANDLE), HANDLE_FLAG_INHERIT,
> > 0);
>
> I'm not sure you can do this without closing the stream, since the
> program has already started by that time. And SetHandleInformation is
> only available since Windows 2K, so we'd need to call it through a
> function pointer.
I think using the SetHandleInformation here should be appropriate.
The implementation of _fdopen in ucrt is similar to Wine, it starts
looking from ` _IOB_ENTRIES` (== 3) stream. Here is the extracted source
code https://github.com/huangqinjin/ucrt/blob/master/stdio/stream.cpp#L12

So, once we close the `stdin/out/err`, there's noone who get assigned
back to those streams, and then the final close in `sys_dep.c` will fail
for UCRT.

I have tested with my own UCRT64 build of Emacs at
https://github.com/kiennq/emacs-build/releases/tag/v31.276.20240805.2332f50,
With the patch of
https://github.com/kiennq/emacs-build/edit/main/patches/0001-init_winntproc-Use-SetHandleInformation-to-set-NOINH.patch

The SetHandleInformation returns no error even without streams being
closed.

---
Kien

[-- Attachment #2: Type: text/html, Size: 1783 bytes --]

^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-06  3:04 Quang Kien Nguyen
@ 2024-08-06  7:03 ` Quang Kien Nguyen
  2024-08-06 11:40 ` Eli Zaretskii
  2024-08-06 14:18 ` Pip Cet
  2 siblings, 0 replies; 119+ messages in thread
From: Quang Kien Nguyen @ 2024-08-06  7:03 UTC (permalink / raw)
  To: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1270 bytes --]

> > As for the code in question, if I understand it correctly, the current

> > Windows idiom would be simply (I assume _open_osfhandle clears the flag?):
> >
> > SetHandleInformation (GetStdHandle (STD_INPUT_HANDLE), HANDLE_FLAG_INHERIT,
> > 0);
>
> I'm not sure you can do this without closing the stream, since the
> program has already started by that time. And SetHandleInformation is
> only available since Windows 2K, so we'd need to call it through a
> function pointer.
I think using the SetHandleInformation here should be appropriate.
The implementation of _fdopen in ucrt is similar to Wine, it starts
looking from ` _IOB_ENTRIES` (== 3) stream. Here is the extracted source
code https://github.com/huangqinjin/ucrt/blob/master/stdio/stream.cpp#L12

So, once we close the `stdin/out/err`, there's noone who get assigned
back to those streams, and then the final close in `sys_dep.c` will fail
for UCRT.

I have tested with my own UCRT64 build of Emacs at
https://github.com/kiennq/emacs-build/releases/tag/v31.276.20240805.2332f50,
With the patch of
https://github.com/kiennq/emacs-build/edit/main/patches/0001-init_winntproc-Use-SetHandleInformation-to-set-NOINH.patch

The SetHandleInformation returns no error even without streams being
closed.

---
Kien

[-- Attachment #2: Type: text/html, Size: 1962 bytes --]

^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-06  3:04 Quang Kien Nguyen
  2024-08-06  7:03 ` Quang Kien Nguyen
@ 2024-08-06 11:40 ` Eli Zaretskii
  2024-08-06 17:39   ` Quang Kien Nguyen
  2024-08-06 14:18 ` Pip Cet
  2 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-06 11:40 UTC (permalink / raw)
  To: Quang Kien Nguyen; +Cc: emacs-devel, pipcet

> From: Quang Kien Nguyen <kien.n.quang@gmail.com>
> Date: Mon, 5 Aug 2024 20:04:33 -0700
> Cc: emacs-devel@gnu.org, pipcet@protonmail.com
> 
> > > As for the code in question, if I understand it correctly, the current 
> > > Windows idiom would be simply (I assume _open_osfhandle clears the flag?):
> > > 
> > > SetHandleInformation (GetStdHandle (STD_INPUT_HANDLE), HANDLE_FLAG_INHERIT, 
> > > 0);
> > 
> > I'm not sure you can do this without closing the stream, since the
> > program has already started by that time. And SetHandleInformation is
> > only available since Windows 2K, so we'd need to call it through a
> > function pointer.
> I think using the SetHandleInformation here should be appropriate.
> The implementation of _fdopen in ucrt is similar to Wine, it starts
> looking from ` _IOB_ENTRIES` (== 3) stream. Here is the extracted source
> code https://github.com/huangqinjin/ucrt/blob/master/stdio/stream.cpp#L12
> 
> So, once we close the `stdin/out/err`, there's noone who get assigned
> back to those streams, and then the final close in `sys_dep.c` will fail
> for UCRT.
> 
> I have tested with my own UCRT64 build of Emacs at
> https://github.com/kiennq/emacs-build/releases/tag/v31.276.20240805.2332f50,
> With the patch of
> https://github.com/kiennq/emacs-build/edit/main/patches/0001-init_winntproc-Use-SetHandleInformation-to-set-NOINH.patch
> 
> The SetHandleInformation returns no error even without streams being
> closed.

Thanks, noted.

What we need next is (a) a clean patch, and (b) thorough testing that
the standard handles are indeed not inherited by sub-processes of
Emacs when the patch is applied.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-06  3:04 Quang Kien Nguyen
  2024-08-06  7:03 ` Quang Kien Nguyen
  2024-08-06 11:40 ` Eli Zaretskii
@ 2024-08-06 14:18 ` Pip Cet
  2024-08-07 11:03   ` Eli Zaretskii
  2 siblings, 1 reply; 119+ messages in thread
From: Pip Cet @ 2024-08-06 14:18 UTC (permalink / raw)
  To: Quang Kien Nguyen; +Cc: Eli Zaretskii, emacs-devel

"Quang Kien Nguyen" <kien.n.quang@gmail.com> writes:

>> > As for the code in question, if I understand it correctly, the current
>> > Windows idiom would be simply (I assume _open_osfhandle clears the flag?):
>> >
>> > SetHandleInformation (GetStdHandle (STD_INPUT_HANDLE), HANDLE_FLAG_INHERIT,
>> > 0);
>>
>> I'm not sure you can do this without closing the stream, since the
>> program has already started by that time. And SetHandleInformation is
>> only available since Windows 2K, so we'd need to call it through a
>> function pointer.
> I think using the SetHandleInformation here should be appropriate.
> The implementation of _fdopen in ucrt is similar to Wine, it starts
> looking from ` _IOB_ENTRIES` (== 3) stream. Here is the extracted source
> code https://github.com/huangqinjin/ucrt/blob/master/stdio/stream.cpp#L12

Thanks!

> So, once we close the `stdin/out/err`, there's noone who get assigned
> back to those streams, and then the final close in `sys_dep.c` will fail
> for UCRT.

Indeed, that's what I'm seeing with wine, too.  BTW, the Wine issue has
been fixed and it now faithfully emulates the MSVCRT behavior when
pretending to be ancient Windows.

> I have tested with my own UCRT64 build of Emacs at
> https://github.com/kiennq/emacs-build/releases/tag/v31.276.20240805.2332f50,
> With the patch of
> https://github.com/kiennq/emacs-build/edit/main/patches/0001-init_winntproc-Use-SetHandleInformation-to-set-NOINH.patch

https://github.com/kiennq/emacs-build/blob/main/patches/0001-init_winntproc-Use-SetHandleInformation-to-set-NOINH.patch
is visible here.

> The SetHandleInformation returns no error even without streams being
> closed.

We still need to call it through a function pointer to support Windows
98/95, right?  And, of course, once we've done that, we need to find
testers for most or all Windows versions to verify the streams are
indeed not being inherited.

Would you be willing and able to help with that, maybe?

Pip




^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-06 11:40 ` Eli Zaretskii
@ 2024-08-06 17:39   ` Quang Kien Nguyen
  2024-08-06 18:32     ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Quang Kien Nguyen @ 2024-08-06 17:39 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel, pipcet

[-- Attachment #1: Type: text/plain, Size: 658 bytes --]

> What we need next is (a) a clean patch, and (b) thorough testing that
> the standard handles are indeed not inherited by sub-processes of
> Emacs when the patch is applied.

What should be the testing for (b)?
One thing I noticed when I used a version with broken stdout is that the
async
compilation (native or via async package) doesn't work properly. Those
errors
don't show up anymore for the patch of using SetHandleInformation.

I have been using the UCRT version for a while and notice nothing has gone
wrong so far even with the `native-comp-jit-compilation'. It would be great
if
someone can share how I can do further testing on this.

----
Kien

[-- Attachment #2: Type: text/html, Size: 797 bytes --]

^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-06 17:39   ` Quang Kien Nguyen
@ 2024-08-06 18:32     ` Eli Zaretskii
  2024-08-06 20:52       ` Quang Kien Nguyen
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-06 18:32 UTC (permalink / raw)
  To: Quang Kien Nguyen; +Cc: emacs-devel, pipcet

> From: Quang Kien Nguyen <kien.n.quang@gmail.com>
> Date: Tue, 6 Aug 2024 10:39:57 -0700
> Cc: emacs-devel@gnu.org, pipcet@protonmail.com
> 
> > What we need next is (a) a clean patch, and (b) thorough testing that
> > the standard handles are indeed not inherited by sub-processes of
> > Emacs when the patch is applied.
> 
> What should be the testing for (b)?

I'm not sure I understand what you are asking.  Are you asking how to
test that the standard handles aren't inherited by subprocesses?

> One thing I noticed when I used a version with broken stdout is that the async
> compilation (native or via async package) doesn't work properly. Those errors
> don't show up anymore for the patch of using SetHandleInformation.

I'm not talking about testing the broken build: it's known to be
broken.  I'm talking about testing the fixed build: the fragile dance
we do with the standard streams is there for a reason, and we need to
make sure the modified code does the job as well.

Btw, I still don't think I've seen the patch you are want to test, so
I don't even know if it's clean and correct by itself.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-06 18:32     ` Eli Zaretskii
@ 2024-08-06 20:52       ` Quang Kien Nguyen
  2024-08-07 11:41         ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Quang Kien Nguyen @ 2024-08-06 20:52 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel, pipcet

[-- Attachment #1: Type: text/plain, Size: 726 bytes --]

> I'm not sure I understand what you are asking.  Are you asking how to
> test that the standard handles aren't inherited by subprocesses?

I can check that the SetHandleInformation is returning TRUE so the handles
shouldn't be inherited already.  However, is there any Emacs feature
that will be
broken if the handles are inherited?  I would like to test that to make sure the
E2E flow is still working.

> Btw, I still don't think I've seen the patch you are want to test, so
> I don't even know if it's clean and correct by itself.

The patch is here
https://raw.githubusercontent.com/kiennq/emacs-build/main/patches/0004-init_ntproc-Use-SetHandleInformation-to-set-NOINHERI.patch
It's also attached in the mail.

---
Kien

[-- Attachment #2: 0004-init_ntproc-Use-SetHandleInformation-to-set-NOINHERI.patch --]
[-- Type: application/octet-stream, Size: 5074 bytes --]

From 6932da3096f8149e0fffe2aba0ab8c444a598476 Mon Sep 17 00:00:00 2001
From: Kien Nguyen <kien.n.quang@gmail.com>
Date: Sun, 4 Aug 2024 04:29:35 -0700
Subject: [PATCH 4/6] init_ntproc: Use SetHandleInformation to set NOINHERIT
 when possible

---
 src/w32.c | 123 ++++++++++++++++++++++++++++++------------------------
 1 file changed, 68 insertions(+), 55 deletions(-)

diff --git a/src/w32.c b/src/w32.c
index 31ffa301c2f..f531274ce92 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -7783,10 +7783,6 @@ init_winsock (int load_now)
   if (winsock_lib != NULL)
     return TRUE;
 
-  pfn_SetHandleInformation
-    = (void *) get_proc_addr (GetModuleHandle ("kernel32.dll"),
-                                     "SetHandleInformation");
-
   winsock_lib = LoadLibrary ("Ws2_32.dll");
 
   if (winsock_lib != NULL)
@@ -10471,6 +10467,10 @@ init_ntproc (int dumping)
      Conveniently, init_environment is called before us, so
      PRELOAD_WINSOCK can be set in the registry. */
 
+  pfn_SetHandleInformation
+    = (void *) get_proc_addr (GetModuleHandle ("kernel32.dll"),
+                                     "SetHandleInformation");
+
   /* Always initialize this correctly. */
   winsock_lib = NULL;
 
@@ -10480,60 +10480,73 @@ init_ntproc (int dumping)
   /* Initial preparation for subprocess support: replace our standard
      handles with non-inheritable versions. */
   {
-    HANDLE parent;
-    HANDLE stdin_save =  INVALID_HANDLE_VALUE;
-    HANDLE stdout_save = INVALID_HANDLE_VALUE;
-    HANDLE stderr_save = INVALID_HANDLE_VALUE;
-
-    parent = GetCurrentProcess ();
-
-    /* ignore errors when duplicating and closing; typically the
-       handles will be invalid when running as a gui program. */
-    DuplicateHandle (parent,
-		     GetStdHandle (STD_INPUT_HANDLE),
-		     parent,
-		     &stdin_save,
-		     0,
-		     FALSE,
-		     DUPLICATE_SAME_ACCESS);
-
-    DuplicateHandle (parent,
-		     GetStdHandle (STD_OUTPUT_HANDLE),
-		     parent,
-		     &stdout_save,
-		     0,
-		     FALSE,
-		     DUPLICATE_SAME_ACCESS);
-
-    DuplicateHandle (parent,
-		     GetStdHandle (STD_ERROR_HANDLE),
-		     parent,
-		     &stderr_save,
-		     0,
-		     FALSE,
-		     DUPLICATE_SAME_ACCESS);
-
-    fclose (stdin);
-    fclose (stdout);
-    fclose (stderr);
-
-    if (stdin_save != INVALID_HANDLE_VALUE)
-      _open_osfhandle ((intptr_t) stdin_save, O_TEXT);
+    /* For UCRT, the _fdopen will try to find free stream from
+       _IOB_ENTRIES (= 3), thus we can't reopen the standard handles
+       with it. Using SetHandleInformation to make the handle not
+       inheritable to child process is a better way. */
+    if (pfn_SetHandleInformation)
+    {
+      pfn_SetHandleInformation (GetStdHandle(STD_INPUT_HANDLE), HANDLE_FLAG_INHERIT, 0);
+      pfn_SetHandleInformation (GetStdHandle(STD_OUTPUT_HANDLE), HANDLE_FLAG_INHERIT, 0);
+      pfn_SetHandleInformation (GetStdHandle(STD_ERROR_HANDLE), HANDLE_FLAG_INHERIT, 0);
+    }
     else
-      _open ("nul", O_TEXT | O_NOINHERIT | O_RDONLY);
-    _fdopen (0, "r");
+    {
+      HANDLE parent;
+      HANDLE stdin_save =  INVALID_HANDLE_VALUE;
+      HANDLE stdout_save = INVALID_HANDLE_VALUE;
+      HANDLE stderr_save = INVALID_HANDLE_VALUE;
+
+      parent = GetCurrentProcess ();
+
+      /* ignore errors when duplicating and closing; typically the
+	 handles will be invalid when running as a gui program. */
+      DuplicateHandle (parent,
+		       GetStdHandle (STD_INPUT_HANDLE),
+		       parent,
+		       &stdin_save,
+		       0,
+		       FALSE,
+		       DUPLICATE_SAME_ACCESS);
+
+      DuplicateHandle (parent,
+		       GetStdHandle (STD_OUTPUT_HANDLE),
+		       parent,
+		       &stdout_save,
+		       0,
+		       FALSE,
+		       DUPLICATE_SAME_ACCESS);
+
+      DuplicateHandle (parent,
+		       GetStdHandle (STD_ERROR_HANDLE),
+		       parent,
+		       &stderr_save,
+		       0,
+		       FALSE,
+		       DUPLICATE_SAME_ACCESS);
+
+      fclose (stdin);
+      fclose (stdout);
+      fclose (stderr);
+
+      if (stdin_save != INVALID_HANDLE_VALUE)
+	_open_osfhandle ((intptr_t) stdin_save, O_TEXT);
+      else
+	_open ("nul", O_TEXT | O_NOINHERIT | O_RDONLY);
+      _fdopen (0, "r");
 
-    if (stdout_save != INVALID_HANDLE_VALUE)
-      _open_osfhandle ((intptr_t) stdout_save, O_TEXT);
-    else
-      _open ("nul", O_TEXT | O_NOINHERIT | O_WRONLY);
-    _fdopen (1, "w");
+      if (stdout_save != INVALID_HANDLE_VALUE)
+	_open_osfhandle ((intptr_t) stdout_save, O_TEXT);
+      else
+	_open ("nul", O_TEXT | O_NOINHERIT | O_WRONLY);
+      _fdopen (1, "w");
 
-    if (stderr_save != INVALID_HANDLE_VALUE)
-      _open_osfhandle ((intptr_t) stderr_save, O_TEXT);
-    else
-      _open ("nul", O_TEXT | O_NOINHERIT | O_WRONLY);
-    _fdopen (2, "w");
+      if (stderr_save != INVALID_HANDLE_VALUE)
+	_open_osfhandle ((intptr_t) stderr_save, O_TEXT);
+      else
+	_open ("nul", O_TEXT | O_NOINHERIT | O_WRONLY);
+      _fdopen (2, "w");
+    }
   }
 
   /* unfortunately, atexit depends on implementation of malloc */
-- 
2.46.0.windows.1


^ permalink raw reply related	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-06 14:18 ` Pip Cet
@ 2024-08-07 11:03   ` Eli Zaretskii
  0 siblings, 0 replies; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-07 11:03 UTC (permalink / raw)
  To: Pip Cet; +Cc: kien.n.quang, emacs-devel

> Date: Tue, 06 Aug 2024 14:18:28 +0000
> From: Pip Cet <pipcet@protonmail.com>
> Cc: Eli Zaretskii <eliz@gnu.org>, emacs-devel@gnu.org
> 
> We still need to call it through a function pointer to support Windows
> 98/95, right?

No, we don't, because there's no UCRT on those old versions, and Emacs
linked against UCRT will not run on them.

MinGW64 tossed support for those old versions of Windows long ago, so
any Emacs build done with MinGW64 is likely not to run on those old
version, definitely the 64-bit builds.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-06 20:52       ` Quang Kien Nguyen
@ 2024-08-07 11:41         ` Eli Zaretskii
  2024-08-07 18:32           ` Quang Kien Nguyen
  2024-08-07 19:50           ` Pip Cet
  0 siblings, 2 replies; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-07 11:41 UTC (permalink / raw)
  To: Quang Kien Nguyen; +Cc: emacs-devel, pipcet

> From: Quang Kien Nguyen <kien.n.quang@gmail.com>
> Date: Tue, 6 Aug 2024 13:52:27 -0700
> Cc: emacs-devel@gnu.org, pipcet@protonmail.com
> 
> > I'm not sure I understand what you are asking.  Are you asking how to
> > test that the standard handles aren't inherited by subprocesses?
> 
> I can check that the SetHandleInformation is returning TRUE so the handles
> shouldn't be inherited already.  However, is there any Emacs feature
> that will be
> broken if the handles are inherited?  I would like to test that to make sure the
> E2E flow is still working.

This is not about some Emacs feature, or at least not only about that.
This is about having Emacs on Windows behave the same as Emacs on
Posix systems, wrt inheriting handles to child sub-processes.  We want
this to be done so that anyone who writes a Lisp program that launches
sub-processes could be certain they will behave the same wrt
inheritance of standard handles, on all supported systems.

To test that, one would need to demonstrate that the parent Emacs
process can do something with its standard handles without affecting
the same handles of the child process.  For example, moving the file
pointer in one process doesn't move it in the other.  As another
example, if Emacs's standard output is redirected to a file, and
writing to stdout in the child process writes to that same file, then
the standard output handle _was_ inherited.  Yet another possibility
is to use a tool such as ProcessExplorer to show the target of each
handle, in both parent Emacs and its child sub-process, and verify the
target is different.

> > Btw, I still don't think I've seen the patch you are want to test, so
> > I don't even know if it's clean and correct by itself.
> 
> The patch is here
> https://raw.githubusercontent.com/kiennq/emacs-build/main/patches/0004-init_ntproc-Use-SetHandleInformation-to-set-NOINHERI.patch
> It's also attached in the mail.

Thanks, see some comments below.

> --- a/src/w32.c
> +++ b/src/w32.c
> @@ -7783,10 +7783,6 @@ init_winsock (int load_now)
>    if (winsock_lib != NULL)
>      return TRUE;
>  
> -  pfn_SetHandleInformation
> -    = (void *) get_proc_addr (GetModuleHandle ("kernel32.dll"),
> -                                     "SetHandleInformation");
> -
>    winsock_lib = LoadLibrary ("Ws2_32.dll");
>  
>    if (winsock_lib != NULL)
> @@ -10471,6 +10467,10 @@ init_ntproc (int dumping)
>       Conveniently, init_environment is called before us, so
>       PRELOAD_WINSOCK can be set in the registry. */
>  
> +  pfn_SetHandleInformation
> +    = (void *) get_proc_addr (GetModuleHandle ("kernel32.dll"),
> +                                     "SetHandleInformation");
> +

This hunk is not needed, for the reasons explained below.

> @@ -10480,60 +10480,73 @@ init_ntproc (int dumping)
>    /* Initial preparation for subprocess support: replace our standard
>       handles with non-inheritable versions. */
>    {
> -    HANDLE parent;
> -    HANDLE stdin_save =  INVALID_HANDLE_VALUE;
> -    HANDLE stdout_save = INVALID_HANDLE_VALUE;
> -    HANDLE stderr_save = INVALID_HANDLE_VALUE;
> -
> -    parent = GetCurrentProcess ();
> -
> -    /* ignore errors when duplicating and closing; typically the
> -       handles will be invalid when running as a gui program. */
> -    DuplicateHandle (parent,
> -		     GetStdHandle (STD_INPUT_HANDLE),
> -		     parent,
> -		     &stdin_save,
> -		     0,
> -		     FALSE,
> -		     DUPLICATE_SAME_ACCESS);
> -
> -    DuplicateHandle (parent,
> -		     GetStdHandle (STD_OUTPUT_HANDLE),
> -		     parent,
> -		     &stdout_save,
> -		     0,
> -		     FALSE,
> -		     DUPLICATE_SAME_ACCESS);
> -
> -    DuplicateHandle (parent,
> -		     GetStdHandle (STD_ERROR_HANDLE),
> -		     parent,
> -		     &stderr_save,
> -		     0,
> -		     FALSE,
> -		     DUPLICATE_SAME_ACCESS);
> -
> -    fclose (stdin);
> -    fclose (stdout);
> -    fclose (stderr);
> -
> -    if (stdin_save != INVALID_HANDLE_VALUE)
> -      _open_osfhandle ((intptr_t) stdin_save, O_TEXT);
> +    /* For UCRT, the _fdopen will try to find free stream from
> +       _IOB_ENTRIES (= 3), thus we can't reopen the standard handles
> +       with it. Using SetHandleInformation to make the handle not
> +       inheritable to child process is a better way. */

This is not what I think we need.  First, there's no need to change
anything in the MSVCRT build, because AFAIK the current code "just
works" in such a build, both in 32-bit builds and in 64-bit builds.
The problem happens only in UCRT builds.

Second, UCRT builds are only supported on versions of Windows where
SetHandleInformation is always available; on older Windows systems,
the UCRT build will refuse to run, because UCRT is not available.

So what I think is needed is a compile-time condition that makes the
UCRT build use SetHandleInformation instead of the
DuplicateHandle/fclose/_fdopen dance, and leaves the existing code
intact in non-UCRT builds.  I think "#ifdef _UCRT" is such a
condition, but I'm not 100% sure.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-07 11:41         ` Eli Zaretskii
@ 2024-08-07 18:32           ` Quang Kien Nguyen
  2024-08-08  5:46             ` Eli Zaretskii
  2024-08-07 19:50           ` Pip Cet
  1 sibling, 1 reply; 119+ messages in thread
From: Quang Kien Nguyen @ 2024-08-07 18:32 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel, pipcet

[-- Attachment #1: Type: text/plain, Size: 1386 bytes --]

> This is not what I think we need.  First, there's no need to change
> anything in the MSVCRT build, because AFAIK the current code "just
> works" in such a build, both in 32-bit builds and in 64-bit builds.
> The problem happens only in UCRT builds.

Okay, put a new patch.
By the way, the code of using `pfn_SetHandleInformation` has been using by
`init_winsock` as well for the same purpose of making the handle not
inheritable.  So I think we should be pretty safe with this change.

> To test that, one would need to demonstrate that the parent Emacs
> process can do something with its standard handles without affecting
> the same handles of the child process.  For example, moving the file
> pointer in one process doesn't move it in the other.  As another
> example, if Emacs's standard output is redirected to a file, and
> writing to stdout in the child process writes to that same file, then
> the standard output handle _was_ inherited.  Yet another possibility
> is to use a tool such as ProcessExplorer to show the target of each
> handle, in both parent Emacs and its child sub-process, and verify the
> target is different.

I'm not sure how to redirect Emacs output in Windows.  And using
ProcExp64, I can
confirm that the standard handles (\Device\ConDrv\Input ...) is not refereed by
its child processes.  Let me know if you want me test other scenarios.

---
Kien

[-- Attachment #2: 0001-Use-SetHandleInformation-to-set-NOINHERIT-in-UCRT64.patch --]
[-- Type: application/octet-stream, Size: 1527 bytes --]

From fa1ecbf4c33589c4d753e1af380fa2902d2f672f Mon Sep 17 00:00:00 2001
From: Kien Nguyen <kien.n.quang@gmail.com>
Date: Wed, 7 Aug 2024 10:39:38 -0700
Subject: [PATCH] Use SetHandleInformation to set NOINHERIT in UCRT64

    * init_ntproc: Use SetHandleInformation to set NOINHERIT in UCRT64 

---
 src/w32.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/src/w32.c b/src/w32.c
index 31ffa301c..0c1291f10 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -10480,6 +10480,16 @@ init_ntproc (int dumping)
   /* Initial preparation for subprocess support: replace our standard
      handles with non-inheritable versions. */
   {
+
+#ifdef _UCRT
+    /* For UCRT, the _fdopen will try to find free stream from
+       _IOB_ENTRIES (= 3), thus we can't reopen the standard handles
+       with it. Using SetHandleInformation to make the handle not
+       inheritable to child process is a better way. */
+    SetHandleInformation (GetStdHandle(STD_INPUT_HANDLE), HANDLE_FLAG_INHERIT, 0);
+    SetHandleInformation (GetStdHandle(STD_OUTPUT_HANDLE), HANDLE_FLAG_INHERIT, 0);
+    SetHandleInformation (GetStdHandle(STD_ERROR_HANDLE), HANDLE_FLAG_INHERIT, 0);
+#else
     HANDLE parent;
     HANDLE stdin_save =  INVALID_HANDLE_VALUE;
     HANDLE stdout_save = INVALID_HANDLE_VALUE;
@@ -10534,6 +10544,7 @@ init_ntproc (int dumping)
     else
       _open ("nul", O_TEXT | O_NOINHERIT | O_WRONLY);
     _fdopen (2, "w");
+#endif
   }
 
   /* unfortunately, atexit depends on implementation of malloc */
-- 
2.45.2.vfs.0.1


^ permalink raw reply related	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-07 11:41         ` Eli Zaretskii
  2024-08-07 18:32           ` Quang Kien Nguyen
@ 2024-08-07 19:50           ` Pip Cet
  2024-08-07 23:14             ` Quang Kien Nguyen
  2024-08-08  5:15             ` Eli Zaretskii
  1 sibling, 2 replies; 119+ messages in thread
From: Pip Cet @ 2024-08-07 19:50 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Quang Kien Nguyen, emacs-devel

"Eli Zaretskii" <eliz@gnu.org> writes:

>> From: Quang Kien Nguyen <kien.n.quang@gmail.com>
>> Date: Tue, 6 Aug 2024 13:52:27 -0700
>> Cc: emacs-devel@gnu.org, pipcet@protonmail.com
>> @@ -10480,60 +10480,73 @@ init_ntproc (int dumping)
>>    /* Initial preparation for subprocess support: replace our standard
>>       handles with non-inheritable versions. */
>>    {
>> -    HANDLE parent;
>> -    HANDLE stdin_save =  INVALID_HANDLE_VALUE;
>> -    HANDLE stdout_save = INVALID_HANDLE_VALUE;
>> -    HANDLE stderr_save = INVALID_HANDLE_VALUE;
>> -
>> -    parent = GetCurrentProcess ();
>> -
>> -    /* ignore errors when duplicating and closing; typically the
>> -       handles will be invalid when running as a gui program. */
>> -    DuplicateHandle (parent,
>> -		     GetStdHandle (STD_INPUT_HANDLE),
>> -		     parent,
>> -		     &stdin_save,
>> -		     0,
>> -		     FALSE,
>> -		     DUPLICATE_SAME_ACCESS);
>> -
>> -    DuplicateHandle (parent,
>> -		     GetStdHandle (STD_OUTPUT_HANDLE),
>> -		     parent,
>> -		     &stdout_save,
>> -		     0,
>> -		     FALSE,
>> -		     DUPLICATE_SAME_ACCESS);
>> -
>> -    DuplicateHandle (parent,
>> -		     GetStdHandle (STD_ERROR_HANDLE),
>> -		     parent,
>> -		     &stderr_save,
>> -		     0,
>> -		     FALSE,
>> -		     DUPLICATE_SAME_ACCESS);
>> -
>> -    fclose (stdin);
>> -    fclose (stdout);
>> -    fclose (stderr);
>> -
>> -    if (stdin_save != INVALID_HANDLE_VALUE)
>> -      _open_osfhandle ((intptr_t) stdin_save, O_TEXT);
>> +    /* For UCRT, the _fdopen will try to find free stream from
>> +       _IOB_ENTRIES (= 3), thus we can't reopen the standard handles
>> +       with it. Using SetHandleInformation to make the handle not
>> +       inheritable to child process is a better way. */
>
> This is not what I think we need.  First, there's no need to change
> anything in the MSVCRT build, because AFAIK the current code "just

Yes, there is. It makes assumptions about the API implementation that
valid implementations of the Windows API do not satisfy. Wine until last
week is one example; given that the bug wasn't reported in 20 years, we
can assume that no other popular application relies on this particular
detail, so relying on it even in MSVCRT builds is unsafe.

IMHO, the only thing the first patch is missing is a comment reminding
us to remove the old code if and when support for Windows 95/98 is
dropped.

Pip




^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-07 19:50           ` Pip Cet
@ 2024-08-07 23:14             ` Quang Kien Nguyen
  2024-08-08  5:15             ` Eli Zaretskii
  1 sibling, 0 replies; 119+ messages in thread
From: Quang Kien Nguyen @ 2024-08-07 23:14 UTC (permalink / raw)
  To: Pip Cet; +Cc: Eli Zaretskii, emacs-devel

> Yes, there is. It makes assumptions about the API implementation that
> valid implementations of the Windows API do not satisfy. Wine until last
> week is one example; given that the bug wasn't reported in 20 years, we
> can assume that no other popular application relies on this particular
> detail, so relying on it even in MSVCRT builds is unsafe.
> IMHO, the only thing the first patch is missing is a comment reminding
> us to remove the old code if and when support for Windows 95/98 is
> dropped.

Since the UCRT is the replacement of MSVCRT, just putting that behind
an ifdef without
checking for the function pointer is also fine to me.  Eventually, the
UCRT, which
is receiving all of the security fixes, should be replacing the MSVCRT.

On Wed, Aug 7, 2024 at 12:50 PM Pip Cet <pipcet@protonmail.com> wrote:
>
> "Eli Zaretskii" <eliz@gnu.org> writes:
>
> >> From: Quang Kien Nguyen <kien.n.quang@gmail.com>
> >> Date: Tue, 6 Aug 2024 13:52:27 -0700
> >> Cc: emacs-devel@gnu.org, pipcet@protonmail.com
> >> @@ -10480,60 +10480,73 @@ init_ntproc (int dumping)
> >>    /* Initial preparation for subprocess support: replace our standard
> >>       handles with non-inheritable versions. */
> >>    {
> >> -    HANDLE parent;
> >> -    HANDLE stdin_save =  INVALID_HANDLE_VALUE;
> >> -    HANDLE stdout_save = INVALID_HANDLE_VALUE;
> >> -    HANDLE stderr_save = INVALID_HANDLE_VALUE;
> >> -
> >> -    parent = GetCurrentProcess ();
> >> -
> >> -    /* ignore errors when duplicating and closing; typically the
> >> -       handles will be invalid when running as a gui program. */
> >> -    DuplicateHandle (parent,
> >> -                 GetStdHandle (STD_INPUT_HANDLE),
> >> -                 parent,
> >> -                 &stdin_save,
> >> -                 0,
> >> -                 FALSE,
> >> -                 DUPLICATE_SAME_ACCESS);
> >> -
> >> -    DuplicateHandle (parent,
> >> -                 GetStdHandle (STD_OUTPUT_HANDLE),
> >> -                 parent,
> >> -                 &stdout_save,
> >> -                 0,
> >> -                 FALSE,
> >> -                 DUPLICATE_SAME_ACCESS);
> >> -
> >> -    DuplicateHandle (parent,
> >> -                 GetStdHandle (STD_ERROR_HANDLE),
> >> -                 parent,
> >> -                 &stderr_save,
> >> -                 0,
> >> -                 FALSE,
> >> -                 DUPLICATE_SAME_ACCESS);
> >> -
> >> -    fclose (stdin);
> >> -    fclose (stdout);
> >> -    fclose (stderr);
> >> -
> >> -    if (stdin_save != INVALID_HANDLE_VALUE)
> >> -      _open_osfhandle ((intptr_t) stdin_save, O_TEXT);
> >> +    /* For UCRT, the _fdopen will try to find free stream from
> >> +       _IOB_ENTRIES (= 3), thus we can't reopen the standard handles
> >> +       with it. Using SetHandleInformation to make the handle not
> >> +       inheritable to child process is a better way. */
> >
> > This is not what I think we need.  First, there's no need to change
> > anything in the MSVCRT build, because AFAIK the current code "just
>
> Yes, there is. It makes assumptions about the API implementation that
> valid implementations of the Windows API do not satisfy. Wine until last
> week is one example; given that the bug wasn't reported in 20 years, we
> can assume that no other popular application relies on this particular
> detail, so relying on it even in MSVCRT builds is unsafe.
>
> IMHO, the only thing the first patch is missing is a comment reminding
> us to remove the old code if and when support for Windows 95/98 is
> dropped.
>
> Pip
>


-- 
Best regards,
Kien



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-07 19:50           ` Pip Cet
  2024-08-07 23:14             ` Quang Kien Nguyen
@ 2024-08-08  5:15             ` Eli Zaretskii
  1 sibling, 0 replies; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-08  5:15 UTC (permalink / raw)
  To: Pip Cet; +Cc: kien.n.quang, emacs-devel

> Date: Wed, 07 Aug 2024 19:50:49 +0000
> From: Pip Cet <pipcet@protonmail.com>
> Cc: Quang Kien Nguyen <kien.n.quang@gmail.com>, emacs-devel@gnu.org
> 
> "Eli Zaretskii" <eliz@gnu.org> writes:
> 
> > This is not what I think we need.  First, there's no need to change
> > anything in the MSVCRT build, because AFAIK the current code "just
> 
> Yes, there is. It makes assumptions about the API implementation that
> valid implementations of the Windows API do not satisfy. Wine until last
> week is one example; given that the bug wasn't reported in 20 years, we
> can assume that no other popular application relies on this particular
> detail, so relying on it even in MSVCRT builds is unsafe.

I disagree with you, and I already stated this disagreement earlier,
so there was no reason to reiterate your POV, which was already heard
and noted.

(Your mistake is that you look at this as if Windows were a
free-software OS, where all the sources are available for study and
there are a lot of people who understand the internals enough to make
such decisions.  That is not the case, and so the fact that this code
worked for us virtually without changes since it was first written
back in 1996, and still works today in the MSVCRT builds, is, from
where I stand, an overwhelming evidence that we should only mess with
it if and when it breaks.)



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-07 18:32           ` Quang Kien Nguyen
@ 2024-08-08  5:46             ` Eli Zaretskii
  2024-08-08 23:44               ` Quang Kien Nguyen
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-08  5:46 UTC (permalink / raw)
  To: Quang Kien Nguyen; +Cc: emacs-devel, pipcet

> From: Quang Kien Nguyen <kien.n.quang@gmail.com>
> Date: Wed, 7 Aug 2024 11:32:23 -0700
> Cc: emacs-devel@gnu.org, pipcet@protonmail.com
> 
> > This is not what I think we need.  First, there's no need to change
> > anything in the MSVCRT build, because AFAIK the current code "just
> > works" in such a build, both in 32-bit builds and in 64-bit builds.
> > The problem happens only in UCRT builds.
> 
> Okay, put a new patch.

Thanks, this patch LGTM.  Given sufficient testing (see below), I
think we can install it.

> By the way, the code of using `pfn_SetHandleInformation` has been using by
> `init_winsock` as well for the same purpose of making the handle not
> inheritable.  So I think we should be pretty safe with this change.

Contrary to what happens on Posix platforms, winsock handles are
similar, but different from file handles.  So much so that using
socket handles and respective file descriptors in Posix-style calls
like 'write' cannot be done without some non-trivial jumping through
hoops.

So the fact that we use SetHandleInformation for sockets doesn't
necessarily mean we should copy the code to file handles just because
we can.

In general, Windows support code in Emacs is tricky and there's more
in it than meets the eye, so based on long and hard-won experience I
submit that we should only change it if and when it breaks, and
preferably only for situations in which it breaks.

> > To test that, one would need to demonstrate that the parent Emacs
> > process can do something with its standard handles without affecting
> > the same handles of the child process.  For example, moving the file
> > pointer in one process doesn't move it in the other.  As another
> > example, if Emacs's standard output is redirected to a file, and
> > writing to stdout in the child process writes to that same file, then
> > the standard output handle _was_ inherited.  Yet another possibility
> > is to use a tool such as ProcessExplorer to show the target of each
> > handle, in both parent Emacs and its child sub-process, and verify the
> > target is different.
> 
> I'm not sure how to redirect Emacs output in Windows.

?? As usual: you invoke Emacs from a cmd window with redirection.  For
example:

    c:\>emacs > output.txt
or
    c:\>emacs 2> error.txt

You can then launch a child process which writes to stdout/stderr and
see that Emacs and the child process do not write to the same file.

> And using ProcExp64, I can confirm that the standard handles
> (\Device\ConDrv\Input ...) is not refereed by its child processes.
> Let me know if you want me test other scenarios.

What ProcExp64 shows is a good sign, but I'd prefer to test also some
redirection like above, with Emacs and the sub-process both writing to
the same stdout/stderr stream, which would allow to verify positively
that they write to different places.

Thanks.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-08  5:46             ` Eli Zaretskii
@ 2024-08-08 23:44               ` Quang Kien Nguyen
  2024-08-09  6:00                 ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Quang Kien Nguyen @ 2024-08-08 23:44 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel, pipcet

> What ProcExp64 shows is a good sign, but I'd prefer to test also some
> redirection like above, with Emacs and the sub-process both writing to
> the same stdout/stderr stream, which would allow to verify positively
> that they write to different places.

Okay, I have tested with this lisp exp:
    (print 10 #'external-debugging-output)

10 is printed in the stdout/stderr on the console.

Then try again with
    (start-process-shell-command "test" nil "emacs -Q --batch --eval
\"(print 123123 #'external-debugging-output)\"")

The child emacs process is spinned up but nothing is spewed to the
current console
output.  Does that correct and prove that they don't share the handle?

----
Kien



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-08 23:44               ` Quang Kien Nguyen
@ 2024-08-09  6:00                 ` Eli Zaretskii
  2024-08-09  6:10                   ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-09  6:00 UTC (permalink / raw)
  To: Quang Kien Nguyen; +Cc: emacs-devel, pipcet

> From: Quang Kien Nguyen <kien.n.quang@gmail.com>
> Date: Thu, 8 Aug 2024 16:44:09 -0700
> Cc: emacs-devel@gnu.org, pipcet@protonmail.com
> 
> > What ProcExp64 shows is a good sign, but I'd prefer to test also some
> > redirection like above, with Emacs and the sub-process both writing to
> > the same stdout/stderr stream, which would allow to verify positively
> > that they write to different places.
> 
> Okay, I have tested with this lisp exp:
>     (print 10 #'external-debugging-output)
> 
> 10 is printed in the stdout/stderr on the console.
> 
> Then try again with
>     (start-process-shell-command "test" nil "emacs -Q --batch --eval
> \"(print 123123 #'external-debugging-output)\"")
> 
> The child emacs process is spinned up but nothing is spewed to the
> current console
> output.  Does that correct and prove that they don't share the handle?

Not clearly enough.  Consoles are tricky on Windows.  It is better to
start Emacs with stderr redirected to a file (I've shown how to do
that in a previous message), and then see that what the child Emacs
writes to external-debugging-output does not appear in that file.

Also, instead of start-process please use call-process.  That's
because start-process redirects the stdout/stderr handles of the child
process to the pipe from which the parent Emacs process reads, and
that makes the experiment more complex and harder to reason about.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-09  6:00                 ` Eli Zaretskii
@ 2024-08-09  6:10                   ` Eli Zaretskii
  2024-08-09  9:19                     ` Quang Kien Nguyen
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-09  6:10 UTC (permalink / raw)
  To: kien.n.quang; +Cc: emacs-devel, pipcet

> Date: Fri, 09 Aug 2024 09:00:11 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> Cc: emacs-devel@gnu.org, pipcet@protonmail.com
> 
> > From: Quang Kien Nguyen <kien.n.quang@gmail.com>
> > Date: Thu, 8 Aug 2024 16:44:09 -0700
> > Cc: emacs-devel@gnu.org, pipcet@protonmail.com
> > 
> > > What ProcExp64 shows is a good sign, but I'd prefer to test also some
> > > redirection like above, with Emacs and the sub-process both writing to
> > > the same stdout/stderr stream, which would allow to verify positively
> > > that they write to different places.
> > 
> > Okay, I have tested with this lisp exp:
> >     (print 10 #'external-debugging-output)
> > 
> > 10 is printed in the stdout/stderr on the console.
> > 
> > Then try again with
> >     (start-process-shell-command "test" nil "emacs -Q --batch --eval
> > \"(print 123123 #'external-debugging-output)\"")
> > 
> > The child emacs process is spinned up but nothing is spewed to the
> > current console
> > output.  Does that correct and prove that they don't share the handle?
> 
> Not clearly enough.  Consoles are tricky on Windows.  It is better to
> start Emacs with stderr redirected to a file (I've shown how to do
> that in a previous message), and then see that what the child Emacs
> writes to external-debugging-output does not appear in that file.
> 
> Also, instead of start-process please use call-process.  That's
> because start-process redirects the stdout/stderr handles of the child
> process to the pipe from which the parent Emacs process reads, and
> that makes the experiment more complex and harder to reason about.

And one more thing: when using "emacs --batch", it is easier to use
'message' to write to stderr; no need to 'print' via
external-debugging-output.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-09  6:10                   ` Eli Zaretskii
@ 2024-08-09  9:19                     ` Quang Kien Nguyen
  2024-08-09 11:03                       ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Quang Kien Nguyen @ 2024-08-09  9:19 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel, pipcet

> Not clearly enough.  Consoles are tricky on Windows.  It is better to
> start Emacs with stderr redirected to a file (I've shown how to do
> that in a previous message), and then see that what the child Emacs
> writes to external-debugging-output does not appear in that file.
>
> Also, instead of start-process please use call-process.  That's
> because start-process redirects the stdout/stderr handles of the child
> process to the pipe from which the parent Emacs process reads, and
> that makes the experiment more complex and harder to reason about.
>
> And one more thing: when using "emacs --batch", it is easier to use
> 'message' to write to stderr; no need to 'print' via
> external-debugging-output.

Okay, I've tried with redirecting the stderr to file and then use
    (print 10 #'external-debugging-output)

10 is printed in the file.

Then try with
    (call-process "emacs" nil nil nil "--batch" "-Q" "--eval"
"(message \"20\")")

The child emacs process is created but nothing appended to the output file.
Is that okay?

I have the Emacs binary prebuilt here for UCRT [1], please give it a try if you
want to test more.


[1] https://github.com/kiennq/emacs-build/releases/tag/v31.279.20240807.fa1ecbf



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-09  9:19                     ` Quang Kien Nguyen
@ 2024-08-09 11:03                       ` Eli Zaretskii
  2024-08-13 12:12                         ` Quang Kien Nguyen
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-09 11:03 UTC (permalink / raw)
  To: Quang Kien Nguyen; +Cc: emacs-devel, pipcet

> From: Quang Kien Nguyen <kien.n.quang@gmail.com>
> Date: Fri, 9 Aug 2024 02:19:35 -0700
> Cc: emacs-devel@gnu.org, pipcet@protonmail.com
> 
> Okay, I've tried with redirecting the stderr to file and then use
>     (print 10 #'external-debugging-output)
> 
> 10 is printed in the file.
> 
> Then try with
>     (call-process "emacs" nil nil nil "--batch" "-Q" "--eval"
> "(message \"20\")")
> 
> The child emacs process is created but nothing appended to the output file.
> Is that okay?

Yes, thanks.  I've now installed the change on the master branch (with
some minor edits to better comply with our coding and formatting
conventions).

> I have the Emacs binary prebuilt here for UCRT [1], please give it a try if you
> want to test more.
> 
> 
> [1] https://github.com/kiennq/emacs-build/releases/tag/v31.279.20240807.fa1ecbf

I won't have time to do that, but others are encourage to test this
build.

Thanks!



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-09 11:03                       ` Eli Zaretskii
@ 2024-08-13 12:12                         ` Quang Kien Nguyen
  2024-08-13 12:37                           ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Quang Kien Nguyen @ 2024-08-13 12:12 UTC (permalink / raw)
  To: Pip Cet, Eli Zaretskii; +Cc: emacs-devel

By the way, @Pip Cet, have you been able to build 64bit Emacs with MPS?

I've tried to build them but Emacs crashed as soon as temacs was
trying to bootstrap.
Here is the patch I used for MPS though
https://raw.githubusercontent.com/kiennq/emacs-build/main/patches/mps/0002-mingw64-support-mingw64.patch

-- 
Best regards,
Kien



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-13 12:12                         ` Quang Kien Nguyen
@ 2024-08-13 12:37                           ` Eli Zaretskii
  2024-08-13 15:51                             ` Pip Cet
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-13 12:37 UTC (permalink / raw)
  To: Quang Kien Nguyen; +Cc: pipcet, emacs-devel

> From: Quang Kien Nguyen <kien.n.quang@gmail.com>
> Date: Tue, 13 Aug 2024 05:12:19 -0700
> Cc: emacs-devel@gnu.org
> 
> By the way, @Pip Cet, have you been able to build 64bit Emacs with MPS?
> 
> I've tried to build them but Emacs crashed as soon as temacs was
> trying to bootstrap.
> Here is the patch I used for MPS though
> https://raw.githubusercontent.com/kiennq/emacs-build/main/patches/mps/0002-mingw64-support-mingw64.patch

Did you run the MPS test suite, and if you did, did all the tests
succeed?

It is not recommended to try the MPS build of Emacs as long as the MPS
library doesn't pass the tests with flying colors.  The patch to
mpstd.h is the first place to look for possible issues.  E.g., why is
MPS_PF_ALIGN 8 and not 16?  Also, did you audit all the places
conditioned on MPS_BUILD_MV and MPS_PF_W3I6MV and made sure they are
conditioned on MPS_BUILD_GC and MPS_PF_W3I6GC when the MinGW64 build
needs the same code as the 64-bit MSVC build?



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-13 12:37                           ` Eli Zaretskii
@ 2024-08-13 15:51                             ` Pip Cet
  2024-08-13 18:26                               ` Quang Kien Nguyen
  0 siblings, 1 reply; 119+ messages in thread
From: Pip Cet @ 2024-08-13 15:51 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Quang Kien Nguyen, emacs-devel

"Eli Zaretskii" <eliz@gnu.org> writes:
>> From: Quang Kien Nguyen <kien.n.quang@gmail.com>
>> Date: Tue, 13 Aug 2024 05:12:19 -0700
>> Cc: emacs-devel@gnu.org
>>
>> By the way, @Pip Cet, have you been able to build 64bit Emacs with MPS?

(I assume you mean for Microsoft Windows).

Yes, I have.  It's even started on a machine running Microsoft Windows,
though I'm usually limited to testing on wine, and even that binary was
built using wine.

>> I've tried to build them but Emacs crashed as soon as temacs was
>> trying to bootstrap.

That's probably the setjmp thing, worked around in my tree at
https://codeberg.org/pipcet/emacs-android (sorry about the repository
name, it's no longer accurate).  Note that there are "Actions" available
which have artifacts that you can download and test, if you are so
inclined.  Right now, for me, the ucrt64 build doesn't work but the
64-bit mingw32 build does.

If you're interested in testing this, please let me know which tree you
use so I can provide a patch that applies there and just contains the
setjmp fix.

>> Here is the patch I used for MPS though
>> https://raw.githubusercontent.com/kiennq/emacs-build/main/patches/mps/0002-mingw64-support-mingw64.patch
>
> Did you run the MPS test suite, and if you did, did all the tests
> succeed?

I must confess I haven't done that yet. As it has been decided to
deliberately break Emacs CI/CD using Wine, though, I'm not sure there's
any point.

> It is not recommended to try the MPS build of Emacs as long as the MPS
> library doesn't pass the tests with flying colors.  The patch to
> mpstd.h is the first place to look for possible issues.  E.g., why is
> MPS_PF_ALIGN 8 and not 16?

I don't believe we use that macro anywhere (scratch/igc uses 8 byte alignment on
all platforms) but yes, MPS_PF_ALIGN should be 16.

> Also, did you audit all the places
> conditioned on MPS_BUILD_MV and MPS_PF_W3I6MV and made sure they are
> conditioned on MPS_BUILD_GC and MPS_PF_W3I6GC when the MinGW64 build
> needs the same code as the 64-bit MSVC build?

I'm pretty sure I did, but I use a slightly different patch
(https://codeberg.org/pipcet/mps): Please be aware that this code does
run Emacs, but hasn't passed the test suite, so pretty much the only
thing you should be doing with it is to run the test suite.

Also, please keep in mind that -fno-omit-frame-pointer may be required
for GCC when optimizing. I spent entirely too much time tracking down a
bug that was ultimately due to that missing flag.

Pip




^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-13 15:51                             ` Pip Cet
@ 2024-08-13 18:26                               ` Quang Kien Nguyen
  2024-08-13 19:19                                 ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Quang Kien Nguyen @ 2024-08-13 18:26 UTC (permalink / raw)
  To: Pip Cet; +Cc: Eli Zaretskii, emacs-devel

> Did you run the MPS test suite, and if you did, did all the tests
> succeed?

Yes, all succeeded except the forktest, which I guess doesn't work on Windows
anyway.  I've tried it with both mingw64-i686, mingw64-x86_64 msvcrt and ucrt
version, the 32bit Emacs build doesn't crash.

> > It is not recommended to try the MPS build of Emacs as long as the MPS
> > library doesn't pass the tests with flying colors.  The patch to
> > mpstd.h is the first place to look for possible issues.  E.g., why is
> > MPS_PF_ALIGN 8 and not 16?
>
> I don't believe we use that macro anywhere (scratch/igc uses 8 byte alignment on
> all platforms) but yes, MPS_PF_ALIGN should be 16.

Both 8 and 16 passed the mps's test suite and both crash Emacs at
temacs bootstrap
in my case.  I'm using this to run the test suite btw
    ../tool/testrun.sh -s testrun w3i6gc/cool

> That's probably the setjmp thing, worked around in my tree at
> https://codeberg.org/pipcet/emacs-android (sorry about the repository
> name, it's no longer accurate).  Note that there are "Actions" available
> which have artifacts that you can download and test, if you are so
> inclined.  Right now, for me, the ucrt64 build doesn't work but the
> 64-bit mingw32 build does.
>
> If you're interested in testing this, please let me know which tree you
> use so I can provide a patch that applies there and just contains the
> setjmp fix.

It would be great, I'm using the tip of scratch/igc branch merge with
master.  The
tree is here https://github.com/kiennq/emacs/tree/scratch/igc



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-13 18:26                               ` Quang Kien Nguyen
@ 2024-08-13 19:19                                 ` Eli Zaretskii
  2024-08-13 20:22                                   ` Quang Kien Nguyen
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-13 19:19 UTC (permalink / raw)
  To: Quang Kien Nguyen; +Cc: pipcet, emacs-devel

> From: Quang Kien Nguyen <kien.n.quang@gmail.com>
> Date: Tue, 13 Aug 2024 11:26:11 -0700
> Cc: Eli Zaretskii <eliz@gnu.org>, emacs-devel@gnu.org
> 
> Both 8 and 16 passed the mps's test suite and both crash Emacs at
> temacs bootstrap
> in my case.  I'm using this to run the test suite btw
>     ../tool/testrun.sh -s testrun w3i6gc/cool

I used this instead, from a Windows Command Prompt window running
cmd.exe:

   ..\tool\testrun.bat w3i3gc cool testrun

(you'd need to replace w3i3gc with w3i6gc, of course).  This is
specific to Windows, so it doesn't run forktest and other non-relevant
tests.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-13 19:19                                 ` Eli Zaretskii
@ 2024-08-13 20:22                                   ` Quang Kien Nguyen
  2024-08-14 13:11                                     ` Sebastián Monía
  0 siblings, 1 reply; 119+ messages in thread
From: Quang Kien Nguyen @ 2024-08-13 20:22 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: pipcet, emacs-devel

> I used this instead, from a Windows Command Prompt window running
> cmd.exe:
>
>    ..\tool\testrun.bat w3i3gc cool testrun
>
> (you'd need to replace w3i3gc with w3i6gc, of course).  This is
> specific to Windows, so it doesn't run forktest and other non-relevant
> tests.

Yes, this passed as well.

> If you're interested in testing this, please let me know which tree you
> use so I can provide a patch that applies there and just contains the
> setjmp fix.

Applied this patch and I can get an ucrt64 build that's working fine so far :D.
https://codeberg.org/pipcet/emacs/commit/fcffdebf3d8317cf772c1b22578adf3b96986c8a

-----
Kien



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-13 20:22                                   ` Quang Kien Nguyen
@ 2024-08-14 13:11                                     ` Sebastián Monía
  2024-08-14 17:24                                       ` Quang Kien Nguyen
  0 siblings, 1 reply; 119+ messages in thread
From: Sebastián Monía @ 2024-08-14 13:11 UTC (permalink / raw)
  To: Quang Kien Nguyen; +Cc: Eli Zaretskii, pipcet, emacs-devel


Quang Kien Nguyen <kien.n.quang@gmail.com> writes:
>
> Applied this patch and I can get an ucrt64 build that's working fine so far :D.
> https://codeberg.org/pipcet/emacs/commit/fcffdebf3d8317cf772c1b22578adf3b96986c8a

Hi Kien,

is there a way I can test your build?
I have access to a Windows 11 machine during weekdays, and I use Emacs
constantly in it. Currently rocking a MinGW64 build :)

Thank you,
Seb

-- 
Sebastián Monía
https://site.sebasmonia.com/



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-14 13:11                                     ` Sebastián Monía
@ 2024-08-14 17:24                                       ` Quang Kien Nguyen
  2024-08-16 20:09                                         ` Sebastián Monía
  0 siblings, 1 reply; 119+ messages in thread
From: Quang Kien Nguyen @ 2024-08-14 17:24 UTC (permalink / raw)
  To: sebastian; +Cc: Eli Zaretskii, pipcet, emacs-devel

> is there a way I can test your build?
> I have access to a Windows 11 machine during weekdays, and I use Emacs
> constantly in it. Currently rocking a MinGW64 build :)

The build is here.
https://github.com/kiennq/emacs-build/releases/tag/v31.293.20240814.d584e6d

If you're using Scoop [1], you can add my bucket at [2], the package name is
`emacs-k`.

[1] https://scoop.sh/
[2] https://github.com/kiennq/scoop-misc

---
Kien



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-14 17:24                                       ` Quang Kien Nguyen
@ 2024-08-16 20:09                                         ` Sebastián Monía
  2024-08-17 11:37                                           ` Sebastián Monía
  0 siblings, 1 reply; 119+ messages in thread
From: Sebastián Monía @ 2024-08-16 20:09 UTC (permalink / raw)
  To: Quang Kien Nguyen; +Cc: Eli Zaretskii, pipcet, emacs-devel

Hi Kien,

Using your build right now. Seems to be working just fine.
What is a good test that the changes introduced are OK?

Thanks,
Seb

-- 
Sebastián Monía
https://site.sebasmonia.com/



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-16 20:09                                         ` Sebastián Monía
@ 2024-08-17 11:37                                           ` Sebastián Monía
  2024-08-17 12:54                                             ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Sebastián Monía @ 2024-08-17 11:37 UTC (permalink / raw)
  To: Quang Kien Nguyen; +Cc: Eli Zaretskii, pipcet, emacs-devel



> Using your build right now. Seems to be working just fine.
> What is a good test that the changes introduced are OK?

Spoke too soon. Got two crashes while Emacs was in the background, only
gnus open :(
Not sure how to proceed - I went back to my build this morning.

-- 
Sebastián Monía
https://site.sebasmonia.com/



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-17 11:37                                           ` Sebastián Monía
@ 2024-08-17 12:54                                             ` Eli Zaretskii
  2024-08-17 13:24                                               ` Sebastián Monía
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-17 12:54 UTC (permalink / raw)
  To: Sebastián Monía; +Cc: kien.n.quang, pipcet, emacs-devel

> From: Sebastián Monía <sebastian@sebasmonia.com>
> Cc: Eli Zaretskii <eliz@gnu.org>, pipcet@protonmail.com, emacs-devel@gnu.org
> Date: Sat, 17 Aug 2024 07:37:03 -0400
> 
> 
> 
> > Using your build right now. Seems to be working just fine.
> > What is a good test that the changes introduced are OK?
> 
> Spoke too soon. Got two crashes while Emacs was in the background, only
> gnus open :(
> Not sure how to proceed - I went back to my build this morning.

What is the difference between these two builds?

The way forward is to run the crashing Emacs under GDB and show the
backtrace with relevant information when it crashes.

Thanks.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-17 12:54                                             ` Eli Zaretskii
@ 2024-08-17 13:24                                               ` Sebastián Monía
  2024-08-19 14:34                                                 ` Sebastián Monía
  0 siblings, 1 reply; 119+ messages in thread
From: Sebastián Monía @ 2024-08-17 13:24 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: kien.n.quang, pipcet, emacs-devel


> Eli Zaretskii <eliz@gnu.org> writes:
> What is the difference between these two builds?

Mine is built with MinGW64, following the instructions in the Emacs
repository.

> The way forward is to run the crashing Emacs under GDB and show the
> backtrace with relevant information when it crashes.

I will try, didn't have luck setting up GDB in Windows in the past, but
that was many years ago.


-- 
Sebastián Monía
https://site.sebasmonia.com/



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-17 13:24                                               ` Sebastián Monía
@ 2024-08-19 14:34                                                 ` Sebastián Monía
  2024-08-19 14:55                                                   ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Sebastián Monía @ 2024-08-19 14:34 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: kien.n.quang, pipcet, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 737 bytes --]

Sebastián Monía <sebastian@sebasmonia.com> writes:

>> Eli Zaretskii <eliz@gnu.org> writes:
>> What is the difference between these two builds?
>
> Mine is built with MinGW64, following the instructions in the Emacs
> repository.
>
>> The way forward is to run the crashing Emacs under GDB and show the
>> backtrace with relevant information when it crashes.
>
> I will try, didn't have luck setting up GDB in Windows in the past, but
> that was many years ago.

I got a backtrace. There's a lot of debug info that is missing, but
maybe it helps.

Looking at the "eln-cache" directory, maybe the native-compiled code is
not compatible between the two versions? I am running the same init
directory for both builds.


[-- Attachment #2: bt.txt --]
[-- Type: text/plain, Size: 4334 bytes --]

[New Thread 12936.0x6814]
[Thread 12936.0x71f8 exited with code 0]
[Thread 12936.0x566c exited with code 0]
[Thread 12936.0x76f8 exited with code 0]
[Thread 12936.0x6e34 exited with code 0]
[Thread 12936.0xd78 exited with code 0]
[Thread 12936.0x69a4 exited with code 0]
[Thread 12936.0x6814 exited with code 0]
[Thread 12936.0x6380 exited with code 0]
[Thread 12936.0x1fe0 exited with code 0]
[Thread 12936.0x87a8 exited with code 0]
[New Thread 12936.0x76ac]
[Thread 12936.0x76ac exited with code 1]
[New Thread 12936.0x8460]
[Thread 12936.0x8460 exited with code 0]
[New Thread 12936.0x8ce4]
[Thread 12936.0x8ce4 exited with code 0]
[New Thread 12936.0x5d6c]
[Thread 12936.0x5d6c exited with code 0]

Thread 1 received signal SIGSEGV, Segmentation fault.
0x00007ff72ab49f04 in ?? ()
(gdb) bt
#0  0x00007ff72ab49f04 in ?? ()
#1  0x00007ff72ab4b5e2 in ?? ()
#2  0x00007ff72ab501a6 in ?? ()
#3  0x00007ff72aab8f37 in ?? ()
#4  0x00007ff72aab9062 in ?? ()
#5  0x00007ffd00213fae in F76632d6769742d6469722d7072696e746572_vc_git_dir_printer_0 () from c:\users\sebm\home\.emacs.d\eln-cache\31.0.50-3be91637\vc-git-5d6756dc-cae25e12.eln
#6  0x00007ff72aacaf55 in ?? ()
#7  0x00007ff72aacb55e in ?? ()
#8  0x00007ffd20231937 in F76632d63616c6c2d6261636b656e64_vc_call_backend_0 () from c:\users\sebm\home\emacs-ucrt\lib\emacs\31.0.50\native-lisp\31.0.50-3be91637\preloaded\vc-hooks-cfa0878e-21ceedf9.eln
#9  0x00007ff72aacaf55 in ?? ()
#10 0x00007ffd2c9191aa in F76632d6469722d7072696e746572_vc_dir_printer_0 () from c:\users\sebm\home\.emacs.d\eln-cache\31.0.50-3be91637\vc-dir-fb180b5b-ec09ce68.eln
#11 0x00007ff72ab19af1 in ?? ()
#12 0x00007ff72aacaf55 in ?? ()
#13 0x00007ffd00a9259a in F65776f632d2d726566726573682d6e6f6465_ewoc__refresh_node_0 () from c:\users\sebm\home\.emacs.d\eln-cache\31.0.50-3be91637\ewoc-6e3ae0bf-ce26edcb.eln
#14 0x00007ff72aacaf55 in ?? ()
#15 0x00007ffd00a924aa in F65776f632d2d696e736572742d6e65772d6e6f6465_ewoc__insert_new_node_0 () from c:\users\sebm\home\.emacs.d\eln-cache\31.0.50-3be91637\ewoc-6e3ae0bf-ce26edcb.eln
#16 0x00007ff72aacaf55 in ?? ()
#17 0x00007ffd00a92ec1 in F65776f632d656e7465722d6265666f7265_ewoc_enter_before_0 () from c:\users\sebm\home\.emacs.d\eln-cache\31.0.50-3be91637\ewoc-6e3ae0bf-ce26edcb.eln
#18 0x00007ff72aacaf55 in ?? ()
#19 0x00007ffd00a92c9a in F65776f632d656e7465722d6c617374_ewoc_enter_last_0 () from c:\users\sebm\home\.emacs.d\eln-cache\31.0.50-3be91637\ewoc-6e3ae0bf-ce26edcb.eln
#20 0x00007ff72aacaf55 in ?? ()
#21 0x00007ffd2c91368e in F76632d6469722d757064617465_vc_dir_update_0 () from c:\users\sebm\home\.emacs.d\eln-cache\31.0.50-3be91637\vc-dir-fb180b5b-ec09ce68.eln
#22 0x00007ff72ab19af1 in ?? ()
#23 0x00007ff72aacaf55 in ?? ()
#24 0x00007ffd00215c99 in F76632d6769742d61667465722d6469722d7374617475732d7374616765_vc_git_after_dir_status_stage_0 () from c:\users\sebm\home\.emacs.d\eln-cache\31.0.50-3be91637\vc-git-5d6756dc-cae25e12.eln
#25 0x00007ff72ab19af1 in ?? ()
#26 0x00007ff72aacaf55 in ?? ()
#27 0x00007ffd00261af0 in F76632d657865632d6166746572_vc_exec_after_0 () from c:\users\sebm\home\.emacs.d\eln-cache\31.0.50-3be91637\vc-dispatcher-d82eb341-75f8ef2b.eln
#28 0x00007ff72aacaf55 in ?? ()
#29 0x00007ffd0026175c in F76632d2d70726f636573732d73656e74696e656c_vc__process_sentinel_0 () from c:\users\sebm\home\.emacs.d\eln-cache\31.0.50-3be91637\vc-dispatcher-d82eb341-75f8ef2b.eln
#30 0x00007ff72ab19af1 in ?? ()
#31 0x00007ff72aacaf55 in ?? ()
#32 0x00007ff72aacb304 in ?? ()
#33 0x00007ff72ab19af1 in ?? ()
#34 0x00007ff72aacaf55 in ?? ()
#35 0x00007ff72aacb304 in ?? ()
#36 0x00007ff72aacb6a1 in ?? ()
#37 0x00007ff72aac6038 in ?? ()
#38 0x00007ff72ab297d4 in ?? ()
#39 0x00007ff72ab2d577 in ?? ()
#40 0x00007ff72ab32b1a in ?? ()
#41 0x00007ff72aa4b90c in ?? ()
#42 0x00007ff72aa4e84a in ?? ()
#43 0x00007ff72aa50063 in ?? ()
#44 0x00007ff72aac5f70 in ?? ()
#45 0x00007ff72aa3baa2 in ?? ()
#46 0x00007ff72aac5e0c in ?? ()
#47 0x00007ff72aa3ba3c in ?? ()
#48 0x00007ff72aa44767 in ?? ()
#49 0x00007ff72aa44b44 in ?? ()
#50 0x00007ff72ac6b979 in ?? ()
#51 0x00007ff72a9612e9 in ?? ()
#52 0x00007ff72a9613f6 in ?? ()
#53 0x00007ffdc687257d in KERNEL32!BaseThreadInitThunk () from C:\WINDOWS\System32\kernel32.dll
#54 0x00007ffdc7ceaf28 in ntdll!RtlUserThreadStart () from C:\WINDOWS\SYSTEM32\ntdll.dll
#55 0x0000000000000000 in ?? ()
(gdb)

[-- Attachment #3: Type: text/plain, Size: 53 bytes --]


-- 
Sebastián Monía https://site.sebasmonia.com/

^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-19 14:34                                                 ` Sebastián Monía
@ 2024-08-19 14:55                                                   ` Eli Zaretskii
  2024-08-19 15:12                                                     ` Pip Cet
  2024-08-19 15:23                                                     ` Sebastián Monía
  0 siblings, 2 replies; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-19 14:55 UTC (permalink / raw)
  To: Sebastián Monía; +Cc: kien.n.quang, pipcet, emacs-devel

> From: Sebastián Monía <sebastian@sebasmonia.com>
> Cc: kien.n.quang@gmail.com,  pipcet@protonmail.com,  emacs-devel@gnu.org
> Date: Mon, 19 Aug 2024 10:34:34 -0400
> 
> I got a backtrace. There's a lot of debug info that is missing, but
> maybe it helps.

Thanks, but your build seems to be stripped of debug symbols, so the
backtrace is not very useful.  If you build your Emacs yourself,
remove the -s switch from the link command line, and then rebuild
Emacs and try reproducing the problem again.

> Looking at the "eln-cache" directory, maybe the native-compiled code is
> not compatible between the two versions? I am running the same init
> directory for both builds.

That cannot happen: Emacs will not load incompatible *.eln files.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-19 14:55                                                   ` Eli Zaretskii
@ 2024-08-19 15:12                                                     ` Pip Cet
  2024-08-19 15:23                                                     ` Sebastián Monía
  1 sibling, 0 replies; 119+ messages in thread
From: Pip Cet @ 2024-08-19 15:12 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Sebastián Monía, kien.n.quang, emacs-devel

"Eli Zaretskii" <eliz@gnu.org> writes:

>> Looking at the "eln-cache" directory, maybe the native-compiled code is
>> not compatible between the two versions? I am running the same init
>> directory for both builds.
>
> That cannot happen: Emacs will not load incompatible *.eln files.

Actually, it can, if one is dumb enough to change the ABI without
bumping the relevant #define.  Andrea helpfully pointed out to me how to
bump the ABI version to prevent that happening after I had to change the
ABI to accomodate unaligned 'setjmp' calls.  And then I must have
forgotten to actually do that, or it somehow got lost during rebasing,
and I sent kiennq a patch without the relevant line in it.  Sorry, my
fault entirely.

So, in essence, you're right, the eln cache will have to be manually
nuked for now.

Pip




^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-19 14:55                                                   ` Eli Zaretskii
  2024-08-19 15:12                                                     ` Pip Cet
@ 2024-08-19 15:23                                                     ` Sebastián Monía
  2024-08-19 15:31                                                       ` Quang Kien Nguyen
  1 sibling, 1 reply; 119+ messages in thread
From: Sebastián Monía @ 2024-08-19 15:23 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: kien.n.quang, pipcet, emacs-devel


> Eli Zaretskii <eliz@gnu.org> writes:
> Thanks, but your build seems to be stripped of debug symbols, so the
> backtrace is not very useful.  If you build your Emacs yourself,
> remove the -s switch from the link command line, and then rebuild
> Emacs and try reproducing the problem again.

Will wait for Kien to provide a new build then.
Or instructions on how to create one - although I am not sure I will be
able to install all the components, I don't own this particular device.


-- 
Sebastián Monía
https://site.sebasmonia.com/



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-19 15:23                                                     ` Sebastián Monía
@ 2024-08-19 15:31                                                       ` Quang Kien Nguyen
  2024-08-19 16:23                                                         ` Quang Kien Nguyen
  0 siblings, 1 reply; 119+ messages in thread
From: Quang Kien Nguyen @ 2024-08-19 15:31 UTC (permalink / raw)
  To: Sebastián Monía; +Cc: Eli Zaretskii, pipcet, emacs-devel

> Will wait for Kien to provide a new build then.
> Or instructions on how to create one - although I am not sure I will be
> able to install all the components, I don't own this particular device.

Oh, I did strip the symbols when building Emacs.  Let me create a new build.

Btw, I'm switching to building msix file instead of a normal zip file for
distribution.  You can always rename the file to zip to extract it.

---
Kien

On Mon, Aug 19, 2024 at 8:23 AM Sebastián Monía
<sebastian@sebasmonia.com> wrote:
>
>
> > Eli Zaretskii <eliz@gnu.org> writes:
> > Thanks, but your build seems to be stripped of debug symbols, so the
> > backtrace is not very useful.  If you build your Emacs yourself,
> > remove the -s switch from the link command line, and then rebuild
> > Emacs and try reproducing the problem again.
>
> Will wait for Kien to provide a new build then.
> Or instructions on how to create one - although I am not sure I will be
> able to install all the components, I don't own this particular device.
>
>
> --
> Sebastián Monía
> https://site.sebasmonia.com/



-- 
Best regards,
Kien



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-19 15:31                                                       ` Quang Kien Nguyen
@ 2024-08-19 16:23                                                         ` Quang Kien Nguyen
  2024-08-21 18:14                                                           ` Sebastián Monía
  0 siblings, 1 reply; 119+ messages in thread
From: Quang Kien Nguyen @ 2024-08-19 16:23 UTC (permalink / raw)
  To: Sebastián Monía; +Cc: Eli Zaretskii, pipcet, emacs-devel

The unstripped version is here emacs-7480876-ucrt-x86_64-mps.msix [1]

[1] https://github.com/kiennq/emacs-build/releases/tag/v31.302.20240819.7480876



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-19 16:23                                                         ` Quang Kien Nguyen
@ 2024-08-21 18:14                                                           ` Sebastián Monía
  2024-08-21 18:20                                                             ` Pip Cet
                                                                               ` (2 more replies)
  0 siblings, 3 replies; 119+ messages in thread
From: Sebastián Monía @ 2024-08-21 18:14 UTC (permalink / raw)
  To: Quang Kien Nguyen; +Cc: Eli Zaretskii, pipcet, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 354 bytes --]

Quang Kien Nguyen <kien.n.quang@gmail.com> writes:

> The unstripped version is here emacs-7480876-ucrt-x86_64-mps.msix [1]
>
> [1] https://github.com/kiennq/emacs-build/releases/tag/v31.302.20240819.7480876

Hi Kien,

I ran both that version and the next one. I attached a backtraced of the
latest version. It crashed when I opened Gnus.

Regards,
Seb


[-- Attachment #2: bt1.txt --]
[-- Type: text/plain, Size: 5107 bytes --]

$ gdb ./emacs.exe
GNU gdb (GDB) 14.2
Copyright (C) 2023 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-w64-mingw32".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./emacs.exe...
(gdb) run
Starting program: C:\users\sebm\home\emacs-ucrt\bin\emacs.exe
[New Thread 37016.0x45dc]
[New Thread 37016.0x76d0]
[New Thread 37016.0x72c0]
[New Thread 37016.0x595c]
[New Thread 37016.0x4d5c]
[New Thread 37016.0x7d7c]
[New Thread 37016.0x5e40]
[New Thread 37016.0x8fbc]
[New Thread 37016.0x3fc8]
[Thread 37016.0x3fc8 exited with code 1]
[New Thread 37016.0x59c8]
[Thread 37016.0x59c8 exited with code 1]
[New Thread 37016.0x3ce0]
[Thread 37016.0x3ce0 exited with code 1]
[New Thread 37016.0x7744]
[Thread 37016.0x7744 exited with code 0]
[New Thread 37016.0x22c8]
[New Thread 37016.0x3edc]
[New Thread 37016.0x4e40]
[New Thread 37016.0x8bcc]
[New Thread 37016.0x324c]
[New Thread 37016.0x896c]
[New Thread 37016.0x4db4]
[New Thread 37016.0x69bc]
[New Thread 37016.0x3c28]
[New Thread 37016.0x2730]
[Thread 37016.0x4e40 exited with code 0]
[New Thread 37016.0x7f30]
[Thread 37016.0x3edc exited with code 0]
[New Thread 37016.0x1438]
[Thread 37016.0x8bcc exited with code 0]
[New Thread 37016.0x4464]
[Thread 37016.0x22c8 exited with code 0]
[New Thread 37016.0x8538]
[Thread 37016.0x69bc exited with code 0]
[New Thread 37016.0x5380]
[Thread 37016.0x896c exited with code 0]
[New Thread 37016.0x7934]
[Thread 37016.0x7f30 exited with code 0]
[New Thread 37016.0x8c94]
[New Thread 37016.0x9ac4]
[Thread 37016.0x3c28 exited with code 0]
[Thread 37016.0x2730 exited with code 0]
[Thread 37016.0x324c exited with code 0]
[Thread 37016.0x1438 exited with code 0]
[New Thread 37016.0x4824]
[Thread 37016.0x4824 exited with code 1]
[Thread 37016.0x4db4 exited with code 0]
[New Thread 37016.0x7720]
[Thread 37016.0x7934 exited with code 0]
[New Thread 37016.0x7978]
[New Thread 37016.0x4608]
[New Thread 37016.0x3998]
[New Thread 37016.0x8a5c]
[Thread 37016.0x7720 exited with code 1]
[New Thread 37016.0x8b5c]
[New Thread 37016.0x4a54]
[New Thread 37016.0x36ac]
[Thread 37016.0x4a54 exited with code 2]
[New Thread 37016.0x1830]
[Thread 37016.0x5380 exited with code 0]
[Thread 37016.0x8538 exited with code 0]
[Thread 37016.0x8c94 exited with code 0]
[Thread 37016.0x4464 exited with code 0]
[New Thread 37016.0x8554]
[Thread 37016.0x8554 exited with code 1]
[New Thread 37016.0x2504]
[New Thread 37016.0x96c]
[New Thread 37016.0x58d4]
[New Thread 37016.0x96e8]
[New Thread 37016.0x89cc]
[New Thread 37016.0x33a0]
[New Thread 37016.0x8874]
[New Thread 37016.0x3fa0]
[New Thread 37016.0x9350]
[New Thread 37016.0x654c]
[New Thread 37016.0x1d94]
[New Thread 37016.0x6f48]

Thread 1 received signal SIGSEGV, Segmentation fault.
0x00007ff75b930fef in Fcopy_sequence ()
(gdb) bt
#0  0x00007ff75b930fef in Fcopy_sequence ()
#1  0x00007ff75b8a5798 in timer_check ()
#2  0x00007ff75b8a5faa in readable_events ()
#3  0x00007ff75b8a69f5 in get_input_pending ()
#4  0x00007ff75b8a6af3 in swallow_events ()
#5  0x00007ff75b992403 in wait_reading_process_output ()
#6  0x00007ff75b9939a8 in Faccept_process_output ()
#7  0x00007ff75b9790f9 in exec_byte_code ()
#8  0x00007ff75b92a785 in Ffuncall ()
#9  0x00007ff75b92ab44 in Fapply ()
#10 0x00007ff75b9790f9 in exec_byte_code ()
#11 0x00007ff75b92a785 in Ffuncall ()
#12 0x00007ff75b8d89bf in Finsert_file_contents ()
#13 0x00007ff75b92894e in funcall_subr ()
#14 0x00007ff75b9790f9 in exec_byte_code ()
#15 0x00007ff75b92a785 in Ffuncall ()
#16 0x00007ff75b92ab44 in Fapply ()
#17 0x00007ff75b9790f9 in exec_byte_code ()
#18 0x00007ff75b92a785 in Ffuncall ()
#19 0x00007ff75b978a18 in bcall0 ()
#20 0x00007ff75b926d6a in unbind_to ()
#21 0x00007ff75b978f1a in exec_byte_code ()
#22 0x00007ff75b97911e in exec_byte_code ()
#23 0x00007ff75b92a785 in Ffuncall ()
#24 0x00007ff75b922bc4 in Ffuncall_interactively ()
#25 0x00007ff75b92a785 in Ffuncall ()
#26 0x00007ff75b92416e in Fcall_interactively ()
#27 0x00007ffd2c7af24f in F636f6d6d616e642d65786563757465_command_execute_0 () from c:\users\sebm\home\emacs-ucrt\lib\emacs\31.0.50\native-lisp\31.0.50-4147138a\preloaded\simple-fab5b0cf-6cd62745.eln
#28 0x00007ff75b92a785 in Ffuncall ()
#29 0x00007ff75b8b011c in command_loop_1 ()
#30 0x00007ff75b925993 in internal_condition_case ()
#31 0x00007ff75b89baa2 in command_loop_2 ()
#32 0x00007ff75b925872 in internal_catch ()
#33 0x00007ff75b89ba3c in command_loop ()
#34 0x00007ff75b8a4767 in recursive_edit_1 ()
#35 0x00007ff75b8a4b44 in Frecursive_edit ()
#36 0x00007ff75bacb1b9 in main ()
(gdb)

[-- Attachment #3: Type: text/plain, Size: 56 bytes --]



-- 
Sebastián Monía
https://site.sebasmonia.com/

^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-21 18:14                                                           ` Sebastián Monía
@ 2024-08-21 18:20                                                             ` Pip Cet
  2024-08-21 19:46                                                               ` Sebastián Monía
  2024-08-21 18:22                                                             ` Ihor Radchenko
  2024-08-22 17:34                                                             ` Sebastián Monía
  2 siblings, 1 reply; 119+ messages in thread
From: Pip Cet @ 2024-08-21 18:20 UTC (permalink / raw)
  To: Sebastián Monía; +Cc: Quang Kien Nguyen, Eli Zaretskii, emacs-devel

Sebastián Monía <sebastian@sebasmonia.com> writes:

> Quang Kien Nguyen <kien.n.quang@gmail.com> writes:
>
>> The unstripped version is here emacs-7480876-ucrt-x86_64-mps.msix [1]
>>
>> [1] https://github.com/kiennq/emacs-build/releases/tag/v31.302.20240819.7480876
>
> Hi Kien,
>
> I ran both that version and the next one. I attached a backtraced of the
> latest version. It crashed when I opened Gnus.

Did it crash outside of gdb?

You probably know this, but MPS uses SiGSEGV internally for its
barriers.  If you haven't, please try continuing after a segfault until
you hit terminate_due_to_signal, which is only called if the segfault
couldn't be handled otherwise.

Sorry if this is redundant
Pip




^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-21 18:14                                                           ` Sebastián Monía
  2024-08-21 18:20                                                             ` Pip Cet
@ 2024-08-21 18:22                                                             ` Ihor Radchenko
  2024-08-21 19:48                                                               ` Sebastián Monía
  2024-08-22 17:34                                                             ` Sebastián Monía
  2 siblings, 1 reply; 119+ messages in thread
From: Ihor Radchenko @ 2024-08-21 18:22 UTC (permalink / raw)
  To: Sebastián Monía
  Cc: Quang Kien Nguyen, Eli Zaretskii, pipcet, emacs-devel

Sebastián Monía <sebastian@sebasmonia.com> writes:

> I ran both that version and the next one. I attached a backtraced of the
> latest version. It crashed when I opened Gnus.
> ...
> Thread 1 received signal SIGSEGV, Segmentation fault.

AFAIU, it is not a crash. SIGENV is used by MPS internally.

You need to tell gdb skip SIGENV signals:

- Run Emacs with GDB
  : cd src
  : gdb --args ./emacs -Q
  : handle SIGSEGV nostop noprint
  : run

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-21 18:20                                                             ` Pip Cet
@ 2024-08-21 19:46                                                               ` Sebastián Monía
  0 siblings, 0 replies; 119+ messages in thread
From: Sebastián Monía @ 2024-08-21 19:46 UTC (permalink / raw)
  To: Pip Cet; +Cc: Quang Kien Nguyen, Eli Zaretskii, emacs-devel

Pip Cet <pipcet@protonmail.com> writes:

> Did it crash outside of gdb?

The very first build, yes.

> You probably know this, but MPS uses SiGSEGV internally for its
> barriers.  If you haven't, please try continuing after a segfault until
> you hit terminate_due_to_signal, which is only called if the segfault
> couldn't be handled otherwise.
>
> Sorry if this is redundant

It isn't redundant, as I didn't know that, so this explanation is very
helpful. Thank you!

-- 
Sebastián Monía
https://site.sebasmonia.com/



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-21 18:22                                                             ` Ihor Radchenko
@ 2024-08-21 19:48                                                               ` Sebastián Monía
  0 siblings, 0 replies; 119+ messages in thread
From: Sebastián Monía @ 2024-08-21 19:48 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: Quang Kien Nguyen, Eli Zaretskii, pipcet, emacs-devel

Ihor Radchenko <yantar92@posteo.net> writes:


>> Thread 1 received signal SIGSEGV, Segmentation fault.
>
> AFAIU, it is not a crash. SIGENV is used by MPS internally.
>
> You need to tell gdb skip SIGENV signals:
>
> - Run Emacs with GDB
>   : cd src
>   : gdb --args ./emacs -Q
>   : handle SIGSEGV nostop noprint
>   : run

The recipe is much appreciated, Emacs stopped responding and I thought
it was the same crash I had before (in the very first build Kien
provided).

I am not familiar with gdb at all - and it shows =/

Thank you!

-- 
Sebastián Monía
https://site.sebasmonia.com/



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-21 18:14                                                           ` Sebastián Monía
  2024-08-21 18:20                                                             ` Pip Cet
  2024-08-21 18:22                                                             ` Ihor Radchenko
@ 2024-08-22 17:34                                                             ` Sebastián Monía
  2024-08-22 17:51                                                               ` Pip Cet
  2024-08-22 18:11                                                               ` Eli Zaretskii
  2 siblings, 2 replies; 119+ messages in thread
From: Sebastián Monía @ 2024-08-22 17:34 UTC (permalink / raw)
  To: Quang Kien Nguyen; +Cc: Eli Zaretskii, pipcet, emacs-devel, Ihor Radchenko

[-- Attachment #1: Type: text/plain, Size: 724 bytes --]

Sebastián Monía <sebastian@sebasmonia.com> writes:

> Quang Kien Nguyen <kien.n.quang@gmail.com> writes:
>
>> The unstripped version is here emacs-7480876-ucrt-x86_64-mps.msix [1]
>>
>> [1]
>> https://github.com/kiennq/emacs-build/releases/tag/v31.302.20240819.7480876


I was running this version today:

https://github.com/kiennq/emacs-build/releases/tag/v31.305.20240819.4794ea5

Had two different crashes, hope that these backtraces are more useful
(thanks again to Pip and Ihor for their help)

bt2 happened when I opened a website with EWW from the bookmark list.
bt3 while using Gnus.

I get the impression libgnutls is involved in both - but as established,
I am far of being a GDB expert :)


[-- Attachment #2: bt2.txt --]
[-- Type: text/plain, Size: 3186 bytes --]

[Thread 16732.0x9534 exited with code 1]
[New Thread 16732.0x5518]
[New Thread 16732.0x3f90]
[New Thread 16732.0x7698]
[New Thread 16732.0xad4]
[New Thread 16732.0x3c74]
[Thread 16732.0x7698 exited with code 0]
[Thread 16732.0x3f90 exited with code 0]
[Thread 16732.0x5518 exited with code 0]
[Thread 16732.0x9104 exited with code 0]
[Thread 16732.0x2548 exited with code 0]
[Thread 16732.0x73e8 exited with code 0]
[Thread 16732.0x4184 exited with code 0]
[Thread 16732.0x5f4c exited with code 1]
[New Thread 16732.0x7470]

Thread 1 received signal SIGTRAP, Trace/breakpoint trap.
0x00007ffdc52f7b13 in KERNELBASE!DebugBreak () from C:\WINDOWS\System32\KernelBase.dll
(gdb) bt
#0  0x00007ffdc52f7b13 in KERNELBASE!DebugBreak () from C:\WINDOWS\System32\KernelBase.dll
#1  0x00007ff75b9da08a in emacs_abort ()
#2  0x00007ff75b89b219 in terminate_due_to_signal ()
#3  0x00007ff75b8bc029 in deliver_fatal_thread_signal ()
#4  0x00007ff75bab8cc2 in _gnu_exception_handler (exception_data=0xbfd080)
    at C:/M/B/src/mingw-w64/mingw-w64-crt/crt/crt_handler.c:213
#5  0x00007ffdc58e7f00 in ucrtbase!__C_specific_handler () from C:\WINDOWS\System32\ucrtbase.dll
#6  0x00007ffdc7d3504f in ntdll!.chkstk () from C:\WINDOWS\SYSTEM32\ntdll.dll
#7  0x00007ffdc7cae866 in ntdll!RtlFindCharInUnicodeString () from C:\WINDOWS\SYSTEM32\ntdll.dll
#8  0x00007ffdc7d3403e in ntdll!KiUserExceptionDispatcher () from C:\WINDOWS\SYSTEM32\ntdll.dll
#9  0x00007ffd350f1740 in ?? () from C:\Users\SEBM\home\emacs-ucrt\bin\libgnutls-30.dll
#10 0x00007ff75ba0e0d2 in emacs_gnutls_pull ()
#11 0x00007ffd350ad64c in ?? () from C:\Users\SEBM\home\emacs-ucrt\bin\libgnutls-30.dll
#12 0x00007ffd350a2795 in ?? () from C:\Users\SEBM\home\emacs-ucrt\bin\libgnutls-30.dll
#13 0x00007ffd350a4e62 in ?? () from C:\Users\SEBM\home\emacs-ucrt\bin\libgnutls-30.dll
#14 0x00007ffd350a6129 in ?? () from C:\Users\SEBM\home\emacs-ucrt\bin\libgnutls-30.dll
#15 0x00007ff75b9994cf in emacs_gnutls_read ()
#16 0x00007ff75b98afa3 in read_process_output ()
#17 0x00007ff75b991fe5 in wait_reading_process_output ()
#18 0x00007ff75b7cc959 in sit_for ()
#19 0x00007ff75b8ad261 in read_char ()
#20 0x00007ff75b8ae6da in read_key_sequence.isra ()
#21 0x00007ff75b8afee3 in command_loop_1 ()
#22 0x00007ff75b925993 in internal_condition_case ()
#23 0x00007ff75b89baa2 in command_loop_2 ()
#24 0x00007ff75b925872 in internal_catch ()
#25 0x00007ff75b89ba3c in command_loop ()
#26 0x00007ff75b8a4767 in recursive_edit_1 ()
#27 0x00007ff75b8a4b44 in Frecursive_edit ()
--Type <RET> for more, q to quit, c to continue without paging--c
#28 0x00007ff75bacb1b9 in main ()
(gdb) continue
Continuing.
[Thread 16732.0x8310 exited with code 2]
[Thread 16732.0x2b98 exited with code 2]
[Thread 16732.0x90a8 exited with code 2]
[Thread 16732.0x7470 exited with code 2]
[Thread 16732.0x6ce0 exited with code 2]
[Thread 16732.0x5d04 exited with code 2]
[Thread 16732.0x9b9c exited with code 2]
[Thread 16732.0xad4 exited with code 2]
[Thread 16732.0x1830 exited with code 2]
[Thread 16732.0x834c exited with code 2]
[Thread 16732.0x9b8c exited with code 2]
[Thread 16732.0x3c74 exited with code 2]
[Inferior 1 (process 16732) exited with code 02]
(gdb)

[-- Attachment #3: bt3.txt --]
[-- Type: text/plain, Size: 4937 bytes --]

[Thread 22812.0x38fc exited with code 0]
[Thread 22812.0x8f30 exited with code 0]
[Thread 22812.0x770c exited with code 0]
[Thread 22812.0x5964 exited with code 0]
[New Thread 22812.0x6f88]
[Thread 22812.0x31d4 exited with code 0]
[Thread 22812.0x6dfc exited with code 0]
[Thread 22812.0x5a88 exited with code 0]
[Thread 22812.0x1b18 exited with code 0]
[New Thread 22812.0x4250]
[Thread 22812.0x9a0c exited with code 0]
[New Thread 22812.0x962c]
[Thread 22812.0x6f88 exited with code 0]
[Thread 22812.0x22e4 exited with code 0]
[Thread 22812.0x8c4c exited with code 1]
[New Thread 22812.0x2b08]
[Thread 22812.0x1f04 exited with code 0]

Thread 1 received signal SIGTRAP, Trace/breakpoint trap.
0x00007ffdc52f7b13 in KERNELBASE!DebugBreak () from C:\WINDOWS\System32\KernelBase.dll
(gdb) bt
#0  0x00007ffdc52f7b13 in KERNELBASE!DebugBreak () from C:\WINDOWS\System32\KernelBase.dll
#1  0x00007ff75b9da08a in emacs_abort ()
#2  0x00007ff75b89b219 in terminate_due_to_signal ()
#3  0x00007ff75b8bc029 in deliver_fatal_thread_signal ()
#4  0x00007ff75bab8cc2 in _gnu_exception_handler (exception_data=0xbfd000)
    at C:/M/B/src/mingw-w64/mingw-w64-crt/crt/crt_handler.c:213
#5  0x00007ffdc58e7f00 in ucrtbase!__C_specific_handler () from C:\WINDOWS\System32\ucrtbase.dll
#6  0x00007ffdc7d3504f in ntdll!.chkstk () from C:\WINDOWS\SYSTEM32\ntdll.dll
#7  0x00007ffdc7cae866 in ntdll!RtlFindCharInUnicodeString () from C:\WINDOWS\SYSTEM32\ntdll.dll
#8  0x00007ffdc7d3403e in ntdll!KiUserExceptionDispatcher () from C:\WINDOWS\SYSTEM32\ntdll.dll
#9  0x00007ffd39951740 in ?? () from C:\Users\SEBM\home\emacs-ucrt\bin\libgnutls-30.dll
#10 0x00007ff75ba0e12e in emacs_gnutls_push ()
#11 0x00007ffd3990c41f in ?? () from C:\Users\SEBM\home\emacs-ucrt\bin\libgnutls-30.dll
#12 0x00007ffd3990cf24 in ?? () from C:\Users\SEBM\home\emacs-ucrt\bin\libgnutls-30.dll
#13 0x00007ffd39901fcb in ?? () from C:\Users\SEBM\home\emacs-ucrt\bin\libgnutls-30.dll
#14 0x00007ffd399057b0 in ?? () from C:\Users\SEBM\home\emacs-ucrt\bin\libgnutls-30.dll
#15 0x00007ffd39905944 in ?? () from C:\Users\SEBM\home\emacs-ucrt\bin\libgnutls-30.dll
#16 0x00007ff75b99944f in emacs_gnutls_write ()
#17 0x00007ff75b993f47 in send_process ()
#18 0x00007ff75b9945f4 in Fprocess_send_string ()
#19 0x00007ffd368c62c4 in F6e6e696d61702d73656e642d636f6d6d616e64_nnimap_send_command_0 ()
   from c:\users\sebm\home\.emacs.d\eln-cache\31.0.50-4147138a\nnimap-91c35abc-92e3c0ef.eln
#20 0x00007ff75b92a785 in Ffuncall ()
#21 0x00007ff75b92ab44 in Fapply ()
#22 0x00007ffd368c65f5 in F6e6e696d61702d636f6d6d616e64_nnimap_command_0 ()
   from c:\users\sebm\home\.emacs.d\eln-cache\31.0.50-4147138a\nnimap-91c35abc-92e3c0ef.eln
#23 0x00007ff75b92a785 in Ffuncall ()
#24 0x00007ffd368c5b4b in F6e6e696d61702d6368616e67652d67726f7570_nnimap_change_group_0 ()
   from c:\users\sebm\home\.emacs.d\eln-cache\31.0.50-4147138a\nnimap-91c35abc-92e3c0ef.eln
--Type <RET> for more, q to quit, c to continue without paging--c
#25 0x00007ff75b92a785 in Ffuncall ()
#26 0x00007ffd368be631 in F6e6e696d61702d726571756573742d7365742d6d61726b_nnimap_request_set_mark_0 ()
   from c:\users\sebm\home\.emacs.d\eln-cache\31.0.50-4147138a\nnimap-91c35abc-92e3c0ef.eln
#27 0x00007ff75b92a785 in Ffuncall ()
#28 0x00007ffd44a75128 in F676e75732d726571756573742d7365742d6d61726b_gnus_request_set_mark_0 ()
   from c:\users\sebm\home\.emacs.d\eln-cache\31.0.50-4147138a\gnus-int-7bc862cf-7d6fb32d.eln
#29 0x00007ff75b92a785 in Ffuncall ()
#30 0x00007ffd35041601 in F676e75732d7570646174652d726561642d61727469636c6573_gnus_update_read_articles_0 ()
   from c:\users\sebm\home\.emacs.d\eln-cache\31.0.50-4147138a\gnus-sum-2a5c0016-88bdeeed.eln
#31 0x00007ff75b92a785 in Ffuncall ()
#32 0x00007ffd3500fe10 in F676e75732d73756d6d6172792d7570646174652d696e666f_gnus_summary_update_info_0 ()
   from c:\users\sebm\home\.emacs.d\eln-cache\31.0.50-4147138a\gnus-sum-2a5c0016-88bdeeed.eln
#33 0x00007ff75b92a785 in Ffuncall ()
#34 0x00007ffd350109e5 in F676e75732d73756d6d6172792d65786974_gnus_summary_exit_0 ()
   from c:\users\sebm\home\.emacs.d\eln-cache\31.0.50-4147138a\gnus-sum-2a5c0016-88bdeeed.eln
#35 0x00007ff75b92a785 in Ffuncall ()
#36 0x00007ff75b922bc4 in Ffuncall_interactively ()
#37 0x00007ff75b92a785 in Ffuncall ()
#38 0x00007ff75b92ad00 in Fapply ()
#39 0x00007ff75b9243c3 in Fcall_interactively ()
#40 0x00007ffd627df24f in F636f6d6d616e642d65786563757465_command_execute_0 ()
   from c:\Users\SEBM\home\emacs-ucrt\lib\emacs\31.0.50\native-lisp\31.0.50-4147138a\preloaded\simple-fab5b0cf-6cd62745.eln
#41 0x00007ff75b92a785 in Ffuncall ()
#42 0x00007ff75b8b011c in command_loop_1 ()
#43 0x00007ff75b925993 in internal_condition_case ()
#44 0x00007ff75b89baa2 in command_loop_2 ()
#45 0x00007ff75b925872 in internal_catch ()
#46 0x00007ff75b89ba3c in command_loop ()
#47 0x00007ff75b8a4767 in recursive_edit_1 ()
#48 0x00007ff75b8a4b44 in Frecursive_edit ()
#49 0x00007ff75bacb1b9 in main ()
(gdb)

[-- Attachment #4: Type: text/plain, Size: 54 bytes --]


-- 
Sebastián Monía
https://site.sebasmonia.com/

^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-22 17:34                                                             ` Sebastián Monía
@ 2024-08-22 17:51                                                               ` Pip Cet
  2024-08-22 18:34                                                                 ` Eli Zaretskii
  2024-08-22 18:11                                                               ` Eli Zaretskii
  1 sibling, 1 reply; 119+ messages in thread
From: Pip Cet @ 2024-08-22 17:51 UTC (permalink / raw)
  To: Sebastián Monía
  Cc: Quang Kien Nguyen, Eli Zaretskii, emacs-devel, Ihor Radchenko

Sebastián Monía <sebastian@sebasmonia.com> writes:

> Sebastián Monía <sebastian@sebasmonia.com> writes:
>
>> Quang Kien Nguyen <kien.n.quang@gmail.com> writes:
>>
>>> The unstripped version is here emacs-7480876-ucrt-x86_64-mps.msix [1]
>>>
>>> [1]
>>> https://github.com/kiennq/emacs-build/releases/tag/v31.302.20240819.7480876
>
>
> I was running this version today:
>
> https://github.com/kiennq/emacs-build/releases/tag/v31.305.20240819.4794ea5
>
> Had two different crashes, hope that these backtraces are more useful
> (thanks again to Pip and Ihor for their help)

Thank you, that's very useful.  Indeed, it looks like the
Windows-specific code hands off a pointer to MPS-managed memory to
GNUTLS to use as a cookie, while other OSes use an FD number cast to an
intptr_t cast to void *.

> bt2 happened when I opened a website with EWW from the bookmark list.
> bt3 while using Gnus.
>
> I get the impression libgnutls is involved in both - but as established,
> I am far of being a GDB expert :)

That looks very likely, thank you again.  I'll have to install gnutls on
my wine system to try to reproduce it, but if it is the problem I
described above it should be easy enough to fix.

Pip




^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-22 17:34                                                             ` Sebastián Monía
  2024-08-22 17:51                                                               ` Pip Cet
@ 2024-08-22 18:11                                                               ` Eli Zaretskii
  2024-08-22 19:17                                                                 ` Sebastián Monía
  1 sibling, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-22 18:11 UTC (permalink / raw)
  To: Sebastián Monía; +Cc: kien.n.quang, pipcet, emacs-devel, yantar92

> From: Sebastián Monía <sebastian@sebasmonia.com>
> Cc: Eli Zaretskii <eliz@gnu.org>,  pipcet@protonmail.com,
>  emacs-devel@gnu.org, Ihor Radchenko <yantar92@posteo.net>
> Date: Thu, 22 Aug 2024 13:34:38 -0400
> 
> Sebastián Monía <sebastian@sebasmonia.com> writes:
> 
> > Quang Kien Nguyen <kien.n.quang@gmail.com> writes:
> >
> >> The unstripped version is here emacs-7480876-ucrt-x86_64-mps.msix [1]
> >>
> >> [1]
> >> https://github.com/kiennq/emacs-build/releases/tag/v31.302.20240819.7480876
> 
> 
> I was running this version today:
> 
> https://github.com/kiennq/emacs-build/releases/tag/v31.305.20240819.4794ea5
> 
> Had two different crashes, hope that these backtraces are more useful
> (thanks again to Pip and Ihor for their help)
> 
> bt2 happened when I opened a website with EWW from the bookmark list.
> bt3 while using Gnus.
> 
> I get the impression libgnutls is involved in both - but as established,
> I am far of being a GDB expert :)

Thanks, but the backtraces show only minimal information, not even the
arguments to functions, let alone line numbers.  How (with what
compiler switches) was Emacs compiled?  The value of
system-configuration-options should be of help in answering this
question.

Without line-number information it is hard to guess what could be
causing these crashes.  And even if I could guess, I doubt that the
debug info in the binary is rich enough to answer important questions
like values of variables involved in the crash.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-22 17:51                                                               ` Pip Cet
@ 2024-08-22 18:34                                                                 ` Eli Zaretskii
  2024-08-22 19:12                                                                   ` Quang Kien Nguyen
  2024-08-22 19:14                                                                   ` Pip Cet
  0 siblings, 2 replies; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-22 18:34 UTC (permalink / raw)
  To: Pip Cet; +Cc: sebastian, kien.n.quang, emacs-devel, yantar92

> Date: Thu, 22 Aug 2024 17:51:38 +0000
> From: Pip Cet <pipcet@protonmail.com>
> Cc: Quang Kien Nguyen <kien.n.quang@gmail.com>, Eli Zaretskii <eliz@gnu.org>, emacs-devel@gnu.org, Ihor Radchenko <yantar92@posteo.net>
> 
> > I was running this version today:
> >
> > https://github.com/kiennq/emacs-build/releases/tag/v31.305.20240819.4794ea5
> >
> > Had two different crashes, hope that these backtraces are more useful
> > (thanks again to Pip and Ihor for their help)
> 
> Thank you, that's very useful.  Indeed, it looks like the
> Windows-specific code hands off a pointer to MPS-managed memory to
> GNUTLS to use as a cookie, while other OSes use an FD number cast to an
> intptr_t cast to void *.

You are talking about this line in emacs_gnutls_pull:

  emacs_gnutls_transport_set_errno (process->gnutls_state,
                                    errno == EWOULDBLOCK ? EAGAIN : errno);

which causes us to call GnuTLS thusly:

  gnutls_transport_set_errno (state, err);

is that right?  Does this mean we will have to audit all our calls to
external libraries and make sure we never pass to them any part of any
Lisp object?  That's a tough requirement; it's very easy to miss some
such use, which then triggers segfaults.  Am I missing something?

Btw, I tried using EWW in my MinGW MPS build, and it didn't crash.  Is
it possible to have a reproducible recipe for this?



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-22 18:34                                                                 ` Eli Zaretskii
@ 2024-08-22 19:12                                                                   ` Quang Kien Nguyen
  2024-08-23  5:32                                                                     ` Eli Zaretskii
  2024-08-22 19:14                                                                   ` Pip Cet
  1 sibling, 1 reply; 119+ messages in thread
From: Quang Kien Nguyen @ 2024-08-22 19:12 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Pip Cet, sebastian, emacs-devel, yantar92

The value of system-configuration-options is
"--prefix=/d/a/emacs-build/emacs-build/pkg/4794ea5-ucrt-x86_64
'CFLAGS=-O2 -fno-semantic-interposition -floop-parallelize-all
-ftree-parallelize-loops=4' --without-tiff --without-cairo --with-zlib
--with-xpm --with-xml2 --with-tree-sitter --with-rsvg --with-png
--with-native-compilation --with-mps --with-lcms2 --with-json
--with-jpeg --with-harfbuzz --with-gnutls --with-gif
--disable-build-details --without-dbus --with-compress-install
--with-small-ja-dic"

----
Kien



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-22 18:34                                                                 ` Eli Zaretskii
  2024-08-22 19:12                                                                   ` Quang Kien Nguyen
@ 2024-08-22 19:14                                                                   ` Pip Cet
  2024-08-23  5:38                                                                     ` Eli Zaretskii
  1 sibling, 1 reply; 119+ messages in thread
From: Pip Cet @ 2024-08-22 19:14 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: sebastian, kien.n.quang, emacs-devel, yantar92

"Eli Zaretskii" <eliz@gnu.org> writes:

>> Date: Thu, 22 Aug 2024 17:51:38 +0000
>> From: Pip Cet <pipcet@protonmail.com>
>> Cc: Quang Kien Nguyen <kien.n.quang@gmail.com>, Eli Zaretskii <eliz@gnu.org>, emacs-devel@gnu.org, Ihor Radchenko <yantar92@posteo.net>
>>
>> > I was running this version today:
>> >
>> > https://github.com/kiennq/emacs-build/releases/tag/v31.305.20240819.4794ea5
>> >
>> > Had two different crashes, hope that these backtraces are more useful
>> > (thanks again to Pip and Ihor for their help)
>>
>> Thank you, that's very useful.  Indeed, it looks like the
>> Windows-specific code hands off a pointer to MPS-managed memory to
>> GNUTLS to use as a cookie, while other OSes use an FD number cast to an
>> intptr_t cast to void *.
>

I meant this code in gnutls.c:

  if (proc->gnutls_initstage < GNUTLS_STAGE_TRANSPORT_POINTERS_SET)
    {
# ifdef WINDOWSNT
      /* On W32 we cannot transfer socket handles between different runtime
	 libraries, so we tell GnuTLS to use our special push/pull
	 functions.  */
      gnutls_transport_set_ptr2 (state,
				 (gnutls_transport_ptr_t) proc,
				 (gnutls_transport_ptr_t) proc);
      gnutls_transport_set_push_function (state, &emacs_gnutls_push);
      gnutls_transport_set_pull_function (state, &emacs_gnutls_pull);
# else
      /* This is how GnuTLS takes sockets: as file descriptors passed
	 in.  For an Emacs process socket, infd and outfd are the
	 same but we use this two-argument version for clarity.  */
      gnutls_transport_set_ptr2 (state,
				 (void *) (intptr_t) proc->infd,
				 (void *) (intptr_t) proc->outfd);
      if (proc->is_non_blocking_client)
	gnutls_transport_set_errno_function (state,
					     emacs_gnutls_nonblock_errno);
# endif

      proc->gnutls_initstage = GNUTLS_STAGE_TRANSPORT_POINTERS_SET;
    }


That hands a pointer to 'proc' to gnutls, and if 'proc' subsequently
moves, emacs_gnutls_push or emacs_gnutls_pull will try to dereference a
stale pointer.

> You are talking about this line in emacs_gnutls_pull:
>
>   emacs_gnutls_transport_set_errno (process->gnutls_state,
>                                     errno == EWOULDBLOCK ? EAGAIN : errno);
>
> which causes us to call GnuTLS thusly:
>
>   gnutls_transport_set_errno (state, err);
>
> is that right?

> Does this mean we will have to audit all our calls to
> external libraries and make sure we never pass to them any part of any
> Lisp object?  That's a tough requirement; it's very easy to miss some
> such use, which then triggers segfaults.  Am I missing something?

Synchronous calls do not need to be changed, only asynchronous callbacks
that currently use a pointer to a Lisp object as their cookie.

> Btw, I tried using EWW in my MinGW MPS build, and it didn't crash.  Is
> it possible to have a reproducible recipe for this?

I'll try coming up with one, though that's probably just going to mean
adding (igc-collect) after the gnutls handshake somewhere in the Lisp
code.

By the way, I fully agree more debugging information would be helpful.

Pip




^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-22 18:11                                                               ` Eli Zaretskii
@ 2024-08-22 19:17                                                                 ` Sebastián Monía
  2024-08-23  5:45                                                                   ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Sebastián Monía @ 2024-08-22 19:17 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: kien.n.quang, pipcet, emacs-devel, yantar92

Eli Zaretskii <eliz@gnu.org> writes:

> Thanks, but the backtraces show only minimal information, not even the
> arguments to functions, let alone line numbers.  How (with what
> compiler switches) was Emacs compiled?  The value of
> system-configuration-options should be of help in answering this
> question.
>
> Without line-number information it is hard to guess what could be
> causing these crashes.  And even if I could guess, I doubt that the
> debug info in the binary is rich enough to answer important questions
> like values of variables involved in the crash.

I am still using the build that Kien graciously provided, maybe I should
build my own so we have better debug info.

Not sure how building the UCRT version differs from the usual MinGW64
recipe shared in the INSTALL.w64 file. I assume I need a different
compiler?

On Monday I found out $WORK has a full Visual Studio license for all
developers, so I have access to those compilers :) an unexpected
surprise (my team in particular is more Python oriented)


-- 
Sebastián Monía
https://site.sebasmonia.com/



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-22 19:12                                                                   ` Quang Kien Nguyen
@ 2024-08-23  5:32                                                                     ` Eli Zaretskii
  0 siblings, 0 replies; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-23  5:32 UTC (permalink / raw)
  To: Quang Kien Nguyen; +Cc: pipcet, sebastian, emacs-devel, yantar92

> From: Quang Kien Nguyen <kien.n.quang@gmail.com>
> Date: Thu, 22 Aug 2024 12:12:18 -0700
> Cc: Pip Cet <pipcet@protonmail.com>, sebastian@sebasmonia.com, emacs-devel@gnu.org, 
> 	yantar92@posteo.net
> 
> The value of system-configuration-options is
> "--prefix=/d/a/emacs-build/emacs-build/pkg/4794ea5-ucrt-x86_64
> 'CFLAGS=-O2 -fno-semantic-interposition -floop-parallelize-all
> -ftree-parallelize-loops=4' --without-tiff --without-cairo --with-zlib
> --with-xpm --with-xml2 --with-tree-sitter --with-rsvg --with-png
> --with-native-compilation --with-mps --with-lcms2 --with-json
> --with-jpeg --with-harfbuzz --with-gnutls --with-gif
> --disable-build-details --without-dbus --with-compress-install
> --with-small-ja-dic"

Now I understand: the -g3 option is missing.  In addition, builds of
development versions should not use --disable-build-details, it omits
several details that are very useful for debugging problems.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-22 19:14                                                                   ` Pip Cet
@ 2024-08-23  5:38                                                                     ` Eli Zaretskii
  2024-08-23  7:59                                                                       ` Pip Cet
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-23  5:38 UTC (permalink / raw)
  To: Pip Cet; +Cc: sebastian, kien.n.quang, emacs-devel, yantar92

> Date: Thu, 22 Aug 2024 19:14:51 +0000
> From: Pip Cet <pipcet@protonmail.com>
> Cc: sebastian@sebasmonia.com, kien.n.quang@gmail.com, emacs-devel@gnu.org, yantar92@posteo.net
> 
> "Eli Zaretskii" <eliz@gnu.org> writes:
> 
> I meant this code in gnutls.c:
> 
>   if (proc->gnutls_initstage < GNUTLS_STAGE_TRANSPORT_POINTERS_SET)
>     {
> # ifdef WINDOWSNT
>       /* On W32 we cannot transfer socket handles between different runtime
> 	 libraries, so we tell GnuTLS to use our special push/pull
> 	 functions.  */
>       gnutls_transport_set_ptr2 (state,
> 				 (gnutls_transport_ptr_t) proc,
> 				 (gnutls_transport_ptr_t) proc);
>       gnutls_transport_set_push_function (state, &emacs_gnutls_push);
>       gnutls_transport_set_pull_function (state, &emacs_gnutls_pull);
> # else
>       /* This is how GnuTLS takes sockets: as file descriptors passed
> 	 in.  For an Emacs process socket, infd and outfd are the
> 	 same but we use this two-argument version for clarity.  */
>       gnutls_transport_set_ptr2 (state,
> 				 (void *) (intptr_t) proc->infd,
> 				 (void *) (intptr_t) proc->outfd);
>       if (proc->is_non_blocking_client)
> 	gnutls_transport_set_errno_function (state,
> 					     emacs_gnutls_nonblock_errno);
> # endif
> 
>       proc->gnutls_initstage = GNUTLS_STAGE_TRANSPORT_POINTERS_SET;
>     }
> 
> 
> That hands a pointer to 'proc' to gnutls, and if 'proc' subsequently
> moves, emacs_gnutls_push or emacs_gnutls_pull will try to dereference a
> stale pointer.

But the pointer to 'proc' is passed to GnuTLS for the sole purpose
that GnuTLS passes it back to our callback, emacs_gnutls_pull.  GnuTLS
itself does not (and cannot) use that pointer, for the obvious reasons
that it knows nothing about our objects.

> > You are talking about this line in emacs_gnutls_pull:
> >
> >   emacs_gnutls_transport_set_errno (process->gnutls_state,
> >                                     errno == EWOULDBLOCK ? EAGAIN : errno);
> >
> > which causes us to call GnuTLS thusly:
> >
> >   gnutls_transport_set_errno (state, err);
> >
> > is that right?
> 
> > Does this mean we will have to audit all our calls to
> > external libraries and make sure we never pass to them any part of any
> > Lisp object?  That's a tough requirement; it's very easy to miss some
> > such use, which then triggers segfaults.  Am I missing something?
> 
> Synchronous calls do not need to be changed, only asynchronous callbacks
> that currently use a pointer to a Lisp object as their cookie.

But emacs_gnutls_pull is not an asynchronous call, it is called when
Emacs calls GnuTLS to read from the connection.  So how this could be
a problem?

And what do you mean by "asynchronous calls"?  For example, you can
see in w32font.c that we call certain Windows APIs which work by
enumerating objects of some kind and calling our callback for each
such object (the callback that does with each object what it needs to
do).  Is this an "asynchronous call"?  If not, what is?

> > Btw, I tried using EWW in my MinGW MPS build, and it didn't crash.  Is
> > it possible to have a reproducible recipe for this?
> 
> I'll try coming up with one, though that's probably just going to mean
> adding (igc-collect) after the gnutls handshake somewhere in the Lisp
> code.

Thanks.

But a clear understanding of what causes these segfaults is also
needed, because Emacs is full of similar callbacks, especially on
Windows, where many APIs we use work with callbacks.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-22 19:17                                                                 ` Sebastián Monía
@ 2024-08-23  5:45                                                                   ` Eli Zaretskii
  0 siblings, 0 replies; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-23  5:45 UTC (permalink / raw)
  To: Sebastián Monía; +Cc: kien.n.quang, pipcet, emacs-devel, yantar92

> From: Sebastián Monía <sebastian@sebasmonia.com>
> Cc: kien.n.quang@gmail.com,  pipcet@protonmail.com,  emacs-devel@gnu.org,
>   yantar92@posteo.net
> Date: Thu, 22 Aug 2024 15:17:19 -0400
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > Thanks, but the backtraces show only minimal information, not even the
> > arguments to functions, let alone line numbers.  How (with what
> > compiler switches) was Emacs compiled?  The value of
> > system-configuration-options should be of help in answering this
> > question.
> >
> > Without line-number information it is hard to guess what could be
> > causing these crashes.  And even if I could guess, I doubt that the
> > debug info in the binary is rich enough to answer important questions
> > like values of variables involved in the crash.
> 
> I am still using the build that Kien graciously provided, maybe I should
> build my own so we have better debug info.
> 
> Not sure how building the UCRT version differs from the usual MinGW64
> recipe shared in the INSTALL.w64 file. I assume I need a different
> compiler?

No, the compiler and everything else is the same.  What you need is
(a) make sure compiling a program links against UCRT (it's some
configuration switch in MinGW64, perhaps even the default, I don't
know), and (b) make sure all the auxiliary libraries you download from
the MSYS2 site, like GnuTLS and other libraries that Emacs uses, are
all built for UCRT as well (this is something you should tell pacman
when you tell it to download and install those libraries).

It is best to ask on the MSYS2 forum, because I have only a vague idea
about the practical aspects of this.

> On Monday I found out $WORK has a full Visual Studio license for all
> developers, so I have access to those compilers :) an unexpected
> surprise (my team in particular is more Python oriented)

Visual Studio will hardly help, because Emacs does not support the
Microsoft compilers, not anymore.  You must use MinGW.  Only the DLLs
installed by Visual Studio can be of any use for Emacs, and even then
I'd recommend to prefer the corresponding MSYS2/MinGW64 DLLs.  E.g.,
if a DLL was built from C++ sources, using the version provided with
Visual Studio will in many cases cause unresolved externals during
linking.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-23  5:38                                                                     ` Eli Zaretskii
@ 2024-08-23  7:59                                                                       ` Pip Cet
  2024-08-23 13:08                                                                         ` Eli Zaretskii
  2024-08-24 17:31                                                                         ` Pip Cet
  0 siblings, 2 replies; 119+ messages in thread
From: Pip Cet @ 2024-08-23  7:59 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: sebastian, kien.n.quang, emacs-devel, yantar92

"Eli Zaretskii" <eliz@gnu.org> writes:

>> Date: Thu, 22 Aug 2024 19:14:51 +0000
>> From: Pip Cet <pipcet@protonmail.com>
>> Cc: sebastian@sebasmonia.com, kien.n.quang@gmail.com, emacs-devel@gnu.org, yantar92@posteo.net
>>
>> "Eli Zaretskii" <eliz@gnu.org> writes:
>>
>> I meant this code in gnutls.c:
>>
>>   if (proc->gnutls_initstage < GNUTLS_STAGE_TRANSPORT_POINTERS_SET)
>>     {
>> # ifdef WINDOWSNT
>>       /* On W32 we cannot transfer socket handles between different runtime
>> 	 libraries, so we tell GnuTLS to use our special push/pull
>> 	 functions.  */
>>       gnutls_transport_set_ptr2 (state,
>> 				 (gnutls_transport_ptr_t) proc,
>> 				 (gnutls_transport_ptr_t) proc);
>>       gnutls_transport_set_push_function (state, &emacs_gnutls_push);
>>       gnutls_transport_set_pull_function (state, &emacs_gnutls_pull);
>> # else
>>       /* This is how GnuTLS takes sockets: as file descriptors passed
>> 	 in.  For an Emacs process socket, infd and outfd are the
>> 	 same but we use this two-argument version for clarity.  */
>>       gnutls_transport_set_ptr2 (state,
>> 				 (void *) (intptr_t) proc->infd,
>> 				 (void *) (intptr_t) proc->outfd);
>>       if (proc->is_non_blocking_client)
>> 	gnutls_transport_set_errno_function (state,
>> 					     emacs_gnutls_nonblock_errno);
>> # endif
>>
>>       proc->gnutls_initstage = GNUTLS_STAGE_TRANSPORT_POINTERS_SET;
>>     }
>>
>>
>> That hands a pointer to 'proc' to gnutls, and if 'proc' subsequently
>> moves, emacs_gnutls_push or emacs_gnutls_pull will try to dereference a
>> stale pointer.
>
> But the pointer to 'proc' is passed to GnuTLS for the sole purpose
> that GnuTLS passes it back to our callback, emacs_gnutls_pull.  GnuTLS
> itself does not (and cannot) use that pointer, for the obvious reasons
> that it knows nothing about our objects.

That is my understanding as well.  I'm not sure why you think that's a
"but", though.

A pointer to memory managed in a copying pool, stored outside of
MPS-managed memory, as 'proc' presumably is (in malloc()ed memory, I
would guess, or maybe in a static location somewhere), must be pinned
somehow, so MPS does not move it during GC.

>> > You are talking about this line in emacs_gnutls_pull:
>> >
>> >   emacs_gnutls_transport_set_errno (process->gnutls_state,
>> >                                     errno == EWOULDBLOCK ? EAGAIN : errno);
>> >
>> > which causes us to call GnuTLS thusly:
>> >
>> >   gnutls_transport_set_errno (state, err);
>> >
>> > is that right?
>>
>> > Does this mean we will have to audit all our calls to
>> > external libraries and make sure we never pass to them any part of any
>> > Lisp object?  That's a tough requirement; it's very easy to miss some
>> > such use, which then triggers segfaults.  Am I missing something?
>>
>> Synchronous calls do not need to be changed, only asynchronous callbacks
>> that currently use a pointer to a Lisp object as their cookie.
>
> But emacs_gnutls_pull is not an asynchronous call, it is called when
> Emacs calls GnuTLS to read from the connection.  So how this could be
> a problem?

You're right, it's called synchronously, but uses the callback+cookie
convention usually used for asynchronous callbacks.

> And what do you mean by "asynchronous calls"?  For example, you can
> see in w32font.c that we call certain Windows APIs which work by
> enumerating objects of some kind and calling our callback for each
> such object (the callback that does with each object what it needs to
> do).  Is this an "asynchronous call"?  If not, what is?

It doesn't look asynchronous to me, though I'm not sure we're talking
about the same code.  The LPARAM arguments referring to stack locations
are fine, because the stack is known to MPS.

>> > Btw, I tried using EWW in my MinGW MPS build, and it didn't crash.  Is
>> > it possible to have a reproducible recipe for this?
>>
>> I'll try coming up with one, though that's probably just going to mean
>> adding (igc-collect) after the gnutls handshake somewhere in the Lisp
>> code.
>
> Thanks.

diff --git a/lisp/net/gnutls.el b/lisp/net/gnutls.el
index b5fb4d47d57..f2031143fc9 100644
--- a/lisp/net/gnutls.el
+++ b/lisp/net/gnutls.el
@@ -208,6 +208,7 @@ open-gnutls-stream
                                :keylist keylist
                                :hostname (puny-encode-domain host))))
                    :coding (plist-get parameters :coding))))
+    (igc-collect)
     (if nowait
         process
       (gnutls-negotiate :process process

triggers the bug for me, with this recipe:

* emacs -Q
* M-x eww RET "https://www.gnu.org" RET

> But a clear understanding of what causes these segfaults is also
> needed, because Emacs is full of similar callbacks, especially on
> Windows, where many APIs we use work with callbacks.

MPS needs to know about any pointers to MPS-managed memory.  In
particular, if the cookie is a pointer to MPS-managed memory, and it's
stored in non-MPS-managed memory (such as by an external library), that
will cause problems because MPS believes it is free to move the memory
the pointer points to, but it can't update the pointer itself, so it
will become invalid and dereferencing it will cause segfaults.

On the other hand, pointers that are on the stack are fine, since MPS
treats those conservatively, never moving the blocks of memory they
refer to.

The problem here is that 'proc' might move.  One solution is to make the
cookie a pointer to memory known to MPS, which contains the actual
pointer to the Lisp_Process.  Note that it is not strictly necessary for
the pointer to be allocated with igc_xzalloc_ambig, we could use the
_raw_exact variant.

diff --git a/src/alloc.c b/src/alloc.c
index f41cef9516a..50086f22b24 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -3569,12 +3569,17 @@ cleanup_vector (struct Lisp_Vector *vector)
 	hash_table_allocated_bytes -= bytes;
       }
       break;
+    case PVEC_PROCESS:
+      {
+	struct Lisp_Process *p = PSEUDOVEC_STRUCT (vector, Lisp_Process);
+	xfree (p->gnutls_pproc);
+      }
+      break;
     /* Keep the switch exhaustive.  */
     case PVEC_NORMAL_VECTOR:
     case PVEC_FREE:
     case PVEC_SYMBOL_WITH_POS:
     case PVEC_MISC_PTR:
-    case PVEC_PROCESS:
     case PVEC_FRAME:
     case PVEC_WINDOW:
     case PVEC_BOOL_VECTOR:
diff --git a/src/gnutls.c b/src/gnutls.c
index 334d1d47eb6..7af123b086f 100644
--- a/src/gnutls.c
+++ b/src/gnutls.c
@@ -27,6 +27,10 @@
 #include "buffer.h"
 #include "pdumper.h"
 
+#ifdef HAVE_MPS
+#include "igc.h"
+#endif
+
 #ifdef HAVE_GNUTLS
 
 # if GNUTLS_VERSION_NUMBER >= 0x030014
@@ -702,12 +706,20 @@ emacs_gnutls_handshake (struct Lisp_Process *proc)
   if (proc->gnutls_initstage < GNUTLS_STAGE_TRANSPORT_POINTERS_SET)
     {
 # ifdef WINDOWSNT
+#ifdef HAVE_MPS
+      if (!proc->gnutls_pproc)
+	proc->gnutls_pproc = igc_xzalloc_ambig (sizeof *proc->gnutls_pproc);
+#else
+      if (!proc->gnutls_pproc)
+	proc->gnutls_pproc = xmalloc (sizeof *proc->gnutls_pproc);
+#endif
+      *proc->gnutls->pproc = proc;
       /* On W32 we cannot transfer socket handles between different runtime
 	 libraries, so we tell GnuTLS to use our special push/pull
 	 functions.  */
       gnutls_transport_set_ptr2 (state,
-				 (gnutls_transport_ptr_t) proc,
-				 (gnutls_transport_ptr_t) proc);
+				 (gnutls_transport_ptr_t) proc->gnutls_pproc,
+				 (gnutls_transport_ptr_t) proc->gnutls_pproc);
       gnutls_transport_set_push_function (state, &emacs_gnutls_push);
       gnutls_transport_set_pull_function (state, &emacs_gnutls_pull);
 # else
diff --git a/src/process.h b/src/process.h
index ebc07b23fa7..812059420e1 100644
--- a/src/process.h
+++ b/src/process.h
@@ -191,6 +191,7 @@ #define EMACS_PROCESS_H
 #endif
 
 #ifdef HAVE_GNUTLS
+    struct Lisp_Process **gnutls_pproc;
     gnutls_initstage_t gnutls_initstage;
     gnutls_session_t gnutls_state;
     gnutls_certificate_client_credentials gnutls_x509_cred;
diff --git a/src/w32.c b/src/w32.c
index 31ffa301c2f..6e7425f4099 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -11198,7 +11198,7 @@ register_aux_fd (int infd)
 emacs_gnutls_pull (gnutls_transport_ptr_t p, void* buf, size_t sz)
 {
   int n, err;
-  struct Lisp_Process *process = (struct Lisp_Process *)p;
+  struct Lisp_Process *process = *(struct Lisp_Process **)p;
   int fd = process->infd;
 
   n = sys_read (fd, (char*)buf, sz);
@@ -11220,7 +11220,7 @@ emacs_gnutls_pull (gnutls_transport_ptr_t p, void* buf, size_t sz)
 ssize_t
 emacs_gnutls_push (gnutls_transport_ptr_t p, const void* buf, size_t sz)
 {
-  struct Lisp_Process *process = (struct Lisp_Process *)p;
+  struct Lisp_Process *process = *(struct Lisp_Process **)p;
   int fd = process->outfd;
   ssize_t n = sys_write (fd, buf, sz);
 

There are other solutions which may be better.

Pip




^ permalink raw reply related	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-23  7:59                                                                       ` Pip Cet
@ 2024-08-23 13:08                                                                         ` Eli Zaretskii
  2024-08-23 13:42                                                                           ` Quang Kien Nguyen
  2024-08-23 13:44                                                                           ` Pip Cet
  2024-08-24 17:31                                                                         ` Pip Cet
  1 sibling, 2 replies; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-23 13:08 UTC (permalink / raw)
  To: Pip Cet; +Cc: sebastian, kien.n.quang, emacs-devel, yantar92

> Date: Fri, 23 Aug 2024 07:59:13 +0000
> From: Pip Cet <pipcet@protonmail.com>
> Cc: sebastian@sebasmonia.com, kien.n.quang@gmail.com, emacs-devel@gnu.org, yantar92@posteo.net
> 
> >> That hands a pointer to 'proc' to gnutls, and if 'proc' subsequently
> >> moves, emacs_gnutls_push or emacs_gnutls_pull will try to dereference a
> >> stale pointer.
> >
> > But the pointer to 'proc' is passed to GnuTLS for the sole purpose
> > that GnuTLS passes it back to our callback, emacs_gnutls_pull.  GnuTLS
> > itself does not (and cannot) use that pointer, for the obvious reasons
> > that it knows nothing about our objects.
> 
> That is my understanding as well.  I'm not sure why you think that's a
> "but", though.

Because you seemed to say we were passing the object to GnuTLS for its
own use.

> A pointer to memory managed in a copying pool, stored outside of
> MPS-managed memory, as 'proc' presumably is (in malloc()ed memory, I
> would guess, or maybe in a static location somewhere), must be pinned
> somehow, so MPS does not move it during GC.

Then let's pin it.

But my bother is that we will need to similarly pin many other
pointers and objects, or risk segfaults.  Maybe it means that MPS and
similar igc systems are not suitable for Emacs.

> > And what do you mean by "asynchronous calls"?  For example, you can
> > see in w32font.c that we call certain Windows APIs which work by
> > enumerating objects of some kind and calling our callback for each
> > such object (the callback that does with each object what it needs to
> > do).  Is this an "asynchronous call"?  If not, what is?
> 
> It doesn't look asynchronous to me, though I'm not sure we're talking
> about the same code.  The LPARAM arguments referring to stack locations
> are fine, because the stack is known to MPS.

I mean this:

      EnumFontFamiliesEx (dc, &match_data->pattern,
                          (FONTENUMPROC) add_font_entity_to_list,
                          (LPARAM) match_data, 0);

where add_font_entity_to_list is our callback which is called for
every font family and decides whether it matches the font spec; if so,
the callback adds the family to a list that is then used by the caller
of EnumFontFamiliesEx.

> The problem here is that 'proc' might move.  One solution is to make the
> cookie a pointer to memory known to MPS, which contains the actual
> pointer to the Lisp_Process.  Note that it is not strictly necessary for
> the pointer to be allocated with igc_xzalloc_ambig, we could use the
> _raw_exact variant.

Why not tell MPS not to move this pointer instead?  It sounds like a
simpler solution than the change you proposed.  The solution you
propose will complicate large parts of the Emacs code by using double
indirection; pinning a pointer is much simpler.  Or am I missing
something?

> There are other solutions which may be better.

I certainly hope so, since auditing all of our sources for such
gotchas is an impossible job.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-23 13:08                                                                         ` Eli Zaretskii
@ 2024-08-23 13:42                                                                           ` Quang Kien Nguyen
  2024-08-23 13:48                                                                             ` Pip Cet
  2024-08-23 13:44                                                                           ` Pip Cet
  1 sibling, 1 reply; 119+ messages in thread
From: Quang Kien Nguyen @ 2024-08-23 13:42 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Pip Cet, sebastian, emacs-devel, yantar92

I've built a new version with debug info here[1].

And here is the backtrace in gdb on crash

(gdb) bt
#0  0x00007ffbdf732b83 in KERNELBASE!DebugBreak () from
C:\WINDOWS\System32\KernelBase.dll
#1  0x00007ff684e0fc2a in emacs_abort () at
D:/a/emacs-build/emacs-build/git/a28ba6c/src/w32fns.c:11369
#2  0x00007ff684cbe687 in terminate_due_to_signal (sig=11,
backtrace_limit=40) at
D:/a/emacs-build/emacs-build/git/a28ba6c/src/emacs.c:470
#3  0x00007ff684cdd959 in deliver_fatal_thread_signal.lto_priv.0
(sig=11) at D:/a/emacs-build/emacs-build/git/a28ba6c/src/sysdep.c:1800
#4  0x00007ff684f015e2 in _gnu_exception_handler
(exception_data=0xc1833fc980) at
C:/M/B/src/mingw-w64/mingw-w64-crt/crt/crt_handler.c:213
#5  0x00007ffbdfa71acf in ucrtbase!__C_specific_handler () from
C:\WINDOWS\System32\ucrtbase.dll
#6  0x00007ffbe22e353f in ntdll!.chkstk () from C:\WINDOWS\SYSTEM32\ntdll.dll
#7  0x00007ffbe219f358 in ntdll!RtlWow64GetCurrentCpuArea () from
C:\WINDOWS\SYSTEM32\ntdll.dll
#8  0x00007ffbe22e2e7e in ntdll!KiUserExceptionDispatcher () from
C:\WINDOWS\SYSTEM32\ntdll.dll
#9  0x00007ffb429c1740 in ?? ()
#10 0x00007ff684e33126 in emacs_gnutls_pull (p=0x22600d1c170,
buf=<optimized out>, sz=<optimized out>) at
D:/a/emacs-build/emacs-build/git/a28ba6c/src/gnutls.c:741
#11 emacs_gnutls_pull (p=0x22600d1c170, buf=<optimized out>,
sz=<optimized out>) at
D:/a/emacs-build/emacs-build/git/a28ba6c/src/w32.c:11214
#12 0x00007ffb4297d64c in ?? ()
#13 0x0000000000000000 in ?? ()

[1] https://github.com/kiennq/emacs-build/releases/tag/v31.306.20240823.a28ba6c

---
Kien



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-23 13:08                                                                         ` Eli Zaretskii
  2024-08-23 13:42                                                                           ` Quang Kien Nguyen
@ 2024-08-23 13:44                                                                           ` Pip Cet
  2024-08-23 14:32                                                                             ` Eli Zaretskii
  1 sibling, 1 reply; 119+ messages in thread
From: Pip Cet @ 2024-08-23 13:44 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: sebastian, kien.n.quang, emacs-devel, yantar92

"Eli Zaretskii" <eliz@gnu.org> writes:

>> Date: Fri, 23 Aug 2024 07:59:13 +0000
>> From: Pip Cet <pipcet@protonmail.com>
>> Cc: sebastian@sebasmonia.com, kien.n.quang@gmail.com, emacs-devel@gnu.org, yantar92@posteo.net
>>
>> >> That hands a pointer to 'proc' to gnutls, and if 'proc' subsequently
>> >> moves, emacs_gnutls_push or emacs_gnutls_pull will try to dereference a
>> >> stale pointer.
>> >
>> > But the pointer to 'proc' is passed to GnuTLS for the sole purpose
>> > that GnuTLS passes it back to our callback, emacs_gnutls_pull.  GnuTLS
>> > itself does not (and cannot) use that pointer, for the obvious reasons
>> > that it knows nothing about our objects.
>>
>> That is my understanding as well.  I'm not sure why you think that's a
>> "but", though.
>
> Because you seemed to say we were passing the object to GnuTLS for its
> own use.

Sorry about that. The problem isn't who uses the pointer, it's who
stores it (gnutls, in memory unknown to MPS) until it's finally used (by
Emacs).

>> A pointer to memory managed in a copying pool, stored outside of
>> MPS-managed memory, as 'proc' presumably is (in malloc()ed memory, I
>> would guess, or maybe in a static location somewhere), must be pinned
>> somehow, so MPS does not move it during GC.
>
> Then let's pin it.

Okay.

> But my bother is that we will need to similarly pin many other
> pointers and objects, or risk segfaults.

Indeed.  There are quite a few changes along the same lines in the
scratch/igc branch, and it makes me think we need a slightly more
general infrastructure to turn a pointer (or Lisp_Object) known to Emacs
into a void * suitable for passing as a cookie to an external library,
and then for turning the cookie passed to a callback by that external
library back into a pointer (or Lisp_Object) the callback (in Emacs) can
use.

> Maybe it means that MPS and similar igc systems are not suitable for
> Emacs.

I believe said infrastructure would be generally useful, because it
allows us to catch another class of subtle bugs that may appear without
MPS: passing a pointer to an external library which is freed by our
traditional GC, which would cause very similar segfaults (if anything,
much trickier to debug) without MPS.

IOW, it's always worth our time to think about why something we pass as
a cookie to an external callback cannot be garbage-collected and/or
copied, regardless of which garbage collector is in use.  The price we'd
pay is to require such cookies to be explicitly deregistered, but we'd
gain a very useful feature (maybe for --enable-checking, maybe enabled
by default): a clear and loud warning informing us that a cookie is
still registered for an object we just tried to GC.

So I think this could improve Emacs in general, even for people who will
never use MPS.

>> > And what do you mean by "asynchronous calls"?  For example, you can
>> > see in w32font.c that we call certain Windows APIs which work by
>> > enumerating objects of some kind and calling our callback for each
>> > such object (the callback that does with each object what it needs to
>> > do).  Is this an "asynchronous call"?  If not, what is?
>>
>> It doesn't look asynchronous to me, though I'm not sure we're talking
>> about the same code.  The LPARAM arguments referring to stack locations
>> are fine, because the stack is known to MPS.
>
> I mean this:
>
>       EnumFontFamiliesEx (dc, &match_data->pattern,
>                           (FONTENUMPROC) add_font_entity_to_list,
>                           (LPARAM) match_data, 0);
>
> where add_font_entity_to_list is our callback which is called for
> every font family and decides whether it matches the font spec; if so,
> the callback adds the family to a list that is then used by the caller
> of EnumFontFamiliesEx.

This particular call is safe.  'match_data' lives on the stack, MPS
treats the stack conservatively as pinning every object to which it
might possibly refer, thus 'match_data->pattern' cannot be moved.

>> The problem here is that 'proc' might move.  One solution is to make the
>> cookie a pointer to memory known to MPS, which contains the actual
>> pointer to the Lisp_Process.  Note that it is not strictly necessary for
>> the pointer to be allocated with igc_xzalloc_ambig, we could use the
>> _raw_exact variant.
>
> Why not tell MPS not to move this pointer instead?  It sounds like a
> simpler solution than the change you proposed.

The change I proposed is redundant: it tells MPS not to move the
pointer, and it uses a pointer-to-a-pointer to catch potential moves.
Only one part of that is needed, but in both cases, we need to remember
to un-pin/free something.

> The solution you propose will complicate large parts of the Emacs code
> by using double indirection;

Indeed, which is why I'm seriously proposing that cookies for use by
external libraries be generated via an opaque API that has different
implementations:

1. for standard Emacs, where it just returns the pointer
2. for MPS, where it returns a pointer to the pointer
3. for debug builds, where it registers the object so we warn if we try
to GC it, then returns the pointer.

> pinning a pointer is much simpler.  Or am I missing something?

Pinning it certainly is, remembering to un-pin it when we're done with
it is the hard part.  And also something we should always do, since
forgetting to unpin it would result in memory leaks and slower GCs for
the lifetime of the Emacs session.

>> There are other solutions which may be better.
>
> I certainly hope so, since auditing all of our sources for such
> gotchas is an impossible job.

I think I disagree that it's impossible.  We've already caught many of
them (the PGTK and Lucid toolkit fixes were essentially the same
problem), and auditing our usage of such callbacks is necessary anyway
because traditional GC might free (but not move) pointers prematurely,
resulting in subtle bugs which might not be caught for years.

I think working on this issue is worth our time and has the potential to
improve Emacs generally, independently of the MPS branch.

The price we'd pay is that we would be forced to make explicit the point
at which an external library stops using our cookie/opaque
pointer/LPARAM/whatever you want to call it; put differently, it would
force us to think about that question at all, while right now it's
possible just to hope the Emacs object will live for long enough.

I believe the cookies are generally of one of the following types:

- void *
- gpointer
- LPARAM
- WPARAM?

And grepping for these returns a manageable but large set of hits (1865,
most of which are trivial).

Pip




^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-23 13:42                                                                           ` Quang Kien Nguyen
@ 2024-08-23 13:48                                                                             ` Pip Cet
  2024-08-23 14:35                                                                               ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Pip Cet @ 2024-08-23 13:48 UTC (permalink / raw)
  To: Quang Kien Nguyen; +Cc: Eli Zaretskii, sebastian, emacs-devel, yantar92

"Quang Kien Nguyen" <kien.n.quang@gmail.com> writes:

> I've built a new version with debug info here[1].

Thank you, I've just tested that in winedbg --gdb and it produces very
usable backtraces!

> And here is the backtrace in gdb on crash
>
> (gdb) bt
> #0  0x00007ffbdf732b83 in KERNELBASE!DebugBreak () from
> C:\WINDOWS\System32\KernelBase.dll
> #1  0x00007ff684e0fc2a in emacs_abort () at
> D:/a/emacs-build/emacs-build/git/a28ba6c/src/w32fns.c:11369
> #2  0x00007ff684cbe687 in terminate_due_to_signal (sig=11,
> backtrace_limit=40) at
> D:/a/emacs-build/emacs-build/git/a28ba6c/src/emacs.c:470
> #3  0x00007ff684cdd959 in deliver_fatal_thread_signal.lto_priv.0
> (sig=11) at D:/a/emacs-build/emacs-build/git/a28ba6c/src/sysdep.c:1800
> #4  0x00007ff684f015e2 in _gnu_exception_handler
> (exception_data=0xc1833fc980) at
> C:/M/B/src/mingw-w64/mingw-w64-crt/crt/crt_handler.c:213
> #5  0x00007ffbdfa71acf in ucrtbase!__C_specific_handler () from
> C:\WINDOWS\System32\ucrtbase.dll
> #6  0x00007ffbe22e353f in ntdll!.chkstk () from C:\WINDOWS\SYSTEM32\ntdll.dll
> #7  0x00007ffbe219f358 in ntdll!RtlWow64GetCurrentCpuArea () from
> C:\WINDOWS\SYSTEM32\ntdll.dll
> #8  0x00007ffbe22e2e7e in ntdll!KiUserExceptionDispatcher () from
> C:\WINDOWS\SYSTEM32\ntdll.dll
> #9  0x00007ffb429c1740 in ?? ()
> #10 0x00007ff684e33126 in emacs_gnutls_pull (p=0x22600d1c170,
> buf=<optimized out>, sz=<optimized out>) at
> D:/a/emacs-build/emacs-build/git/a28ba6c/src/gnutls.c:741
> #11 emacs_gnutls_pull (p=0x22600d1c170, buf=<optimized out>,
> sz=<optimized out>) at
> D:/a/emacs-build/emacs-build/git/a28ba6c/src/w32.c:11214
> #12 0x00007ffb4297d64c in ?? ()
> #13 0x0000000000000000 in ?? ()

How hard is it for Microsoft Windows users to navigate up to #10 and
print the value of (struct Lisp_Process *)p?  Do those gdb commands
"just work" in gdb.exe? Here I get obviously corrupt data, which
indicates to me that the bug is likely to be as I've described.

Pip




^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-23 13:44                                                                           ` Pip Cet
@ 2024-08-23 14:32                                                                             ` Eli Zaretskii
  2024-08-23 15:51                                                                               ` Pip Cet
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-23 14:32 UTC (permalink / raw)
  To: Pip Cet; +Cc: sebastian, kien.n.quang, emacs-devel, yantar92

> Date: Fri, 23 Aug 2024 13:44:04 +0000
> From: Pip Cet <pipcet@protonmail.com>
> Cc: sebastian@sebasmonia.com, kien.n.quang@gmail.com, emacs-devel@gnu.org, yantar92@posteo.net
> 
> > But my bother is that we will need to similarly pin many other
> > pointers and objects, or risk segfaults.
> 
> Indeed.  There are quite a few changes along the same lines in the
> scratch/igc branch, and it makes me think we need a slightly more
> general infrastructure to turn a pointer (or Lisp_Object) known to Emacs
> into a void * suitable for passing as a cookie to an external library,
> and then for turning the cookie passed to a callback by that external
> library back into a pointer (or Lisp_Object) the callback (in Emacs) can
> use.
> 
> > Maybe it means that MPS and similar igc systems are not suitable for
> > Emacs.
> 
> I believe said infrastructure would be generally useful, because it
> allows us to catch another class of subtle bugs that may appear without
> MPS: passing a pointer to an external library which is freed by our
> traditional GC, which would cause very similar segfaults (if anything,
> much trickier to debug) without MPS.
> 
> IOW, it's always worth our time to think about why something we pass as
> a cookie to an external callback cannot be garbage-collected and/or
> copied, regardless of which garbage collector is in use.  The price we'd
> pay is to require such cookies to be explicitly deregistered, but we'd
> gain a very useful feature (maybe for --enable-checking, maybe enabled
> by default): a clear and loud warning informing us that a cookie is
> still registered for an object we just tried to GC.
> 
> So I think this could improve Emacs in general, even for people who will
> never use MPS.

We are not coding Emacs from scratch.  Emacs is already a very large
body of code, most of it tested by time and gobs of users and use
patterns.  To start rewriting too much of that means we are losing all
that hard-earned stability, because many corners in Emacs code are not
well known to those who are currently active in development and
maintenance.

So from where I stand, it is definitely a significant problem to make
such vast changes, and the fact that it will help us eventually
doesn't help.  Because if we destabilize Emacs enough, we will lose
our users, which are the only reason Emacs is still alive and kicking.

> >       EnumFontFamiliesEx (dc, &match_data->pattern,
> >                           (FONTENUMPROC) add_font_entity_to_list,
> >                           (LPARAM) match_data, 0);
> >
> > where add_font_entity_to_list is our callback which is called for
> > every font family and decides whether it matches the font spec; if so,
> > the callback adds the family to a list that is then used by the caller
> > of EnumFontFamiliesEx.
> 
> This particular call is safe.  'match_data' lives on the stack, MPS
> treats the stack conservatively as pinning every object to which it
> might possibly refer, thus 'match_data->pattern' cannot be moved.

IOW, we are lucky.  Because match_data could well be a global variable
allocated off the heap, or something else.

> >> The problem here is that 'proc' might move.  One solution is to make the
> >> cookie a pointer to memory known to MPS, which contains the actual
> >> pointer to the Lisp_Process.  Note that it is not strictly necessary for
> >> the pointer to be allocated with igc_xzalloc_ambig, we could use the
> >> _raw_exact variant.
> >
> > Why not tell MPS not to move this pointer instead?  It sounds like a
> > simpler solution than the change you proposed.
> 
> The change I proposed is redundant: it tells MPS not to move the
> pointer, and it uses a pointer-to-a-pointer to catch potential moves.
> Only one part of that is needed, but in both cases, we need to remember
> to un-pin/free something.

If the change is redundant, why did you propose it?

More importantly, we need to have boilerplate code to pin a pointer,
because this will be needed a lot.  The fact that we still don't have
it is unfortunate.

> > The solution you propose will complicate large parts of the Emacs code
> > by using double indirection;
> 
> Indeed, which is why I'm seriously proposing that cookies for use by
> external libraries be generated via an opaque API that has different
> implementations:
> 
> 1. for standard Emacs, where it just returns the pointer
> 2. for MPS, where it returns a pointer to the pointer
> 3. for debug builds, where it registers the object so we warn if we try
> to GC it, then returns the pointer.
> 
> > pinning a pointer is much simpler.  Or am I missing something?
> 
> Pinning it certainly is, remembering to un-pin it when we're done with
> it is the hard part.

Then we need to figure that out, IMO.

> And also something we should always do, since
> forgetting to unpin it would result in memory leaks and slower GCs for
> the lifetime of the Emacs session.

If unpinning is automatic, it won't be forgotten.

> >> There are other solutions which may be better.
> >
> > I certainly hope so, since auditing all of our sources for such
> > gotchas is an impossible job.
> 
> I think I disagree that it's impossible.  We've already caught many of
> them

I think we have many, many more.

> and auditing our usage of such callbacks is necessary anyway
> because traditional GC might free (but not move) pointers prematurely,
> resulting in subtle bugs which might not be caught for years.

With stack marking, I think those bugs are largely a myth, as is
proven by decades of use.  I didn't have a production Emacs crash on
me for the last 20 years at least.

> I believe the cookies are generally of one of the following types:
> 
> - void *
> - gpointer
> - LPARAM
> - WPARAM?

Why do you think this is all the list?



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-23 13:48                                                                             ` Pip Cet
@ 2024-08-23 14:35                                                                               ` Eli Zaretskii
  2024-08-23 14:54                                                                                 ` Quang Kien Nguyen
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-23 14:35 UTC (permalink / raw)
  To: Pip Cet; +Cc: kien.n.quang, sebastian, emacs-devel, yantar92

> Date: Fri, 23 Aug 2024 13:48:41 +0000
> From: Pip Cet <pipcet@protonmail.com>
> Cc: Eli Zaretskii <eliz@gnu.org>, sebastian@sebasmonia.com, emacs-devel@gnu.org, yantar92@posteo.net
> 
> How hard is it for Microsoft Windows users to navigate up to #10 and
> print the value of (struct Lisp_Process *)p?  Do those gdb commands
> "just work" in gdb.exe?

Yes, they do.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-23 14:35                                                                               ` Eli Zaretskii
@ 2024-08-23 14:54                                                                                 ` Quang Kien Nguyen
  2024-08-23 16:08                                                                                   ` Eli Zaretskii
  2024-08-23 18:23                                                                                   ` Sebastián Monía
  0 siblings, 2 replies; 119+ messages in thread
From: Quang Kien Nguyen @ 2024-08-23 14:54 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Pip Cet, sebastian, emacs-devel, yantar92

> How hard is it for Microsoft Windows users to navigate up to #10 and
> print the value of (struct Lisp_Process *)p?  Do those gdb commands
> "just work" in gdb.exe?

I think the gdb commands should work in Windows as normal.
However after attaching to Emacs, it becomes unbearably slow to type
any commands
there.  Each keystroke takes around 1s to type and it slows down the
whole Windows
instead of just Emacs.  Is that a known issue and is there a
work-around for that.

In comparison, the same issue doesn't happen with Admin mode Windbg, I can type
normal everywhere else.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-23 14:32                                                                             ` Eli Zaretskii
@ 2024-08-23 15:51                                                                               ` Pip Cet
  2024-08-23 16:17                                                                                 ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Pip Cet @ 2024-08-23 15:51 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: sebastian, kien.n.quang, emacs-devel, yantar92

"Eli Zaretskii" <eliz@gnu.org> writes:

>> Date: Fri, 23 Aug 2024 13:44:04 +0000
>> From: Pip Cet <pipcet@protonmail.com>
>> Cc: sebastian@sebasmonia.com, kien.n.quang@gmail.com, emacs-devel@gnu.org, yantar92@posteo.net
>>
>> > But my bother is that we will need to similarly pin many other
>> > pointers and objects, or risk segfaults.
>>
>> Indeed.  There are quite a few changes along the same lines in the
>> scratch/igc branch, and it makes me think we need a slightly more
>> general infrastructure to turn a pointer (or Lisp_Object) known to Emacs
>> into a void * suitable for passing as a cookie to an external library,
>> and then for turning the cookie passed to a callback by that external
>> library back into a pointer (or Lisp_Object) the callback (in Emacs) can
>> use.
>>
>> > Maybe it means that MPS and similar igc systems are not suitable for
>> > Emacs.
>>
>> I believe said infrastructure would be generally useful, because it
>> allows us to catch another class of subtle bugs that may appear without
>> MPS: passing a pointer to an external library which is freed by our
>> traditional GC, which would cause very similar segfaults (if anything,
>> much trickier to debug) without MPS.
>>
>> IOW, it's always worth our time to think about why something we pass as
>> a cookie to an external callback cannot be garbage-collected and/or
>> copied, regardless of which garbage collector is in use.  The price we'd
>> pay is to require such cookies to be explicitly deregistered, but we'd
>> gain a very useful feature (maybe for --enable-checking, maybe enabled
>> by default): a clear and loud warning informing us that a cookie is
>> still registered for an object we just tried to GC.
>>
>> So I think this could improve Emacs in general, even for people who will
>> never use MPS.
>
> We are not coding Emacs from scratch.  Emacs is already a very large
> body of code, most of it tested by time and gobs of users and use
> patterns.  To start rewriting too much of that means we are losing all
> that hard-earned stability, because many corners in Emacs code are not
> well known to those who are currently active in development and
> maintenance.
>
> So from where I stand, it is definitely a significant problem to make
> such vast changes, and the fact that it will help us eventually
> doesn't help.  Because if we destabilize Emacs enough, we will lose
> our users, which are the only reason Emacs is still alive and kicking.

I don't see how we'd destabilize the existing Emacs code by making such
changes; any unconverted code would continue working as it did before
without MPS, and continue not working with MPS.

If your point is that it might be a long time until MPS is stable enough
for very unusual configurations, that is certainly true, and affects
when it's a good idea to enable it for general use.

>> >       EnumFontFamiliesEx (dc, &match_data->pattern,
>> >                           (FONTENUMPROC) add_font_entity_to_list,
>> >                           (LPARAM) match_data, 0);
>> >
>> > where add_font_entity_to_list is our callback which is called for
>> > every font family and decides whether it matches the font spec; if so,
>> > the callback adds the family to a list that is then used by the caller
>> > of EnumFontFamiliesEx.
>>
>> This particular call is safe.  'match_data' lives on the stack, MPS
>> treats the stack conservatively as pinning every object to which it
>> might possibly refer, thus 'match_data->pattern' cannot be moved.
>
> IOW, we are lucky.  Because match_data could well be a global variable
> allocated off the heap, or something else.

Which would be a bug both with and without MPS, as nothing protects
match_data.list from GC if it doesn't live on the stack.

>> >> The problem here is that 'proc' might move.  One solution is to make the
>> >> cookie a pointer to memory known to MPS, which contains the actual
>> >> pointer to the Lisp_Process.  Note that it is not strictly necessary for
>> >> the pointer to be allocated with igc_xzalloc_ambig, we could use the
>> >> _raw_exact variant.
>> >
>> > Why not tell MPS not to move this pointer instead?  It sounds like a
>> > simpler solution than the change you proposed.
>>
>> The change I proposed is redundant: it tells MPS not to move the
>> pointer, and it uses a pointer-to-a-pointer to catch potential moves.
>> Only one part of that is needed, but in both cases, we need to remember
>> to un-pin/free something.
>
> If the change is redundant, why did you propose it?

Better to solve a problem twice than not to solve it at all?  I don't
see a problem there, to be honest.

(It's morally equivalent to writing

  if (p)
    xfree (p);

even though that's redundant as well.)

> More importantly, we need to have boilerplate code to pin a pointer,
> because this will be needed a lot.  The fact that we still don't have
> it is unfortunate.

I think it's better to have boilerplate code to turn a (potentially
MPS-managed) pointer into a cookie, and back, and deregister it.  Of
course it's undesirable for pointers to be unnecessarily pinned, so it's
likely we'd end up merely registering a pointer to the pointer with MPS,
and making sure that is traced exactly rather than ambiguously so the
object pointed to can move.

>> > pinning a pointer is much simpler.  Or am I missing something?

I should have been clearer: if we remember to un-pin the pointer, it's
no longer any simpler to pin it than it is just to use a pointer to a
pointer, and the latter approach lets us know about memory leaks and is
better from a GC point of view.

>> Pinning it certainly is, remembering to un-pin it when we're done with
>> it is the hard part.
>
> Then we need to figure that out, IMO.

That requires knowledge of the library in question, AFAICT.  To be
honest, I'm not entirely sure I trust the GTK code to get it right.

>> And also something we should always do, since
>> forgetting to unpin it would result in memory leaks and slower GCs for
>> the lifetime of the Emacs session.
>
> If unpinning is automatic, it won't be forgotten.

But that requires knowing when the library stops using the cookie, which
is all but impossible. right?

>> >> There are other solutions which may be better.
>> >
>> > I certainly hope so, since auditing all of our sources for such
>> > gotchas is an impossible job.
>>
>> I think I disagree that it's impossible.  We've already caught many of
>> them
>
> I think we have many, many more.

We may have to clear the object files one by one, then, and warn about
unaudited object files in MPS builds.

>> and auditing our usage of such callbacks is necessary anyway
>> because traditional GC might free (but not move) pointers prematurely,
>> resulting in subtle bugs which might not be caught for years.
>
> With stack marking, I think those bugs are largely a myth, as is
> proven by decades of use.  I didn't have a production Emacs crash on
> me for the last 20 years at least.

I'm not sure what you're trying to get at here. Stack marking, of
course, has the same protective effect with and without MPS, since MPS
marks the stack conservatively.

>> I believe the cookies are generally of one of the following types:
>>
>> - void *
>> - gpointer
>> - LPARAM
>> - WPARAM?
>
> Why do you think this is all the list?

I don't, why do you think I think that?

Pip




^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-23 14:54                                                                                 ` Quang Kien Nguyen
@ 2024-08-23 16:08                                                                                   ` Eli Zaretskii
  2024-08-23 18:23                                                                                   ` Sebastián Monía
  1 sibling, 0 replies; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-23 16:08 UTC (permalink / raw)
  To: Quang Kien Nguyen; +Cc: pipcet, sebastian, emacs-devel, yantar92

> From: Quang Kien Nguyen <kien.n.quang@gmail.com>
> Date: Fri, 23 Aug 2024 07:54:46 -0700
> Cc: Pip Cet <pipcet@protonmail.com>, sebastian@sebasmonia.com, emacs-devel@gnu.org, 
> 	yantar92@posteo.net
> 
> > How hard is it for Microsoft Windows users to navigate up to #10 and
> > print the value of (struct Lisp_Process *)p?  Do those gdb commands
> > "just work" in gdb.exe?
> 
> I think the gdb commands should work in Windows as normal.  However
> after attaching to Emacs, it becomes unbearably slow to type any
> commands there.  Each keystroke takes around 1s to type and it slows
> down the whole Windows instead of just Emacs.  Is that a known issue
> and is there a work-around for that.

Yes: the workaround is to start Emacs from GDB.  When you do that,
Emacs does not install a low-level keyboard hook that it normally
does, and which is the reason for the slow responses to keys if you
attach GDB to Emacs after it already started.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-23 15:51                                                                               ` Pip Cet
@ 2024-08-23 16:17                                                                                 ` Eli Zaretskii
  2024-08-23 18:57                                                                                   ` Pip Cet
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-23 16:17 UTC (permalink / raw)
  To: Pip Cet; +Cc: sebastian, kien.n.quang, emacs-devel, yantar92

> Date: Fri, 23 Aug 2024 15:51:41 +0000
> From: Pip Cet <pipcet@protonmail.com>
> Cc: sebastian@sebasmonia.com, kien.n.quang@gmail.com, emacs-devel@gnu.org, yantar92@posteo.net
> 
> "Eli Zaretskii" <eliz@gnu.org> writes:
> 
> >> So I think this could improve Emacs in general, even for people who will
> >> never use MPS.
> >
> > We are not coding Emacs from scratch.  Emacs is already a very large
> > body of code, most of it tested by time and gobs of users and use
> > patterns.  To start rewriting too much of that means we are losing all
> > that hard-earned stability, because many corners in Emacs code are not
> > well known to those who are currently active in development and
> > maintenance.
> >
> > So from where I stand, it is definitely a significant problem to make
> > such vast changes, and the fact that it will help us eventually
> > doesn't help.  Because if we destabilize Emacs enough, we will lose
> > our users, which are the only reason Emacs is still alive and kicking.
> 
> I don't see how we'd destabilize the existing Emacs code by making such
> changes; any unconverted code would continue working as it did before
> without MPS, and continue not working with MPS.

I'm talking about the code changes, not about what stays unchanged.

And if you don't understand how adding a lot of changes of this
particular kind can destabilize Emacs, then I guess we have very
different perspectives on stability, and this line of discussion
between us is not useful.

> If your point is that it might be a long time until MPS is stable enough
> for very unusual configurations, that is certainly true, and affects
> when it's a good idea to enable it for general use.

Not "for very unusual configurations", for all configurations,
including the most popular ones.  We are touching the most delicate
parts of Emacs, and will probably touch a lot of them (unless we find
some simpler, more reliable way of preventing these problems).

> >> This particular call is safe.  'match_data' lives on the stack, MPS
> >> treats the stack conservatively as pinning every object to which it
> >> might possibly refer, thus 'match_data->pattern' cannot be moved.
> >
> > IOW, we are lucky.  Because match_data could well be a global variable
> > allocated off the heap, or something else.
> 
> Which would be a bug both with and without MPS, as nothing protects
> match_data.list from GC if it doesn't live on the stack.

??? We have gobs of those, and know how to protect them.  The easiest
way is staticpro, and there are others.

> >> The change I proposed is redundant: it tells MPS not to move the
> >> pointer, and it uses a pointer-to-a-pointer to catch potential moves.
> >> Only one part of that is needed, but in both cases, we need to remember
> >> to un-pin/free something.
> >
> > If the change is redundant, why did you propose it?
> 
> Better to solve a problem twice than not to solve it at all?

Not in my book, no.  Since Emacs is stable, we should not add any code
that is not strictly necessary, otherwise we risk unnecessary
problems.

> I don't see a problem there, to be honest.
> 
> (It's morally equivalent to writing
> 
>   if (p)
>     xfree (p);
> 
> even though that's redundant as well.)

It's nowhere morally equivalent to the above, because it is much
harder to understand what goes on with MPS than to figure out that
xfree tests NULL internally.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-23 14:54                                                                                 ` Quang Kien Nguyen
  2024-08-23 16:08                                                                                   ` Eli Zaretskii
@ 2024-08-23 18:23                                                                                   ` Sebastián Monía
  1 sibling, 0 replies; 119+ messages in thread
From: Sebastián Monía @ 2024-08-23 18:23 UTC (permalink / raw)
  To: Quang Kien Nguyen; +Cc: Eli Zaretskii, Pip Cet, emacs-devel, yantar92

Quang Kien Nguyen <kien.n.quang@gmail.com> writes:

>> How hard is it for Microsoft Windows users to navigate up to #10 and
>> print the value of (struct Lisp_Process *)p?  Do those gdb commands
>> "just work" in gdb.exe?
>
> I think the gdb commands should work in Windows as normal.
> However after attaching to Emacs, it becomes unbearably slow to type
> any commands
> there.  Each keystroke takes around 1s to type and it slows down the
> whole Windows
> instead of just Emacs.  Is that a known issue and is there a
> work-around for that.
>
> In comparison, the same issue doesn't happen with Admin mode Windbg, I can type
> normal everywhere else.

That is interesting, when I run Emacs with gbd attached, it is slower
but not nearly as much as you described. I forced several situations
(LSP with eglot, EWW, opening different modes, Gnus, etc) and I can tell
communication with other processes suffers a lot. But everything else
kinda works the same?


-- 
Sebastián Monía
https://site.sebasmonia.com/



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-23 16:17                                                                                 ` Eli Zaretskii
@ 2024-08-23 18:57                                                                                   ` Pip Cet
  2024-08-23 19:28                                                                                     ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Pip Cet @ 2024-08-23 18:57 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: sebastian, kien.n.quang, emacs-devel, yantar92

"Eli Zaretskii" <eliz@gnu.org> writes:

>> If your point is that it might be a long time until MPS is stable enough
>> for very unusual configurations, that is certainly true, and affects
>> when it's a good idea to enable it for general use.
>
> Not "for very unusual configurations", for all configurations,
> including the most popular ones.

Which ones do you mean?

> We are touching the most delicate
> parts of Emacs, and will probably touch a lot of them (unless we find
> some simpler, more reliable way of preventing these problems).

Simpler, maybe, but reliability, I will keep insisting, improves if we
think about why it's safe to hand off a pointer to GCable memory to an
externable library.

>> >> This particular call is safe.  'match_data' lives on the stack, MPS
>> >> treats the stack conservatively as pinning every object to which it
>> >> might possibly refer, thus 'match_data->pattern' cannot be moved.
>> >
>> > IOW, we are lucky.  Because match_data could well be a global variable
>> > allocated off the heap, or something else.
>>
>> Which would be a bug both with and without MPS, as nothing protects
>> match_data.list from GC if it doesn't live on the stack.
>
> ??? We have gobs of those, and know how to protect them.  The easiest
> way is staticpro, and there are others.

My point is you'd have to protect it, albeit slightly differently, with
or without MPS.  Not that much changes with MPS, and to say it works
because "we are lucky" is inaccurate.

>> >> The change I proposed is redundant: it tells MPS not to move the
>> >> pointer, and it uses a pointer-to-a-pointer to catch potential moves.
>> >> Only one part of that is needed, but in both cases, we need to remember
>> >> to un-pin/free something.
>> >
>> > If the change is redundant, why did you propose it?
>>
>> Better to solve a problem twice than not to solve it at all?
>
> Not in my book, no.  Since Emacs is stable, we should not add any code
> that is not strictly necessary, otherwise we risk unnecessary
> problems.

The master branch may be, but there's nothing wrong with keeping our
options open on scratch/igc rather than leaving in a few "redundant"
safety checks.

I agree, though, that a comment is in order here.

Pip




^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-23 18:57                                                                                   ` Pip Cet
@ 2024-08-23 19:28                                                                                     ` Eli Zaretskii
  0 siblings, 0 replies; 119+ messages in thread
From: Eli Zaretskii @ 2024-08-23 19:28 UTC (permalink / raw)
  To: Pip Cet; +Cc: sebastian, kien.n.quang, emacs-devel, yantar92

> Date: Fri, 23 Aug 2024 18:57:12 +0000
> From: Pip Cet <pipcet@protonmail.com>
> Cc: sebastian@sebasmonia.com, kien.n.quang@gmail.com, emacs-devel@gnu.org, yantar92@posteo.net
> 
> "Eli Zaretskii" <eliz@gnu.org> writes:
> 
> >> If your point is that it might be a long time until MPS is stable enough
> >> for very unusual configurations, that is certainly true, and affects
> >> when it's a good idea to enable it for general use.
> >
> > Not "for very unusual configurations", for all configurations,
> > including the most popular ones.
> 
> Which ones do you mean?

All of them.  I'm quite sure we have a lot of corners the few people
who are using the branch have not entered yet, especially as some bugs
don't happen until GC hits at just the right (or wrong) moment.  Like
this GnuTLS crash, for example.

> > We are touching the most delicate
> > parts of Emacs, and will probably touch a lot of them (unless we find
> > some simpler, more reliable way of preventing these problems).
> 
> Simpler, maybe, but reliability, I will keep insisting, improves if we
> think about why it's safe to hand off a pointer to GCable memory to an
> externable library.

You can insist all you want, but you will never convince me.  I have
too much gray hair from opinions based on the assumption that we
completely understand what we are doing by such changes and what they
cause in Emacs.  Just stick long enough here and you will see another
example of this fallacy almost every day.

So no, IME reliability definitely does NOT improve by futzing with
this kind of stuff.  Which means we should not do it unless we must.

> 
> >> >> This particular call is safe.  'match_data' lives on the stack, MPS
> >> >> treats the stack conservatively as pinning every object to which it
> >> >> might possibly refer, thus 'match_data->pattern' cannot be moved.
> >> >
> >> > IOW, we are lucky.  Because match_data could well be a global variable
> >> > allocated off the heap, or something else.
> >>
> >> Which would be a bug both with and without MPS, as nothing protects
> >> match_data.list from GC if it doesn't live on the stack.
> >
> > ??? We have gobs of those, and know how to protect them.  The easiest
> > way is staticpro, and there are others.
> 
> My point is you'd have to protect it, albeit slightly differently, with
> or without MPS.  Not that much changes with MPS, and to say it works
> because "we are lucky" is inaccurate.

"Not that much changes" is IMO an understatement of the decade.
Compare the simplicity of staticpro with the complicated dance you
suggested for this GnuTLS issue (which is not different from many
similar changes installed on the branch each time we detect some
similarly "unsafe" use of data structures).  One can use staticpro
without even fully understanding how it works and why.  We have
nothing comparable on the MPS branch, and thus no established
procedure for solving such problems or rules for auditing code for
similar issues.

> >> Better to solve a problem twice than not to solve it at all?
> >
> > Not in my book, no.  Since Emacs is stable, we should not add any code
> > that is not strictly necessary, otherwise we risk unnecessary
> > problems.
> 
> The master branch may be, but there's nothing wrong with keeping our
> options open on scratch/igc rather than leaving in a few "redundant"
> safety checks.

If we want this branch to ever land on master, we had better handled
it with the same care as we do on master.  Because when we decide to
land it, no one will have time or motivation to go through all this
stuff and "fix" it.  We want Emacs to be as stable the day after this
lands as the day it was before that.  That's how it was for all the
other major features that got merged from feature branches.  Any
significant drop in stability as result of the merge will be a net
loss.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-23  7:59                                                                       ` Pip Cet
  2024-08-23 13:08                                                                         ` Eli Zaretskii
@ 2024-08-24 17:31                                                                         ` Pip Cet
  2024-08-25  3:17                                                                           ` Quang Kien Nguyen
  1 sibling, 1 reply; 119+ messages in thread
From: Pip Cet @ 2024-08-24 17:31 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: sebastian, kien.n.quang, emacs-devel, yantar92

"Pip Cet" <pipcet@protonmail.com> writes:
> There are other solutions which may be better.

I've now installed this solution.  Whether the problem is indeed
insurmountable and will prevent ever merging scratch/igc to master
remains to be seen.

Pip




^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-24 17:31                                                                         ` Pip Cet
@ 2024-08-25  3:17                                                                           ` Quang Kien Nguyen
  2024-08-30 19:59                                                                             ` Sebastián Monía
  0 siblings, 1 reply; 119+ messages in thread
From: Quang Kien Nguyen @ 2024-08-25  3:17 UTC (permalink / raw)
  To: Pip Cet; +Cc: Eli Zaretskii, sebastian, emacs-devel, yantar92

> I've now installed this solution.  Whether the problem is indeed
> insurmountable and will prevent ever merging scratch/igc to master
> remains to be seen.

The new build is here[1].
Using `eww-mode` doesn't crash Emacs for me anymore. Thank you Pip.

[1] https://github.com/kiennq/emacs-build/releases/tag/v31.308.20240824.ee7bc71



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-25  3:17                                                                           ` Quang Kien Nguyen
@ 2024-08-30 19:59                                                                             ` Sebastián Monía
  2024-09-01  8:21                                                                               ` Kien Nguyen
  0 siblings, 1 reply; 119+ messages in thread
From: Sebastián Monía @ 2024-08-30 19:59 UTC (permalink / raw)
  To: Quang Kien Nguyen, Pip Cet; +Cc: Eli Zaretskii, emacs-devel, yantar92

Hi all,

I've been using the build for the last 3 days with no crashes. 
Will report back next Friday, declaring "no crashes" after just 3 days is a bit too naive, maybe :)

Thanks,
Seb

On Sat, Aug 24, 2024, at 11:17 PM, Quang Kien Nguyen wrote:
> > I've now installed this solution.  Whether the problem is indeed
> > insurmountable and will prevent ever merging scratch/igc to master
> > remains to be seen.
> 
> The new build is here[1].
> Using `eww-mode` doesn't crash Emacs for me anymore. Thank you Pip.
> 
> [1] https://github.com/kiennq/emacs-build/releases/tag/v31.308.20240824.ee7bc71
> 



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-08-30 19:59                                                                             ` Sebastián Monía
@ 2024-09-01  8:21                                                                               ` Kien Nguyen
  2024-09-01  8:43                                                                                 ` Eli Zaretskii
  2024-09-01 10:49                                                                                 ` Pip Cet
  0 siblings, 2 replies; 119+ messages in thread
From: Kien Nguyen @ 2024-09-01  8:21 UTC (permalink / raw)
  To: Sebastián Monía; +Cc: Pip Cet, Eli Zaretskii, emacs-devel, yantar92

[-- Attachment #1: Type: text/plain, Size: 550 bytes --]

Hi,
I got a new crash with mps build.
Here is the backtrace (attached).

By the way, instead of running Emacs under gdb all the time, I figured
out that I can just attach to the `emacs_abort` dialog with a small fix
to ensure the keyboard hook is released beforehand.  The patch for that
is here[1].  @Eli, do you think that's acceptable to merge?  It greatly
relieves the burden of using with debugging Emacs on Windows.

[1] https://raw.githubusercontent.com/kiennq/emacs-build/main/patches/emacs/0002-w32-emacs-abort-remove-kbdhook-on-abort.patch

[-- Attachment #2: emacs_bt.txt --]
[-- Type: text/plain, Size: 6379 bytes --]

(gdb) bt
#0  0x00007ffbdf732b83 in KERNELBASE!DebugBreak () from C:\WINDOWS\System32\KernelBase.dll
#1  0x00007ff6a625003c in emacs_abort () at D:/a/emacs-build/emacs-build/git/972842f/src/w32fns.c:11377
#2  0x00007ff6a60fe7c7 in terminate_due_to_signal (sig=22, backtrace_limit=2147483647) at D:/a/emacs-build/emacs-build/git/972842f/src/emacs.c:470
#3  0x00007ff6a622bbcc in igc_assert_fail.lto_priv.0 (file=0x7ff6a68b9f46 <gdb_make_enums_visible+522> "buffer.c", line=579, msg=0x7ff6a68ba88c <gdb_make_enums_visible+2896> "size > 0")
    at D:/a/emacs-build/emacs-build/git/972842f/src/igc.c:858
#4  0x00007ff6a6309e4c in mps_lib_assert_fail (file=0x7ff6a68b9f46 <gdb_make_enums_visible+522> "buffer.c", line=579, condition=0x7ff6a68ba88c <gdb_make_enums_visible+2896> "size > 0")
    at D:/a/emacs-build/emacs-build/git/mps/code/mpsliban.c:87
#5  BufferFill (pReturn=pReturn@entry=0xecf73ef518, buffer=buffer@entry=0x2766f596570, size=size@entry=0) at D:/a/emacs-build/emacs-build/git/mps/code/buffer.c:579
#6  0x00007ff6a633a568 in amcSegFix (seg=0x2766f7457e0, ss=0xecf73ef880, refIO=0xecf73ef590) at D:/a/emacs-build/emacs-build/git/mps/code/poolamc.c:1633
#7  0x00007ff6a62d922f in _mps_fix2 (mps_ss=0xecf73ef888, mps_ref_io=0xecf73ef5e8) at D:/a/emacs-build/emacs-build/git/mps/code/trace.c:1433
#8  0x00007ff6a6224795 in fix_lisp_obj.lto_priv.0 (ss=0xecf73ef888, pobj=0x27678ab8c08) at D:/a/emacs-build/emacs-build/git/972842f/src/igc.c:975
#9  0x00007ff6a6224c58 in fix_vectorlike (ss=0xecf73ef888, v=<optimized out>) at D:/a/emacs-build/emacs-build/git/972842f/src/igc.c:1233
#10 0x00007ff6a6228a10 in dflt_scanx (ss=ss@entry=0xecf73ef888, base_start=<optimized out>, base_limit=<optimized out>, closure=<optimized out>, closure@entry=0x0) at D:/a/emacs-build/emacs-build/git/972842f/src/igc.c:2614
#11 0x00007ff6a62294b5 in dflt_scan (ss=0xecf73ef888, base_start=<optimized out>, base_limit=<optimized out>) at D:/a/emacs-build/emacs-build/git/972842f/src/igc.c:1962
#12 0x00007ff6a630aef3 in TraceScanFormat (ss=0xecf73ef880, base=0x27678ab8000, limit=0x27678ab9298) at D:/a/emacs-build/emacs-build/git/mps/code/trace.c:1539
#13 amcSegScan (totalReturn=0xecf73ef87c, seg=0x2766ff48eb0, ss=0xecf73ef880) at D:/a/emacs-build/emacs-build/git/mps/code/poolamc.c:1427
#14 0x00007ff6a633725e in traceScanSegRes (ts=ts@entry=1, rank=rank@entry=1, arena=arena@entry=0x2766cd30000, seg=seg@entry=0x2766ff48eb0) at D:/a/emacs-build/emacs-build/git/mps/code/trace.c:1205
#15 0x00007ff6a6337417 in traceScanSeg (ts=1, rank=1, arena=0x2766cd30000, seg=0x2766ff48eb0) at D:/a/emacs-build/emacs-build/git/mps/code/trace.c:1267
#16 0x00007ff6a6337d3e in TraceAdvance (trace=trace@entry=0x2766cd30a78) at D:/a/emacs-build/emacs-build/git/mps/code/trace.c:1728
#17 0x00007ff6a633e96d in TracePoll (workReturn=workReturn@entry=0xecf73efab8, collectWorldReturn=collectWorldReturn@entry=0xecf73efab4, globals=globals@entry=0x2766cd30008, collectWorldAllowed=<optimized out>)
    at D:/a/emacs-build/emacs-build/git/mps/code/trace.c:1849
#18 0x00007ff6a633eb93 in ArenaPoll (globals=globals@entry=0x2766cd30008) at D:/a/emacs-build/emacs-build/git/mps/code/global.c:745
#19 0x00007ff6a633eeee in mps_ap_fill (p_o=0xecf73efbb8, mps_ap=0x2766f5978f8, size=56) at D:/a/emacs-build/emacs-build/git/mps/code/mpsi.c:1097
#20 0x00007ff6a62262b8 in alloc_impl.lto_priv.0 (size=56, type=8, ap=0x2766f5978f8) at D:/a/emacs-build/emacs-build/git/972842f/src/igc.c:3770
#21 0x00007ff6a61669c9 in Fmake_marker () at D:/a/emacs-build/emacs-build/git/972842f/src/igc.c:3798
#22 0x00007ff6a615c7e1 in Fmatch_data (integers=<optimized out>, reuse=0x0, reseat=<optimized out>) at D:/a/emacs-build/emacs-build/git/972842f/src/search.c:2919
#23 0x00007ff6a62183fe in autocmp_chars (rule=0x2768b1c615d, charpos=112508, bytepos=112510, limit=148365, win=0x2768b9e6040, face=0x276756dfa98, string=0x0, direction=0x3608, ch=47)
    at D:/a/emacs-build/emacs-build/git/972842f/src/search.c:3191
#24 0x00007ff6a621eb5a in composition_reseat_it (cmp_it=0xecf73f81d0, charpos=112508, bytepos=112510, endpos=148365, w=0x2768b9e6040, bidi_level=0 '\000', face=0x276756dfa98, string=0x0)
    at D:/a/emacs-build/emacs-build/git/972842f/src/composite.c:1353
#25 0x00007ff6a604fef6 in next_element_from_buffer (it=0xecf73f7910) at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:9800
#26 0x00007ff6a604d5a5 in get_next_display_element.lto_priv.0 (it=it@entry=0xecf73f7910) at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:8298
#27 0x00007ff6a605034c in move_it_in_display_line_to.lto_priv.0 (it=it@entry=0xecf73f7910, to_charpos=<optimized out>, to_charpos@entry=148365, to_x=<optimized out>, to_x@entry=-1, op=op@entry=8)
    at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:10099
#28 0x00007ff6a6052d17 in move_it_to (it=it@entry=0xecf73f7910, to_charpos=148365, to_x=<optimized out>, to_x@entry=-1, to_y=<optimized out>, to_vpos=<optimized out>, to_vpos@entry=-1, op=<optimized out>, op@entry=10)
    at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:10833
#29 0x00007ff6a605384c in partial_line_height (it_origin=<optimized out>) at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:11465
#30 0x00007ff6a6063b55 in try_window (window=window@entry=0x2768b9e6045, pos=..., flags=<optimized out>, flags@entry=1) at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:21292
#31 0x00007ff6a60698eb in redisplay_window (window=<optimized out>, just_this_one_p=just_this_one_p@entry=true) at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:20635
#32 0x00007ff6a606bc4a in redisplay_window_1 (window=<optimized out>) at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:18126
#33 0x00007ff6a6188187 in internal_condition_case_1 (bfun=0x7ff6a606bc10 <redisplay_window_1>, arg=0x2768b9e6045, handlers=<optimized out>, hfun=0x7ff6a605dac0 <redisplay_window_error>)
    at D:/a/emacs-build/emacs-build/git/972842f/src/eval.c:1642
#34 0x00007ff6a606243c in redisplay_internal.lto_priv.0 () at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:17614
#35 0x00007ff6a62c30d8 in redisplay_preserve_echo_area.isra.0 () at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:17845
#36 0x00007ff6a62ac504 in wait_reading_process_output.constprop.0 () at D:/a/emacs-build/emacs-build/git/972842f/src/keyboard.c:11596
#37 0x0000000000000000 in ?? ()

^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-09-01  8:21                                                                               ` Kien Nguyen
@ 2024-09-01  8:43                                                                                 ` Eli Zaretskii
  2024-09-01  9:36                                                                                   ` Kien Nguyen
  2024-09-01 10:49                                                                                 ` Pip Cet
  1 sibling, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-09-01  8:43 UTC (permalink / raw)
  To: Kien Nguyen; +Cc: sebastian, pipcet, emacs-devel, yantar92

> From: Kien Nguyen <kien.n.quang@gmail.com>
> Date: Sun, 1 Sep 2024 01:21:29 -0700
> Cc: Pip Cet <pipcet@protonmail.com>, Eli Zaretskii <eliz@gnu.org>, emacs-devel@gnu.org, 
> 	yantar92@posteo.net
> 
> By the way, instead of running Emacs under gdb all the time, I figured
> out that I can just attach to the `emacs_abort` dialog with a small fix
> to ensure the keyboard hook is released beforehand.  The patch for that
> is here[1].  @Eli, do you think that's acceptable to merge?  It greatly
> relieves the burden of using with debugging Emacs on Windows.

I'm not sure we can do this safely.  There are all kinds of caveats in
the MS documentation.  And it's only useful when Emacs aborts, not
when, e.g., it hits a breakpoint.

Why is it a pain to run Emacs under GDB at all times?  That way we
don't install the hook, and the problem doesn't happen in the first
place.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-09-01  8:43                                                                                 ` Eli Zaretskii
@ 2024-09-01  9:36                                                                                   ` Kien Nguyen
  2024-09-01 10:28                                                                                     ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Kien Nguyen @ 2024-09-01  9:36 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: sebastian, pipcet, emacs-devel, yantar92

> Why is it a pain to run Emacs under GDB at all times?  That way we
> don't install the hook, and the problem doesn't happen in the first
> place.

Because without the keyboard hook running, some of the key combinations
(Windows and Alt + ...) will be handled by Windows instead of Emacs.
That causes using Emacs for a long running time a bit unnatural as I
need to relearn or rebind the key combinations again.  Also, running
under gdb is slow and not enjoyable for using Emacs.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-09-01  9:36                                                                                   ` Kien Nguyen
@ 2024-09-01 10:28                                                                                     ` Eli Zaretskii
  2024-09-01 11:59                                                                                       ` Eli Zaretskii
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-09-01 10:28 UTC (permalink / raw)
  To: Kien Nguyen; +Cc: sebastian, pipcet, emacs-devel, yantar92

> From: Kien Nguyen <kien.n.quang@gmail.com>
> Date: Sun, 1 Sep 2024 02:36:10 -0700
> Cc: sebastian@sebasmonia.com, pipcet@protonmail.com, emacs-devel@gnu.org, 
> 	yantar92@posteo.net
> 
> > Why is it a pain to run Emacs under GDB at all times?  That way we
> > don't install the hook, and the problem doesn't happen in the first
> > place.
> 
> Because without the keyboard hook running, some of the key combinations
> (Windows and Alt + ...) will be handled by Windows instead of Emacs.

And you really need them while debugging?

> That causes using Emacs for a long running time a bit unnatural as I
> need to relearn or rebind the key combinations again.  Also, running
> under gdb is slow and not enjoyable for using Emacs.

Slow because of the hook or because of other reasons?

You should realize that attaching to Emacs when it crashes many times
misses important information, because when Emacs is not running under
the debugger, fatal exceptions go to the top-level exception handler,
which at times loses important information, like exactly which code
caused the crash.  So running an unstable Emacs build outside of GDB
is not recommended on Windows for several good reasons.

In any case, you should be able to invoke remove_w32_kbdhook from the
debugger, as soon as you attach to Emacs.  I hesitate to make the
change you proposed because emacs_abort is called not just when Emacs
is under a debugger, so the change will affect many users who don't
debug Emacs.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-09-01  8:21                                                                               ` Kien Nguyen
  2024-09-01  8:43                                                                                 ` Eli Zaretskii
@ 2024-09-01 10:49                                                                                 ` Pip Cet
  2024-09-01 12:15                                                                                   ` Kien Nguyen
  1 sibling, 1 reply; 119+ messages in thread
From: Pip Cet @ 2024-09-01 10:49 UTC (permalink / raw)
  To: Kien Nguyen
  Cc: Sebastián Monía, Eli Zaretskii, emacs-devel, yantar92

"Kien Nguyen" <kien.n.quang@gmail.com> writes:
> I got a new crash with mps build.

Thank you!

Did this happen randomly, or is it reproducible?

> Here is the backtrace (attached).

Hmm, we're going to need more information on that one.  Ideally, the
next time a crash like that happens, it would be great if you could keep
the GDB session open so we can gather more information from the crash.
Also, "bt full" is better than "bt".

What I suspect is that we failed to trace an object, probably a face
(but maybe it was an ordinary vector), during the previous GC.  I don't
see how that could have happened, yet...

Were you using non-ASCII faces at the time?

Pip




^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-09-01 10:28                                                                                     ` Eli Zaretskii
@ 2024-09-01 11:59                                                                                       ` Eli Zaretskii
  2024-09-01 18:54                                                                                         ` Kien Nguyen
  0 siblings, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-09-01 11:59 UTC (permalink / raw)
  To: kien.n.quang; +Cc: sebastian, pipcet, emacs-devel, yantar92

> Date: Sun, 01 Sep 2024 13:28:18 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> Cc: sebastian@sebasmonia.com, pipcet@protonmail.com,
>  emacs-devel@gnu.org, yantar92@posteo.net
> 
> I hesitate to make the change you proposed because emacs_abort is
> called not just when Emacs is under a debugger, so the change will
> affect many users who don't debug Emacs.

Does the alternative change below solve your problem when attaching to
Emacs?

diff --git a/src/.gdbinit b/src/.gdbinit
index 0f55cc1..885d3dc 100644
--- a/src/.gdbinit
+++ b/src/.gdbinit
@@ -1308,6 +1308,11 @@ if defined_HAVE_X_WINDOWS
   break x_error_quitter
 end
 
+if defined_WINDOWSNT
+  if kbdhook.hook_count > 0
+    call remove_w32_kbdhook()
+  end
+end
 
 # Put the Python code at the end of .gdbinit so that if GDB does not
 # support Python, GDB will do all the above initializations before
diff --git a/src/alloc.c b/src/alloc.c
index c22a5a7..3943224 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -8309,6 +8309,12 @@ syms_of_alloc (void)
 enum defined_HAVE_PGTK { defined_HAVE_PGTK = false };
 #endif
 
+#ifdef WINDOWSNT
+enum defined_WINDOWSNT { defined_WINDOWSNT = true };
+#else
+enum defined_WINDOWSNT { defined_WINDOWSNT = false };
+#endif
+
 /* When compiled with GCC, GDB might say "No enum type named
    pvec_type" if we don't have at least one symbol with that type, and
    then xbacktrace could fail.  Similarly for the other enums and
@@ -8329,6 +8335,7 @@ syms_of_alloc (void)
   enum pvec_type pvec_type;
   enum defined_HAVE_X_WINDOWS defined_HAVE_X_WINDOWS;
   enum defined_HAVE_PGTK defined_HAVE_PGTK;
+  enum defined_WINDOWSNT defined_WINDOWSNT;
 } const gdb_make_enums_visible;
 union enums_for_gdb const EXTERNALLY_VISIBLE gdb_make_enums_visible = {0};
 #endif	/* __GNUC__ */



^ permalink raw reply related	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-09-01 10:49                                                                                 ` Pip Cet
@ 2024-09-01 12:15                                                                                   ` Kien Nguyen
  0 siblings, 0 replies; 119+ messages in thread
From: Kien Nguyen @ 2024-09-01 12:15 UTC (permalink / raw)
  To: Pip Cet; +Cc: Sebastián Monía, Eli Zaretskii, emacs-devel, yantar92

> Did this happen randomly, or is it reproducible?

It happens randomly for me.

> What I suspect is that we failed to trace an object, probably a face
> (but maybe it was an ordinary vector), during the previous GC.  I don't
> see how that could have happened, yet...

> Were you using non-ASCII faces at the time?

Yes, I'm using nerd-icons which is full of non-ASCII characters.

> Slow because of the hook or because of other reasons?

It doesn't seem to be because of hooks as I can still type, a tad slower
than normal.  On the other hands, whenever a compiled package is loaded,
it's really slow.  I do delay loading a lot so using Emacs under debugger
has not been enjoyable so far.

> You should realize that attaching to Emacs when it crashes many times
> misses important information, because when Emacs is not running under
> the debugger, fatal exceptions go to the top-level exception handler,
> which at times loses important information, like exactly which code
> caused the crash.  So running an unstable Emacs build outside of GDB
> is not recommended on Windows for several good reasons.

The mps build is quite stable for me and only crash once in a while so
...

> In any case, you should be able to invoke remove_w32_kbdhook from the
> debugger, as soon as you attach to Emacs.  I hesitate to make the
> change you proposed because emacs_abort is called not just when Emacs
> is under a debugger, so the change will affect many users who don't
> debug Emacs.

Got it, I will try that next time.  It will need some setups as at the
time the debugger is attached, typing is really slow so it's impossible
to type anything long.
Btw, I think that at the time emacs_abort (for Windows) is called, the
process is going to crashed anyway unless the debugger is attached and
do some hot patches.  The function is either abort or wait for a
debugger to attach anyway.  Is there another way to recover and continue
to use Emacs?



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-09-01 11:59                                                                                       ` Eli Zaretskii
@ 2024-09-01 18:54                                                                                         ` Kien Nguyen
  2024-09-01 19:27                                                                                           ` Eli Zaretskii
                                                                                                             ` (2 more replies)
  0 siblings, 3 replies; 119+ messages in thread
From: Kien Nguyen @ 2024-09-01 18:54 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: sebastian, pipcet, emacs-devel, yantar92

> Does the alternative change below solve your problem when attaching to
> Emacs??

Sorry, I didn't notice this email before answering the other one. :)

Yes, that would also solve my issue. The `if` check should be changed to
a `while` loop, as `remove_w32_kbdhook` will just decrease the reference
count if there's still more than one reference to the `kbdhook`.

On the other hand, doesn't this require me to run `gdb` under Emacs's
`src`? So, for others who want to try the pre-built version and get the
debug backtrace, they will need to download the `gdbinit` file or clone
the Emacs source code and run `gdb` from the `src` folder. That can be a
bit of work, though.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-09-01 18:54                                                                                         ` Kien Nguyen
@ 2024-09-01 19:27                                                                                           ` Eli Zaretskii
  2024-09-01 19:44                                                                                           ` Pip Cet
  2024-09-07  8:19                                                                                           ` Eli Zaretskii
  2 siblings, 0 replies; 119+ messages in thread
From: Eli Zaretskii @ 2024-09-01 19:27 UTC (permalink / raw)
  To: Kien Nguyen; +Cc: sebastian, pipcet, emacs-devel, yantar92

> From: Kien Nguyen <kien.n.quang@gmail.com>
> Date: Sun, 1 Sep 2024 11:54:04 -0700
> Cc: sebastian@sebasmonia.com, pipcet@protonmail.com, emacs-devel@gnu.org, 
> 	yantar92@posteo.net
> 
> > Does the alternative change below solve your problem when attaching to
> > Emacs??
> 
> Sorry, I didn't notice this email before answering the other one. :)
> 
> Yes, that would also solve my issue. The `if` check should be changed to
> a `while` loop, as `remove_w32_kbdhook` will just decrease the reference
> count if there's still more than one reference to the `kbdhook`.
> 
> On the other hand, doesn't this require me to run `gdb` under Emacs's
> `src`?

Yes.  But it doesn't make sense to seriously debug Emacs in any other
way.  And the MPS build, in particular, needs the setting of SIGSEGV
to avoid stopping due to GC.

>So, for others who want to try the pre-built version and get the
> debug backtrace, they will need to download the `gdbinit` file or clone
> the Emacs source code and run `gdb` from the `src` folder. That can be a
> bit of work, though.

That's true, but people who don't have .gdbinit and the sources cannot
usefully debug Emacs anyway.  So I'm not worried about that.

The advantage of this method is that it affects only those who debug
Emacs, not everybody else.  That's a significant advantage in my book.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-09-01 18:54                                                                                         ` Kien Nguyen
  2024-09-01 19:27                                                                                           ` Eli Zaretskii
@ 2024-09-01 19:44                                                                                           ` Pip Cet
  2024-09-01 21:42                                                                                             ` Kien Nguyen
  2024-09-02 11:08                                                                                             ` Eli Zaretskii
  2024-09-07  8:19                                                                                           ` Eli Zaretskii
  2 siblings, 2 replies; 119+ messages in thread
From: Pip Cet @ 2024-09-01 19:44 UTC (permalink / raw)
  To: Kien Nguyen; +Cc: Eli Zaretskii, sebastian, emacs-devel, yantar92

"Kien Nguyen" <kien.n.quang@gmail.com> writes:

>> Does the alternative change below solve your problem when attaching to
>> Emacs??
>
> Sorry, I didn't notice this email before answering the other one. :)
>
> Yes, that would also solve my issue. The `if` check should be changed to
> a `while` loop, as `remove_w32_kbdhook` will just decrease the reference
> count if there's still more than one reference to the `kbdhook`.
>
> On the other hand, doesn't this require me to run `gdb` under Emacs's
> `src`? So, for others who want to try the pre-built version and get the
> debug backtrace, they will need to download the `gdbinit` file or clone
> the Emacs source code and run `gdb` from the `src` folder. That can be a
> bit of work, though.

Can we make it easier for those brave testers by including the gdbinit
file (and, ideally, an indication of where to download the precise
sources used to build Emacs) in the zip file, and print them out when
GDB is started?

For example, your latest crash report has line numbers in it that do not
precisely match those of the scratch/igc branch, and it wasn't
immediately obvious to me how to look them up...

Pip




^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-09-01 19:44                                                                                           ` Pip Cet
@ 2024-09-01 21:42                                                                                             ` Kien Nguyen
  2024-09-02 11:08                                                                                             ` Eli Zaretskii
  1 sibling, 0 replies; 119+ messages in thread
From: Kien Nguyen @ 2024-09-01 21:42 UTC (permalink / raw)
  To: Pip Cet; +Cc: Eli Zaretskii, sebastian, emacs-devel, yantar92

> The advantage of this method is that it affects only those who debug
> Emacs, not everybody else.  That's a significant advantage in my book.

Ok, I understood.

> Can we make it easier for those brave testers by including the gdbinit
> file (and, ideally, an indication of where to download the precise
> sources used to build Emacs) in the zip file, and print them out when
> GDB is started

I've included the source info in my build now. It should be under
`invocation_directory/../source_info.txt` of the distribution.  I will
report it together with the full backtrace next time.

For the previous backtrace, its source code is here[1].

[1] https://github.com/kiennq/emacs/archive/972842f.zip



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-09-01 19:44                                                                                           ` Pip Cet
  2024-09-01 21:42                                                                                             ` Kien Nguyen
@ 2024-09-02 11:08                                                                                             ` Eli Zaretskii
  2024-09-03  4:12                                                                                               ` Kien Nguyen
  1 sibling, 1 reply; 119+ messages in thread
From: Eli Zaretskii @ 2024-09-02 11:08 UTC (permalink / raw)
  To: Pip Cet; +Cc: kien.n.quang, sebastian, emacs-devel, yantar92

> Date: Sun, 01 Sep 2024 19:44:43 +0000
> From: Pip Cet <pipcet@protonmail.com>
> Cc: Eli Zaretskii <eliz@gnu.org>, sebastian@sebasmonia.com, emacs-devel@gnu.org, yantar92@posteo.net
> 
> "Kien Nguyen" <kien.n.quang@gmail.com> writes:
> 
> > On the other hand, doesn't this require me to run `gdb` under Emacs's
> > `src`? So, for others who want to try the pre-built version and get the
> > debug backtrace, they will need to download the `gdbinit` file or clone
> > the Emacs source code and run `gdb` from the `src` folder. That can be a
> > bit of work, though.
> 
> Can we make it easier for those brave testers by including the gdbinit
> file (and, ideally, an indication of where to download the precise
> sources used to build Emacs) in the zip file, and print them out when
> GDB is started?

We could include .gdbinit in the binary distribution, but it isn't
worth much without the sources anyway.

> For example, your latest crash report has line numbers in it that do not
> precisely match those of the scratch/igc branch, and it wasn't
> immediately obvious to me how to look them up...

The sources of development branches are only available from Git
anyway.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-09-02 11:08                                                                                             ` Eli Zaretskii
@ 2024-09-03  4:12                                                                                               ` Kien Nguyen
  2024-09-03 10:37                                                                                                 ` Pip Cet
  0 siblings, 1 reply; 119+ messages in thread
From: Kien Nguyen @ 2024-09-03  4:12 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Pip Cet, sebastian, emacs-devel, yantar92

[-- Attachment #1: Type: text/plain, Size: 178 bytes --]

I got another two crashes related to mps.
The backtrace is attached.  The emacs source code is here[1].
Hope this helps.

[1] https://github.com/kiennq/emacs/archive/972842f.zip

[-- Attachment #2: gdb.txt --]
[-- Type: text/plain, Size: 323469 bytes --]

#0  0x00007ffbc5644143 in KERNELBASE!DebugBreak () from C:\WINDOWS\System32\KernelBase.dll
No symbol table info available.
#1  0x00007ff75c9d003c in emacs_abort () at D:/a/emacs-build/emacs-build/git/972842f/src/w32fns.c:11377
        button = <optimized out>
#2  0x00007ff75c87e7c7 in terminate_due_to_signal (sig=22, backtrace_limit=2147483647) at D:/a/emacs-build/emacs-build/git/972842f/src/emacs.c:470
No locals.
#3  0x00007ff75c9abbcc in igc_assert_fail.lto_priv.0 (file=0x7ff75d039f46 <gdb_make_enums_visible+522> "buffer.c", line=579, msg=0x7ff75d03a88c <gdb_make_enums_visible+2896> "size > 0") at D:/a/emacs-build/emacs-build/git/972842f/src/igc.c:858
No locals.
#4  0x00007ff75ca89e4c in mps_lib_assert_fail (file=0x7ff75d039f46 <gdb_make_enums_visible+522> "buffer.c", line=579, condition=0x7ff75d03a88c <gdb_make_enums_visible+2896> "size > 0") at D:/a/emacs-build/emacs-build/git/mps/code/mpsliban.c:87
No locals.
#5  BufferFill (pReturn=pReturn@entry=0x5c561efdc8, buffer=buffer@entry=0x1729e596570, size=size@entry=0) at D:/a/emacs-build/emacs-build/git/mps/code/buffer.c:579
        res = <optimized out>
        pool = <optimized out>
        base = 0x5c561efe40
        limit = 0x7ff75ca60cef <BufferSeg+15>
        next = <optimized out>
#6  0x00007ff75caba568 in amcSegFix (seg=0x1729fca6930, ss=0x5c561f00d0, refIO=0x5c561efe40) at D:/a/emacs-build/emacs-build/git/mps/code/poolamc.c:1633
        clientQ = <optimized out>
        arena = 0x1729bb10000
        pool = <optimized out>
        amc = <optimized out>
        res = <optimized out>
        format = 0x1729e596370
        headerSize = 0
        ref = 0x172a55a89f0
        base = 0x172a55a89f0
        newRef = <optimized out>
        newBase = 0x172b721b368
        length = 0
        buffer = 0x1729e596570
        gen = <optimized out>
        grey = <optimized out>
        toSeg = <optimized out>
        ti = <optimized out>
        trace = <optimized out>
#7  0x00007ff75ca5922f in _mps_fix2 (mps_ss=0x5c561f00d8, mps_ref_io=0x5c561efe98) at D:/a/emacs-build/emacs-build/git/mps/code/trace.c:1433
        ss = 0x5c561f00d0
        ref = 0x172a55a89f0
        chunk = 0x1729e410000
        i = <optimized out>
        tract = <optimized out>
        seg = <optimized out>
        res = <optimized out>
#8  0x00007ff75c9a476b in fix_lisp_obj.lto_priv.0 (ss=0x5c561f00d8, pobj=0x172b721b378) at D:/a/emacs-build/emacs-build/git/972842f/src/igc.c:998
        res = <optimized out>
        client = <optimized out>
        base = 0x172a55a89f0
        p = 0x172b721b378
        word = <optimized out>
        tag = <optimized out>
        _ss = 0x5c561f00d8
        _mps_zs = <optimized out>
        _mps_ufs = 3310288147503382530
        _mps_wt = <optimized out>
        _mps_w = <optimized out>
#9  0x00007ff75c9a82c7 in dflt_scanx (ss=ss@entry=0x5c561f00d8, base_start=<optimized out>, base_limit=<optimized out>, closure=<optimized out>, closure@entry=0x0) at D:/a/emacs-build/emacs-build/git/972842f/src/igc.c:1752
        res = <optimized out>
        base = 0x172b721b368
        _ss = 0x5c561f00d8
        _mps_zs = <optimized out>
        _mps_ufs = 3310288147501285378
        _mps_wt = <optimized out>
        _mps_w = <optimized out>
#10 0x00007ff75c9a94b5 in dflt_scan (ss=0x5c561f00d8, base_start=<optimized out>, base_limit=<optimized out>) at D:/a/emacs-build/emacs-build/git/972842f/src/igc.c:1962
        res = <optimized out>
        _ss = 0x5c561f00d8
        _mps_zs = <optimized out>
        _mps_ufs = 3310288147501285378
        _mps_wt = <optimized out>
        _mps_w = <optimized out>
#11 0x00007ff75ca8aef3 in TraceScanFormat (ss=0x5c561f00d0, base=0x172b721b368, limit=0x172b721b380) at D:/a/emacs-build/emacs-build/git/mps/code/trace.c:1539
No locals.
#12 amcSegScan (totalReturn=0x5c561f00cc, seg=0x172aa00d1b0, ss=0x5c561f00d0) at D:/a/emacs-build/emacs-build/git/mps/code/poolamc.c:1427
        base = 0x172b721b368
        limit = 0x172b721b380
        format = 0x1729e596370
        pool = <optimized out>
        amc = <optimized out>
        res = <optimized out>
        buffer = 0x1729e596570
#13 0x00007ff75cab725e in traceScanSegRes (ts=ts@entry=1, rank=rank@entry=1, arena=arena@entry=0x1729bb10000, seg=seg@entry=0x172aa00d1b0) at D:/a/emacs-build/emacs-build/git/mps/code/trace.c:1205
        ssStruct = {sig = 1368771141, ss_s = {_zs = 22, _w = 8935141660971499518, _ufs = 3310288147501285378}, arena = 0x1729bb10000, formatScan = 0x7ff75c9a94a0 <dflt_scan>, areaScan = 0x7ff75ca46bd0 <traceNoAreaScan>, areaScanClosure = 0x7ff75cabd4b4 <TraceStart+1652>, fix = 0x7ff75ca47950 <SegFix>, fixClosure = 0x0, traces = 1, rank = 1, wasMarked = 0, fixedSummary = 2305843009482129410, scannedSize = 4992}
        ss = 0x5c561f00d0
        wasTotal = 1
        white = 8935141660971499518
        res = <optimized out>
#14 0x00007ff75cab7417 in traceScanSeg (ts=1, rank=1, arena=0x1729bb10000, seg=0x172aa00d1b0) at D:/a/emacs-build/emacs-build/git/mps/code/trace.c:1267
        res = <optimized out>
#15 0x00007ff75cab7d3e in TraceAdvance (trace=trace@entry=0x1729bb10a78) at D:/a/emacs-build/emacs-build/git/mps/code/trace.c:1728
        res = <optimized out>
        seg = 0x172aa00d1b0
        rank = 1
        arena = 0x1729bb10000
        oldWork = 22310800
        newWork = <optimized out>
#16 0x00007ff75cabe96d in TracePoll (workReturn=workReturn@entry=0x5c561f0308, collectWorldReturn=collectWorldReturn@entry=0x5c561f0304, globals=globals@entry=0x1729bb10008, collectWorldAllowed=<optimized out>) at D:/a/emacs-build/emacs-build/git/mps/code/trace.c:1849
        trace = 0x1729bb10a78
        arena = 0x1729bb10000
        oldWork = 22302608
        newWork = <optimized out>
        work = <optimized out>
        endWork = 22402139
#17 0x00007ff75cabeb93 in ArenaPoll (globals=globals@entry=0x1729bb10008) at D:/a/emacs-build/emacs-build/git/mps/code/global.c:745
        arena = 0x1729bb10000
        start = 2195725
        worldCollected = 0
        moreWork = <optimized out>
        workWasDone = 1
        tracedWork = 99808
#18 0x00007ff75cabeeee in mps_ap_fill (p_o=0x5c561f0408, mps_ap=0x1729e5978f8, size=24) at D:/a/emacs-build/emacs-build/git/mps/code/mpsi.c:1097
        _sc = {calleeSave = {396581864456, 1591749967872, 1591794563232, 0, 396581864544, 1}}
        buf = 0x1729e5978a0
        arena = 0x1729bb10000
        p = 0x0
        res = <optimized out>
#19 0x00007ff75c9a62b8 in alloc_impl.lto_priv.0 (size=24, type=3, ap=0x1729e5978f8) at D:/a/emacs-build/emacs-build/git/972842f/src/igc.c:3770
        res = <optimized out>
        p = 0x0
#20 0x00007ff75c8dc8cd in Fmatch_data (integers=<optimized out>, reuse=0x0, reseat=<optimized out>) at D:/a/emacs-build/emacs-build/git/972842f/src/igc.c:3683
        tail = <optimized out>
        prev = 0x0
        data = 0x5c561f0460
        i = <optimized out>
        len = <optimized out>
        sa_avail = <optimized out>
        sa_count = {bytes = 224}
#21 0x00007ff75c9983fe in autocmp_chars (rule=0x172b6ec087d, charpos=113988, bytepos=113990, limit=150087, win=0x172a7df7e60, face=0x172b6fae140, string=0x0, direction=0x3608, ch=41) at D:/a/emacs-build/emacs-build/git/972842f/src/search.c:3191
        count = <optimized out>
        pos = 0x6f512
        to = <optimized out>
        pt = 114127
        pt_byte = 114129
        re = <optimized out>
        font_object = <optimized out>
        lgstring = <optimized out>
        len = <optimized out>
        f = <optimized out>
#22 0x00007ff75c99eb5a in composition_reseat_it (cmp_it=0x5c561f89e0, charpos=113988, bytepos=113990, endpos=150087, w=0x172a7df7e60, bidi_level=0 '\000', face=0x172b6fae140, string=0x0) at D:/a/emacs-build/emacs-build/git/972842f/src/composite.c:1353
        lgstring = 0x0
        val = <optimized out>
        elt = <optimized out>
        direction = <optimized out>
        i = <optimized out>
#23 0x00007ff75c7cfef6 in next_element_from_buffer (it=0x5c561f8120) at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:9800
        p = <optimized out>
        stop = <optimized out>
        success_p = true
#24 0x00007ff75c7cd5a5 in get_next_display_element.lto_priv.0 (it=it@entry=0x5c561f8120) at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:8298
        success_p = <optimized out>
        get_next = <optimized out>
#25 0x00007ff75c7d034c in move_it_in_display_line_to.lto_priv.0 (it=it@entry=0x5c561f8120, to_charpos=<optimized out>, to_charpos@entry=150087, to_x=<optimized out>, to_x@entry=-1, op=op@entry=8) at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:10099
        x = <optimized out>
        i = <optimized out>
        ascent = <optimized out>
        descent = <optimized out>
        result = <optimized out>
        saved_glyph_row = <optimized out>
        wrap_it = {window = 0x172a7df7e65, w = 0x172a7df7e60, f = 0x1729ecb6f90, method = 0, stop_charpos = 113994, prev_stop = 113984, base_level_stop = 113984, end_charpos = 150087, medium_narrowing_begv = 0, medium_narrowing_zv = 0, large_narrowing_begv = 0, large_narrowing_zv = 0, s = 0x0, string_nchars = 0, multibyte_p = 1, tab_line_p = 0, header_line_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, from_disp_prop_p = 0, ellipsis_p = 0, avoid_cursor_p = 0, dp = 0x172a7299888, dpvec = 0x0, dpend = 0x172bb642038, dpvec_char_len = 1, dpvec_face_id = -1, saved_face_id = 44, ctl_chars = {0x0 <repeats 16 times>}, start = {pos = {charpos = 112618, bytepos = 112620}, overlay_string_index = -1, string_pos = {charpos = -1, bytepos = -1}, dpvec_index = -1}, current = {pos = {charpos = 113984, bytepos = 113986}, overlay_string_index = -1, string_pos = {charpos = -1, bytepos = -1}, dpvec_index = -1}, n_overlay_strings = 0, overlay_strings_charpos = 113984, overlay_strings = {0x0 <repeats 16 times>}, string_overlays = {0x0 <repeats 16 times>}, string = 0x0, from_overlay = 0x0, stack = {{string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}}, sp = 0, selective = 0, what = 0, face_id = 0, selective_display_ellipsis_p = 1, ctl_arrow_p = 1, face_box_p = 0, start_of_box_run_p = 0, end_of_box_run_p = 0, overlay_strings_at_end_processed_p = 0, ignore_overlay_strings_at_pos_p = 0, glyph_not_available_p = 0, starts_in_middle_of_char_p = 0, face_before_selective_p = 0, constrain_row_ascent_descent_p = 0, line_number_produced_p = 1, align_visually_p = 0, line_wrap = 1, base_face_id = 0, c = 116, len = 1, cmp_it = {stop_pos = 113987, id = -1, ch = 41, rule_idx = 0, lookback = 0, nglyphs = 3, reversed_p = false, parent_it = 0x5c561f9510, charpos = 113123, nchars = 1, nbytes = 1, from = 2, to = 3, width = 1}, char_to_display = 116, glyphless_method = 0, image_id = 0, xwidget = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, space_width = 0x0, voffset = 0, tab_width = 2, font_height = 0x0, object = 0x172a7d5f965, position = {charpos = 113984, bytepos = 113986}, truncation_pixel_width = 0, continuation_pixel_width = 8, first_visible_x = 0, last_visible_x = 1272, last_visible_y = 1328, extra_line_spacing = 0, max_extra_line_spacing = 0, override_ascent = -1, override_descent = 0, override_boff = 0, glyph_row = 0x0, area = 1, nglyphs = 1, pixel_width = 8, ascent = 13, descent = 3, max_ascent = 13, max_descent = 3, phys_ascent = 0, phys_descent = 1, max_phys_ascent = 13, max_phys_descent = 3, current_x = 800, wrap_prefix_width = 0, continuation_lines_width = 0, eol_pos = {charpos = 0, bytepos = 0}, current_y = 416, first_vpos = 0, vpos = 26, hpos = 100, lnum = 3129, lnum_bytepos = 113892, lnum_width = 4, lnum_pixel_width = 48, pt_lnum = 3136, stretch_adjust = 0, left_user_fringe_bitmap = 0, right_user_fringe_bitmap = 0, left_user_fringe_face_id = 0, right_user_fringe_face_id = 0, bidi_p = 1, bidi_it = {bytepos = 113986, charpos = 113984, ch = 116, nchars = 1, ch_len = 1, type = 1, type_after_wn = 1, orig_type = 1, resolved_level = 0 '\000', isolate_level = 0 '\000', invalid_levels = 0, invalid_isolates = 0, prev = {charpos = 113983, type = 22, orig_type = 22}, last_strong = {charpos = 113980, type = 1, orig_type = 1}, next_for_neutral = {charpos = -1, type = 0, orig_type = 0}, prev_for_neutral = {charpos = 113983, type = 1, orig_type = 22}, next_for_ws = {charpos = 113984, type = 1, orig_type = 0}, bracket_pairing_pos = -1, bracket_enclosed_type = 0, next_en_pos = 0, next_en_type = 0, sos = 1, scan_dir = 1, disp_pos = 114123, disp_prop = 0, stack_idx = 0, level_stack = {{next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'} <repeats 128 times>}, string = {lstring = 0x0, s = 0x0, schars = 0, bufpos = 0, from_disp_str = 0, unibyte = 0}, w = 0x172a7df7e60, paragraph_dir = 1, separator_limit = 113376, first_elt = 0, new_paragraph = 0, frame_window_p = 1}, paragraph_embedding = 1, min_width_property = 0x0, min_width_start = 0}
        atpos_it = {window = 0x172bed013eb, w = 0x7ff75ca36746 <add_properties.isra.0+438>, f = 0x14, method = 1553621599, stop_charpos = 1592339206880, prev_stop = 6, base_level_stop = 1592339205148, end_charpos = 1592339205632, medium_narrowing_begv = 1592339200435, medium_narrowing_zv = 72059186377134992, large_narrowing_begv = 1592339205148, large_narrowing_zv = 1592339206992, s = 0x7f88 <error: Cannot access memory at address 0x7f88>, string_nchars = 15232, multibyte_p = 1, tab_line_p = 0, header_line_p = 1, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, from_disp_prop_p = 0, ellipsis_p = 0, avoid_cursor_p = 0, dp = 0x172bed00c1c, dpvec = 0x172becff9fb, dpend = 0xd, dpvec_char_len = 7, dpvec_face_id = 0, saved_face_id = 5, ctl_chars = {0x1, 0x172bed01390, 0x1729ca00000, 0x1729ccd1210, 0x1729ccd1260, 0x7ffbc7b52565 <ntdll!RtlFreeHeap+837>, 0x172bed00c1c, 0x8f00030003, 0x8f00020002, 0x0, 0x52, 0x5, 0x1, 0x1729ca00140, 0x226, 0x7ff75c990d20 <find_interval+32>}, start = {pos = {charpos = 1591942420616, bytepos = 1592339206347}, overlay_string_index = 1592339205148, string_pos = {charpos = 137, bytepos = 396581876832}, dpvec_index = 1}, current = {pos = {charpos = 2, bytepos = 4611686018528051200}, overlay_string_index = 1592339205148, string_pos = {charpos = 140700387208348, bytepos = 550}, dpvec_index = 570}, n_overlay_strings = 1592339205148, overlay_strings_charpos = 4611686018528051200, overlay_strings = {0x2, 0x2, 0x240, 0x1729ccd1260, 0x172bed00c1c, 0x7ff75c90c022 <styled_format.lto_priv.0+6002>, 0x1729ca00000, 0x0, 0x1729ccd1210, 0x7a, 0x5c00000001, 0x5c561f3538, 0x0, 0x0, 0x0, 0x0}, string_overlays = {0x0, 0x240, 0x0, 0x10000, 0x5c561f3545, 0x1729ccd1210, 0x2, 0x0, 0x73, 0x65, 0x172bece50eb, 0x1729ccd12d8, 0x0, 0x172becff8ac, 0x1, 0x15}, string = 0x172bece50e0, from_overlay = 0x0, stack = {{string = 0x1729ccd1238, string_nchars = 0, end_charpos = -1, stop_charpos = 396581877072, prev_stop = 0, base_level_stop = 1, cmp_it = {stop_pos = 158, id = 1592339091691, ch = 2, rule_idx = 576, lookback = 2, nglyphs = 1, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 23, to = 0, width = 21}, face_id = 0, u = {image = {object = 0x7e208f97e2202020, slice = {x = 0x2e7363616d652e2f, y = 0x2e7363616d652f64, width = 0x3a3733313320646d, height = 0x2020253637203632}, image_id = 2314885530818453536}, stretch = {object = 0x7e208f97e2202020}, xwidget = {object = 0x7e208f97e2202020}}, position = {charpos = 2314885530818453536, bytepos = 2314885530818453536}, current = {pos = {charpos = 2314885530818453536, bytepos = 2314885530818453536}, overlay_string_index = 2314885530818453536, string_pos = {charpos = 2314885530818453536, bytepos = 2314885530818453536}, dpvec_index = 538976288}, from_overlay = 0x2020202020202020, area = 538976288, method = 538976288, paragraph_embedding = 538976288, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 1, from_disp_prop_p = 0, line_wrap = 538976288, voffset = 20028, space_width = 0x464c205d32375b20, font_height = 0xee20382d46545520}, {string = 0xb298, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 1444912968, end_charpos = 0, stop_charpos = 115898, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 115897, id = 1591954341472, ch = 0, rule_idx = 140700385933944, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 1444915224, nbytes = 92, from = -1478525344, to = 370, width = 1}, face_id = 1444913000, u = {image = {object = 0x5c561f9f60, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x5c561f9f60}, xwidget = {object = 0x5c561f9f60}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 396581904200, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = -1, bytepos = 0}, dpvec_index = 1552294462}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 1444907864, voffset = 92, space_width = 0x0, font_height = 0x1bce2}, {string = 0x0, string_nchars = 0, end_charpos = 113889, stop_charpos = 10, prev_stop = 0, base_level_stop = 140700385933944, cmp_it = {stop_pos = 18, id = 0, ch = 0, rule_idx = 114912, lookback = 396581901352, nglyphs = -1478525344, reversed_p = 114, parent_it = 0x1, charpos = 396581899128, nchars = 1444907888, nbytes = 92, from = 114912, to = 0, width = 1}, face_id = -1, u = {image = {object = 0x0, slice = {x = 0xffffffffffffffff, y = 0x0, width = 0x0, height = 0x5c561f8b58}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = -1}, current = {pos = {charpos = 0, bytepos = 140700385944126}, overlay_string_index = 396581901584, string_pos = {charpos = 114877, bytepos = 4294967297}, dpvec_index = 1}, from_overlay = 0x1, area = 102, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x5c561f3b20, font_height = 0x7ff75c861f9c <bidi_cache_iterator_state+508>}}, sp = 0, selective = 396581899096, what = 1, face_id = 0, selective_display_ellipsis_p = 0, ctl_arrow_p = 0, face_box_p = 0, start_of_box_run_p = 1, end_of_box_run_p = 1, overlay_strings_at_end_processed_p = 0, ignore_overlay_strings_at_pos_p = 1, glyph_not_available_p = 0, starts_in_middle_of_char_p = 1, face_before_selective_p = 1, constrain_row_ascent_descent_p = 0, line_number_produced_p = 1, align_visually_p = 0, line_wrap = 92, base_face_id = 0, c = 0, len = 0, cmp_it = {stop_pos = 140700394522400, id = 4, ch = 360, rule_idx = 140700385952675, lookback = 0, nglyphs = -1, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 115938, nbytes = 0, from = 115936, to = 0, width = 10}, char_to_display = 1, glyphless_method = 0, image_id = 1, xwidget = 0x600000006, slice = {x = 0x6, y = 0x0, width = 0x0, height = 0x1c4df}, space_width = 0x100000000, voffset = -15137, tab_width = 1, font_height = 0x0, object = 0xffffffffffffffff, position = {charpos = 0, bytepos = 115936}, truncation_pixel_width = 1, continuation_pixel_width = 0, first_visible_x = 1, last_visible_x = -1, last_visible_y = -1, extra_line_spacing = 0, max_extra_line_spacing = 0, override_ascent = -1, override_descent = -1, override_boff = 0, glyph_row = 0x0, area = 0, nglyphs = 1, pixel_width = 1, ascent = 0, descent = 116131, max_ascent = 0, max_descent = 0, phys_ascent = 0, phys_descent = 0, max_phys_ascent = 0, max_phys_descent = 0, current_x = 0, wrap_prefix_width = 115921, continuation_lines_width = 0, eol_pos = {charpos = 4294967297, bytepos = -1}, current_y = 0, first_vpos = 0, vpos = 115922, hpos = 0, lnum = 94489280513, lnum_bytepos = 115923, lnum_width = 1, lnum_pixel_width = 0, pt_lnum = -1, stretch_adjust = 0, left_user_fringe_bitmap = 0, right_user_fringe_bitmap = 0, left_user_fringe_face_id = 0, right_user_fringe_face_id = 0, bidi_p = 0, bidi_it = {bytepos = 4294967296, charpos = 1, ch = 116131, nchars = 0, ch_len = 0, type = 0, type_after_wn = 0, orig_type = 0, resolved_level = 0 '\000', isolate_level = 0 '\000', invalid_levels = 0, invalid_isolates = 0, prev = {charpos = 0, type = 0, orig_type = 0}, last_strong = {charpos = 0, type = 0, orig_type = 0}, next_for_neutral = {charpos = 0, type = 0, orig_type = 0}, prev_for_neutral = {charpos = 0, type = 0, orig_type = 0}, next_for_ws = {charpos = 0, type = 0, orig_type = 0}, bracket_pairing_pos = 0, bracket_enclosed_type = 0, next_en_pos = 0, next_en_type = 0, sos = 0, scan_dir = 0, disp_pos = 0, disp_prop = 0, stack_idx = 0, level_stack = {{next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'} <repeats 12 times>, {next_for_neutral_pos = 140700386686791, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 3, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700386434144, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 5, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = -1, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 4, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581879504, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 7, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 1592103481116, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 3, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 4, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700386468153, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 7, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 48, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700386458052, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1592108567668, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1592108567668, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700386686791, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 3, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700386434144, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 5, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = -1, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 4, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581879776, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 3, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 1592103481116, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 3, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 4, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700386468153, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 3, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 48, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700386458052, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1592108565148, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1592108565150, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1592103481100, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1592281787784, next_for_neutral_type = 4, last_strong_type = 3, prev_for_neutral_type = 1, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1592207794496, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 5, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 396581880112, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387536916, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1592281787784, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1592207794496, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 4, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 140700394516608, next_for_neutral_type = 4, last_strong_type = 3, prev_for_neutral_type = 1, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591802032016, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385558387, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581880424, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 64, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 255 'ÿ', flags = 255 'ÿ'}, {next_for_neutral_pos = -1, next_for_neutral_type = 0, last_strong_type = 1, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581904200, next_for_neutral_type = 6, last_strong_type = 4, prev_for_neutral_type = 2, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 396581904200, next_for_neutral_type = 7, last_strong_type = 2, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 150087, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 255 'ÿ', flags = 255 'ÿ'}, {next_for_neutral_pos = 0, next_for_neutral_type = 1, last_strong_type = 7, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591954341472, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385948840, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 6, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 396581904200, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581904200, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 1, prev_for_neutral_type = 5, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 1591954341472, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 4, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 140700385949579, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 3, prev_for_neutral_type = 5, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 140700385920139, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581899096, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 150087, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 255 'ÿ', flags = 255 'ÿ'}, {next_for_neutral_pos = 0, next_for_neutral_type = 1, last_strong_type = 4, prev_for_neutral_type = 3, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 10, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385948524, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 1, prev_for_neutral_type = 6, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 15232, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581899096, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581899096, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 3, prev_for_neutral_type = 5, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 10, next_for_neutral_type = 0, last_strong_type = 5, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385949579, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}}, string = {lstring = 0x0, s = 0x0, schars = 0, bufpos = 0, from_disp_str = 0, unibyte = 0}, w = 0x0, paragraph_dir = 0, separator_limit = 0, first_elt = 0, new_paragraph = 0, frame_window_p = 0}, paragraph_embedding = 0, min_width_property = 0x0, min_width_start = 0}
        atx_it = {window = 0xf44, w = 0x172c, f = 0x1e78, method = 7820, stop_charpos = 7428, prev_stop = 7420, base_level_stop = 5576, end_charpos = 1096, medium_narrowing_begv = 396581871584, medium_narrowing_zv = 144, large_narrowing_begv = 140700395753280, large_narrowing_zv = 140700394167895, s = 0x7ff75ca7a790 <LandFindFirst> "AUATUWVSHƒìHH‰ÎH‰×L‰ÃL‰ÍH…É\017„\217\001", string_nchars = 140700388141172, multibyte_p = 0, tab_line_p = 0, header_line_p = 1, string_from_display_prop_p = 0, string_from_prefix_prop_p = 1, from_disp_prop_p = 1, ellipsis_p = 0, avoid_cursor_p = 0, dp = 0x7ff75ca7a759 <cbsFindFirst+153>, dpvec = 0x1561f1f68, dpend = 0x172b5de0000, dpvec_char_len = 2, dpvec_face_id = 370, saved_face_id = -1094107136, ctl_chars = {0x172bec92000, 0x172becc0000, 0x7ff75d039db8 <gdb_make_enums_visible+124>, 0x1729bb100b8, 0x1729fed13b0, 0x172b5ebb0c8, 0x172bec94000, 0x7ff75ca920f3 <segAbsInit+547>, 0x1729bb10340, 0x7ff75ca813fb <MVFFAlloc+123>, 0x5c561f2098, 0x7ff75d03faa6 <gdb_make_enums_visible+23914>, 0x5c561f2008, 0x172b5de0000, 0x17200000002, 0x1729fed13b0}, start = {pos = {charpos = 1591794557920, bytepos = 1592338751488}, overlay_string_index = 8192, string_pos = {charpos = 1591794558176, bytepos = 396581872304}, dpvec_index = -1611852880}, current = {pos = {charpos = 1592338751488, bytepos = 140700388243603}, overlay_string_index = 140700395753280, string_pos = {charpos = 140700394176119, bytepos = 144}, dpvec_index = 1444880584}, n_overlay_strings = 396581872304, overlay_strings_charpos = 1591749967872, overlay_strings = {0x2000, 0x1729fed13b0, 0x1729e5963e0, 0x172bec92000, 0x2000, 0x7ff75ca9cbb8 <AMCSegInit+184>, 0x1729bb10000, 0x90, 0x5c561f2128, 0x1729bb10000, 0x5c561f22b0, 0x7ff75ca57955 <ControlAlloc+85>, 0x7ff75d047280 <_mps_key_amc_seg_gen>, 0x1729e5964e0, 0x5c561f21e0, 0x0}, string_overlays = {0x2000, 0x7ff75d1b42e0 <ClassStaticamcSeg>, 0x1729bb10000, 0x0, 0x2000, 0x7ff75ca84dbf <SegAlloc+543>, 0x2000, 0x1729e596a10, 0x5c561f23c0, 0x1729feb20a0, 0x5c561f22b0, 0x7ff75ca93893 <gcSegInit+147>, 0x172bec92000, 0x1729fed13b0, 0x9060, 0x172bec91feb}, string = 0x5c561f23c0, from_overlay = 0x1729e5964e0, stack = {{string = 0x7ff75d1b42e0 <ClassStaticamcSeg>, string_nchars = -1638309232, end_charpos = 396581872296, stop_charpos = 8935141660971499518, prev_stop = 1591794558176, base_level_stop = 1591821013936, cmp_it = {stop_pos = 1591794557584, id = 140700388184326, ch = -101792, rule_idx = 1591749967872, lookback = 396581872576, nglyphs = 1554348373, reversed_p = 247, parent_it = 0x1729e5963e0, charpos = 396581872304, nchars = 1444881136, nbytes = 92, from = 0, to = 0, width = 8192}, face_id = -1611852880, u = {image = {object = 0x51970cb6, slice = {x = 0x1729fed13b0, y = 0x2, width = 0xffffffffffffffff, height = 0x1729fed13b0}, image_id = 140700388359369}, stretch = {object = 0x51970cb6}, xwidget = {object = 0x51970cb6}}, position = {charpos = 1591794557920, bytepos = 8192}, current = {pos = {charpos = 1591794563232, bytepos = 1591794563232}, overlay_string_index = 1591794557920, string_pos = {charpos = 1592338751488, bytepos = 1591794557920}, dpvec_index = 1554755067}, from_overlay = 0x1729e5963e0, area = 2656659984, method = 370, paragraph_embedding = 1562067680, multibyte_p = 1, string_from_display_prop_p = 1, string_from_prefix_prop_p = 1, display_ellipsis_p = 0, avoid_cursor_p = 1, bidi_p = 1, from_disp_prop_p = 1, line_wrap = 2656658064, voffset = 370, space_width = 0x5c561f22b0, font_height = 0x7c0000000ffffffe}, {string = 0x1729e596a10, string_nchars = -1094107136, end_charpos = 1591794557584, stop_charpos = 140700388184326, prev_stop = 1591794557920, base_level_stop = 1591821013936, cmp_it = {stop_pos = 140700394222624, id = 396581872576, ch = 1560572960, rule_idx = 396581872576, lookback = 396581895848, nglyphs = 1552270475, reversed_p = 247, parent_it = 0x7ff75d047420 <_mps_key_ARGS_END>, charpos = 396581895848, nchars = 0, nbytes = 0, from = 38484, to = 0, width = -1}, face_id = 0, u = {image = {object = 0x8744, slice = {x = 0x4, y = 0x4088, width = 0x5c561f7ef8, height = 0x7ff75c862aa6 <bidi_find_bracket_pairs+22>}, image_id = 396581895928}, stretch = {object = 0x8744}, xwidget = {object = 0x8744}}, position = {charpos = 23, bytepos = 150087}, current = {pos = {charpos = -1, bytepos = 0}, overlay_string_index = 115936, string_pos = {charpos = 4, bytepos = 0}, dpvec_index = 1552299176}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 1444904616, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 1, display_ellipsis_p = 1, avoid_cursor_p = 1, bidi_p = 0, from_disp_prop_p = 1, line_wrap = 4, voffset = 0, space_width = 0x7f88, font_height = 0x3b80}, {string = 0x5c00000007, string_nchars = -1611852880, end_charpos = 1591794563232, stop_charpos = 140700388031067, prev_stop = 140700385946278, base_level_stop = 140700388014001, cmp_it = {stop_pos = 23, id = 150087, ch = -1, rule_idx = 1591794563232, lookback = 1591821013936, nglyphs = -1638303584, reversed_p = 114, parent_it = 0x1729fed13b0, charpos = 140700388039696, nchars = -1094115328, nbytes = 370, from = -1611853024, to = 370, width = -1638308896}, face_id = 1554369791, u = {image = {object = 0x1729fed13b0, slice = {x = 0x1729bb10000, y = 0x1729bb10630, width = 0x18, height = 0x5c561f2638}, image_id = 1591794563232}, stretch = {object = 0x1729fed13b0}, xwidget = {object = 0x1729fed13b0}}, position = {charpos = 4611686019484352512, bytepos = 1592338751400}, current = {pos = {charpos = -139108590246352, bytepos = 140700388360607}, overlay_string_index = 140700394168134, string_pos = {charpos = 0, bytepos = 24}, dpvec_index = 1554549540}, from_overlay = 0x1729bb10670, area = 2656663712, method = 370, paragraph_embedding = 24, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 2612068352, voffset = 370, space_width = 0x7ff75d1bccc0 <ClassStaticAbstractArena>, font_height = 0x18}, {string = 0x5c561f2638, string_nchars = -1638303584, end_charpos = 1591749967872, stop_charpos = 140700388364587, prev_stop = 24, base_level_stop = 396581872952, cmp_it = {stop_pos = 1591794557216, id = 0, ch = 24, rule_idx = 1591749967872, lookback = 1591794557216, nglyphs = 1554715467, reversed_p = 247, parent_it = 0x1729bb10000, charpos = 396581899096, nchars = 0, nbytes = 0, from = 115937, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x1c4e0, slice = {x = 0x4, y = 0x0, width = 0x7ff75c85fa78 <bidi_resolve_explicit+440>, height = 0x7ff75d08f080 <globals>}, image_id = 1591749967872}, stretch = {object = 0x1c4e0}, xwidget = {object = 0x1c4e0}}, position = {charpos = 3, bytepos = 1592338751488}, current = {pos = {charpos = 396581901352, bytepos = 1591954341472}, overlay_string_index = 1589137899521, string_pos = {charpos = 396581899128, bytepos = 396581899120}, dpvec_index = 1105503792}, from_overlay = 0x1729e5978f8, area = 24, method = 0, paragraph_embedding = 1560764480, multibyte_p = 1, string_from_display_prop_p = 1, string_from_prefix_prop_p = 1, display_ellipsis_p = 0, avoid_cursor_p = 1, bidi_p = 1, from_disp_prop_p = 1, line_wrap = 3, voffset = 0, space_width = 0x300000000, font_height = 0x7ff75c9a625f <alloc_impl.lto_priv.0+127>}, {string = 0x5c561f8b58, string_nchars = 0, end_charpos = 0, stop_charpos = -1, prev_stop = 0, base_level_stop = 140700385944126, cmp_it = {stop_pos = 0, id = 1592338751643, ch = 47488, rule_idx = 1592338744976, lookback = 1592338751667, nglyphs = 1554212678, reversed_p = 247, parent_it = 0x14, charpos = 140700387271263, nchars = -1094115416, nbytes = 370, from = 6, to = 0, width = -1094117148}, face_id = -1094116664, u = {image = {object = 0x172bec9067b, slice = {x = 0x1000172bec92058, y = 0x172bec918e4, width = 0x172bec92018, height = 0x7f88}, image_id = 15232}, stretch = {object = 0x172bec9067b}, xwidget = {object = 0x172bec9067b}}, position = {charpos = 5, bytepos = 140700387956829}, current = {pos = {charpos = 1592338745027, bytepos = 13}, overlay_string_index = 7, string_pos = {charpos = 5, bytepos = 1}, dpvec_index = -1094115240}, from_overlay = 0x1729ca00000, area = 2630686992, method = 370, paragraph_embedding = 2630687072, multibyte_p = 0, string_from_display_prop_p = 1, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 1, bidi_p = 1, from_disp_prop_p = 1, line_wrap = 3350537573, voffset = 32763, space_width = 0x172bec918e4, font_height = 0x1729bb10d18}}, sp = -1506984496, selective = 140700387929744, what = 2787982800, face_id = 370, selective_display_ellipsis_p = 1, ctl_arrow_p = 0, face_box_p = 0, start_of_box_run_p = 1, end_of_box_run_p = 0, overlay_strings_at_end_processed_p = 0, ignore_overlay_strings_at_pos_p = 1, glyph_not_available_p = 0, starts_in_middle_of_char_p = 0, face_before_selective_p = 0, constrain_row_ascent_descent_p = 0, line_number_produced_p = 1, align_visually_p = 0, line_wrap = 32759, base_face_id = -1635770800, c = 370, len = 1554307165, cmp_it = {stop_pos = 396581874208, id = 140700387931152, ch = 57344, rule_idx = 1591749971184, lookback = 65536, nglyphs = 1554458936, reversed_p = 247, parent_it = 0x5c561f2a38, charpos = 396581874240, nchars = 2, nbytes = 0, from = 1554307165, to = 32759, width = -1682898944}, char_to_display = -1682895632, glyphless_method = 370, image_id = 0, xwidget = 0x172becb0000, slice = {x = 0x10000, y = 0x7ff75ca75f5b <cbsDelete+587>, width = 0x1729e8016a0, height = 0x7ff75ca4d85d <SplaySplay+29>}, space_width = 0x5c561f2a20, voffset = 29712, tab_width = 23716, font_height = 0x7ff75ca473c0 <cbsTestNodeInZones>, object = 0x1729bb102a8, position = {charpos = 1591794646976, bytepos = 140700387929744}, truncation_pixel_width = -16448, continuation_pixel_width = -24998, first_visible_x = 370, last_visible_x = 1554458697, last_visible_y = 32759, extra_line_spacing = -1635772768, max_extra_line_spacing = 370, override_ascent = 1554307165, override_descent = 32759, override_boff = -1682898944, glyph_row = 0x5c561f28d0, area = 5040, nglyphs = 0, pixel_width = -1682898304, ascent = 370, descent = 5184, max_ascent = 0, max_descent = 1554458936, phys_ascent = 32759, phys_descent = -1243742208, max_phys_ascent = 370, max_phys_descent = 1554443261, current_x = 32759, wrap_prefix_width = -1635770800, continuation_lines_width = 370, eol_pos = {charpos = 1591797090432, bytepos = 57344}, current_y = -1682898304, first_vpos = 370, vpos = 0, hpos = 0, lnum = 1591821016096, lnum_bytepos = 5184, lnum_width = 1554472795, lnum_pixel_width = 32759, pt_lnum = 1592338874368, stretch_adjust = -1682898264, left_user_fringe_bitmap = 370, right_user_fringe_bitmap = 0, left_user_fringe_face_id = 704448, right_user_fringe_face_id = 370, bidi_p = 0, bidi_it = {bytepos = 140700387930976, charpos = 396581874312, ch = -1638219840, nchars = 2, ch_len = 140700387957669, type = 1444882976, type_after_wn = 92, orig_type = 36560, resolved_level = 0 '\000', isolate_level = 0 '\000', invalid_levels = 1592189124608, invalid_isolates = 396581874576, prev = {charpos = 396581874208, type = 2612068992, orig_type = 370}, last_strong = {charpos = 396581874592, type = 144, orig_type = 0}, next_for_neutral = {charpos = 2, type = 2683116576, orig_type = 370}, prev_for_neutral = {charpos = 1591821021280, type = 1554490314, orig_type = 32759}, next_for_ws = {charpos = 396581874420, type = 1444883216, orig_type = 92}, bracket_pairing_pos = 36562, bracket_enclosed_type = 1, next_en_pos = 2, next_en_type = 1, sos = 0, scan_dir = -1682898304, disp_pos = 396581874576, disp_prop = 1444883360, stack_idx = 92, level_stack = {{next_for_neutral_pos = 144, next_for_neutral_type = 2, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700395753280, next_for_neutral_type = 2, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700388140889, next_for_neutral_type = 0, last_strong_type = 3, prev_for_neutral_type = 0, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 1591749967872, next_for_neutral_type = 4, last_strong_type = 1, prev_for_neutral_type = 0, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 36560, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1589137899522, next_for_neutral_type = 0, last_strong_type = 7, prev_for_neutral_type = 6, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 1591794646976, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 1591821021280, next_for_neutral_type = 0, last_strong_type = 3, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 6, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 1591749968704, next_for_neutral_type = 1, last_strong_type = 5, prev_for_neutral_type = 7, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 396581874576, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 6, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 140700387941467, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 396581874632, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 2, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 144, next_for_neutral_type = 2, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 5, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 396581874576, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 6, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 144, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 5, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 140700394167895, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 6, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 140700388141172, next_for_neutral_type = 4, last_strong_type = 6, prev_for_neutral_type = 3, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 1 '\001', flags = 0 '\000'}, {next_for_neutral_pos = 1592189124608, next_for_neutral_type = 2, last_strong_type = 0, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 1592338882560, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 1592338939904, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591749968056, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 1592190022552, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700388237555, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 5, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700388168699, next_for_neutral_type = 0, last_strong_type = 3, prev_for_neutral_type = 1, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 140700394191526, next_for_neutral_type = 0, last_strong_type = 1, prev_for_neutral_type = 7, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 1592189124608, next_for_neutral_type = 2, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591821016096, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 7, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 1592338874368, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591794558176, next_for_neutral_type = 0, last_strong_type = 6, prev_for_neutral_type = 1, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 1591821016096, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700388243603, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 5, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 140700394176119, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581874824, next_for_neutral_type = 0, last_strong_type = 6, prev_for_neutral_type = 1, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 1591749967872, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591821016096, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 7, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 1592338874368, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700388281272, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 144, next_for_neutral_type = 0, last_strong_type = 5, prev_for_neutral_type = 3, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 1591749967872, next_for_neutral_type = 0, last_strong_type = 6, prev_for_neutral_type = 1, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 140700387998037, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 2, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 1591794558176, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 6, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700395717344, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700388183487, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 6, prev_for_neutral_type = 1, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 1591821016096, next_for_neutral_type = 0, last_strong_type = 3, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591794558176, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 3, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 1591794557584, next_for_neutral_type = 0, last_strong_type = 5, prev_for_neutral_type = 1, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 8935141660971499518, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 3, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 1591821016096, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 2, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700388184326, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 7, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 396581875312, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591821016096, next_for_neutral_type = 6, last_strong_type = 6, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591821016096, next_for_neutral_type = 2, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = -1, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700388359369, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 7, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 8192, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 2, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 1591794563232, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 7, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 1592338874368, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 7, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700388404731, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581896088, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385952188, next_for_neutral_type = 0, last_strong_type = 6, prev_for_neutral_type = 1, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1592338882560, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 26 '\032', flags = 0 '\000'}, {next_for_neutral_pos = 4294969347, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 102 'f', flags = 0 '\000'}, {next_for_neutral_pos = 1591821016096, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 0, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 0, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 5, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 114877, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 1 '\001', flags = 0 '\000'}, {next_for_neutral_pos = 8589934593, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 102, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 5, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 140700385943452, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581896088, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581896088, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 4, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 4, next_for_neutral_type = 0, last_strong_type = 5, prev_for_neutral_type = 5, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385952675, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 4294967295, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 2, last_strong_type = 4, prev_for_neutral_type = 3, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 115936, next_for_neutral_type = 2, last_strong_type = 1, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591821016096, next_for_neutral_type = 0, last_strong_type = 1, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581899096, next_for_neutral_type = 6, last_strong_type = 4, prev_for_neutral_type = 2, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 396581899096, next_for_neutral_type = 7, last_strong_type = 2, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 150087, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 255 'ÿ', flags = 255 'ÿ'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 3, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 4, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385948840, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 1591821015952, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 7, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700388019455, next_for_neutral_type = 0, last_strong_type = 1, prev_for_neutral_type = 6, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 15232, next_for_neutral_type = 0, last_strong_type = 6, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 396581899096, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581899096, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 3, prev_for_neutral_type = 5, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 4, next_for_neutral_type = 0, last_strong_type = 5, prev_for_neutral_type = 5, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385949579, next_for_neutral_type = 0, last_strong_type = 3, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700388199204, next_for_neutral_type = 0, last_strong_type = 6, prev_for_neutral_type = 1, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 1591794563232, next_for_neutral_type = 0, last_strong_type = 3, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591749967872, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 3, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 24, next_for_neutral_type = 0, last_strong_type = 7, prev_for_neutral_type = 7, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 1591794563232, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700388364587, next_for_neutral_type = 0, last_strong_type = 3, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581875960, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 4, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 3, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591749967872, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 4, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700388365131, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 1591749967872, next_for_neutral_type = 3, last_strong_type = 0, prev_for_neutral_type = 2, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 1592338874240, next_for_neutral_type = 0, last_strong_type = 3, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 7, prev_for_neutral_type = 7, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 5, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1592339201131, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 2, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 4611686019484352512, next_for_neutral_type = 3, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387185596, next_for_neutral_type = 0, last_strong_type = 1, prev_for_neutral_type = 6, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 1591944417115, next_for_neutral_type = 1, last_strong_type = 4, prev_for_neutral_type = 3, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 115923, next_for_neutral_type = 3, last_strong_type = 2, prev_for_neutral_type = 3, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 150087, next_for_neutral_type = 4, last_strong_type = 2, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}}, string = {lstring = 0x172becffb80, s = 0x6628 <error: Cannot access memory at address 0x6628>, schars = 140700387271263, bufpos = 20, from_disp_str = 0, unibyte = 0}, w = 0x172becff8ac, paragraph_dir = 2664132496, separator_limit = 1, first_elt = 0, new_paragraph = 0, frame_window_p = 0}, paragraph_embedding = 0, min_width_property = 0x172bed013d3, min_width_start = 47488}
        ppos_it = {window = 0x6, w = 0x172ba0a7a95, f = 0x2, method = 2, stop_charpos = 2, prev_stop = 2, base_level_stop = 0, end_charpos = 0, medium_narrowing_begv = 396581866613, medium_narrowing_zv = 1592103462784, large_narrowing_begv = 1, large_narrowing_zv = 1, s = 0x382d46545520 <error: Cannot access memory at address 0x382d46545520>, string_nchars = 2, multibyte_p = 0, tab_line_p = 1, header_line_p = 1, string_from_display_prop_p = 0, string_from_prefix_prop_p = 1, from_disp_prop_p = 0, ellipsis_p = 1, avoid_cursor_p = 1, dp = 0x172b0c2e7f8, dpvec = 0x0, dpend = 0x2, dpvec_char_len = 1, dpvec_face_id = 0, saved_face_id = 0, ctl_chars = {0x172ba0a72d0, 0x0, 0x172b0c2e780, 0x0, 0xffffffffffffffff, 0x5c561f0c80, 0x0, 0x0, 0x5, 0x172ba0a72d7, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0}, start = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 97222694415909, string_pos = {charpos = 0, bytepos = 400559594272}, dpvec_index = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, n_overlay_strings = 0, overlay_strings_charpos = 0, overlay_strings = {0x0 <repeats 16 times>}, string_overlays = {0x0 <repeats 16 times>}, string = 0x0, from_overlay = 0x0, stack = {{string = 0x0, string_nchars = 0, end_charpos = 1591942421253, stop_charpos = 114331, prev_stop = 0, base_level_stop = 140700387182868, cmp_it = {stop_pos = 0, id = 140700387188225, ch = 0, rule_idx = 0, lookback = 114330, nglyphs = 1553534240, reversed_p = 247, parent_it = 0x0, charpos = 1591953717605, nchars = 114331, nbytes = 0, from = 0, to = 0, width = 31920}, face_id = -1479149211, u = {image = {object = 0x1be9b, slice = {x = 0x7ff75c9920b1 <Ftext_properties_at+33>, y = 0x0, width = 0x7ff75c990914 <balance_possible_root_interval.lto_priv.0+20>, height = 0x0}, image_id = 1591953717605}, stretch = {object = 0x1be9b}, xwidget = {object = 0x1be9b}}, position = {charpos = 114331, bytepos = 140700387195690}, current = {pos = {charpos = 457326, bytepos = 140700387183904}, overlay_string_index = 0, string_pos = {charpos = 1591953717605, bytepos = 114102}, dpvec_index = 1444876016}, from_overlay = 0x172a7299b05, area = 114331, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 1553533204, voffset = 32759, space_width = 0x7cb0, font_height = 0x172be858d43}, {string = 0x172be86c993, string_nchars = 1056964608, end_charpos = 114330, stop_charpos = 1592288810304, prev_stop = 457410, base_level_stop = 114352, cmp_it = {stop_pos = 1591953717605, id = 1592288761664, ch = 457410, rule_idx = 0, lookback = 457326, nglyphs = 1553539777, reversed_p = 247, parent_it = 0x0, charpos = 140700387189778, nchars = 31920, nbytes = 0, from = 0, to = 0, width = 114331}, face_id = 31920, u = {image = {object = 0x0, slice = {x = 0x7ff75cad7280 <current_thread>, y = 0x1beb0, width = 0x0, height = 0x6fa6e}, image_id = 1591944417115}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 480, bytepos = 12884901888}, overlay_string_index = 0, string_pos = {charpos = 456410, bytepos = 0}, dpvec_index = -1478525339}, from_overlay = 0x1beb0, area = 457410, method = 0, paragraph_embedding = 1554870912, multibyte_p = 1, string_from_display_prop_p = 1, string_from_prefix_prop_p = 1, display_ellipsis_p = 0, avoid_cursor_p = 1, bidi_p = 1, from_disp_prop_p = 1, line_wrap = 1, voffset = 0, space_width = 0x0, font_height = 0x7ff75c7c9003 <compute_display_string_pos+547>}, {string = 0x0, string_nchars = 457410, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 114102, lookback = 4294967296, nglyphs = 1444876448, reversed_p = 92, parent_it = 0x1bdb6, charpos = 114104, nchars = 0, nbytes = 0, from = 114102, to = 0, width = 1444925528}, face_id = 114102, u = {image = {object = 0x5c561fc848, slice = {x = 0x5c561fc850, y = 0x24a47, width = 0x1bdb8, height = 0x1}, image_id = 140700385921064}, stretch = {object = 0x5c561fc848}, xwidget = {object = 0x5c561fc848}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 396581914704, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x1bdb6, area = 114104, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 1444923272, voffset = 92, space_width = 0x0, font_height = 0x1bdb6}, {string = 0x0, string_nchars = 0, end_charpos = 114102, stop_charpos = 140700388520576, prev_stop = 0, base_level_stop = 140700385933944, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 396581916760, nglyphs = -1478525344, reversed_p = 114, parent_it = 0x1, charpos = 396581914536, nchars = 1444923296, nbytes = 92, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x5c561fc788}, image_id = 1}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = -1}, current = {pos = {charpos = 0, bytepos = 140700385944126}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x40, string_nchars = -944204928, end_charpos = 0, stop_charpos = 64, prev_stop = 396581868464, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = -4294967296, nglyphs = 16711683, reversed_p = false, parent_it = 0x5c00000000, charpos = 96, nchars = -1667228224, nbytes = 370, from = 8, to = 0, width = 0}, face_id = -1667234752, u = {image = {object = 0x5c561f1330, slice = {x = 0x5c561f1330, y = 0x5c561f1340, width = 0x5c561f1340, height = 0x0}, image_id = 0}, stretch = {object = 0x5c561f1330}, xwidget = {object = 0x5c561f1330}}, position = {charpos = 396581868384, bytepos = 396581868384}, current = {pos = {charpos = 0, bytepos = 388694112}, overlay_string_index = 0, string_pos = {charpos = 114133, bytepos = 96}, dpvec_index = 0}, from_overlay = 0x1bdd4, area = 1444920656, method = 92, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x1729ca00380, font_height = 0x1729ca00014}}, sp = 0, selective = 1591765630976, what = 85, face_id = 0, selective_display_ellipsis_p = 0, ctl_arrow_p = 0, face_box_p = 0, start_of_box_run_p = 0, end_of_box_run_p = 1, overlay_strings_at_end_processed_p = 1, ignore_overlay_strings_at_pos_p = 1, glyph_not_available_p = 0, starts_in_middle_of_char_p = 0, face_before_selective_p = 1, constrain_row_ascent_descent_p = 1, line_number_produced_p = 0, align_visually_p = 1, line_wrap = 92, base_face_id = -1286524872, c = 370, len = 4, cmp_it = {stop_pos = 26152, id = 140700387185825, ch = 12656, rule_idx = 47244640256, lookback = 47244640257, nglyphs = 1, reversed_p = false, parent_it = 0x81, charpos = 4, nchars = 4, nbytes = 0, from = -1, to = -1, width = 1444877712}, char_to_display = 1444877704, glyphless_method = 92, image_id = 1592259179620, xwidget = 0x1729ecb6f90, slice = {x = 0x1, y = 0x7ff75c99c29f <find_composition+63>, width = 0x172b3513060, height = 0x110006000000000}, space_width = 0xe0003004f, voffset = 0, tab_width = 0, font_height = 0x5c561f1588, object = 0x4, position = {charpos = 4, bytepos = 4}, truncation_pixel_width = -1, continuation_pixel_width = -1, first_visible_x = -1, last_visible_x = -1173687196, last_visible_y = 370, extra_line_spacing = 1444877720, max_extra_line_spacing = 92, override_ascent = -1630834800, override_descent = 370, override_boff = -1667235840, glyph_row = 0x172b3516170, area = 6, nglyphs = 0, pixel_width = -944429723, ascent = 32763, descent = 1435107328, max_ascent = 92, max_descent = 589954, phys_ascent = 107, phys_descent = 524442, max_phys_ascent = 107, max_phys_descent = 0, current_x = 0, wrap_prefix_width = 6, continuation_lines_width = 0, eol_pos = {charpos = 1592339196536, bytepos = 1}, current_y = -1667235520, first_vpos = 370, vpos = 0, hpos = 0, lnum = 140700387883709, lnum_bytepos = 1591942420616, lnum_width = -1606300752, lnum_pixel_width = 370, pt_lnum = 85, stretch_adjust = 1552835298, left_user_fringe_bitmap = 32759, right_user_fringe_bitmap = 0, left_user_fringe_face_id = 0, right_user_fringe_face_id = 0, bidi_p = 0, bidi_it = {bytepos = 6, charpos = 6, ch = 1444878176, nchars = 0, ch_len = 140700386494681, type = 2, type_after_wn = 0, orig_type = 4294967295, resolved_level = -1 'ÿ', isolate_level = -1 'ÿ', invalid_levels = 396581869408, invalid_isolates = 6, prev = {charpos = 1592259148437, type = 0, orig_type = 0}, last_strong = {charpos = 832, type = 6, orig_type = 0}, next_for_neutral = {charpos = 1592339196540, type = 1552990242, orig_type = 32759}, prev_for_neutral = {charpos = 1591765630976, type = 0, orig_type = 0}, next_for_ws = {charpos = 1592146354544, type = 3201296616, orig_type = 370}, bracket_pairing_pos = 395136991232, bracket_enclosed_type = 1444878152, next_en_pos = 0, next_en_type = 1554234045, sos = 32759, scan_dir = -1173720366, disp_pos = 22318, disp_prop = 0, stack_idx = 0, level_stack = {{next_for_neutral_pos = 832, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 5, next_for_neutral_type = 5, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1592146354544, next_for_neutral_type = 2, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700386494464, next_for_neutral_type = 3, last_strong_type = 6, prev_for_neutral_type = 5, level = 255 'ÿ', flags = 255 'ÿ'}, {next_for_neutral_pos = 0, next_for_neutral_type = 5, last_strong_type = 2, prev_for_neutral_type = 2, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 1592146354624, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 1591826566068, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 2, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700386639872, next_for_neutral_type = 0, last_strong_type = 3, prev_for_neutral_type = 6, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 255 'ÿ', flags = 255 'ÿ'}, {next_for_neutral_pos = 396581869408, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 6, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1592259148437, next_for_neutral_type = 2, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2, next_for_neutral_type = 2, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 5, last_strong_type = 6, prev_for_neutral_type = 0, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 1592103473792, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 4, level = 45 '-', flags = 56 '8'}, {next_for_neutral_pos = 2, next_for_neutral_type = 6, last_strong_type = 2, prev_for_neutral_type = 3, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 1592103473912, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 3, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 2, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 255 'ÿ', flags = 255 'ÿ'}, {next_for_neutral_pos = 396581869632, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 5, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1592259146455, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 5, last_strong_type = 4, prev_for_neutral_type = 0, level = 108 'l', flags = 88 'X'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 4, level = 93 ']', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581895848, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 34629, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 4, last_strong_type = 0, prev_for_neutral_type = 5, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 4, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385933944, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581895928, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 115937, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 3, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 4, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385933944, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385933944, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 1, prev_for_neutral_type = 7, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 1591954341472, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 396581895960, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 4, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = -1, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581896088, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 115937, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 3, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 4, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385933944, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385944126, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385944126, next_for_neutral_type = 0, last_strong_type = 5, prev_for_neutral_type = 1, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 1591954341472, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581896120, next_for_neutral_type = 0, last_strong_type = 6, prev_for_neutral_type = 6, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387956829, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 3, prev_for_neutral_type = 6, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = -1, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385944126, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591749971224, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 1, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700387929744, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 1, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700388108361, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 2, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700387956829, next_for_neutral_type = 0, last_strong_type = 6, prev_for_neutral_type = 5, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 140700387931152, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591749971224, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 1, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700387929744, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 1, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700388108361, next_for_neutral_type = 0, last_strong_type = 6, prev_for_neutral_type = 2, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700387956829, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 7, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 140700387956829, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591749971184, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387956829, next_for_neutral_type = 0, last_strong_type = 3, prev_for_neutral_type = 7, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 396581871072, next_for_neutral_type = 0, last_strong_type = 6, prev_for_neutral_type = 5, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 140700387956829, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 1591749971184, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591749971224, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 7, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700387929744, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 7, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700388108361, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 2, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700387956829, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 1, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 140700387931152, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591749971184, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700388108600, next_for_neutral_type = 0, last_strong_type = 7, prev_for_neutral_type = 1, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 396581871232, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387956829, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 1591749971184, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1592338751488, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700388122459, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 1, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700387956829, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 1, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 140700387931152, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 7, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 1591749968552, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 7, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700387929744, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 7, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700388108361, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 1, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700387956829, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 396581870864, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591749968512, next_for_neutral_type = 0, last_strong_type = 6, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700388108600, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700388092925, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 1, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 1591797094048, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591749968512, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591821013936, next_for_neutral_type = 0, last_strong_type = 6, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700388122459, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 1591749968552, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 7, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700387930976, next_for_neutral_type = 0, last_strong_type = 1, prev_for_neutral_type = 3, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 1591794646976, next_for_neutral_type = 2, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387957669, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 1, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 36530, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 396581871568, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 1, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 1591749968512, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 7, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 144, next_for_neutral_type = 2, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591821013936, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 1, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700388139978, next_for_neutral_type = 4, last_strong_type = 6, prev_for_neutral_type = 4, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 396581871440, next_for_neutral_type = 4, last_strong_type = 6, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 2, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 2, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 396581871568, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 7, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 144, next_for_neutral_type = 2, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700395753280, next_for_neutral_type = 2, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700388140889, next_for_neutral_type = 0, last_strong_type = 3, prev_for_neutral_type = 1, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 1591749967872, next_for_neutral_type = 4, last_strong_type = 1, prev_for_neutral_type = 1, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 36530, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}}, string = {lstring = 0x17200000002, s = 0x7ff75d039db8 <gdb_make_enums_visible+124> "arena.c", schars = 1591794646976, bufpos = 1591821013936, from_disp_str = 0, unibyte = 0}, w = 0x31c, paragraph_dir = 764, separator_limit = 7932, first_elt = 0, new_paragraph = 0, frame_window_p = 1}, paragraph_embedding = 2960, min_width_property = 0x1e1c, min_width_start = 7884}
        wrap_data = <optimized out>
        atpos_data = 0x0
        atx_data = <optimized out>
        ppos_data = <optimized out>
        may_wrap = <optimized out>
        prev_method = <optimized out>
        closest_pos = <optimized out>
        prev_pos = <optimized out>
        saw_smaller_pos = <optimized out>
        line_number_pending = <optimized out>
        this_line_subject_to_line_prefix = <optimized out>
#26 0x00007ff75c7d2d17 in move_it_to (it=it@entry=0x5c561f8120, to_charpos=150087, to_x=<optimized out>, to_x@entry=-1, to_y=<optimized out>, to_vpos=<optimized out>, to_vpos@entry=-1, op=<optimized out>, op@entry=10) at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:10833
        it_backup = {window = 0x172a7df7e65, w = 0x172a7df7e60, f = 0x1729ecb6f90, method = 0, stop_charpos = 113912, prev_stop = 113890, base_level_stop = 113890, end_charpos = 150087, medium_narrowing_begv = 0, medium_narrowing_zv = 0, large_narrowing_begv = 0, large_narrowing_zv = 0, s = 0x0, string_nchars = 0, multibyte_p = 1, tab_line_p = 0, header_line_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, from_disp_prop_p = 0, ellipsis_p = 0, avoid_cursor_p = 0, dp = 0x172a7299888, dpvec = 0x0, dpend = 0x172bb642038, dpvec_char_len = 1, dpvec_face_id = -1, saved_face_id = 26, ctl_chars = {0x0 <repeats 16 times>}, start = {pos = {charpos = 112618, bytepos = 112620}, overlay_string_index = -1, string_pos = {charpos = -1, bytepos = -1}, dpvec_index = -1}, current = {pos = {charpos = 113890, bytepos = 113892}, overlay_string_index = -1, string_pos = {charpos = -1, bytepos = -1}, dpvec_index = -1}, n_overlay_strings = 0, overlay_strings_charpos = 113890, overlay_strings = {0x0 <repeats 16 times>}, string_overlays = {0x0 <repeats 16 times>}, string = 0x0, from_overlay = 0x0, stack = {{string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}}, sp = 0, selective = 0, what = 0, face_id = 44, selective_display_ellipsis_p = 1, ctl_arrow_p = 1, face_box_p = 0, start_of_box_run_p = 0, end_of_box_run_p = 0, overlay_strings_at_end_processed_p = 0, ignore_overlay_strings_at_pos_p = 0, glyph_not_available_p = 0, starts_in_middle_of_char_p = 0, face_before_selective_p = 0, constrain_row_ascent_descent_p = 0, line_number_produced_p = 0, align_visually_p = 0, line_wrap = 1, base_face_id = 0, c = 32, len = 1, cmp_it = {stop_pos = 113916, id = -1, ch = 45, rule_idx = 0, lookback = 0, nglyphs = 3, reversed_p = false, parent_it = 0x5c561f9510, charpos = 113123, nchars = 1, nbytes = 1, from = 2, to = 3, width = 1}, char_to_display = 32, glyphless_method = 0, image_id = 0, xwidget = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, space_width = 0x0, voffset = 0, tab_width = 2, font_height = 0x0, object = 0x172a7d5f965, position = {charpos = 113890, bytepos = 113892}, truncation_pixel_width = 0, continuation_pixel_width = 8, first_visible_x = 0, last_visible_x = 1272, last_visible_y = 1328, extra_line_spacing = 0, max_extra_line_spacing = 0, override_ascent = -1, override_descent = 0, override_boff = 0, glyph_row = 0x172d16c7000, area = 1, nglyphs = 1, pixel_width = 8, ascent = 13, descent = 3, max_ascent = 13, max_descent = 3, phys_ascent = 0, phys_descent = 1, max_phys_ascent = 13, max_phys_descent = 3, current_x = 0, wrap_prefix_width = 0, continuation_lines_width = 0, eol_pos = {charpos = 0, bytepos = 0}, current_y = 416, first_vpos = 0, vpos = 26, hpos = 0, lnum = 3128, lnum_bytepos = 113847, lnum_width = 4, lnum_pixel_width = 48, pt_lnum = 3136, stretch_adjust = 0, left_user_fringe_bitmap = 0, right_user_fringe_bitmap = 0, left_user_fringe_face_id = 0, right_user_fringe_face_id = 0, bidi_p = 1, bidi_it = {bytepos = 113892, charpos = 113890, ch = 32, nchars = 1, ch_len = 1, type = 1, type_after_wn = 22, orig_type = 22, resolved_level = 0 '\000', isolate_level = 0 '\000', invalid_levels = 0, invalid_isolates = 0, prev = {charpos = 113889, type = 6, orig_type = 6}, last_strong = {charpos = 113888, type = 0, orig_type = 0}, next_for_neutral = {charpos = -1, type = 0, orig_type = 0}, prev_for_neutral = {charpos = 113889, type = 1, orig_type = 1}, next_for_ws = {charpos = 113912, type = 23, orig_type = 0}, bracket_pairing_pos = -1, bracket_enclosed_type = 0, next_en_pos = 0, next_en_type = 0, sos = 1, scan_dir = 1, disp_pos = 114123, disp_prop = 0, stack_idx = 0, level_stack = {{next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'} <repeats 128 times>}, string = {lstring = 0x0, s = 0x0, schars = 0, bufpos = 0, from_disp_str = 0, unibyte = 0}, w = 0x172a7df7e60, paragraph_dir = 1, separator_limit = 113376, first_elt = 0, new_paragraph = 0, frame_window_p = 1}, paragraph_embedding = 1, min_width_property = 0x0, min_width_start = 0}
        skip = <optimized out>
        skip2 = <optimized out>
        line_height = <optimized out>
        line_start_x = 0
        reached = 0
        max_current_x = 1064
        backup_data = 0x0
#27 0x00007ff75c7d384c in partial_line_height (it_origin=<optimized out>) at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:11465
        partial_height = <optimized out>
        it_data = 0x0
        it = {window = 0x172a7df7e65, w = 0x172a7df7e60, f = 0x1729ecb6f90, method = 0, stop_charpos = 113994, prev_stop = 113984, base_level_stop = 113984, end_charpos = 150087, medium_narrowing_begv = 0, medium_narrowing_zv = 0, large_narrowing_begv = 0, large_narrowing_zv = 0, s = 0x0, string_nchars = 0, multibyte_p = 1, tab_line_p = 0, header_line_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, from_disp_prop_p = 0, ellipsis_p = 0, avoid_cursor_p = 0, dp = 0x172a7299888, dpvec = 0x0, dpend = 0x172bb642038, dpvec_char_len = 1, dpvec_face_id = -1, saved_face_id = 44, ctl_chars = {0x0 <repeats 16 times>}, start = {pos = {charpos = 112618, bytepos = 112620}, overlay_string_index = -1, string_pos = {charpos = -1, bytepos = -1}, dpvec_index = -1}, current = {pos = {charpos = 113988, bytepos = 113990}, overlay_string_index = -1, string_pos = {charpos = -1, bytepos = -1}, dpvec_index = -1}, n_overlay_strings = 0, overlay_strings_charpos = 113984, overlay_strings = {0x0 <repeats 16 times>}, string_overlays = {0x0 <repeats 16 times>}, string = 0x0, from_overlay = 0x0, stack = {{string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}}, sp = 0, selective = 0, what = 0, face_id = 0, selective_display_ellipsis_p = 1, ctl_arrow_p = 1, face_box_p = 0, start_of_box_run_p = 0, end_of_box_run_p = 0, overlay_strings_at_end_processed_p = 0, ignore_overlay_strings_at_pos_p = 0, glyph_not_available_p = 0, starts_in_middle_of_char_p = 0, face_before_selective_p = 0, constrain_row_ascent_descent_p = 0, line_number_produced_p = 1, align_visually_p = 0, line_wrap = 1, base_face_id = 0, c = 41, len = 1, cmp_it = {stop_pos = 113988, id = -1, ch = 41, rule_idx = 0, lookback = 0, nglyphs = 3, reversed_p = false, parent_it = 0x5c561f9510, charpos = 113123, nchars = 1, nbytes = 1, from = 2, to = 3, width = 1}, char_to_display = 41, glyphless_method = 0, image_id = 0, xwidget = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, space_width = 0x0, voffset = 0, tab_width = 2, font_height = 0x0, object = 0x172a7d5f965, position = {charpos = 113987, bytepos = 113989}, truncation_pixel_width = 0, continuation_pixel_width = 8, first_visible_x = 0, last_visible_x = 1272, last_visible_y = 1328, extra_line_spacing = 0, max_extra_line_spacing = 0, override_ascent = -1, override_descent = 0, override_boff = 0, glyph_row = 0x0, area = 1, nglyphs = 1, pixel_width = 8, ascent = 13, descent = 3, max_ascent = 13, max_descent = 3, phys_ascent = 11, phys_descent = 1, max_phys_ascent = 13, max_phys_descent = 3, current_x = 832, wrap_prefix_width = 0, continuation_lines_width = 0, eol_pos = {charpos = 0, bytepos = 0}, current_y = 416, first_vpos = 0, vpos = 26, hpos = 104, lnum = 3129, lnum_bytepos = 113892, lnum_width = 4, lnum_pixel_width = 48, pt_lnum = 3136, stretch_adjust = 0, left_user_fringe_bitmap = 0, right_user_fringe_bitmap = 0, left_user_fringe_face_id = 0, right_user_fringe_face_id = 0, bidi_p = 1, bidi_it = {bytepos = 113990, charpos = 113988, ch = 41, nchars = 1, ch_len = 1, type = 1, type_after_wn = 23, orig_type = 23, resolved_level = 0 '\000', isolate_level = 0 '\000', invalid_levels = 0, invalid_isolates = 0, prev = {charpos = 113987, type = 23, orig_type = 23}, last_strong = {charpos = 113986, type = 1, orig_type = 1}, next_for_neutral = {charpos = -1, type = 0, orig_type = 0}, prev_for_neutral = {charpos = 113987, type = 1, orig_type = 23}, next_for_ws = {charpos = 113984, type = 1, orig_type = 0}, bracket_pairing_pos = -1, bracket_enclosed_type = 0, next_en_pos = 0, next_en_type = 0, sos = 1, scan_dir = 1, disp_pos = 114123, disp_prop = 0, stack_idx = 0, level_stack = {{next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'} <repeats 128 times>}, string = {lstring = 0x0, s = 0x0, schars = 0, bufpos = 0, from_disp_str = 0, unibyte = 0}, w = 0x172a7df7e60, paragraph_dir = 1, separator_limit = 113376, first_elt = 0, new_paragraph = 0, frame_window_p = 1}, paragraph_embedding = 1, min_width_property = 0x0, min_width_start = 0}
#28 0x00007ff75c7e3b55 in try_window (window=window@entry=0x172a7df7e65, pos=..., flags=<optimized out>, flags@entry=1) at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:21292
        top_scroll_margin = <optimized out>
        bot_scroll_margin = 80
        w = 0x172a7df7e60
        it = {window = 0x172a7df7e65, w = 0x172a7df7e60, f = 0x1729ecb6f90, method = 0, stop_charpos = 112641, prev_stop = 112618, base_level_stop = 0, end_charpos = 150087, medium_narrowing_begv = 0, medium_narrowing_zv = 0, large_narrowing_begv = 0, large_narrowing_zv = 0, s = 0x0, string_nchars = 0, multibyte_p = 1, tab_line_p = 0, header_line_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, from_disp_prop_p = 0, ellipsis_p = 0, avoid_cursor_p = 0, dp = 0x172a7299888, dpvec = 0x0, dpend = 0x0, dpvec_char_len = 0, dpvec_face_id = 0, saved_face_id = 0, ctl_chars = {0x0 <repeats 16 times>}, start = {pos = {charpos = 112618, bytepos = 112620}, overlay_string_index = -1, string_pos = {charpos = -1, bytepos = -1}, dpvec_index = -1}, current = {pos = {charpos = 112618, bytepos = 112620}, overlay_string_index = -1, string_pos = {charpos = -1, bytepos = -1}, dpvec_index = -1}, n_overlay_strings = 0, overlay_strings_charpos = 112618, overlay_strings = {0x0 <repeats 16 times>}, string_overlays = {0x0 <repeats 16 times>}, string = 0x0, from_overlay = 0x0, stack = {{string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}}, sp = 0, selective = 0, what = 0, face_id = 44, selective_display_ellipsis_p = 1, ctl_arrow_p = 1, face_box_p = 0, start_of_box_run_p = 0, end_of_box_run_p = 0, overlay_strings_at_end_processed_p = 0, ignore_overlay_strings_at_pos_p = 0, glyph_not_available_p = 0, starts_in_middle_of_char_p = 0, face_before_selective_p = 0, constrain_row_ascent_descent_p = 0, line_number_produced_p = 0, align_visually_p = 0, line_wrap = 1, base_face_id = 0, c = 32, len = 0, cmp_it = {stop_pos = 112648, id = -1, ch = 58, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x5c561f9510, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, char_to_display = 0, glyphless_method = 0, image_id = 0, xwidget = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, space_width = 0x0, voffset = 0, tab_width = 2, font_height = 0x0, object = 0x172a7d5f965, position = {charpos = 112618, bytepos = 112620}, truncation_pixel_width = 0, continuation_pixel_width = 8, first_visible_x = 0, last_visible_x = 1272, last_visible_y = 1328, extra_line_spacing = 0, max_extra_line_spacing = 0, override_ascent = -1, override_descent = 0, override_boff = 0, glyph_row = 0x172d16c7000, area = 1, nglyphs = 1, pixel_width = 0, ascent = 0, descent = 0, max_ascent = 0, max_descent = 0, phys_ascent = 0, phys_descent = 0, max_phys_ascent = 0, max_phys_descent = 0, current_x = 0, wrap_prefix_width = 0, continuation_lines_width = 0, eol_pos = {charpos = 0, bytepos = 0}, current_y = 0, first_vpos = 0, vpos = 0, hpos = 0, lnum = 0, lnum_bytepos = 0, lnum_width = 0, lnum_pixel_width = 0, pt_lnum = 0, stretch_adjust = 0, left_user_fringe_bitmap = 0, right_user_fringe_bitmap = 0, left_user_fringe_face_id = 0, right_user_fringe_face_id = 0, bidi_p = 1, bidi_it = {bytepos = 112620, charpos = 112618, ch = 0, nchars = -1, ch_len = 0, type = 6, type_after_wn = 6, orig_type = 6, resolved_level = 0 '\000', isolate_level = 0 '\000', invalid_levels = 0, invalid_isolates = 0, prev = {charpos = 0, type = 0, orig_type = 0}, last_strong = {charpos = 0, type = 0, orig_type = 0}, next_for_neutral = {charpos = -1, type = 0, orig_type = 0}, prev_for_neutral = {charpos = -1, type = 0, orig_type = 0}, next_for_ws = {charpos = 0, type = 0, orig_type = 0}, bracket_pairing_pos = -1, bracket_enclosed_type = 0, next_en_pos = 0, next_en_type = 0, sos = 1, scan_dir = 0, disp_pos = -1, disp_prop = 0, stack_idx = 0, level_stack = {{next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'} <repeats 128 times>}, string = {lstring = 0x0, s = 0x0, schars = 0, bufpos = 0, from_disp_str = 0, unibyte = 0}, w = 0x172a7df7e60, paragraph_dir = 0, separator_limit = -1, first_elt = 1, new_paragraph = 1, frame_window_p = 1}, paragraph_embedding = 1, min_width_property = 0x0, min_width_start = 0}
        last_text_row = <optimized out>
        f = <optimized out>
        cursor_vpos = 33
        it_charpos = 115898
#29 0x00007ff75c7e98eb in redisplay_window (window=<optimized out>, just_this_one_p=just_this_one_p@entry=true) at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:20635
        d2 = 0
        d6 = 0
        d1 = 0
        d5 = 0
        rtop = 0
        rbot = 0
        w = 0x172a7df7e60
        f = <optimized out>
        buffer = <optimized out>
        old = <optimized out>
        lpoint = <optimized out>
        opoint = <optimized out>
        startp = <optimized out>
        update_mode_line = <optimized out>
        tem = <optimized out>
        it = {window = 0x0, w = 0x0, f = 0x0, method = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, end_charpos = 0, medium_narrowing_begv = 0, medium_narrowing_zv = 0, large_narrowing_begv = 0, large_narrowing_zv = 0, s = 0x0, string_nchars = 0, multibyte_p = 0, tab_line_p = 0, header_line_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, from_disp_prop_p = 0, ellipsis_p = 0, avoid_cursor_p = 0, dp = 0x0, dpvec = 0x0, dpend = 0x0, dpvec_char_len = 0, dpvec_face_id = 0, saved_face_id = 0, ctl_chars = {0x0 <repeats 16 times>}, start = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, n_overlay_strings = 0, overlay_strings_charpos = 0, overlay_strings = {0x0 <repeats 16 times>}, string_overlays = {0x0 <repeats 16 times>}, string = 0x0, from_overlay = 0x0, stack = {{string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 8589934595, nchars = 0, nbytes = 92, from = 1, to = 0, width = 0}, face_id = -1, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x5c561fbd60}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 92}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 262144, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 4294967295, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 55834574856, lookback = 55834574851, nglyphs = 3, reversed_p = 11, parent_it = 0xb00000001, charpos = 1, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}}, sp = 0, selective = 0, what = 0, face_id = 0, selective_display_ellipsis_p = 0, ctl_arrow_p = 0, face_box_p = 0, start_of_box_run_p = 0, end_of_box_run_p = 0, overlay_strings_at_end_processed_p = 0, ignore_overlay_strings_at_pos_p = 0, glyph_not_available_p = 0, starts_in_middle_of_char_p = 0, face_before_selective_p = 0, constrain_row_ascent_descent_p = 0, line_number_produced_p = 0, align_visually_p = 0, line_wrap = 0, base_face_id = 0, c = 0, len = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, char_to_display = 0, glyphless_method = 0, image_id = 0, xwidget = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, space_width = 0x0, voffset = 0, tab_width = 0, font_height = 0x0, object = 0x0, position = {charpos = 0, bytepos = 0}, truncation_pixel_width = 0, continuation_pixel_width = 0, first_visible_x = 0, last_visible_x = 0, last_visible_y = 0, extra_line_spacing = 0, max_extra_line_spacing = 0, override_ascent = 0, override_descent = 0, override_boff = 0, glyph_row = 0x0, area = 0, nglyphs = 0, pixel_width = 0, ascent = 0, descent = 0, max_ascent = 0, max_descent = 0, phys_ascent = 0, phys_descent = 0, max_phys_ascent = 0, max_phys_descent = 0, current_x = 0, wrap_prefix_width = 0, continuation_lines_width = 0, eol_pos = {charpos = 0, bytepos = 0}, current_y = 0, first_vpos = 0, vpos = 0, hpos = 0, lnum = 0, lnum_bytepos = 0, lnum_width = 0, lnum_pixel_width = 0, pt_lnum = 0, stretch_adjust = 0, left_user_fringe_bitmap = 0, right_user_fringe_bitmap = 0, left_user_fringe_face_id = 0, right_user_fringe_face_id = 0, bidi_p = 0, bidi_it = {bytepos = 0, charpos = 0, ch = 0, nchars = 0, ch_len = 0, type = 0, type_after_wn = 0, orig_type = 0, resolved_level = 0 '\000', isolate_level = 0 '\000', invalid_levels = 0, invalid_isolates = 0, prev = {charpos = 0, type = 0, orig_type = 0}, last_strong = {charpos = 0, type = 0, orig_type = 0}, next_for_neutral = {charpos = 0, type = 0, orig_type = 0}, prev_for_neutral = {charpos = 0, type = 0, orig_type = 0}, next_for_ws = {charpos = 0, type = 0, orig_type = 0}, bracket_pairing_pos = 0, bracket_enclosed_type = 0, next_en_pos = 0, next_en_type = 0, sos = 0, scan_dir = 0, disp_pos = 0, disp_prop = 0, stack_idx = 0, level_stack = {{next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'} <repeats 28 times>, {next_for_neutral_pos = 1, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581910944, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 6, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 36960, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581910936, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700386048478, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581910928, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 6, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581910936, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387188225, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 1, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 2, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 1, next_for_neutral_type = 6, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 36960, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 6, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 36960, next_for_neutral_type = 5, last_strong_type = 0, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700387189945, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 101, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 6, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581910944, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 6, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 36960, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581910936, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700386048363, next_for_neutral_type = 6, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581910864, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 6, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581910928, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 5, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 6, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 36960, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 0, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 0, last_strong_type = 5, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387188225, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591939739653, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581911488, next_for_neutral_type = 0, last_strong_type = 5, prev_for_neutral_type = 5, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 6, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387188913, next_for_neutral_type = 4, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591802032016, next_for_neutral_type = 0, last_strong_type = 7, prev_for_neutral_type = 2, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700387195690, next_for_neutral_type = 6, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385301446, next_for_neutral_type = 0, last_strong_type = 7, prev_for_neutral_type = 2, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 6, prev_for_neutral_type = 3, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 0, last_strong_type = 5, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387186428, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581911904, next_for_neutral_type = 0, last_strong_type = 5, prev_for_neutral_type = 5, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 2, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 1, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = -1, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 7, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 396581911512, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591939713720, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387230367, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387188225, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581911904, next_for_neutral_type = 0, last_strong_type = 3, prev_for_neutral_type = 7, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 2, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 1, next_for_neutral_type = 6, last_strong_type = 2, prev_for_neutral_type = 6, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581911904, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591939713720, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700385300495, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 0, level = 92 '\\', flags = 0 '\000'}, {next_for_neutral_pos = 320, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700394516608, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 6, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 2, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 1591802032016, next_for_neutral_type = 0, last_strong_type = 7, prev_for_neutral_type = 2, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385305268, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 2, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 396581911904, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 7, prev_for_neutral_type = 2, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 16, next_for_neutral_type = 0, last_strong_type = 7, prev_for_neutral_type = 2, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 16, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 6, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 140700385676633, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140719337968928, next_for_neutral_type = 0, last_strong_type = 7, prev_for_neutral_type = 2, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 16, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 6, last_strong_type = 0, prev_for_neutral_type = 2, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 0, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 6, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 396581911904, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1591939713720, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385425788, next_for_neutral_type = 1, last_strong_type = 3, prev_for_neutral_type = 0, level = 22 '\026', flags = 225 'á'}, {next_for_neutral_pos = 0, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 4294967295, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 396581911872, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 6, last_strong_type = 3, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1566, next_for_neutral_type = 5, last_strong_type = 7, prev_for_neutral_type = 2, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 1591939713720, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 6, level = 114 'r', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}}, string = {lstring = 0x0, s = 0x1 <error: Cannot access memory at address 0x1>, schars = 1592048046408, bufpos = 0, from_disp_str = 0, unibyte = 0}, w = 0x0, paragraph_dir = 0, separator_limit = 0, first_elt = 0, new_paragraph = 0, frame_window_p = 0}, paragraph_embedding = 0, min_width_property = 0x0, min_width_start = 0}
        current_matrix_up_to_date_p = <optimized out>
        used_current_matrix_p = false
        temp_scroll_step = false
        count = <optimized out>
        rc = <optimized out>
        centering_position = -1
        last_line_misfit = false
        beg_unchanged = <optimized out>
        end_unchanged = <optimized out>
        frame_line_height = <optimized out>
        margin = <optimized out>
        use_desired_matrix = <optimized out>
        itdata = 0x0
        lchars_modiff = <optimized out>
        ochars_modiff = <optimized out>
        force_start = <optimized out>
#30 0x00007ff75c7ebc4a in redisplay_window_1 (window=<optimized out>) at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:18126
No locals.
#31 0x00007ff75c908187 in internal_condition_case_1 (bfun=0x7ff75c7ebc10 <redisplay_window_1>, arg=0x172a7df7e65, handlers=<optimized out>, hfun=0x7ff75c7ddac0 <redisplay_window_error>) at D:/a/emacs-build/emacs-build/git/972842f/src/eval.c:1642
        val = <optimized out>
        c = 0x172a9f49080
#32 0x00007ff75c7e243c in redisplay_internal.lto_priv.0 () at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:17614
        mini_window = <optimized out>
        mini_frame = <optimized out>
        w = <optimized out>
        sw = <optimized out>
        fr = <optimized out>
        pending = false
        must_finish = <optimized out>
        match_p = <optimized out>
        tlbufpos = <optimized out>
        tlendpos = <optimized out>
        number_of_visible_frames = <optimized out>
        sf = <optimized out>
        polling_stopped_here = <optimized out>
        tail = <optimized out>
        frame = <optimized out>
        hscroll_retries = <optimized out>
        garbaged_frame_retries = <optimized out>
        consider_all_windows_p = <optimized out>
        update_miniwindow_p = <optimized out>
        count = <optimized out>
        retry = <optimized out>
        retry_frame = <optimized out>
#33 0x00007ff75c886b56 in read_char (commandflag=<optimized out>, map=<optimized out>, prev_event=<optimized out>, used_mouse_menu=<optimized out>, end_time=<optimized out>) at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:16661
        echo_current = true
        c = <optimized out>
        local_getcjmp = {{raw = {{Part = {396581923600, 1591953717600}}, {Part = {0, 1591953717605}}, {Part = {456510, 140700386580315}}, {Part = {456506, 140700387195690}}, {Part = {32648, 15232}}, {Part = {0, 140700394055432}}, {Part = {96, 140700388520576}}, {Part = {140700394055432, 96}}, {Part = {140700388520576, 50120}}, {Part = {1591953717605, 140700386687222}}, {Part = {140700394516608, 4611686019484352512}}, {Part = {3, 1}}, {Part = {150093, 0}}, {Part = {1592057489896, 140700394516608}}, {Part = {27, 140700386560573}}, {Part = {1, 140700394516608}}}, padding = 26}}
        save_jump = {{raw = {{Part = {18446604965304846920, 0}}, {Part = {41944, 1592207784971}}, {Part = {140700394516608, 4611686019484352512}}, {Part = {3, 1}}, {Part = {456510, 140700387185596}}, {Part = {114126, 1591944417115}}, {Part = {18446604965304842232, 1591953717605}}, {Part = {54656, 114127}}, {Part = {1591942421253, 114126}}, {Part = {1591953717600, 140700387182868}}, {Part = {140700394516608, 140700387188225}}, {Part = {1, 456506}}, {Part = {114125, 140700387183904}}, {Part = {456510, 54656}}, {Part = {114127, 1591953717600}}, {Part = {396581923600, 54656}}}, padding = 114127}}
        tem = <optimized out>
        save = <optimized out>
        previous_echo_area_message = 0x0
        also_record = 0x0
        reread = false
        recorded = false
        polling_stopped_here = false
        orig_kboard = <optimized out>
        retry = <optimized out>
        jmpcount = <optimized out>
        c_volatile = 0x172aa5fd05d
#34 0x00007ff75ca3f7eb in read_key_sequence.isra.0 () at D:/a/emacs-build/emacs-build/git/972842f/src/keyboard.c:10763
No locals.
#35 0x00007ff75c87ee9b in command_loop_1.lto_priv.0 () at D:/a/emacs-build/emacs-build/git/972842f/src/keyboard.c:1435
        cmd = <optimized out>
        keybuf = {0x1a2, 0x116, 0x1ca, 0x1729fa5f6b3, 0x5c561ff0e0, 0x0, 0x5c561ff0e0, 0x7ff75d090248 <current_kboard>, 0xc, 0x14318, 0x38, 0x172a729a14d, 0x1729c130330, 0x7ff75d08f080 <globals>, 0x1729fa5f6b3, 0x60, 0x5c561ff0e0, 0x7ff75d090248 <current_kboard>, 0x7ffbc50fe620 <ucrtbase!_umask>, 0x0, 0x1729c130330, 0x7ff75c8811bc <cmd_error.lto_priv.0+364>, 0x7ff75d082af0 <lispsym+51856>, 0x0, 0x0, 0x0, 0x7ff75cad7200 <main_thread+512>, 0x0, 0x172a06e3243, 0x0}
        i = <optimized out>
        last_pt = <optimized out>
        prev_modiff = 90321
        prev_buffer = 0x172a7d5f960
#36 0x00007ff75c9080d3 in internal_condition_case (bfun=0x7ff75c87ec20 <command_loop_1.lto_priv.0>, handlers=<optimized out>, hfun=0x7ff75c881050 <cmd_error.lto_priv.0>) at D:/a/emacs-build/emacs-build/git/972842f/src/eval.c:1618
        val = <optimized out>
        c = 0x172a1abd2b8
#37 0x00007ff75c87aee2 in command_loop_2 (handlers=0xa8) at D:/a/emacs-build/emacs-build/git/972842f/src/keyboard.c:1174
        val = <optimized out>
#38 0x00007ff75c907ff2 in internal_catch (tag=<optimized out>, func=0x7ff75c87aec0 <command_loop_2>, arg=0xa8) at D:/a/emacs-build/emacs-build/git/972842f/src/eval.c:1297
        val = <optimized out>
        c = 0x172a1abd138
#39 0x00007ff75c87ebac in command_loop.lto_priv.0 () at D:/a/emacs-build/emacs-build/git/972842f/src/keyboard.c:1152
No locals.
#40 0x0000000000000000 in ?? ()
No symbol table info available.
logging debugredirect:  off: Debug output will go to both the screen and the log file.
logging enabled:  on: Logging is enabled.
logging file:  The current logfile is "gdb.txt".
logging overwrite:  off: Logging appends to the log file.
logging redirect:  off: Output will go to both the screen and the log file.
Detaching from program: C:\Program Files\WindowsApps\emacs-k_31.313.0.0_x64__tewns1xw2exn6\bin\emacs.exe, process 32904
[Inferior 1 (process 32904) detached]

#0  0x00007ffbc5644143 in KERNELBASE!DebugBreak () from C:\WINDOWS\System32\KernelBase.dll
No symbol table info available.
#1  0x00007ff75c9d003c in emacs_abort () at D:/a/emacs-build/emacs-build/git/972842f/src/w32fns.c:11377
        button = <optimized out>
#2  0x00007ff75c87e7c7 in terminate_due_to_signal (sig=22, backtrace_limit=2147483647) at D:/a/emacs-build/emacs-build/git/972842f/src/emacs.c:470
No locals.
#3  0x00007ff75c9abbcc in igc_assert_fail.lto_priv.0 (file=0x7ff75d041945 <gdb_make_enums_visible+31753> "lockw3.c", line=98, msg=0x7ff75d041977 <gdb_make_enums_visible+31803> "lock->claims == 0") at D:/a/emacs-build/emacs-build/git/972842f/src/igc.c:858
No locals.
#4  0x00007ff75ca8b701 in mps_lib_assert_fail (file=0x7ff75d041945 <gdb_make_enums_visible+31753> "lockw3.c", line=98, condition=0x7ff75d041977 <gdb_make_enums_visible+31803> "lock->claims == 0") at D:/a/emacs-build/emacs-build/git/mps/code/mpsliban.c:87
No locals.
#5  LockClaim (lock=0x1d568926120) at D:/a/emacs-build/emacs-build/git/mps/code/lockw3.c:98
No locals.
#6  0x00007ff75ca8b8f5 in ArenaEnterLock (arena=0x1d565fc0000, recursive=0) at D:/a/emacs-build/emacs-build/git/mps/code/global.c:576
        lock = <optimized out>
#7  0x00007ff75cab4bbe in ArenaEnter (arena=0x1d565fc0000) at D:/a/emacs-build/emacs-build/git/mps/code/global.c:553
No locals.
#8  ArenaAccess (addr=0x1d5024f25f0, mode=1, context=context@entry=0x348a3ee090) at D:/a/emacs-build/emacs-build/git/mps/code/global.c:655
        arenaGlobals = 0x1d565fc0008
        arena = 0x1d565fc0000
        root = <optimized out>
        seg = <optimized out>
        node = 0x1d565fc0010
        nextNode = 0x7ff75d1bd320 <arenaRing>
        res = <optimized out>
#9  0x00007ff75cab4fda in ProtSEHfilter (info=0x348a3ee5e0) at D:/a/emacs-build/emacs-build/git/mps/code/protw3.c:97
        er = 0x348a3eed70
        address = <optimized out>
        mode = <optimized out>
        base = <optimized out>
        limit = <optimized out>
        action = <optimized out>
        lastError = 0
        context = {sig = 1368588992, var = 0, the = {ep = 0x348a3ee5e0, context = {P1Home = 225657677280, P2Home = 0, P3Home = 0, P4Home = 0, P5Home = 0, P6Home = 0, ContextFlags = 0, MxCsr = 0, SegCs = 0, SegDs = 0, SegEs = 0, SegFs = 0, SegGs = 0, SegSs = 0, EFlags = 0, Dr0 = 0, Dr1 = 0, Dr2 = 0, Dr3 = 0, Dr6 = 0, Dr7 = 0, Rax = 0, Rcx = 0, Rdx = 0, Rbx = 0, Rsp = 0, Rbp = 0, Rsi = 0, Rdi = 0, R8 = 0, R9 = 0, R10 = 0, R11 = 0, R12 = 0, R13 = 0, R14 = 0, R15 = 0, Rip = 0, {FltSave = {ControlWord = 0, StatusWord = 0, TagWord = 0 '\000', Reserved1 = 0 '\000', ErrorOpcode = 0, ErrorOffset = 3, ErrorSelector = 0, Reserved2 = 0, DataOffset = 0, DataSelector = 36, Reserved3 = 0, MxCsr = 1, MxCsr_Mask = 0, FloatRegisters = {{Low = 0, High = -1}, {Low = 0, High = 0}, {Low = 0, High = 0}, {Low = 225657679344, High = 0}, {Low = 0, High = 0}, {Low = 0, High = 36}, {Low = 0, High = 225657717384}, {Low = 0, High = 1681}}, XmmRegisters = {{Low = 0, High = 0}, {Low = 1680, High = 225657714768}, {Low = 0, High = 140700385933944}, {Low = 0, High = 0}, {Low = 0, High = 0}, {Low = 225657719640, High = 2016140723768}, {Low = 1, High = 225657717416}, {Low = 225657717408, High = 55834574856}, {Low = 55834574851, High = 51539607555}, {Low = 51539607554, High = 2}, {Low = 0, High = 0}, {Low = 225657717384, High = 0}, {Low = 0, High = -1}, {Low = 0, High = 140700385944126}, {Low = 0, High = 0}, {Low = 0, High = 0}}, Reserved4 = '\000' <repeats 95 times>}, FloatSave = {ControlWord = 0, StatusWord = 0, TagWord = 0 '\000', Reserved1 = 0 '\000', ErrorOpcode = 0, ErrorOffset = 3, ErrorSelector = 0, Reserved2 = 0, DataOffset = 0, DataSelector = 36, Reserved3 = 0, MxCsr = 1, MxCsr_Mask = 0, FloatRegisters = {{Low = 0, High = -1}, {Low = 0, High = 0}, {Low = 0, High = 0}, {Low = 225657679344, High = 0}, {Low = 0, High = 0}, {Low = 0, High = 36}, {Low = 0, High = 225657717384}, {Low = 0, High = 1681}}, XmmRegisters = {{Low = 0, High = 0}, {Low = 1680, High = 225657714768}, {Low = 0, High = 140700385933944}, {Low = 0, High = 0}, {Low = 0, High = 0}, {Low = 225657719640, High = 2016140723768}, {Low = 1, High = 225657717416}, {Low = 225657717408, High = 55834574856}, {Low = 55834574851, High = 51539607555}, {Low = 51539607554, High = 2}, {Low = 0, High = 0}, {Low = 225657717384, High = 0}, {Low = 0, High = -1}, {Low = 0, High = 140700385944126}, {Low = 0, High = 0}, {Low = 0, High = 0}}, Reserved4 = '\000' <repeats 95 times>}, {Header = {{Low = 0, High = 3}, {Low = 154618822656, High = 1}}, Legacy = {{Low = 0, High = -1}, {Low = 0, High = 0}, {Low = 0, High = 0}, {Low = 225657679344, High = 0}, {Low = 0, High = 0}, {Low = 0, High = 36}, {Low = 0, High = 225657717384}, {Low = 0, High = 1681}}, Xmm0 = {Low = 0, High = 0}, Xmm1 = {Low = 1680, High = 225657714768}, Xmm2 = {Low = 0, High = 140700385933944}, Xmm3 = {Low = 0, High = 0}, Xmm4 = {Low = 0, High = 0}, Xmm5 = {Low = 225657719640, High = 2016140723768}, Xmm6 = {Low = 1, High = 225657717416}, Xmm7 = {Low = 225657717408, High = 55834574856}, Xmm8 = {Low = 55834574851, High = 51539607555}, Xmm9 = {Low = 51539607554, High = 2}, Xmm10 = {Low = 0, High = 0}, Xmm11 = {Low = 225657717384, High = 0}, Xmm12 = {Low = 0, High = -1}, Xmm13 = {Low = 0, High = 140700385944126}, Xmm14 = {Low = 0, High = 0}, Xmm15 = {Low = 0, High = 0}}}, VectorRegister = {{Low = 0, High = 0} <repeats 26 times>}, VectorControl = 0, DebugControl = 0, LastBranchToRip = 0, LastBranchFromRip = 0, LastExceptionToRip = 0, LastExceptionFromRip = 0}}}
#10 0x00007ffbc7b3ed36 in ntdll!RtlWow64GetCurrentCpuArea () from C:\WINDOWS\SYSTEM32\ntdll.dll
No symbol table info available.
#11 0x00007ffbc7b3f13e in ntdll!RtlWow64GetCurrentCpuArea () from C:\WINDOWS\SYSTEM32\ntdll.dll
No symbol table info available.
#12 0x00007ffbc7c82ede in ntdll!KiUserExceptionDispatcher () from C:\WINDOWS\SYSTEM32\ntdll.dll
No symbol table info available.
#13 0x00007ff75c9a23a4 in scan_ambig.lto_priv.0 (ss=0x348a3ef718, start=<optimized out>, end=0x1d5024f26e0, closure=<optimized out>) at D:/a/emacs-build/emacs-build/git/972842f/src/igc.c:1435
        p = 0x1d5024f25f0
        _ss = <optimized out>
        _mps_zs = 22
        _mps_ufs = 0
        _mps_wt = <optimized out>
        _mps_w = 9223372019674891246
#14 0x00007ff75cabcbd5 in RootScan (ss=ss@entry=0x348a3ef710, root=root@entry=0x1d56899f6c0) at D:/a/emacs-build/emacs-build/git/mps/code/root.c:550
        res = <optimized out>
#15 0x00007ff75cabcdad in traceScanRootRes (ts=ts@entry=1, rank=rank@entry=0, arena=arena@entry=0x1d565fc0000, root=root@entry=0x1d56899f6c0) at D:/a/emacs-build/emacs-build/git/mps/code/trace.c:528
        white = <optimized out>
        res = <optimized out>
        ss = {sig = 1368771141, ss_s = {_zs = 22, _w = 9223372019674891246, _ufs = 0}, arena = 0x1d565fc0000, formatScan = 0x7ff75ca46c30 <FormatNoScan>, areaScan = 0x7ff75ca46bd0 <traceNoAreaScan>, areaScanClosure = 0x1d565fc0000, fix = 0x7ff75ca47950 <SegFix>, fixClosure = 0x0, traces = 1, rank = 0, wasMarked = 1, fixedSummary = 0, scannedSize = 240}
#16 0x00007ff75cabd367 in traceScanRoot (ts=1, rank=0, arena=0x1d565fc0000, root=0x1d56899f6c0) at D:/a/emacs-build/emacs-build/git/mps/code/trace.c:545
        res = <optimized out>
        res = <optimized out>
#17 rootFlip (root=0x1d56899f6c0, p=<synthetic pointer>) at D:/a/emacs-build/emacs-build/git/mps/code/trace.c:580
        rf = <synthetic pointer>
        res = <optimized out>
        rf = <optimized out>
        res = <optimized out>
#18 RootsIterate (arena=0x1d565fc0008, f=<optimized out>, p=<synthetic pointer>) at D:/a/emacs-build/emacs-build/git/mps/code/root.c:665
        root = 0x1d56899f6c0
        res = 0
        node = 0x1d56899f6d0
        next = 0x1d568a52c70
        res = <optimized out>
        node = <optimized out>
        next = <optimized out>
        root = <optimized out>
#19 traceFlip (trace=0x1d565fc0a78) at D:/a/emacs-build/emacs-build/git/mps/code/trace.c:652
        node = <optimized out>
        arena = 0x1d565fc0000
        rank = <optimized out>
        rfc = <optimized out>
        nextNode = <optimized out>
        res = <optimized out>
        node = <optimized out>
        nextNode = <optimized out>
        arena = <optimized out>
        rank = <optimized out>
        rfc = <optimized out>
        res = <optimized out>
        failRootFlip = <optimized out>
        _event = <optimized out>
        _kind = <optimized out>
        _size = <optimized out>
        _l = <optimized out>
        _h = <optimized out>
        seg = <optimized out>
        _event = <optimized out>
        _kind = <optimized out>
        _size = <optimized out>
        _l = <optimized out>
        _h = <optimized out>
#20 TraceStart (trace=trace@entry=0x1d565fc0a78, mortality=0, finishingTime=<optimized out>) at D:/a/emacs-build/emacs-build/git/mps/code/trace.c:1694
        arena = <optimized out>
        res = 0
        seg = 0x1d568aa7af0
#21 0x00007ff75cabdafd in TraceStartCollectAll (traceReturn=traceReturn@entry=0x348a3ef940, arena=arena@entry=0x1d565fc0000, why=why@entry=1) at D:/a/emacs-build/emacs-build/git/mps/code/trace.c:1794
        trace = 0x1d565fc0a78
        res = <optimized out>
        mortality = 0.60904998335808103
        finishingTime = <optimized out>
        chainNode = 0x1d565fc0b78
        chainNext = <optimized out>
#22 0x00007ff75cabe040 in PolicyStartTrace (traceReturn=traceReturn@entry=0x348a3ef9d8, collectWorldReturn=collectWorldReturn@entry=0x348a3efa34, arena=arena@entry=0x1d565fc0000, collectWorldAllowed=<optimized out>) at D:/a/emacs-build/emacs-build/git/mps/code/policy.c:299
        sCondemned = <optimized out>
        sSurvivors = <optimized out>
        tTracePerScan = <optimized out>
        sFoundation = <optimized out>
        sConsTrace = <optimized out>
        dynamicDeferral = <optimized out>
        res = <optimized out>
        trace = 0x16d88
        failStart = <optimized out>
#23 0x00007ff75cabe9f1 in TracePoll (workReturn=workReturn@entry=0x348a3efa38, collectWorldReturn=collectWorldReturn@entry=0x348a3efa34, globals=globals@entry=0x1d565fc0008, collectWorldAllowed=<optimized out>) at D:/a/emacs-build/emacs-build/git/mps/code/trace.c:1840
        trace = 0x7ffbc50e0f72 <ucrtbase!clock+34>
        arena = 0x1d565fc0000
        oldWork = <optimized out>
        newWork = <optimized out>
        work = <optimized out>
        endWork = <optimized out>
#24 0x00007ff75cabeb93 in ArenaPoll (globals=globals@entry=0x1d565fc0008) at D:/a/emacs-build/emacs-build/git/mps/code/global.c:745
        arena = 0x1d565fc0000
        start = 148985
        worldCollected = 0
        moreWork = <optimized out>
        workWasDone = 0
        tracedWork = 140700388062913
#25 0x00007ff75cabeeee in mps_ap_fill (p_o=0x348a3efb38, mps_ap=0x1d5689278f8, size=24) at D:/a/emacs-build/emacs-build/git/mps/code/mpsi.c:1097
        _sc = {calleeSave = {225657682744, 2016050675712, 2016094091424, 0, 225657682832, 2}}
        buf = 0x1d5689278a0
        arena = 0x1d565fc0000
        p = 0x1d56ca35d28
        res = <optimized out>
#26 0x00007ff75c9a62b8 in alloc_impl.lto_priv.0 (size=24, type=3, ap=0x1d5689278f8) at D:/a/emacs-build/emacs-build/git/972842f/src/igc.c:3770
        res = <optimized out>
        p = 0x0
#27 0x00007ff75c8dc8cd in Fmatch_data (integers=<optimized out>, reuse=0x0, reseat=<optimized out>) at D:/a/emacs-build/emacs-build/git/972842f/src/igc.c:3683
        tail = <optimized out>
        prev = 0x0
        data = 0x348a3efb90
        i = <optimized out>
        len = <optimized out>
        sa_avail = <optimized out>
        sa_count = {bytes = 320}
#28 0x00007ff75c9983fe in autocmp_chars (rule=0x1d5771cf545, charpos=1681, bytepos=1681, limit=3734, win=0x1d56b5a0638, face=0x1d56ca623e8, string=0x0, direction=0x3608, ch=119) at D:/a/emacs-build/emacs-build/git/972842f/src/search.c:3191
        count = <optimized out>
        pos = 0x1a46
        to = <optimized out>
        pt = 1
        pt_byte = 1
        re = <optimized out>
        font_object = <optimized out>
        lgstring = <optimized out>
        len = <optimized out>
        f = <optimized out>
#29 0x00007ff75c99eb5a in composition_reseat_it (cmp_it=0x348a3f8110, charpos=1681, bytepos=1681, endpos=3734, w=0x1d56b5a0638, bidi_level=0 '\000', face=0x1d56ca623e8, string=0x0) at D:/a/emacs-build/emacs-build/git/972842f/src/composite.c:1353
        lgstring = 0x0
        val = <optimized out>
        elt = <optimized out>
        direction = <optimized out>
        i = <optimized out>
#30 0x00007ff75c7cfef6 in next_element_from_buffer (it=0x348a3f7850) at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:9800
        p = <optimized out>
        stop = <optimized out>
        success_p = true
#31 0x00007ff75c7cd5a5 in get_next_display_element.lto_priv.0 (it=it@entry=0x348a3f7850) at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:8298
        success_p = <optimized out>
        get_next = <optimized out>
#32 0x00007ff75c7d034c in move_it_in_display_line_to.lto_priv.0 (it=it@entry=0x348a3f7850, to_charpos=<optimized out>, to_charpos@entry=3734, to_x=<optimized out>, to_x@entry=-1, op=op@entry=8) at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:10099
        x = <optimized out>
        i = <optimized out>
        ascent = <optimized out>
        descent = <optimized out>
        result = <optimized out>
        saved_glyph_row = <optimized out>
        wrap_it = {window = 0x0, w = 0x0, f = 0x0, method = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, end_charpos = 0, medium_narrowing_begv = 0, medium_narrowing_zv = 0, large_narrowing_begv = 0, large_narrowing_zv = 0, s = 0x0, string_nchars = 0, multibyte_p = 0, tab_line_p = 0, header_line_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, from_disp_prop_p = 0, ellipsis_p = 0, avoid_cursor_p = 0, dp = 0x0, dpvec = 0x0, dpend = 0x0, dpvec_char_len = 0, dpvec_face_id = 0, saved_face_id = 0, ctl_chars = {0x0 <repeats 16 times>}, start = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, n_overlay_strings = 0, overlay_strings_charpos = 0, overlay_strings = {0x0 <repeats 16 times>}, string_overlays = {0x0 <repeats 16 times>}, string = 0x0, from_overlay = 0x0, stack = {{string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x3}, {string = 0x2400000000, string_nchars = 1, end_charpos = 0, stop_charpos = -1, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = -1975562448, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 36, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x40000, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 4294967295, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x100000000, area = 8, method = 13, paragraph_embedding = 3, multibyte_p = 1, string_from_display_prop_p = 0, string_from_prefix_prop_p = 1, display_ellipsis_p = 1, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 3, voffset = 12, space_width = 0xc00000002, font_height = 0x2}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x348a3f8288, font_height = 0x7ff75c861dcb <bidi_cache_iterator_state+43>}}, sp = 0, selective = 225657717384, what = 0, face_id = 0, selective_display_ellipsis_p = 0, ctl_arrow_p = 0, face_box_p = 0, start_of_box_run_p = 1, end_of_box_run_p = 0, overlay_strings_at_end_processed_p = 0, ignore_overlay_strings_at_pos_p = 0, glyph_not_available_p = 1, starts_in_middle_of_char_p = 0, face_before_selective_p = 1, constrain_row_ascent_descent_p = 0, line_number_produced_p = 0, align_visually_p = 0, line_wrap = 52, base_face_id = 0, c = 0, len = -1975549304, cmp_it = {stop_pos = 0, id = 225657717384, ch = 0, rule_idx = 140700385952188, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, char_to_display = 0, glyphless_method = 0, image_id = 0, xwidget = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x1}, space_width = 0x0, voffset = 0, tab_width = 0, font_height = 0x0, object = 0x0, position = {charpos = 0, bytepos = 0}, truncation_pixel_width = 0, continuation_pixel_width = 0, first_visible_x = 0, last_visible_x = 0, last_visible_y = 0, extra_line_spacing = -1975564592, max_extra_line_spacing = 52, override_ascent = 1552293788, override_descent = 32759, override_boff = 0, glyph_row = 0x348a3f8288, area = 1, nglyphs = 0, pixel_width = -1975549304, ascent = 52, descent = 0, max_ascent = 0, max_descent = 0, phys_ascent = 0, phys_descent = 1560872736, max_phys_ascent = 32759, max_phys_descent = 10, current_x = 0, wrap_prefix_width = 1104, continuation_lines_width = 0, eol_pos = {charpos = 140700385952675, bytepos = 0}, current_y = 0, first_vpos = 0, vpos = 0, hpos = 0, lnum = 0, lnum_bytepos = 1589, lnum_width = 1589, lnum_pixel_width = 0, pt_lnum = 10, stretch_adjust = 1, left_user_fringe_bitmap = 0, right_user_fringe_bitmap = 0, left_user_fringe_face_id = 1, right_user_fringe_face_id = 0, bidi_p = 0, bidi_it = {bytepos = 25769803782, charpos = 6, ch = 0, nchars = 0, ch_len = 1588, type = 0, type_after_wn = 23, orig_type = 1587, resolved_level = 0 '\000', isolate_level = 0 '\000', invalid_levels = 0, invalid_isolates = -1, prev = {charpos = 0, type = 1589, orig_type = 0}, last_strong = {charpos = 98784247809, type = 4294967295, orig_type = 4294967295}, next_for_neutral = {charpos = 0, type = 4294967295, orig_type = 4294967295}, prev_for_neutral = {charpos = 0, type = 0, orig_type = 0}, next_for_ws = {charpos = 4294967296, type = 1, orig_type = 0}, bracket_pairing_pos = 1757, bracket_enclosed_type = 0, next_en_pos = 0, next_en_type = 0, sos = 0, scan_dir = 0, disp_pos = 0, disp_prop = 0, stack_idx = 0, level_stack = {{next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'} <repeats 75 times>, {next_for_neutral_pos = 2016330726424, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016162484880, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 6, prev_for_neutral_type = 3, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 225657703648, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387536916, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016330726424, next_for_neutral_type = 6, last_strong_type = 2, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016162484880, next_for_neutral_type = 0, last_strong_type = 6, prev_for_neutral_type = 4, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 225657719872, next_for_neutral_type = 4, last_strong_type = 2, prev_for_neutral_type = 4, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 4611686019484352512, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385558387, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 1, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 225657703960, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 140700385676633, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 2, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 140700385676633, next_for_neutral_type = 0, last_strong_type = 7, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 0, last_strong_type = 7, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 140700385260644, next_for_neutral_type = 0, last_strong_type = 7, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 140700385676800, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 1, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 140700385292182, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 255 'ÿ', flags = 255 'ÿ'}, {next_for_neutral_pos = 225657704240, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 18, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 255 'ÿ', flags = 255 'ÿ'}, {next_for_neutral_pos = 140700385293278, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2014339661828, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 3, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 3733, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 255 'ÿ', flags = 255 'ÿ'}, {next_for_neutral_pos = -1, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1248, next_for_neutral_type = 6, last_strong_type = 2, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 225657704240, next_for_neutral_type = 6, last_strong_type = 2, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700394516608, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 1, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 6, last_strong_type = 2, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385484986, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 6, last_strong_type = 2, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = -1, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 4, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 29, next_for_neutral_type = 5, last_strong_type = 3, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 90194313216, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1322849927188, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 225657722488, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 3734, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 0, level = 32 ' ', flags = 0 '\000'}, {next_for_neutral_pos = 2016140723768, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 1, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 140700385333354, next_for_neutral_type = 5, last_strong_type = 7, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 2016140723768, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 1, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 5, last_strong_type = 0, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016320692832, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}}, string = {lstring = 0x0, s = 0x0, schars = 0, bufpos = 0, from_disp_str = 0, unibyte = 0}, w = 0x0, paragraph_dir = 2319415376, separator_limit = 1, first_elt = 0, new_paragraph = 0, frame_window_p = 0}, paragraph_embedding = 1, min_width_property = 0x0, min_width_start = -1975559489}
        atpos_it = {window = 0x0, w = 0x7ff75c86223e <bidi_resolve_weak.lto_priv.0+46>, f = 0x24, method = 2013307160, stop_charpos = 92, prev_stop = 2016174459392, base_level_stop = 0, end_charpos = 0, medium_narrowing_begv = 0, medium_narrowing_zv = 0, large_narrowing_begv = 225657694688, large_narrowing_zv = 225657694672, s = 0x0, string_nchars = 140700385933944, multibyte_p = 1, tab_line_p = 0, header_line_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, from_disp_prop_p = 0, ellipsis_p = 0, avoid_cursor_p = 0, dp = 0x1, dpvec = 0x0, dpend = 0x1d502cff2f0, dpvec_char_len = -1975548968, dpvec_face_id = 52, saved_face_id = 1553887252, ctl_chars = {0x1d500000001, 0x348a3f7b28, 0x348a3f7b20, 0x1d57800a118, 0x1, 0x1d56d5cca00, 0x348a3f2bb0, 0x7ff75d08f080 <globals>, 0x5c, 0x1d56c7f1350, 0x348a3f7b08, 0x0, 0x0, 0xffffffffffffffff, 0x0, 0x7ff75c86223e <bidi_resolve_weak.lto_priv.0+46>}, start = {pos = {charpos = 3, bytepos = 4611686018528051200}, overlay_string_index = 1834659660, string_pos = {charpos = 140700387208348, bytepos = 154}, dpvec_index = 238}, current = {pos = {charpos = 2016174321484, bytepos = 4611686018528051200}, overlay_string_index = 3, string_pos = {charpos = 3, bytepos = 736}, dpvec_index = 47182696}, n_overlay_strings = 2016174321484, overlay_strings_charpos = 140700386639906, overlay_strings = {0x1d566a00000, 0x0, 0x1d502cff2f0, 0x1d502cbaf70, 0x3400000001, 0x3400000040, 0x1d500000000, 0x0, 0x42, 0x0, 0x0, 0x348a3f5490, 0x1, 0x0, 0x0, 0x348a3f2bb0}, string_overlays = {0x7ff75d08f080 <globals>, 0x5c, 0x1d56c7f1350, 0x7ff75c803534 <produce_special_glyphs.lto_priv.0+356>, 0x1d57673a660, 0x1d502cff430, 0x0, 0x1d56d5aae14, 0x1, 0x17, 0x1d56c7f15c5, 0x1d56c7f15c0, 0x1d56c7f1350, 0x0, 0x0, 0x0}, string = 0x0, from_overlay = 0x0, stack = {{string = 0x13b8, string_nchars = -1975566288, end_charpos = 140700385355782, stop_charpos = 225657705616, prev_stop = 0, base_level_stop = 225657700392, cmp_it = {stop_pos = 1, id = 225657700400, ch = 0, rule_idx = 225657705616, lookback = 0, nglyphs = 1551709866, reversed_p = 247, parent_it = 0x0, charpos = 0, nchars = -1, nbytes = 0, from = 1553682674, to = 32759, width = -1}, face_id = 8, u = {image = {object = 0x1d571556255, slice = {x = 0x7ff75c9b50f2 <itree_iter_next_in_subtree.lto_priv.0+338>, y = 0x0, width = 0x7ff75c990914 <balance_possible_root_interval.lto_priv.0+20>, height = 0x348a3f4030}, image_id = 140700387188225}, stretch = {object = 0x1d571556255}, xwidget = {object = 0x1d571556255}}, position = {charpos = 1, bytepos = 140700387860097}, current = {pos = {charpos = 2475, bytepos = 140700387183904}, overlay_string_index = 0, string_pos = {charpos = 2016241082965, bytepos = 2476}, dpvec_index = 0}, from_overlay = 0x0, area = 1983922440, method = 469, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 1553539249, voffset = 32759, space_width = 0x0, font_height = 0x7ff75c9b5265 <itree_iterator_next+85>}, {string = 0x0, string_nchars = 1901421141, end_charpos = 2476, stop_charpos = 140700387195690, prev_stop = 9906, base_level_stop = 2476, cmp_it = {stop_pos = 3734, id = 140700386236290, ch = 2260, rule_idx = 225657695616, lookback = 2016241082965, nglyphs = 2476, reversed_p = false, parent_it = 0x0, charpos = 140700387182868, nchars = 3734, nbytes = 0, from = 1553538561, to = 32759, width = 0}, face_id = 1056964608, u = {image = {object = 0x9ab, slice = {x = 0x1d56d821168, y = 0x273a, width = 0x9ce, height = 0x1d571556255}, image_id = 2016176902032}, stretch = {object = 0x9ab}, xwidget = {object = 0x9ab}}, position = {charpos = 10042, bytepos = 0}, current = {pos = {charpos = 9906, bytepos = 140700387189441}, overlay_string_index = 0, string_pos = {charpos = 140700387189778, bytepos = 31920}, dpvec_index = 0}, from_overlay = 0x9ac, area = 31920, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 1554870912, voffset = 32759, space_width = 0x9ce, font_height = 0x0}, {string = 0x26b2, string_nchars = 2014752667, end_charpos = 0, stop_charpos = 0, prev_stop = 320, base_level_stop = 12884901888, cmp_it = {stop_pos = 0, id = 9042, ch = 0, rule_idx = 2016140723773, lookback = 2510, nglyphs = 10042, reversed_p = false, parent_it = 0x7ff75cad7280 <current_thread>, charpos = 1, nchars = 0, nbytes = 0, from = 1551667203, to = 32759, width = 0}, face_id = 10042, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 2260}, current = {pos = {charpos = 4294967296, bytepos = 225657696048}, overlay_string_index = 2260, string_pos = {charpos = 2260, bytepos = 0}, dpvec_index = 2260}, from_overlay = 0x348a3f9f48, area = 2260, method = 0, paragraph_embedding = 2319423288, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 1, display_ellipsis_p = 0, avoid_cursor_p = 1, bidi_p = 1, from_disp_prop_p = 0, line_wrap = 2319423296, voffset = 52, space_width = 0xe96, font_height = 0x8d4}, {string = 0x1, string_nchars = 1552271400, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 225657722688, id = 0, ch = 0, rule_idx = 0, lookback = 2260, nglyphs = 2260, reversed_p = false, parent_it = 0x0, charpos = 225657722488, nchars = 0, nbytes = 0, from = 3600, to = 0, width = 0}, face_id = 0, u = {image = {object = 0xe0f, slice = {x = 0x1d56b5a0638, y = 0x0, width = 0x7ff75c85fa78 <bidi_resolve_explicit+440>, height = 0x0}, image_id = 0}, stretch = {object = 0xe0f}, xwidget = {object = 0xe0f}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 225657724744, bytepos = 2016140723768}, overlay_string_index = 1, string_pos = {charpos = 225657722520, bytepos = 225657722512}, dpvec_index = 1991064600}, from_overlay = 0x24, area = 1822645544, method = 469, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x348a3f9678, string_nchars = 0, end_charpos = 0, stop_charpos = -1, prev_stop = 0, base_level_stop = 140700385944126, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 225657717384, lookback = 0, nglyphs = 1590, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 1589, nbytes = 0, from = 10, to = 0, width = 0}, face_id = 1552284280, u = {image = {object = 0x348a3f3230, slice = {x = 0x1d56a8b2650, y = 0x0, width = 0x7ff75c803f73 <gui_produce_glyphs+339>, height = 0x348a3f8b58}, image_id = 2016140723768}, stretch = {object = 0x348a3f3230}, xwidget = {object = 0x348a3f3230}}, position = {charpos = -4294967295, bytepos = 225657717416}, current = {pos = {charpos = 225657717408, bytepos = 176}, overlay_string_index = 2016061432768, string_pos = {charpos = 4, bytepos = 0}, dpvec_index = 1721762880}, from_overlay = 0x348a3f31b0, area = 2319397296, method = 52, paragraph_embedding = 2319417992, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 1, display_ellipsis_p = 0, avoid_cursor_p = 1, bidi_p = 1, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0xffffffffffffffff}}, sp = 0, selective = 140700385944126, what = 0, face_id = 0, selective_display_ellipsis_p = 0, ctl_arrow_p = 0, face_box_p = 0, start_of_box_run_p = 0, end_of_box_run_p = 1, overlay_strings_at_end_processed_p = 1, ignore_overlay_strings_at_pos_p = 0, glyph_not_available_p = 1, starts_in_middle_of_char_p = 0, face_before_selective_p = 0, constrain_row_ascent_descent_p = 0, line_number_produced_p = 0, align_visually_p = 0, line_wrap = 0, base_face_id = 34390112, c = 469, len = 491790540, cmp_it = {stop_pos = 2, id = 2016061424704, ch = 0, rule_idx = 0, lookback = -1, nglyphs = 0, reversed_p = false, parent_it = 0x1d566a00380, charpos = 2016061423636, nchars = 0, nbytes = 0, from = 1721761792, to = 469, width = 168}, char_to_display = 34390016, glyphless_method = 469, image_id = 15, xwidget = 0x2cbaf10, slice = {x = 0x1d566a002c0, y = 0x1d502cbaf10, width = 0x1d502c9b000, height = 0x7ffbc7b83a61 <ntdll!RtlRbInsertNodeEx+5521>}, space_width = 0x348a3f8ef8, voffset = -20712, tab_width = 715, font_height = 0x34000000b0, object = 0x3400000000, position = {charpos = 225657697749, bytepos = 16384}, truncation_pixel_width = -28864, continuation_pixel_width = 23812, first_visible_x = 0, last_visible_x = 0, last_visible_y = 0, extra_line_spacing = 1721762688, max_extra_line_spacing = 469, override_ascent = 1721761812, override_descent = 469, override_boff = 0, glyph_row = 0x1d566a00000, area = 168, nglyphs = 0, pixel_width = -1975569008, ascent = 52, descent = 34390017, max_ascent = 469, max_descent = 32, phys_ascent = 0, phys_descent = 2, max_phys_ascent = 0, max_phys_descent = 1554818837, current_x = 32759, wrap_prefix_width = 12850, continuation_lines_width = 469, eol_pos = {charpos = 140719364258401, bytepos = 2014386564888}, current_y = 46903064, first_vpos = 469, vpos = 39, hpos = 52, lnum = 225657697910, lnum_bytepos = 225657697909, lnum_width = 16384, lnum_pixel_width = 0, pt_lnum = 140700394229568, stretch_adjust = -1975569104, left_user_fringe_bitmap = 52, right_user_fringe_bitmap = 0, left_user_fringe_face_id = 4, right_user_fringe_face_id = 0, bidi_p = 0, bidi_it = {bytepos = 225657697308, charpos = 225657697910, ch = 1554824062, nchars = 0, ch_len = 225657697904, type = 196639, type_after_wn = 2, orig_type = 211, resolved_level = 0 '\000', isolate_level = 0 '\000', invalid_levels = 2016061432896, invalid_isolates = 225657697456, prev = {charpos = 2014339661824, type = 2085203724, orig_type = 469}, last_strong = {charpos = 2014339661832, type = 4294967167, orig_type = 12159}, next_for_neutral = {charpos = 2014374058800, type = 0, orig_type = 0}, prev_for_neutral = {charpos = 26152, type = 1837726747, orig_type = 469}, next_for_ws = {charpos = 140700394516608, type = 1056964608, orig_type = 1073741824}, bracket_pairing_pos = 3, bracket_enclosed_type = 1, next_en_pos = 1, next_en_type = 1553535932, sos = 32759, scan_dir = -1975568824, disp_pos = 2016354414491, disp_prop = 1, stack_idx = 0, level_stack = {{next_for_neutral_pos = 2016061423936, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387883709, next_for_neutral_type = 7, last_strong_type = 3, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016177388480, next_for_neutral_type = 0, last_strong_type = 5, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387271263, next_for_neutral_type = 7, last_strong_type = 3, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 225657697856, next_for_neutral_type = 4, last_strong_type = 7, prev_for_neutral_type = 3, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 2016127166032, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016177389424, next_for_neutral_type = 4, last_strong_type = 6, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 2016177388571, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 1, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016177388568, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387862342, next_for_neutral_type = 7, last_strong_type = 3, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387271263, next_for_neutral_type = 7, last_strong_type = 4, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016177389336, next_for_neutral_type = 7, last_strong_type = 6, prev_for_neutral_type = 7, level = 255 'ÿ', flags = 255 'ÿ'}, {next_for_neutral_pos = 140700387182774, next_for_neutral_type = 1, last_strong_type = 4, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 72059610215317272, next_for_neutral_type = 4, last_strong_type = 6, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 2016177389064, next_for_neutral_type = 4, last_strong_type = 7, prev_for_neutral_type = 1, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 2, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016177388596, next_for_neutral_type = 3, last_strong_type = 3, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 30, next_for_neutral_type = 7, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 30, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 2014386847088, next_for_neutral_type = 0, last_strong_type = 5, prev_for_neutral_type = 7, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 140719364056421, next_for_neutral_type = 4, last_strong_type = 6, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 652835225611, next_for_neutral_type = 1, last_strong_type = 1, prev_for_neutral_type = 0, level = 152 '\230', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 2, last_strong_type = 1, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 30, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016061423936, next_for_neutral_type = 6, last_strong_type = 1, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387183904, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 1, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 2016177389315, next_for_neutral_type = 4, last_strong_type = 6, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 33, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 4, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 2, next_for_neutral_type = 3, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 4611686018528051200, next_for_neutral_type = 4, last_strong_type = 6, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 140700387208348, next_for_neutral_type = 6, last_strong_type = 1, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 262, next_for_neutral_type = 4, last_strong_type = 6, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 4611686018528051200, next_for_neutral_type = 3, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 3, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2014386847208, next_for_neutral_type = 4, last_strong_type = 6, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 140700386639906, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 6, prev_for_neutral_type = 5, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 2014386564976, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 225657698296, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 4, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 130, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 640, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 65536, next_for_neutral_type = 0, last_strong_type = 1, prev_for_neutral_type = 5, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 2014386847088, next_for_neutral_type = 3, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 512, next_for_neutral_type = 3, last_strong_type = 6, prev_for_neutral_type = 1, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 1, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 2014386847408, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016177388284, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 32, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 1, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 2014386564864, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 7, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 255 'ÿ', flags = 255 'ÿ'}, {next_for_neutral_pos = 225657698320, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 1, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016326952544, next_for_neutral_type = 3, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 640, next_for_neutral_type = 3, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2, next_for_neutral_type = 6, last_strong_type = 3, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016177227219, next_for_neutral_type = 2, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016330726424, next_for_neutral_type = 4, last_strong_type = 4, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016162307368, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 6, prev_for_neutral_type = 1, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 225657698400, next_for_neutral_type = 3, last_strong_type = 5, prev_for_neutral_type = 4, level = 101 'e', flags = 97 'a'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 4, level = 32 ' ', flags = 49 '1'}, {next_for_neutral_pos = 2314885532098511136, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2314885530818453536, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 0, level = 32 ' ', flags = 32 ' '}, {next_for_neutral_pos = 140700387536916, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 0, level = 32 ' ', flags = 32 ' '}, {next_for_neutral_pos = 2314885530818453536, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 0, level = 32 ' ', flags = 32 ' '}, {next_for_neutral_pos = 2016330726424, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016162307368, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 1, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 140700394516608, next_for_neutral_type = 4, last_strong_type = 4, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016127166032, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385558387, next_for_neutral_type = 2, last_strong_type = 7, prev_for_neutral_type = 4, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 225657698712, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387195690, next_for_neutral_type = 2, last_strong_type = 6, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2476, next_for_neutral_type = 6, last_strong_type = 2, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700386236290, next_for_neutral_type = 4, last_strong_type = 2, prev_for_neutral_type = 3, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 225657698624, next_for_neutral_type = 5, last_strong_type = 2, prev_for_neutral_type = 1, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 140700387332338, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387182868, next_for_neutral_type = 5, last_strong_type = 2, prev_for_neutral_type = 1, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 140700387332338, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387182868, next_for_neutral_type = 3, last_strong_type = 5, prev_for_neutral_type = 6, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387188225, next_for_neutral_type = 2, last_strong_type = 7, prev_for_neutral_type = 4, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387860097, next_for_neutral_type = 3, last_strong_type = 5, prev_for_neutral_type = 6, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140698833649672, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016241082965, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 255 'ÿ', flags = 255 'ÿ'}, {next_for_neutral_pos = -1, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 225657704240, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 225657698880, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 2, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 36, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 1, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 140700385555764, next_for_neutral_type = 2, last_strong_type = 6, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2476, next_for_neutral_type = 0, last_strong_type = 7, prev_for_neutral_type = 1, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 140700385920139, next_for_neutral_type = 4, last_strong_type = 2, prev_for_neutral_type = 3, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 225657722488, next_for_neutral_type = 5, last_strong_type = 7, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 2016140723768, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 1, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 1, prev_for_neutral_type = 2, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 140700385920139, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 225657717384, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 3734, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 255 'ÿ', flags = 255 'ÿ'}, {next_for_neutral_pos = 0, next_for_neutral_type = 5, last_strong_type = 6, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 10, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385948524, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 1, prev_for_neutral_type = 6, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 15232, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 225657717384, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 225657717384, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 1, prev_for_neutral_type = 2, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 10, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 1, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385949579, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}}, string = {lstring = 0x0, s = 0x0, schars = 0, bufpos = 0, from_disp_str = 0, unibyte = 0}, w = 0x0, paragraph_dir = 0, separator_limit = 0, first_elt = 0, new_paragraph = 0, frame_window_p = 0}, paragraph_embedding = 0, min_width_property = 0x0, min_width_start = 0}
        atx_it = {window = 0x0, w = 0x0, f = 0x0, method = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, end_charpos = 0, medium_narrowing_begv = 0, medium_narrowing_zv = 0, large_narrowing_begv = 0, large_narrowing_zv = 0, s = 0x0, string_nchars = 0, multibyte_p = 0, tab_line_p = 0, header_line_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, from_disp_prop_p = 0, ellipsis_p = 0, avoid_cursor_p = 0, dp = 0x0, dpvec = 0x0, dpend = 0x0, dpvec_char_len = 0, dpvec_face_id = 0, saved_face_id = 0, ctl_chars = {0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d566a00380, 0x1d566a00014, 0x0, 0x1d566a00000, 0x55, 0x348a3f1960, 0x1d502ac516e, 0x4, 0x6628, 0x7ff75c9914a1 <get_property_and_range+81>}, start = {pos = {charpos = 33296, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 223338299736}, dpvec_index = 4}, current = {pos = {charpos = 4, bytepos = -1}, overlay_string_index = 225657690240, string_pos = {charpos = 225657690232, bytepos = 2016340494756}, dpvec_index = 1787504208}, n_overlay_strings = 1, overlay_strings_charpos = 140700387230367, overlay_strings = {0x1d502ac5090, 0x110006000000000, 0x20003001f, 0x0, 0x348a3f1878, 0x4, 0x4, 0x4, 0xffffffffffffffff, 0x1d5774249a4, 0x348a3f1888, 0x1d56a8b2650, 0x1d566a00000, 0x1d502acd210, 0x6, 0x7ffbc7b52565 <ntdll!RtlFreeHeap+837>}, string_overlays = {0x3489b76000, 0x6b00070159, 0x6b00060147, 0x0, 0x6, 0x1d56d892bc8, 0x1, 0x1d566a00140, 0x0, 0x7ff75ca3babd <make_clear_multibyte_string.isra.0+125>, 0x1d576142260, 0x1d568c1cbb0, 0x55, 0x7ff75c8e62e2 <xmalloc+18>, 0x0, 0x6}, string = 0x6, from_overlay = 0x348a3f1a50, stack = {{string = 0x0, string_nchars = 1552845017, end_charpos = 2, stop_charpos = 9223372036854775807, prev_stop = 225657690704, base_level_stop = 6, cmp_it = {stop_pos = 2016340484813, id = 0, ch = 832, rule_idx = 6, lookback = 2016177368012, nglyphs = 1552990242, reversed_p = 247, parent_it = 0x1d566a00000, charpos = 0, nchars = 44880400, nbytes = 469, from = 1837705864, to = 469, width = 0}, face_id = -1975576008, u = {image = {object = 0x0, slice = {x = 0x7ff75ca3babd <make_clear_multibyte_string.isra.0+125>, y = 0x1d5774220c2, width = 0x572e, height = 0x0}, image_id = 832}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 5}, current = {pos = {charpos = 5, bytepos = 2014384542224}, overlay_string_index = 2, string_pos = {charpos = 140700386494464, bytepos = 9223372036854775667}, dpvec_index = 0}, from_overlay = 0x1d5774222cd, area = 44880480, method = 469, paragraph_embedding = 2000822272, multibyte_p = 1, string_from_display_prop_p = 0, string_from_prefix_prop_p = 1, display_ellipsis_p = 0, avoid_cursor_p = 1, bidi_p = 0, from_disp_prop_p = 1, line_wrap = 1757531060, voffset = 469, space_width = 0x1, font_height = 0x0}, {string = 0x1d5774222c8, string_nchars = 1552990208, end_charpos = 2014384542264, stop_charpos = 0, prev_stop = -1, base_level_stop = 225657690704, cmp_it = {stop_pos = 0, id = 0, ch = 6, rule_idx = 2016340484813, lookback = 2, nglyphs = 2, reversed_p = false, parent_it = 0x2, charpos = 2, nchars = 0, nbytes = 0, from = 0, to = 0, width = -1975575771}, face_id = 43864064, u = {image = {object = 0x1, slice = {x = 0x1, y = 0x382d46545520, width = 0x2, height = 0x1d5774220c6}, image_id = 2014383526008}, stretch = {object = 0x1}, xwidget = {object = 0x1}}, position = {charpos = 0, bytepos = 2}, current = {pos = {charpos = 1, bytepos = 0}, overlay_string_index = 2016340484288, string_pos = {charpos = 0, bytepos = 2014383525888}, dpvec_index = 0}, from_overlay = 0xffffffffffffffff, area = 2319391536, method = 52, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x5, font_height = 0x1d5774220c7}, {string = 0x1, string_nchars = 1, end_charpos = 1, stop_charpos = 1, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 1814703653, rule_idx = 0, lookback = 400274184992, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}}, sp = 0, selective = 0, what = 0, face_id = 0, selective_display_ellipsis_p = 0, ctl_arrow_p = 0, face_box_p = 0, start_of_box_run_p = 0, end_of_box_run_p = 0, overlay_strings_at_end_processed_p = 0, ignore_overlay_strings_at_pos_p = 0, glyph_not_available_p = 0, starts_in_middle_of_char_p = 0, face_before_selective_p = 0, constrain_row_ascent_descent_p = 0, line_number_produced_p = 0, align_visually_p = 0, line_wrap = 0, base_face_id = 0, c = 0, len = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, char_to_display = 0, glyphless_method = 0, image_id = 0, xwidget = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, space_width = 0x0, voffset = 0, tab_width = 0, font_height = 0x0, object = 0x0, position = {charpos = 0, bytepos = 0}, truncation_pixel_width = 0, continuation_pixel_width = 0, first_visible_x = 0, last_visible_x = 0, last_visible_y = 0, extra_line_spacing = 0, max_extra_line_spacing = 0, override_ascent = 0, override_descent = 0, override_boff = 0, glyph_row = 0x0, area = 0, nglyphs = 0, pixel_width = 0, ascent = 0, descent = 0, max_ascent = 0, max_descent = 0, phys_ascent = 0, phys_descent = 0, max_phys_ascent = 0, max_phys_descent = 0, current_x = 0, wrap_prefix_width = 0, continuation_lines_width = 0, eol_pos = {charpos = 0, bytepos = 0}, current_y = 0, first_vpos = 0, vpos = 0, hpos = 0, lnum = 0, lnum_bytepos = 0, lnum_width = 0, lnum_pixel_width = 0, pt_lnum = 0, stretch_adjust = 0, left_user_fringe_bitmap = 0, right_user_fringe_bitmap = 0, left_user_fringe_face_id = 0, right_user_fringe_face_id = 0, bidi_p = 0, bidi_it = {bytepos = 0, charpos = 0, ch = 0, nchars = 0, ch_len = 0, type = 0, type_after_wn = 0, orig_type = 0, resolved_level = 0 '\000', isolate_level = 0 '\000', invalid_levels = 0, invalid_isolates = 0, prev = {charpos = 0, type = 0, orig_type = 0}, last_strong = {charpos = 0, type = 0, orig_type = 0}, next_for_neutral = {charpos = 0, type = 0, orig_type = 0}, prev_for_neutral = {charpos = 0, type = 0, orig_type = 0}, next_for_ws = {charpos = 0, type = 0, orig_type = 0}, bracket_pairing_pos = 0, bracket_enclosed_type = 0, next_en_pos = 0, next_en_type = 0, sos = 0, scan_dir = 0, disp_pos = 0, disp_prop = 0, stack_idx = 0, level_stack = {{next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 4, last_strong_type = 6, prev_for_neutral_type = 3, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 772, next_for_neutral_type = 4, last_strong_type = 6, prev_for_neutral_type = 3, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1352, next_for_neutral_type = 4, last_strong_type = 6, prev_for_neutral_type = 7, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1384, next_for_neutral_type = 4, last_strong_type = 7, prev_for_neutral_type = 5, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1560, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1072, next_for_neutral_type = 4, last_strong_type = 7, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1804, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 4, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1660, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 5, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1868, next_for_neutral_type = 4, last_strong_type = 2, prev_for_neutral_type = 3, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2040, next_for_neutral_type = 0, last_strong_type = 7, prev_for_neutral_type = 6, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 225657692720, next_for_neutral_type = 4, last_strong_type = 5, prev_for_neutral_type = 2, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 2, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016176644436, next_for_neutral_type = 3, last_strong_type = 7, prev_for_neutral_type = 4, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 5, next_for_neutral_type = 7, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 5, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 2014386846080, next_for_neutral_type = 0, last_strong_type = 7, prev_for_neutral_type = 7, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 140719364056421, next_for_neutral_type = 4, last_strong_type = 2, prev_for_neutral_type = 5, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 652835094536, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 152 '\230', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 2, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 225657692880, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016061423936, next_for_neutral_type = 2, last_strong_type = 5, prev_for_neutral_type = 1, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387183904, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 1, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 2016176644883, next_for_neutral_type = 4, last_strong_type = 2, prev_for_neutral_type = 5, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 26, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 7, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 3, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 4611686018528051200, next_for_neutral_type = 4, last_strong_type = 2, prev_for_neutral_type = 5, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 140700387208348, next_for_neutral_type = 2, last_strong_type = 5, prev_for_neutral_type = 1, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 126, next_for_neutral_type = 4, last_strong_type = 2, prev_for_neutral_type = 5, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 4611686018528051200, next_for_neutral_type = 3, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 3, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 3, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2014386846200, next_for_neutral_type = 4, last_strong_type = 2, prev_for_neutral_type = 5, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 140700386639906, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 6, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 2014386564976, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 225657693368, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 4, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 130, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1760, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2014339727360, next_for_neutral_type = 0, last_strong_type = 6, prev_for_neutral_type = 7, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 2014386846080, next_for_neutral_type = 3, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1536, next_for_neutral_type = 3, last_strong_type = 6, prev_for_neutral_type = 1, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 1, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 2014386846400, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016097192884, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 1, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 2014386564864, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 7, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 255 'ÿ', flags = 255 'ÿ'}, {next_for_neutral_pos = 225657693392, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 7, last_strong_type = 3, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016326952544, next_for_neutral_type = 3, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1760, next_for_neutral_type = 3, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387188225, next_for_neutral_type = 6, last_strong_type = 3, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016176555283, next_for_neutral_type = 2, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 225657724368, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700393933664, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 2, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 0, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 2, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 140700385345472, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 0, level = 32 ' ', flags = 42 '*'}, {next_for_neutral_pos = 7018142233121875302, next_for_neutral_type = 2, last_strong_type = 6, prev_for_neutral_type = 5, level = 32 ' ', flags = 49 '1'}, {next_for_neutral_pos = 2314885532098511136, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 0, level = 32 ' ', flags = 32 ' '}, {next_for_neutral_pos = 140700387195690, next_for_neutral_type = 6, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387188225, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 0, level = 32 ' ', flags = 32 ' '}, {next_for_neutral_pos = 2314885530818453536, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 0, level = 32 ' ', flags = 32 ' '}, {next_for_neutral_pos = 225657724528, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 7, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 140700393933664, next_for_neutral_type = 2, last_strong_type = 0, prev_for_neutral_type = 1, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 225657724368, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700393933664, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 2, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 140700394516608, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 225657724368, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385334693, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 0, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 225657724368, next_for_neutral_type = 0, last_strong_type = 7, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 1, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 9, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385462261, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 225657724528, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700393933664, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 2, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 225657724368, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 2, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 140700385482141, next_for_neutral_type = 2, last_strong_type = 0, prev_for_neutral_type = 1, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 225657724368, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 1, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 225657724368, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385350989, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 874, next_for_neutral_type = 0, last_strong_type = 6, prev_for_neutral_type = 2, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 2016095829024, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 2, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 72057819695652464, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 255 'ÿ', flags = 255 'ÿ'}, {next_for_neutral_pos = 140700385481984, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2014478204560, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 0 '\000', flags = 1 '\001'}, {next_for_neutral_pos = 225657724528, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385350989, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 2016050675712, next_for_neutral_type = 0, last_strong_type = 6, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 64, next_for_neutral_type = 0, last_strong_type = 7, prev_for_neutral_type = 5, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 72059610132019360, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 255 'ÿ', flags = 255 'ÿ'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2014478204560, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 0 '\000', flags = 1 '\001'}, {next_for_neutral_pos = 2016050675712, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 3, level = 247 '÷', flags = 127 '\177'}, {next_for_neutral_pos = 64, next_for_neutral_type = 0, last_strong_type = 7, prev_for_neutral_type = 5, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 2016094091424, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 140700388364587, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 1, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 225657694328, next_for_neutral_type = 0, last_strong_type = 4, prev_for_neutral_type = 4, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 1, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 225657720568, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 3268, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 3, last_strong_type = 0, prev_for_neutral_type = 3, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016140739104, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385933944, next_for_neutral_type = 0, last_strong_type = 7, prev_for_neutral_type = 5, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 140700388421456, next_for_neutral_type = 0, last_strong_type = 5, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700387271263, next_for_neutral_type = 0, last_strong_type = 1, prev_for_neutral_type = 7, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 2016140739104, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}}, string = {lstring = 0x348a3f8f18, s = 0x348a3f8f10 "", schars = 2016174322360, bufpos = 2016174321484, from_disp_str = 1, unibyte = 1}, w = 0x9060, paragraph_dir = 1834659632, separator_limit = 0, first_elt = 0, new_paragraph = 1, frame_window_p = 1}, paragraph_embedding = 2319421176, min_width_property = 0x0, min_width_start = 0}
        ppos_it = {window = 0x1d571556255, w = 0x7ff75c9178f6 <unbind_to+614>, f = 0x7ff75d14b218 <searchbufs.lto_priv+6840>, method = 1552761671, stop_charpos = 140700395287096, prev_stop = 0, base_level_stop = 3733, end_charpos = 0, medium_narrowing_begv = 0, medium_narrowing_zv = 3733, large_narrowing_begv = 12, large_narrowing_zv = 50120, s = 0x0, string_nchars = 2016241082965, multibyte_p = 0, tab_line_p = 0, header_line_p = 0, string_from_display_prop_p = 1, string_from_prefix_prop_p = 1, from_disp_prop_p = 0, ellipsis_p = 0, avoid_cursor_p = 1, dp = 0x0, dpvec = 0x1d57614f25c, dpend = 0xe96, dpvec_char_len = 224, dpvec_face_id = 0, saved_face_id = 3734, ctl_chars = {0x7ff75cad7280 <current_thread>, 0x348a3f8410, 0xffffffff, 0x7ff75c85cbbf <bidi_at_paragraph_end+175>, 0xffff81de0e81e940, 0x0, 0x348a3f03c0, 0x7ff75c861f9c <bidi_cache_iterator_state+508>, 0xe95, 0x0, 0x1, 0x348a3f8e48, 0x1, 0x348a3f8e48, 0x0, 0x0}, start = {pos = {charpos = 140700394522400, bytepos = 140700385953241}, overlay_string_index = 2016127166032, string_pos = {charpos = -138684250592960, bytepos = 225657685200}, dpvec_index = 1552339838}, current = {pos = {charpos = 3732, bytepos = 3732}, overlay_string_index = 41, string_pos = {charpos = 1, bytepos = 1}, dpvec_index = 1}, n_overlay_strings = 23, overlay_strings_charpos = 0, overlay_strings = {0x0, 0xe93, 0x100000001, 0xe93, 0x100000001, 0xffffffffffffffff, 0x0, 0xe93, 0x100000001, 0xe85, 0x17, 0xffffffffffffffff, 0x0, 0x0, 0x100000000, 0x1}, string_overlays = {0xe96, 0x0, 0x0, 0x0, 0x348a3f04b0, 0x348a3f04b0, 0xffff81de0e81e940, 0x0, 0x0, 0x0, 0x9060, 0x16d88, 0x16d88, 0x16d88, 0x16d88, 0x16d88}, string = 0x16d88, from_overlay = 0x16d88, stack = {{string = 0x16d88, string_nchars = 1983982236, end_charpos = 93576, stop_charpos = 93576, prev_stop = 93576, base_level_stop = 93576, cmp_it = {stop_pos = 93576, id = 93576, ch = 93576, rule_idx = 93576, lookback = 93576, nglyphs = 93576, reversed_p = false, parent_it = 0x1, charpos = 140700387332338, nchars = 5, nbytes = 0, from = 243394880, to = -32290, width = 1}, face_id = -1975580448, u = {image = {object = 0x0, slice = {x = 0x7ff75ca35e81 <itree_iterator_first_node.isra.0+209>, y = 0x4000000006000000, width = 0x7ff75c870cfa <merge_face_ref.lto_priv.0+1514>, height = 0x1d56b5a0638}, image_id = 6082471504}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 2016177358200, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 2016323584264}, overlay_string_index = -9223372036854775808, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 1553683045}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 13, multibyte_p = 1, string_from_display_prop_p = 1, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x348a3f0750, font_height = 0xe95}, {string = 0x28, string_nchars = 1552585823, end_charpos = 2320177, stop_charpos = 2016358549200, prev_stop = 0, base_level_stop = 2016162307368, cmp_it = {stop_pos = 225657685840, id = 140700386007895, ch = 3734, rule_idx = 72057594037927936, lookback = 0, nglyphs = 3732, reversed_p = false, parent_it = 0xe96, charpos = 1, nchars = 0, nbytes = 0, from = 1554257854, to = 32759, width = 0}, face_id = 1553621599, u = {image = {object = 0xe94, slice = {x = 0x348a3f08e0, y = 0x348a3f08d0, width = 0x9060, height = 0x0}, image_id = 2016177359160}, stretch = {object = 0xe94}, xwidget = {object = 0xe94}}, position = {charpos = 2016177359139, bytepos = 225657686320}, current = {pos = {charpos = 240, bytepos = 225657686368}, overlay_string_index = 12884901901, string_pos = {charpos = 0, bytepos = 225657686240}, dpvec_index = 1561637400}, from_overlay = 0x1d5764aa3d8, area = 1984603100, method = 469, paragraph_embedding = 1, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 1561637400, voffset = 32759, space_width = 0x7ff75d1498c8 <searchbufs.lto_priv+360>, font_height = 0x0}, {string = 0x0, string_nchars = 1553682390, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 140700387859974, ch = 1561630920, rule_idx = 64, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x1d5006f0e93, charpos = 0, nchars = 1983922440, nbytes = 469, from = 0, to = 0, width = 1}, face_id = 2, u = {image = {object = 0x0, slice = {x = 0x100000000000000, y = 0x0, width = 0x0, height = 0x0}, image_id = 2014346940051}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 1, bytepos = 225657717776}, current = {pos = {charpos = 3734, bytepos = 140700385322584}, overlay_string_index = 0, string_pos = {charpos = 20, bytepos = 5166520}, dpvec_index = 3733}, from_overlay = 0x6628, area = 0, method = 0, paragraph_embedding = 1560866944, multibyte_p = 1, string_from_display_prop_p = 1, string_from_prefix_prop_p = 1, display_ellipsis_p = 0, avoid_cursor_p = 1, bidi_p = 1, from_disp_prop_p = 1, line_wrap = 16384, voffset = 0, space_width = 0xe0, font_height = 0x14}, {string = 0x400000003f000000, string_nchars = -1975580448, end_charpos = 0, stop_charpos = 3733, prev_stop = 3735, base_level_stop = 1, cmp_it = {stop_pos = 1, id = -1, ch = 3732, rule_idx = 3733, lookback = 14938, nglyphs = 26152, reversed_p = false, parent_it = 0x1d56d8290a8, charpos = 225657686656, nchars = 1901421141, nbytes = 469, from = -2, to = 0, width = 1056964608}, face_id = 1553540332, u = {image = {object = 0xe95, slice = {x = 0x1d56d89093b, y = 0x0, width = 0x7ff75cad7280 <current_thread>, height = 0x7ff75c8dce30 <unwind_set_match_data.lto_priv.0>}, image_id = 3733}, stretch = {object = 0xe95}, xwidget = {object = 0xe95}}, position = {charpos = 0, bytepos = 3734}, current = {pos = {charpos = 225657686664, bytepos = 225657686656}, overlay_string_index = 0, string_pos = {charpos = 4294967294, bytepos = 0}, dpvec_index = 1553580750}, from_overlay = 0x3a56, area = 13832, method = 0, paragraph_embedding = 1984603100, multibyte_p = 1, string_from_display_prop_p = 0, string_from_prefix_prop_p = 1, display_ellipsis_p = 0, avoid_cursor_p = 1, bidi_p = 0, from_disp_prop_p = 1, line_wrap = 14938, voffset = 0, space_width = 0x348a3f0a80, font_height = 0x0}, {string = 0xe94, string_nchars = 1, end_charpos = 3733, stop_charpos = 3733, prev_stop = 3733, base_level_stop = 0, cmp_it = {stop_pos = 3734, id = 140700387236323, ch = 0, rule_idx = 13832, lookback = 4611686018427387904, nglyphs = 1553037513, reversed_p = 247, parent_it = 0x348a3f0a78, charpos = 0, nchars = 1, nbytes = 0, from = 1, to = 4, width = 1998374573}, face_id = 1554870272, u = {image = {object = 0x1d5771cc6a8, slice = {x = 0x1d57816af9b, y = 0x1, width = 0x7ff75c9b50f2 <itree_iter_next_in_subtree.lto_priv.0+338>, height = 0x1d56d89093b}, image_id = 3733}, stretch = {object = 0x1d5771cc6a8}, xwidget = {object = 0x1d5771cc6a8}}, position = {charpos = 2016241082965, bytepos = 3733}, current = {pos = {charpos = 0, bytepos = 140700387182868}, overlay_string_index = 3733, string_pos = {charpos = 140700387188225, bytepos = 0}, dpvec_index = -2}, from_overlay = 0xe94, area = 1553534240, method = 32759, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 1901421141, voffset = 469, space_width = 0xe95, font_height = 0x0}}, sp = 57456, selective = 140700387332338, what = 3733, face_id = 0, selective_display_ellipsis_p = 1, ctl_arrow_p = 0, face_box_p = 0, start_of_box_run_p = 0, end_of_box_run_p = 1, overlay_strings_at_end_processed_p = 1, ignore_overlay_strings_at_pos_p = 0, glyph_not_available_p = 1, starts_in_middle_of_char_p = 0, face_before_selective_p = 0, constrain_row_ascent_descent_p = 0, line_number_produced_p = 0, align_visually_p = 0, line_wrap = 32759, base_face_id = 1901421141, c = 469, len = 3734, cmp_it = {stop_pos = 0, id = 140700387182868, ch = 3733, rule_idx = 140700387188225, lookback = 14934, nglyphs = 1551655604, reversed_p = 247, parent_it = 0xe95, charpos = 225657717776, nchars = 16, nbytes = 0, from = 1560284000, to = 32759, width = 1560866944}, char_to_display = 0, glyphless_method = 0, image_id = 3734, xwidget = 0x0, slice = {x = 0xe96, y = 0x7ff75c7cffc0 <next_element_from_buffer+1376>, width = 0x7ff75d08f080 <globals>, height = 0x348a3f8410}, space_width = 0x0, voffset = 25173, tab_width = 29013, font_height = 0xe96, object = 0x7ff75c993b2a <get_char_property_and_overlay+138>, position = {charpos = 14938, bytepos = 2016354414491}, truncation_pixel_width = 0, continuation_pixel_width = 0, first_visible_x = 0, last_visible_x = 1553887252, last_visible_y = 32759, extra_line_spacing = 0, max_extra_line_spacing = 0, override_ascent = -1975579616, override_descent = 52, override_boff = 1801061944, glyph_row = 0x0, area = 32648, nglyphs = 0, pixel_width = 15232, ascent = 0, descent = 0, max_ascent = 0, max_descent = 0, phys_ascent = 0, phys_descent = 0, max_phys_ascent = 0, max_phys_descent = 0, current_x = 0, wrap_prefix_width = 0, continuation_lines_width = 0, eol_pos = {charpos = 225657717776, bytepos = 0}, current_y = 1560284000, first_vpos = 32759, vpos = 1560866944, hpos = 32759, lnum = 140700394516608, lnum_bytepos = 0, lnum_width = -1975548912, lnum_pixel_width = 52, pt_lnum = 0, stretch_adjust = 1551685029, left_user_fringe_bitmap = 32759, right_user_fringe_bitmap = 0, left_user_fringe_face_id = 0, right_user_fringe_face_id = 0, bidi_p = 0, bidi_it = {bytepos = 225657717776, charpos = 57400, ch = -1975574120, nchars = 8, ch_len = 0, type = 0, type_after_wn = 0, orig_type = 9, resolved_level = 0 '\000', isolate_level = 0 '\000', invalid_levels = 0, invalid_isolates = 140700385462261, prev = {charpos = 1, type = 2319421000, orig_type = 52}, last_strong = {charpos = 8, type = 0, orig_type = 0}, next_for_neutral = {charpos = 0, type = 2319418384, orig_type = 52}, prev_for_neutral = {charpos = 225657722744, type = 1551832477, orig_type = 32759}, next_for_ws = {charpos = 32648, type = 15232, orig_type = 0}, bracket_pairing_pos = 140700385482550, bracket_enclosed_type = 2319418384, next_en_pos = 0, next_en_type = 2319393176, sos = 52, scan_dir = 8, disp_pos = 0, disp_prop = 0, stack_idx = 0, level_stack = {{next_for_neutral_pos = 225657717776, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385346380, next_for_neutral_type = 5, last_strong_type = 4, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 2016140739104, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 1, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 1, last_strong_type = 1, prev_for_neutral_type = 5, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 72057594037931336, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 255 'ÿ', flags = 255 'ÿ'}, {next_for_neutral_pos = 3328, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 3734, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 3734, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2014390141248, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 1 '\001', flags = 1 '\001'}, {next_for_neutral_pos = 4294968392, next_for_neutral_type = 1, last_strong_type = 1, prev_for_neutral_type = 2, level = 42 '*', flags = 0 '\000'}, {next_for_neutral_pos = 47, next_for_neutral_type = 5, last_strong_type = 7, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 2016140723768, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 1, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 6, last_strong_type = 2, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 3732, next_for_neutral_type = 4, last_strong_type = 2, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 3734, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 5, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016320692832, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 26, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 255 'ÿ', flags = 255 'ÿ'}, {next_for_neutral_pos = -1, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 255 'ÿ', flags = 255 'ÿ'}, {next_for_neutral_pos = 4294967295, next_for_neutral_type = 6, last_strong_type = 2, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 3734, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 255 'ÿ', flags = 255 'ÿ'}, {next_for_neutral_pos = -1, next_for_neutral_type = 7, last_strong_type = 7, prev_for_neutral_type = 7, level = 255 'ÿ', flags = 255 'ÿ'}, {next_for_neutral_pos = 4294967295, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 3732, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'} <repeats 91 times>}, string = {lstring = 0x0, s = 0x0, schars = 0, bufpos = 0, from_disp_str = 0, unibyte = 0}, w = 0x0, paragraph_dir = 0, separator_limit = 0, first_elt = 0, new_paragraph = 0, frame_window_p = 0}, paragraph_embedding = 0, min_width_property = 0x0, min_width_start = 0}
        wrap_data = <optimized out>
        atpos_data = 0x0
        atx_data = <optimized out>
        ppos_data = <optimized out>
        may_wrap = <optimized out>
        prev_method = <optimized out>
        closest_pos = <optimized out>
        prev_pos = <optimized out>
        saw_smaller_pos = <optimized out>
        line_number_pending = <optimized out>
        this_line_subject_to_line_prefix = <optimized out>
#33 0x00007ff75c7d2d17 in move_it_to (it=it@entry=0x348a3f7850, to_charpos=3734, to_x=<optimized out>, to_x@entry=-1, to_y=<optimized out>, to_vpos=<optimized out>, to_vpos@entry=-1, op=<optimized out>, op@entry=10) at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:10833
        it_backup = {window = 0x1d56b5a063d, w = 0x1d56b5a0638, f = 0x1d56a8b2650, method = 0, stop_charpos = 1600, prev_stop = 1590, base_level_stop = 1590, end_charpos = 3734, medium_narrowing_begv = 0, medium_narrowing_zv = 0, large_narrowing_begv = 0, large_narrowing_zv = 0, s = 0x0, string_nchars = 0, multibyte_p = 1, tab_line_p = 0, header_line_p = 1, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, from_disp_prop_p = 0, ellipsis_p = 0, avoid_cursor_p = 0, dp = 0x1d576142260, dpvec = 0x0, dpend = 0x0, dpvec_char_len = 0, dpvec_face_id = 0, saved_face_id = 0, ctl_chars = {0x0 <repeats 16 times>}, start = {pos = {charpos = 1, bytepos = 1}, overlay_string_index = -1, string_pos = {charpos = -1, bytepos = -1}, dpvec_index = -1}, current = {pos = {charpos = 1590, bytepos = 1590}, overlay_string_index = -1, string_pos = {charpos = -1, bytepos = -1}, dpvec_index = -1}, n_overlay_strings = 0, overlay_strings_charpos = 1590, overlay_strings = {0x0 <repeats 16 times>}, string_overlays = {0x0 <repeats 16 times>}, string = 0x0, from_overlay = 0x0, stack = {{string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}}, sp = 0, selective = 0, what = 0, face_id = 19, selective_display_ellipsis_p = 1, ctl_arrow_p = 1, face_box_p = 0, start_of_box_run_p = 0, end_of_box_run_p = 0, overlay_strings_at_end_processed_p = 0, ignore_overlay_strings_at_pos_p = 0, glyph_not_available_p = 0, starts_in_middle_of_char_p = 0, face_before_selective_p = 0, constrain_row_ascent_descent_p = 0, line_number_produced_p = 0, align_visually_p = 0, line_wrap = 0, base_face_id = 0, c = 50, len = 1, cmp_it = {stop_pos = 1594, id = -1, ch = 45, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x348a3f8c40, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, char_to_display = 50, glyphless_method = 0, image_id = 0, xwidget = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, space_width = 0x0, voffset = 0, tab_width = 4, font_height = 0x0, object = 0x1d571556255, position = {charpos = 1590, bytepos = 1590}, truncation_pixel_width = 8, continuation_pixel_width = 0, first_visible_x = 0, last_visible_x = 1272, last_visible_y = 1328, extra_line_spacing = 0, max_extra_line_spacing = 0, override_ascent = -1, override_descent = 0, override_boff = 0, glyph_row = 0x1d503024140, area = 1, nglyphs = 1, pixel_width = 8, ascent = 13, descent = 3, max_ascent = 13, max_descent = 3, phys_ascent = 10, phys_descent = 0, max_phys_ascent = 13, max_phys_descent = 3, current_x = 0, wrap_prefix_width = 0, continuation_lines_width = 0, eol_pos = {charpos = 0, bytepos = 0}, current_y = 226, first_vpos = 1, vpos = 13, hpos = 0, lnum = 12, lnum_bytepos = 1456, lnum_width = 3, lnum_pixel_width = 40, pt_lnum = 0, stretch_adjust = 0, left_user_fringe_bitmap = 0, right_user_fringe_bitmap = 0, left_user_fringe_face_id = 0, right_user_fringe_face_id = 0, bidi_p = 1, bidi_it = {bytepos = 1590, charpos = 1590, ch = 50, nchars = 1, ch_len = 1, type = 1, type_after_wn = 3, orig_type = 3, resolved_level = 0 '\000', isolate_level = 0 '\000', invalid_levels = 0, invalid_isolates = 0, prev = {charpos = 1589, type = 6, orig_type = 6}, last_strong = {charpos = 1587, type = 0, orig_type = 0}, next_for_neutral = {charpos = -1, type = 0, orig_type = 0}, prev_for_neutral = {charpos = 1589, type = 1, orig_type = 23}, next_for_ws = {charpos = -1, type = 0, orig_type = 0}, bracket_pairing_pos = -1, bracket_enclosed_type = 0, next_en_pos = 0, next_en_type = 0, sos = 1, scan_dir = 1, disp_pos = 1757, disp_prop = 0, stack_idx = 0, level_stack = {{next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'} <repeats 128 times>}, string = {lstring = 0x0, s = 0x0, schars = 0, bufpos = 0, from_disp_str = 0, unibyte = 0}, w = 0x1d56b5a0638, paragraph_dir = 1, separator_limit = -1, first_elt = 0, new_paragraph = 0, frame_window_p = 1}, paragraph_embedding = 1, min_width_property = 0x0, min_width_start = 0}
        skip = <optimized out>
        skip2 = <optimized out>
        line_height = <optimized out>
        line_start_x = 0
        reached = 0
        max_current_x = 1104
        backup_data = 0x0
#34 0x00007ff75c7d384c in partial_line_height (it_origin=<optimized out>) at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:11465
        partial_height = <optimized out>
        it_data = 0x0
        it = {window = 0x1d56b5a063d, w = 0x1d56b5a0638, f = 0x1d56a8b2650, method = 0, stop_charpos = 1706, prev_stop = 1672, base_level_stop = 1672, end_charpos = 3734, medium_narrowing_begv = 0, medium_narrowing_zv = 0, large_narrowing_begv = 0, large_narrowing_zv = 0, s = 0x0, string_nchars = 0, multibyte_p = 1, tab_line_p = 0, header_line_p = 1, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, from_disp_prop_p = 0, ellipsis_p = 0, avoid_cursor_p = 0, dp = 0x1d576142260, dpvec = 0x0, dpend = 0x0, dpvec_char_len = 0, dpvec_face_id = 0, saved_face_id = 0, ctl_chars = {0x0 <repeats 16 times>}, start = {pos = {charpos = 1, bytepos = 1}, overlay_string_index = -1, string_pos = {charpos = -1, bytepos = -1}, dpvec_index = -1}, current = {pos = {charpos = 1681, bytepos = 1681}, overlay_string_index = -1, string_pos = {charpos = -1, bytepos = -1}, dpvec_index = -1}, n_overlay_strings = 0, overlay_strings_charpos = 1672, overlay_strings = {0x0 <repeats 16 times>}, string_overlays = {0x0 <repeats 16 times>}, string = 0x0, from_overlay = 0x0, stack = {{string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}}, sp = 0, selective = 0, what = 0, face_id = 24, selective_display_ellipsis_p = 1, ctl_arrow_p = 1, face_box_p = 0, start_of_box_run_p = 0, end_of_box_run_p = 0, overlay_strings_at_end_processed_p = 0, ignore_overlay_strings_at_pos_p = 0, glyph_not_available_p = 0, starts_in_middle_of_char_p = 0, face_before_selective_p = 0, constrain_row_ascent_descent_p = 0, line_number_produced_p = 1, align_visually_p = 0, line_wrap = 0, base_face_id = 0, c = 111, len = 1, cmp_it = {stop_pos = 1681, id = -1, ch = 119, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x348a3f8c40, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, char_to_display = 111, glyphless_method = 0, image_id = 0, xwidget = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, space_width = 0x0, voffset = 0, tab_width = 4, font_height = 0x0, object = 0x1d571556255, position = {charpos = 1680, bytepos = 1680}, truncation_pixel_width = 8, continuation_pixel_width = 0, first_visible_x = 0, last_visible_x = 1272, last_visible_y = 1328, extra_line_spacing = 0, max_extra_line_spacing = 0, override_ascent = -1, override_descent = 0, override_boff = 0, glyph_row = 0x0, area = 1, nglyphs = 1, pixel_width = 8, ascent = 13, descent = 3, max_ascent = 13, max_descent = 3, phys_ascent = 7, phys_descent = 0, max_phys_ascent = 13, max_phys_descent = 3, current_x = 768, wrap_prefix_width = 0, continuation_lines_width = 0, eol_pos = {charpos = 0, bytepos = 0}, current_y = 226, first_vpos = 1, vpos = 13, hpos = 96, lnum = 13, lnum_bytepos = 1590, lnum_width = 3, lnum_pixel_width = 40, pt_lnum = 0, stretch_adjust = 0, left_user_fringe_bitmap = 0, right_user_fringe_bitmap = 0, left_user_fringe_face_id = 0, right_user_fringe_face_id = 0, bidi_p = 1, bidi_it = {bytepos = 1681, charpos = 1681, ch = 119, nchars = 1, ch_len = 1, type = 1, type_after_wn = 1, orig_type = 1, resolved_level = 0 '\000', isolate_level = 0 '\000', invalid_levels = 0, invalid_isolates = 0, prev = {charpos = 1680, type = 1, orig_type = 1}, last_strong = {charpos = 1680, type = 1, orig_type = 1}, next_for_neutral = {charpos = -1, type = 0, orig_type = 0}, prev_for_neutral = {charpos = 1680, type = 1, orig_type = 1}, next_for_ws = {charpos = 1676, type = 1, orig_type = 0}, bracket_pairing_pos = -1, bracket_enclosed_type = 0, next_en_pos = 0, next_en_type = 0, sos = 1, scan_dir = 1, disp_pos = 1757, disp_prop = 0, stack_idx = 0, level_stack = {{next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'} <repeats 128 times>}, string = {lstring = 0x0, s = 0x0, schars = 0, bufpos = 0, from_disp_str = 0, unibyte = 0}, w = 0x1d56b5a0638, paragraph_dir = 1, separator_limit = -1, first_elt = 0, new_paragraph = 0, frame_window_p = 1}, paragraph_embedding = 1, min_width_property = 0x0, min_width_start = 0}
#35 0x00007ff75c7e3b55 in try_window (window=window@entry=0x1d56b5a063d, pos=..., flags=<optimized out>, flags@entry=1) at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:21292
        top_scroll_margin = <optimized out>
        bot_scroll_margin = 80
        w = 0x1d56b5a0638
        it = {window = 0x1d56b5a063d, w = 0x1d56b5a0638, f = 0x1d56a8b2650, method = 0, stop_charpos = 11, prev_stop = 1, base_level_stop = 0, end_charpos = 3734, medium_narrowing_begv = 0, medium_narrowing_zv = 0, large_narrowing_begv = 0, large_narrowing_zv = 0, s = 0x0, string_nchars = 0, multibyte_p = 1, tab_line_p = 0, header_line_p = 1, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, from_disp_prop_p = 0, ellipsis_p = 0, avoid_cursor_p = 0, dp = 0x1d576142260, dpvec = 0x0, dpend = 0x0, dpvec_char_len = 0, dpvec_face_id = 0, saved_face_id = 0, ctl_chars = {0x0 <repeats 16 times>}, start = {pos = {charpos = 1, bytepos = 1}, overlay_string_index = -1, string_pos = {charpos = -1, bytepos = -1}, dpvec_index = -1}, current = {pos = {charpos = 1, bytepos = 1}, overlay_string_index = -1, string_pos = {charpos = -1, bytepos = -1}, dpvec_index = -1}, n_overlay_strings = 0, overlay_strings_charpos = 1, overlay_strings = {0x0 <repeats 16 times>}, string_overlays = {0x0 <repeats 16 times>}, string = 0x0, from_overlay = 0x0, stack = {{string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}}, sp = 0, selective = 0, what = 0, face_id = 27, selective_display_ellipsis_p = 1, ctl_arrow_p = 1, face_box_p = 0, start_of_box_run_p = 0, end_of_box_run_p = 0, overlay_strings_at_end_processed_p = 0, ignore_overlay_strings_at_pos_p = 0, glyph_not_available_p = 0, starts_in_middle_of_char_p = 0, face_before_selective_p = 0, constrain_row_ascent_descent_p = 0, line_number_produced_p = 0, align_visually_p = 0, line_wrap = 0, base_face_id = 0, c = 50, len = 0, cmp_it = {stop_pos = 5, id = -1, ch = 45, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x348a3f8c40, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, char_to_display = 0, glyphless_method = 0, image_id = 0, xwidget = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, space_width = 0x0, voffset = 0, tab_width = 4, font_height = 0x0, object = 0x1d571556255, position = {charpos = 1, bytepos = 1}, truncation_pixel_width = 8, continuation_pixel_width = 0, first_visible_x = 0, last_visible_x = 1272, last_visible_y = 1328, extra_line_spacing = 0, max_extra_line_spacing = 0, override_ascent = -1, override_descent = 0, override_boff = 0, glyph_row = 0x1d503024140, area = 1, nglyphs = 1, pixel_width = 0, ascent = 0, descent = 0, max_ascent = 0, max_descent = 0, phys_ascent = 0, phys_descent = 0, max_phys_ascent = 0, max_phys_descent = 0, current_x = 0, wrap_prefix_width = 0, continuation_lines_width = 0, eol_pos = {charpos = 0, bytepos = 0}, current_y = 18, first_vpos = 1, vpos = 0, hpos = 0, lnum = 0, lnum_bytepos = 0, lnum_width = 0, lnum_pixel_width = 0, pt_lnum = 0, stretch_adjust = 0, left_user_fringe_bitmap = 0, right_user_fringe_bitmap = 0, left_user_fringe_face_id = 0, right_user_fringe_face_id = 0, bidi_p = 1, bidi_it = {bytepos = 1, charpos = 1, ch = 0, nchars = -1, ch_len = 0, type = 6, type_after_wn = 6, orig_type = 6, resolved_level = 0 '\000', isolate_level = 0 '\000', invalid_levels = 0, invalid_isolates = 0, prev = {charpos = 0, type = 0, orig_type = 0}, last_strong = {charpos = 0, type = 0, orig_type = 0}, next_for_neutral = {charpos = -1, type = 0, orig_type = 0}, prev_for_neutral = {charpos = -1, type = 0, orig_type = 0}, next_for_ws = {charpos = 0, type = 0, orig_type = 0}, bracket_pairing_pos = -1, bracket_enclosed_type = 0, next_en_pos = 0, next_en_type = 0, sos = 1, scan_dir = 0, disp_pos = -1, disp_prop = 0, stack_idx = 0, level_stack = {{next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'} <repeats 128 times>}, string = {lstring = 0x0, s = 0x0, schars = 0, bufpos = 0, from_disp_str = 0, unibyte = 0}, w = 0x1d56b5a0638, paragraph_dir = 0, separator_limit = -1, first_elt = 1, new_paragraph = 1, frame_window_p = 1}, paragraph_embedding = 1, min_width_property = 0x0, min_width_start = 0}
        last_text_row = <optimized out>
        f = <optimized out>
        cursor_vpos = 1
        it_charpos = 3734
#36 0x00007ff75c7e98eb in redisplay_window (window=<optimized out>, just_this_one_p=just_this_one_p@entry=true) at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:20635
        d2 = 469
        d6 = 0
        d1 = -1984471040
        d5 = 50479168
        rtop = 0
        rbot = 0
        w = 0x1d56b5a0638
        f = <optimized out>
        buffer = <optimized out>
        old = <optimized out>
        lpoint = <optimized out>
        opoint = <optimized out>
        startp = <optimized out>
        update_mode_line = <optimized out>
        tem = <optimized out>
        it = {window = 0x0, w = 0x1600000000, f = 0x3f, method = 0, stop_charpos = -1, prev_stop = 0, base_level_stop = 1, end_charpos = 94489280513, medium_narrowing_begv = 1, medium_narrowing_zv = 6, large_narrowing_begv = -1, large_narrowing_zv = 0, s = 0x0, string_nchars = 4294967296, multibyte_p = 1, tab_line_p = 0, header_line_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, from_disp_prop_p = 0, ellipsis_p = 0, avoid_cursor_p = 0, dp = 0x1, dpvec = 0x0, dpend = 0x0, dpvec_char_len = 0, dpvec_face_id = 0, saved_face_id = 0, ctl_chars = {0x0 <repeats 16 times>}, start = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, n_overlay_strings = 0, overlay_strings_charpos = 0, overlay_strings = {0x0 <repeats 16 times>}, string_overlays = {0x0 <repeats 16 times>}, string = 0x0, from_overlay = 0x0, stack = {{string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x0}, {string = 0x0, string_nchars = 0, end_charpos = 0, stop_charpos = 0, prev_stop = 0, base_level_stop = 0, cmp_it = {stop_pos = 0, id = 0, ch = 0, rule_idx = 0, lookback = 0, nglyphs = 0, reversed_p = false, parent_it = 0x0, charpos = 0, nchars = 0, nbytes = 0, from = 0, to = 0, width = 0}, face_id = 0, u = {image = {object = 0x0, slice = {x = 0x0, y = 0x0, width = 0x0, height = 0x0}, image_id = 0}, stretch = {object = 0x0}, xwidget = {object = 0x0}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 0}, overlay_string_index = 0, string_pos = {charpos = 0, bytepos = 0}, dpvec_index = 0}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x7f88, font_height = 0x3b80}, {string = 0x0, string_nchars = 1560405768, end_charpos = 224, stop_charpos = 140700388520576, prev_stop = 140700394055432, base_level_stop = 224, cmp_it = {stop_pos = 140700388520576, id = 50120, ch = 1901421141, rule_idx = 140700386687222, lookback = 2016140723768, nglyphs = 1353, reversed_p = false, parent_it = 0x1d56a8b2650, charpos = 0, nchars = 1, nbytes = 0, from = 0, to = 0, width = 1554870912}, face_id = 50120, u = {image = {object = 0xc, slice = {x = 0xc3c8, y = 0x0, width = 0x1d571556255, height = 0x0}, image_id = 2014390161984}, stretch = {object = 0xc}, xwidget = {object = 0xc}}, position = {charpos = 0, bytepos = 0}, current = {pos = {charpos = 0, bytepos = 1}, overlay_string_index = 2016140723768, string_pos = {charpos = 1330, bytepos = 0}, dpvec_index = 1554020295}, from_overlay = 0x0, area = 0, method = 0, paragraph_embedding = 0, multibyte_p = 0, string_from_display_prop_p = 0, string_from_prefix_prop_p = 0, display_ellipsis_p = 0, avoid_cursor_p = 0, bidi_p = 0, from_disp_prop_p = 0, line_wrap = 0, voffset = 0, space_width = 0x0, font_height = 0x7f005c9178c9}}, sp = 1560284160, selective = 0, what = 0, face_id = 1328, selective_display_ellipsis_p = 0, ctl_arrow_p = 1, face_box_p = 0, start_of_box_run_p = 0, end_of_box_run_p = 0, overlay_strings_at_end_processed_p = 0, ignore_overlay_strings_at_pos_p = 0, glyph_not_available_p = 0, starts_in_middle_of_char_p = 0, face_before_selective_p = 0, constrain_row_ascent_descent_p = 0, line_number_produced_p = 0, align_visually_p = 0, line_wrap = 106, base_face_id = 1561358992, c = 32759, len = 0, cmp_it = {stop_pos = 32648, id = 15232, ch = 0, rule_idx = 140700394055432, lookback = 192, nglyphs = 1554870912, reversed_p = 247, parent_it = 0x7ff75d01e708 <o_fwd+296>, charpos = 192, nchars = 1554870912, nbytes = 32759, from = 50064, to = 0, width = 1901421141}, char_to_display = 1553037558, glyphless_method = 32759, image_id = -1, xwidget = 0xffffffffffffffff, slice = {x = 0xffffffffffffffff, y = 0xffffffffffffffff, width = 0xffffffffffffffff, height = 0x0}, space_width = 0xffffffffffffffff, voffset = -1, tab_width = -1, font_height = 0xc, object = 0xc390, position = {charpos = 56, bytepos = 2016241082965}, truncation_pixel_width = 1592, continuation_pixel_width = 27482, first_visible_x = 469, last_visible_x = 1554870912, last_visible_y = 32759, extra_line_spacing = 1, max_extra_line_spacing = 0, override_ascent = 24174, override_descent = 0, override_boff = 1901421760, glyph_row = 0x0, area = 1, nglyphs = 0, pixel_width = 1801061944, ascent = 469, descent = 1901421136, max_ascent = 469, max_descent = 1551792876, phys_ascent = 32759, phys_descent = -1975538688, max_phys_ascent = 52, max_phys_descent = 0, current_x = 0, wrap_prefix_width = 1, continuation_lines_width = 0, eol_pos = {charpos = 485, bytepos = 225657728000}, current_y = 159, first_vpos = 16, vpos = 1901421136, hpos = 469, lnum = 1, lnum_bytepos = 192, lnum_width = 0, lnum_pixel_width = 0, pt_lnum = 3600, stretch_adjust = 1787504208, left_user_fringe_bitmap = 469, right_user_fringe_bitmap = 0, left_user_fringe_face_id = 1, right_user_fringe_face_id = 0, bidi_p = 0, bidi_it = {bytepos = 21474860654, charpos = 0, ch = 16777217, nchars = 2016241082960, ch_len = 1, type = 192, type_after_wn = 0, orig_type = 1, resolved_level = 0 '\000', isolate_level = 0 '\000', invalid_levels = 225657728000, invalid_isolates = 24174, prev = {charpos = 1, type = 24174, orig_type = 0}, last_strong = {charpos = 225657728160, type = 1, orig_type = 0}, next_for_neutral = {charpos = 159, type = 145015824, orig_type = 469}, prev_for_neutral = {charpos = 0, type = 184549376, orig_type = 1073741824}, next_for_ws = {charpos = 1, type = 1, orig_type = 0}, bracket_pairing_pos = 8, bracket_enclosed_type = 1552558704, next_en_pos = 0, next_en_type = 1551642518, sos = 32759, scan_dir = 0, disp_pos = 2016140739104, disp_prop = 1801077280, stack_idx = 469, level_stack = {{next_for_neutral_pos = 2, next_for_neutral_type = 0, last_strong_type = 1, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385394879, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 4294967296, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 5463198400512, next_for_neutral_type = 7, last_strong_type = 4, prev_for_neutral_type = 7, level = 152 '\230', flags = 225 'á'}, {next_for_neutral_pos = 0, next_for_neutral_type = 2, last_strong_type = 7, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 244, next_for_neutral_type = 0, last_strong_type = 5, prev_for_neutral_type = 4, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 336, next_for_neutral_type = 0, last_strong_type = 7, prev_for_neutral_type = 4, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 140719322069165, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140719322081247, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 2, last_strong_type = 7, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 300170969373004, next_for_neutral_type = 5, last_strong_type = 7, prev_for_neutral_type = 5, level = 177 '±', flags = 96 '`'}, {next_for_neutral_pos = 0, next_for_neutral_type = 7, last_strong_type = 3, prev_for_neutral_type = 3, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1345, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 122, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 285290042, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140719322068231, next_for_neutral_type = 7, last_strong_type = 6, prev_for_neutral_type = 3, level = 152 '\230', flags = 225 'á'}, {next_for_neutral_pos = 16, next_for_neutral_type = 2, last_strong_type = 7, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 4, next_for_neutral_type = 0, last_strong_type = 5, prev_for_neutral_type = 4, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 96, next_for_neutral_type = 0, last_strong_type = 5, prev_for_neutral_type = 0, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 140719322069165, next_for_neutral_type = 7, last_strong_type = 2, prev_for_neutral_type = 4, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 140719337968928, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140719322081247, next_for_neutral_type = 7, last_strong_type = 2, prev_for_neutral_type = 4, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1374406714612044, next_for_neutral_type = 7, last_strong_type = 2, prev_for_neutral_type = 4, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1374406714612044, next_for_neutral_type = 2, last_strong_type = 7, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 300170969373004, next_for_neutral_type = 5, last_strong_type = 7, prev_for_neutral_type = 5, level = 177 '±', flags = 96 '`'}, {next_for_neutral_pos = 140719337968129, next_for_neutral_type = 7, last_strong_type = 5, prev_for_neutral_type = 3, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1345, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 285290042, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140719322068231, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 16, next_for_neutral_type = 7, last_strong_type = 5, prev_for_neutral_type = 3, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1345, next_for_neutral_type = 2, last_strong_type = 7, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 300170969373004, next_for_neutral_type = 5, last_strong_type = 7, prev_for_neutral_type = 5, level = 177 '±', flags = 96 '`'}, {next_for_neutral_pos = 0, next_for_neutral_type = 6, last_strong_type = 3, prev_for_neutral_type = 1, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140719322062463, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140719337968928, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140719337968928, next_for_neutral_type = 6, last_strong_type = 3, prev_for_neutral_type = 1, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1252360923928908, next_for_neutral_type = 6, last_strong_type = 3, prev_for_neutral_type = 1, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1252360923928908, next_for_neutral_type = 5, last_strong_type = 7, prev_for_neutral_type = 5, level = 177 '±', flags = 96 '`'}, {next_for_neutral_pos = -2786495952902261891, next_for_neutral_type = 6, last_strong_type = 3, prev_for_neutral_type = 1, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140719337968129, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 262144, next_for_neutral_type = 4, last_strong_type = 0, prev_for_neutral_type = 4, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 225657729248, next_for_neutral_type = 6, last_strong_type = 3, prev_for_neutral_type = 1, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140719322075097, next_for_neutral_type = 5, last_strong_type = 7, prev_for_neutral_type = 5, level = 177 '±', flags = 96 '`'}, {next_for_neutral_pos = 0, next_for_neutral_type = 2, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140719337967730, next_for_neutral_type = 6, last_strong_type = 3, prev_for_neutral_type = 1, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1929653854, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 140719322075097, next_for_neutral_type = 4, last_strong_type = 1, prev_for_neutral_type = 5, level = 1 '\001', flags = 17 '\021'}, {next_for_neutral_pos = -2786495952902261891, next_for_neutral_type = 2, last_strong_type = 5, prev_for_neutral_type = 4, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 3046789670263116, next_for_neutral_type = 5, last_strong_type = 7, prev_for_neutral_type = 5, level = 100 'd', flags = 99 'c'}, {next_for_neutral_pos = 140719322075097, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140719322075097, next_for_neutral_type = 4, last_strong_type = 1, prev_for_neutral_type = 5, level = 1 '\001', flags = 17 '\021'}, {next_for_neutral_pos = -2786495952902261891, next_for_neutral_type = 7, last_strong_type = 6, prev_for_neutral_type = 3, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2846678554007884, next_for_neutral_type = 5, last_strong_type = 7, prev_for_neutral_type = 5, level = 100 'd', flags = 99 'c'}, {next_for_neutral_pos = 0, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = -72057594036801990, next_for_neutral_type = 4, last_strong_type = 1, prev_for_neutral_type = 5, level = 1 '\001', flags = 17 '\021'}, {next_for_neutral_pos = -2786495952902261891, next_for_neutral_type = 7, last_strong_type = 6, prev_for_neutral_type = 3, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2846678554007884, next_for_neutral_type = 5, last_strong_type = 7, prev_for_neutral_type = 5, level = 100 'd', flags = 99 'c'}, {next_for_neutral_pos = 0, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016052732444, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 6, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 1, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 140719322069826, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 4, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = -72057594036801990, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 3 '\003', flags = 1 '\001'}, {next_for_neutral_pos = -72057594036801990, next_for_neutral_type = 4, last_strong_type = 1, prev_for_neutral_type = 5, level = 1 '\001', flags = 17 '\021'}, {next_for_neutral_pos = -2786495952902261891, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 6, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 140719322075097, next_for_neutral_type = 0, last_strong_type = 3, prev_for_neutral_type = 0, level = 3 '\003', flags = 1 '\001'}, {next_for_neutral_pos = 1513211162718635038, next_for_neutral_type = 0, last_strong_type = 3, prev_for_neutral_type = 0, level = 3 '\003', flags = 1 '\001'}, {next_for_neutral_pos = 4179342172186739730, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = -2113859741, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = -72057594036801990, next_for_neutral_type = 4, last_strong_type = 1, prev_for_neutral_type = 5, level = 1 '\001', flags = 17 '\021'}, {next_for_neutral_pos = -2786495952902261891, next_for_neutral_type = 2, last_strong_type = 5, prev_for_neutral_type = 4, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140719322075097, next_for_neutral_type = 5, last_strong_type = 7, prev_for_neutral_type = 5, level = 100 'd', flags = 99 'c'}, {next_for_neutral_pos = 140719322075097, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140719322075097, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = -72057594036801990, next_for_neutral_type = 4, last_strong_type = 1, prev_for_neutral_type = 5, level = 1 '\001', flags = 17 '\021'}, {next_for_neutral_pos = -2786495952902261891, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = -72057594036801990, next_for_neutral_type = 4, last_strong_type = 1, prev_for_neutral_type = 5, level = 1 '\001', flags = 17 '\021'}, {next_for_neutral_pos = -2786495952902261891, next_for_neutral_type = 7, last_strong_type = 6, prev_for_neutral_type = 3, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2846678554007884, next_for_neutral_type = 5, last_strong_type = 7, prev_for_neutral_type = 5, level = 100 'd', flags = 99 'c'}, {next_for_neutral_pos = 0, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016052732444, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 6, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 7, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 140719322069826, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 4, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = -72057594037927936, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 1 '\001', flags = 17 '\021'}, {next_for_neutral_pos = -2786495952902261891, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = -72057594036801990, next_for_neutral_type = 4, last_strong_type = 1, prev_for_neutral_type = 5, level = 1 '\001', flags = 17 '\021'}, {next_for_neutral_pos = -2786495952902261891, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 6, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 4179342172186739730, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1513211162718635038, next_for_neutral_type = 0, last_strong_type = 3, prev_for_neutral_type = 0, level = 3 '\003', flags = 1 '\001'}, {next_for_neutral_pos = 4179342172186739730, next_for_neutral_type = 1, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1280, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 1, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 225657730048, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 4294967295, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2016127166032, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 3, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 140700385522513, next_for_neutral_type = 0, last_strong_type = 1, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140700385523116, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 1280, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 1, next_for_neutral_type = 6, last_strong_type = 3, prev_for_neutral_type = 2, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2014339661824, next_for_neutral_type = 4, last_strong_type = 0, prev_for_neutral_type = 0, level = 4 '\004', flags = 0 '\000'}, {next_for_neutral_pos = 2014484908496, next_for_neutral_type = 7, last_strong_type = 5, prev_for_neutral_type = 3, level = 48 '0', flags = 5 '\005'}, {next_for_neutral_pos = 73014445377, next_for_neutral_type = 1, last_strong_type = 2, prev_for_neutral_type = 0, level = 25 '\031', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 1, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 2016140723768, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 5, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 1, next_for_neutral_type = 0, last_strong_type = 6, prev_for_neutral_type = 7, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 2, next_for_neutral_type = 0, last_strong_type = 6, prev_for_neutral_type = 1, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 2016330726424, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 0, next_for_neutral_type = 0, last_strong_type = 0, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 2, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 0, level = 213 'Õ', flags = 1 '\001'}, {next_for_neutral_pos = 285290042, next_for_neutral_type = 7, last_strong_type = 6, prev_for_neutral_type = 2, level = 152 '\230', flags = 225 'á'}, {next_for_neutral_pos = 140719322075097, next_for_neutral_type = 2, last_strong_type = 7, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 140, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 4, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 232, next_for_neutral_type = 0, last_strong_type = 5, prev_for_neutral_type = 1, level = 52 '4', flags = 0 '\000'}, {next_for_neutral_pos = 140719322069165, next_for_neutral_type = 7, last_strong_type = 6, prev_for_neutral_type = 5, level = 152 '\230', flags = 225 'á'}, {next_for_neutral_pos = 1, next_for_neutral_type = 2, last_strong_type = 7, prev_for_neutral_type = 0, level = 0 '\000', flags = 0 '\000'}, {next_for_neutral_pos = 68, next_for_neutral_type = 0, last_strong_type = 2, prev_for_neutral_type = 4, level = 52 '4', flags = 0 '\000'}}, string = {lstring = 0xa0, s = 0x348a3fb6a8 "\001\022'Æû\177", schars = 140719322069165, bufpos = 248044808422711, from_disp_str = 1, unibyte = 0}, w = 0x11012e3a, paragraph_dir = 4, separator_limit = 225648796432, first_elt = 0, new_paragraph = 0, frame_window_p = 0}, paragraph_embedding = 2319431400, min_width_property = 0x7ffbc53478ad <gdi32full!GetCurrentPositionEx+797>, min_width_start = 0}
        current_matrix_up_to_date_p = <optimized out>
        used_current_matrix_p = false
        temp_scroll_step = false
        count = <optimized out>
        rc = <optimized out>
        centering_position = -1
        last_line_misfit = false
        beg_unchanged = <optimized out>
        end_unchanged = <optimized out>
        frame_line_height = <optimized out>
        margin = <optimized out>
        use_desired_matrix = <optimized out>
        itdata = 0x0
        lchars_modiff = <optimized out>
        ochars_modiff = <optimized out>
        force_start = <optimized out>
#37 0x00007ff75c7ebc4a in redisplay_window_1 (window=<optimized out>) at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:18126
No locals.
#38 0x00007ff75c908187 in internal_condition_case_1 (bfun=0x7ff75c7ebc10 <redisplay_window_1>, arg=0x1d56b5a063d, handlers=<optimized out>, hfun=0x7ff75c7ddac0 <redisplay_window_error>) at D:/a/emacs-build/emacs-build/git/972842f/src/eval.c:1642
        val = <optimized out>
        c = 0x1d56a2bd838
#39 0x00007ff75c7e243c in redisplay_internal.lto_priv.0 () at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:17614
        mini_window = <optimized out>
        mini_frame = <optimized out>
        w = <optimized out>
        sw = <optimized out>
        fr = <optimized out>
        pending = false
        must_finish = <optimized out>
        match_p = <optimized out>
        tlbufpos = <optimized out>
        tlendpos = <optimized out>
        number_of_visible_frames = <optimized out>
        sf = <optimized out>
        polling_stopped_here = <optimized out>
        tail = <optimized out>
        frame = <optimized out>
        hscroll_retries = <optimized out>
        garbaged_frame_retries = <optimized out>
        consider_all_windows_p = <optimized out>
        update_miniwindow_p = <optimized out>
        count = <optimized out>
        retry = <optimized out>
        retry_frame = <optimized out>
#40 0x00007ff75ca43125 in redisplay_preserve_echo_area.isra.0 () at D:/a/emacs-build/emacs-build/git/972842f/src/xdisp.c:17849
No locals.
#41 0x00007ff75ca2c504 in wait_reading_process_output.constprop.0 () at D:/a/emacs-build/emacs-build/git/972842f/src/keyboard.c:11596
No locals.
#42 0x0000000000000000 in ?? ()
No symbol table info available.
Detaching from program: C:\Program Files\WindowsApps\emacs-k_31.313.0.0_x64__tewns1xw2exn6\bin\emacs.exe, process 22860
[Inferior 1 (process 22860) detached]

^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-09-03  4:12                                                                                               ` Kien Nguyen
@ 2024-09-03 10:37                                                                                                 ` Pip Cet
  2024-09-03 16:50                                                                                                   ` Kien Nguyen
  0 siblings, 1 reply; 119+ messages in thread
From: Pip Cet @ 2024-09-03 10:37 UTC (permalink / raw)
  To: Kien Nguyen; +Cc: Eli Zaretskii, sebastian, emacs-devel, yantar92

"Kien Nguyen" <kien.n.quang@gmail.com> writes:

> I got another two crashes related to mps.
> The backtrace is attached.  The emacs source code is here[1].
> Hope this helps.

Thank you, it does.  I found the bug, but fixing it is going to require
changes to your MPS patch series.

The disassembled code that's causing the problem reads:

   0x000000040013c950 <+1216>:	mov    (%r12),%rdx
   0x000000040013c954 <+1220>:	movq   %rax,%xmm1
   0x000000040013c959 <+1225>:	mov    0x278(%rdx),%rax
   0x000000040013c960 <+1232>:	sub    $0x1,%rbx
   0x000000040013c964 <+1236>:	mov    $0x3,%edx
   0x000000040013c969 <+1241>:	movq   (%rdi,%rbx,8),%xmm6
   0x000000040013c96e <+1246>:	mov    $0x18,%ecx
   0x000000040013c973 <+1251>:	mov    0x20(%rax),%r8
   0x000000040013c977 <+1255>:	punpcklqdq %xmm1,%xmm6
   0x000000040013c97b <+1259>:	call   0x4002061e0 <alloc_impl.lto_priv.0>
   0x000000040013c980 <+1264>:	movups %xmm6,0x8(%rax)
   0x000000040013c984 <+1268>:	add    $0x3,%rax
   0x000000040013c988 <+1272>:	test   %rbx,%rbx
   0x000000040013c98b <+1275>:	jne    0x40013c950 <Fmatch_data+1216>

During the call to <alloc_impl.lto_priv.0> at +1259, the future value of
the cons cell lives only in XMM registers (%xmm1 and %xmm6); while it
was returned from the previous iteration in %rax, that register is
overwritten by the mov at +1225.

This isn't a problem for the first iteration, when the cdr is Qnil,
which is safe to use, but after the first generation, this is the only
place that holds a reference to the list we're building.

alloc_impl can call GC, which will then fail to find a reference to the
list that's being built and collect it, but return to +1264 where the
reference to the freed cons cell is written back to memory.

IOW, we need to make sure that the callee-saved %xmm registers are
properly spilled to the stack and marked conservatively.

However, this patch:

https://github.com/kiennq/emacs-build/blob/main/patches/mps/0004-Fix-register-scanning-on-FreeBSD-and-Linux.patch

replaces setjmp() by a series of assembler statements:

#define STACK_CONTEXT_SAVE(sc)                                  \
  BEGIN                                                         \
    Word *_save = (sc)->calleeSave;                             \
    __asm__ volatile ("mov %%rbp, %0" : "=m" (_save[0]));       \
    __asm__ volatile ("mov %%rbx, %0" : "=m" (_save[1]));       \
    __asm__ volatile ("mov %%r12, %0" : "=m" (_save[2]));       \
    __asm__ volatile ("mov %%r13, %0" : "=m" (_save[3]));       \
    __asm__ volatile ("mov %%r14, %0" : "=m" (_save[4]));       \
    __asm__ volatile ("mov %%r15, %0" : "=m" (_save[5]));       \
  END

This assumes the SysV ABI is in use, which doesn't have callee-saved XMM
registers.  However, GCC (correctly) uses the Microsoft x64 ABI, which
also requires XMM registers %xmm6-%xmm15, as well as general registers
%rdi and %rsi, to be callee-saved
(https://learn.microsoft.com/en-us/cpp/build/x64-calling-convention).

So this patch doesn't work for Windows 64 builds. I'm not entirely sure
that simply removing this patch will make things work, though, because I
don't know how Microsoft's UCRT implements setjmp.  MPS relies on it to
store the value of the callee-saved registers without any further
mangling, on the stack, in aligned words.

A safe (but very slightly slower) solution would be to simply store the
registers twice, once using setjmp() and once using the assembler
statements.  Would that be acceptable for your build?

Pip




^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-09-03 10:37                                                                                                 ` Pip Cet
@ 2024-09-03 16:50                                                                                                   ` Kien Nguyen
  2024-09-03 17:48                                                                                                     ` Pip Cet
  0 siblings, 1 reply; 119+ messages in thread
From: Kien Nguyen @ 2024-09-03 16:50 UTC (permalink / raw)
  To: Pip Cet; +Cc: Eli Zaretskii, sebastian, emacs-devel, yantar92

> A safe (but very slightly slower) solution would be to simply store the
> registers twice, once using setjmp() and once using the assembler
> statements.  Would that be acceptable for your build?

That works for me. Thank you.
However, let me try to modify the patch to exclude Windows there.  The
MPS supports Windows build so I think it should work without the patch
that's meant for FreBSD and Linux.



^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-09-03 16:50                                                                                                   ` Kien Nguyen
@ 2024-09-03 17:48                                                                                                     ` Pip Cet
  0 siblings, 0 replies; 119+ messages in thread
From: Pip Cet @ 2024-09-03 17:48 UTC (permalink / raw)
  To: Kien Nguyen; +Cc: Eli Zaretskii, sebastian, emacs-devel, yantar92

"Kien Nguyen" <kien.n.quang@gmail.com> writes:

>> A safe (but very slightly slower) solution would be to simply store the
>> registers twice, once using setjmp() and once using the assembler
>> statements.  Would that be acceptable for your build?
>
> That works for me. Thank you.
> However, let me try to modify the patch to exclude Windows there.  The
> MPS supports Windows build so I think it should work without the patch
> that's meant for FreBSD and Linux.

That makes sense, let's try that!

Pip




^ permalink raw reply	[flat|nested] 119+ messages in thread

* Re: MPS: Win64 testers?
  2024-09-01 18:54                                                                                         ` Kien Nguyen
  2024-09-01 19:27                                                                                           ` Eli Zaretskii
  2024-09-01 19:44                                                                                           ` Pip Cet
@ 2024-09-07  8:19                                                                                           ` Eli Zaretskii
  2 siblings, 0 replies; 119+ messages in thread
From: Eli Zaretskii @ 2024-09-07  8:19 UTC (permalink / raw)
  To: Kien Nguyen; +Cc: sebastian, pipcet, emacs-devel, yantar92

> From: Kien Nguyen <kien.n.quang@gmail.com>
> Date: Sun, 1 Sep 2024 11:54:04 -0700
> Cc: sebastian@sebasmonia.com, pipcet@protonmail.com, emacs-devel@gnu.org, 
>  yantar92@posteo.net
> 
> > Does the alternative change below solve your problem when attaching to
> > Emacs??
> 
> Sorry, I didn't notice this email before answering the other one. :)
> 
> Yes, that would also solve my issue. The `if` check should be changed to
> a `while` loop, as `remove_w32_kbdhook` will just decrease the reference
> count if there's still more than one reference to the `kbdhook`.

Thanks, I made that change and installed the result on the master
branch.



^ permalink raw reply	[flat|nested] 119+ messages in thread

end of thread, other threads:[~2024-09-07  8:19 UTC | newest]

Thread overview: 119+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-25  9:45 MPS: Win64 testers? Angelo Graziosi
2024-07-25 10:02 ` Stefan Kangas
2024-07-25 11:35 ` Eli Zaretskii
2024-07-27 14:22   ` Angelo Graziosi
  -- strict thread matches above, loose matches on Subject: below --
2024-08-06  3:04 Quang Kien Nguyen
2024-08-06  7:03 ` Quang Kien Nguyen
2024-08-06 11:40 ` Eli Zaretskii
2024-08-06 17:39   ` Quang Kien Nguyen
2024-08-06 18:32     ` Eli Zaretskii
2024-08-06 20:52       ` Quang Kien Nguyen
2024-08-07 11:41         ` Eli Zaretskii
2024-08-07 18:32           ` Quang Kien Nguyen
2024-08-08  5:46             ` Eli Zaretskii
2024-08-08 23:44               ` Quang Kien Nguyen
2024-08-09  6:00                 ` Eli Zaretskii
2024-08-09  6:10                   ` Eli Zaretskii
2024-08-09  9:19                     ` Quang Kien Nguyen
2024-08-09 11:03                       ` Eli Zaretskii
2024-08-13 12:12                         ` Quang Kien Nguyen
2024-08-13 12:37                           ` Eli Zaretskii
2024-08-13 15:51                             ` Pip Cet
2024-08-13 18:26                               ` Quang Kien Nguyen
2024-08-13 19:19                                 ` Eli Zaretskii
2024-08-13 20:22                                   ` Quang Kien Nguyen
2024-08-14 13:11                                     ` Sebastián Monía
2024-08-14 17:24                                       ` Quang Kien Nguyen
2024-08-16 20:09                                         ` Sebastián Monía
2024-08-17 11:37                                           ` Sebastián Monía
2024-08-17 12:54                                             ` Eli Zaretskii
2024-08-17 13:24                                               ` Sebastián Monía
2024-08-19 14:34                                                 ` Sebastián Monía
2024-08-19 14:55                                                   ` Eli Zaretskii
2024-08-19 15:12                                                     ` Pip Cet
2024-08-19 15:23                                                     ` Sebastián Monía
2024-08-19 15:31                                                       ` Quang Kien Nguyen
2024-08-19 16:23                                                         ` Quang Kien Nguyen
2024-08-21 18:14                                                           ` Sebastián Monía
2024-08-21 18:20                                                             ` Pip Cet
2024-08-21 19:46                                                               ` Sebastián Monía
2024-08-21 18:22                                                             ` Ihor Radchenko
2024-08-21 19:48                                                               ` Sebastián Monía
2024-08-22 17:34                                                             ` Sebastián Monía
2024-08-22 17:51                                                               ` Pip Cet
2024-08-22 18:34                                                                 ` Eli Zaretskii
2024-08-22 19:12                                                                   ` Quang Kien Nguyen
2024-08-23  5:32                                                                     ` Eli Zaretskii
2024-08-22 19:14                                                                   ` Pip Cet
2024-08-23  5:38                                                                     ` Eli Zaretskii
2024-08-23  7:59                                                                       ` Pip Cet
2024-08-23 13:08                                                                         ` Eli Zaretskii
2024-08-23 13:42                                                                           ` Quang Kien Nguyen
2024-08-23 13:48                                                                             ` Pip Cet
2024-08-23 14:35                                                                               ` Eli Zaretskii
2024-08-23 14:54                                                                                 ` Quang Kien Nguyen
2024-08-23 16:08                                                                                   ` Eli Zaretskii
2024-08-23 18:23                                                                                   ` Sebastián Monía
2024-08-23 13:44                                                                           ` Pip Cet
2024-08-23 14:32                                                                             ` Eli Zaretskii
2024-08-23 15:51                                                                               ` Pip Cet
2024-08-23 16:17                                                                                 ` Eli Zaretskii
2024-08-23 18:57                                                                                   ` Pip Cet
2024-08-23 19:28                                                                                     ` Eli Zaretskii
2024-08-24 17:31                                                                         ` Pip Cet
2024-08-25  3:17                                                                           ` Quang Kien Nguyen
2024-08-30 19:59                                                                             ` Sebastián Monía
2024-09-01  8:21                                                                               ` Kien Nguyen
2024-09-01  8:43                                                                                 ` Eli Zaretskii
2024-09-01  9:36                                                                                   ` Kien Nguyen
2024-09-01 10:28                                                                                     ` Eli Zaretskii
2024-09-01 11:59                                                                                       ` Eli Zaretskii
2024-09-01 18:54                                                                                         ` Kien Nguyen
2024-09-01 19:27                                                                                           ` Eli Zaretskii
2024-09-01 19:44                                                                                           ` Pip Cet
2024-09-01 21:42                                                                                             ` Kien Nguyen
2024-09-02 11:08                                                                                             ` Eli Zaretskii
2024-09-03  4:12                                                                                               ` Kien Nguyen
2024-09-03 10:37                                                                                                 ` Pip Cet
2024-09-03 16:50                                                                                                   ` Kien Nguyen
2024-09-03 17:48                                                                                                     ` Pip Cet
2024-09-07  8:19                                                                                           ` Eli Zaretskii
2024-09-01 10:49                                                                                 ` Pip Cet
2024-09-01 12:15                                                                                   ` Kien Nguyen
2024-08-22 18:11                                                               ` Eli Zaretskii
2024-08-22 19:17                                                                 ` Sebastián Monía
2024-08-23  5:45                                                                   ` Eli Zaretskii
2024-08-07 19:50           ` Pip Cet
2024-08-07 23:14             ` Quang Kien Nguyen
2024-08-08  5:15             ` Eli Zaretskii
2024-08-06 14:18 ` Pip Cet
2024-08-07 11:03   ` Eli Zaretskii
2024-07-24 15:45 Pip Cet
2024-07-25  7:16 ` Eli Zaretskii
2024-07-25 15:39   ` Pip Cet
2024-07-27  8:02     ` Eli Zaretskii
2024-07-27 10:42       ` Pip Cet
2024-07-27 12:14         ` Eli Zaretskii
2024-07-27 15:49           ` Pip Cet
2024-07-27 16:10             ` Eli Zaretskii
2024-07-27 16:56               ` Eli Zaretskii
2024-07-27 18:27                 ` Pip Cet
2024-07-27 18:50                   ` Eli Zaretskii
2024-07-27 20:22                     ` Pip Cet
2024-07-28  5:25                       ` Eli Zaretskii
2024-07-28 13:00                         ` Pip Cet
2024-07-28 14:20                           ` Eli Zaretskii
2024-07-28 15:00                             ` Pip Cet
2024-07-28 15:20                               ` Eli Zaretskii
2024-07-28 20:22                                 ` Pip Cet
2024-07-29 11:25                                   ` Eli Zaretskii
2024-07-31  6:18                                     ` Pip Cet
2024-07-31 14:02                                       ` Eli Zaretskii
2024-07-31 19:04                                         ` Sebastián Monía
2024-08-01  5:00                                           ` Eli Zaretskii
2024-08-03  7:50                                         ` pipcet
2024-08-03  9:23                                           ` Eli Zaretskii
2024-08-03 15:17                                             ` pipcet
2024-08-03 16:07                                               ` Eli Zaretskii
2024-07-27 16:09         ` Michael Albinus
2024-07-28 13:22           ` Pip Cet

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).