Skip to content
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

C stack overflow in Perl_scalarvoid #11866

Open
p5pRT opened this issue Jan 15, 2012 · 74 comments

Comments

@p5pRT
Copy link
Collaborator

@p5pRT p5pRT commented Jan 15, 2012

Migrated from rt.perl.org#108276 (status was 'open')

Searchable as RT108276$

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 15, 2012

From @bulk88

Created by @bulk88

Perl lexer (???) has a deep recursion bug in Perl_scalarvoid when given a very large Perl subroutine to run.  Perl_scalarvoid calls itself over and over, for what I blindly guess is every opcode in the sub.  If there are too many opcodes, C stack overflows.

I could not replicate this with any stock ActivePerl (AP 5.10.0, AP 5.12.3).  While the test script is running, ActivePerls peak at 8 MB on the C stack.  I checked with VMMAP.  If I lower the stack reserve from 16 MB to 256KB in the PE header on perl.exe from ActivePerls, I will get the same exact Perl_scalarvoid stack overflow.  There is no reason for the interpreter to peak at many MBs of C stack, which is irreversibly expanded (there are OS specific ways to shrink C stacks.... I know it can be done with VirtualFree and VirtualAlloc on Windows, but that is the wrong way to fix C stack recursion) and wasted, never to be used again after BEGIN blocks run.  I have not tested doing the "require" at runtime.  On other perl scripts and apps I run, all the interpreter (APs and my compiled Perl) peak at 20-50KB of C stack which is fine.  I assume that the reason that my self-compiled Perl will stack overflow at 16MB and ActivePerls do not is because of high C stack overhead of each recursive Perl_scalarvoid when Perl is compiled with -Od (no registers) meanwhile ActivePerls are compiled with -O1 (small code).

I wrote this test script to test how efficient Perl is at returning memory to the OS after a Perl Module is "use"d and if, and how well, memory behind the BEGIN blocks (SVs, CVs, Opcodes, pads, raw malloced blocks) is returned to the OS.  If I lower the 100000 to 50000 in the test script, the script will run without a stack overflow.  On sucessful runs, malloced memory went down from ~60MB inside the module BEGIN block (at "print "after branches\n";") to ~3MB at runtime ("print "in main\n";" ) according to VMMAP (private/yellow memory).  C Stack remained at many MBs (7 to 8MB at 50000 in test script).

Perl_scalarvoid, whatever it does to opcodes, should run in a loop down the optree, not recursively on every opcode and thus eating away the C stack.  I request that the above-reported bug be fixed.

Perl Info

Flags:
    category=core
    severity=high

Site configuration information for perl 5.12.2:

Configured by Owner at Wed Mar 23 08:05:23 2011.

Summary of my perl5 (revision 5 version 12 subversion 2) configuration:
   
  Platform:
    osname=MSWin32, osvers=5.1, archname=MSWin32-x86-multi-thread
    uname=''
    config_args='undef'
    hint=recommended, useposix=true, d_sigaction=undef
    useithreads=define, usemultiplicity=define
    useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
    use64bitint=undef, use64bitall=undef, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cl', ccflags ='-nologo -GF -W3 -Od -MD -Zi -DDEBUGGING -DWIN32 -D_CONSOLE -DNO_STRICT -DHAVE_DES_FCRYPT  -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO',
    optimize='-Od -MD -Zi -DDEBUGGING',
    cppflags='-DWIN32'
    ccversion='13.10.3077', gccversion='', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
    d_longlong=undef, longlongsize=8, d_longdbl=define, longdblsize=8
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='__int64', lseeksize=8
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='link', ldflags ='-nologo -nodefaultlib -debug  -libpath:"c:\perl512\lib\CORE"  -machine:x86'
    libpth="c:\Program Files\Microsoft Visual Studio .NET 2003\VC7\lib"
    libs=  oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib  comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib  netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib  version.lib odbc32.lib odbccp32.lib comctl32.lib msvcrt.lib
    perllibs=  oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib  comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib  netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib  version.lib odbc32.lib odbccp32.lib comctl32.lib msvcrt.lib
    libc=msvcrt.lib, so=dll, useshrplib=true, libperl=perl512.lib
    gnulibc_version=''
  Dynamic Linking:
    dlsrc=dl_win32.xs, dlext=dll, d_dlsymun=undef, ccdlflags=' '
    cccdlflags=' ', lddlflags='-dll -nologo -nodefaultlib -debug  -libpath:"c:\perl512\lib\CORE"  -machine:x86'

Locally applied patches:
    


@INC for perl 5.12.2:
    C:/perl512/site/lib
    C:/perl512/lib
    .


Environment for perl 5.12.2:
    HOME (unset)
    LANG (unset)
    LANGUAGE (unset)
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PATH=C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE;C:\Program Files\Microsoft Visual Studio .NET 2003\VC7\BIN;C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools;C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\bin\prerelease;C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\bin;C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\bin;C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322;C:\perl512\bin;C:\sources\glibbin\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\system32\wbem;C:\Perl\site\bin;C:\Perl\bin;C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin;C:\cygwin\bin;
    PERL_BADLANG (unset)
    PERL_DEBUG_MSTATS=2
    SHELL (unset)

 		 	   		  
@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 15, 2012

From @bulk88

included pics of VS debugger and opcode structs, the pp_cond_expr and
pp_null only 2 things inthe recursive pattern, also added full C stack
trace, and
added the test Perl script that generates these stack overflows

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 15, 2012

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 15, 2012

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 15, 2012

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 15, 2012

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 15, 2012

@bulk88 - Status changed from 'new' to 'open'

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 15, 2012

From @jkeenan

On Sun Jan 15 10​:35​:13 2012, bulk88 wrote​:

Perl lexer (???) has a deep recursion bug in Perl_scalarvoid when
given a very large Perl subroutine to run.� Perl_scalarvoid calls
itself over and over, for what I blindly guess is every opcode in
the sub.� If there are too many opcodes, C stack overflows.

I could not replicate this with any stock ActivePerl (AP 5.10.0, AP
5.12.3).� While the test script is running, ActivePerls peak at 8
MB on the C stack.� I checked with VMMAP.� If I lower the stack
reserve from 16 MB to 256KB in the PE header on perl.exe from
ActivePerls, I will get the same exact Perl_scalarvoid stack
overflow.� There is no reason for the interpreter to peak at many
MBs of C stack, which is irreversibly expanded (there are OS
specific ways to shrink C stacks.... I know it can be done with
VirtualFree and VirtualAlloc on Windows, but that is the wrong way
to fix C stack recursion) and wasted, never to be used again after
BEGIN blocks run.� I have not tested doing the "require" at
runtime.� On other perl scripts and apps I run, all the interpreter
(APs and my compiled Perl) peak at 20-50KB of C stack which is
fine.� I assume that the reason that my self-compiled Perl will
stack overflow at 16MB and ActivePerls do not is because of high C
stack overhead of each recursive Perl_scalarvoid when Perl is
compiled with -Od (no registers) meanwhile ActivePerls are compiled
with -O1 (small code).

I wrote this test script to test how efficient Perl is at returning
memory to the OS after a Perl Module is "use"d and if, and how
well, memory behind the BEGIN blocks (SVs, CVs, Opcodes, pads, raw
malloced blocks) is returned to the OS.� If I lower the 100000 to
50000 in the test script, the script will run without a stack
overflow.� On sucessful runs, malloced memory went down from ~60MB
inside the module BEGIN block (at "print "after branches\n";") to
~3MB at runtime ("print "in main\n";" ) according to VMMAP
(private/yellow memory).� C Stack remained at many MBs (7 to 8MB at
50000 in test script).

Perl_scalarvoid, whatever it does to opcodes, should run in a loop
down the optree, not recursively on every opcode and thus eating
away the C stack.� I request that the above-reported bug be fixed.

1. I modified the test program you wrote to take the number of
iterations from the command-line rather than having it hard-coded. I
then ran the program on the two OSes to which I have access, Darwin and
Linux. In both cases, the program failed.

$ perl 108276_stk.pl 10
number​: 10
before require
Can't exec "pause"​: No such file or directory at 108276_stk.pl line 23.
10after branches
Can't exec "pause"​: No such file or directory at testmod1326659374.pm
line 14.
in main
Can't exec "pause"​: No such file or directory at 108276_stk.pl line 27.

'pause' is not an installed executable on those platforms (though it has
a man page as a C library function).

Could you modify your program to avoid the use of 'pause'? That would
enable more people to run it.

2. While the screenshots you posted via the RT GUI are displaying, I
suspect they won't show up on the perl5-porters mailing list or newsgroup.

Thank you for your report.
Jim Keenan

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 15, 2012

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 15, 2012

From @cpansprout

On Sun Jan 15 12​:58​:36 2012, jkeenan wrote​:

On Sun Jan 15 10​:35​:13 2012, bulk88 wrote​:

Perl lexer (???) has a deep recursion bug in Perl_scalarvoid when
given a very large Perl subroutine to run.� Perl_scalarvoid calls
itself over and over, for what I blindly guess is every opcode in
the sub.� If there are too many opcodes, C stack overflows.

I could not replicate this with any stock ActivePerl (AP 5.10.0, AP
5.12.3).� While the test script is running, ActivePerls peak at 8
MB on the C stack.� I checked with VMMAP.� If I lower the stack
reserve from 16 MB to 256KB in the PE header on perl.exe from
ActivePerls, I will get the same exact Perl_scalarvoid stack
overflow.� There is no reason for the interpreter to peak at many
MBs of C stack, which is irreversibly expanded (there are OS
specific ways to shrink C stacks.... I know it can be done with
VirtualFree and VirtualAlloc on Windows, but that is the wrong way
to fix C stack recursion) and wasted, never to be used again after
BEGIN blocks run.� I have not tested doing the "require" at
runtime.� On other perl scripts and apps I run, all the interpreter
(APs and my compiled Perl) peak at 20-50KB of C stack which is
fine.� I assume that the reason that my self-compiled Perl will
stack overflow at 16MB and ActivePerls do not is because of high C
stack overhead of each recursive Perl_scalarvoid when Perl is
compiled with -Od (no registers) meanwhile ActivePerls are compiled
with -O1 (small code).

I wrote this test script to test how efficient Perl is at returning
memory to the OS after a Perl Module is "use"d and if, and how
well, memory behind the BEGIN blocks (SVs, CVs, Opcodes, pads, raw
malloced blocks) is returned to the OS.� If I lower the 100000 to
50000 in the test script, the script will run without a stack
overflow.� On sucessful runs, malloced memory went down from ~60MB
inside the module BEGIN block (at "print "after branches\n";") to
~3MB at runtime ("print "in main\n";" ) according to VMMAP
(private/yellow memory).� C Stack remained at many MBs (7 to 8MB at
50000 in test script).

Perl_scalarvoid, whatever it does to opcodes, should run in a loop
down the optree, not recursively on every opcode and thus eating
away the C stack.� I request that the above-reported bug be fixed.

1. I modified the test program you wrote to take the number of
iterations from the command-line rather than having it hard-coded. I
then ran the program on the two OSes to which I have access, Darwin and
Linux. In both cases, the program failed.

$ perl 108276_stk.pl 10
number​: 10
before require
Can't exec "pause"​: No such file or directory at 108276_stk.pl line 23.
10after branches
Can't exec "pause"​: No such file or directory at testmod1326659374.pm
line 14.
in main
Can't exec "pause"​: No such file or directory at 108276_stk.pl line 27.

'pause' is not an installed executable on those platforms (though it has
a man page as a C library function).

Could you modify your program to avoid the use of 'pause'? That would
enable more people to run it.

I haven’t used Windows for a long, long time (except IE for web
testing), but if I remember correctly the pause command prints ‘Press
the "any" key to continue...’ and waits for a keystroke before exiting.

Changing system("pause") to​:

  system("perl -e '$|=1; print q|Press return to continue... |; <>'")

should work.

--

Father Chrysostomos

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 15, 2012

From @bulk88

On Sun Jan 15 13​:16​:04 2012, sprout wrote​:

I haven’t used Windows for a long, long time (except IE for web
testing), but if I remember correctly the pause command prints ‘Press
the "any" key to continue...’ and waits for a keystroke before exiting.

Changing system("pause") to​:

system\("perl \-e '$|=1; print q|Press return to continue\.\.\. |; \<>'"\)

should work.

Google says "pause" equivalent on POSIX is "echo -n "Press any key to
continue . . ." && read -n 1". The system("pause") lines are the points
I suggest to look at memory usage of the Perl process. Not sure if there
are any tools that can show reserved size of stack vs allocated amount
of stack in virtual memory system on Linux/Unix. I used VMMAP for
Windows to get the memory counts.

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 15, 2012

From [Unknown Contact. See original ticket]

On Sun Jan 15 13​:16​:04 2012, sprout wrote​:

I haven’t used Windows for a long, long time (except IE for web
testing), but if I remember correctly the pause command prints ‘Press
the "any" key to continue...’ and waits for a keystroke before exiting.

Changing system("pause") to​:

system\("perl \-e '$|=1; print q|Press return to continue\.\.\. |; \<>'"\)

should work.

Google says "pause" equivalent on POSIX is "echo -n "Press any key to
continue . . ." && read -n 1". The system("pause") lines are the points
I suggest to look at memory usage of the Perl process. Not sure if there
are any tools that can show reserved size of stack vs allocated amount
of stack in virtual memory system on Linux/Unix. I used VMMAP for
Windows to get the memory counts.

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 16, 2012

From @iabyn

On Sun, Jan 15, 2012 at 10​:35​:14AM -0800, bulk 88 wrote​:

The code can be simplified to the following​:

  my $n = $ARGV[0];
  die unless $n =~ /^\d+$/;

  my $code = 'my $i = 0; if ($i) { print }' . "\n";
  $code .= 'elsif ($i) { print }' . "\n" for 1..$n;
  eval $code;

segfaults for me on blead with n >= about 5000.

In blead, it's recursing in S_finalize_op rather than scalarvoid; not sure
whether this is instead of or in addition to a scalarvoid problem.

--
"But Sidley Park is already a picture, and a most amiable picture too.
The slopes are green and gentle. The trees are companionably grouped at
intervals that show them to advantage. The rill is a serpentine ribbon
unwound from the lake peaceably contained by meadows on which the right
amount of sheep are tastefully arranged." -- Lady Croom, "Arcadia"

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 20, 2012

From @cpansprout

On Mon Jan 16 03​:51​:55 2012, davem wrote​:

On Sun, Jan 15, 2012 at 10​:35​:14AM -0800, bulk 88 wrote​:

The code can be simplified to the following​:

my $n = $ARGV\[0\];
die unless $n =~ /^\\d\+$/;

my $code = 'my $i = 0; if \($i\) \{ print \}' \. "\\n";
$code \.= 'elsif \($i\) \{ print \}' \. "\\n" for 1\.\.$n;
eval $code;

segfaults for me on blead with n >= about 5000.

In blead, it's recursing in S_finalize_op rather than scalarvoid; not sure
whether this is instead of or in addition to a scalarvoid problem.

Without actually looking, I suspect it is in addition.

As I’m sure you already know, each elsif is nested inside the previous
one in the op tree.

So it looks as though at least S_finalize_op needs to be made iterative,
and probably scalarvoid, too.

And this results in a crash in op_free​:

perl -e'eval "sub{".q"$a+"x shift . "}"' 500000

What else needs to be made iterative?

--

Father Chrysostomos

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 21, 2012

From @bulk88

On Fri Jan 20 09​:38​:48 2012, sprout wrote​:

So it looks as though at least S_finalize_op needs to be made iterative,
and probably scalarvoid, too.

And this results in a crash in op_free​:

perl -e'eval "sub{".q"$a+"x shift . "}"' 500000

What else needs to be made iterative?

I decided to run Perl's test suite on my c stack reduced perl. First one
found is on parset.t, there are many more on my list to analyze, I see
one in comp/proto.t that I am working on getting a stack trace of right now.

Perl_peep, when running

  cop_line 111 unsigned long
+ cop_file 0x018332bc "C​:\perl-5.12.2\t\comp\parser.t"

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 21, 2012

From @bulk88

perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01845b44) Line 8479 + 0x3 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01845af8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01845a58) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018459b8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01845918) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01845878) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018457d8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01845738) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01845698) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018455f8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01845558) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018454b8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01845418) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01845378) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018452d8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01845238) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01845198) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018450f8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01845058) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01844fb8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01844f18) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01844e78) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01844dd8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01844d38) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01844c98) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01844bf8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01844b58) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01844ab8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01844a18) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01844978) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018448d8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01848e88) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01848de8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01848d48) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01848ca8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01848c08) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01848b68) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01848ac8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01848a28) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01848988) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018488e8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01848848) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018487a8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01848708) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01848668) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018485c8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01848528) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01848488) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018483e8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01848348) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018482a8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01848208) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01848168) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018480c8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01848028) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01847f88) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01847ee8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01847e48) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01847da8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01847d08) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01847c68) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01847bc8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01847b28) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01847a88) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018479e8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01847948) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018478a8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01847808) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01847768) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018476c8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01847628) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01847588) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018474e8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01847448) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018473a8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01847308) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01847268) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018471c8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01847128) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01847088) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01846fe8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01846f48) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018549f8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01854958) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018548b8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01854818) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01854778) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018546d8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01854638) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01854598) Line 8729 + 0x13 C
  perl512.dll!Perl_newPROG(interpreter * my_perl=0x0035403c, op * o=0x01837a60) Line 2365 + 0x17 C
  perl512.dll!Perl_yyparse(interpreter * my_perl=0x0035403c) Line 143 + 0x2c C
  perl512.dll!S_parse_body(interpreter * my_perl=0x0035403c, char * * env=0x002428f8, void (interpreter *)* xsinit=0x281d2260) Line 2160 + 0x9 C
  perl512.dll!perl_parse(interpreter * my_perl=0x0035403c, void (interpreter *)* xsinit=0x281d2260, int argc=0x00000002, char * * argv=0x00242510, char * * env=0x002428f8) Line 1605 + 0x11 C
  perl512.dll!RunPerl(int argc=0x00000002, char * * argv=0x00242510, char * * env=0x002428f8) Line 263 + 0x1a C++
  perl.exe!main(int argc=0x00000002, char * * argv=0x00242510, char * * env=0x00242d48) Line 73 + 0x12 C
  perl.exe!mainCRTStartup() Line 398 + 0xe C
  kernel32.dll!_BaseProcessStart@​4() + 0x23

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 21, 2012

From @bulk88

/t/cmd/for.t
Overflow in Peep at
  cop_line 462 unsigned long
+ cop_file 0x0186ed8c "C​:\perl-5.12.2\t\cmd\for.t" char *
/t/io/fs.t
overflow in peep at
  cop_line 416 unsigned long
+ cop_file 0x0193b074 "C​:\perl-5.12.2\t\io\fs.t" char *
overflow in peep at
/t/re/pat_advanced.t
  cop_line 832 unsigned long
+ cop_file 0x01add1b4 "C​:\perl-5.12.2\t\re\pat_advanced.t" char *
half the re folder failed at 28KB stack size, im not going to analyze
them unless someone wants me to, i guess they are all peeps
/t/op/pack.t
overflow in S_group_end, this is interesting, i set stack to 81920 bytes
long, not 28KB, at 28KB this overflowed in peek
  cop_line 1230 unsigned long
+ cop_file 0x01bc671c "C​:\perl-5.12.2\t\op\pack.t" char *

I killed "perl harness " when it started running cpan folder tests. I
also include the way I change the c stack size for these tests. I
modified perlmain.c . PLSTK is the number of pages you want the c stack
to be long. I wrote the code for 32 bit windows only. If someone wants
me to try something specific, reply to the bug, I have no other ideas
for figuring out what has bad C stack recursion in perl.

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 21, 2012

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 21, 2012

From @bulk88

#include "EXTERN.h"
#include "perl.h"
#define _WIN32_WINNT 0x0400
#include <windows.h>

#ifdef __GNUC__

/* Mingw32 defaults to globing command line 
 * This is inconsistent with other Win32 ports and 
 * seems to cause trouble with passing -DXSVERSION=\"1.6\" 
 * So we turn it off like this, but only when compiling
 * perlmain.c: perlmainst.c is linked into the same executable
 * as win32.c, which also does this, so we mustn't do it twice
 * otherwise we get a multiple definition error.
 */
#ifndef PERLDLL
int _CRT_glob = 0;
#endif

#endif

DWORD FilterFunction(LPEXCEPTION_POINTERS exceptionPtr) 
{ 
    printf("1 ");                     // printed first 
    return EXCEPTION_EXECUTE_HANDLER; 
} 

