2011-06-02 13:55:22 +00:00
|
|
|
#
|
2015-04-14 08:04:50 +00:00
|
|
|
# spec file for package perl-Devel-FindRef
|
2011-06-02 13:55:22 +00:00
|
|
|
#
|
2024-07-20 21:17:22 +00:00
|
|
|
# Copyright (c) 2024 SUSE LLC
|
2011-06-02 13:55:22 +00:00
|
|
|
#
|
|
|
|
# All modifications and additions to the file contributed by third parties
|
|
|
|
# remain the property of their copyright owners, unless otherwise agreed
|
|
|
|
# upon. The license for this file, and modifications and additions to the
|
|
|
|
# file, is the same license as for the pristine package itself (unless the
|
|
|
|
# license for the pristine package is not an Open Source License, in which
|
|
|
|
# case the license is the MIT License). An "Open Source License" is a
|
|
|
|
# license that conforms to the Open Source Definition (Version 1.9)
|
|
|
|
# published by the Open Source Initiative.
|
|
|
|
|
2024-07-20 21:17:22 +00:00
|
|
|
# Please submit bugfixes or comments via https://bugs.opensuse.org/
|
2011-06-02 13:55:22 +00:00
|
|
|
#
|
|
|
|
|
2015-04-14 08:04:50 +00:00
|
|
|
|
2024-07-20 21:17:22 +00:00
|
|
|
%define cpan_name Devel-FindRef
|
2011-06-02 13:55:22 +00:00
|
|
|
Name: perl-Devel-FindRef
|
2024-07-20 21:17:22 +00:00
|
|
|
Version: 1.460.0
|
2015-04-14 08:04:50 +00:00
|
|
|
Release: 0
|
2024-07-20 21:17:22 +00:00
|
|
|
# 1.46 -> normalize -> 1.460.0
|
|
|
|
%define cpan_version 1.46
|
|
|
|
License: Artistic-1.0 OR GPL-1.0-or-later
|
|
|
|
Summary: Where is that reference to my variable hiding?
|
|
|
|
URL: https://metacpan.org/release/%{cpan_name}
|
|
|
|
Source0: https://cpan.metacpan.org/authors/id/M/ML/MLEHMANN/%{cpan_name}-%{cpan_version}.tar.gz
|
2017-06-25 06:31:53 +00:00
|
|
|
Source1: cpanspec.yml
|
2025-08-12 18:13:28 +02:00
|
|
|
Source100: README.md
|
2011-06-02 13:55:22 +00:00
|
|
|
BuildRequires: perl
|
|
|
|
BuildRequires: perl-macros
|
2017-06-25 06:31:53 +00:00
|
|
|
BuildRequires: perl(Canary::Stability)
|
2024-07-20 21:17:22 +00:00
|
|
|
BuildRequires: perl(ExtUtils::MakeMaker) >= 6.52
|
2017-06-25 06:31:53 +00:00
|
|
|
BuildRequires: perl(Task::Weaken)
|
2011-06-02 13:55:22 +00:00
|
|
|
BuildRequires: perl(common::sense)
|
|
|
|
Requires: perl(common::sense)
|
2024-07-20 21:17:22 +00:00
|
|
|
Provides: perl(Devel::FindRef) = %{version}
|
|
|
|
%undefine __perllib_provides
|
2011-06-02 13:55:22 +00:00
|
|
|
%{perl_requires}
|
|
|
|
|
|
|
|
%description
|
|
|
|
Tracking down reference problems (e.g. you expect some object to be
|
|
|
|
destroyed, but there are still references to it that keep it alive) can be
|
|
|
|
very hard. Fortunately, perl keeps track of all its values, so tracking
|
|
|
|
references "backwards" is usually possible.
|
|
|
|
|
|
|
|
The 'track' function can help track down some of those references back to
|
|
|
|
the variables containing them.
|
|
|
|
|
|
|
|
For example, for this fragment:
|
|
|
|
|
2015-04-14 08:04:50 +00:00
|
|
|
package Test;
|
2011-06-02 13:55:22 +00:00
|
|
|
|
|
|
|
use Devel::FindRef;
|
|
|
|
use Scalar::Util;
|
2024-07-20 21:17:22 +00:00
|
|
|
|
2011-06-02 13:55:22 +00:00
|
|
|
our $var = "hi\n";
|
|
|
|
my $global_my = \$var;
|
|
|
|
our %global_hash = (ukukey => \$var);
|
|
|
|
our $global_hashref = { ukukey2 => \$var };
|
2024-07-20 21:17:22 +00:00
|
|
|
|
2015-04-14 08:04:50 +00:00
|
|
|
sub testsub {
|
2011-06-02 13:55:22 +00:00
|
|
|
my $testsub_local = $global_hashref;
|
|
|
|
print Devel::FindRef::track \$var;
|
2015-04-14 08:04:50 +00:00
|
|
|
}
|
2011-06-02 13:55:22 +00:00
|
|
|
|
|
|
|
my $closure = sub {
|
|
|
|
my $closure_var = \$_[0];
|
|
|
|
Scalar::Util::weaken (my $weak_ref = \$var);
|
|
|
|
testsub;
|
|
|
|
};
|
|
|
|
|
|
|
|
$closure->($var);
|
|
|
|
|
|
|
|
The output is as follows (or similar to this, in case I forget to update
|
|
|
|
the manpage after some changes):
|
|
|
|
|
|
|
|
SCALAR(0x7cc888) [refcount 6] is
|
|
|
|
+- referenced by REF(0x8abcc8) [refcount 1], which is
|
2015-04-14 08:04:50 +00:00
|
|
|
| the lexical '$closure_var' in CODE(0x8abc50) [refcount 4], which is
|
2011-06-02 13:55:22 +00:00
|
|
|
| +- the closure created at tst:18.
|
|
|
|
| +- referenced by REF(0x7d3c58) [refcount 1], which is
|
2015-04-14 08:04:50 +00:00
|
|
|
| | the lexical '$closure' in CODE(0x7ae530) [refcount 2], which is
|
2011-06-02 13:55:22 +00:00
|
|
|
| | +- the containing scope for CODE(0x8ab430) [refcount 3], which is
|
2015-04-14 08:04:50 +00:00
|
|
|
| | | the global &Test::testsub.
|
2011-06-02 13:55:22 +00:00
|
|
|
| | +- the main body of the program.
|
2015-04-14 08:04:50 +00:00
|
|
|
| +- the lexical '&' in CODE(0x7ae530) [refcount 2], which was seen before.
|
2011-06-02 13:55:22 +00:00
|
|
|
+- referenced by REF(0x7cc7c8) [refcount 1], which is
|
2015-04-14 08:04:50 +00:00
|
|
|
| the lexical '$global_my' in CODE(0x7ae530) [refcount 2], which was seen before.
|
|
|
|
+- the global $Test::var.
|
2011-06-02 13:55:22 +00:00
|
|
|
+- referenced by REF(0x7cc558) [refcount 1], which is
|
2015-04-14 08:04:50 +00:00
|
|
|
| the member 'ukukey2' of HASH(0x7ae140) [refcount 2], which is
|
2011-06-02 13:55:22 +00:00
|
|
|
| +- referenced by REF(0x8abad0) [refcount 1], which is
|
2015-04-14 08:04:50 +00:00
|
|
|
| | the lexical '$testsub_local' in CODE(0x8ab430) [refcount 3], which was seen before.
|
2011-06-02 13:55:22 +00:00
|
|
|
| +- referenced by REF(0x8ab4f0) [refcount 1], which is
|
2015-04-14 08:04:50 +00:00
|
|
|
| the global $Test::global_hashref.
|
2011-06-02 13:55:22 +00:00
|
|
|
+- referenced by REF(0x7ae518) [refcount 1], which is
|
2015-04-14 08:04:50 +00:00
|
|
|
| the member 'ukukey' of HASH(0x7d3bb0) [refcount 1], which is
|
|
|
|
| the global %Test::global_hash.
|
2011-06-02 13:55:22 +00:00
|
|
|
+- referenced by REF(0x7ae2f0) [refcount 1], which is
|
|
|
|
a temporary on the stack.
|
|
|
|
|
|
|
|
It is a bit convoluted to read, but basically it says that the value stored
|
|
|
|
in '$var' is referenced by:
|
|
|
|
|
|
|
|
* - the lexical '$closure_var' (0x8abcc8), which is inside an instantiated
|
|
|
|
closure, which in turn is used quite a bit.
|
|
|
|
|
|
|
|
* - the package-level lexical '$global_my'.
|
|
|
|
|
|
|
|
* - the global package variable named '$Test::var'.
|
|
|
|
|
|
|
|
* - the hash element 'ukukey2', in the hash in the my variable
|
|
|
|
'$testsub_local' in the sub 'Test::testsub' and also in the hash
|
|
|
|
'$referenced by Test::hash2'.
|
|
|
|
|
|
|
|
* - the hash element with key 'ukukey' in the hash stored in
|
|
|
|
'%Test::hash'.
|
|
|
|
|
|
|
|
* - some anonymous mortalised reference on the stack (which is caused
|
|
|
|
by calling 'track' with the expression '\$var', which creates the
|
|
|
|
reference).
|
|
|
|
|
|
|
|
And all these account for six reference counts.
|
|
|
|
|
|
|
|
%prep
|
2024-07-20 21:17:22 +00:00
|
|
|
%autosetup -n %{cpan_name}-%{cpan_version}
|
2011-06-02 13:55:22 +00:00
|
|
|
|
|
|
|
%build
|
2024-07-20 21:17:22 +00:00
|
|
|
perl Makefile.PL INSTALLDIRS=vendor OPTIMIZE="%{optflags}"
|
|
|
|
%make_build
|
2011-06-02 13:55:22 +00:00
|
|
|
|
|
|
|
%check
|
2024-07-20 21:17:22 +00:00
|
|
|
make test
|
2011-06-02 13:55:22 +00:00
|
|
|
|
|
|
|
%install
|
|
|
|
%perl_make_install
|
|
|
|
%perl_process_packlist
|
|
|
|
%perl_gen_filelist
|
|
|
|
|
|
|
|
%files -f %{name}.files
|
2017-06-25 06:31:53 +00:00
|
|
|
%doc Changes README
|
|
|
|
%license COPYING
|
2011-06-02 13:55:22 +00:00
|
|
|
|
|
|
|
%changelog
|