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 13, 2015
1 parent d751ac7 commit 2f47a52
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 4 deletions.
18 changes: 15 additions & 3 deletions Basic/Ops/ops.pd
Expand Up @@ -378,14 +378,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
15 changes: 14 additions & 1 deletion t/ops.t
@@ -1,5 +1,6 @@
use Test::More tests => 53;
use Test::More tests => 54;
use PDL::LiteF;
use PDL::Config;
kill INT,$$ if $ENV{UNDER_DEBUGGER}; # Useful for debugging.

sub tapprox {
Expand Down Expand Up @@ -173,3 +174,15 @@ $USHORT_MAX = 65535;

ok byte($BYTE_MAX)%1 == 0;
ok ushort($USHORT_MAX)%1 == 0;

SKIP: {
skip 'No BADVAL', 1 if !$PDL::Config{WITH_BADVAL};
# 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($a->badflag == 1 && $a->nbad == 1);
}

0 comments on commit 2f47a52

Please sign in to comment.