Thread: [CEDET-devel] [eieio] Can't call static methods on objects
Brought to you by:
zappo
From: drkm <dar...@ya...> - 2005-03-07 13:44:31
|
Hi It seems that we can't call a static method on an object, instead of on a class. For example: (defclass A () ()) (defmethod F :STATIC ((class A)) (message "F A")) (F A) (F (A nil)) The first call works, but not the second one, which results in the following error: no-method-definition F "#<A nil>" Here is the patch I use for a long time: *** eieio.el-orig Fri Jul 30 19:59:54 2004 --- eieio.el Mon Mar 7 14:36:14 2005 *************** *** 1533,1546 **** ;; 2) Only call static if this is a static method. ;; 3) Only call specifics if the definition allows for them. ;; 4) Call in order based on :BEFORE, :PRIMARY, and :AFTER ! (if static ! (progn ! (setq tlambdas ! (eieio-generic-form method method-static mclass)) ! (setq lambdas (cons tlambdas lambdas) ! keys (cons method-static keys)) ! ) ! ;; Non-static calls do all this stuff. (setq tlambdas (or (and mclass (eieio-generic-form method method-after mclass)) --- 1533,1539 ---- ;; 2) Only call static if this is a static method. ;; 3) Only call specifics if the definition allows for them. ;; 4) Call in order based on :BEFORE, :PRIMARY, and :AFTER ! (when (object-p firstarg) ;; Non-static calls do all this stuff. (setq tlambdas (or (and mclass (eieio-generic-form method method-after mclass)) *************** *** 1560,1565 **** --- 1553,1564 ---- (setq lambdas (cons tlambdas lambdas) keys (cons method-before keys)) ) + (unless (find-if (lambda (x) x) lambdas) + (setq tlambdas + (eieio-generic-form method method-static mclass)) + (setq lambdas (cons tlambdas lambdas) + keys (cons method-static keys)) + ) ;; Now loop through all occurances forms which we must execute ;; (which are happilly sorted now) and execute them all! (let ((rval nil) (found nil)) --drkm |
From: drkm <dar...@ya...> - 2005-03-11 16:42:19
|
drkm writes: > It seems that we can't call a static method on an object, instead of > on a class. Below is the associated patch to eieio-tests.el. I've add an argument to the generic function, the value to set the slot. So we can give different values when we try calling on class or object. But to test this, I has to remove the :abstract option out of the class. It can be intresting to keep such a test, on an abstract class. Thanks, --drkm *** eieio-tests.el-orig Fri Jul 30 19:59:54 2004 --- eieio-tests.el Fri Mar 11 17:09:53 2005 *************** *** 146,179 **** ((some-slot :initform nil :allocation :class :documentation "A slot.")) ! :documentation "A class used for testing static methods." ! :abstract t) ! (defmethod static-method-class-method :STATIC ((c static-method-class)) "Test static methods. Argument C is the class bound to this static method." ! (oset-default c some-slot t)) (condition-case nil ! (static-method-class-method static-method-class) ! (error (error "Failed to call static method."))) ! (if (not (eq (oref static-method-class some-slot) t)) ! (error "Call to static method did not run.")) (defclass static-method-class-2 (static-method-class) () "A second class after the previous for static methods.") ! (defmethod static-method-class-method :STATIC ((c static-method-class-2)) "Test static methods. Argument C is the class bound to this static method." ! (oset-default c some-slot 'moose)) (condition-case nil ! (static-method-class-method static-method-class-2) ! (error (error "Failed to call 2nd static method."))) ! (if (not (eq (oref static-method-class-2 some-slot) 'moose)) ! (error "Call to 2nd static method did not run.")) ;;; Perform method testing --- 146,190 ---- ((some-slot :initform nil :allocation :class :documentation "A slot.")) ! :documentation "A class used for testing static methods.") ! (defmethod static-method-class-method :STATIC ((c static-method-class) value) "Test static methods. Argument C is the class bound to this static method." ! (oset-default c some-slot value)) ! ! (condition-case nil ! (static-method-class-method static-method-class 'class) ! (error (error "Failed to call static method on a class."))) ! (if (not (eq (oref static-method-class some-slot) 'class)) ! (error "Call to static method on a class did not run.")) (condition-case nil ! (static-method-class-method (static-method-class nil) 'object) ! (error (error "Failed to call static method on an object."))) ! (if (not (eq (oref static-method-class some-slot) 'object)) ! (error "Call to static method on an object did not run.")) (defclass static-method-class-2 (static-method-class) () "A second class after the previous for static methods.") ! (defmethod static-method-class-method :STATIC ((c static-method-class-2) value) "Test static methods. Argument C is the class bound to this static method." ! (oset-default c some-slot (intern (concat "moose-" (symbol-name value))))) ! ! (condition-case nil ! (static-method-class-method static-method-class-2 'class) ! (error (error "Failed to call 2nd static method on a class."))) ! (if (not (eq (oref static-method-class-2 some-slot) 'moose-class)) ! (error "Call to 2nd static method on a class did not run.")) (condition-case nil ! (static-method-class-method static-method-class-2 'object) ! (error (error "Failed to call 2nd static method on an object."))) ! (if (not (eq (oref static-method-class-2 some-slot) 'moose-object)) ! (error "Call to 2nd static method on an object did not run.")) ;;; Perform method testing |
From: Eric M. L. <er...@si...> - 2005-04-14 18:53:03
|
I have something that now passes this test checked in. Eric >>> drkm <dar...@ya...> seems to think that: > Hi > > It seems that we can't call a static method on an object, instead of >on a class. For example: > > (defclass A () > ()) > > (defmethod F :STATIC ((class A)) > (message "F A")) > > (F A) > (F (A nil)) > > The first call works, but not the second one, which results in the >following error: > > no-method-definition F "#<A nil>" > > Here is the patch I use for a long time: > >*** eieio.el-orig Fri Jul 30 19:59:54 2004 >--- eieio.el Mon Mar 7 14:36:14 2005 >*************** >*** 1533,1546 **** > ;; 2) Only call static if this is a static method. > ;; 3) Only call specifics if the definition allows for them. > ;; 4) Call in order based on :BEFORE, :PRIMARY, and :AFTER >! (if static >! (progn >! (setq tlambdas >! (eieio-generic-form method method-static mclass)) >! (setq lambdas (cons tlambdas lambdas) >! keys (cons method-static keys)) >! ) >! > ;; Non-static calls do all this stuff. > (setq tlambdas > (or (and mclass (eieio-generic-form method method-after mclass)) >--- 1533,1539 ---- > ;; 2) Only call static if this is a static method. > ;; 3) Only call specifics if the definition allows for them. > ;; 4) Call in order based on :BEFORE, :PRIMARY, and :AFTER >! (when (object-p firstarg) > ;; Non-static calls do all this stuff. > (setq tlambdas > (or (and mclass (eieio-generic-form method method-after mclass)) >*************** >*** 1560,1565 **** >--- 1553,1564 ---- > (setq lambdas (cons tlambdas lambdas) > keys (cons method-before keys)) > ) >+ (unless (find-if (lambda (x) x) lambdas) >+ (setq tlambdas >+ (eieio-generic-form method method-static mclass)) >+ (setq lambdas (cons tlambdas lambdas) >+ keys (cons method-static keys)) >+ ) > ;; Now loop through all occurances forms which we must execute > ;; (which are happilly sorted now) and execute them all! > (let ((rval nil) (found nil)) > >--drkm > > > >------------------------------------------------------- >SF email is sponsored by - The IT Product Guide >Read honest & candid reviews on hundreds of IT Products from real users. >Discover which products truly live up to the hype. Start reading now. >http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click >_______________________________________________ >Cedet-devel mailing list >Ced...@li... >https://lists.sourceforge.net/lists/listinfo/cedet-devel > |
From: drkm <dar...@ya...> - 2005-04-20 09:45:17
|
"Eric M. Ludlam" <er...@si...> writes: > I have something that now passes this test checked in. Great! Thanks. --drkm |