Nicholas Clark
2012-09-04 10:36:00 UTC
In perl.git, the branch blead has been updated
<http://perl5.git.perl.org/perl.git/commitdiff/b4503eb21cec03c71afa02337811838b7d5e4e8e?hp=2d1c5561244ffb488f4901ad84c08f3fc6443be9>
- Log -----------------------------------------------------------------
commit b4503eb21cec03c71afa02337811838b7d5e4e8e
Merge: 2d1c556 f3e2910
Author: Nicholas Clark <***@ccl4.org>
Date: Tue Sep 4 12:07:35 2012 +0200
Merge improvements to -DPERL_DEBUG_READONLY_OPS into blead.
All tests pass with -Dusethreads -DPERL_DEBUG_READONLY_OPS (on this system)
commit f3e2910579399afd7e086e660f40c5b6793d30a8
Author: Nicholas Clark <***@ccl4.org>
Date: Tue Sep 4 11:54:06 2012 +0200
In Perl_cv_forget_slab(), simplify the conditionally compiled code.
This refactoring reduces the line count and makes it clear that the basic
logic is the same with or without -DPERL_DEBUG_READONLY_OPS. It make no
change to the generated assembler on a normal build.
M pad.c
commit 7bbbc3c08a8830fe5d44ce7a6056cfba6fb67c22
Author: Nicholas Clark <***@ccl4.org>
Date: Mon Sep 3 16:47:15 2012 +0200
Perl_magic_setdbline() should clear and set read-only OP slabs.
The debugger implements breakpoints by setting/clearing OPf_SPECIAL on
OP_DBSTATE ops. This means that it is writing to the optree at runtime,
and it falls foul of the enforced read-only OP slabs when debugging with
-DPERL_DEBUG_READONLY_OPS
Avoid this by removing static from Slab_to_rw(), and using it and Slab_to_ro()
in Perl_magic_setdbline() to temporarily make the slab re-write whilst
changing the breakpoint flag.
With this all tests pass with -DPERL_DEBUG_READONLY_OPS (on this system)
M embed.fnc
M embed.h
M mg.c
M op.c
M proto.h
commit 83519873101c5088b6e33e85da400d6f575c0ceb
Author: Nicholas Clark <***@ccl4.org>
Date: Tue Aug 14 14:24:34 2012 +0200
In op.c, change S_Slab_to_rw() from an OP * parameter to an OPSLAB *.
This makes it consistent with Perl_Slab_to_ro(), which takes an OPSLAB *.
M embed.fnc
M op.c
M proto.h
commit 372eab0142c6ca32a90d09218d73cf03c96f35b3
Author: Nicholas Clark <***@ccl4.org>
Date: Tue Aug 14 14:10:30 2012 +0200
With -DPERL_DEBUG_READONLY_OPS, changing a slab refcnt shouldn't make it r/w.
Perl_op_refcnt_inc() and Perl_op_refcnt_dec() now both take care to leave the
slab in the same state as they found it. Previously both would
unconditionally make the slab read-write.
M op.c
commit a5bd31f4dc3fec64e60f1412a4eeac30d6f6b96b
Author: Nicholas Clark <***@ccl4.org>
Date: Wed Aug 8 12:37:48 2012 +0200
Under -DPERL_DEBUG_READONLY_OPS don't work around glibc 2.2.5 _moddi3 bugs.
The work around involves a runtime check and substituting OP pointers based
on the result. The substitution fails if the optree is mapped read-only.
M pp.c
-----------------------------------------------------------------------
Summary of changes:
embed.fnc | 4 +---
embed.h | 6 +-----
mg.c | 6 ++++++
op.c | 36 ++++++++++++++++++++++++------------
pad.c | 16 +++++-----------
pp.c | 4 ++--
proto.h | 12 +++++-------
7 files changed, 44 insertions(+), 40 deletions(-)
diff --git a/embed.fnc b/embed.fnc
index f547316..ab2cdec 100644
--- a/embed.fnc
+++ b/embed.fnc
@@ -1797,14 +1797,12 @@ Xp |void |Slab_Free |NN void *op
#if defined(PERL_DEBUG_READONLY_OPS)
# if defined(PERL_CORE)
px |void |Slab_to_ro |NN OPSLAB *slab
+px |void |Slab_to_rw |NN OPSLAB *const slab
# endif
: Used in OpREFCNT_inc() in sv.c
poxM |OP * |op_refcnt_inc |NULLOK OP *o
: FIXME - can be static.
poxM |PADOFFSET |op_refcnt_dec |NN OP *o
-# if defined(PERL_IN_OP_C)
-s |void |Slab_to_rw |NN void *op
-# endif
#endif
#if defined(PERL_IN_PERL_C)
diff --git a/embed.h b/embed.h
index ecce321..45291f0 100644
--- a/embed.h
+++ b/embed.h
@@ -1319,6 +1319,7 @@
#define opslab_free_nopad(a) Perl_opslab_free_nopad(aTHX_ a)
# if defined(PERL_DEBUG_READONLY_OPS)
#define Slab_to_ro(a) Perl_Slab_to_ro(aTHX_ a)
+#define Slab_to_rw(a) Perl_Slab_to_rw(aTHX_ a)
# endif
# endif
# if defined(PERL_CR_FILTER)
@@ -1327,11 +1328,6 @@
#define strip_return(a) S_strip_return(aTHX_ a)
# endif
# endif
-# if defined(PERL_DEBUG_READONLY_OPS)
-# if defined(PERL_IN_OP_C)
-#define Slab_to_rw(a) S_Slab_to_rw(aTHX_ a)
-# endif
-# endif
# if defined(PERL_IN_AV_C)
#define get_aux_mg(a) S_get_aux_mg(aTHX_ a)
# endif
diff --git a/mg.c b/mg.c
index 3dea5c2..1f6d062 100644
--- a/mg.c
+++ b/mg.c
@@ -2020,11 +2020,17 @@ Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
if (svp && SvIOKp(*svp)) {
OP * const o = INT2PTR(OP*,SvIVX(*svp));
if (o) {
+#ifdef PERL_DEBUG_READONLY_OPS
+ Slab_to_rw(OpSLAB(o));
+#endif
/* set or clear breakpoint in the relevant control op */
if (i)
o->op_flags |= OPf_SPECIAL;
else
o->op_flags &= ~OPf_SPECIAL;
+#ifdef PERL_DEBUG_READONLY_OPS
+ Slab_to_ro(OpSLAB(o));
+#endif
}
}
return 0;
diff --git a/op.c b/op.c
index 7305ab5..9ad4499 100644
--- a/op.c
+++ b/op.c
@@ -261,18 +261,13 @@ Perl_Slab_to_ro(pTHX_ OPSLAB *slab)
}
}
-STATIC void
-S_Slab_to_rw(pTHX_ void *op)
+void
+Perl_Slab_to_rw(pTHX_ OPSLAB *const slab)
{
- OP * const o = (OP *)op;
- OPSLAB *slab;
OPSLAB *slab2;
PERL_ARGS_ASSERT_SLAB_TO_RW;
- if (!o->op_slabbed) return;
-
- slab = OpSLAB(o);
if (!slab->opslab_readonly) return;
slab2 = slab;
for (; slab2; slab2 = slab2->opslab_next) {
@@ -406,8 +401,14 @@ OP *
Perl_op_refcnt_inc(pTHX_ OP *o)
{
if(o) {
- Slab_to_rw(o);
- ++o->op_targ;
+ OPSLAB *const slab = o->op_slabbed ? OpSLAB(o) : NULL;
+ if (slab && slab->opslab_readonly) {
+ Slab_to_rw(slab);
+ ++o->op_targ;
+ Slab_to_ro(slab);
+ } else {
+ ++o->op_targ;
+ }
}
return o;
@@ -416,9 +417,19 @@ Perl_op_refcnt_inc(pTHX_ OP *o)
PADOFFSET
Perl_op_refcnt_dec(pTHX_ OP *o)
{
+ PADOFFSET result;
+ OPSLAB *const slab = o->op_slabbed ? OpSLAB(o) : NULL;
+
PERL_ARGS_ASSERT_OP_REFCNT_DEC;
- Slab_to_rw(o);
- return --o->op_targ;
+
+ if (slab && slab->opslab_readonly) {
+ Slab_to_rw(slab);
+ result = --o->op_targ;
+ Slab_to_ro(slab);
+ } else {
+ result = --o->op_targ;
+ }
+ return result;
}
#endif
/*
@@ -698,7 +709,8 @@ Perl_op_free(pTHX_ OP *o)
if (type == OP_NULL)
type = (OPCODE)o->op_targ;
- Slab_to_rw(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() */
diff --git a/pad.c b/pad.c
index 148fdf8..aba463b 100644
--- a/pad.c
+++ b/pad.c
@@ -505,9 +505,7 @@ void
Perl_cv_forget_slab(pTHX_ CV *cv)
{
const bool slabbed = !!CvSLABBED(cv);
-#ifdef PERL_DEBUG_READONLY_OPS
OPSLAB *slab = NULL;
-#endif
PERL_ARGS_ASSERT_CV_FORGET_SLAB;
@@ -515,25 +513,21 @@ Perl_cv_forget_slab(pTHX_ CV *cv)
CvSLABBED_off(cv);
-#ifdef PERL_DEBUG_READONLY_OPS
if (CvROOT(cv)) slab = OpSLAB(CvROOT(cv));
else if (CvSTART(cv)) slab = (OPSLAB *)CvSTART(cv);
-#else
- if (CvROOT(cv)) OpslabREFCNT_dec(OpSLAB(CvROOT(cv)));
- else if (CvSTART(cv)) OpslabREFCNT_dec((OPSLAB *)CvSTART(cv));
-#endif
#ifdef DEBUGGING
else if (slabbed) Perl_warn(aTHX_ "Slab leaked from cv %p", cv);
#endif
-#ifdef PERL_DEBUG_READONLY_OPS
if (slab) {
- size_t refcnt;
- refcnt = slab->opslab_refcnt;
+#ifdef PERL_DEBUG_READONLY_OPS
+ const size_t refcnt = slab->opslab_refcnt;
+#endif
OpslabREFCNT_dec(slab);
+#ifdef PERL_DEBUG_READONLY_OPS
if (refcnt > 1) Slab_to_ro(slab);
- }
#endif
+ }
}
/*
diff --git a/pp.c b/pp.c
index 05a9edf..29db8ed 100644
--- a/pp.c
+++ b/pp.c
@@ -2364,7 +2364,7 @@ PP(pp_i_divide)
}
}
-#if defined(__GLIBC__) && IVSIZE == 8
+#if defined(__GLIBC__) && IVSIZE == 8 && !defined(PERL_DEBUG_READONLY_OPS)
STATIC
PP(pp_i_modulo_0)
#else
@@ -2387,7 +2387,7 @@ PP(pp_i_modulo)
}
}
-#if defined(__GLIBC__) && IVSIZE == 8
+#if defined(__GLIBC__) && IVSIZE == 8 && !defined(PERL_DEBUG_READONLY_OPS)
STATIC
PP(pp_i_modulo_1)
diff --git a/proto.h b/proto.h
index 7670835..f97fe1f 100644
--- a/proto.h
+++ b/proto.h
@@ -5304,6 +5304,11 @@ PERL_CALLCONV void Perl_Slab_to_ro(pTHX_ OPSLAB *slab)
#define PERL_ARGS_ASSERT_SLAB_TO_RO \
assert(slab)
+PERL_CALLCONV void Perl_Slab_to_rw(pTHX_ OPSLAB *const slab)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SLAB_TO_RW \
+ assert(slab)
+
# endif
#endif
#if defined(PERL_CR_FILTER)
@@ -5323,13 +5328,6 @@ PERL_CALLCONV PADOFFSET Perl_op_refcnt_dec(pTHX_ OP *o)
assert(o)
PERL_CALLCONV OP * Perl_op_refcnt_inc(pTHX_ OP *o);
-# if defined(PERL_IN_OP_C)
-STATIC void S_Slab_to_rw(pTHX_ void *op)
- __attribute__nonnull__(pTHX_1);
-#define PERL_ARGS_ASSERT_SLAB_TO_RW \
- assert(op)
-
-# endif
#endif
#if defined(PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION)
/* PERL_CALLCONV bool Perl_do_exec(pTHX_ const char* cmd)
--
Perl5 Master Repository
<http://perl5.git.perl.org/perl.git/commitdiff/b4503eb21cec03c71afa02337811838b7d5e4e8e?hp=2d1c5561244ffb488f4901ad84c08f3fc6443be9>
- Log -----------------------------------------------------------------
commit b4503eb21cec03c71afa02337811838b7d5e4e8e
Merge: 2d1c556 f3e2910
Author: Nicholas Clark <***@ccl4.org>
Date: Tue Sep 4 12:07:35 2012 +0200
Merge improvements to -DPERL_DEBUG_READONLY_OPS into blead.
All tests pass with -Dusethreads -DPERL_DEBUG_READONLY_OPS (on this system)
commit f3e2910579399afd7e086e660f40c5b6793d30a8
Author: Nicholas Clark <***@ccl4.org>
Date: Tue Sep 4 11:54:06 2012 +0200
In Perl_cv_forget_slab(), simplify the conditionally compiled code.
This refactoring reduces the line count and makes it clear that the basic
logic is the same with or without -DPERL_DEBUG_READONLY_OPS. It make no
change to the generated assembler on a normal build.
M pad.c
commit 7bbbc3c08a8830fe5d44ce7a6056cfba6fb67c22
Author: Nicholas Clark <***@ccl4.org>
Date: Mon Sep 3 16:47:15 2012 +0200
Perl_magic_setdbline() should clear and set read-only OP slabs.
The debugger implements breakpoints by setting/clearing OPf_SPECIAL on
OP_DBSTATE ops. This means that it is writing to the optree at runtime,
and it falls foul of the enforced read-only OP slabs when debugging with
-DPERL_DEBUG_READONLY_OPS
Avoid this by removing static from Slab_to_rw(), and using it and Slab_to_ro()
in Perl_magic_setdbline() to temporarily make the slab re-write whilst
changing the breakpoint flag.
With this all tests pass with -DPERL_DEBUG_READONLY_OPS (on this system)
M embed.fnc
M embed.h
M mg.c
M op.c
M proto.h
commit 83519873101c5088b6e33e85da400d6f575c0ceb
Author: Nicholas Clark <***@ccl4.org>
Date: Tue Aug 14 14:24:34 2012 +0200
In op.c, change S_Slab_to_rw() from an OP * parameter to an OPSLAB *.
This makes it consistent with Perl_Slab_to_ro(), which takes an OPSLAB *.
M embed.fnc
M op.c
M proto.h
commit 372eab0142c6ca32a90d09218d73cf03c96f35b3
Author: Nicholas Clark <***@ccl4.org>
Date: Tue Aug 14 14:10:30 2012 +0200
With -DPERL_DEBUG_READONLY_OPS, changing a slab refcnt shouldn't make it r/w.
Perl_op_refcnt_inc() and Perl_op_refcnt_dec() now both take care to leave the
slab in the same state as they found it. Previously both would
unconditionally make the slab read-write.
M op.c
commit a5bd31f4dc3fec64e60f1412a4eeac30d6f6b96b
Author: Nicholas Clark <***@ccl4.org>
Date: Wed Aug 8 12:37:48 2012 +0200
Under -DPERL_DEBUG_READONLY_OPS don't work around glibc 2.2.5 _moddi3 bugs.
The work around involves a runtime check and substituting OP pointers based
on the result. The substitution fails if the optree is mapped read-only.
M pp.c
-----------------------------------------------------------------------
Summary of changes:
embed.fnc | 4 +---
embed.h | 6 +-----
mg.c | 6 ++++++
op.c | 36 ++++++++++++++++++++++++------------
pad.c | 16 +++++-----------
pp.c | 4 ++--
proto.h | 12 +++++-------
7 files changed, 44 insertions(+), 40 deletions(-)
diff --git a/embed.fnc b/embed.fnc
index f547316..ab2cdec 100644
--- a/embed.fnc
+++ b/embed.fnc
@@ -1797,14 +1797,12 @@ Xp |void |Slab_Free |NN void *op
#if defined(PERL_DEBUG_READONLY_OPS)
# if defined(PERL_CORE)
px |void |Slab_to_ro |NN OPSLAB *slab
+px |void |Slab_to_rw |NN OPSLAB *const slab
# endif
: Used in OpREFCNT_inc() in sv.c
poxM |OP * |op_refcnt_inc |NULLOK OP *o
: FIXME - can be static.
poxM |PADOFFSET |op_refcnt_dec |NN OP *o
-# if defined(PERL_IN_OP_C)
-s |void |Slab_to_rw |NN void *op
-# endif
#endif
#if defined(PERL_IN_PERL_C)
diff --git a/embed.h b/embed.h
index ecce321..45291f0 100644
--- a/embed.h
+++ b/embed.h
@@ -1319,6 +1319,7 @@
#define opslab_free_nopad(a) Perl_opslab_free_nopad(aTHX_ a)
# if defined(PERL_DEBUG_READONLY_OPS)
#define Slab_to_ro(a) Perl_Slab_to_ro(aTHX_ a)
+#define Slab_to_rw(a) Perl_Slab_to_rw(aTHX_ a)
# endif
# endif
# if defined(PERL_CR_FILTER)
@@ -1327,11 +1328,6 @@
#define strip_return(a) S_strip_return(aTHX_ a)
# endif
# endif
-# if defined(PERL_DEBUG_READONLY_OPS)
-# if defined(PERL_IN_OP_C)
-#define Slab_to_rw(a) S_Slab_to_rw(aTHX_ a)
-# endif
-# endif
# if defined(PERL_IN_AV_C)
#define get_aux_mg(a) S_get_aux_mg(aTHX_ a)
# endif
diff --git a/mg.c b/mg.c
index 3dea5c2..1f6d062 100644
--- a/mg.c
+++ b/mg.c
@@ -2020,11 +2020,17 @@ Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
if (svp && SvIOKp(*svp)) {
OP * const o = INT2PTR(OP*,SvIVX(*svp));
if (o) {
+#ifdef PERL_DEBUG_READONLY_OPS
+ Slab_to_rw(OpSLAB(o));
+#endif
/* set or clear breakpoint in the relevant control op */
if (i)
o->op_flags |= OPf_SPECIAL;
else
o->op_flags &= ~OPf_SPECIAL;
+#ifdef PERL_DEBUG_READONLY_OPS
+ Slab_to_ro(OpSLAB(o));
+#endif
}
}
return 0;
diff --git a/op.c b/op.c
index 7305ab5..9ad4499 100644
--- a/op.c
+++ b/op.c
@@ -261,18 +261,13 @@ Perl_Slab_to_ro(pTHX_ OPSLAB *slab)
}
}
-STATIC void
-S_Slab_to_rw(pTHX_ void *op)
+void
+Perl_Slab_to_rw(pTHX_ OPSLAB *const slab)
{
- OP * const o = (OP *)op;
- OPSLAB *slab;
OPSLAB *slab2;
PERL_ARGS_ASSERT_SLAB_TO_RW;
- if (!o->op_slabbed) return;
-
- slab = OpSLAB(o);
if (!slab->opslab_readonly) return;
slab2 = slab;
for (; slab2; slab2 = slab2->opslab_next) {
@@ -406,8 +401,14 @@ OP *
Perl_op_refcnt_inc(pTHX_ OP *o)
{
if(o) {
- Slab_to_rw(o);
- ++o->op_targ;
+ OPSLAB *const slab = o->op_slabbed ? OpSLAB(o) : NULL;
+ if (slab && slab->opslab_readonly) {
+ Slab_to_rw(slab);
+ ++o->op_targ;
+ Slab_to_ro(slab);
+ } else {
+ ++o->op_targ;
+ }
}
return o;
@@ -416,9 +417,19 @@ Perl_op_refcnt_inc(pTHX_ OP *o)
PADOFFSET
Perl_op_refcnt_dec(pTHX_ OP *o)
{
+ PADOFFSET result;
+ OPSLAB *const slab = o->op_slabbed ? OpSLAB(o) : NULL;
+
PERL_ARGS_ASSERT_OP_REFCNT_DEC;
- Slab_to_rw(o);
- return --o->op_targ;
+
+ if (slab && slab->opslab_readonly) {
+ Slab_to_rw(slab);
+ result = --o->op_targ;
+ Slab_to_ro(slab);
+ } else {
+ result = --o->op_targ;
+ }
+ return result;
}
#endif
/*
@@ -698,7 +709,8 @@ Perl_op_free(pTHX_ OP *o)
if (type == OP_NULL)
type = (OPCODE)o->op_targ;
- Slab_to_rw(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() */
diff --git a/pad.c b/pad.c
index 148fdf8..aba463b 100644
--- a/pad.c
+++ b/pad.c
@@ -505,9 +505,7 @@ void
Perl_cv_forget_slab(pTHX_ CV *cv)
{
const bool slabbed = !!CvSLABBED(cv);
-#ifdef PERL_DEBUG_READONLY_OPS
OPSLAB *slab = NULL;
-#endif
PERL_ARGS_ASSERT_CV_FORGET_SLAB;
@@ -515,25 +513,21 @@ Perl_cv_forget_slab(pTHX_ CV *cv)
CvSLABBED_off(cv);
-#ifdef PERL_DEBUG_READONLY_OPS
if (CvROOT(cv)) slab = OpSLAB(CvROOT(cv));
else if (CvSTART(cv)) slab = (OPSLAB *)CvSTART(cv);
-#else
- if (CvROOT(cv)) OpslabREFCNT_dec(OpSLAB(CvROOT(cv)));
- else if (CvSTART(cv)) OpslabREFCNT_dec((OPSLAB *)CvSTART(cv));
-#endif
#ifdef DEBUGGING
else if (slabbed) Perl_warn(aTHX_ "Slab leaked from cv %p", cv);
#endif
-#ifdef PERL_DEBUG_READONLY_OPS
if (slab) {
- size_t refcnt;
- refcnt = slab->opslab_refcnt;
+#ifdef PERL_DEBUG_READONLY_OPS
+ const size_t refcnt = slab->opslab_refcnt;
+#endif
OpslabREFCNT_dec(slab);
+#ifdef PERL_DEBUG_READONLY_OPS
if (refcnt > 1) Slab_to_ro(slab);
- }
#endif
+ }
}
/*
diff --git a/pp.c b/pp.c
index 05a9edf..29db8ed 100644
--- a/pp.c
+++ b/pp.c
@@ -2364,7 +2364,7 @@ PP(pp_i_divide)
}
}
-#if defined(__GLIBC__) && IVSIZE == 8
+#if defined(__GLIBC__) && IVSIZE == 8 && !defined(PERL_DEBUG_READONLY_OPS)
STATIC
PP(pp_i_modulo_0)
#else
@@ -2387,7 +2387,7 @@ PP(pp_i_modulo)
}
}
-#if defined(__GLIBC__) && IVSIZE == 8
+#if defined(__GLIBC__) && IVSIZE == 8 && !defined(PERL_DEBUG_READONLY_OPS)
STATIC
PP(pp_i_modulo_1)
diff --git a/proto.h b/proto.h
index 7670835..f97fe1f 100644
--- a/proto.h
+++ b/proto.h
@@ -5304,6 +5304,11 @@ PERL_CALLCONV void Perl_Slab_to_ro(pTHX_ OPSLAB *slab)
#define PERL_ARGS_ASSERT_SLAB_TO_RO \
assert(slab)
+PERL_CALLCONV void Perl_Slab_to_rw(pTHX_ OPSLAB *const slab)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SLAB_TO_RW \
+ assert(slab)
+
# endif
#endif
#if defined(PERL_CR_FILTER)
@@ -5323,13 +5328,6 @@ PERL_CALLCONV PADOFFSET Perl_op_refcnt_dec(pTHX_ OP *o)
assert(o)
PERL_CALLCONV OP * Perl_op_refcnt_inc(pTHX_ OP *o);
-# if defined(PERL_IN_OP_C)
-STATIC void S_Slab_to_rw(pTHX_ void *op)
- __attribute__nonnull__(pTHX_1);
-#define PERL_ARGS_ASSERT_SLAB_TO_RW \
- assert(op)
-
-# endif
#endif
#if defined(PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION)
/* PERL_CALLCONV bool Perl_do_exec(pTHX_ const char* cmd)
--
Perl5 Master Repository