perl-XML-LibXML / t / 72destruction.t

use strict;
use warnings;
use Test::More;
use Scalar::Util;
use XML::LibXML;

if (defined (&Scalar::Util::weaken))
{
    plan tests => 1;
}
else
{
    plan skip_all => 'Need Scalar::Util::weaken';
}

my $is_destroyed;
BEGIN
{
    no warnings 'once', 'redefine';
    my $old = \&XML::LibXML::Element::DESTROY;
    *XML::LibXML::Element::DESTROY = sub
    {
        $is_destroyed++;
        $old->(@_);
    };
}

# Create element...
my $root = XML::LibXML->load_xml( IO => \*DATA )->documentElement;

# allow %hash to go out of scope quickly.
{
    my %hash = %$root;
    # assignment to ensure block is not optimized away
    $hash{foo} = 'phooey';
}

# Destroy element...
undef($root);

# Touch the fieldhash...
my %other = %{ XML::LibXML->load_xml( string => '<foo/>' )->documentElement };

# TEST
ok($is_destroyed, "does not leak memory");

__DATA__
<root attr1="foo" xmlns:x="http://localhost/" x:attr2="bar" />
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.