Relax plausible_cc_block_p.
authorTaylor R Campbell <campbell@mumble.net>
Thu, 22 Jul 2010 23:12:37 +0000 (23:12 +0000)
committerTaylor R Campbell <campbell@mumble.net>
Thu, 22 Jul 2010 23:12:37 +0000 (23:12 +0000)
Some leaf procedures and continuations do not have GC trap prefixes,
so don't require the block in question to have one.

On i386, this makes the trap handler successfully figure out where it
is in (FIX:QUOTIENT 1 0).  FIX:QUOTIENT is a leaf procedure, unlike
FLO:/, although perhaps FIX:QUOTIENT ought to do checks and defer to
the microcode primitive like FLO:/.

src/microcode/cmpint.c

index 6b840865bbacfba37fc5604a05ed7040c74ae8ec..7eea4d29880973a819d967fa22dce66bc1b798ba 100644 (file)
@@ -1691,11 +1691,11 @@ plausible_cc_block_p (SCHEME_OBJECT * block)
     if ((read_cc_entry_type ((&cet), entry))
        || ((cet.marker) != CET_EXPRESSION))
       {
-       entry += CC_ENTRY_GC_TRAP_SIZE;
-       if ((read_cc_entry_type ((&cet), entry))
-           || (! (((cet.marker) == CET_PROCEDURE)
-                  || ((cet.marker) == CET_CONTINUATION))))
-         return (0);
+       insn_t * real_entry = (entry + CC_ENTRY_GC_TRAP_SIZE);
+       if ((! (read_cc_entry_type ((&cet), real_entry)))
+           && (((cet.marker) == CET_PROCEDURE)
+               || ((cet.marker) == CET_CONTINUATION)))
+         entry = real_entry;
       }
   }
   {