Skip to content
This repository has been archived by the owner on Jan 23, 2022. It is now read-only.

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 Aug 30, 2015
1 parent a46d2e0 commit 41e8c43
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 4 deletions.
18 changes: 15 additions & 3 deletions Basic/Ops/ops.pd
Expand Up @@ -396,14 +396,26 @@ sub PDLA::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
14 changes: 13 additions & 1 deletion t/ops.t
@@ -1,5 +1,6 @@
use Test::More tests => 53;
use Test::More tests => 54;
use PDLA::LiteF;
use PDLA::Config;
use Test::Exception;

use strict;
Expand Down Expand Up @@ -219,4 +220,15 @@ my $USHORT_MAX = 65535;

ok byte($BYTE_MAX)%1 == 0, 'big byte modulus';
ok ushort($USHORT_MAX)%1 == 0, 'big ushort modulus';

SKIP: {
skip 'No BADVAL', 1 if !$PDLA::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, 'badflag propagation with .=');
}

0 comments on commit 41e8c43

Please sign in to comment.