#############################################################################
## Name: DynaLoader.pm
## Purpose: LibZip::DynaLoader
## Author: Graciliano M. P.
## Modified by:
## Created: 2004-06-06
## RCS-ID:
## Copyright: (c) 2004 Graciliano M. P.
## Licence: This program is free software; you can redistribute it and/or
## modify it under the same terms as Perl itself
#############################################################################
package LibZip::DynaLoader ;
use 5.006 ;
$VERSION = '1.04' ;
no warnings ;
##############
# DYNALOADER #
##############
package DynaLoader;
BEGIN { $INC{'DynaLoader.pm'} = 1 if !$INC{'DynaLoader.pm'} ;}
#########
# BEGIN #
#########
sub BEGIN {
$sep = $^O eq 'MSWin32' ? '\\' : '/';
$dlext = $^O eq 'MSWin32' ? 'dll' : 'so';
}
sub dl_load_flags { 0x00 }
# cut'n' paste from DynaLoader
sub bootstrap_inherit {
my $module = $_[0];
local *isa = *{"$module\::ISA"};
local @isa = (@isa, 'DynaLoader');
# Cannot goto due to delocalization. Will report errors on a wrong line?
bootstrap(@_);
}
sub croak { die @_ }
# does not handle .bs files
sub bootstrap {
boot_DynaLoader('DynaLoader') if defined(&boot_DynaLoader) &&
!defined(&dl_error);
my $module = $_[0];
print "DYN>> @_\n" if $LibZip::DEBUG ;
LibZip::check_pack_dep("$module.pm") if defined &LibZip::check_pack_dep ;
my @modparts = split(/::/,$module);
my $path = join '/', 'auto', @modparts, $modparts[-1]; $path .= ".$dlext";
my $file ;
foreach my $INC_i ( @INC ) {
next if ref $INC_i ;
my $fl = "$INC_i/$path" ;
##print "** $fl [". (-e $fl) ."]\n" ;
if (-e $fl) { $file = $fl ; last ;}
}
my $bootname = "boot_$module"; $bootname =~ s/\W/_/g;
@dl_require_symbols = ($bootname);
my $boot_symbol_ref;
if (!-e $file || $file eq '') { return( undef ) ;}
print "DYN FILE>> $file\n" if $LibZip::DEBUG ;
my $libref = dl_load_file($file, $module->dl_load_flags) or
croak("Can't load '$file' for module $module: ".dl_error());
push(@dl_librefs,$libref); # record loaded object
if ( defined &dl_undef_symbols ) {
my @unresolved = dl_undef_symbols();
if (@unresolved) {
warn("Undefined symbols present after loading $file: @unresolved\n");
}
}
$boot_symbol_ref = dl_find_symbol($libref, $bootname) or
croak("Can't find '$bootname' symbol in $file\n");
push(@dl_modules, $module); # record loaded module
boot:
my $xs = dl_install_xsub("${module}::bootstrap", $boot_symbol_ref, $file);
##print "DYN END! ${module}::bootstrap >> $xs\n" ;
# See comment block above
&$xs(@args);
}
package XSLoader;
BEGIN { $INC{'XSLoader.pm'} = 1 if !$INC{'XSLoader.pm'} ;}
sub load {
DynaLoader::bootstrap_inherit(@_);
}
#######
# END #
#######
1;