int
main(int argc, char **argv, char **env)
{
    char * stackSizeEnv = getenv("PLSTK");
    int newStackSize = 0;
    DWORD oldProtect;
    PBYTE pPtr;
    MEMORY_BASIC_INFORMATION infoRes;
    MEMORY_BASIC_INFORMATION infoGuard;
    MEMORY_BASIC_INFORMATION infoAlloc;
    DWORD_PTR stackEnd;
    DWORD_PTR stackAllocBegin;
    BOOL ret;
    __asm mov pPtr, esp
    if(stackSizeEnv) {
        newStackSize = atoi(stackSizeEnv);
    }
    else {
        newStackSize = 7;
    }
    if(newStackSize) {
        assert(VirtualQuery(pPtr, &infoRes, 
               sizeof(MEMORY_BASIC_INFORMATION)));
        assert(VirtualQuery((DWORD_PTR)infoRes.AllocationBase, &infoRes, 
                sizeof(MEMORY_BASIC_INFORMATION)));
        assert(VirtualQuery((DWORD_PTR)infoRes.AllocationBase+infoRes.RegionSize, &infoGuard, 
            sizeof(MEMORY_BASIC_INFORMATION)));
        assert(VirtualQuery((DWORD_PTR)infoRes.AllocationBase+infoRes.RegionSize
                            +infoGuard.RegionSize, &infoAlloc, 
            sizeof(MEMORY_BASIC_INFORMATION)));
        stackEnd = (DWORD_PTR)infoRes.AllocationBase+infoRes.RegionSize
                            +infoGuard.RegionSize+infoAlloc.RegionSize;
        stackAllocBegin = stackEnd-(newStackSize*4096);
        ret = VirtualAlloc(stackAllocBegin, (newStackSize*4096), MEM_COMMIT, PAGE_READWRITE);
        //ret = VirtualProtect(stackAllocBegin, (newStackSize*4096),
        //                        PAGE_READWRITE, &oldProtect);
        //printf("vp ret=%u glr=%u\n", ret, GetLastError());
        ret = VirtualAlloc(stackAllocBegin-(4096*2), (4096*2), MEM_COMMIT, PAGE_NOACCESS);
        //printf("vp ret=%u glr=%u\n", ret, GetLastError());
        //ret = VirtualProtect(stackEnd-(newStackSize*4096)-4096, 4096,
        //                        PAGE_NOACCESS, &oldProtect);
        //printf("vp ret=%u glr=%u\n", ret, GetLastError());
        //while( ! (stMemBasicInfo.Protect & PAGE_GUARD)) {
        //    assert(VirtualQuery((DWORD_PTR)stMemBasicInfo.BaseAddress-1, &stMemBasicInfo, 
        //           sizeof(stMemBasicInfo)));        
        //}
        //assert(VirtualProtect(stMemBasicInfo.BaseAddress, stMemBasicInfo.RegionSize,
        //                        PAGE_NOACCESS, &oldProtect));
        //assert(VirtualQuery((DWORD_PTR)stMemBasicInfo.BaseAddress-1, &stMemBasicInfo, 
        //       sizeof(stMemBasicInfo)));
        //assert(VirtualFree((DWORD_PTR)stMemBasicInfo.AllocationBase, 
        //           0, MEM_RELEASE));
    }
    if(0) {
        exit(1);
    }
    __try {
    ret = RunPerl(argc, argv, env);
    }
    __except(FilterFunction(GetExceptionInformation())) {
    ret = 1;
    }
    return ret;
}


@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 21, 2012

From @bulk88

  ntdll.dll!_RtlFreeHeap@​12() + 0x1763f
  msvcrt.dll!_free() + 0xc3
  perl512.dll!VMem​::Free(void * pMem=0x0193ae34) Line 229 + 0xa C++
  perl512.dll!CPerlHost​::Free(void * ptr=0x0193ae34) Line 68 + 0x22 C++
  perl512.dll!PerlMemFree(IPerlMem * piPerl=0x00245b6c, void * ptr=0x0193ae34) Line 311 C++
  perl512.dll!Perl_safesysfree(void * where=0x0193ae34) Line 262 + 0x1a C
  perl512.dll!Perl_sv_clear(interpreter * my_perl=0x0035403c, sv * const sv=0x0192e964) Line 5865 + 0xc C
  perl512.dll!Perl_sv_free2(interpreter * my_perl=0x0035403c, sv * const sv=0x0192e964) Line 5985 + 0xd C
  perl512.dll!Perl_sv_free(interpreter * my_perl=0x0035403c, sv * const sv=0x0192e964) Line 5962 + 0xd C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0193a14c) Line 8784 + 0xd C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x019396a8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0193a75c) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0193a660) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0193aae0) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x019353d4) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01935988) Line 8671 + 0x13 C

perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0193588c) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01936014) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0193a3b4) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01936364) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x019362bc) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x019366e8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01931d78) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x019322c4) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x019328f8) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0193a314) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01932e94) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0192bb9c) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0192bdac) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0192bde8) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01933290) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0192c040) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0192cbc8) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0192cd34) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0192cdac) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0192c7bc) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x019255b8) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01925630) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01924fdc) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01926520) Line 8722 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01921530) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x019215a8) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01926b60) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01921c48) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01921cc0) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x019217ac) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x019222a0) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01922318) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01921ec4) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01922818) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x019225bc) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01922f2c) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01922c98) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0191b45c) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0191b4d4) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0192251c) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0191c304) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0191c054) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0191c940) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0191c6e4) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01918140) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01917ee4) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0191851c) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0191b6d8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x019188bc) Line 8722 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01918930) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01918ea4) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0191902c) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01918b84) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x019194a8) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x019192a4) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01914e58) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01918ae4) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x019152b8) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01915540) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0191594c) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01915988) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01915a38) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x019156ec) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01915d1c) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01916048) Line 8722 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01916b28) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x019105b8) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x019107b0) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x019107ec) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01910a5c) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01910c94) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01910bec) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01910f38) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01911170) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01911318) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x019113c8) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01911478) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01911528) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x019115d8) Line 8671 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01911948) Line 8722 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01911dd0) Line 8671 + 0x13 C
  perl512.dll!Perl_newPROG(interpreter * my_perl=0x0035403c, op * o=0x01911ed8) Line 2365 + 0x17 C
  perl512.dll!Perl_yyparse(interpreter * my_perl=0x0035403c) Line 143 + 0x2c C
  perl512.dll!S_parse_body(interpreter * my_perl=0x0035403c, char * * env=0x002428f0, void (interpreter *)* xsinit=0x281d2260) Line 2160 + 0x9 C
  perl512.dll!perl_parse(interpreter * my_perl=0x0035403c, void (interpreter *)* xsinit=0x281d2260, int argc=2, char * * argv=0x00242510, char * * env=0x002428f0) Line 1605 + 0x11 C
  perl512.dll!RunPerl(int argc=2, char * * argv=0x00242510, char * * env=0x002428f0) Line 263 + 0x1a C++
  perl.exe!main(int argc=2, char * * argv=0x00242510, char * * env=0x00242d48) Line 85 + 0x12 C
  perl.exe!mainCRTStartup() Line 398 + 0xe C
  kernel32.dll!_BaseProcessStart@​4() + 0x23

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 21, 2012

From @bulk88

perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0186e564) Line 8479 + 0x3 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0186e48c) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0186e9c0) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01869dc4) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0186a3c8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0186aa74) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0186b104) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0186b694) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01866864) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01866e68) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0186746c) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01867b18) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018681a8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01862648) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01862bbc) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018631a4) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0186378c) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01863e1c) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0185f23c) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0185f7b0) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0185fd08) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018602f0) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018608d8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01860f68) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0185c368) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0185c8dc) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0185ce34) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0185d41c) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0185da04) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0185759c) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01857c10) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01858184) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018586dc) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01858cc4) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018592ac) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01854958) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01854fcc) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01855540) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01855a98) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0185602c) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018520a8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01852700) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01852d3c) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01853278) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01853798) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01853d40) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0184d384) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0184d9d4) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0184e008) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0184e53c) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0184ea54) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01849280) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018497d4) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01849dec) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0184a3e8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0184a8e4) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0184adc4) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0184645c) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01846a28) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0184709c) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018476f4) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01847c4c) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01848188) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0184325c) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018437d4) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01843e10) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01844430) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01844950) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0183f334) Line 8722 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0183f514) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0183f198) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0183fe08) Line 8722 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018400a8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0184051c) Line 8722 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x018406c8) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0183a384) Line 8722 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0183a530) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0183aaa4) Line 8722 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0183ad30) Line 8722 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0183afbc) Line 8722 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0183b658) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0183b95c) Line 8722 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x0183bd58) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01835b84) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01835e8c) Line 8722 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01836264) Line 8729 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01836718) Line 8722 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01836a30) Line 8735 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01836e00) Line 8722 + 0x13 C
  perl512.dll!Perl_peep(interpreter * my_perl=0x0035403c, op * o=0x01837700) Line 8729 + 0x13 C
  perl512.dll!Perl_newPROG(interpreter * my_perl=0x0035403c, op * o=0x01837a18) Line 2365 + 0x17 C
  perl512.dll!Perl_yyparse(interpreter * my_perl=0x0035403c) Line 143 + 0x2c C
  perl512.dll!S_parse_body(interpreter * my_perl=0x0035403c, char * * env=0x002428f8, void (interpreter *)* xsinit=0x281d2260) Line 2160 + 0x9 C
  perl512.dll!perl_parse(interpreter * my_perl=0x0035403c, void (interpreter *)* xsinit=0x281d2260, int argc=2, char * * argv=0x00242510, char * * env=0x002428f8) Line 1605 + 0x11 C
  perl512.dll!RunPerl(int argc=2, char * * argv=0x00242510, char * * env=0x002428f8) Line 263 + 0x1a C++
  perl.exe!main(int argc=2, char * * argv=0x00242510, char * * env=0x00242d48) Line 85 + 0x12 C
  perl.exe!mainCRTStartup() Line 398 + 0xe C
  kernel32.dll!_BaseProcessStart@​4() + 0x23

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Feb 2, 2012

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jul 17, 2013

From @nthykier

Hi,

I cannot reproduce the issue in S_finalize_op on blead[1]. It is
possible that it has been "fixed" somehow (or we got different
architectures).

On the other hand, I can reproduce the crash caused by​:

  perl -e'eval "sub{".q"$a+"x shift . "}"' 500000

I have attached a prototype patch that solves the problem (at least for
me). With the patch applied, I can run it with up to at least 2M
without it crashing - I have not tested beyond that because perl starts
to use >= 4GB of RAM around the 2M mark.
  A more memory friendly test case is definitely welcome. :)

For the reviewer(s)​: the patch is much easier to read by ignoring space
changes[2]. It re-uses the basic principe of the DEFER marco used in
the peephole optimizer. The "major" difference is that it uses a
fixed-size stack rather than a fixed-size queue. The size of the queue
did not seem to matter a lot (even with MAX_DEFERRED reduced to 2 was
the crash avoided in original test case).

The test suite showed no regression, perl was configured with​:
  ./Configure -des -Dusedevel

~Niels

[1] I have been using code suggested by Dave Mitchell (rewritten as a
perl one-liner)

./perl -e 'my $code = q[my $i = 0; if ($i) { print } ] . "\n";'
  -e '$code .= q[ elsif ($i) { print } ] . "\n" for 1..$ARGV[0];'
  -e 'eval $code' 10000

[2] Compare

$ git diff --ignore-all-space --stat
op.c | 37 [...]
1 file changed, 34 insertions(+), 3 deletions(-)

versus.

$ git diff --stat
op.c | 141 [...]
1 file changed, 86 insertions(+), 55 deletions(-)

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jul 18, 2013

From @bulk88

On Wed Jul 17 14​:29​:33 2013, niels@​thykier.net wrote​:

Hi,

I cannot reproduce the issue in S_finalize_op on blead[1]. It is
possible that it has been "fixed" somehow (or we got different
architectures).

On the other hand, I can reproduce the crash caused by​:

perl -e'eval "sub{".q"$a+"x shift . "}"' 500000

I'll update this ticket for 5.19.2. All experiments were done with a
intentionally C stack reduced perl, the C stack is fixed at 20 KB, the
perl is -O1, so the parameters in the callstacks may be/are garbage.

Perl_scalarvoid on stk.pl script above is still a problem. I attach a
new callstack.

The davem script above is still a problem. New callstack attached.

The Father C rep operator on add operator then eval is still a problem.
Callstack attached.

I also attach a newer perlmain.c that I used to reduce the C stack's
size, the original c stack shrinking code above was more hackish and
only worked on DEBUGGING perl.

--
bulk88 ~ bulk88 at hotmail.com

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jul 18, 2013

From @bulk88

  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x00930a80) Line 1233 + 0x3 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6b1ec) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6b1cc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6b14c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6b12c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6b0ac) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6b08c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6b00c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6afec) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6af6c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6af4c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6aecc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6aeac) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6ae2c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6ae0c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6ad8c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6ad6c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6acec) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6accc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6ac4c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6ac2c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6abac) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6ab8c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6ab0c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6aaec) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6aa6c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6aa4c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6a9cc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6a9ac) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6f5f4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6f5d4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6f554) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6f534) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6f4b4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6f494) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6f414) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6f3f4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6f374) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6f354) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6f2d4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6f2b4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6f234) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6f214) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6f194) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6f174) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6f0f4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6f0d4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6f054) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6f034) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6efb4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6ef94) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6ef14) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6eef4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6ee74) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6ee54) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6edd4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6edb4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6ed34) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6ed14) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6ec94) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6ec74) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6ebf4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6ebd4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6eb54) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6eb34) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6eab4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6ea94) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6ea14) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e9f4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e974) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e954) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e8d4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e8b4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e834) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e814) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e794) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e774) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e6f4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e6d4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e654) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e634) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e5b4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e594) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e514) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e4f4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e474) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e454) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e3d4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e3b4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e334) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e314) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e294) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e274) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e1f4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e1d4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e154) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e134) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e0b4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e094) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6e014) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6dff4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6df74) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6df54) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6ded4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6deb4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6de34) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6de14) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6dd94) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6dd74) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6dcf4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6dcd4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6dc54) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6dc34) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6dbb4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6db94) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6db14) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6daf4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6da74) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6da54) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6d9d4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6d9b4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6d934) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6d914) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6d894) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6d874) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6d7f4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6d7d4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6d754) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6d734) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6d6b4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f6d694) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f722dc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f722bc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7223c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7221c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7219c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7217c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f720fc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f720dc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7205c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7203c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f71fbc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f71f9c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f71f1c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f71efc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f71e7c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f71e5c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f71ddc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f71dbc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f71d3c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f71d1c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f71c9c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f71c7c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f71bfc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f71bdc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f71b5c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f71b3c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f71abc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f71a9c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f71a1c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f719fc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7197c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7195c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f718dc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f718bc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7183c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7181c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7179c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7177c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f716fc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f716dc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7165c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7163c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f715bc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7159c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7151c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f714fc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7147c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7145c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f713dc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f713bc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7133c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7131c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7129c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7127c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f711fc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f711dc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7115c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7113c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f710bc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7109c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7101c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f70ffc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f70f7c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f70f5c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f70edc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f70ebc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f70e3c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f70e1c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f70d9c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f70d7c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f70cfc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f70cdc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f70c5c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f70c3c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f70bbc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f70b9c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f70b1c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f70afc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f70a7c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f70a5c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f709dc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f709bc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7093c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7091c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7089c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7087c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f707fc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f707dc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7075c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7073c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f706bc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7069c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7061c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f705fc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7057c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7055c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f704dc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f704bc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7043c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7041c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7039c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7037c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74fc4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74fa4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74f24) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74f04) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74e84) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74e64) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74de4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74dc4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74d44) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74d24) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74ca4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74c84) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74c04) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74be4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74b64) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74b44) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74ac4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74aa4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74a24) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74a04) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74984) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74964) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f748e4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f748c4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74844) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74824) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f747a4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74784) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74704) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f746e4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74664) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74644) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f745c4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f745a4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74524) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74504) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74484) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74464) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f743e4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f743c4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74344) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74324) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f742a4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74284) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74204) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f741e4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74164) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74144) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f740c4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f740a4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74024) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f74004) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73f84) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73f64) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73ee4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73ec4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73e44) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73e24) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73da4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73d84) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73d04) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73ce4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73c64) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73c44) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73bc4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73ba4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73b24) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73b04) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73a84) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73a64) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f739e4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f739c4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73944) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73924) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f738a4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73884) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73804) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f737e4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73764) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73744) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f736c4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f736a4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73624) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73604) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73584) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73564) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f734e4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f734c4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73444) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73424) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f733a4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73384) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73304) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f732e4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73264) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73244) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f731c4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f731a4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73124) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73104) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73084) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f73064) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77cb4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77c94) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77c14) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77bf4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77b74) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77b54) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77ad4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77ab4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77a34) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77a14) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77994) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77974) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f778f4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f778d4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77854) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77834) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f777b4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77794) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77714) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f776f4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77674) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77654) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f775d4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f775b4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77534) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77514) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77494) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77474) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f773f4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f773d4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77354) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77334) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f772b4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77294) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77214) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f771f4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77174) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77154) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f770d4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f770b4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77034) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f77014) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76f94) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76f74) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76ef4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76ed4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76e54) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76e34) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76db4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76d94) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76d14) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76cf4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76c74) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76c54) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76bd4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76bb4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76b34) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76b14) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76a94) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76a74) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f769f4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f769d4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76954) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76934) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f768b4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76894) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76814) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f767f4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76774) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76754) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f766d4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f766b4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76634) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76614) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76594) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76574) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f764f4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f764d4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76454) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76434) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f763b4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76394) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76314) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f762f4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76274) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76254) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f761d4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f761b4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76134) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76114) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76094) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f76074) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f75ff4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f75fd4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f75f54) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f75f34) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f75eb4) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f75e94) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f75e14) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f75df4) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f75d74) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f75d54) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7a99c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7a97c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7a8fc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7a8dc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7a85c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7a83c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7a7bc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7a79c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7a71c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7a6fc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7a67c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7a65c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7a5dc) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7a5bc) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7a53c) Line 1505 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7a51c) Line 1528 + 0x9 C
  perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7a4f8) Line 1505 + 0x9 C

perl519.dll!Perl_scalarvoid(interpreter * my_perl=0x003657e4, op * o=0x01f7a4d8) Line 1528 + 0x9 C
  perl519.dll!S_scalarseq(interpreter * my_perl=0x0012b000, op * o=0x000001ff) Line 1646 + 0x7 C
  perl519.dll!Perl_block_end(interpreter * my_perl=0x00000005, long floor=0x000000ab, op * seq=0x000001ff) Line 2902 + 0xd C
  perl519.dll!Perl_yyparse(interpreter * my_perl=0x003657e4, int gramtype=0x00000001) Line 209 + 0xd C
  perl519.dll!S_doeval(interpreter * my_perl=0x00000005, int gimme=0x00000002, cv * outside=0x000001ff, unsigned long seq=0x0000001c, hv * hh=0x00000000) Line 3490 C
  perl519.dll!Perl_pp_require(interpreter * my_perl=0x009045bc) Line 4095 + 0x21 C
  perl519.dll!Perl_runops_standard(interpreter * my_perl=0x003657e4) Line 42 + 0x4 C
  perl519.dll!Perl_call_sv(interpreter * my_perl=0x00000000, sv * sv=0x0012b0b0, volatile long flags=0x28021eb4) Line 2809 + 0xc C
  perl519.dll!Perl_call_list(interpreter * my_perl=0x003657e4, long oldscope=0x00000002, av * paramList=0x008fe704) Line 4900 C
  perl519.dll!S_process_special_blocks(interpreter * my_perl=0x00070023, long floor=0x000001ff, const char * const fullname=0x0036e684, gv * const gv=0x008fe784, cv * const cv=0x008fe724) Line 7741 C
  perl519.dll!Perl_newATTRSUB_flags(interpreter * my_perl=0x000001ff, long floor=0x00000026, op * o=0x009076f0, op * proto=0x00000000, void * attrs=0x2802a49e, op * block=0x0036e4e0, unsigned long flags=0x01000000) Line 7703 + 0x13 C
  perl519.dll!Perl_newATTRSUB(interpreter * my_perl=0x003657e4, long floor=0x00000026, op * o=0x009076f0, op * proto=0x00000000, op * attrs=0x00000000, op * block=0x0036e4e0) Line 7376 + 0x19 C
  perl519.dll!Perl_yyparse(interpreter * my_perl=0x003657e4, int gramtype=0x009076f0) Line 364 + 0x25 C
  perl519.dll!S_parse_body(interpreter * my_perl=0x000001ff, char * * env=0x003628c0, void (interpreter *)* xsinit=0x280af764) Line 2337 + 0xd C
  perl519.dll!perl_parse(interpreter * my_perl=0x003657e4, void (interpreter *)* xsinit=0x280af764, int argc=0x00000002, char * * argv=0x00362478, char * * env=0x003628c0) Line 1650 C
  perl519.dll!RunPerl(int argc=0x00000002, char * * argv=0x01362478, char * * env=0x00362de8) Line 263 + 0x10 C
  perl.exe!main(int argc=0x00000002, char * * argv=0x00362478, char * * env=0x00362de8) Line 88 + 0x12 C
  perl.exe!mainCRTStartup() Line 398 + 0xe C
  kernel32.dll!_BaseProcessStart@​4() + 0x23

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jul 18, 2013

From @bulk88

#include "EXTERN.h"
#include "perl.h"

#ifdef __GNUC__

/* Mingw32 defaults to globing command line 
 * This is inconsistent with other Win32 ports and 
 * seems to cause trouble with passing -DXSVERSION=\"1.6\" 
 * So we turn it off like this, but only when compiling
 * perlmain.c: perlmainst.c is linked into the same executable
 * as win32.c, which also does this, so we mustn't do it twice
 * otherwise we get a multiple definition error.
 */
#ifndef PERLDLL
int _CRT_glob = 0;
#endif

#endif

DWORD FilterFunction(LPEXCEPTION_POINTERS exceptionPtr) 
{ 
    printf("1 ");                     // printed first 
    return EXCEPTION_EXECUTE_HANDLER; 
} 

