View · Search · Index
No registered users in community xowiki
in last 10 minutes

Re: [Xotcl] info classchildren leads to a segfault

From: Gustaf Neumann <neumann_at_wu-wien.ac.at>
Date: Thu, 17 Apr 2003 22:44:24 +0200

On Thursday 17 April 2003 20:11, Michael A. Cleverly wrote:
> Since every class is also an object, its possible to define both procs &
> instprocs for it. The instprocs define methods that objects of this class
> will have, while the proc (as I understand it) proc would define a method
> on the class object, but not for objects of the class. (Yes?)

 correct.

> However, during my interactive playing around trying different things I've
> found that as soon as I define a proc on the class object any subsequent
> use of [info classchildren] leads to a segfault.

 bingo. you found a bug. please apply the following patch to fix it.

> Is it better to avoid defining procs on the class object,
> ...

 The only limitation with procs in our current limitation is that
 one can't have procs and sub-objects with the same name, since
 both occupy the same slot in the namespace.

 in the following code, one can call the proc t both as "o::t" and "o t"
    Object o
    o proc t {} {puts x}

 When a childobject is created, it is refered to as well with o:t
    Object o::t
    o::t set x 1
    ...
 The creation of the object o::t detetes the same-named proc and vice versa.
 This make it easy to "donate" ordinary tcl procs/commands to an object:

   proc xxx {} {puts xxxx}
   ...
   rename xxx o::xxx

 now xxx is a proc of o, which can be called via:
   o xxx
   puts [o info procs]
  
> or am I misunderstanding when & where to use [info classchildren]?

 no, you are on the right track!
 all the best

 -gustaf

=======================================================================
--- xotcl.c~ 2003-04-16 19:13:53.000000000 +0200
+++ xotcl.c 2003-04-17 22:22:59.000000000 +0200
_at_@ -4911,7 +4911,7 @@
     if (!pattern || Tcl_StringMatch(key, pattern)) {
        Tcl_PushCallFrame(in, &frame, (Tcl_Namespace*)obj->nsPtr,0);
        childobj = GetObject(in, key);
- if (XOTclObjectIsClass(childobj)) {
+ if (childobj && XOTclObjectIsClass(childobj)) {
            Tcl_ListObjAppendElement(in, list, childobj->cmdName);
        }
        Tcl_PopCallFrame(in);

=======================================================================
-- 
Univ.Prof. Dr.Gustaf Neumann
Abteilung für Wirtschaftsinformatik
WU-Wien, Augasse 2-6, 1090 Wien