-
-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Inherited arrays of callables are buggy #79
Comments
The workaround, which might help debugging, is to simply not declare the array of callables in any of the parent classes, but to declare it in the bottom class, and don't inherit from it. class Top {
method init {
say "Top: #{__METHOD_NAME__}"
}
}
class Next < Top {
method init {
say "Next: #{__METHOD_NAME__}"
self.array.each{ .say }
self.array.each{ .run }
}
}
class Bottom < Next {
has Array array = [
func c1 () { say "asd" },
func c2 () { say "different" }
]
}
Bottom()
|
Hmm, in my opinion that workaround (using I think I'll rewrite my code and try again, because 4% and 10% are not really ideal failure rates for deterministic, relatively straightforward code that doesn't actually screw with Sidef/Perl internals. |
class Top {
method init {
say "Top: #{__METHOD_NAME__}"
}
}
const Array global_array = [
{ say 'asd' },
{ say 'different' }
]
class Next < Top {
has Array bx = global_array
method init {
say "Next: #{__METHOD_NAME__}"
self.bx.each{ .say }
self.bx.each{ .run }
}
}
class Bottom < Next { }
Bottom() Success
|
Partially fixed in 5911c5c. class Top {
method init {
say "Top: #{__METHOD_NAME__}"
}
}
class Next < Top {
has Array array = [
{ say "asd" },
{ say "different" }
]
method start {
say "Next: #{__METHOD_NAME__}"
self.array.each{ .say }
self.array.each{ .run }
}
}
class Bottom < Next { }
Next() # needs to be initialized first
Bottom().start Output:
A better fix is still needed that automatically initializes the values of the parent classes. |
If you run this code you get,
This is correct;
init
is called on our parentTop
, then ourstart
method call, two blocks are printed and run.If we added a class to the bottom of the inheritance tree, so the full code is:
The output is
A couple of things are wrong. First of all, the identities of the blocks are somehow the same, but they weren't when we invoked Next() directly. (Also, they are not the same code). Worse, if you change the blocks to be
func cN () { ... }
, where N is different for each,self.array
is[nil, nil]
only inBottom
, but not if you constructed it insideNext
.The second thing which is wrong with this output is that
Top: init
is called three times. Once correctly at the start, and two more times, once for each block we try to.run
. Also, the blocks themselves are not called; I guess their invocation is replaced with the construction of the class that originated them ??There is one more bad thing that can happen with this code. If we rename
method start
tomethod init
, the code recurses forever, for no reason that is obvious.And on and on forever. Notice that
Top.init
is correctly overridden byNext.init
and is not being called, but it recurses anyway.The text was updated successfully, but these errors were encountered: