Compiled COMPILE forms at load time Bug
Helmut Eller
heller at common-lisp.net
Mon Mar 15 15:45:45 CET 2010
* Raymond Toy [2010-03-15 15:01+0100] writes:
> On 3/12/10 11:45 AM, Helmut Eller wrote:
>> * Raymond Toy [2010-03-12 12:35+0100] writes:
>>
>>
>>> So COMPILE has silently zapped the structure. We should probably print
>>> he warning for this too.
>>>
>> Yes, definitely. Also for this:
>>
>> (defstruct xyz a)
>> (setf (fdefinition 'xyz-a) (lambda () 42))
>>
> I added a hook to *setf-fdefinition-hook* to check for this case. Works
> ok, but now I can't compile clx/depdefs.lisp. CMUCL complains about
> redefining reply-size and buffer-lock which are slot accessor
> functions. But I haven't figured out from the code where the
> redefinition is coming from.
>
> Also, consider this:
>
> (defstruct abc a b c)
> (defun abc-a () 42)
>
> CMUCL undefines the structure, but
CMUCL undefines the structure? That seems a bit aggressive. I think it
should only delete the (c:info function info 'abc-a) entry if that's not
done yet. The compiler uses that to recognize "known" functions.
I don't know if (setf abc-a) still works if the info entry for abc-a is
cleared.
> (defstruct abc a)
>
> produces an error about incompatibly redefining the structure.
That seems totally OK to me.
>>
>>> Note that in both cases any existing structures will be in a bad state.
>>> They still exist, but there's not much you can do with them.
>>>
>> Compiled could would continue to work since accessors are inlined. Also
>> (type-of (make-xyz)) still works. The printer is effed up, though.
>>
> If we undefined the structure, I would expect make-xyz (or make-abc) not
> to work.
>
> What to do?
I wouldn't undefine the entire structure; only redefine the named
accessor function. For the printer we could come up with something like
SLOT-VALUE but it should work without PCL.
Helmut
More information about the cmucl-imp
mailing list