int
main(int argc, char **argv, char **env)
{
    char * stackSizeEnv = getenv("PLSTK");
    int newStackSize = 0;
    DWORD oldProtect;
    PBYTE pPtr;
    MEMORY_BASIC_INFORMATION infoRes;
    MEMORY_BASIC_INFORMATION infoGuard;
    MEMORY_BASIC_INFORMATION infoAlloc;
    DWORD_PTR stackEnd;
    DWORD_PTR stackAllocBegin;
    BOOL ret;
    __asm mov pPtr, esp
    if(stackSizeEnv) {
        newStackSize = atoi(stackSizeEnv);
    }
    else {
        newStackSize = 5;
    }
    if(newStackSize) {
        ret = VirtualQuery(pPtr, &infoRes, 
                sizeof(MEMORY_BASIC_INFORMATION));
        assert(ret);
        ret = VirtualQuery((DWORD_PTR)infoRes.AllocationBase, &infoRes, 
                sizeof(MEMORY_BASIC_INFORMATION));
        assert(ret);
        ret = VirtualQuery((DWORD_PTR)infoRes.AllocationBase+infoRes.RegionSize, &infoGuard, 
            sizeof(MEMORY_BASIC_INFORMATION));
        assert(ret);
        ret = VirtualQuery((DWORD_PTR)infoRes.AllocationBase
                            +infoRes.RegionSize
                            +infoGuard.RegionSize
                            ,&infoAlloc, sizeof(MEMORY_BASIC_INFORMATION));
        assert(ret);
        stackEnd = (DWORD_PTR)infoRes.AllocationBase+infoRes.RegionSize
                            +infoGuard.RegionSize+infoAlloc.RegionSize;
        stackAllocBegin = stackEnd-(newStackSize*4096);
        ret = VirtualAlloc(stackAllocBegin, (newStackSize*4096), MEM_COMMIT, PAGE_READWRITE);
        //ret = VirtualProtect(stackAllocBegin, (newStackSize*4096),
        //                        PAGE_READWRITE, &oldProtect);
        printf("vp ret=%u glr=%u\n", ret, GetLastError());
        ret = VirtualAlloc(stackAllocBegin-(4096*2), (4096*2), MEM_COMMIT, PAGE_NOACCESS);
        printf("vp ret=%u glr=%u\n", ret, GetLastError());
        //ret = VirtualProtect(stackEnd-(newStackSize*4096)-4096, 4096,
        //                        PAGE_NOACCESS, &oldProtect);
        //printf("vp ret=%u glr=%u\n", ret, GetLastError());
        //while( ! (stMemBasicInfo.Protect & PAGE_GUARD)) {
        //    assert(VirtualQuery((DWORD_PTR)stMemBasicInfo.BaseAddress-1, &stMemBasicInfo, 
        //           sizeof(stMemBasicInfo)));        
        //}
        //assert(VirtualProtect(stMemBasicInfo.BaseAddress, stMemBasicInfo.RegionSize,
        //                        PAGE_NOACCESS, &oldProtect));
        //assert(VirtualQuery((DWORD_PTR)stMemBasicInfo.BaseAddress-1, &stMemBasicInfo, 
        //       sizeof(stMemBasicInfo)));
        //assert(VirtualFree((DWORD_PTR)stMemBasicInfo.AllocationBase, 
        //           0, MEM_RELEASE));
    }
    if(0) {
        exit(1);
    }
    __try {
    ret = RunPerl(argc, argv, env);
    }
    __except(FilterFunction(GetExceptionInformation())) {
    ret = 1;
    }
    return ret;
}




@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jul 18, 2013

From @bulk88

[rep op on evaled add callstack.txt](https://rt-archive.perl.org/perl5/Ticket/Attachment/1235621/643139/rep op on evaled add callstack.txt)

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jul 18, 2013

From @bulk88

RT web interface lost the attachment. Adding a missing one.

--
bulk88 ~ bulk88 at hotmail.com

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jul 18, 2013

From @bulk88

On Wed Jul 17 19​:10​:02 2013, bulk88 wrote​:

RT web interface lost the attachment. Adding a missing one.

Ok, I uploaded a 0 byte file before. Trying again.

--
bulk88 ~ bulk88 at hotmail.com

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jul 18, 2013

From @bulk88

n is at 5000

perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00958b84) Line 1696 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00958ba0) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00958ae8) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c069c4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c069a4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c06924) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c06904) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c06884) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c06864) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c067e4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c067c4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c06744) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c06724) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c066a4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c06684) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c06604) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c065e4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c06564) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c06544) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c064c4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c064a4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c06424) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c06404) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c06384) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c06364) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c062e4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c062c4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c06244) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c06224) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c061a4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c06184) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c06104) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c060e4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c06064) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c06044) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a95c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a93c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a8bc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a89c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a81c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a7fc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a77c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a75c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a6dc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a6bc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a63c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a61c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a59c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a57c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a4fc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a4dc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a45c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a43c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a3bc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a39c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a31c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a2fc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a27c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a25c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a1dc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a1bc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a13c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a11c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a09c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0a07c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c09ffc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c09fdc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c09f5c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c09f3c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c09ebc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c09e9c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c09e1c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c09dfc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c09d7c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c09d5c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c09cdc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c09cbc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c09c3c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c09c1c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c09b9c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c09b7c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c09afc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c09adc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c09a5c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c09a3c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c099bc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0999c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0991c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c098fc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0987c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0985c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c097dc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c097bc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0973c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0971c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0969c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0967c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c095fc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c095dc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0955c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0953c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c094bc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0949c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0941c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c093fc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0937c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0935c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c092dc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c092bc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0923c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0921c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0919c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0917c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c090fc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c090dc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0905c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0903c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c08fbc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c08f9c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c08f1c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c08efc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c08e7c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c08e5c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c08ddc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c08dbc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c08d3c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c08d1c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c08c9c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c08c7c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c08bfc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c08bdc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c08b5c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c08b3c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c08abc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c08a9c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c08a1c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c089fc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d314) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d2f4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d274) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d254) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d1d4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d1b4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d134) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d114) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d094) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d074) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0cff4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0cfd4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0cf54) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0cf34) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ceb4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ce94) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ce14) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0cdf4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0cd74) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0cd54) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ccd4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ccb4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0cc34) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0cc14) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0cb94) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0cb74) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0caf4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0cad4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ca54) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ca34) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c9b4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c994) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c914) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c8f4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c874) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c854) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c7d4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c7b4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c734) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c714) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c694) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c674) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c5f4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c5d4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c554) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c534) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c4b4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c494) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c414) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c3f4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c374) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c354) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c2d4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c2b4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c234) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c214) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c194) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c174) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c0f4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c0d4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c054) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0c034) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0bfb4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0bf94) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0bf14) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0bef4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0be74) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0be54) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0bdd4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0bdb4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0bd34) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0bd14) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0bc94) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0bc74) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0bbf4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0bbd4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0bb54) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0bb34) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0bab4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ba94) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ba14) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0b9f4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0b974) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0b954) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0b8d4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0b8b4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0b834) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0b814) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0b794) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0b774) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0b6f4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0b6d4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0b654) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0b634) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0b5b4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0b594) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0b514) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0b4f4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0b474) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0b454) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0b3d4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0b3b4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f33c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f31c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f29c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f27c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f1fc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f1dc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f15c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f13c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f0bc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f09c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f01c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0effc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ef7c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ef5c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0eedc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0eebc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ee3c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ee1c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ed9c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ed7c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ecfc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ecdc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ec5c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ec3c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ebbc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0eb9c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0eb1c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0eafc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ea7c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ea5c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e9dc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e9bc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e93c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e91c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e89c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e87c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e7fc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e7dc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e75c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e73c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e6bc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e69c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e61c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e5fc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e57c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e55c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e4dc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e4bc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e43c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e41c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e39c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e37c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e2fc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e2dc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e25c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e23c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e1bc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e19c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e11c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e0fc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e07c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0e05c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0dfdc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0dfbc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0df3c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0df1c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0de9c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0de7c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ddfc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0dddc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0dd5c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0dd3c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0dcbc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0dc9c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0dc1c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0dbfc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0db7c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0db5c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0dadc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0dabc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0da3c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0da1c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d99c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d97c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d8fc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d8dc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d85c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d83c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d7bc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d79c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d71c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d6fc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d67c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d65c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d5dc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d5bc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d53c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d51c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d49c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d47c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d3fc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0d3dc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c11364) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c11344) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c112c4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c112a4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c11224) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c11204) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c11184) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c11164) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c110e4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c110c4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c11044) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c11024) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10fa4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10f84) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10f04) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10ee4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10e64) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10e44) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10dc4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10da4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10d24) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10d04) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10c84) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10c64) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10be4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10bc4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10b44) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10b24) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10aa4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10a84) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10a04) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c109e4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10964) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10944) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c108c4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c108a4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10824) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10804) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10784) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10764) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c106e4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c106c4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10644) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10624) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c105a4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10584) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10504) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c104e4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10464) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10444) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c103c4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c103a4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10324) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10304) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10284) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10264) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c101e4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c101c4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10144) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10124) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c100a4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10084) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c10004) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ffe4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ff64) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0ff44) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0fec4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0fea4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0fe24) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0fe04) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0fd84) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0fd64) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0fce4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0fcc4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0fc44) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0fc24) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0fba4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0fb84) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0fb04) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0fae4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0fa64) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0fa44) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f9c4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f9a4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f924) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f904) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f884) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f864) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f7e4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f7c4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f744) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f724) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f6a4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f684) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f604) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f5e4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f564) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f544) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f4c4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f4a4) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f424) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c0f404) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c1356c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c1354c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c134cc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c134ac) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c1342c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c1340c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c1338c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c1336c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c132ec) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c132cc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c1324c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c1322c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c131ac) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c1318c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c1310c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c130ec) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c1306c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c1304c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c12fcc) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c12fac) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c12f2c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c12f0c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c12e8c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c12e6c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c12e48) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c12e28) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x0093005c) Line 1917 + 0x7 C
  perl519.dll!S_finalize_op(interpreter * my_perl=0x003657e4, op * o=0x00c12dcc) Line 1917 + 0x7 C
  perl519.dll!Perl_finalize_optree(interpreter * my_perl=0x003657e4, op * o=0x00c12dcc) Line 1691 C
  perl519.dll!Perl_newPROG(interpreter * my_perl=0x003657e4, op * o=0x0093005c) Line 3046 C
  perl519.dll!Perl_yyparse(interpreter * my_perl=0x003657e4, int gramtype=0x00000000) Line 146 + 0x14 C
  perl519.dll!S_doeval(interpreter * my_perl=0x00958ba0, int gimme=0x00000001, cv * outside=0x000000b6, unsigned long seq=0x00000002, hv * hh=0x00000000) Line 3490 C
  perl519.dll!Perl_pp_entereval(interpreter * my_perl=0x013657e4) Line 4225 + 0x18 C
  perl519.dll!Perl_runops_standard(interpreter * my_perl=0x003657e4) Line 42 + 0x4 C
  perl519.dll!S_run_body(interpreter * my_perl=0x003657e4, long oldscope=0x00000001) Line 2495 + 0xa C
  perl519.dll!perl_run(interpreter * my_perl=0x003657e4) Line 2411 + 0x8 C
  perl519.dll!RunPerl(int argc=0x00000003, char * * argv=0x01362478, char * * env=0x00362de8) Line 270 + 0x6 C
  perl.exe!main(int argc=0x00000003, char * * argv=0x00362478, char * * env=0x00362de8) Line 88 + 0x12 C
  perl.exe!mainCRTStartup() Line 398 + 0xe C
  kernel32.dll!_BaseProcessStart@​4() + 0x23

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jul 24, 2013

From @cpansprout

On Wed Jul 17 14​:29​:33 2013, niels@​thykier.net wrote​:

Hi,

I cannot reproduce the issue in S_finalize_op on blead[1]. It is
possible that it has been "fixed" somehow (or we got different
architectures).

On the other hand, I can reproduce the crash caused by​:

perl -e'eval "sub{".q"$a+"x shift . "}"' 500000

I have attached a prototype patch that solves the problem (at least for
me). With the patch applied, I can run it with up to at least 2M
without it crashing - I have not tested beyond that because perl starts
to use >= 4GB of RAM around the 2M mark.
A more memory friendly test case is definitely welcome. :)

For the reviewer(s)​: the patch is much easier to read by ignoring space
changes[2]. It re-uses the basic principe of the DEFER marco used in
the peephole optimizer. The "major" difference is that it uses a
fixed-size stack rather than a fixed-size queue. The size of the queue
did not seem to matter a lot (even with MAX_DEFERRED reduced to 2 was
the crash avoided in original test case).

The test suite showed no regression, perl was configured with​:
./Configure -des -Dusedevel

~Niels

[1] I have been using code suggested by Dave Mitchell (rewritten as a
perl one-liner)

./perl -e 'my $code = q[my $i = 0; if ($i) { print } ] . "\n";'
-e '$code .= q[ elsif ($i) { print } ] . "\n" for 1..$ARGV[0];'
-e 'eval $code' 10000

[2] Compare

$ git diff --ignore-all-space --stat
op.c | 37 [...]
1 file changed, 34 insertions(+), 3 deletions(-)

versus.

$ git diff --stat
op.c | 141 [...]
1 file changed, 86 insertions(+), 55 deletions(-)

Would you be willing to finish this patch, either making it malloc a
deferred stack when necessary (presumably a rare case) or using Dave
Mitchell’s op_sibling technique?

--

Father Chrysostomos

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Oct 28, 2014

From @tonycoz

On Wed Jul 24 12​:37​:14 2013, sprout wrote​:

Would you be willing to finish this patch, either making it malloc a
deferred stack when necessary (presumably a rare case) or using Dave
Mitchell’s op_sibling technique?

I've attached a variant of Niels' patch, included inline below as a whitespace ignoring diff.

Without the patch C< ./perl -e eval\ "sub{".q"$a+"x\ shift\ .\ "}" 500000 > crashed deep in op_free(), with the patch it didn't.

I was a bit worried about increasing the allocation linearly would result in a performance issue, but that turned out to be faster than a simple exponential allocation (on Linux, YMMV.)

Tony

Inline Patch
diff --git a/op.c b/op.c
index 59a3541..1460995 100644
--- a/op.c
+++ b/op.c
@@ -675,11 +675,29 @@ optree.
 =cut
 */
 
+#define DEFERRED_STEP 100
+#define DEFER(o) \
+  STMT_START { \
+    if (UNLIKELY(defer_ix == (defer_stack_alloc-1))) {    \
+        defer_stack_alloc += DEFERRED_STEP; \
+        assert(defer_stack_alloc > 0); \
+        Renew(defer_stack, defer_stack_alloc, OP *); \
+    } \
+    defer_stack[++defer_ix] = o; \
+  } STMT_END
+
+#define POP_DEFERRED() (defer_ix >= 0 ? defer_stack[defer_ix--] : (OP *)NULL)
+
 void
 Perl_op_free(pTHX_ OP *o)
 {
     dVAR;
     OPCODE type;
+    SSize_t defer_ix = -1;
+    SSize_t defer_stack_alloc = 0;
+    OP **defer_stack = NULL;
+
+    do {
 
         /* Though ops may be freed twice, freeing the op after its slab is a
            big no-no. */
@@ -687,7 +705,7 @@ Perl_op_free(pTHX_ OP *o)
         /* During the forced freeing of ops after compilation failure, kidops
            may be freed before their parents. */
         if (!o || o->op_type == OP_FREED)
-	return;
+            continue;
 
         type = o->op_type;
 
@@ -714,7 +732,7 @@ Perl_op_free(pTHX_ OP *o)
                     /* Need to find and remove any pattern match ops from the list
                        we maintain for reset().  */
                     find_and_forget_pmops(o);
-		return;
+                    continue;
                 }
                 }
                 break;
@@ -732,7 +750,16 @@ Perl_op_free(pTHX_ OP *o)
             OP *kid, *nextkid;
             for (kid = cUNOPo->op_first; kid; kid = nextkid) {
                 nextkid = OP_SIBLING(kid); /* Get before next freeing kid */
+                if (!kid || kid->op_type == OP_FREED)
+                    /* During the forced freeing of ops after
+                       compilation failure, kidops may be freed before
+                       their parents. */
+                    continue;
+                if (!(kid->op_flags & OPf_KIDS))
+                    /* If it has no kids, just free it now */
                     op_free(kid);
+                else
+                    DEFER(kid);
             }
         }
         if (type == OP_NULL)
@@ -753,8 +780,15 @@ Perl_op_free(pTHX_ OP *o)
         if (PL_op == o)
             PL_op = NULL;
 #endif
+    } while ( (o = POP_DEFERRED()) );
+
+    Safefree(defer_stack);
 }
 
