Skip to content

Commit

Permalink
Add propagation of badflag with .= (Ops::assgn) for sf.net bug 3543056.
Browse files Browse the repository at this point in the history
  • Loading branch information
Tim Haines authored and mohawk2 committed Mar 2, 2015
1 parent 255adcf commit 2193f11
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 4 deletions.
18 changes: 15 additions & 3 deletions Basic/Ops/ops.pd
Expand Up @@ -373,14 +373,26 @@ sub PDL::log10 {
#
pp_def(
'assgn',
# HandleBad => 1,
HandleBad => 1,
Pars => 'a(); [o]b();',
Code =>
'$b() = $a();',
# BadCode =>
# 'if ( $ISBAD(a()) ) { $SETBAD(b()); } else { $b() = $a(); }',
BadCode =>
'if ( $ISBAD(a()) ) { $SETBAD(b()); } else { $b() = $a(); }',
Doc =>
'Plain numerical assignment. This is used to implement the ".=" operator',
BadDoc =>
'If C<a> is a child piddle (e.g., the result of a slice) and bad values are generated in C<b>,
the bad value flag is set in C<b>, but it is B<NOT> automatically propagated back to the parent of C<a>.
The following idiom ensures that the badflag is propagated back to the parent of C<a>:

$pdl->slice(":,(1)") .= PDL::Bad_aware_func();
$pdl->badflag(1);
$pdl->check_badflag();

This is unnecessary if $pdl->badflag is known to be 1 before the slice is performed.

See http://pdl.perl.org/PDLdocs/BadValues.html#dataflow_of_the_badflag for details.'
); # pp_def assgn

#pp_export_nothing();
Expand Down
11 changes: 10 additions & 1 deletion t/ops.t
Expand Up @@ -15,7 +15,7 @@ sub tapprox {
return $d < 0.01;
}

print "1..44\n";
print "1..45\n";

# $a0 = zeroes 3,5;
# $b0 = xvals $a0;
Expand Down Expand Up @@ -156,3 +156,12 @@ $b = $a->qsorti;
$c = $b % 3;
ok(43,all($c->double==pdl("0 1 2 " x 5)));
ok(44,longlong(10)%longlong(5)==0);

# Check badflag propagation with .= (Ops::assgn) sf.net bug 3543056
$a = sequence(10);
$b = sequence(5);
$b->inplace->setvaltobad(3);
$a->slice('0:4') .= $b;
$a->badflag(1);
$a->check_badflag();
ok(45,$a->badflag == 1 && $a->nbad == 1);

0 comments on commit 2193f11

Please sign in to comment.