From: Jesse Luehrs Date: Mon, 15 Nov 2010 16:50:59 +0000 (-0600) Subject: convert the XS implementation to its own dist X-Git-Tag: 0.15~8 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo%2FPackage-Stash-XS.git;a=commitdiff_plain;h=c53d2df2c524d9db9af996ac6543831c480b2092 convert the XS implementation to its own dist --- diff --git a/Makefile.PL b/Makefile.PL index 9791d1c..47a3f23 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -6,5 +6,5 @@ use ExtUtils::MakeMaker; # dependencies, is generated later by Dist::Zilla WriteMakefile( - NAME => 'Package::Stash', + NAME => 'Package::Stash::XS', ); diff --git a/Stash.xs b/XS.xs similarity index 99% rename from Stash.xs rename to XS.xs index 5124997..98648ca 100644 --- a/Stash.xs +++ b/XS.xs @@ -338,7 +338,7 @@ SV *_get_symbol(SV *self, varspec_t *variable, int vivify) } } -MODULE = Package::Stash PACKAGE = Package::Stash +MODULE = Package::Stash::XS PACKAGE = Package::Stash::XS PROTOTYPES: DISABLE diff --git a/dist.ini b/dist.ini index 4c1e18f..f38972f 100644 --- a/dist.ini +++ b/dist.ini @@ -1,4 +1,4 @@ -name = Package-Stash +name = Package-Stash-XS author = Jesse Luehrs license = Perl_5 copyright_holder = Jesse Luehrs @@ -6,12 +6,9 @@ copyright_holder = Jesse Luehrs [@DOY] :version = 0.05 dist = Package-Stash -awesome = =inc::MMPackageStash [Prereqs] perl = 5.8.3 -Package::DeprecationManager = 0 -Scalar::Util = 0 [Prereqs / TestRequires] Test::Fatal = 0 diff --git a/inc/MMPackageStash.pm b/inc/MMPackageStash.pm deleted file mode 100644 index 93c04e4..0000000 --- a/inc/MMPackageStash.pm +++ /dev/null @@ -1,60 +0,0 @@ -package inc::MMPackageStash; -use Moose; - -extends 'Dist::Zilla::Plugin::MakeMaker::Awesome'; - -# XXX: this is pretty gross, it should be possible to clean this up later -around _build_MakeFile_PL_template => sub { - my $orig = shift; - my $self = shift; - my $template = $self->$orig(@_); - - $template =~ s/(use ExtUtils::MakeMaker.*)/$1\n\ncheck_conflicts();/; - - $template .= <<'CHECK_CONFLICTS'; -sub check_conflicts { - my %conflicts = ( - 'Class::MOP' => '1.08', - 'MooseX::Role::WithOverloading' => '0.08', - ); - my $found = 0; - for my $mod ( sort keys %conflicts ) { - eval "require $mod"; - next if $@; - - my $installed = $mod->VERSION(); - if ( $installed le $conflicts{$mod} ) { - - print <<"EOF"; - -*** - This version of Package::Stash conflicts with the version of - $mod ($installed) you have installed. - - You will need to upgrade $mod after installing - this version of Package::Stash. -*** - -EOF - - $found = 1; - } - } - - return unless $found; - - # More or less copied from Module::Build - return if $ENV{PERL_MM_USE_DEFAULT}; - return unless -t STDIN && (-t STDOUT || !(-f STDOUT || -c STDOUT)); - - sleep 4; -} -CHECK_CONFLICTS - - return $template; -}; - -__PACKAGE__->meta->make_immutable; -no Moose; - -1; diff --git a/lib/Package/Stash.pm b/lib/Package/Stash.pm deleted file mode 100644 index aa8d5fd..0000000 --- a/lib/Package/Stash.pm +++ /dev/null @@ -1,231 +0,0 @@ -package Package::Stash; -use strict; -use warnings; -# ABSTRACT: routines for manipulating stashes - -use XSLoader; -XSLoader::load( - __PACKAGE__, - # we need to be careful not to touch $VERSION at compile time, otherwise - # DynaLoader will assume it's set and check against it, which will cause - # fail when being run in the checkout without dzil having set the actual - # $VERSION - exists $Package::Stash::{VERSION} - ? ${ $Package::Stash::{VERSION} } : (), -); - -use Package::DeprecationManager -deprecations => { - 'Package::Stash::add_package_symbol' => 0.14, - 'Package::Stash::remove_package_glob' => 0.14, - 'Package::Stash::has_package_symbol' => 0.14, - 'Package::Stash::get_package_symbol' => 0.14, - 'Package::Stash::get_or_add_package_symbol' => 0.14, - 'Package::Stash::remove_package_symbol' => 0.14, - 'Package::Stash::list_all_package_symbols' => 0.14, -}; - -sub add_package_symbol { - deprecated('add_package_symbol is deprecated, please use add_symbol'); - shift->add_symbol(@_); -} - -sub remove_package_glob { - deprecated('remove_package_glob is deprecated, please use remove_glob'); - shift->remove_glob(@_); -} - -sub has_package_symbol { - deprecated('has_package_symbol is deprecated, please use has_symbol'); - shift->has_symbol(@_); -} - -sub get_package_symbol { - deprecated('get_package_symbol is deprecated, please use get_symbol'); - shift->get_symbol(@_); -} - -sub get_or_add_package_symbol { - deprecated('get_or_add_package_symbol is deprecated, please use get_or_add_symbol'); - shift->get_or_add_symbol(@_); -} - -sub remove_package_symbol { - deprecated('remove_package_symbol is deprecated, please use remove_symbol'); - shift->remove_symbol(@_); -} - -sub list_all_package_symbols { - deprecated('list_all_package_symbols is deprecated, please use list_all_symbols'); - shift->list_all_symbols(@_); -} - -=head1 SYNOPSIS - - my $stash = Package::Stash->new('Foo'); - $stash->add_symbol('%foo', {bar => 1}); - # $Foo::foo{bar} == 1 - $stash->has_symbol('$foo') # false - my $namespace = $stash->namespace; - *{ $namespace->{foo} }{HASH} # {bar => 1} - -=head1 DESCRIPTION - -Manipulating stashes (Perl's symbol tables) is occasionally necessary, but -incredibly messy, and easy to get wrong. This module hides all of that behind a -simple API. - -NOTE: Most methods in this class require a variable specification that includes -a sigil. If this sigil is absent, it is assumed to represent the IO slot. - -=method new $package_name - -Creates a new C object, for the package given as the only -argument. - -=method name - -Returns the name of the package that this object represents. - -=method namespace - -Returns the raw stash itself. - -=method add_symbol $variable $value %opts - -Adds a new package symbol, for the symbol given as C<$variable>, and optionally -gives it an initial value of C<$value>. C<$variable> should be the name of -variable including the sigil, so - - Package::Stash->new('Foo')->add_symbol('%foo') - -will create C<%Foo::foo>. - -Valid options (all optional) are C, C, and -C. - -C<$opts{filename}>, C<$opts{first_line_num}>, and C<$opts{last_line_num}> can -be used to indicate where the symbol should be regarded as having been defined. -Currently these values are only used if the symbol is a subroutine ('C<&>' -sigil) and only if C<$^P & 0x10> is true, in which case the special C<%DB::sub> -hash is updated to record the values of C, C, and -C for the subroutine. If these are not passed, their values are -inferred (as much as possible) from C information. - -This is especially useful for debuggers and profilers, which use C<%DB::sub> to -determine where the source code for a subroutine can be found. See -L for more -information about C<%DB::sub>. - -=method remove_glob $name - -Removes all package variables with the given name, regardless of sigil. - -=method has_symbol $variable - -Returns whether or not the given package variable (including sigil) exists. - -=method get_symbol $variable - -Returns the value of the given package variable (including sigil). - -=method get_or_add_symbol $variable - -Like C, except that it will return an empty hashref or -arrayref if the variable doesn't exist. - -=method remove_symbol $variable - -Removes the package variable described by C<$variable> (which includes the -sigil); other variables with the same name but different sigils will be -untouched. - -=method list_all_symbols $type_filter - -Returns a list of package variable names in the package, without sigils. If a -C is passed, it is used to select package variables of a given -type, where valid types are the slots of a typeglob ('SCALAR', 'CODE', 'HASH', -etc). Note that if the package contained any C blocks, perl will leave -an empty typeglob in the C slot, so this will show up if no filter is -used (and similarly for C, C, etc). - -=method get_all_symbols $type_filter - -Returns a hashref, keyed by the variable names in the package. If -C<$type_filter> is passed, the hash will contain every variable of that type in -the package as values, otherwise, it will contain the typeglobs corresponding -to the variable names (basically, a clone of the stash). - -=head1 BUGS / CAVEATS - -=over 4 - -=item * On perl versions prior to 5.10, undefined package scalars will not show up as existing, due to shortcomings within perl. - -=item * GLOB and FORMAT variables are not (yet) accessible through this module. - -=back - -Please report any bugs through RT: email -C, or browse to -L. - -=head1 SEE ALSO - -=over 4 - -=item * L - -This module is a factoring out of code that used to live here - -=back - -=head1 SUPPORT - -You can find this documentation for this module with the perldoc command. - - perldoc Package::Stash - -You can also look for information at: - -=over 4 - -=item * AnnoCPAN: Annotated CPAN documentation - -L - -=item * CPAN Ratings - -L - -=item * RT: CPAN's request tracker - -L - -=item * Search CPAN - -L - -=back - -=head1 AUTHOR - -Jesse Luehrs - -Based on code from L, by Stevan Little and the Moose -Cabal. - -=begin Pod::Coverage - -add_package_symbol -remove_package_glob -has_package_symbol -get_package_symbol -get_or_add_package_symbol -remove_package_symbol -list_all_package_symbols - -=end Pod::Coverage - -=cut - -1; diff --git a/lib/Package/Stash/XS.pm b/lib/Package/Stash/XS.pm new file mode 100644 index 0000000..0b20026 --- /dev/null +++ b/lib/Package/Stash/XS.pm @@ -0,0 +1,88 @@ +package Package::Stash::XS; +use strict; +use warnings; +# ABSTRACT: faster and more correct implementation of the Package::Stash API + +use XSLoader; +XSLoader::load( + __PACKAGE__, + # we need to be careful not to touch $VERSION at compile time, otherwise + # DynaLoader will assume it's set and check against it, which will cause + # fail when being run in the checkout without dzil having set the actual + # $VERSION + exists $Package::Stash::XS::{VERSION} + ? ${ $Package::Stash::XS::{VERSION} } : (), +); + +=head1 SYNOPSIS + + use Package::Stash; + +=head1 DESCRIPTION + +This is a backend for L, which provides the functionality in a +way that's less buggy and much faster. It will be used by default if it's +installed, and should be preferred in all environments with a compiler. + +=head1 BUGS / CAVEATS + +=over 4 + +=item * On perl versions prior to 5.10, undefined package scalars will not show up as existing, due to shortcomings within perl. + +=item * GLOB and FORMAT variables are not (yet) accessible through this module. + +=back + +Please report any bugs through RT: email +C, or browse to +L. + +=head1 SEE ALSO + +=over 4 + +=item * L + +This module is a factoring out of code that used to live here + +=back + +=head1 SUPPORT + +You can find this documentation for this module with the perldoc command. + + perldoc Package::Stash::XS + +You can also look for information at: + +=over 4 + +=item * AnnoCPAN: Annotated CPAN documentation + +L + +=item * CPAN Ratings + +L + +=item * RT: CPAN's request tracker + +L + +=item * Search CPAN + +L + +=back + +=head1 AUTHOR + +Jesse Luehrs + +Based on code from L, by Stevan Little and the Moose +Cabal. + +=cut + +1; diff --git a/t/01-basic.t b/t/01-basic.t index 6b85515..79c72f1 100644 --- a/t/01-basic.t +++ b/t/01-basic.t @@ -1,6 +1,7 @@ +#!/usr/bin/env perl use strict; use warnings; - +use lib 't/lib'; use Test::More; use Test::Fatal; diff --git a/t/02-extension.t b/t/02-extension.t index 5e88fa6..2096221 100644 --- a/t/02-extension.t +++ b/t/02-extension.t @@ -1,6 +1,7 @@ +#!/usr/bin/env perl use strict; use warnings; - +use lib 't/lib'; use Test::More; use Test::Fatal; diff --git a/t/03-io.t b/t/03-io.t index e061cb2..ecade2a 100644 --- a/t/03-io.t +++ b/t/03-io.t @@ -1,6 +1,7 @@ #!/usr/bin/env perl use strict; use warnings; +use lib 't/lib'; use Test::More; use Test::Fatal; diff --git a/t/04-get.t b/t/04-get.t index 7205457..4f0eb6a 100644 --- a/t/04-get.t +++ b/t/04-get.t @@ -1,6 +1,7 @@ #!/usr/bin/env perl use strict; use warnings; +use lib 't/lib'; use Test::More; use Package::Stash; diff --git a/t/05-isa.t b/t/05-isa.t index d0f9b5a..ce852a6 100644 --- a/t/05-isa.t +++ b/t/05-isa.t @@ -1,6 +1,7 @@ #!/usr/bin/env perl use strict; use warnings; +use lib 't/lib'; use Test::More; use Package::Stash; diff --git a/t/06-addsub.t b/t/06-addsub.t index 1965afd..4889d59 100644 --- a/t/06-addsub.t +++ b/t/06-addsub.t @@ -1,6 +1,7 @@ +#!/usr/bin/env perl use strict; use warnings; - +use lib 't/lib'; use Test::More; use Test::Fatal; diff --git a/t/07-edge-cases.t b/t/07-edge-cases.t index 2710c5c..17ec84c 100755 --- a/t/07-edge-cases.t +++ b/t/07-edge-cases.t @@ -1,6 +1,7 @@ #!/usr/bin/env perl use strict; use warnings; +use lib 't/lib'; use Test::More; use Package::Stash; diff --git a/t/10-synopsis.t b/t/10-synopsis.t index ecde8b6..9f59948 100644 --- a/t/10-synopsis.t +++ b/t/10-synopsis.t @@ -1,6 +1,7 @@ #!/usr/bin/env perl use strict; use warnings; +use lib 't/lib'; use Test::More; use Package::Stash; diff --git a/t/20-leaks.t b/t/20-leaks.t index d5dae8a..e97d7d6 100644 --- a/t/20-leaks.t +++ b/t/20-leaks.t @@ -1,6 +1,7 @@ #!/usr/bin/env perl use strict; use warnings; +use lib 't/lib'; use Test::More; use Test::Fatal; use Test::Requires 'Test::LeakTrace'; diff --git a/t/21-leaks-debug.t b/t/21-leaks-debug.t index 5b2a463..292a28c 100644 --- a/t/21-leaks-debug.t +++ b/t/21-leaks-debug.t @@ -1,6 +1,7 @@ #!/usr/bin/env perl use strict; use warnings; +use lib 't/lib'; use Test::More; use Test::Fatal; use Test::Requires 'Test::LeakTrace'; diff --git a/t/lib/Package/Stash.pm b/t/lib/Package/Stash.pm new file mode 100644 index 0000000..fb25135 --- /dev/null +++ b/t/lib/Package/Stash.pm @@ -0,0 +1,19 @@ +package # hide from PAUSE + Package::Stash; +use strict; +use warnings; + +use Package::Stash::XS; + +BEGIN { + my $ps = Package::Stash::XS->new(__PACKAGE__); + my $ps_xs = Package::Stash::XS->new('Package::Stash::XS'); + for my $method (qw(new name namespace add_symbol remove_glob has_symbol + get_symbol get_or_add_symbol remove_symbol + list_all_symbols get_all_symbols)) { + my $sym = '&' . $method; + $ps->add_symbol($sym => $ps_xs->get_symbol($sym)); + } +} + +1;