+
+for ([ 'get', '$c', 'sassign' ], [ 'len', '@c', 'padav' ]) {
+ my ($key, $var, $exp) = @$_;
+
+ for my $op_info (VMG_OP_INFO_NAME, VMG_OP_INFO_OBJECT, 3) {
+ my ($c, @c);
+
+ # We must test for the $op correctness inside the callback because, if we
+ # bring it out, it will go outside of the eval STRING scope, and what it
+ # points to will no longer exist.
+ eval {
+ $wiz = wizard $key => sub {
+ my $op = $_[-1];
+ my $desc = "$key magic with op_info == $op_info";
+ if ($op_info == 1) {
+ is $op, $exp, "$desc gets the right op info";
+ } elsif ($op_info == 2) {
+ isa_ok $op, 'B::OP', $desc;
+ is $op->name, $exp, "$desc gets the right op info";
+ } else {
+ is $op, undef, "$desc gets the right op info";
+ }
+ ()
+ }, op_info => $op_info
+ };
+ is $@, '', "$key wizard with op_info == $op_info doesn't croak";
+
+ eval "cast $var, \$wiz";
+ is $@, '', "$key cast with op_info == $op_info doesn't croak";
+
+ eval "my \$x = $var";
+ is $@, '', "$key magic with op_info == $op_info doesn't croak";
+
+ eval "dispell $var, \$wiz";
+ is $@, '', "$key dispell with op_info == $op_info doesn't croak";
+ }
+}