summaryrefslogtreecommitdiff
path: root/pp.c
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2010-12-31 16:20:11 +0000
committerNicholas Clark <nick@ccl4.org>2010-12-31 16:32:57 +0000
commit361ed549eb6ef15e68e6bb16e020f11b7a29ebb2 (patch)
treeea897942cd1b865b1a4e9c2338f01b94f775fd93 /pp.c
parent4861580b3001ab81922a8c1f978ed071012baca4 (diff)
downloadperl-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.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/pp.c b/pp.c
index 1f4ef25e2a..85614c2ca7 100644
--- a/pp.c
+++ b/pp.c
@@ -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)