+#undef DEFER
+#undef POP_DEFERRED
+#undef DEFERRED_STEP
+
 void
 Perl_op_clear(pTHX_ OP *o)
 {
@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Oct 28, 2014

From @tonycoz

0001-perl-108276-avoid-deep-recursion-in-Perl_op_free.patch
From 5444ca11479885c3114d8b6ba037bcaeaa187c79 Mon Sep 17 00:00:00 2001
From: Tony Cook <tony@develop-help.com>
Date: Tue, 28 Oct 2014 11:18:28 +1100
Subject: [perl #108276] avoid deep recursion in Perl_op_free()

Based on a patch by Niels Thykier, with the following changes:

- the stack is allocated dynamically, rather than with a fixed depth
  of 10

- reordered the loop to avoid pushing the argument and immediately
  popping it.  This wasn't a big deal with the auto stack, but avoids
  a Newx() call for freeing leaf nodes
---
 op.c |  158 ++++++++++++++++++++++++++++++++++++++++--------------------------
 1 file changed, 96 insertions(+), 62 deletions(-)

diff --git a/op.c b/op.c
index 59a3541..1460995 100644
--- a/op.c
+++ b/op.c
@@ -675,86 +675,120 @@ optree.
 =cut
 */
 
+#define DEFERRED_STEP 100
+#define DEFER(o) \
+  STMT_START { \
+    if (UNLIKELY(defer_ix == (defer_stack_alloc-1))) {    \
+        defer_stack_alloc += DEFERRED_STEP; \
+        assert(defer_stack_alloc > 0); \
+        Renew(defer_stack, defer_stack_alloc, OP *); \
+    } \
+    defer_stack[++defer_ix] = o; \
+  } STMT_END
+
+#define POP_DEFERRED() (defer_ix >= 0 ? defer_stack[defer_ix--] : (OP *)NULL)
+
 void
 Perl_op_free(pTHX_ OP *o)
 {
     dVAR;
     OPCODE type;
+    SSize_t defer_ix = -1;
+    SSize_t defer_stack_alloc = 0;
+    OP **defer_stack = NULL;
 
-    /* Though ops may be freed twice, freeing the op after its slab is a
-       big no-no. */
-    assert(!o || !o->op_slabbed || OpSLAB(o)->opslab_refcnt != ~(size_t)0); 
-    /* During the forced freeing of ops after compilation failure, kidops
-       may be freed before their parents. */
-    if (!o || o->op_type == OP_FREED)
-	return;
+    do {
 
-    type = o->op_type;
+        /* Though ops may be freed twice, freeing the op after its slab is a
+           big no-no. */
+        assert(!o || !o->op_slabbed || OpSLAB(o)->opslab_refcnt != ~(size_t)0);
+        /* During the forced freeing of ops after compilation failure, kidops
+           may be freed before their parents. */
+        if (!o || o->op_type == OP_FREED)
+            continue;
 
-    /* an op should only ever acquire op_private flags that we know about.
-     * If this fails, you may need to fix something in regen/op_private */
-    if (o->op_ppaddr == PL_ppaddr[o->op_type]) {
-	assert(!(o->op_private & ~PL_op_private_valid[type]));
-    }
+        type = o->op_type;
 
-    if (o->op_private & OPpREFCOUNTED) {
-	switch (type) {
-	case OP_LEAVESUB:
-	case OP_LEAVESUBLV:
-	case OP_LEAVEEVAL:
-	case OP_LEAVE:
-	case OP_SCOPE:
-	case OP_LEAVEWRITE:
-	    {
-	    PADOFFSET refcnt;
-	    OP_REFCNT_LOCK;
-	    refcnt = OpREFCNT_dec(o);
-	    OP_REFCNT_UNLOCK;
-	    if (refcnt) {
-		/* Need to find and remove any pattern match ops from the list
-		   we maintain for reset().  */
-		find_and_forget_pmops(o);
-		return;
-	    }
-	    }
-	    break;
-	default:
-	    break;
-	}
-    }
+        /* an op should only ever acquire op_private flags that we know about.
+         * If this fails, you may need to fix something in regen/op_private */
+        if (o->op_ppaddr == PL_ppaddr[o->op_type]) {
+            assert(!(o->op_private & ~PL_op_private_valid[type]));
+        }
 
-    /* Call the op_free hook if it has been set. Do it now so that it's called
-     * at the right time for refcounted ops, but still before all of the kids
-     * are freed. */
-    CALL_OPFREEHOOK(o);
+        if (o->op_private & OPpREFCOUNTED) {
+            switch (type) {
+            case OP_LEAVESUB:
+            case OP_LEAVESUBLV:
+            case OP_LEAVEEVAL:
+            case OP_LEAVE:
+            case OP_SCOPE:
+            case OP_LEAVEWRITE:
+                {
+                PADOFFSET refcnt;
+                OP_REFCNT_LOCK;
+                refcnt = OpREFCNT_dec(o);
+                OP_REFCNT_UNLOCK;
+                if (refcnt) {
+                    /* Need to find and remove any pattern match ops from the list
+                       we maintain for reset().  */
+                    find_and_forget_pmops(o);
+                    continue;
+                }
+                }
+                break;
+            default:
+                break;
+            }
+        }
 
-    if (o->op_flags & OPf_KIDS) {
-        OP *kid, *nextkid;
-	for (kid = cUNOPo->op_first; kid; kid = nextkid) {
-	    nextkid = OP_SIBLING(kid); /* Get before next freeing kid */
-	    op_free(kid);
-	}
-    }
-    if (type == OP_NULL)
-	type = (OPCODE)o->op_targ;
+        /* Call the op_free hook if it has been set. Do it now so that it's called
+         * at the right time for refcounted ops, but still before all of the kids
+         * are freed. */
+        CALL_OPFREEHOOK(o);
+
+        if (o->op_flags & OPf_KIDS) {
+            OP *kid, *nextkid;
+            for (kid = cUNOPo->op_first; kid; kid = nextkid) {
+                nextkid = OP_SIBLING(kid); /* Get before next freeing kid */
+                if (!kid || kid->op_type == OP_FREED)
+                    /* During the forced freeing of ops after
+                       compilation failure, kidops may be freed before
+                       their parents. */
+                    continue;
+                if (!(kid->op_flags & OPf_KIDS))
+                    /* If it has no kids, just free it now */
+                    op_free(kid);
+                else
+                    DEFER(kid);
+            }
+        }
+        if (type == OP_NULL)
+            type = (OPCODE)o->op_targ;
 
-    if (o->op_slabbed)
-        Slab_to_rw(OpSLAB(o));
+        if (o->op_slabbed)
+            Slab_to_rw(OpSLAB(o));
 
-    /* COP* is not cleared by op_clear() so that we may track line
-     * numbers etc even after null() */
-    if (type == OP_NEXTSTATE || type == OP_DBSTATE) {
-	cop_free((COP*)o);
-    }
+        /* COP* is not cleared by op_clear() so that we may track line
+         * numbers etc even after null() */
+        if (type == OP_NEXTSTATE || type == OP_DBSTATE) {
+            cop_free((COP*)o);
+        }
 
-    op_clear(o);
-    FreeOp(o);
+        op_clear(o);
+        FreeOp(o);
 #ifdef DEBUG_LEAKING_SCALARS
-    if (PL_op == o)
-	PL_op = NULL;
+        if (PL_op == o)
+            PL_op = NULL;
 #endif
+    } while ( (o = POP_DEFERRED()) );
+
+    Safefree(defer_stack);
 }
 
+#undef DEFER
+#undef POP_DEFERRED
+#undef DEFERRED_STEP
+
 void
 Perl_op_clear(pTHX_ OP *o)
 {
-- 
1.7.10.4

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Oct 28, 2014

From @cpansprout

On Mon Oct 27 17​:23​:20 2014, tonyc wrote​:

On Wed Jul 24 12​:37​:14 2013, sprout wrote​:

Would you be willing to finish this patch, either making it malloc a
deferred stack when necessary (presumably a rare case) or using Dave
Mitchell’s op_sibling technique?

I've attached a variant of Niels' patch, included inline below as a
whitespace ignoring diff.

Thank you. The patch looks good to me. I see no reason not to apply it.

--

Father Chrysostomos

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Oct 28, 2014

From @tonycoz

On Sun Jan 15 10​:35​:13 2012, bulk88 wrote​:

Perl lexer (???) has a deep recursion bug in Perl_scalarvoid when
given a very large Perl subroutine to run.  Perl_scalarvoid calls
itself over and over, for what I blindly guess is every opcode in the
sub.  If there are too many opcodes, C stack overflows.

The attached patches, in addition to my adaption of Neils' patch fixes your test case for me.

This doesn't attempt to fix possible recusion between scalarvoid() and scalar().

Tony

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Oct 28, 2014

From @tonycoz

0001-perl-108276-avoid-deep-scalarvoid-self-recursion.patch
From 5e237da0d1ac7de20fc7784db00b6e08d36946b7 Mon Sep 17 00:00:00 2001
From: Tony Cook <tony@develop-help.com>
Date: Wed, 29 Oct 2014 09:51:53 +1100
Subject: [perl #108276] avoid deep scalarvoid() self-recursion

This fixes the original test case from the ticket.

It may be possible for code that alternates recursion between
scalarvoid() and scalar() to cause deep recursion, but I haven't seen
an example that does it.

This doesn't indent the scalarvoid() loop, which will be done in another
ticket.
---
 op.c |   74 +++++++++++++++++++++++++++++++++++++++++-------------------------
 1 file changed, 46 insertions(+), 28 deletions(-)

diff --git a/op.c b/op.c
index 1460995..97d9f4a 100644
--- a/op.c
+++ b/op.c
@@ -109,6 +109,23 @@ recursive, but it's recursive on basic blocks, not on tree nodes.
 #define CALL_RPEEP(o) PL_rpeepp(aTHX_ o)
 #define CALL_OPFREEHOOK(o) if (PL_opfreehook) PL_opfreehook(aTHX_ o)
 
+/* Used to avoid recursion through the op tree in scalarvoid() and
+   op_free() 
+*/
+
+#define DEFERRED_OP_STEP 100
+#define DEFER_OP(o) \
+  STMT_START { \
+    if (UNLIKELY(defer_ix == (defer_stack_alloc-1))) {    \
+        defer_stack_alloc += DEFERRED_OP_STEP; \
+        assert(defer_stack_alloc > 0); \
+        Renew(defer_stack, defer_stack_alloc, OP *); \
+    } \
+    defer_stack[++defer_ix] = o; \
+  } STMT_END
+
+#define POP_DEFERRED_OP() (defer_ix >= 0 ? defer_stack[defer_ix--] : (OP *)NULL)
+
 /* remove any leading "empty" ops from the op_next chain whose first
  * node's address is stored in op_p. Store the updated address of the
  * first node in op_p.
@@ -675,19 +692,6 @@ optree.
 =cut
 */
 
-#define DEFERRED_STEP 100
-#define DEFER(o) \
-  STMT_START { \
-    if (UNLIKELY(defer_ix == (defer_stack_alloc-1))) {    \
-        defer_stack_alloc += DEFERRED_STEP; \
-        assert(defer_stack_alloc > 0); \
-        Renew(defer_stack, defer_stack_alloc, OP *); \
-    } \
-    defer_stack[++defer_ix] = o; \
-  } STMT_END
-
-#define POP_DEFERRED() (defer_ix >= 0 ? defer_stack[defer_ix--] : (OP *)NULL)
-
 void
 Perl_op_free(pTHX_ OP *o)
 {
@@ -759,7 +763,7 @@ Perl_op_free(pTHX_ OP *o)
                     /* If it has no kids, just free it now */
                     op_free(kid);
                 else
-                    DEFER(kid);
+                    DEFER_OP(kid);
             }
         }
         if (type == OP_NULL)
@@ -780,15 +784,11 @@ Perl_op_free(pTHX_ OP *o)
         if (PL_op == o)
             PL_op = NULL;
 #endif
-    } while ( (o = POP_DEFERRED()) );
+    } while ( (o = POP_DEFERRED_OP()) );
 
     Safefree(defer_stack);
 }
 
-#undef DEFER
-#undef POP_DEFERRED
-#undef DEFERRED_STEP
-
 void
 Perl_op_clear(pTHX_ OP *o)
 {
@@ -1600,17 +1600,23 @@ Perl_scalar(pTHX_ OP *o)
 }
 
 OP *
