diff options
author | Nicholas Clark <nick@ccl4.org> | 2010-12-31 16:20:11 +0000 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2010-12-31 16:32:57 +0000 |
commit | 361ed549eb6ef15e68e6bb16e020f11b7a29ebb2 (patch) | |
tree | ea897942cd1b865b1a4e9c2338f01b94f775fd93 /pp.c | |
parent | 4861580b3001ab81922a8c1f978ed071012baca4 (diff) | |
download | perl-361ed549eb6ef15e68e6bb16e020f11b7a29ebb2.tar.gz |
Avoid using OP_NAME() in unimplemented_op(), as it won't give useful strings.
Using OP_NAME() isn't going to be helpful here. Firstly, it doesn't cope
with out of range op numbers - it only "special" cases op_custom. Secondly,
as the three ops we "panic" on are padmy, mapstart and custom, if we get
here for a custom op then that means that the custom op didn't have an
implementation. Given that OP_NAME() looks up the custom op by its pp_addr,
likely it will return NULL, unless someone (unhelpfully) registers
&PL_unimplemented_op as the address of their custom op. NULL doesn't
generate a useful error message. "custom" does. */
Diffstat (limited to 'pp.c')
-rw-r--r-- | pp.c | 14 |
1 files changed, 12 insertions, 2 deletions
@@ -6300,8 +6300,18 @@ PP(pp_lock) PP(unimplemented_op) { dVAR; - DIE(aTHX_ "panic: unimplemented op %s (#%d) called", OP_NAME(PL_op), - PL_op->op_type); + const Optype op_type = PL_op->op_type; + /* Using OP_NAME() isn't going to be helpful here. Firstly, it doesn't cope + with out of range op numbers - it only "special" cases op_custom. + Secondly, as the three ops we "panic" on are padmy, mapstart and custom, + if we get here for a custom op then that means that the custom op didn't + have an implementation. Given that OP_NAME() looks up the custom op + by its pp_addr, likely it will return NULL, unless someone (unhelpfully) + registers &PL_unimplemented_op as the address of their custom op. + NULL doesn't generate a useful error message. "custom" does. */ + const char *const name = op_type >= OP_max + ? "[out of range]" : PL_op_name[PL_op->op_type]; + DIE(aTHX_ "panic: unimplemented op %s (#%d) called", name, op_type); } PP(pp_boolkeys) |