############################################################################# ## 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;