-Perl_scalarvoid(pTHX_ OP *o)
+Perl_scalarvoid(pTHX_ OP *arg)
 {
     dVAR;
     OP *kid;
-    SV *useless_sv = NULL;
-    const char* useless = NULL;
     SV* sv;
     U8 want;
+    SSize_t defer_stack_alloc = 0;
+    SSize_t defer_ix = -1;
+    OP **defer_stack = NULL;
+    OP *o = arg;
 
     PERL_ARGS_ASSERT_SCALARVOID;
 
+    do {
+        SV *useless_sv = NULL;
+        const char* useless = NULL;
+
     if (o->op_type == OP_NEXTSTATE
 	|| o->op_type == OP_DBSTATE
 	|| (o->op_type == OP_NULL && (o->op_targ == OP_NEXTSTATE
@@ -1623,13 +1629,14 @@ Perl_scalarvoid(pTHX_ OP *o)
 	 || (PL_parser && PL_parser->error_count)
 	 || o->op_type == OP_RETURN || o->op_type == OP_REQUIRE || o->op_type == OP_LEAVEWHEN)
     {
-	return o;
+	continue;
     }
 
     if ((o->op_private & OPpTARGET_MY)
 	&& (PL_opargs[o->op_type] & OA_TARGLEX))/* OPp share the meaning */
     {
-	return scalar(o);			/* As if inside SASSIGN */
+        scalar(o);			/* As if inside SASSIGN */
+        continue;
     }
 
     o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_VOID;
@@ -1893,7 +1900,10 @@ Perl_scalarvoid(pTHX_ OP *o)
     case OP_ENTERGIVEN:
     case OP_ENTERWHEN:
 	for (kid = OP_SIBLING(cUNOPo->op_first); kid; kid = OP_SIBLING(kid))
-	    scalarvoid(kid);
+            if (!(kid->op_flags & OPf_KIDS))
+                scalarvoid(kid);
+            else
+                DEFER_OP(kid);
 	break;
 
     case OP_NULL:
@@ -1916,7 +1926,10 @@ Perl_scalarvoid(pTHX_ OP *o)
     case OP_LEAVEWHEN:
       kids:
 	for (kid = cLISTOPo->op_first; kid; kid = OP_SIBLING(kid))
-	    scalarvoid(kid);
+            if (!(kid->op_flags & OPf_KIDS))
+                scalarvoid(kid);
+            else
+                DEFER_OP(kid);
 	break;
     case OP_LIST:
 	/* If the first kid after pushmark is something that the padrange
@@ -1942,7 +1955,8 @@ Perl_scalarvoid(pTHX_ OP *o)
 	scalarkids(o);
 	break;
     case OP_SCALAR:
-	return scalar(o);
+        scalar(o);
+        break;
     }
 
     if (useless_sv) {
@@ -1956,7 +1970,11 @@ Perl_scalarvoid(pTHX_ OP *o)
                       "Useless use of %s in void context",
                       useless);
     }
-    return o;
+    } while ( (o = POP_DEFERRED_OP()) );
+
+    Safefree(defer_stack);
+
+    return arg;
 }
 
 static OP *
-- 
1.7.10.4

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Oct 28, 2014

From @tonycoz

0002-perl-108276-re-indent-the-loop-body.patch
From be18f235814b722f22ecf9738449bf9f6675502d Mon Sep 17 00:00:00 2001
From: Tony Cook <tony@develop-help.com>
Date: Wed, 29 Oct 2014 10:41:18 +1100
Subject: [perl #108276] re-indent the loop body

also move the closing parens out of the #ifdef USE_ITHREADS so tools
(in my case emacs) aren't confused about the nesting
---
 op.c |  641 +++++++++++++++++++++++++++++++++---------------------------------
 1 file changed, 321 insertions(+), 320 deletions(-)

diff --git a/op.c b/op.c
index 97d9f4a..f3837a7 100644
--- a/op.c
+++ b/op.c
@@ -1617,359 +1617,360 @@ Perl_scalarvoid(pTHX_ OP *arg)
         SV *useless_sv = NULL;
         const char* useless = NULL;
 
-    if (o->op_type == OP_NEXTSTATE
-	|| o->op_type == OP_DBSTATE
-	|| (o->op_type == OP_NULL && (o->op_targ == OP_NEXTSTATE
-				      || o->op_targ == OP_DBSTATE)))
-	PL_curcop = (COP*)o;		/* for warning below */
-
-    /* assumes no premature commitment */
-    want = o->op_flags & OPf_WANT;
-    if ((want && want != OPf_WANT_SCALAR)
-	 || (PL_parser && PL_parser->error_count)
-	 || o->op_type == OP_RETURN || o->op_type == OP_REQUIRE || o->op_type == OP_LEAVEWHEN)
-    {
-	continue;
-    }
+        if (o->op_type == OP_NEXTSTATE
+            || o->op_type == OP_DBSTATE
+            || (o->op_type == OP_NULL && (o->op_targ == OP_NEXTSTATE
+                                          || o->op_targ == OP_DBSTATE)))
+            PL_curcop = (COP*)o;		/* for warning below */
+
+        /* assumes no premature commitment */
+        want = o->op_flags & OPf_WANT;
+        if ((want && want != OPf_WANT_SCALAR)
+            || (PL_parser && PL_parser->error_count)
+            || o->op_type == OP_RETURN || o->op_type == OP_REQUIRE || o->op_type == OP_LEAVEWHEN)
+        {
+            continue;
+        }
 
-    if ((o->op_private & OPpTARGET_MY)
-	&& (PL_opargs[o->op_type] & OA_TARGLEX))/* OPp share the meaning */
-    {
-        scalar(o);			/* As if inside SASSIGN */
-        continue;
-    }
+        if ((o->op_private & OPpTARGET_MY)
+            && (PL_opargs[o->op_type] & OA_TARGLEX))/* OPp share the meaning */
+        {
+            scalar(o);			/* As if inside SASSIGN */
+            continue;
+        }
 
-    o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_VOID;
+        o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_VOID;
 
-    switch (o->op_type) {
-    default:
-	if (!(PL_opargs[o->op_type] & OA_FOLDCONST))
-	    break;
-	/* FALLTHROUGH */
-    case OP_REPEAT:
-	if (o->op_flags & OPf_STACKED)
-	    break;
-	goto func_ops;
-    case OP_SUBSTR:
-	if (o->op_private == 4)
-	    break;
-	/* FALLTHROUGH */
-    case OP_GVSV:
-    case OP_WANTARRAY:
-    case OP_GV:
-    case OP_SMARTMATCH:
-    case OP_PADSV:
-    case OP_PADAV:
-    case OP_PADHV:
-    case OP_PADANY:
-    case OP_AV2ARYLEN:
-    case OP_REF:
-    case OP_REFGEN:
-    case OP_SREFGEN:
-    case OP_DEFINED:
-    case OP_HEX:
-    case OP_OCT:
-    case OP_LENGTH:
-    case OP_VEC:
-    case OP_INDEX:
-    case OP_RINDEX:
-    case OP_SPRINTF:
-    case OP_AELEM:
-    case OP_AELEMFAST:
-    case OP_AELEMFAST_LEX:
-    case OP_ASLICE:
-    case OP_KVASLICE:
-    case OP_HELEM:
-    case OP_HSLICE:
-    case OP_KVHSLICE:
-    case OP_UNPACK:
-    case OP_PACK:
-    case OP_JOIN:
-    case OP_LSLICE:
-    case OP_ANONLIST:
-    case OP_ANONHASH:
-    case OP_SORT:
-    case OP_REVERSE:
-    case OP_RANGE:
-    case OP_FLIP:
-    case OP_FLOP:
-    case OP_CALLER:
-    case OP_FILENO:
-    case OP_EOF:
-    case OP_TELL:
-    case OP_GETSOCKNAME:
-    case OP_GETPEERNAME:
-    case OP_READLINK:
-    case OP_TELLDIR:
-    case OP_GETPPID:
-    case OP_GETPGRP:
-    case OP_GETPRIORITY:
-    case OP_TIME:
-    case OP_TMS:
-    case OP_LOCALTIME:
-    case OP_GMTIME:
-    case OP_GHBYNAME:
-    case OP_GHBYADDR:
-    case OP_GHOSTENT:
-    case OP_GNBYNAME:
-    case OP_GNBYADDR:
-    case OP_GNETENT:
-    case OP_GPBYNAME:
-    case OP_GPBYNUMBER:
-    case OP_GPROTOENT:
-    case OP_GSBYNAME:
-    case OP_GSBYPORT:
-    case OP_GSERVENT:
-    case OP_GPWNAM:
-    case OP_GPWUID:
-    case OP_GGRNAM:
-    case OP_GGRGID:
-    case OP_GETLOGIN:
-    case OP_PROTOTYPE:
-    case OP_RUNCV:
-      func_ops:
-	if (!(o->op_private & (OPpLVAL_INTRO|OPpOUR_INTRO)))
-	    /* Otherwise it's "Useless use of grep iterator" */
-	    useless = OP_DESC(o);
-	break;
+        switch (o->op_type) {
+        default:
+            if (!(PL_opargs[o->op_type] & OA_FOLDCONST))
+                break;
+            /* FALLTHROUGH */
+        case OP_REPEAT:
+            if (o->op_flags & OPf_STACKED)
+                break;
+            goto func_ops;
+        case OP_SUBSTR:
+            if (o->op_private == 4)
+                break;
+            /* FALLTHROUGH */
+        case OP_GVSV:
+        case OP_WANTARRAY:
+        case OP_GV:
+        case OP_SMARTMATCH:
+        case OP_PADSV:
+        case OP_PADAV:
+        case OP_PADHV:
+        case OP_PADANY:
+        case OP_AV2ARYLEN:
+        case OP_REF:
+        case OP_REFGEN:
+        case OP_SREFGEN:
+        case OP_DEFINED:
+        case OP_HEX:
+        case OP_OCT:
+        case OP_LENGTH:
+        case OP_VEC:
+        case OP_INDEX:
+        case OP_RINDEX:
+        case OP_SPRINTF:
+        case OP_AELEM:
+        case OP_AELEMFAST:
+        case OP_AELEMFAST_LEX:
+        case OP_ASLICE:
+        case OP_KVASLICE:
+        case OP_HELEM:
+        case OP_HSLICE:
+        case OP_KVHSLICE:
+        case OP_UNPACK:
+        case OP_PACK:
+        case OP_JOIN:
+        case OP_LSLICE:
+        case OP_ANONLIST:
+        case OP_ANONHASH:
+        case OP_SORT:
+        case OP_REVERSE:
+        case OP_RANGE:
+        case OP_FLIP:
+        case OP_FLOP:
+        case OP_CALLER:
+        case OP_FILENO:
+        case OP_EOF:
+        case OP_TELL:
+        case OP_GETSOCKNAME:
+        case OP_GETPEERNAME:
+        case OP_READLINK:
+        case OP_TELLDIR:
+        case OP_GETPPID:
+        case OP_GETPGRP:
+        case OP_GETPRIORITY:
+        case OP_TIME:
+        case OP_TMS:
+        case OP_LOCALTIME:
+        case OP_GMTIME:
+        case OP_GHBYNAME:
+        case OP_GHBYADDR:
+        case OP_GHOSTENT:
+        case OP_GNBYNAME:
+        case OP_GNBYADDR:
+        case OP_GNETENT:
+        case OP_GPBYNAME:
+        case OP_GPBYNUMBER:
+        case OP_GPROTOENT:
+        case OP_GSBYNAME:
+        case OP_GSBYPORT:
+        case OP_GSERVENT:
+        case OP_GPWNAM:
+        case OP_GPWUID:
+        case OP_GGRNAM:
+        case OP_GGRGID:
+        case OP_GETLOGIN:
+        case OP_PROTOTYPE:
+        case OP_RUNCV:
+        func_ops:
+            if (!(o->op_private & (OPpLVAL_INTRO|OPpOUR_INTRO)))
+                /* Otherwise it's "Useless use of grep iterator" */
+                useless = OP_DESC(o);
+            break;
 
-    case OP_SPLIT:
-	kid = cLISTOPo->op_first;
-	if (kid && kid->op_type == OP_PUSHRE
-		&& !kid->op_targ
-		&& !(o->op_flags & OPf_STACKED)
+        case OP_SPLIT:
+            kid = cLISTOPo->op_first;
+            if (kid && kid->op_type == OP_PUSHRE
+                && !kid->op_targ
+                && !(o->op_flags & OPf_STACKED)
 #ifdef USE_ITHREADS
-		&& !((PMOP*)kid)->op_pmreplrootu.op_pmtargetoff)
+                && !((PMOP*)kid)->op_pmreplrootu.op_pmtargetoff
 #else
-		&& !((PMOP*)kid)->op_pmreplrootu.op_pmtargetgv)
+                && !((PMOP*)kid)->op_pmreplrootu.op_pmtargetgv
 #endif
-	    useless = OP_DESC(o);
-	break;
+                )
+                useless = OP_DESC(o);
+            break;
 
-    case OP_NOT:
-       kid = cUNOPo->op_first;
-       if (kid->op_type != OP_MATCH && kid->op_type != OP_SUBST &&
-           kid->op_type != OP_TRANS && kid->op_type != OP_TRANSR) {
-	        goto func_ops;
-       }
-       useless = "negative pattern binding (!~)";
-       break;
+        case OP_NOT:
+            kid = cUNOPo->op_first;
+            if (kid->op_type != OP_MATCH && kid->op_type != OP_SUBST &&
+                kid->op_type != OP_TRANS && kid->op_type != OP_TRANSR) {
+                goto func_ops;
+            }
+            useless = "negative pattern binding (!~)";
+            break;
 
-    case OP_SUBST:
-	if (cPMOPo->op_pmflags & PMf_NONDESTRUCT)
-	    useless = "non-destructive substitution (s///r)";
-	break;
+        case OP_SUBST:
+            if (cPMOPo->op_pmflags & PMf_NONDESTRUCT)
+                useless = "non-destructive substitution (s///r)";
+            break;
 
-    case OP_TRANSR:
-	useless = "non-destructive transliteration (tr///r)";
-	break;
+        case OP_TRANSR:
+            useless = "non-destructive transliteration (tr///r)";
+            break;
 
-    case OP_RV2GV:
-    case OP_RV2SV:
-    case OP_RV2AV:
-    case OP_RV2HV:
-	if (!(o->op_private & (OPpLVAL_INTRO|OPpOUR_INTRO)) &&
-		(!OP_HAS_SIBLING(o) || OP_SIBLING(o)->op_type != OP_READLINE))
-	    useless = "a variable";
-	break;
+        case OP_RV2GV:
+        case OP_RV2SV:
+        case OP_RV2AV:
+        case OP_RV2HV:
+            if (!(o->op_private & (OPpLVAL_INTRO|OPpOUR_INTRO)) &&
+                (!OP_HAS_SIBLING(o) || OP_SIBLING(o)->op_type != OP_READLINE))
+                useless = "a variable";
+            break;
 
-    case OP_CONST:
-	sv = cSVOPo_sv;
-	if (cSVOPo->op_private & OPpCONST_STRICT)
-	    no_bareword_allowed(o);
-	else {
-	    if (ckWARN(WARN_VOID)) {
-		NV nv;
-		/* don't warn on optimised away booleans, eg 
-		 * use constant Foo, 5; Foo || print; */
-		if (cSVOPo->op_private & OPpCONST_SHORTCIRCUIT)
-		    useless = NULL;
-		/* the constants 0 and 1 are permitted as they are
-		   conventionally used as dummies in constructs like
-		        1 while some_condition_with_side_effects;  */
-		else if (SvNIOK(sv) && ((nv = SvNV(sv)) == 0.0 || nv == 1.0))
-		    useless = NULL;
-		else if (SvPOK(sv)) {
-                    SV * const dsv = newSVpvs("");
-                    useless_sv
-                        = Perl_newSVpvf(aTHX_
-                                        "a constant (%s)",
-                                        pv_pretty(dsv, SvPVX_const(sv),
-                                                  SvCUR(sv), 32, NULL, NULL,
-                                                  PERL_PV_PRETTY_DUMP
-                                                  | PERL_PV_ESCAPE_NOCLEAR
-                                                  | PERL_PV_ESCAPE_UNI_DETECT));
-                    SvREFCNT_dec_NN(dsv);
-		}
-		else if (SvOK(sv)) {
-		    useless_sv = Perl_newSVpvf(aTHX_ "a constant (%"SVf")", SVfARG(sv));
-		}
-		else
-		    useless = "a constant (undef)";
-	    }
-	}
-	op_null(o);		/* don't execute or even remember it */
-	break;
+        case OP_CONST:
+            sv = cSVOPo_sv;
+            if (cSVOPo->op_private & OPpCONST_STRICT)
+                no_bareword_allowed(o);
+            else {
+                if (ckWARN(WARN_VOID)) {
+                    NV nv;
+                    /* don't warn on optimised away booleans, eg 
+                     * use constant Foo, 5; Foo || print; */
+                    if (cSVOPo->op_private & OPpCONST_SHORTCIRCUIT)
+                        useless = NULL;
+                    /* the constants 0 and 1 are permitted as they are
+                       conventionally used as dummies in constructs like
+                          1 while some_condition_with_side_effects;  */
+                    else if (SvNIOK(sv) && ((nv = SvNV(sv)) == 0.0 || nv == 1.0))
+                        useless = NULL;
+                    else if (SvPOK(sv)) {
+                        SV * const dsv = newSVpvs("");
+                        useless_sv
+                            = Perl_newSVpvf(aTHX_
+                                            "a constant (%s)",
+                                            pv_pretty(dsv, SvPVX_const(sv),
+                                                      SvCUR(sv), 32, NULL, NULL,
+                                                      PERL_PV_PRETTY_DUMP
+                                                      | PERL_PV_ESCAPE_NOCLEAR
+                                                      | PERL_PV_ESCAPE_UNI_DETECT));
+                        SvREFCNT_dec_NN(dsv);
+                    }
+                    else if (SvOK(sv)) {
+                        useless_sv = Perl_newSVpvf(aTHX_ "a constant (%"SVf")", SVfARG(sv));
+                    }
+                    else
+                        useless = "a constant (undef)";
+                }
+            }
+            op_null(o);		/* don't execute or even remember it */
+            break;
 
-    case OP_POSTINC:
-	o->op_type = OP_PREINC;		/* pre-increment is faster */
-	o->op_ppaddr = PL_ppaddr[OP_PREINC];
-	break;
+        case OP_POSTINC:
+            o->op_type = OP_PREINC;		/* pre-increment is faster */
+            o->op_ppaddr = PL_ppaddr[OP_PREINC];
+            break;
 
-    case OP_POSTDEC:
-	o->op_type = OP_PREDEC;		/* pre-decrement is faster */
-	o->op_ppaddr = PL_ppaddr[OP_PREDEC];
-	break;
+        case OP_POSTDEC:
+            o->op_type = OP_PREDEC;		/* pre-decrement is faster */
+            o->op_ppaddr = PL_ppaddr[OP_PREDEC];
+            break;
 
-    case OP_I_POSTINC:
-	o->op_type = OP_I_PREINC;	/* pre-increment is faster */
-	o->op_ppaddr = PL_ppaddr[OP_I_PREINC];
-	break;
+        case OP_I_POSTINC:
+            o->op_type = OP_I_PREINC;	/* pre-increment is faster */
+            o->op_ppaddr = PL_ppaddr[OP_I_PREINC];
+            break;
 
-    case OP_I_POSTDEC:
-	o->op_type = OP_I_PREDEC;	/* pre-decrement is faster */
-	o->op_ppaddr = PL_ppaddr[OP_I_PREDEC];
-	break;
+        case OP_I_POSTDEC:
+            o->op_type = OP_I_PREDEC;	/* pre-decrement is faster */
+            o->op_ppaddr = PL_ppaddr[OP_I_PREDEC];
+            break;
 
-    case OP_SASSIGN: {
-	OP *rv2gv;
-	UNOP *refgen, *rv2cv;
-	LISTOP *exlist;
+        case OP_SASSIGN: {
+            OP *rv2gv;
+            UNOP *refgen, *rv2cv;
+            LISTOP *exlist;
 
-	if ((o->op_private & ~OPpASSIGN_BACKWARDS) != 2)
-	    break;
+            if ((o->op_private & ~OPpASSIGN_BACKWARDS) != 2)
+                break;
 
-	rv2gv = ((BINOP *)o)->op_last;
-	if (!rv2gv || rv2gv->op_type != OP_RV2GV)
-	    break;
+            rv2gv = ((BINOP *)o)->op_last;
+            if (!rv2gv || rv2gv->op_type != OP_RV2GV)
+            break;
 
-	refgen = (UNOP *)((BINOP *)o)->op_first;
+            refgen = (UNOP *)((BINOP *)o)->op_first;
 
-	if (!refgen || (refgen->op_type != OP_REFGEN
-			&& refgen->op_type != OP_SREFGEN))
-	    break;
+            if (!refgen || (refgen->op_type != OP_REFGEN
+                            && refgen->op_type != OP_SREFGEN))
+                break;
 
-	exlist = (LISTOP *)refgen->op_first;
-	if (!exlist || exlist->op_type != OP_NULL
-	    || exlist->op_targ != OP_LIST)
-	    break;
+            exlist = (LISTOP *)refgen->op_first;
+            if (!exlist || exlist->op_type != OP_NULL
+                || exlist->op_targ != OP_LIST)
+                break;
 
-	if (exlist->op_first->op_type != OP_PUSHMARK
-	 && exlist->op_first != exlist->op_last)
-	    break;
+            if (exlist->op_first->op_type != OP_PUSHMARK
+                && exlist->op_first != exlist->op_last)
+                break;
 
-	rv2cv = (UNOP*)exlist->op_last;
+            rv2cv = (UNOP*)exlist->op_last;
 
-	if (rv2cv->op_type != OP_RV2CV)
-	    break;
+            if (rv2cv->op_type != OP_RV2CV)
+                break;
 
-	assert ((rv2gv->op_private & OPpDONT_INIT_GV) == 0);
-	assert ((o->op_private & OPpASSIGN_CV_TO_GV) == 0);
-	assert ((rv2cv->op_private & OPpMAY_RETURN_CONSTANT) == 0);
+            assert ((rv2gv->op_private & OPpDONT_INIT_GV) == 0);
+            assert ((o->op_private & OPpASSIGN_CV_TO_GV) == 0);
+            assert ((rv2cv->op_private & OPpMAY_RETURN_CONSTANT) == 0);
 
-	o->op_private |= OPpASSIGN_CV_TO_GV;
-	rv2gv->op_private |= OPpDONT_INIT_GV;
-	rv2cv->op_private |= OPpMAY_RETURN_CONSTANT;
+            o->op_private |= OPpASSIGN_CV_TO_GV;
+            rv2gv->op_private |= OPpDONT_INIT_GV;
+            rv2cv->op_private |= OPpMAY_RETURN_CONSTANT;
 
-	break;
-    }
+            break;
+        }
 
-    case OP_AASSIGN: {
-	inplace_aassign(o);
-	break;
-    }
+        case OP_AASSIGN: {
+            inplace_aassign(o);
+            break;
+        }
 
-    case OP_OR:
-    case OP_AND:
-	kid = cLOGOPo->op_first;
-	if (kid->op_type == OP_NOT
-	    && (kid->op_flags & OPf_KIDS)) {
-	    if (o->op_type == OP_AND) {
-		o->op_type = OP_OR;
-		o->op_ppaddr = PL_ppaddr[OP_OR];
-	    } else {
-		o->op_type = OP_AND;
-		o->op_ppaddr = PL_ppaddr[OP_AND];
-	    }
-	    op_null(kid);
-	}
-        /* FALLTHROUGH */
+        case OP_OR:
+        case OP_AND:
+            kid = cLOGOPo->op_first;
+            if (kid->op_type == OP_NOT
+                && (kid->op_flags & OPf_KIDS)) {
+                if (o->op_type == OP_AND) {
+                    o->op_type = OP_OR;
+                    o->op_ppaddr = PL_ppaddr[OP_OR];
+                } else {
+                    o->op_type = OP_AND;
+                    o->op_ppaddr = PL_ppaddr[OP_AND];
+                }
+                op_null(kid);
+            }
+            /* FALLTHROUGH */
 
-    case OP_DOR:
-    case OP_COND_EXPR:
-    case OP_ENTERGIVEN:
-    case OP_ENTERWHEN:
-	for (kid = OP_SIBLING(cUNOPo->op_first); kid; kid = OP_SIBLING(kid))
-            if (!(kid->op_flags & OPf_KIDS))
-                scalarvoid(kid);
-            else
-                DEFER_OP(kid);
-	break;
+        case OP_DOR:
+        case OP_COND_EXPR:
+        case OP_ENTERGIVEN:
+        case OP_ENTERWHEN:
+            for (kid = OP_SIBLING(cUNOPo->op_first); kid; kid = OP_SIBLING(kid))
+                if (!(kid->op_flags & OPf_KIDS))
+                    scalarvoid(kid);
+                else
+                    DEFER_OP(kid);
+            break;
 
-    case OP_NULL:
-	if (o->op_flags & OPf_STACKED)
-	    break;
-	/* FALLTHROUGH */
-    case OP_NEXTSTATE:
-    case OP_DBSTATE:
-    case OP_ENTERTRY:
-    case OP_ENTER:
-	if (!(o->op_flags & OPf_KIDS))
-	    break;
-	/* FALLTHROUGH */
-    case OP_SCOPE:
-    case OP_LEAVE:
-    case OP_LEAVETRY:
-    case OP_LEAVELOOP:
-    case OP_LINESEQ:
-    case OP_LEAVEGIVEN:
-    case OP_LEAVEWHEN:
-      kids:
-	for (kid = cLISTOPo->op_first; kid; kid = OP_SIBLING(kid))
-            if (!(kid->op_flags & OPf_KIDS))
-                scalarvoid(kid);
-            else
-                DEFER_OP(kid);
-	break;
-    case OP_LIST:
-	/* If the first kid after pushmark is something that the padrange
-	   optimisation would reject, then null the list and the pushmark.
-	 */
-	if ((kid = cLISTOPo->op_first)->op_type == OP_PUSHMARK
-	 && (  !(kid = OP_SIBLING(kid))
-	    || (  kid->op_type != OP_PADSV
-	       && kid->op_type != OP_PADAV
-	       && kid->op_type != OP_PADHV)
-	    || kid->op_private & ~OPpLVAL_INTRO
-	    || !(kid = OP_SIBLING(kid))
-	    || (  kid->op_type != OP_PADSV
-	       && kid->op_type != OP_PADAV
-	       && kid->op_type != OP_PADHV)
-	    || kid->op_private & ~OPpLVAL_INTRO)
-	) {
-	    op_null(cUNOPo->op_first); /* NULL the pushmark */
-	    op_null(o); /* NULL the list */
-	}
-	goto kids;
-    case OP_ENTEREVAL:
-	scalarkids(o);
-	break;
-    case OP_SCALAR:
-        scalar(o);
-        break;
-    }
+        case OP_NULL:
+            if (o->op_flags & OPf_STACKED)
+                break;
+            /* FALLTHROUGH */
+        case OP_NEXTSTATE:
+        case OP_DBSTATE:
+        case OP_ENTERTRY:
+        case OP_ENTER:
+            if (!(o->op_flags & OPf_KIDS))
+                break;
+            /* FALLTHROUGH */
+        case OP_SCOPE:
+        case OP_LEAVE:
+        case OP_LEAVETRY:
+        case OP_LEAVELOOP:
+        case OP_LINESEQ:
+        case OP_LEAVEGIVEN:
+        case OP_LEAVEWHEN:
+        kids:
+            for (kid = cLISTOPo->op_first; kid; kid = OP_SIBLING(kid))
+                if (!(kid->op_flags & OPf_KIDS))
+                    scalarvoid(kid);
+                else
+                    DEFER_OP(kid);
+            break;
+        case OP_LIST:
+            /* If the first kid after pushmark is something that the padrange
+               optimisation would reject, then null the list and the pushmark.
+            */
+            if ((kid = cLISTOPo->op_first)->op_type == OP_PUSHMARK
+                && (  !(kid = OP_SIBLING(kid))
+                   || (  kid->op_type != OP_PADSV
+                      && kid->op_type != OP_PADAV
+                      && kid->op_type != OP_PADHV)
+                   || kid->op_private & ~OPpLVAL_INTRO
+                   || !(kid = OP_SIBLING(kid))
+                   || (  kid->op_type != OP_PADSV
+                      && kid->op_type != OP_PADAV
+                      && kid->op_type != OP_PADHV)
+                   || kid->op_private & ~OPpLVAL_INTRO)
+                ) {
+                op_null(cUNOPo->op_first); /* NULL the pushmark */
+                op_null(o); /* NULL the list */
+            }
+            goto kids;
+        case OP_ENTEREVAL:
+            scalarkids(o);
+            break;
+        case OP_SCALAR:
+            scalar(o);
+            break;
+        }
 
-    if (useless_sv) {
-        /* mortalise it, in case warnings are fatal.  */
-        Perl_ck_warner(aTHX_ packWARN(WARN_VOID),
-                       "Useless use of %"SVf" in void context",
-                       SVfARG(sv_2mortal(useless_sv)));
-    }
-    else if (useless) {
-       Perl_ck_warner(aTHX_ packWARN(WARN_VOID),
-                      "Useless use of %s in void context",
-                      useless);
-    }
+        if (useless_sv) {
+            /* mortalise it, in case warnings are fatal.  */
+            Perl_ck_warner(aTHX_ packWARN(WARN_VOID),
+                           "Useless use of %"SVf" in void context",
+                           SVfARG(sv_2mortal(useless_sv)));
+        }
+        else if (useless) {
+            Perl_ck_warner(aTHX_ packWARN(WARN_VOID),
+                           "Useless use of %s in void context",
+                           useless);
+        }
     } while ( (o = POP_DEFERRED_OP()) );
 
     Safefree(defer_stack);
-- 
1.7.10.4

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Nov 17, 2014

From @tonycoz

On Mon Jan 16 03​:51​:55 2012, davem wrote​:

On Sun, Jan 15, 2012 at 10​:35​:14AM -0800, bulk 88 wrote​:

The code can be simplified to the following​:

my $n = $ARGV\[0\];
die unless $n =~ /^\\d\+$/;

my $code = 'my $i = 0; if \($i\) \{ print \}' \. "\\n";
$code \.= 'elsif \($i\) \{ print \}' \. "\\n" for 1\.\.$n;
eval $code;

segfaults for me on blead with n >= about 5000.

In blead, it's recursing in S_finalize_op rather than scalarvoid; not sure
whether this is instead of or in addition to a scalarvoid problem.

Here's a patch that fixes the S_finalize_op() recursion, whitespace changes minimal

Additionally another patch to re-indent the new loop, and another to use the new macros I added to declare and clean-up the DEFER_OP() stack.

Tony

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Nov 17, 2014

From @tonycoz

0001-perl-108276-avoid-recursion-in-S_finalize_op.patch
From e7121e75f07de01236b37370154aa0661cd89734 Mon Sep 17 00:00:00 2001
From: Tony Cook <tony@develop-help.com>
Date: Mon, 17 Nov 2014 17:10:25 +1100
Subject: [perl #108276] avoid recursion in S_finalize_op()

This uses the same DEFER_OP() macro set as op_free() and scalarvoid()
but required a bit more work to ensure that warnings are still
produced in source order.
---
 op.c |   61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 56 insertions(+), 5 deletions(-)

diff --git a/op.c b/op.c
index 00c1255..c0de23c 100644
--- a/op.c
+++ b/op.c
@@ -109,10 +109,33 @@ recursive, but it's recursive on basic blocks, not on tree nodes.
 #define CALL_RPEEP(o) PL_rpeepp(aTHX_ o)
 #define CALL_OPFREEHOOK(o) if (PL_opfreehook) PL_opfreehook(aTHX_ o)
 
-/* Used to avoid recursion through the op tree in scalarvoid() and
-   op_free()
+/* Used to avoid recursion through the op tree in scalarvoid(),
+   op_free() and S_finalize_op().
+
+   Add:
+
+     DEFER_OP_DECLARE;
+
+   at the top of the scope these are used in and:
+
+     DEFER_OP_END;
+
+   at any exit points.
+
+   Use DEFER_OP(op) to push an op and POP_DEFERRED_OP() to get the next op
+   to process.
+
+   DEFERRED_OP_ALLOC(sz, fill) allocates sz items at the top of the
+   stack and sets fill to a pointer to just beyond the last item.
+   This is used by S_finalize_op() to ensure children are processed in
+   source order.
 */
 
+#define DEFER_OP_DECLARE \
+    SSize_t defer_ix = -1; \
+    SSize_t defer_stack_alloc = 0; \
+    OP **defer_stack = NULL
+#define DEFER_OP_END Safefree(defer_stack)
 #define DEFERRED_OP_STEP 100
 #define DEFER_OP(o) \
   STMT_START { \
@@ -126,6 +149,18 @@ recursive, but it's recursive on basic blocks, not on tree nodes.
 
 #define POP_DEFERRED_OP() (defer_ix >= 0 ? defer_stack[defer_ix--] : (OP *)NULL)
 
+#define DEFERRED_OP_ALLOC(sz, top) \
+  STMT_START { \
+    if (UNLIKELY(defer_ix + (sz) >= defer_stack_alloc)) { \
+        defer_stack_alloc +=                         \
+            (sz) < DEFERRED_OP_STEP ? DEFERRED_OP_STEP : (sz);   \
+        assert(defer_stack_alloc > 0);               \
+        Renew(defer_stack, defer_stack_alloc, OP *); \
+    }                                                \
+    defer_ix += (sz);                                \
+    (top) = defer_stack + defer_ix + 1;              \
+  } STMT_END
+
 /* remove any leading "empty" ops from the op_next chain whose first
  * node's address is stored in op_p. Store the updated address of the
  * first node in op_p.
@@ -2170,9 +2205,11 @@ S_op_relocate_sv(pTHX_ SV** svp, PADOFFSET* targp)
 STATIC void
 S_finalize_op(pTHX_ OP* o)
 {
-    PERL_ARGS_ASSERT_FINALIZE_OP;
+    DEFER_OP_DECLARE;
 
+    PERL_ARGS_ASSERT_FINALIZE_OP;
 
+    do {
     switch (o->op_type) {
     case OP_NEXTSTATE:
     case OP_DBSTATE:
@@ -2397,10 +2434,24 @@ S_finalize_op(pTHX_ OP* o)
 #  endif
         }
 #endif
+        {
+            /* Count then fill from the top to ensure any diagnostics
+               are produced in order from the start of the code.
+            */
+            SSize_t kid_count = 0;
+            OP **fill;
+            for (kid = cUNOPo->op_first; kid; kid = OP_SIBLING(kid))
+                ++kid_count;
+
+            DEFERRED_OP_ALLOC(kid_count, fill);
 
-	for (kid = cUNOPo->op_first; kid; kid = OP_SIBLING(kid))
-	    finalize_op(kid);
+            for (kid = cUNOPo->op_first; kid; kid = OP_SIBLING(kid))
+                *--fill = kid;
+        }
     }
+    } while ( (o = POP_DEFERRED_OP()) );
+
+    DEFER_OP_END;
 }
 
 /*
-- 
1.7.10.4

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Nov 17, 2014

From @tonycoz

0002-perl-108276-re-indent-the-new-S_finalize_op-loop.patch
From ced2d759ab9b642578a6d671f76da286988437df Mon Sep 17 00:00:00 2001
From: Tony Cook <tony@develop-help.com>
Date: Mon, 17 Nov 2014 17:23:27 +1100
Subject: [perl #108276] re-indent the new S_finalize_op() loop

whitespace changes only
---
 op.c |  424 +++++++++++++++++++++++++++++++++---------------------------------
 1 file changed, 212 insertions(+), 212 deletions(-)

diff --git a/op.c b/op.c
index c0de23c..45e9c16 100644
--- a/op.c
+++ b/op.c
@@ -2210,245 +2210,245 @@ S_finalize_op(pTHX_ OP* o)
     PERL_ARGS_ASSERT_FINALIZE_OP;
 
     do {
-    switch (o->op_type) {
-    case OP_NEXTSTATE:
-    case OP_DBSTATE:
-	PL_curcop = ((COP*)o);		/* for warnings */
-	break;
-    case OP_EXEC:
-	if (OP_HAS_SIBLING(o)) {
-            OP *sib = OP_SIBLING(o);
-            if ((  sib->op_type == OP_NEXTSTATE || sib->op_type == OP_DBSTATE)
-                && ckWARN(WARN_EXEC)
-                && OP_HAS_SIBLING(sib))
-            {
-		    const OPCODE type = OP_SIBLING(sib)->op_type;
-		    if (type != OP_EXIT && type != OP_WARN && type != OP_DIE) {
-			const line_t oldline = CopLINE(PL_curcop);
-			CopLINE_set(PL_curcop, CopLINE((COP*)sib));
-			Perl_warner(aTHX_ packWARN(WARN_EXEC),
-			    "Statement unlikely to be reached");
-			Perl_warner(aTHX_ packWARN(WARN_EXEC),
-			    "\t(Maybe you meant system() when you said exec()?)\n");
-			CopLINE_set(PL_curcop, oldline);
-		    }
-	    }
-        }
-	break;
+        switch (o->op_type) {
+        case OP_NEXTSTATE:
+        case OP_DBSTATE:
+            PL_curcop = ((COP*)o);		/* for warnings */
+            break;
+        case OP_EXEC:
+            if (OP_HAS_SIBLING(o)) {
+                OP *sib = OP_SIBLING(o);
+                if ((  sib->op_type == OP_NEXTSTATE || sib->op_type == OP_DBSTATE)
+                    && ckWARN(WARN_EXEC)
+                    && OP_HAS_SIBLING(sib))
+                {
+                    const OPCODE type = OP_SIBLING(sib)->op_type;
+                    if (type != OP_EXIT && type != OP_WARN && type != OP_DIE) {
+                        const line_t oldline = CopLINE(PL_curcop);
+                        CopLINE_set(PL_curcop, CopLINE((COP*)sib));
+                        Perl_warner(aTHX_ packWARN(WARN_EXEC),
+                            "Statement unlikely to be reached");
+                        Perl_warner(aTHX_ packWARN(WARN_EXEC),
+                            "\t(Maybe you meant system() when you said exec()?)\n");
+                        CopLINE_set(PL_curcop, oldline);
+                    }
+                }
+            }
+            break;
 
-    case OP_GV:
-	if ((o->op_private & OPpEARLY_CV) && ckWARN(WARN_PROTOTYPE)) {
-	    GV * const gv = cGVOPo_gv;
-	    if (SvTYPE(gv) == SVt_PVGV && GvCV(gv) && SvPVX_const(GvCV(gv))) {
-		/* XXX could check prototype here instead of just carping */
-		SV * const sv = sv_newmortal();
-		gv_efullname3(sv, gv, NULL);
-		Perl_warner(aTHX_ packWARN(WARN_PROTOTYPE),
-		    "%"SVf"() called too early to check prototype",
-		    SVfARG(sv));
-	    }
-	}
-	break;
+        case OP_GV:
+            if ((o->op_private & OPpEARLY_CV) && ckWARN(WARN_PROTOTYPE)) {
+                GV * const gv = cGVOPo_gv;
+                if (SvTYPE(gv) == SVt_PVGV && GvCV(gv) && SvPVX_const(GvCV(gv))) {
+                    /* XXX could check prototype here instead of just carping */
+                    SV * const sv = sv_newmortal();
+                    gv_efullname3(sv, gv, NULL);
+                    Perl_warner(aTHX_ packWARN(WARN_PROTOTYPE),
+                        "%"SVf"() called too early to check prototype",
+                        SVfARG(sv));
+                }
+            }
+            break;
 
-    case OP_CONST:
-	if (cSVOPo->op_private & OPpCONST_STRICT)
-	    no_bareword_allowed(o);
-	/* FALLTHROUGH */
+        case OP_CONST:
+            if (cSVOPo->op_private & OPpCONST_STRICT)
+                no_bareword_allowed(o);
+            /* FALLTHROUGH */
 #ifdef USE_ITHREADS
-    case OP_HINTSEVAL:
-        op_relocate_sv(&cSVOPo->op_sv, &o->op_targ);
+        case OP_HINTSEVAL:
+            op_relocate_sv(&cSVOPo->op_sv, &o->op_targ);
 #endif
-        break;
+            break;
 
 #ifdef USE_ITHREADS
-    /* Relocate all the METHOP's SVs to the pad for thread safety. */
-    case OP_METHOD_NAMED:
-        op_relocate_sv(&cMETHOPx(o)->op_u.op_meth_sv, &o->op_targ);
-        break;
+            /* Relocate all the METHOP's SVs to the pad for thread safety. */
+        case OP_METHOD_NAMED:
+            op_relocate_sv(&cMETHOPx(o)->op_u.op_meth_sv, &o->op_targ);
+            break;
 #endif
 
-    case OP_HELEM: {
-	UNOP *rop;
-	SV *lexname;
-	GV **fields;
-	SVOP *key_op;
-	OP *kid;
-	bool check_fields;
+        case OP_HELEM: {
+            UNOP *rop;
+            SV *lexname;
+            GV **fields;
+            SVOP *key_op;
+            OP *kid;
+            bool check_fields;
 
-	if ((key_op = cSVOPx(((BINOP*)o)->op_last))->op_type != OP_CONST)
-	    break;
+            if ((key_op = cSVOPx(((BINOP*)o)->op_last))->op_type != OP_CONST)
+                break;
 
-	rop = (UNOP*)((BINOP*)o)->op_first;
+            rop = (UNOP*)((BINOP*)o)->op_first;
 
-	goto check_keys;
+            goto check_keys;
 
-    case OP_HSLICE:
-	S_scalar_slice_warning(aTHX_ o);
-        /* FALLTHROUGH */
+            case OP_HSLICE:
+                S_scalar_slice_warning(aTHX_ o);
+                /* FALLTHROUGH */
 
-    case OP_KVHSLICE:
-        kid = OP_SIBLING(cLISTOPo->op_first);
-	if (/* I bet there's always a pushmark... */
-	    OP_TYPE_ISNT_AND_WASNT_NN(kid, OP_LIST)
-	    && OP_TYPE_ISNT_NN(kid, OP_CONST))
-        {
-	    break;
-        }
+        case OP_KVHSLICE:
+            kid = OP_SIBLING(cLISTOPo->op_first);
+            if (/* I bet there's always a pushmark... */
+                OP_TYPE_ISNT_AND_WASNT_NN(kid, OP_LIST)
+                && OP_TYPE_ISNT_NN(kid, OP_CONST))
+            {
+                break;
+            }
 
-	key_op = (SVOP*)(kid->op_type == OP_CONST
-				? kid
-				: OP_SIBLING(kLISTOP->op_first));
+            key_op = (SVOP*)(kid->op_type == OP_CONST
+                                ? kid
+                                : OP_SIBLING(kLISTOP->op_first));
 
-	rop = (UNOP*)((LISTOP*)o)->op_last;
+            rop = (UNOP*)((LISTOP*)o)->op_last;
 
-      check_keys:	
-	if (o->op_private & OPpLVAL_INTRO || rop->op_type != OP_RV2HV)
-	    rop = NULL;
-	else if (rop->op_first->op_type == OP_PADSV)
-	    /* @$hash{qw(keys here)} */
-	    rop = (UNOP*)rop->op_first;
-	else {
-	    /* @{$hash}{qw(keys here)} */
-	    if (rop->op_first->op_type == OP_SCOPE
-		&& cLISTOPx(rop->op_first)->op_last->op_type == OP_PADSV)
-		{
-		    rop = (UNOP*)cLISTOPx(rop->op_first)->op_last;
-		}
-	    else
-		rop = NULL;
-	}
-
-        lexname = NULL; /* just to silence compiler warnings */
-        fields  = NULL; /* just to silence compiler warnings */
-
-	check_fields =
-	    rop
-	 && (lexname = *av_fetch(PL_comppad_name, rop->op_targ, TRUE),
-	     SvPAD_TYPED(lexname))
-	 && (fields = (GV**)hv_fetchs(SvSTASH(lexname), "FIELDS", FALSE))
-	 && isGV(*fields) && GvHV(*fields);
-	for (; key_op;
-	     key_op = (SVOP*)OP_SIBLING(key_op)) {
-	    SV **svp, *sv;
-	    if (key_op->op_type != OP_CONST)
-		continue;
-	    svp = cSVOPx_svp(key_op);
-
-	    /* Make the CONST have a shared SV */
-	    if ((!SvIsCOW_shared_hash(sv = *svp))
-	     && SvTYPE(sv) < SVt_PVMG && SvOK(sv) && !SvROK(sv)) {
-		SSize_t keylen;
-		const char * const key = SvPV_const(sv, *(STRLEN*)&keylen);
-		SV *nsv = newSVpvn_share(key,
-					 SvUTF8(sv) ? -keylen : keylen,	0);
-		SvREFCNT_dec_NN(sv);
-		*svp = nsv;
-	    }
-
-	    if (check_fields
-	     && !hv_fetch_ent(GvHV(*fields), *svp, FALSE, 0)) {
-		Perl_croak(aTHX_ "No such class field \"%"SVf"\" " 
-			   "in variable %"SVf" of type %"HEKf, 
-		      SVfARG(*svp), SVfARG(lexname),
-                      HEKfARG(HvNAME_HEK(SvSTASH(lexname))));
-	    }
-	}
-	break;
-    }
-    case OP_ASLICE:
-	S_scalar_slice_warning(aTHX_ o);
-	break;
+          check_keys:
+            if (o->op_private & OPpLVAL_INTRO || rop->op_type != OP_RV2HV)
+                rop = NULL;
+            else if (rop->op_first->op_type == OP_PADSV)
+                /* @$hash{qw(keys here)} */
+                rop = (UNOP*)rop->op_first;
+            else {
+                /* @{$hash}{qw(keys here)} */
+                if (rop->op_first->op_type == OP_SCOPE
+                    && cLISTOPx(rop->op_first)->op_last->op_type == OP_PADSV)
+                {
+                    rop = (UNOP*)cLISTOPx(rop->op_first)->op_last;
+                }
+                else
+                    rop = NULL;
+            }
 
-    case OP_SUBST: {
-	if (cPMOPo->op_pmreplrootu.op_pmreplroot)
-	    finalize_op(cPMOPo->op_pmreplrootu.op_pmreplroot);
-	break;
-    }
-    default:
-	break;
-    }
+            lexname = NULL; /* just to silence compiler warnings */
+            fields  = NULL; /* just to silence compiler warnings */
+
+            check_fields =
+                rop
+             && (lexname = *av_fetch(PL_comppad_name, rop->op_targ, TRUE),
+                 SvPAD_TYPED(lexname))
+             && (fields = (GV**)hv_fetchs(SvSTASH(lexname), "FIELDS", FALSE))
+             && isGV(*fields) && GvHV(*fields);
+            for (; key_op;
+                key_op = (SVOP*)OP_SIBLING(key_op)) {
+                SV **svp, *sv;
+                if (key_op->op_type != OP_CONST)
+                    continue;
+                svp = cSVOPx_svp(key_op);
+
+                /* Make the CONST have a shared SV */
+                if ((!SvIsCOW_shared_hash(sv = *svp))
+                    && SvTYPE(sv) < SVt_PVMG && SvOK(sv) && !SvROK(sv)) {
+                    SSize_t keylen;
+                    const char * const key = SvPV_const(sv, *(STRLEN*)&keylen);
+                    SV *nsv = newSVpvn_share(key,
+                                             SvUTF8(sv) ? -keylen : keylen, 0);
+                    SvREFCNT_dec_NN(sv);
+                    *svp = nsv;
+                }
 
-    if (o->op_flags & OPf_KIDS) {
-	OP *kid;
+                if (check_fields
+                 && !hv_fetch_ent(GvHV(*fields), *svp, FALSE, 0)) {
+                    Perl_croak(aTHX_ "No such class field \"%"SVf"\" "
+                           "in variable %"SVf" of type %"HEKf,
+                          SVfARG(*svp), SVfARG(lexname),
+                          HEKfARG(HvNAME_HEK(SvSTASH(lexname))));
+                }
+            }
+            break;
+        }
+        case OP_ASLICE:
+            S_scalar_slice_warning(aTHX_ o);
+            break;
 
-#ifdef DEBUGGING
-        /* check that op_last points to the last sibling, and that
-         * the last op_sibling field points back to the parent, and
-         * that the only ops with KIDS are those which are entitled to
-         * them */
-        U32 type = o->op_type;
-        U32 family;
-        bool has_last;
-
-        if (type == OP_NULL) {
-            type = o->op_targ;
-            /* ck_glob creates a null UNOP with ex-type GLOB
-             * (which is a list op. So pretend it wasn't a listop */
-            if (type == OP_GLOB)
-                type = OP_NULL;
+        case OP_SUBST: {
+            if (cPMOPo->op_pmreplrootu.op_pmreplroot)
+                finalize_op(cPMOPo->op_pmreplrootu.op_pmreplroot);
+            break;
         }
-        family = PL_opargs[type] & OA_CLASS_MASK;
-
-        has_last = (   family == OA_BINOP
-                    || family == OA_LISTOP
-                    || family == OA_PMOP
-                    || family == OA_LOOP
-                   );
-        assert(  has_last /* has op_first and op_last, or ...
-              ... has (or may have) op_first: */
-              || family == OA_UNOP
-              || family == OA_LOGOP
-              || family == OA_BASEOP_OR_UNOP
-              || family == OA_FILESTATOP
-              || family == OA_LOOPEXOP
-              || family == OA_METHOP
-              /* I don't know why SASSIGN is tagged as OA_BASEOP - DAPM */
-              || type == OP_SASSIGN
-              || type == OP_CUSTOM
-              || type == OP_NULL /* new_logop does this */
-              );
-        /* XXX list form of 'x' is has a null op_last. This is wrong,
-         * but requires too much hacking (e.g. in Deparse) to fix for
-         * now */
-        if (type == OP_REPEAT && (o->op_private & OPpREPEAT_DOLIST)) {
-            assert(has_last);
-            has_last = 0;
+        default:
+            break;
         }
 
-        for (kid = cUNOPo->op_first; kid; kid = OP_SIBLING(kid)) {
-#  ifdef PERL_OP_PARENT
-            if (!OP_HAS_SIBLING(kid)) {
-                if (has_last)
-                    assert(kid == cLISTOPo->op_last);
-                assert(kid->op_sibling == o);
-            }
-#  else
-            if (OP_HAS_SIBLING(kid)) {
-                assert(!kid->op_lastsib);
+        if (o->op_flags & OPf_KIDS) {
+            OP *kid;
+
+#ifdef DEBUGGING
+            /* check that op_last points to the last sibling, and that
+             * the last op_sibling field points back to the parent, and
+             * that the only ops with KIDS are those which are entitled to
+             * them */
+            U32 type = o->op_type;
+            U32 family;
+            bool has_last;
+
+            if (type == OP_NULL) {
+                type = o->op_targ;
+                /* ck_glob creates a null UNOP with ex-type GLOB
+                 * (which is a list op. So pretend it wasn't a listop */
+                if (type == OP_GLOB)
+                    type = OP_NULL;
             }
-            else {
-                assert(kid->op_lastsib);
-                if (has_last)
-                    assert(kid == cLISTOPo->op_last);
+            family = PL_opargs[type] & OA_CLASS_MASK;
+
+            has_last = (   family == OA_BINOP
+                        || family == OA_LISTOP
+                        || family == OA_PMOP
+                        || family == OA_LOOP
+                       );
+            assert(  has_last /* has op_first and op_last, or ...
+                  ... has (or may have) op_first: */
+                  || family == OA_UNOP
+                  || family == OA_LOGOP
+                  || family == OA_BASEOP_OR_UNOP
+                  || family == OA_FILESTATOP
+                  || family == OA_LOOPEXOP
+                  || family == OA_METHOP
+                  /* I don't know why SASSIGN is tagged as OA_BASEOP - DAPM */
+                  || type == OP_SASSIGN
+                  || type == OP_CUSTOM
+                  || type == OP_NULL /* new_logop does this */
+                  );
+            /* XXX list form of 'x' is has a null op_last. This is wrong,
+             * but requires too much hacking (e.g. in Deparse) to fix for
+             * now */
+            if (type == OP_REPEAT && (o->op_private & OPpREPEAT_DOLIST)) {
+                assert(has_last);
+                has_last = 0;
             }
+
+            for (kid = cUNOPo->op_first; kid; kid = OP_SIBLING(kid)) {
+#  ifdef PERL_OP_PARENT
+                if (!OP_HAS_SIBLING(kid)) {
+                    if (has_last)
+                        assert(kid == cLISTOPo->op_last);
+                    assert(kid->op_sibling == o);
+                }
+#  else
+                if (OP_HAS_SIBLING(kid)) {
+                    assert(!kid->op_lastsib);
+                }
+                else {
+                    assert(kid->op_lastsib);
+                    if (has_last)
+                        assert(kid == cLISTOPo->op_last);
+                }
 #  endif
-        }
+            }
 #endif
-        {
-            /* Count then fill from the top to ensure any diagnostics
-               are produced in order from the start of the code.
-            */
-            SSize_t kid_count = 0;
-            OP **fill;
-            for (kid = cUNOPo->op_first; kid; kid = OP_SIBLING(kid))
-                ++kid_count;
-
-            DEFERRED_OP_ALLOC(kid_count, fill);
-
-            for (kid = cUNOPo->op_first; kid; kid = OP_SIBLING(kid))
-                *--fill = kid;
+            {
+                /* Count then fill from the top to ensure any diagnostics
+                   are produced in order from the start of the code.
+                */
+                SSize_t kid_count = 0;
+                OP **fill;
+                for (kid = cUNOPo->op_first; kid; kid = OP_SIBLING(kid))
+                    ++kid_count;
+
+                DEFERRED_OP_ALLOC(kid_count, fill);
+
+                for (kid = cUNOPo->op_first; kid; kid = OP_SIBLING(kid))
+                    *--fill = kid;
+            }
         }
-    }
     } while ( (o = POP_DEFERRED_OP()) );
 
     DEFER_OP_END;
-- 
1.7.10.4

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Nov 17, 2014

From @tonycoz

0003-perl-108276-use-the-new-declare-and-clean-up-macros-.patch
From cf5d0ab47de426134b6c2b1934b698aed98ad650 Mon Sep 17 00:00:00 2001
From: Tony Cook <tony@develop-help.com>
Date: Mon, 17 Nov 2014 17:35:10 +1100
Subject: [perl #108276] use the new declare and clean-up macros for the old
 uses

---
 op.c |   12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/op.c b/op.c
index 45e9c16..ea97abf 100644
--- a/op.c
+++ b/op.c
@@ -732,9 +732,7 @@ Perl_op_free(pTHX_ OP *o)
 {
     dVAR;
     OPCODE type;
-    SSize_t defer_ix = -1;
-    SSize_t defer_stack_alloc = 0;
-    OP **defer_stack = NULL;
+    DEFER_OP_DECLARE;
 
     do {
 
@@ -821,7 +819,7 @@ Perl_op_free(pTHX_ OP *o)
 #endif
     } while ( (o = POP_DEFERRED_OP()) );
 
-    Safefree(defer_stack);
+    DEFER_OP_END;
 }
 
 void
@@ -1649,9 +1647,7 @@ Perl_scalarvoid(pTHX_ OP *arg)
     OP *kid;
     SV* sv;
     U8 want;
-    SSize_t defer_stack_alloc = 0;
-    SSize_t defer_ix = -1;
-    OP **defer_stack = NULL;
+    DEFER_OP_DECLARE;
     OP *o = arg;
 
     PERL_ARGS_ASSERT_SCALARVOID;
@@ -2014,7 +2010,7 @@ Perl_scalarvoid(pTHX_ OP *arg)
         }
     } while ( (o = POP_DEFERRED_OP()) );
 
-    Safefree(defer_stack);
+    DEFER_OP_END;
 
     return arg;
 }
-- 
1.7.10.4

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Nov 17, 2014

From @iabyn

On Sun, Nov 16, 2014 at 10​:42​:19PM -0800, Tony Cook via RT wrote​:

On Mon Jan 16 03​:51​:55 2012, davem wrote​:

On Sun, Jan 15, 2012 at 10​:35​:14AM -0800, bulk 88 wrote​:

The code can be simplified to the following​:

my $n = $ARGV\[0\];
die unless $n =~ /^\\d\+$/;

my $code = 'my $i = 0; if \($i\) \{ print \}' \. "\\n";
$code \.= 'elsif \($i\) \{ print \}' \. "\\n" for 1\.\.$n;
eval $code;

segfaults for me on blead with n >= about 5000.

In blead, it's recursing in S_finalize_op rather than scalarvoid; not sure
whether this is instead of or in addition to a scalarvoid problem.

Here's a patch that fixes the S_finalize_op() recursion, whitespace changes minimal

Note that once PERL_OP_PARENT becomes the default in blead, the recursion
issue in most of the tree-walking functions in op.c will become trivially
fixable (the last op_sibling in each chain points back to the parent, so
a tree can be walked without needing to maintain state.)

--
More than any other time in history, mankind faces a crossroads. One path
leads to despair and utter hopelessness. The other, to total extinction.
Let us pray we have the wisdom to choose correctly.
  -- Woody Allen

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Nov 18, 2014

From @tonycoz

On Mon Nov 17 04​:49​:05 2014, davem wrote​:

Note that once PERL_OP_PARENT becomes the default in blead, the
recursion
issue in most of the tree-walking functions in op.c will become
trivially
fixable (the last op_sibling in each chain points back to the parent,
so
a tree can be walked without needing to maintain state.)

I started an attempt to use that chain, but unfortunately blead as it is now fails an assertion with -DPERL_OP_PARENT​:

tony@​mars​:.../git/perl$ make
./miniperl -Ilib make_ext.pl cpan/Archive-Tar/pm_to_blib MAKE="make" LIBPERL_A=libperl.a
miniperl​: op.c​:2386​: S_finalize_op​: Assertion `kid->op_sibling == o' failed.
6 from cpan/Archive-Tar's Makefile.PL at make_ext.pl line 513.
Warning​: No Makefile!
make[1]​: Entering directory `/home/tony/dev/perl/git/perl/cpan/Archive-Tar'
make[1]​: *** No rule to make target `all'. Stop.
make[1]​: Leaving directory `/home/tony/dev/perl/git/perl/cpan/Archive-Tar'
make[1]​: Entering directory `/home/tony/dev/perl/git/perl/cpan/Archive-Tar'
make[1]​: *** No rule to make target `all'. Stop.
make[1]​: Leaving directory `/home/tony/dev/perl/git/perl/cpan/Archive-Tar'
Unsuccessful make(cpan/Archive-Tar)​: code=512 at make_ext.pl line 564.
make​: *** [cpan/Archive-Tar/pm_to_blib] Error 2

Tony

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Nov 18, 2014

From @tonycoz

On Mon Nov 17 16​:05​:50 2014, tonyc wrote​:

On Mon Nov 17 04​:49​:05 2014, davem wrote​:

Note that once PERL_OP_PARENT becomes the default in blead, the
recursion
issue in most of the tree-walking functions in op.c will become
trivially
fixable (the last op_sibling in each chain points back to the parent,
so
a tree can be walked without needing to maintain state.)

I started an attempt to use that chain, but unfortunately blead as it
is now fails an assertion with -DPERL_OP_PARENT​:

tony@​mars​:.../git/perl$ make
./miniperl -Ilib make_ext.pl cpan/Archive-Tar/pm_to_blib MAKE="make"
LIBPERL_A=libperl.a
miniperl​: op.c​:2386​: S_finalize_op​: Assertion `kid->op_sibling == o'
failed.
6 from cpan/Archive-Tar's Makefile.PL at make_ext.pl line 513.
Warning​: No Makefile!
make[1]​: Entering directory
`/home/tony/dev/perl/git/perl/cpan/Archive-Tar'
make[1]​: *** No rule to make target `all'. Stop.
make[1]​: Leaving directory `/home/tony/dev/perl/git/perl/cpan/Archive-
Tar'
make[1]​: Entering directory
`/home/tony/dev/perl/git/perl/cpan/Archive-Tar'
make[1]​: *** No rule to make target `all'. Stop.
make[1]​: Leaving directory `/home/tony/dev/perl/git/perl/cpan/Archive-
Tar'
Unsuccessful make(cpan/Archive-Tar)​: code=512 at make_ext.pl line 564.
make​: *** [cpan/Archive-Tar/pm_to_blib] Error 2

Build failure* bisected to​:

bad - could not build test-prep
b46e009 is the first bad commit
commit b46e009
Author​: syber <syber@​crazypanda.ru>
Date​: Thu Sep 4 22​:08​:59 2014 +0400

  Make OP_METHOD* to be of new class METHOP
 
  Introduce a new opcode class, METHOP, which will hold class/method related
  info needed at runtime to improve performance of class/object method
  calls, then change OP_METHOD and OP_METHOD_NAMED from being UNOP/SVOP to
  being METHOP.
 
  Note that because OP_METHOD is a UNOP with an op_first, while
  OP_METHOD_NAMED is an SVOP, the first field of the METHOP structure
  is a union holding either op_first or op_sv. This was seen as less messy
  than having to introduce two new op classes.
 
  The new op class's character is '.'
 
  Nothing has changed in functionality and/or performance by this commit.
  It just introduces new structure which will be extended with extra
  fields and used in later commits.
 
  Added METHOP constructors​:
  - newMETHOP() for method ops with dynamic method names.
  The only optype for this op is OP_METHOD.
  - newMETHOP_named() for method ops with constant method names.
  Optypes for this op are​: OP_METHOD_NAMED (currently) and (later)
  OP_METHOD_SUPER, OP_METHOD_REDIR, OP_METHOD_NEXT, OP_METHOD_NEXTCAN,
  OP_METHOD_MAYBENEXT
 
  (This commit includes fixups by davem)

I'll look at trying to fix this, unless someone beats me to it (out for a bit now)

Tony

* this is simply the first build failure found with -DPERL_OP_PARENT, there may be other op-tree bugs.

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Nov 18, 2014

From @tonycoz

On Mon Nov 17 17​:01​:17 2014, tonyc wrote​:

Build failure* bisected to​:

bad - could not build test-prep
b46e009 is the first bad commit
commit b46e009
Author​: syber <syber@​crazypanda.ru>
Date​: Thu Sep 4 22​:08​:59 2014 +0400

Turns out there were two problems, an earlier commit 2872f91 didn't add a needed parent link.

Patch attached, I'll apply it tomorrow if no-one points out a problem with it.

Tony

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Nov 18, 2014

From @tonycoz

0001-fix-PERL_OP_PARENT-builds.patch
From 22f53d964f94d524ba285bcd7e9a110d97e67821 Mon Sep 17 00:00:00 2001
From: Tony Cook <tony@develop-help.com>
Date: Tue, 18 Nov 2014 17:11:58 +1100
Subject: [PATCH] fix PERL_OP_PARENT builds

This was broken in two commits:

- b46e009d9 - introduced newMETHOP(), which didn't add the parent link
 as newUNOP() was doing

- 2872f9187 - updated ck_sort() to handle lexical subs named as a
  bareword parameter to sort, but didn't update the parent link in the
  new PADCV op created.
---
 op.c |    8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/op.c b/op.c
index 00c1255..728b927 100644
--- a/op.c
+++ b/op.c
@@ -4657,6 +4657,11 @@ S_newMETHOP_internal(pTHX_ I32 type, I32 flags, OP* dynamic_meth, SV* const_meth
         methop->op_flags = (U8)(flags | OPf_KIDS);
         methop->op_u.op_first = dynamic_meth;
         methop->op_private = (U8)(1 | (flags >> 8));
+
+#ifdef PERL_OP_PARENT
+        if (!OP_HAS_SIBLING(dynamic_meth))
+            dynamic_meth->op_sibling = (OP*)methop;
+#endif
     }
     else {
         assert(const_meth);
@@ -10649,6 +10654,9 @@ Perl_ck_sort(pTHX_ OP *o)
 		    OP * const padop = newOP(OP_PADCV, 0);
 		    padop->op_targ = off;
 		    cUNOPx(firstkid)->op_first = padop;
+#ifdef PERL_OP_PARENT
+                    padop->op_sibling = firstkid;
+#endif
 		    op_free(kid);
 		}
 	    }
