--
Will "Coke" Coleda
On Oct 23, 2008, at 23:05, "Allison Randal via RT" <[EMAIL PROTECTED]
> wrote:
Will Coleda (via RT) wrote:
I would expect both of these programs to output the same thing, but
it
looks like rethrow is generating the same output that throw would
here.
What is the difference supposed to be between these two ops?
The two ops are intentionally almost entirely the same. The only
difference is that 'throw' creates a new iterator of exception
handlers,
while 'rethrow' pulls the next exception handler off the iterator. So,
'rethrow' cannot be called on an exception that hasn't been thrown
before. And if 'throw' is called on an exception that's already been
thrown before, it will return to the first exception handler again,
instead of the next exception handler in the chain of handlers.
$ cat foo.pir
sub foo :main
bar()
end
sub bar
baz()
end
sub baz
die "eek"
end
$ ../../parrot foo.pir
eek
current instr.: 'baz' pc 24 (foo.pir:10)
called from Sub 'bar' pc 19 (foo.pir:6)
called from Sub 'foo' pc 7 (foo.pir:2)
$ cat bar.pir
sub foo :main
push_eh eh
bar()
pop_eh
end
eh:
.get_results($P0)
rethrow $P0
end
sub bar
baz()
end
sub baz
die "eek"
end
$ ../../parrot bar.pir
eek
current instr.: 'foo' pc 16 (bar.pir:9)
I don't understand the problem. Is it that you expect 'rethrow' to
keep
the stack trace of the original 'die'?
Allison
Yes.