home *** CD-ROM | disk | FTP | other *** search
/ PC World 2004 November / PCWorld_2004-11_cd.bin / software / topware / activeperl / ActivePerl-5.8.4.810-MSWin32-x86.exe / ActivePerl-5.8.4.810 / Perl / lib / XSLoader.pm < prev   
Text File  |  2004-06-01  |  9KB  |  286 lines

  1. # Generated from XSLoader.pm.PL (resolved %Config::Config value)
  2.  
  3. package XSLoader;
  4.  
  5. $VERSION = "0.02";
  6.  
  7. # enable debug/trace messages from DynaLoader perl code
  8. # $dl_debug = $ENV{PERL_DL_DEBUG} || 0 unless defined $dl_debug;
  9.  
  10.   my $dl_dlext = 'dll';
  11.  
  12. package DynaLoader;
  13.  
  14. # No prizes for guessing why we don't say 'bootstrap DynaLoader;' here.
  15. # NOTE: All dl_*.xs (including dl_none.xs) define a dl_error() XSUB
  16. boot_DynaLoader('DynaLoader') if defined(&boot_DynaLoader) &&
  17.                                 !defined(&dl_error);
  18. package XSLoader;
  19.  
  20. sub load {
  21.     package DynaLoader;
  22.  
  23.     die q{XSLoader::load('Your::Module', $Your::Module::VERSION)} unless @_;
  24.  
  25.     my($module) = $_[0];
  26.  
  27.     # work with static linking too
  28.     my $b = "$module\::bootstrap";
  29.     goto &$b if defined &$b;
  30.  
  31.     goto retry unless $module and defined &dl_load_file;
  32.  
  33.     my @modparts = split(/::/,$module);
  34.     my $modfname = $modparts[-1];
  35.  
  36.     my $modpname = join('/',@modparts);
  37.     my $modlibname = (caller())[1];
  38.     my $c = @modparts;
  39.     $modlibname =~ s,[\\/][^\\/]+$,, while $c--;    # Q&D basename
  40.     my $file = "$modlibname/auto/$modpname/$modfname.$dl_dlext";
  41.  
  42. #   print STDERR "XSLoader::load for $module ($file)\n" if $dl_debug;
  43.  
  44.     my $bs = $file;
  45.     $bs =~ s/(\.\w+)?(;\d*)?$/\.bs/; # look for .bs 'beside' the library
  46.  
  47.     goto retry if not -f $file or -s $bs;
  48.  
  49.     my $bootname = "boot_$module";
  50.     $bootname =~ s/\W/_/g;
  51.     @dl_require_symbols = ($bootname);
  52.  
  53.     my $boot_symbol_ref;
  54.  
  55.     if ($^O eq 'darwin') {
  56.         if ($boot_symbol_ref = dl_find_symbol(0, $bootname)) {
  57.             goto boot; #extension library has already been loaded, e.g. darwin
  58.         }
  59.     }
  60.  
  61.     # Many dynamic extension loading problems will appear to come from
  62.     # this section of code: XYZ failed at line 123 of DynaLoader.pm.
  63.     # Often these errors are actually occurring in the initialisation
  64.     # C code of the extension XS file. Perl reports the error as being
  65.     # in this perl code simply because this was the last perl code
  66.     # it executed.
  67.  
  68.     my $libref = dl_load_file($file, 0) or do { 
  69.     require Carp;
  70.     Carp::croak("Can't load '$file' for module $module: " . dl_error());
  71.     };
  72.     push(@dl_librefs,$libref);  # record loaded object
  73.  
  74.     my @unresolved = dl_undef_symbols();
  75.     if (@unresolved) {
  76.     require Carp;
  77.     Carp::carp("Undefined symbols present after loading $file: @unresolved\n");
  78.     }
  79.  
  80.     $boot_symbol_ref = dl_find_symbol($libref, $bootname) or do {
  81.     require Carp;
  82.     Carp::croak("Can't find '$bootname' symbol in $file\n");
  83.     };
  84.  
  85.     push(@dl_modules, $module); # record loaded module
  86.  
  87.   boot:
  88.     my $xs = dl_install_xsub("${module}::bootstrap", $boot_symbol_ref, $file);
  89.  
  90.     # See comment block above
  91.     return &$xs(@_);
  92.  
  93.   retry:
  94.     require DynaLoader;
  95.     goto &DynaLoader::bootstrap_inherit;
  96. }
  97.  
  98. 1;
  99.  
  100. __END__
  101.  
  102. =head1 NAME
  103.  
  104. XSLoader - Dynamically load C libraries into Perl code
  105.  
  106. =head1 SYNOPSIS
  107.  
  108.     package YourPackage;
  109.     use XSLoader;
  110.  
  111.     XSLoader::load 'YourPackage', $YourPackage::VERSION;
  112.  
  113. =head1 DESCRIPTION
  114.  
  115. This module defines a standard I<simplified> interface to the dynamic
  116. linking mechanisms available on many platforms.  Its primary purpose is
  117. to implement cheap automatic dynamic loading of Perl modules.
  118.  
  119. For more complicated interface see L<DynaLoader>.  Many (most)
  120. features of DynaLoader are not implemented in XSLoader, like for
  121. example the dl_load_flags is not honored by XSLoader.
  122.  
  123. =head2 Migration from C<DynaLoader>
  124.  
  125. A typical module using L<DynaLoader|DynaLoader> starts like this:
  126.  
  127.     package YourPackage;
  128.     require DynaLoader;
  129.  
  130.     our @ISA = qw( OnePackage OtherPackage DynaLoader );
  131.     our $VERSION = '0.01';
  132.     bootstrap YourPackage $VERSION;
  133.  
  134. Change this to
  135.  
  136.     package YourPackage;
  137.     use XSLoader;
  138.  
  139.     our @ISA = qw( OnePackage OtherPackage );
  140.     our $VERSION = '0.01';
  141.     XSLoader::load 'YourPackage', $VERSION;
  142.  
  143. In other words: replace C<require DynaLoader> by C<use XSLoader>, remove
  144. C<DynaLoader> from @ISA, change C<bootstrap> by C<XSLoader::load>.  Do not
  145. forget to quote the name of your package on the C<XSLoader::load> line,
  146. and add comma (C<,>) before the arguments ($VERSION above).
  147.  
  148. Of course, if @ISA contained only C<DynaLoader>, there is no need to have the
  149. @ISA assignment at all; moreover, if instead of C<our> one uses
  150. backward-compatible
  151.  
  152.     use vars qw($VERSION @ISA);
  153.  
  154. one can remove this reference to @ISA together with the @ISA assignment
  155.  
  156. If no $VERSION was specified on the C<bootstrap> line, the last line becomes
  157.  
  158.     XSLoader::load 'YourPackage';
  159.  
  160. =head2 Backward compatible boilerplate
  161.  
  162. If you want to have your cake and eat it too, you need a more complicated
  163. boilerplate.
  164.  
  165.     package YourPackage;
  166.     use vars qw($VERSION @ISA);
  167.  
  168.     @ISA = qw( OnePackage OtherPackage );
  169.     $VERSION = '0.01';
  170.     eval {
  171.        require XSLoader;
  172.        XSLoader::load('YourPackage', $VERSION);
  173.        1;
  174.     } or do {
  175.        require DynaLoader;
  176.        push @ISA, 'DynaLoader';
  177.        bootstrap YourPackage $VERSION;
  178.     };
  179.  
  180. The parentheses about XSLoader::load() arguments are needed since we replaced
  181. C<use XSLoader> by C<require>, so the compiler does not know that a function
  182. XSLoader::load() is present.
  183.  
  184. This boilerplate uses the low-overhead C<XSLoader> if present; if used with
  185. an antic Perl which has no C<XSLoader>, it falls back to using C<DynaLoader>.
  186.  
  187. =head1 Order of initialization: early load()
  188.  
  189. I<Skip this section if the XSUB functions are supposed to be called from other
  190. modules only; read it only if you call your XSUBs from the code in your module,
  191. or have a C<BOOT:> section in your XS file (see L<perlxs/"The BOOT: Keyword">).
  192. What is described here is equally applicable to L<DynaLoader|DynaLoader>
  193. interface.>
  194.  
  195. A sufficiently complicated module using XS would have both Perl code (defined
  196. in F<YourPackage.pm>) and XS code (defined in F<YourPackage.xs>).  If this
  197. Perl code makes calls into this XS code, and/or this XS code makes calls to
  198. the Perl code, one should be careful with the order of initialization.
  199.  
  200. The call to XSLoader::load() (or bootstrap()) has three side effects:
  201.  
  202. =over
  203.  
  204. =item *
  205.  
  206. if $VERSION was specified, a sanity check is done to insure that the versions
  207. of the F<.pm> and the (compiled) F<.xs> parts are compatible;
  208.  
  209. =item *
  210.  
  211. The XSUBs are made accessible from Perl;
  212.  
  213. =item *
  214.  
  215. If the C<BOOT:> section was present in F<.xs> file, the code there is called.
  216.  
  217. =back
  218.  
  219. Consequently, if the code in F<.pm> file makes calls to these XSUBs, it is
  220. convenient to have XSUBs installed before the Perl code is defined; for
  221. example, this makes prototypes for XSUBs visible to this Perl code.
  222. Alternatively, if the C<BOOT:> section makes calls to Perl functions (or
  223. uses Perl variables) defined in F<.pm> file, they must be defined prior to
  224. the call to XSLoader::load() (or bootstrap()).
  225.  
  226. The first situation being much more frequent, it makes sense to rewrite the
  227. boilerplate as
  228.  
  229.     package YourPackage;
  230.     use XSLoader;
  231.     use vars qw($VERSION @ISA);
  232.  
  233.     BEGIN {
  234.        @ISA = qw( OnePackage OtherPackage );
  235.        $VERSION = '0.01';
  236.  
  237.        # Put Perl code used in the BOOT: section here
  238.  
  239.        XSLoader::load 'YourPackage', $VERSION;
  240.     }
  241.  
  242.     # Put Perl code making calls into XSUBs here
  243.  
  244. =head2 The most hairy case
  245.  
  246. If the interdependence of your C<BOOT:> section and Perl code is
  247. more complicated than this (e.g., the C<BOOT:> section makes calls to Perl
  248. functions which make calls to XSUBs with prototypes), get rid of the C<BOOT:>
  249. section altogether.  Replace it with a function onBOOT(), and call it like
  250. this:
  251.  
  252.     package YourPackage;
  253.     use XSLoader;
  254.     use vars qw($VERSION @ISA);
  255.  
  256.     BEGIN {
  257.        @ISA = qw( OnePackage OtherPackage );
  258.        $VERSION = '0.01';
  259.        XSLoader::load 'YourPackage', $VERSION;
  260.     }
  261.  
  262.     # Put Perl code used in onBOOT() function here; calls to XSUBs are
  263.     # prototype-checked.
  264.  
  265.     onBOOT;
  266.  
  267.     # Put Perl initialization code assuming that XS is initialized here
  268.  
  269. =head1 LIMITATIONS
  270.  
  271. To reduce the overhead as much as possible, only one possible location
  272. is checked to find the extension DLL (this location is where C<make install>
  273. would put the DLL).  If not found, the search for the DLL is transparently
  274. delegated to C<DynaLoader>, which looks for the DLL along the @INC list.
  275.  
  276. In particular, this is applicable to the structure of @INC used for testing
  277. not-yet-installed extensions.  This means that the overhead of running
  278. uninstalled extension may be much more than running the same extension after
  279. C<make install>.
  280.  
  281. =head1 AUTHOR
  282.  
  283. Ilya Zakharevich: extraction from DynaLoader.
  284.  
  285. =cut
  286.