Skip to content

Commit 73fb25d

Browse files
committed
ensure parent is always weakened, to stop circular references / memory leaks
1 parent 028ca19 commit 73fb25d

File tree

9 files changed

+34
-21
lines changed

9 files changed

+34
-21
lines changed

Diff for: lib/HTML/FormFu.pm

+4-4
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use HTML::FormFu::ObjectUtil qw/
1818
get_elements get_element get_all_elements get_all_element
1919
get_fields get_field get_errors get_error clear_errors
2020
populate load_config_file insert_before insert_after form
21-
_render_class clone stash constraints_from_dbic /;
21+
_render_class clone stash constraints_from_dbic parent /;
2222
use HTML::FormFu::Util qw/ require_class _get_elements xml_escape /;
2323
use List::MoreUtils qw/ uniq /;
2424
use Scalar::Util qw/ blessed refaddr weaken /;
@@ -38,8 +38,7 @@ __PACKAGE__->mk_attrs(qw/ attributes /);
3838
__PACKAGE__->mk_attr_accessors(qw/ id action enctype method /);
3939

4040
__PACKAGE__->mk_accessors(
41-
qw/ parent
42-
indicator filename javascript javascript_src
41+
qw/ indicator filename javascript javascript_src
4342
element_defaults query_type languages force_error_message
4443
localize_class submitted query input _auto_fieldset
4544
_elements _processed_params _valid_names
@@ -608,9 +607,10 @@ sub render {
608607
force_error_message => $self->force_error_message,
609608
form_error_message => xml_escape( $self->form_error_message ),
610609
_elements => [ map { $_->render } @{ $self->_elements } ],
611-
parent => $self,
612610
} );
613611

612+
$render->parent($self);
613+
614614
$render->attributes( xml_escape $self->attributes );
615615
$render->stash( $self->stash );
616616

Diff for: lib/HTML/FormFu/Deflator.pm

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ use strict;
44
use base 'Class::Accessor::Chained::Fast';
55
use Class::C3;
66

7-
use HTML::FormFu::ObjectUtil qw( populate form name );
7+
use HTML::FormFu::ObjectUtil qw( populate form name parent );
88
use Carp qw( croak );
99

10-
__PACKAGE__->mk_accessors(qw/ parent type /);
10+
__PACKAGE__->mk_accessors(qw/ type /);
1111

1212
sub new {
1313
my $class = shift;

Diff for: lib/HTML/FormFu/Element.pm

+4-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use HTML::FormFu::Attribute qw/ mk_attrs mk_attr_accessors
88
mk_output_accessors mk_inherited_accessors
99
mk_inherited_merging_accessors /;
1010
use HTML::FormFu::ObjectUtil qw/ load_config_file _render_class
11-
populate form stash /;
11+
populate form stash parent /;
1212
use HTML::FormFu::Util qw/ require_class xml_escape /;
1313
use Scalar::Util qw/ refaddr /;
1414
use Storable qw( dclone );
@@ -27,7 +27,7 @@ __PACKAGE__->mk_attr_accessors(qw/ id /);
2727

2828
__PACKAGE__->mk_accessors(
2929
qw/
30-
parent name type filename multi_filename is_field
30+
name type filename multi_filename is_field
3131
render_class_suffix /
3232
);
3333

@@ -133,9 +133,10 @@ sub render {
133133
multi_filename => $self->multi_filename,
134134
is_field => $self->is_field,
135135
stash => $self->stash,
136-
parent => $self,
137136
@_ ? %{ $_[0] } : () } );
138137

138+
$render->parent($self);
139+
139140
$self->prepare_id($render);
140141

141142
$self->prepare_attrs($render);

Diff for: lib/HTML/FormFu/Exception.pm

+1-3
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ package HTML::FormFu::Exception;
33
use strict;
44
use base 'Class::Accessor::Chained::Fast';
55

