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