From 73b6d62558003113da61a5e5926ea67aa47c6ae5 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Wed, 4 Jan 2012 16:40:10 -0600 Subject: don't hang if all packages are hidden --- lib/circular/require.pm | 8 ++++++-- t/hide_middleman3.t | 26 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 t/hide_middleman3.t diff --git a/lib/circular/require.pm b/lib/circular/require.pm index b7f71c2..234be83 100644 --- a/lib/circular/require.pm +++ b/lib/circular/require.pm @@ -62,8 +62,12 @@ sub _require { my $depth = 0; my $caller; - $caller = caller( $depth++ ) - while !$caller || grep { m/^$caller$/ } @hide; + do { + $caller = caller($depth++) + } while defined($caller) && grep { m/^$caller$/ } @hide; + + $caller = '' + unless defined $caller; warn "Circular require detected: $string_file (from $caller)\n"; } diff --git a/t/hide_middleman3.t b/t/hide_middleman3.t new file mode 100644 index 0000000..bbd920f --- /dev/null +++ b/t/hide_middleman3.t @@ -0,0 +1,26 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use lib 't/hide_middleman'; +use Test::More; + +no circular::require -hide => [ + qw(base Foo Bar main circular::require), + (map { my $m = $_; $m =~ s+/+::+g; $m =~ s/\.pm$//; $m } keys %INC), +]; + +my @warnings; + +{ + $SIG{__WARN__} = sub { push @warnings => @_ }; + + use_ok( 'Foo' ); +} + +is_deeply( + \@warnings, + ["Circular require detected: Foo.pm (from )\n"], + "don't loop infinitely if all packages are hidden" +); + +done_testing; -- cgit v1.2.3-54-g00ecf