diff options
author | Nicholas Clark <nick@ccl4.org> | 2008-02-25 12:48:22 +0000 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2008-02-25 12:48:22 +0000 |
commit | c427f4d2d4575fbc8a5190932fe321136c7597b3 (patch) | |
tree | ba8cce560c51bedf1307426fbc8a73ea64a491f6 | |
parent | 553e7bb0c885d7b666ab73f45e41f7e6dab46330 (diff) | |
download | perl-c427f4d2d4575fbc8a5190932fe321136c7597b3.tar.gz |
Ensure that constant folding runs with IN_PERL_RUNTIME true, by copying
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
-rw-r--r-- | op.c | 9 | ||||
-rw-r--r-- | opcode.h | 2 | ||||
-rwxr-xr-x | opcode.pl | 2 |
3 files changed, 11 insertions, 2 deletions
@@ -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; @@ -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, ¬_compiling, COP); + PL_curcop = ¬_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); @@ -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(); @@ -1667,7 +1667,7 @@ EXTCONST U32 PL_opargs[] = { 0x0022281c, /* vec */ 0x0122291c, /* index */ 0x0122291c, /* rindex */ - 0x0004280d, /* sprintf */ + 0x0004280f, /* sprintf */ 0x00042805, /* formline */ 0x0001379e, /* ord */ 0x0001378e, /* chr */ @@ -773,7 +773,7 @@ vec vec ck_fun ist@ S S S 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? |