threads::shared 1.24 (phase 2)
[p5sagit/p5-mst-13.2.git] / ext / Devel / PPPort / PPPort_pm.PL
index 61ac6b2..5a8c227 100644 (file)
@@ -4,13 +4,13 @@
 #
 ################################################################################
 #
-#  $Revision: 36 $
+#  $Revision: 59 $
 #  $Author: mhx $
-#  $Date: 2005/06/25 17:56:28 +0200 $
+#  $Date: 2008/01/04 10:47:38 +0100 $
 #
 ################################################################################
 #
-#  Version 3.x, Copyright (C) 2004-2005, Marcus Holland-Moritz.
+#  Version 3.x, Copyright (C) 2004-2008, Marcus Holland-Moritz.
 #  Version 2.x, Copyright (C) 2001, Paul Marquess.
 #  Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
 #
@@ -27,7 +27,7 @@ my $INCLUDE = 'parts/inc';
 my $DPPP = 'DPPP_';
 
 my %embed = map { ( $_->{name} => $_ ) }
-            parse_embed(qw(parts/embed.fnc parts/apidoc.fnc));
+            parse_embed(qw(parts/embed.fnc parts/apidoc.fnc parts/ppport.fnc));
 
 my(%provides, %prototypes, %explicit);
 
@@ -50,12 +50,12 @@ $data =~ s{^(.*)__PROVIDED_API__(\s*?)^}
   my $format = sprintf '%%-%ds  %%-%ds  %%s', $len+2, $len+5;
   $len = 3*$len + 23;
 
-$data =~ s/^(.*)__EXPLICIT_API__(\s*?)^/
-           sprintf("$1$format\n", 'Function', 'Static Request', 'Global Request') .
+$data =~ s!^(.*)__EXPLICIT_API__(\s*?)^!
+           sprintf("$1$format\n", 'Function / Variable', 'Static Request', 'Global Request') .
            $1 . '-'x$len . "\n" .
-           join('', map { sprintf "$1$format\n", "$_()", "NEED_$_", "NEED_${_}_GLOBAL" }
+           join('', map { sprintf "$1$format\n", $explicit{$_} eq 'var' ? $_ : "$_()", "NEED_$_", "NEED_${_}_GLOBAL" }
                     sort keys %explicit)
-          /gem;
+          !gem;
 }
 
 my %raw_base = %{&parse_todo('parts/base')};
