Le 21/06/2022 à 13:21, David Kastrup a écrit :
Jean Abou Samra <j...@abou-samra.fr> writes:

To check that, I applied

diff --git a/lily/duration-scheme.cc b/lily/duration-scheme.cc
index 5d9b4447f1..6a09253adf 100644
--- a/lily/duration-scheme.cc
+++ b/lily/duration-scheme.cc
@@ -45,6 +45,8 @@ Is @var{p1} shorter than @var{p2}?
    auto *const a = LY_ASSERT_SMOB (Duration, p1, 1);
    auto *const b = LY_ASSERT_SMOB (Duration, p2, 2);

+  scm_gc ();
+
    if (Duration::compare (*a, *b) < 0)
      return SCM_BOOL_T;
    else

and compiled

#(do ((i 0 (1+ i)))
    ((= i 100))
    (ly:duration<? #{ 4 #} #{ 8 #}))


No crashes observed.
That tells you nothing at all unless you verify that the generated code
writes over p1 and p2 before scm_gc is called.  This is possible due to
optimisation but unlikely.


<facepalm> Correct. Next try:

diff --git a/lily/duration-scheme.cc b/lily/duration-scheme.cc
index 5d9b4447f1..be75c6ac9d 100644
--- a/lily/duration-scheme.cc
+++ b/lily/duration-scheme.cc
@@ -45,6 +45,11 @@ Is @var{p1} shorter than @var{p2}?
   auto *const a = LY_ASSERT_SMOB (Duration, p1, 1);
   auto *const b = LY_ASSERT_SMOB (Duration, p2, 2);

+  p1 = SCM_UNDEFINED;
+  p2 = SCM_UNDEFINED;
+
+  scm_gc ();
+
   if (Duration::compare (*a, *b) < 0)
     return SCM_BOOL_T;
   else


Does that look better?



Reply via email to