Fix AUTOLOAD / can() bug that could result in DESTROY being redefined and dynamic methods not being added to the symbol table.
This commit is contained in:
		| @@ -4690,21 +4690,27 @@ sub can { | ||||
|     my $funcs = $self->funcs(); | ||||
|  | ||||
|     # We need to resolve funcs with a prefix or suffix | ||||
|     my $f_method = $method; | ||||
|     $f_method =~ s/^(load|orig)_//; | ||||
|     $f_method =~ s/_raw$//; | ||||
|     my $base_method = $method; | ||||
|     $base_method =~ s/^(load|orig)_//; | ||||
|     $base_method =~ s/_raw$//; | ||||
|  | ||||
|     no strict 'refs';    ## no critic (ProhibitNoStrict ) | ||||
|  | ||||
|     # We could add load_/orig_/_raw alternatives to symbol table here on | ||||
|     # first call of any type for a global or func since they all use the same | ||||
|     # destination code, but they aren't used heavily in main code base so | ||||
|     # we’ll just create if/when they are called rather than pollute the | ||||
|     # symbol table with entries that never get called. | ||||
|  | ||||
|     # Check for set_ ing. | ||||
|     if ( $method =~ /^set_/ ) { | ||||
|         return *{$AUTOLOAD} = _make_setter( $method, $oid, @_ ); | ||||
|         return *{$method} = _make_setter( $method, $oid, @_ ); | ||||
|     } | ||||
|     elsif ( defined $funcs->{$f_method} || $table ) { | ||||
|         return *{$AUTOLOAD} = _load_attr( $method, $oid, @_ ); | ||||
|     elsif ( defined $funcs->{$base_method} || $table ) { | ||||
|         return *{$method} = _load_attr( $method, $oid, @_ ); | ||||
|     } | ||||
|     else { | ||||
|         return *{$AUTOLOAD} = _global( $method, $oid ); | ||||
|         return *{$method} = _global( $method, $oid ); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -4744,12 +4750,12 @@ subclass. | ||||
|  | ||||
| =cut | ||||
|  | ||||
| our $AUTOLOAD; | ||||
|  | ||||
| sub AUTOLOAD { | ||||
|     my $self = shift; | ||||
|     my ($sub_name) = $AUTOLOAD =~ /::(\w+)$/; | ||||
|  | ||||
|     return if $sub_name =~ /DESTROY$/; | ||||
|  | ||||
|     # Typos in function calls in SNMP::Info subclasses turn into | ||||
|     # AUTOLOAD requests for non-methods.  While this is deprecated, | ||||
|     # we'll still get called, so report a less confusing error. | ||||
| @@ -4776,6 +4782,9 @@ sub AUTOLOAD { | ||||
|  | ||||
| } | ||||
|  | ||||
| # Skip AUTOLOAD() | ||||
| sub DESTROY {} | ||||
|  | ||||
| 1; | ||||
|  | ||||
| =head1 COPYRIGHT AND LICENSE | ||||
|   | ||||
		Reference in New Issue
	
	Block a user