home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 December (Special) / PCWorld_2005-12_Special_cd.bin / Bezpecnost / lsti / lsti.exe / framework-2.5.exe / XSLoader.pm < prev    next >
Text File  |  2005-01-27  |  9KB  |  287 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.     push(@DynaLoader::dl_shared_objects, $file); # record files loaded
  92.     return &$xs(@_);
  93.  
  94.   retry:
  95.     require DynaLoader;
  96.     goto &DynaLoader::bootstrap_inherit;
  97. }
  98.  
  99. 1;
  100.  
  101. __END__
  102.  
  103. =head1 NAME
  104.  
  105. XSLoader - Dynamically load C libraries into Perl code
  106.  
  107. =head1 SYNOPSIS
  108.  
  109.     package YourPackage;
  110.     use XSLoader;
  111.  
  112.     XSLoader::load 'YourPackage', $YourPackage::VERSION;
  113.  
  114. =head1 DESCRIPTION
  115.  
  116. This module defines a standard I<simplified> interface to the dynamic
  117. linking mechanisms available on many platforms.  Its primary purpose is
  118. to implement cheap automatic dynamic loading of Perl modules.
  119.  
  120. For more complicated interface see L<DynaLoader>.  Many (most)
  121. features of DynaLoader are not implemented in XSLoader, like for
  122. example the dl_load_flags is not honored by XSLoader.
  123.  
  124. =head2 Migration from C<DynaLoader>
  125.  
  126. A typical module using L<DynaLoader|DynaLoader> starts like this:
  127.  
  128.     package YourPackage;
  129.     require DynaLoader;
  130.  
  131.     our @ISA = qw( OnePackage OtherPackage DynaLoader );
  132.     our $VERSION = '0.01';
  133.     bootstrap YourPackage $VERSION;
  134.  
  135. Change this to
  136.  
  137.     package YourPackage;
  138.     use XSLoader;
  139.  
  140.     our @ISA = qw( OnePackage OtherPackage );
  141.     our $VERSION = '0.01';
  142.     XSLoader::load 'YourPackage', $VERSION;
  143.  
  144. In other words: replace C<require DynaLoader> by C<use XSLoader>, remove
  145. C<DynaLoader> from @ISA, change C<bootstrap> by C<XSLoader::load>.  Do not
  146. forget to quote the name of your package on the C<XSLoader::load> line,
  147. and add comma (C<,>) before the arguments ($VERSION above).
  148.  
  149. Of course, if @ISA contained only C<DynaLoader>, there is no need to have the
  150. @ISA assignment at all; moreover, if instead of C<our> one uses
  151. backward-compatible
  152.  
  153.     use vars qw($VERSION @ISA);
  154.  
  155. one can remove this reference to @ISA together with the @ISA assignment
  156.  
  157. If no $VERSION was specified on the C<bootstrap> line, the last line becomes
  158.  
  159.     XSLoader::load 'YourPackage';
  160.  
  161. =head2 Backward compatible boilerplate
  162.  
  163. If you want to have your cake and eat it too, you need a more complicated
  164. boilerplate.
  165.  
  166.     package YourPackage;
  167.     use vars qw($VERSION @ISA);
  168.  
  169.     @ISA = qw( OnePackage OtherPackage );
  170.     $VERSION = '0.01';
  171.     eval {
  172.        require XSLoader;
  173.        XSLoader::load('YourPackage', $VERSION);
  174.        1;
  175.     } or do {
  176.        require DynaLoader;
  177.        push @ISA, 'DynaLoader';
  178.        bootstrap YourPackage $VERSION;
  179.     };
  180.  
  181. The parentheses about XSLoader::load() arguments are needed since we replaced
  182. C<use XSLoader> by C<require>, so the compiler does not know that a function
  183. XSLoader::load() is present.
  184.  
  185. This boilerplate uses the low-overhead C<XSLoader> if present; if used with
  186. an antic Perl which has no C<XSLoader>, it falls back to using C<DynaLoader>.
  187.  
  188. =head1 Order of initialization: early load()
  189.  
  190. I<Skip this section if the XSUB functions are supposed to be called from other
  191. modules only; read it only if you call your XSUBs from the code in your module,
  192. or have a C<BOOT:> section in your XS file (see L<perlxs/"The BOOT: Keyword">).
  193. What is described here is equally applicable to L<DynaLoader|DynaLoader>
  194. interface.>
  195.  
  196. A sufficiently complicated module using XS would have both Perl code (defined
  197. in F<YourPackage.pm>) and XS code (defined in F<YourPackage.xs>).  If this
  198. Perl code makes calls into this XS code, and/or this XS code makes calls to
  199. the Perl code, one should be careful with the order of initialization.
  200.  
  201. The call to XSLoader::load() (or bootstrap()) has three side effects:
  202.  
  203. =over
  204.  
  205. =item *
  206.  
  207. if $VERSION was specified, a sanity check is done to insure that the versions
  208. of the F<.pm> and the (compiled) F<.xs> parts are compatible;
  209.  
  210. =item *
  211.  
  212. The XSUBs are made accessible from Perl;
  213.  
  214. =item *
  215.  
  216. If the C<BOOT:> section was present in F<.xs> file, the code there is called.
  217.  
  218. =back
  219.  
  220. Consequently, if the code in F<.pm> file makes calls to these XSUBs, it is
  221. convenient to have XSUBs installed before the Perl code is defined; for
  222. example, this makes prototypes for XSUBs visible to this Perl code.
  223. Alternatively, if the C<BOOT:> section makes calls to Perl functions (or
  224. uses Perl variables) defined in F<.pm> file, they must be defined prior to
  225. the call to XSLoader::load() (or bootstrap()).
  226.  
  227. The first situation being much more frequent, it makes sense to rewrite the
  228. boilerplate as
  229.  
  230.     package YourPackage;
  231.     use XSLoader;
  232.     use vars qw($VERSION @ISA);
  233.  
  234.     BEGIN {
  235.        @ISA = qw( OnePackage OtherPackage );
  236.        $VERSION = '0.01';
  237.  
  238.        # Put Perl code used in the BOOT: section here
  239.  
  240.        XSLoader::load 'YourPackage', $VERSION;
  241.     }
  242.  
  243.     # Put Perl code making calls into XSUBs here
  244.  
  245. =head2 The most hairy case
  246.  
  247. If the interdependence of your C<BOOT:> section and Perl code is
  248. more complicated than this (e.g., the C<BOOT:> section makes calls to Perl
  249. functions which make calls to XSUBs with prototypes), get rid of the C<BOOT:>
  250. section altogether.  Replace it with a function onBOOT(), and call it like
  251. this:
  252.  
  253.     package YourPackage;
  254.     use XSLoader;
  255.     use vars qw($VERSION @ISA);
  256.  
  257.     BEGIN {
  258.        @ISA = qw( OnePackage OtherPackage );
  259.        $VERSION = '0.01';
  260.        XSLoader::load 'YourPackage', $VERSION;
  261.     }
  262.  
  263.     # Put Perl code used in onBOOT() function here; calls to XSUBs are
  264.     # prototype-checked.
  265.  
  266.     onBOOT;
  267.  
  268.     # Put Perl initialization code assuming that XS is initialized here
  269.  
  270. =head1 LIMITATIONS
  271.  
  272. To reduce the overhead as much as possible, only one possible location
  273. is checked to find the extension DLL (this location is where C<make install>
  274. would put the DLL).  If not found, the search for the DLL is transparently
  275. delegated to C<DynaLoader>, which looks for the DLL along the @INC list.
  276.  
  277. In particular, this is applicable to the structure of @INC used for testing
  278. not-yet-installed extensions.  This means that the overhead of running
  279. uninstalled extension may be much more than running the same extension after
  280. C<make install>.
  281.  
  282. =head1 AUTHOR
  283.  
  284. Ilya Zakharevich: extraction from DynaLoader.
  285.  
  286. =cut
  287.