@@ -68,7 +68,7 @@ for (keys %raw_todo) {
 
 # check consistency
 for (@api) {
-  if (exists $raw_todo{$_}) {
+  if (exists $raw_todo{$_} and exists $raw_base{$_}) {
     if ($raw_base{$_} eq $raw_todo{$_}) {
       warn "$INCLUDE/$provides{$_} provides $_, which is still marked "
            . "todo for " . format_version($raw_todo{$_}) . "\n";
@@ -82,6 +82,7 @@ for (@api) {
 
 my @perl_api;
 for (keys %provides) {
+  next if /^Perl_(.*)/ && exists $embed{$1};
   next if exists $embed{$_};
   push @perl_api, $_;
   check(2, "No API definition for provided element $_ found.");
@@ -125,7 +126,7 @@ $data =~ s{^__UNSUPPORTED_API__(\s*?)^}
           {join "\n", @todo}gem;
 
 $data =~ s{__MIN_PERL__}{5.003}g;
-$data =~ s{__MAX_PERL__}{5.9.3}g;
+$data =~ s{__MAX_PERL__}{5.10.0}g;
 
 open FH, ">PPPort.pm" or die "PPPort.pm: $!\n";
 print FH $data;
@@ -188,6 +189,32 @@ sub expand
               )
             \s*$}
             {expand_undefined($2, $1, $3)}gemx;
+  $code =~ s{^([^\S\r\n]*)__NEED_VAR__\s+(.*?)\s+(\w+)(?:\s*=\s*([^;]+?)\s*;\s*)?$}
+            {expand_need_var($1, $3, $2, $4)}gem;
+  return $code;
+}
+
+sub expand_need_var
+{
+  my($indent, $var, $type, $init) = @_;
+
+  $explicit{$var} = 'var';
+
+  my $myvar = "$DPPP(my_$var)";
+
+  my $code = <<ENDCODE;
+#if defined(NEED_$var)
+static $type $myvar = $init;
+#elif defined(NEED_${var}_GLOBAL)
+$type $myvar = $init;
+#else
+extern $type $myvar;
+#endif
+#define $var $myvar
+ENDCODE
+
+  $code =~ s/^/$indent/mg;
+
   return $code;
 }
 
@@ -219,7 +246,7 @@ sub expand_pp_expr
 {
   my $expr = shift;
 
-  if ($expr =~ /^\s*need\s*(\w+)\s*$/i) {
+  if ($expr =~ /^\s*need\s+(\w+)\s*$/i) {
     my $func = $1;
     my $e = $embed{$func} or die "unknown API function '$func' in NEED\n";
     my $proto = make_prototype($e);
@@ -233,7 +260,7 @@ sub expand_pp_expr
       warn "found no prototype for $func\n";;
     }
 
-    $explicit{$func} = 1;
+    $explicit{$func} = 'func';
 
     $proto =~ s/\b$func(?=\s*\()/$DPPP(my_$func)/;
     my $embed = make_embed($e);
@@ -258,6 +285,7 @@ sub make_embed
   my $f = shift;
   my $n = $f->{name};
   my $a = do { my $x = 'a'; join ',', map { $x++ } 1 .. @{$f->{args}} };
+  my $lastarg = ${$f->{args}}[-1];
 
   if ($f->{flags}{n}) {
     if ($f->{flags}{p}) {
@@ -278,6 +306,10 @@ UNDEF
       if ($f->{flags}{f}) {
         return "#define Perl_$n $DPPP(my_$n)";
       }
+      elsif (@$lastarg && $lastarg->[0] =~ /\.\.\./) {
+        return $undef . "#define $n $DPPP(my_$n)\n" .
+                        "#define Perl_$n $DPPP(my_$n)";
+      }
       else {
         return $undef . "#define $n($a) $DPPP(my_$n)(aTHX_ $a)\n" .
                         "#define Perl_$n $DPPP(my_$n)";
@@ -303,19 +335,23 @@ __DATA__
 #
 #  !!!!! Do NOT edit this file directly! -- Edit PPPort_pm.PL instead. !!!!!
 #
+#  This file was automatically generated from the definition files in the
+#  parts/inc/ subdirectory by PPPort_pm.PL. To learn more about how all this
+#  works, please read the F<HACKERS> file that came with this distribution.
+#
 ################################################################################
 #
 #  Perl/Pollution/Portability
 #
 ################################################################################
 #
-#  $Revision: 36 $
+#  $Revision: 59 $
 #  $Author: mhx $
-#  $Date: 2005/06/25 17:56:28 +0200 $
+#  $Date: 2008/01/04 10:47:38 +0100 $
 #
 ################################################################################
 #
-#  Version 3.x, Copyright (C) 2004-2005, Marcus Holland-Moritz.
+#  Version 3.x, Copyright (C) 2004-2008, Marcus Holland-Moritz.
 #  Version 2.x, Copyright (C) 2001, Paul Marquess.
 #  Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
 #
@@ -452,7 +488,7 @@ Version 3.x was ported back to CPAN by Marcus Holland-Moritz.
 
 =head1 COPYRIGHT
 
-Version 3.x, Copyright (C) 2004-2005, Marcus Holland-Moritz.
+Version 3.x, Copyright (C) 2004-2008, Marcus Holland-Moritz.
 
 Version 2.x, Copyright (C) 2001, Paul Marquess.
 
@@ -469,24 +505,17 @@ See L<h2xs>, L<ppport.h>.
 
 package Devel::PPPort;
 
-require DynaLoader;
 use strict;
-use vars qw($VERSION @ISA $data);
-
-$VERSION = do { my @r = '$Snapshot: /Devel-PPPort/3.06_01 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' };
+use vars qw($VERSION $data);
 
-@ISA = qw(DynaLoader);
-
-bootstrap Devel::PPPort;
+$VERSION = do { my @r = '$Snapshot: /Devel-PPPort/3.14 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' };
 
 sub _init_data
 {
   $data = do { local $/; <DATA> };
-  my $now = localtime;
   my $pkg = 'Devel::PPPort';
   $data =~ s/__PERL_VERSION__/$]/g;
   $data =~ s/__VERSION__/$VERSION/g;
-  $data =~ s/__DATE__/$now/g;
   $data =~ s/__PKG__/$pkg/g;
   $data =~ s/^\|>//gm;
 }
@@ -516,8 +545,7 @@ __DATA__
 
     ppport.h -- Perl/Pollution/Portability Version __VERSION__
 
-    Automatically created by __PKG__ running under
-    perl __PERL_VERSION__ on __DATE__.
+    Automatically created by __PKG__ running under perl __PERL_VERSION__.
 
     Do NOT edit this file directly! -- Edit PPPort_pm.PL and the
     includes in parts/inc/ instead.
@@ -551,8 +579,12 @@ __DATA__
 
 %include uv
 
+%include memory
+
 %include misc
 
+%include variables
+
 %include threads
 
 %include mPUSH
@@ -567,18 +599,34 @@ __DATA__
 
 %include format
 
+%include SvREFCNT
+
+%include newSVpv
+
 %include SvPV
 
+%include Sv_set
+
 %include sv_xpvf
 
+%include shared_pv
+
+%include warn
+
+%include pvs
+
 %include magic
 
 %include cop
 
 %include grok
 
+%include snprintf
+
 %include exception
 
+%include strlfuncs
+
 #endif /* _P_P_PORTABILITY_H_ */
 
 /* End of File ppport.h */