No registered users in community xowiki
in last 10 minutes
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);
=======================================================================
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