Skip to content

Commit

Permalink
Ensure that constant folding runs with IN_PERL_RUNTIME true, by copying
Browse files Browse the repository at this point in the history
the current compiling cop to a different address. This ensures that
lexical hints are correctly honoured, and allows us to fold sprintf.

p4raw-id: //depot/perl@33369
  • Loading branch information
nwc10 committed Feb 25, 2008
1 parent 553e7bb commit c427f4d
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 2 deletions.
9 changes: 9 additions & 0 deletions op.c
Original file line number Diff line number Diff line change
Expand Up @@ -2428,6 +2428,7 @@ Perl_fold_constants(pTHX_ register OP *o)
OP *old_next;
SV * const oldwarnhook = PL_warnhook;
SV * const olddiehook = PL_diehook;
COP not_compiling;
dJMPENV;

PERL_ARGS_ASSERT_FOLD_CONSTANTS;
Expand Down Expand Up @@ -2492,6 +2493,13 @@ Perl_fold_constants(pTHX_ register OP *o)
oldscope = PL_scopestack_ix;
create_eval_scope(G_FAKINGEVAL);

/* Verify that we don't need to save it: */
assert(PL_curcop == &PL_compiling);
StructCopy(&PL_compiling, &not_compiling, COP);
PL_curcop = &not_compiling;
/* The above ensures that we run with all the correct hints of the
currently compiling COP, but that IN_PERL_RUNTIME is not true. */
assert(IN_PERL_RUNTIME);
PL_warnhook = PERL_WARNHOOK_FATAL;
PL_diehook = NULL;
JMPENV_PUSH(ret);
Expand Down Expand Up @@ -2525,6 +2533,7 @@ Perl_fold_constants(pTHX_ register OP *o)
JMPENV_POP;
PL_warnhook = oldwarnhook;
PL_diehook = olddiehook;
PL_curcop = &PL_compiling;

if (PL_scopestack_ix > oldscope)
delete_eval_scope();
Expand Down
2 changes: 1 addition & 1 deletion opcode.h
Original file line number Diff line number Diff line change
Expand Up @@ -1667,7 +1667,7 @@ EXTCONST U32 PL_opargs[] = {
0x0022281c, /* vec */
0x0122291c, /* index */
0x0122291c, /* rindex */
0x0004280d, /* sprintf */
0x0004280f, /* sprintf */
0x00042805, /* formline */
0x0001379e, /* ord */
0x0001378e, /* chr */
Expand Down
2 changes: 1 addition & 1 deletion opcode.pl
Original file line number Diff line number Diff line change
Expand Up @@ -773,7 +773,7 @@ sub tab {
index index ck_index isT@ S S S?
rindex rindex ck_index isT@ S S S?
sprintf sprintf ck_fun mst@ S L
sprintf sprintf ck_fun fmst@ S L
formline formline ck_fun ms@ S L
ord ord ck_fun ifsTu% S?
chr chr ck_fun fsTu% S?
Expand Down

0 comments on commit c427f4d

Please sign in to comment.