Ah, got ahead of me I see.  I'll push this to weblocks-ian.

Ian


On Dec 28, 2008, at 2:58 AM, Yarek Kowalik wrote:

>
> Only the writers were missing.  Here is a patch:
>
> diff -r 36e39413a7ba src/store/elephant/proxy.lisp
> --- a/src/store/elephant/proxy.lisp   Sat Dec 27 23:39:10 2008 -0800
> +++ b/src/store/elephant/proxy.lisp   Sat Dec 27 23:39:19 2008 -0800
> @@ -28,6 +28,9 @@
>      ,@(mapcan #'(lambda (arg)
>                  `(:reader ,arg))
>              (weblocks::slot-definition-readers def))
> +     ,@(mapcan #'(lambda (arg)
> +                `(:writer ,arg))
> +            (weblocks::slot-definition-writers def))
>      ,@(mapcan #'(lambda (arg)
>                  `(:initarg ,arg))
>              (weblocks::slot-definition-initargs def))
>
>
> Yarek
> On Dec 27, 11:42 pm, Yarek Kowalik <[email protected]> wrote:
>> That solved that problem, but it now appears that accessors are not
>> generated for the slots.
>>
>>           (progn
>>                 (defpclass foo () ((ff :accessor foo-ff)))
>>                 (defpclass bar () ((bb :accessor bar-bb)))
>>                 (let (f b list)
>>                      (setf f (make-instance (weblocks- 
>> elephant::return-
>> proxy-classname 'foo)))
>>                      (weblocks::push-end (weblocks-elephant::base-
>> class f) list)
>>                      (foo-ff f) ; failure #1 -- reader not existent
>>                      (setf (foo-ff f) 'ff-val) ; failure #1 -- writer
>> not existent
>>                      (setf b (make-instance (weblocks- 
>> elephant::return-
>> proxy-classname 'bar)))
>>                      (weblocks::push-end (weblocks-elephant::base-
>> class b) list)
>>                      (weblocks::push-end (weblocks-elephant::base-
>> class f) list)
>>                      list))
>>
>> This code fails as indicated in code comments.  I presume the  
>> previous
>> methods did somehow establish the accessors, but failed with
>> initializing the base, this one initializes the base fine, but the
>> proxy definition is incomplete.
>>
>> Yarek
>>
>> On Dec 27, 3:18 pm, Ian Eslick <[email protected]> wrote:
>>
>>> Thanks for the clear test case.  This was a misunderstanding on my
>>> part of inheritance of class allocated slots.  I just pushed a quick
>>> patch to weblocks-ian which fixes this.  Here's the raw diff.
>>
>>> Ian
>>
>>> diff -r ca886fa7919c src/store/elephant/proxy.lisp
>>> --- a/src/store/elephant/proxy.lisp     Sat Dec 06 22:40:30 2008  
>>> +0000
>>> +++ b/src/store/elephant/proxy.lisp     Sat Dec 27 18:15:42 2008  
>>> -0500
>>> @@ -4,22 +4,22 @@
>>>   (defvar *view-proxies* (make-hash-table))
>>
>>>   (defclass persistent-proxy ()
>>> -  ((base-class :accessor base- 
>>> class :initarg :base :allocation :class)
>>> -   (proxy-oid :accessor proxy-oid :initarg :oid :initform nil)))
>>> +  ((proxy-oid :accessor proxy-oid :initarg :oid :initform nil)))
>>
>>>   (defun return-proxy-classname (classname)
>>>     (if (gethash classname *proxies*)
>>>         (gethash classname *proxies*)
>>> -    (let* ((persistent-class (find-class classname))
>>> -          (new-name (intern (format nil "~A-~A" classname (gensym))
>>> *package*))
>>> -          (visible-slot-defs (class-visible-slots-impl persistent- 
>>> class))
>>> -          (class-def `(defclass ,new-name (persistent-proxy)
>>> -                        (,@(mapcar #'def-to-proxy-slot
>>> -                                   visible-slot-defs))
>>> -                        (:default-initargs :base ',classname))))
>>> -      (eval class-def)
>>> -      (setf (gethash classname *proxies* new-name)
>>> -           new-name))))
>>> +      (let* ((persistent-class (find-class classname))
>>> +            (new-name (intern (format nil "~A-~A" classname  
>>> (gensym))
>>> *package*))
>>> +            (visible-slot-defs (class-visible-slots-impl  
>>> persistent-class))
>>> +            (class-def `(defclass ,new-name (persistent-proxy)
>>> +                          ((base-class :accessor base- 
>>> class :allocation :class
>>> +                                       :initform ',classname)
>>> +                           ,@(mapcar #'def-to-proxy-slot
>>> +                                     visible-slot-defs)))))
>>> +       (eval class-def)
>>> +       (setf (gethash classname *proxies* new-name)
>>> +             new-name))))
>>
>>>   (defun def-to-proxy-slot (def)
>>>     `(,(weblocks::slot-definition-name def)
>>
>>> On Dec 27, 2008, at 5:02 PM, Yarek Kowalik wrote:
>>
>>>> Every time I create a new instance of a new proxy object for a
>>>> persistent class, it redefines the base-class in the previously
>>>> created instances, even when these instances are not of the same
>>>> class.  For example:
>>
>>>> PROJECT_FOO> (progn
>>>>                   (defpclass foo () ())
>>>>                   (defpclass bar () ())
>>>>                   (let (f b list)
>>>>                     (setf f (make-instance (weblocks- 
>>>> elephant::return-
>>>> proxy-classname 'foo)))
>>>>                     (weblocks::push-end (weblocks-elephant::base-
>>>> class f) list)
>>>>                     (setf b (make-instance (weblocks- 
>>>> elephant::return-
>>>> proxy-classname 'bar)))
>>>>                     (weblocks::push-end (weblocks-elephant::base-
>>>> class b) list)
>>>>                     (weblocks::push-end (weblocks-elephant::base-
>>>> class f) list)
>>>>                     list))
>>>> (FOO BAR BAR)
>>
>>>> This is unexpected: the output should be (FOO BAR FOO), and it  
>>>> causes
>>>> serious problems.   Is there something amiss in the way proxy  
>>>> classes
>>>> are defined?
>>
>>>> Note: This is on SBCL 1.0.20.
>>
>>>> Yarek
> >


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"weblocks" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/weblocks?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to