stray tweak
[p5sagit/p5-mst-13.2.git] / embed.pl
index 68a15df..52c93ab 100755 (executable)
--- a/embed.pl
+++ b/embed.pl
@@ -2,6 +2,25 @@
 
 require 5.003;
 
+# XXX others that may need adding
+#       warnhook
+#       hints
+#       copline
+my @extvars = qw(sv_undef sv_yes sv_no na dowarn
+                 curcop compiling 
+                 tainting tainted stack_base stack_sp sv_arenaroot
+                 curstash DBsub DBsingle debstash
+                 rsfp 
+                 stdingv
+                defgv
+                errgv
+                rsfp_filters
+                perldb
+                diehook
+                dirty
+                perl_destruct_level
+                );
+
 sub readsyms (\%$) {
     my ($syms, $file) = @_;
     %$syms = ();
@@ -18,7 +37,56 @@ sub readsyms (\%$) {
 }
 
 readsyms %global, 'global.sym';
-readsyms %interp, 'interp.sym';
+
+sub readvars(\%$$) {
+    my ($syms, $file,$pre) = @_;
+    %$syms = ();
+    local (*FILE, $_);
+    open(FILE, "< $file")
+       or die "embed.pl: Can't open $file: $!\n";
+    while (<FILE>) {
+       s/[ \t]*#.*//;          # Delete comments.
+       if (/PERLVARI?C?\($pre(\w+)/) {
+           $$syms{$1} = 1;
+       }
+    }
+    close(FILE);
+}
+
+my %intrp;
+my %thread;
+
+readvars %intrp,  'intrpvar.h','I';
+readvars %thread, 'thrdvar.h','T';
+readvars %globvar, 'perlvars.h','G';
+
+foreach my $sym (sort keys %intrp)
+ {
+  if (exists $global{$sym})
+   {
+    delete $global{$sym};
+    warn "$sym in global.sym as well as intrpvar.h\n";
+   }
+ }
+
+foreach my $sym (sort keys %globvar)
+ {
+  if (exists $global{$sym})
+   {
+    delete $global{$sym};
+    warn "$sym in global.sym as well as perlvars.h\n";
+   }
+ }
+
+foreach my $sym (sort keys %thread)
+ {
+  warn "$sym in intrpvar.h as well as thrdvar.h\n" if exists $intrp{$sym};
+  if (exists $global{$sym})
+   {
+    delete $global{$sym};
+    warn "$sym in global.sym as well as thrdvar.h\n";
+   }
+ }
 
 sub hide ($$) {
     my ($from, $to) = @_;
@@ -29,13 +97,19 @@ sub embed ($) {
     my ($sym) = @_;
     hide($sym, "Perl_$sym");
 }
-sub multon ($) {
+sub embedvar ($) {
     my ($sym) = @_;
-    hide($sym, "(curinterp->I$sym)");
+#   hide($sym, "Perl_$sym");
+    return '';
 }
-sub multoff ($) {
-    my ($sym) = @_;
-    hide("I$sym", $sym);
+
+sub multon ($$$) {
+    my ($sym,$pre,$ptr) = @_;
+    hide("PL_$sym", "($ptr$pre$sym)");
+}
+sub multoff ($$) {
+    my ($sym,$pre) = @_;
+    return hide("PL_$pre$sym", "PL_$sym");
 }
 
 unlink 'embed.h';
@@ -44,8 +118,8 @@ open(EM, '> embed.h')
 
 print EM <<'END';
 /* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-   This file is built by embed.pl from global.sym and interp.sym.
-   Any changes made here will be lost!
+   This file is built by embed.pl from global.sym, intrpvar.h,
+   and thrdvar.h.  Any changes made here will be lost!
 */
 
 /* (Doing namespace management portably in C is really gross.) */
@@ -70,19 +144,57 @@ for $sym (sort keys %global) {
     print EM embed($sym);
 }
 
-
 print EM <<'END';
 
 #endif /* EMBED */
 
+END
+
+close(EM);
+
+unlink 'embedvar.h';
+open(EM, '> embedvar.h')
+    or die "Can't create embedvar.h: $!\n";
+
+print EM <<'END';
+/* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+   This file is built by embed.pl from global.sym, intrpvar.h,
+   and thrdvar.h.  Any changes made here will be lost!
+*/
+
+/* (Doing namespace management portably in C is really gross.) */
+
+/*  EMBED has no run-time penalty, but helps keep the Perl namespace
+    from colliding with that used by other libraries pulled in
+    by extensions or by embedding perl.  Allow a cc -DNO_EMBED
+    override, however, to keep binary compatability with previous
+    versions of perl.
+*/
+
+
 /* Put interpreter-specific symbols into a struct? */
 
 #ifdef MULTIPLICITY
 
+#ifndef USE_THREADS
+/* If we do not have threads then per-thread vars are per-interpreter */
+
+END
+
+for $sym (sort keys %thread) {
+    print EM multon($sym,'T','PL_curinterp->');
+}
+
+print EM <<'END';
+
+#endif /* !USE_THREADS */
+
+/* These are always per-interpreter if there is more than one */
+
 END
 
-for $sym (sort keys %interp) {
-    print EM multon($sym);
+for $sym (sort keys %intrp) {
+    print EM multon($sym,'I','PL_curinterp->');
 }
 
 print EM <<'END';
@@ -91,25 +203,113 @@ print EM <<'END';
 
 END
 
-for $sym (sort keys %interp) {
-    print EM multoff($sym);
+for $sym (sort keys %intrp) {
+    print EM multoff($sym,'I');
+}
+
+print EM <<'END';
+
+#ifndef USE_THREADS
+
+END
+
+for $sym (sort keys %thread) {
+    print EM multoff($sym,'T');
 }
 
 print EM <<'END';
 
-/* Hide interpreter-specific symbols? */
+#endif /* USE_THREADS */
+
+/* Hide what would have been interpreter-specific symbols? */
 
 #ifdef EMBED
 
 END
 
-for $sym (sort keys %interp) {
-    print EM embed($sym);
+for $sym (sort keys %intrp) {
+    print EM embedvar($sym);
+}
+
+print EM <<'END';
+
+#ifndef USE_THREADS
+
+END
+
+for $sym (sort keys %thread) {
+    print EM embedvar($sym);
 }
 
 print EM <<'END';
 
+#endif /* USE_THREADS */
 #endif /* EMBED */
 #endif /* MULTIPLICITY */
+
+/* Now same trickey for per-thread variables */
+
+#ifdef USE_THREADS
+
+END
+
+for $sym (sort keys %thread) {
+    print EM multon($sym,'T','thr->');
+}
+
+print EM <<'END';
+
+#endif /* USE_THREADS */
+
+#ifdef PERL_GLOBAL_STRUCT
+
+END
+
+for $sym (sort keys %globvar) {
+    print EM multon($sym,'G','PL_Vars.');
+}
+
+print EM <<'END';
+
+#else /* !PERL_GLOBAL_STRUCT */
+
 END
 
+for $sym (sort keys %globvar) {
+    print EM multoff($sym,'G');
+}
+
+print EM <<'END';
+
+#ifdef EMBED
+
+END
+
+for $sym (sort keys %globvar) {
+    print EM embedvar($sym);
+}
+
+print EM <<'END';
+
+#endif /* EMBED */
+#endif /* PERL_GLOBAL_STRUCT */
+
+END
+
+print EM <<'END';
+
+#if 0 /* ndef MIN_PERL_DEFINE */       /* unsupported in 5.006 */
+
+END
+
+for $sym (sort @extvars) {
+    print EM hide($sym,"PL_$sym");
+}
+
+print EM <<'END';
+
+#endif /* MIN_PERL_DEFINE */
+END
+
+
+close(EM);