-- 
1.7.10.4

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Nov 18, 2014

From @iabyn

On Mon, Nov 17, 2014 at 10​:15​:08PM -0800, Tony Cook via RT wrote​:

Patch attached, I'll apply it tomorrow if no-one points out a problem with it.

Looks good to me, thanks.

--
Dave's first rule of Opera​:
If something needs saying, say it​: don't warble it.

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Nov 19, 2014

From @tonycoz

On Tue Nov 18 02​:54​:42 2014, davem wrote​:

On Mon, Nov 17, 2014 at 10​:15​:08PM -0800, Tony Cook via RT wrote​:

Patch attached, I'll apply it tomorrow if no-one points out a problem
with it.

Looks good to me, thanks.

Applied as 754cffb.

Tony

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Nov 19, 2014

From @tonycoz

On Mon Nov 17 04​:49​:05 2014, davem wrote​:

Note that once PERL_OP_PARENT becomes the default in blead, the
recursion
issue in most of the tree-walking functions in op.c will become
trivially
fixable (the last op_sibling in each chain points back to the parent,
so
a tree can be walked without needing to maintain state.)

Something like the attached?

Applies on top of the other S_finalize_op() change.

Tony

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Nov 19, 2014

From @tonycoz

0001-perl-108276-use-the-PERL_OP_PARENT-links-in-S_finali.patch
From 9f55fceda22a4ca097bc0a715f58a4dbb8a3aeae Mon Sep 17 00:00:00 2001
From: Tony Cook <tony@develop-help.com>
Date: Wed, 19 Nov 2014 14:18:17 +1100
Subject: [perl #108276] use the PERL_OP_PARENT links in S_finalize_op() if
 possible

---
 embed.fnc |    3 +++
 embed.h   |    3 +++
 op.c      |   63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 proto.h   |    8 ++++++++
 4 files changed, 75 insertions(+), 2 deletions(-)

diff --git a/embed.fnc b/embed.fnc
index 77ceca8..67da32a 100644
--- a/embed.fnc
+++ b/embed.fnc
@@ -910,6 +910,9 @@ poX	|OP*	|op_lvalue_flags|NULLOK OP* o|I32 type|U32 flags
 p	|void	|finalize_optree		|NN OP* o
 #if defined(PERL_IN_OP_C)
 s	|void	|finalize_op	|NN OP* o
+#    ifdef PERL_OP_PARENT
+s	|OP*	|traverse_op_tree|NN OP* top|NN OP* o
+#    endif
 s	|void	|move_proto_attr|NN OP **proto|NN OP **attrs|NN const GV *name
 #endif
 : Used in op.c and pp_sys.c
diff --git a/embed.h b/embed.h
index 7fddb5d..b8acf8b 100644
--- a/embed.h
+++ b/embed.h
@@ -1539,6 +1539,9 @@
 #define simplify_sort(a)	S_simplify_sort(aTHX_ a)
 #define too_few_arguments_pv(a,b,c)	S_too_few_arguments_pv(aTHX_ a,b,c)
 #define too_many_arguments_pv(a,b,c)	S_too_many_arguments_pv(aTHX_ a,b,c)
+#    if defined(PERL_OP_PARENT)
+#define traverse_op_tree(a,b)	S_traverse_op_tree(aTHX_ a,b)
+#    endif
 #    if defined(USE_ITHREADS)
 #define op_relocate_sv(a,b)	S_op_relocate_sv(aTHX_ a,b)
 #    endif
diff --git a/op.c b/op.c
index eee542a..6c2482e 100644
--- a/op.c
+++ b/op.c
@@ -2197,15 +2197,64 @@ S_op_relocate_sv(pTHX_ SV** svp, PADOFFSET* targp)
 }
 #endif
 
