Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit

Permalink
eval_sv: add a G_USEHINTS flag
Browse files Browse the repository at this point in the history
  • Loading branch information
tonycoz committed Aug 24, 2023
1 parent 1ba6836 commit 06129df
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 2 deletions.
1 change: 1 addition & 0 deletions cop.h
Original file line number Diff line number Diff line change
Expand Up @@ -1219,6 +1219,7 @@ struct context {
#define G_RE_REPARSING 0x800 /* compiling a run-time /(?{..})/ */
#define G_METHOD_NAMED 0x1000 /* calling named method, eg without :: or ' */
#define G_RETHROW 0x2000 /* eval_sv(): re-throw any error */
#define G_USEHINTS 0x4000 /* eval_sv(): use current hints/features */

/* flag bits for PL_in_eval */
#define EVAL_NULL 0 /* not in an eval */
Expand Down
2 changes: 1 addition & 1 deletion ext/XS-APItest/Makefile.PL
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ my @names = (qw(HV_DELETE HV_DISABLE_UVAR_XKEY HV_FETCH_ISSTORE
HV_FETCH_ISEXISTS HV_FETCH_LVALUE HV_FETCH_JUST_SV
G_SCALAR G_LIST G_VOID G_DISCARD G_EVAL G_NOARGS
G_KEEPERR G_NODEBUG G_METHOD G_FAKINGEVAL G_RETHROW
GV_NOADD_NOINIT
GV_NOADD_NOINIT G_USEHINTS
SV_GMAGIC SV_SKIP_OVERLOAD
IS_NUMBER_IN_UV IS_NUMBER_GREATER_THAN_UV_MAX
IS_NUMBER_NOT_INT IS_NUMBER_NEG IS_NUMBER_INFINITY
Expand Down
12 changes: 11 additions & 1 deletion ext/XS-APItest/t/call.t
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ use strict;

BEGIN {
require '../../t/test.pl';
plan(538);
plan(540);
use_ok('XS::APItest')
};
use Config;
Expand Down Expand Up @@ -340,6 +340,16 @@ for my $fn_type (qw(eval_pv eval_sv call_sv)) {
}
}

{
use feature "fc";
# the XS eval_sv() returns the count of results
is(eval_sv('fc("A") eq fc("a"); 1', G_LIST), 0,
"don't inherit hints by default (so the eval fails)");
is(eval_sv('fc("A") eq fc("a"); 1', G_LIST | G_USEHINTS), 1,
"inherit hints when requested (so the eval succeeds)")
or diag($@);
}

# DAPM 9-Aug-04. A taint test in eval_sv() could die after setting up
# a new jump level but before pushing an eval context, leading to
# stack corruption
Expand Down
8 changes: 8 additions & 0 deletions perl.c
Original file line number Diff line number Diff line change
Expand Up @@ -3229,7 +3229,12 @@ as C<call_sv>, with the obvious exception of C<G_EVAL>. See L<perlcall>.
The C<G_RETHROW> flag can be used if you only need eval_sv() to
execute code specified by a string, but not catch any errors.
By default the code is compiled and executed with the default hints,
such as strict and features. Set C<G_USEHINTS> in flags to use the
current hints from C<PL_curcop>.
=for apidoc Amnh||G_RETHROW
=for apidoc Amnh||G_USEHINTS
=cut
*/

Expand Down Expand Up @@ -3277,6 +3282,9 @@ Perl_eval_sv(pTHX_ SV *sv, I32 flags)
if (flags & G_RE_REPARSING)
myop.op_private |= (OPpEVAL_COPHH | OPpEVAL_RE_REPARSING);

if (flags & G_USEHINTS)
myop.op_private |= OPpEVAL_COPHH;

/* fail now; otherwise we could fail after the JMPENV_PUSH but
* before a cx_pusheval(), which corrupts the stack after a croak */
TAINT_PROPER("eval_sv()");
Expand Down

0 comments on commit 06129df

Please sign in to comment.