6-
use HTML::FormFu::ObjectUtil qw/ form /;
7-
8-
__PACKAGE__->mk_accessors(qw/ parent /);
6+
use HTML::FormFu::ObjectUtil qw/ form parent /;
97

108
1;

Diff for: lib/HTML/FormFu/Filter.pm

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ use strict;
44
use base 'Class::Accessor::Chained::Fast';
55
use Class::C3;
66

7-
use HTML::FormFu::ObjectUtil qw( populate form name );
7+
use HTML::FormFu::ObjectUtil qw( populate form name parent );
88
use Carp qw( croak );
99

10-
__PACKAGE__->mk_accessors(qw/ parent type localize_args /);
10+
__PACKAGE__->mk_accessors(qw/ type localize_args /);
1111

1212
sub new {
1313
my $class = shift;

Diff for: lib/HTML/FormFu/ObjectUtil.pm

+15-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ our @EXPORT_OK = qw/
1717
deflator get_fields get_field get_elements get_element
1818
get_all_elements get_all_element get_errors get_error clear_errors
1919
load_config_file form insert_before insert_after clone name stash
20-
constraints_from_dbic /;
20+
constraints_from_dbic parent /;
2121

2222
sub _single_element {
2323
my ( $self, $element ) = @_;
@@ -591,4 +591,18 @@ sub _add_constraint_set {
591591
} );
592592
}
593593

594+
sub parent {
595+
my $self = shift;
596+
597+
if (@_) {
598+
$self->{parent} = shift;
599+
600+
weaken( $self->{parent} );
601+
602+
return $self;
603+
}
604+
605+
return $self->{parent};
606+
};
607+
594608
1;

Diff for: lib/HTML/FormFu/Processor.pm

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use base 'Class::Accessor::Chained::Fast';
55
use Class::C3;
66

77
use HTML::FormFu::Attribute qw( mk_output_accessors );
8-
use HTML::FormFu::ObjectUtil qw( populate form name );
8+
use HTML::FormFu::ObjectUtil qw( populate form name parent );
99
use Scalar::Util qw/ refaddr /;
1010
use Carp qw/ croak /;
1111

@@ -15,7 +15,7 @@ use overload
1515
bool => sub {1},
1616
fallback => 1;
1717

18-
__PACKAGE__->mk_accessors(qw/ type parent localize_args /);
18+
__PACKAGE__->mk_accessors(qw/ type localize_args /);
1919

2020
__PACKAGE__->mk_output_accessors(qw/ message /);
2121

Diff for: lib/HTML/FormFu/Render/base.pm

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use strict;
44
use base 'Class::Accessor::Chained::Fast';
55

66
use HTML::FormFu::Attribute qw/ mk_attrs mk_attr_accessors /;
7-
use HTML::FormFu::ObjectUtil qw/ form stash /;
7+
use HTML::FormFu::ObjectUtil qw/ form stash parent /;
88
use HTML::FormFu::Util qw/ _parse_args _get_elements process_attrs /;
99
use Scalar::Util qw/ refaddr /;
1010
use Carp qw/ croak /;
@@ -20,7 +20,7 @@ __PACKAGE__->mk_attrs(qw/ attributes /);
2020

2121
__PACKAGE__->mk_accessors(
2222
qw/ render_class_args render_class_suffix render_method
23-
filename _elements parent template_alloy /
23+
filename _elements template_alloy /
2424
);
2525

2626
sub new {

Diff for: lib/HTML/FormFu/Upload.pm

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ package HTML::FormFu::Upload;
33
use strict;
44
use base 'Class::Accessor::Chained::Fast';
55

6-
use HTML::FormFu::ObjectUtil qw/ form /;
6+
use HTML::FormFu::ObjectUtil qw/ form parent /;
77

8-
__PACKAGE__->mk_accessors(qw/ _param parent /);
8+
__PACKAGE__->mk_accessors(qw/ _param /);
99

1010
1;

0 commit comments

Comments
 (0)