1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
# -*- mode: perl; -*-
use strict;
use warnings;
# Test 2 levels of upgrade classes. This used to cause a segv.
use Test::More tests => 9;
use Math::BigInt upgrade => 'Math::BigFloat';
use Math::BigFloat upgrade => 'Math::BigMouse';
no warnings 'once';
@Math::BigMouse::ISA = 'Math::BigFloat';
sub Math::BigMouse::bsqrt {};
() = sqrt Math::BigInt->new(2);
pass('sqrt on a big int does not segv if there are 2 upgrade levels');
# Math::BigRat inherits from Math::BigFloat, which inherits from Math::BigInt.
# Typically, methods call the upgrade version if upgrading is defined and the
# argument is an unknown type. This will call infinite recursion for methods
# that are not implemented in the upgrade class.
use Math::BigRat;
Math::BigFloat -> upgrade("Math::BigRat");
Math::BigFloat -> downgrade(undef);
Math::BigRat -> upgrade(undef);
Math::BigRat -> downgrade(undef);
# Input is a scalar.
note 'Math::BigRat -> babs("2");';
() = Math::BigRat -> babs("2");
pass(qq|no 'Deep recursion on subroutine ...'|);
note 'Math::BigRat -> bsgn("2");';
() = Math::BigRat -> bsgn("2");
pass(qq|no 'Deep recursion on subroutine ...'|);
# Input is a Math::BigInt.
note 'Math::BigRat -> babs(Math::BigInt -> new("2"));';
() = Math::BigRat -> babs(Math::BigInt -> new("2"));
pass(qq|no 'Deep recursion on subroutine ...'|);
note 'Math::BigRat -> bsgn(Math::BigInt -> new("2"));';
() = Math::BigRat -> bsgn(Math::BigInt -> new("2"));
pass(qq|no 'Deep recursion on subroutine ...'|);
# Input is a Math::BigFloat.
note 'Math::BigRat -> babs(Math::BigFloat -> new("2"));';
() = Math::BigRat -> babs(Math::BigFloat -> new("2"));
pass(qq|no 'Deep recursion on subroutine ...'|);
note 'Math::BigRat -> bsgn(Math::BigFloat -> new("2"));';
() = Math::BigRat -> bsgn(Math::BigFloat -> new("2"));
pass(qq|no 'Deep recursion on subroutine ...'|);
# Input is a Math::BigRat.
note 'Math::BigRat -> babs(Math::BigRat -> new("2"));';
() = Math::BigRat -> babs(Math::BigRat -> new("2"));
pass(qq|no 'Deep recursion on subroutine ...'|);
note 'Math::BigRat -> bsgn(Math::BigRat -> new("2"));';
() = Math::BigRat -> bsgn(Math::BigRat -> new("2"));
pass(qq|no 'Deep recursion on subroutine ...'|);
|