Leopold Toetsch writes:
> While trying to generate a small example that shows the memory 
> corruption problem reported by Steve, I came along these issues:
> 
> a) [1] is .Sub, [2] is turned off
>    The subroutine prints main's $m - very likely wrong.

Well, Subs don't do anything with pads, so I'd say this is correct.

> Q: Should the Sub get a NULL scratch pad, or a new empty scratch pad stack?

Or just keep the existing one like current subs do.  A top-level sub
should be a closure under an empty pad stack.

The following correspond to Perl code (approximately):

> b) [1] is .Closure, [2] is turned off
>    The closure prints "main" - probably ok

eval 'my $m = "main\n"; ' . 'print $m';

> c) [1] is .Closure, [2] is "newpad 0"
>    Lexical '$m' not found

sub foo { print $m }
{ my $m = "main\n"; foo() }

> d) [1] is .Closure, [2] is "newpad 1"
>    prints "main"

my $m = "main\n"; sub { print $m }->();

> Q: What is correct?

It looks to me as though they all are.

Luke

> .sub _main
>       new_pad 0
>       new $P0, .PerlString
>       set $P0, "main\n"
>       store_lex -1, "$m", $P0
>       .sym pmc foo
>       newsub foo, .Sub, _foo     # [1]
>       .pcc_begin prototyped
>       .pcc_call foo
>       .pcc_end
>       pop_pad
>       end
> .end
> .sub _foo prototyped
>       # new_pad 1                # [2]
>       find_lex $P0, "$m"
>       print $P0
>       # pop_pad
>       .pcc_begin_return
>       .pcc_end_return
> .end
> 
> leo
> 

Reply via email to