+#ifdef PERL_OP_PARENT
+
+/*
+=for apidoc s|OP*|traverse_op_tree|OP* top|OP* o
+
+Return the next op in a depth-first traversal of the op tree,
+returning NULL when the traversal is complete.
+
+The initial call must supply the root of the tree as both top and o.
+
+This is only available under -DPERL_OP_PARENT.
+
+For now it's static, but it may be exposed to the API in the future.
+
+=cut
+*/
+
+STATIC OP*
+S_traverse_op_tree(OP *top, OP *o) {
+    OP *sib;
+
+    PERL_ARGS_ASSERT_TRAVERSE_OP_TREE;
+
+    if ((o->op_flags & OPf_KIDS) && cUNOPo->op_first) {
+        return cUNOPo->op_first;
+    }
+    else if ((sib = OP_SIBLING(o))) {
+        return sib;
+    }
+    else {
+        OP *parent = o->op_sibling;
+        while (parent && parent != top) {
+            OP *sib = OP_SIBLING(parent);
+            if (sib)
+                return sib;
+            parent = parent->op_sibling;
+        }
+
+        return NULL;
+    }
+}
+
+#endif
 
 STATIC void
 S_finalize_op(pTHX_ OP* o)
 {
+#ifdef PERL_OP_PARENT
+    OP *top = o;
+#else
     DEFER_OP_DECLARE;
+#endif
 
     PERL_ARGS_ASSERT_FINALIZE_OP;
-
+    /*op_dump(o);*/
+    /*PerlIO_printf(PerlIO_stderr(), "entering loop\n");*/
     do {
+        /*PerlIO_printf(PerlIO_stderr(), "op %p (%s) first %p sib %p lastsib %d\n", o, PL_op_name[o->op_type], cUNOPo->op_first, o->op_sibling, o->op_lastsib);*/
         switch (o->op_type) {
         case OP_NEXTSTATE:
         case OP_DBSTATE:
@@ -2430,6 +2479,7 @@ S_finalize_op(pTHX_ OP* o)
 #  endif
             }
 #endif
+#ifndef PERL_OP_PARENT
             {
                 /* Count then fill from the top to ensure any diagnostics
                    are produced in order from the start of the code.
@@ -2444,10 +2494,19 @@ S_finalize_op(pTHX_ OP* o)
                 for (kid = cUNOPo->op_first; kid; kid = OP_SIBLING(kid))
                     *--fill = kid;
             }
+#endif
         }
-    } while ( (o = POP_DEFERRED_OP()) );
+    } while (
+#ifdef PERL_OP_PARENT
+             (o = S_traverse_op_tree(top, o))
+#else
+             (o = POP_DEFERRED_OP())
+#endif
+             );
 
+#ifndef PERL_OP_PARENT
     DEFER_OP_END;
+#endif
 }
 
 /*
diff --git a/proto.h b/proto.h
index 656d6b4..d985cee 100644
--- a/proto.h
+++ b/proto.h
@@ -6366,6 +6366,14 @@ STATIC OP*	S_too_many_arguments_pv(pTHX_ OP *o, const char* name, U32 flags)
 #define PERL_ARGS_ASSERT_TOO_MANY_ARGUMENTS_PV	\
 	assert(o); assert(name)
 
+#  if defined(PERL_OP_PARENT)
+STATIC OP*	S_traverse_op_tree(pTHX_ OP* top, OP* o)
+			__attribute__nonnull__(pTHX_1)
+			__attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_TRAVERSE_OP_TREE	\
+	assert(top); assert(o)
+
+#  endif
 #  if defined(USE_ITHREADS)
 PERL_STATIC_INLINE void	S_op_relocate_sv(pTHX_ SV** svp, PADOFFSET* targp)
 			__attribute__nonnull__(pTHX_1)
-- 
1.7.10.4

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Nov 19, 2014

From @cpansprout

On Tue Nov 18 19​:19​:28 2014, tonyc wrote​:

On Mon Nov 17 04​:49​:05 2014, davem wrote​:

Note that once PERL_OP_PARENT becomes the default in blead, the
recursion
issue in most of the tree-walking functions in op.c will become
trivially
fixable (the last op_sibling in each chain points back to the parent,
so
a tree can be walked without needing to maintain state.)

Something like the attached?

Applies on top of the other S_finalize_op() change.

Would it be possible to make it even simpler to use?

  OP *o = whatever;
  OP *kid;

  FOR_EACH_OP_DESCENDENT(o, kid) {

  if (blah blah blah) goto finished;

  }
finished​:
  END_FOR_EACH_OP_DESCENDENT;

--

Father Chrysostomos

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Nov 20, 2014

From @tonycoz

On Tue Nov 18 21​:56​:19 2014, sprout wrote​:

On Tue Nov 18 19​:19​:28 2014, tonyc wrote​:

On Mon Nov 17 04​:49​:05 2014, davem wrote​:

Note that once PERL_OP_PARENT becomes the default in blead, the
recursion
issue in most of the tree-walking functions in op.c will become
trivially
fixable (the last op_sibling in each chain points back to the parent,
so
a tree can be walked without needing to maintain state.)

Something like the attached?

Applies on top of the other S_finalize_op() change.

Would it be possible to make it even simpler to use?

OP *o = whatever;
OP *kid;

FOR_EACH_OP_DESCENDENT(o, kid) {

if \(blah blah blah\) goto finished;

}
finished​:
END_FOR_EACH_OP_DESCENDENT;

I'm not sure it's practical. It wouldn't be as simple as you've illustrated.

It would be tricky to use with Perl_scalarvoid(), since it doesn't scalarvoid(o) every node in the tree, and would need a mechanism to skip a subtree.

op_free() has a similar issue, since it skips already freed child ops and their sub-trees. It's also special in that it needs to store the link to the next node before processing the current node.

op_finalize() is special compared to the others too, for op_free() and scalarvoid() it doesn't matter much which direction we iterate over children, but it does for finalize_op(), and it pays a small performance cost with the DEFER_OP() mechanism. A general mechanism would pass that cost onto op_free() and scalarvoid().

Tony

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 30, 2019

From @tonycoz

On Tue, 18 Nov 2014 19​:19​:28 -0800, tonyc wrote​:

Something like the attached?

Applies on top of the other S_finalize_op() change.

A new set of patches​:

- standalone finalize_op() fix, which requires PERL_OP_PARENT

- DEFER_OP() fix for optimize_op()

The final commit might not be needed.

Tony

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 30, 2019

From @tonycoz

op-recursion.patch
From f003f14c35078fdf95a51ec8b7bd2d85fc92ded0 Mon Sep 17 00:00:00 2001
From: Tony Cook <tony@develop-help.com>
Date: Tue, 29 Jan 2019 13:57:51 +1100
Subject: (perl #108276) eliminate recursion from finalize_op()

whitespace in next commit
---
 embed.fnc |  1 +
 embed.h   |  1 +
 op.c      | 48 +++++++++++++++++++++++++++++++++++++++++++-----
 proto.h   |  3 +++
 4 files changed, 48 insertions(+), 5 deletions(-)

diff --git a/embed.fnc b/embed.fnc
index bdb29f7216..d311ca7f51 100644
--- a/embed.fnc
+++ b/embed.fnc
@@ -563,6 +563,7 @@ i	|OP*	|newMETHOP_internal	|I32 type|I32 flags|NULLOK OP* dynamic_meth \
 					|NULLOK SV* const_meth
 : FIXME
 s	|OP*	|fold_constants	|NN OP * const o
+s	|OP*	|traverse_op_tree|NN OP* top|NN OP* o
 #endif
 Afpd	|char*	|form		|NN const char* pat|...
 Ap	|char*	|vform		|NN const char* pat|NULLOK va_list* args
diff --git a/embed.h b/embed.h
index a94583870a..f3b95eadbd 100644
--- a/embed.h
+++ b/embed.h
@@ -1886,6 +1886,7 @@
 #define simplify_sort(a)	S_simplify_sort(aTHX_ a)
 #define too_few_arguments_pv(a,b,c)	S_too_few_arguments_pv(aTHX_ a,b,c)
 #define too_many_arguments_pv(a,b,c)	S_too_many_arguments_pv(aTHX_ a,b,c)
+#define traverse_op_tree(a,b)	S_traverse_op_tree(aTHX_ a,b)
 #    if defined(USE_ITHREADS)
 #define op_relocate_sv(a,b)	S_op_relocate_sv(aTHX_ a,b)
 #    endif
diff --git a/op.c b/op.c
index d966848055..41067e7ff4 100644
--- a/op.c
+++ b/op.c
@@ -3537,12 +3537,52 @@ S_op_relocate_sv(pTHX_ SV** svp, PADOFFSET* targp)
 }
 #endif
 
+/*
+=for apidoc s|OP*|traverse_op_tree|OP* top|OP* o
+
+Return the next op in a depth-first traversal of the op tree,
+returning NULL when the traversal is complete.
+
+The initial call must supply the root of the tree as both top and o.
+
+For now it's static, but it may be exposed to the API in the future.
+
+=cut
+*/
+
+STATIC OP*
+S_traverse_op_tree(OP *top, OP *o) {
+    OP *sib;
+
+    PERL_ARGS_ASSERT_TRAVERSE_OP_TREE;
+
+    if ((o->op_flags & OPf_KIDS) && cUNOPo->op_first) {
+        return cUNOPo->op_first;
+    }
+    else if ((sib = OpSIBLING(o))) {
+        return sib;
+    }
+    else {
+        OP *parent = o->op_sibparent;
+        assert(!(o->op_moresib));
+        while (parent && parent != top) {
+            OP *sib = OpSIBLING(parent);
+            if (sib)
+                return sib;
+            parent = parent->op_sibparent;
+        }
+
+        return NULL;
+    }
+}
 
 STATIC void
 S_finalize_op(pTHX_ OP* o)
 {
+    OP * const top = o;
     PERL_ARGS_ASSERT_FINALIZE_OP;
 
+    do {
     assert(o->op_type != OP_FREED);
 
     switch (o->op_type) {
@@ -3659,10 +3699,10 @@ S_finalize_op(pTHX_ OP* o)
 	break;
     }
 
+#ifdef DEBUGGING
     if (o->op_flags & OPf_KIDS) {
 	OP *kid;
 
-#ifdef DEBUGGING
         /* check that op_last points to the last sibling, and that
          * the last op_sibling/op_sibparent field points back to the
          * parent, and that the only ops with KIDS are those which are
@@ -3705,11 +3745,9 @@ S_finalize_op(pTHX_ OP* o)
                 assert(kid->op_sibparent == o);
             }
         }
-#endif
-
-	for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid))
-	    finalize_op(kid);
     }
+#endif
+    } while (( o = traverse_op_tree(top, o)) != NULL);
 }
 
 /*
diff --git a/proto.h b/proto.h
index 36a61db05d..daf338707b 100644
--- a/proto.h
+++ b/proto.h
@@ -5115,6 +5115,9 @@ STATIC OP*	S_too_few_arguments_pv(pTHX_ OP *o, const char* name, U32 flags)
 STATIC OP*	S_too_many_arguments_pv(pTHX_ OP *o, const char* name, U32 flags);
 #define PERL_ARGS_ASSERT_TOO_MANY_ARGUMENTS_PV	\
 	assert(o); assert(name)
+STATIC OP*	S_traverse_op_tree(pTHX_ OP* top, OP* o);
+#define PERL_ARGS_ASSERT_TRAVERSE_OP_TREE	\
+	assert(top); assert(o)
 #  if defined(USE_ITHREADS)
 #ifndef PERL_NO_INLINE_FUNCTIONS
 PERL_STATIC_INLINE void	S_op_relocate_sv(pTHX_ SV** svp, PADOFFSET* targp);
-- 
2.11.0


From 6bf66a2cd50fc888294f11b2c4c9a69dc8113c31 Mon Sep 17 00:00:00 2001
From: Tony Cook <tony@develop-help.com>
Date: Tue, 29 Jan 2019 14:22:02 +1100
Subject: (perl #108276) indent body of new finalize_op() loop

---
 op.c | 260 +++++++++++++++++++++++++++++++++----------------------------------
 1 file changed, 130 insertions(+), 130 deletions(-)

diff --git a/op.c b/op.c
index 41067e7ff4..befedb7c3c 100644
--- a/op.c
+++ b/op.c
@@ -3583,20 +3583,20 @@ S_finalize_op(pTHX_ OP* o)
     PERL_ARGS_ASSERT_FINALIZE_OP;
 
     do {
-    assert(o->op_type != OP_FREED);
+        assert(o->op_type != OP_FREED);
 
-    switch (o->op_type) {
-    case OP_NEXTSTATE:
-    case OP_DBSTATE:
-	PL_curcop = ((COP*)o);		/* for warnings */
-	break;
-    case OP_EXEC:
-        if (OpHAS_SIBLING(o)) {
-            OP *sib = OpSIBLING(o);
-            if ((  sib->op_type == OP_NEXTSTATE || sib->op_type == OP_DBSTATE)
-                && ckWARN(WARN_EXEC)
-                && OpHAS_SIBLING(sib))
-            {
+        switch (o->op_type) {
+        case OP_NEXTSTATE:
+        case OP_DBSTATE:
+            PL_curcop = ((COP*)o);		/* for warnings */
+            break;
+        case OP_EXEC:
+            if (OpHAS_SIBLING(o)) {
+                OP *sib = OpSIBLING(o);
+                if ((  sib->op_type == OP_NEXTSTATE || sib->op_type == OP_DBSTATE)
+                    && ckWARN(WARN_EXEC)
+                    && OpHAS_SIBLING(sib))
+                {
 		    const OPCODE type = OpSIBLING(sib)->op_type;
 		    if (type != OP_EXIT && type != OP_WARN && type != OP_DIE) {
 			const line_t oldline = CopLINE(PL_curcop);
@@ -3607,145 +3607,145 @@ S_finalize_op(pTHX_ OP* o)
 			    "\t(Maybe you meant system() when you said exec()?)\n");
 			CopLINE_set(PL_curcop, oldline);
 		    }
-	    }
-        }
-	break;
+                }
+            }
+            break;
 
-    case OP_GV:
-	if ((o->op_private & OPpEARLY_CV) && ckWARN(WARN_PROTOTYPE)) {
-	    GV * const gv = cGVOPo_gv;
-	    if (SvTYPE(gv) == SVt_PVGV && GvCV(gv) && SvPVX_const(GvCV(gv))) {
-		/* XXX could check prototype here instead of just carping */
-		SV * const sv = sv_newmortal();
-		gv_efullname3(sv, gv, NULL);
-		Perl_warner(aTHX_ packWARN(WARN_PROTOTYPE),
-		    "%" SVf "() called too early to check prototype",
-		    SVfARG(sv));
-	    }
-	}
-	break;
+        case OP_GV:
+            if ((o->op_private & OPpEARLY_CV) && ckWARN(WARN_PROTOTYPE)) {
+                GV * const gv = cGVOPo_gv;
+                if (SvTYPE(gv) == SVt_PVGV && GvCV(gv) && SvPVX_const(GvCV(gv))) {
+                    /* XXX could check prototype here instead of just carping */
+                    SV * const sv = sv_newmortal();
+                    gv_efullname3(sv, gv, NULL);
+                    Perl_warner(aTHX_ packWARN(WARN_PROTOTYPE),
+                                "%" SVf "() called too early to check prototype",
+                                SVfARG(sv));
+                }
+            }
+            break;
 
-    case OP_CONST:
-	if (cSVOPo->op_private & OPpCONST_STRICT)
-	    no_bareword_allowed(o);
+        case OP_CONST:
+            if (cSVOPo->op_private & OPpCONST_STRICT)
+                no_bareword_allowed(o);
 #ifdef USE_ITHREADS
-        /* FALLTHROUGH */
-    case OP_HINTSEVAL:
-        op_relocate_sv(&cSVOPo->op_sv, &o->op_targ);
+            /* FALLTHROUGH */
+        case OP_HINTSEVAL:
+            op_relocate_sv(&cSVOPo->op_sv, &o->op_targ);
 #endif
-        break;
+            break;
 
 #ifdef USE_ITHREADS
-    /* Relocate all the METHOP's SVs to the pad for thread safety. */
-    case OP_METHOD_NAMED:
-    case OP_METHOD_SUPER:
-    case OP_METHOD_REDIR:
-    case OP_METHOD_REDIR_SUPER:
-        op_relocate_sv(&cMETHOPx(o)->op_u.op_meth_sv, &o->op_targ);
-        break;
+            /* Relocate all the METHOP's SVs to the pad for thread safety. */
+        case OP_METHOD_NAMED:
+        case OP_METHOD_SUPER:
+        case OP_METHOD_REDIR:
+        case OP_METHOD_REDIR_SUPER:
+            op_relocate_sv(&cMETHOPx(o)->op_u.op_meth_sv, &o->op_targ);
+            break;
 #endif
 
-    case OP_HELEM: {
-	UNOP *rop;
-	SVOP *key_op;
-	OP *kid;
+        case OP_HELEM: {
+            UNOP *rop;
+            SVOP *key_op;
+            OP *kid;
 
-	if ((key_op = cSVOPx(((BINOP*)o)->op_last))->op_type != OP_CONST)
-	    break;
+            if ((key_op = cSVOPx(((BINOP*)o)->op_last))->op_type != OP_CONST)
+                break;
 
-	rop = (UNOP*)((BINOP*)o)->op_first;
+            rop = (UNOP*)((BINOP*)o)->op_first;
 
-	goto check_keys;
+            goto check_keys;
 
-    case OP_HSLICE:
-	S_scalar_slice_warning(aTHX_ o);
-        /* FALLTHROUGH */
+            case OP_HSLICE:
+                S_scalar_slice_warning(aTHX_ o);
+                /* FALLTHROUGH */
 
-    case OP_KVHSLICE:
-        kid = OpSIBLING(cLISTOPo->op_first);
-	if (/* I bet there's always a pushmark... */
-	    OP_TYPE_ISNT_AND_WASNT_NN(kid, OP_LIST)
-	    && OP_TYPE_ISNT_NN(kid, OP_CONST))
-        {
-	    break;
-        }
+            case OP_KVHSLICE:
+                kid = OpSIBLING(cLISTOPo->op_first);
+	    if (/* I bet there's always a pushmark... */
+	        OP_TYPE_ISNT_AND_WASNT_NN(kid, OP_LIST)
+	        && OP_TYPE_ISNT_NN(kid, OP_CONST))
+            {
+	        break;
+            }
 
-	key_op = (SVOP*)(kid->op_type == OP_CONST
-				? kid
-				: OpSIBLING(kLISTOP->op_first));
+            key_op = (SVOP*)(kid->op_type == OP_CONST
+                             ? kid
+                             : OpSIBLING(kLISTOP->op_first));
 
-	rop = (UNOP*)((LISTOP*)o)->op_last;
+            rop = (UNOP*)((LISTOP*)o)->op_last;
 
-      check_keys:	
-        if (o->op_private & OPpLVAL_INTRO || rop->op_type != OP_RV2HV)
-            rop = NULL;
-        S_check_hash_fields_and_hekify(aTHX_ rop, key_op);
-	break;
-    }
-    case OP_NULL:
-	if (o->op_targ != OP_HSLICE && o->op_targ != OP_ASLICE)
-	    break;
-	/* FALLTHROUGH */
-    case OP_ASLICE:
-	S_scalar_slice_warning(aTHX_ o);
-	break;
+        check_keys:
+            if (o->op_private & OPpLVAL_INTRO || rop->op_type != OP_RV2HV)
+                rop = NULL;
+            S_check_hash_fields_and_hekify(aTHX_ rop, key_op);
+            break;
+        }
+        case OP_NULL:
+            if (o->op_targ != OP_HSLICE && o->op_targ != OP_ASLICE)
+                break;
+            /* FALLTHROUGH */
+        case OP_ASLICE:
+            S_scalar_slice_warning(aTHX_ o);
+            break;
 
-    case OP_SUBST: {
-	if (cPMOPo->op_pmreplrootu.op_pmreplroot)
-	    finalize_op(cPMOPo->op_pmreplrootu.op_pmreplroot);
-	break;
-    }
-    default:
-	break;
-    }
+        case OP_SUBST: {
+            if (cPMOPo->op_pmreplrootu.op_pmreplroot)
+                finalize_op(cPMOPo->op_pmreplrootu.op_pmreplroot);
+            break;
+        }
+        default:
+            break;
+        }
 
 #ifdef DEBUGGING
-    if (o->op_flags & OPf_KIDS) {
-	OP *kid;
+        if (o->op_flags & OPf_KIDS) {
+            OP *kid;
 
-        /* check that op_last points to the last sibling, and that
-         * the last op_sibling/op_sibparent field points back to the
-         * parent, and that the only ops with KIDS are those which are
-         * entitled to them */
-        U32 type = o->op_type;
-        U32 family;
-        bool has_last;
-
-        if (type == OP_NULL) {
-            type = o->op_targ;
-            /* ck_glob creates a null UNOP with ex-type GLOB
-             * (which is a list op. So pretend it wasn't a listop */
-            if (type == OP_GLOB)
-                type = OP_NULL;
-        }
-        family = PL_opargs[type] & OA_CLASS_MASK;
-
-        has_last = (   family == OA_BINOP
-                    || family == OA_LISTOP
-                    || family == OA_PMOP
-                    || family == OA_LOOP
-                   );
-        assert(  has_last /* has op_first and op_last, or ...
-              ... has (or may have) op_first: */
-              || family == OA_UNOP
-              || family == OA_UNOP_AUX
-              || family == OA_LOGOP
-              || family == OA_BASEOP_OR_UNOP
-              || family == OA_FILESTATOP
-              || family == OA_LOOPEXOP
-              || family == OA_METHOP
-              || type == OP_CUSTOM
-              || type == OP_NULL /* new_logop does this */
-              );
-
-        for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid)) {
-            if (!OpHAS_SIBLING(kid)) {
-                if (has_last)
-                    assert(kid == cLISTOPo->op_last);
-                assert(kid->op_sibparent == o);
+            /* check that op_last points to the last sibling, and that
+             * the last op_sibling/op_sibparent field points back to the
+             * parent, and that the only ops with KIDS are those which are
+             * entitled to them */
+            U32 type = o->op_type;
+            U32 family;
+            bool has_last;
+
+            if (type == OP_NULL) {
+                type = o->op_targ;
+                /* ck_glob creates a null UNOP with ex-type GLOB
+                 * (which is a list op. So pretend it wasn't a listop */
+                if (type == OP_GLOB)
+                    type = OP_NULL;
+            }
+            family = PL_opargs[type] & OA_CLASS_MASK;
+
+            has_last = (   family == OA_BINOP
+                        || family == OA_LISTOP
+                        || family == OA_PMOP
+                        || family == OA_LOOP
+                       );
+            assert(  has_last /* has op_first and op_last, or ...
+                  ... has (or may have) op_first: */
+                  || family == OA_UNOP
+                  || family == OA_UNOP_AUX
+                  || family == OA_LOGOP
+                  || family == OA_BASEOP_OR_UNOP
+                  || family == OA_FILESTATOP
+                  || family == OA_LOOPEXOP
+                  || family == OA_METHOP
+                  || type == OP_CUSTOM
+                  || type == OP_NULL /* new_logop does this */
+                  );
+
+            for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid)) {
+                if (!OpHAS_SIBLING(kid)) {
+                    if (has_last)
+                        assert(kid == cLISTOPo->op_last);
+                    assert(kid->op_sibparent == o);
+                }
             }
         }
-    }
 #endif
     } while (( o = traverse_op_tree(top, o)) != NULL);
 }
