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