-- 
2.11.0


From c13919ff3cfb99b5660bd0e20021c92cffb594cd Mon Sep 17 00:00:00 2001
From: Tony Cook <tony@develop-help.com>
Date: Tue, 29 Jan 2019 15:03:43 +1100
Subject: (perl #108276) add wrappers for deferred op processing

To avoid duplication of the declarations.
---
 op.c | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/op.c b/op.c
index befedb7c3c..8ed48b293b 100644
--- a/op.c
+++ b/op.c
@@ -175,6 +175,11 @@ static const char array_passed_to_stat[] = "Array passed to stat will be coerced
    op_free()
 */
 
+#define dDEFER_OP  \
+    SSize_t defer_stack_alloc = 0; \
+    SSize_t defer_ix = -1; \
+    OP **defer_stack = NULL;
+#define DEFER_OP_CLEANUP Safefree(defer_stack)
 #define DEFERRED_OP_STEP 100
 #define DEFER_OP(o) \
   STMT_START { \
@@ -770,9 +775,7 @@ Perl_op_free(pTHX_ OP *o)
 {
     dVAR;
     OPCODE type;
-    SSize_t defer_ix = -1;
-    SSize_t defer_stack_alloc = 0;
-    OP **defer_stack = NULL;
+    dDEFER_OP;
 
     do {
 
@@ -870,7 +873,7 @@ Perl_op_free(pTHX_ OP *o)
             PL_op = NULL;
     } while ( (o = POP_DEFERRED_OP()) );
 
-    Safefree(defer_stack);
+    DEFER_OP_CLEANUP;
 }
 
 /* S_op_clear_gv(): free a GV attached to an OP */
@@ -1892,10 +1895,8 @@ Perl_scalarvoid(pTHX_ OP *arg)
     dVAR;
     OP *kid;
     SV* sv;
-    SSize_t defer_stack_alloc = 0;
-    SSize_t defer_ix = -1;
-    OP **defer_stack = NULL;
     OP *o = arg;
+    dDEFER_OP;
 
     PERL_ARGS_ASSERT_SCALARVOID;
 
@@ -2256,7 +2257,7 @@ Perl_scalarvoid(pTHX_ OP *arg)
         }
     } while ( (o = POP_DEFERRED_OP()) );
 
-    Safefree(defer_stack);
+    DEFER_OP_CLEANUP;
 
     return arg;
 }
-- 
2.11.0


From 1a0de2e84c170d316c95b4323525eac85bef5802 Mon Sep 17 00:00:00 2001
From: Tony Cook <tony@develop-help.com>
Date: Tue, 29 Jan 2019 16:29:04 +1100
Subject: (perl #108276) remove recursion from optimize_op()

The prevented code like:

  ./miniperl -e 'my $line = "\$cond ? \$a : \n"; my $code = ($line x 100000) . "\$b;\n"; eval $code;'

from crashing due to stack overflow.

It does however take a long time to compile.

Because it doesn't strictly recurse through the op tree (due
to OP_SUBST), I couldn't use traverse_op_tree().

I considered wrapping a traverse_op_tree() loop inside a defer op
loop, so OP_SUBST would defer its op, but processing order is
somewhat important from setting PL_curcop.

This also processes the child ops in reverse order, I'm not sure if
that's a real problem (no tests failed), but the next commit fixes
that order.
---
 op.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/op.c b/op.c
index 8ed48b293b..0db0128500 100644
--- a/op.c
+++ b/op.c
@@ -3459,9 +3459,10 @@ Perl_optimize_optree(pTHX_ OP* o)
 STATIC void
 S_optimize_op(pTHX_ OP* o)
 {
-    OP *kid;
+    dDEFER_OP;
 
     PERL_ARGS_ASSERT_OPTIMIZE_OP;
+    do {
     assert(o->op_type != OP_FREED);
 
     switch (o->op_type) {
@@ -3480,18 +3481,21 @@ S_optimize_op(pTHX_ OP* o)
 
     case OP_SUBST:
 	if (cPMOPo->op_pmreplrootu.op_pmreplroot)
-	    optimize_op(cPMOPo->op_pmreplrootu.op_pmreplroot);
+	    DEFER_OP(cPMOPo->op_pmreplrootu.op_pmreplroot);
 	break;
 
     default:
 	break;
     }
 
-    if (!(o->op_flags & OPf_KIDS))
-        return;
+    if (o->op_flags & OPf_KIDS) {
+        OP *kid;
+        for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid))
+            DEFER_OP(kid);
+    }
+    } while ( ( o = POP_DEFERRED_OP() ) );
 
-    for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid))
-        optimize_op(kid);
+    DEFER_OP_CLEANUP;
 }
 
 
-- 
2.11.0


From e95b861e282cb218336589bb74790651183e1d88 Mon Sep 17 00:00:00 2001
From: Tony Cook <tony@develop-help.com>
Date: Wed, 30 Jan 2019 11:06:52 +1100
Subject: (perl #108276) indent optimize_op() loop body

---
 op.c | 48 ++++++++++++++++++++++++------------------------
 1 file changed, 24 insertions(+), 24 deletions(-)

diff --git a/op.c b/op.c
index 0db0128500..35414bef16 100644
--- a/op.c
+++ b/op.c
@@ -3463,36 +3463,36 @@ S_optimize_op(pTHX_ OP* o)
 
     PERL_ARGS_ASSERT_OPTIMIZE_OP;
     do {
-    assert(o->op_type != OP_FREED);
+        assert(o->op_type != OP_FREED);
 
-    switch (o->op_type) {
-    case OP_NEXTSTATE:
-    case OP_DBSTATE:
-	PL_curcop = ((COP*)o);		/* for warnings */
-	break;
+        switch (o->op_type) {
+        case OP_NEXTSTATE:
+        case OP_DBSTATE:
+            PL_curcop = ((COP*)o);		/* for warnings */
+            break;
 
 
-    case OP_CONCAT:
-    case OP_SASSIGN:
-    case OP_STRINGIFY:
-    case OP_SPRINTF:
-        S_maybe_multiconcat(aTHX_ o);
-        break;
+        case OP_CONCAT:
+        case OP_SASSIGN:
+        case OP_STRINGIFY:
+        case OP_SPRINTF:
+            S_maybe_multiconcat(aTHX_ o);
+            break;
 
-    case OP_SUBST:
-	if (cPMOPo->op_pmreplrootu.op_pmreplroot)
-	    DEFER_OP(cPMOPo->op_pmreplrootu.op_pmreplroot);
-	break;
+        case OP_SUBST:
+            if (cPMOPo->op_pmreplrootu.op_pmreplroot)
+                DEFER_OP(cPMOPo->op_pmreplrootu.op_pmreplroot);
+            break;
 
-    default:
-	break;
-    }
+        default:
+            break;
+        }
 
-    if (o->op_flags & OPf_KIDS) {
-        OP *kid;
-        for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid))
-            DEFER_OP(kid);
-    }
+        if (o->op_flags & OPf_KIDS) {
+            OP *kid;
+            for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid))
+                DEFER_OP(kid);
+        }
     } while ( ( o = POP_DEFERRED_OP() ) );
 
     DEFER_OP_CLEANUP;
-- 
2.11.0


From 4a1bb46bb07cba6823f9a55c5cb343f26b7d55f2 Mon Sep 17 00:00:00 2001
From: Tony Cook <tony@develop-help.com>
Date: Tue, 29 Jan 2019 16:29:38 +1100
Subject: (perl #108276) optimize child ops in sibling order

---
 op.c | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/op.c b/op.c
index 35414bef16..8a61b8b616 100644
--- a/op.c
+++ b/op.c
@@ -190,6 +190,22 @@ static const char array_passed_to_stat[] = "Array passed to stat will be coerced
     } \
     defer_stack[++defer_ix] = o; \
   } STMT_END
+#define DEFER_REVERSE(count)                            \
+    STMT_START {                                        \
+        UV cnt = (count);                               \
+        if (cnt > 1) {                                  \
+            OP **top = defer_stack + defer_ix;          \
+            /* top - (cnt) + 1 isn't safe here */       \
+            OP **bottom = top - (cnt - 1);              \
+            OP *tmp;                                    \
+            assert(bottom >= defer_stack);              \
+            while (top > bottom) {                      \
+                tmp = *top;                             \
+                *top-- = *bottom;                       \
+                *bottom++ = tmp;                        \
+            }                                           \
+        }                                               \
+    } STMT_END;
 
 #define POP_DEFERRED_OP() (defer_ix >= 0 ? defer_stack[defer_ix--] : (OP *)NULL)
 
@@ -3490,8 +3506,12 @@ S_optimize_op(pTHX_ OP* o)
 
         if (o->op_flags & OPf_KIDS) {
             OP *kid;
-            for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid))
+            IV child_count = 0;
+            for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid)) {
                 DEFER_OP(kid);
+                ++child_count;
+            }
+            DEFER_REVERSE(child_count);
         }
     } while ( ( o = POP_DEFERRED_OP() ) );
 
-- 
2.11.0

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Jan 30, 2019

From @iabyn

On Tue, Jan 29, 2019 at 04​:47​:14PM -0800, Tony Cook via RT wrote​:

On Tue, 18 Nov 2014 19​:19​:28 -0800, tonyc wrote​:

Something like the attached?

Applies on top of the other S_finalize_op() change.

A new set of patches​:

- standalone finalize_op() fix, which requires PERL_OP_PARENT

- DEFER_OP() fix for optimize_op()

They look plausible

The final commit might not be needed.

Dunno.

--
Dave's first rule of Opera​:
If something needs saying, say it​: don't warble it.

@p5pRT

This comment has been minimized.

Copy link
Collaborator Author

@p5pRT p5pRT commented Feb 4, 2019

From @tonycoz

On Tue, 29 Jan 2019 16​:47​:14 -0800, tonyc wrote​:

On Tue, 18 Nov 2014 19​:19​:28 -0800, tonyc wrote​:

Something like the attached?

Applies on top of the other S_finalize_op() change.

A new set of patches​:

- standalone finalize_op() fix, which requires PERL_OP_PARENT

- DEFER_OP() fix for optimize_op()

The final commit might not be needed.

Applied as 7f8280c through ee367d4.

Tony

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
1 participant
You can’t perform that action at this time.