bump-perl-version missed "perl5.10.0" style strings
[p5sagit/p5-mst-13.2.git] / embed.pl
CommitLineData
5f05dabc 1#!/usr/bin/perl -w
6294c161 2#
3# Regenerate (overwriting only if changed):
4#
5# embed.h
6# embedvar.h
7# global.sym
8# perlapi.c
9# perlapi.h
10# proto.h
11#
12# from information stored in
13#
14# embed.fnc
15# intrpvar.h
16# perlvars.h
17# pp.sym (which has been generated by opcode.pl)
18#
19# plus from the values hardcoded into this script in @extvars.
20#
21# Accepts the standard regen_lib -q and -v args.
22#
23# This script is normally invoked from regen.pl.
e50aee73 24
954c1994 25require 5.003; # keep this compatible, an old perl is all we may have before
26 # we build the new one
5f05dabc 27
88e01c9d 28use strict;
29
36bb303b 30BEGIN {
31 # Get function prototypes
9ad884cb 32 require 'regen_lib.pl';
36bb303b 33}
34
88e01c9d 35my $SPLINT = 0; # Turn true for experimental splint support http://www.splint.org
36
cea2e8a9 37#
346f75ff 38# See database of global and static function prototypes in embed.fnc
cea2e8a9 39# This is used to generate prototype headers under various configurations,
40# export symbols lists for different platforms, and macros to provide an
41# implicit interpreter context argument.
42#
43
7f1be197 44sub do_not_edit ($)
45{
46 my $file = shift;
4373e329 47
83706693 48 my $years = '1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009';
4bb101f2 49
50 $years =~ s/1999,/1999,\n / if length $years > 40;
51
7f1be197 52 my $warning = <<EOW;
37442d52 53 -*- buffer-read-only: t -*-
7f1be197 54
55 $file
56
4bb101f2 57 Copyright (C) $years, by Larry Wall and others
7f1be197 58
59 You may distribute under the terms of either the GNU General Public
60 License or the Artistic License, as specified in the README file.
61
62!!!!!!! DO NOT EDIT THIS FILE !!!!!!!
63This file is built by embed.pl from data in embed.fnc, embed.pl,
907b3e23 64pp.sym, intrpvar.h, and perlvars.h.
7f1be197 65Any changes made here will be lost!
66
67Edit those files and run 'make regen_headers' to effect changes.
68
69EOW
70
cfa0b873 71 $warning .= <<EOW if $file eq 'perlapi.c';
72
73Up to the threshold of the door there mounted a flight of twenty-seven
74broad stairs, hewn by some unknown art of the same black stone. This
4ac71550 75was the only entrance to the tower; ...
76
77 [p.577 of _The Lord of the Rings_, III/x: "The Voice of Saruman"]
cfa0b873 78
79
80EOW
81
7f1be197 82 if ($file =~ m:\.[ch]$:) {
0ea9712b 83 $warning =~ s:^: * :gm;
84 $warning =~ s: +$::gm;
85 $warning =~ s: :/:;
86 $warning =~ s:$:/:;
7f1be197 87 }
88 else {
0ea9712b 89 $warning =~ s:^:# :gm;
90 $warning =~ s: +$::gm;
7f1be197 91 }
92 $warning;
93} # do_not_edit
94
94bdecf9 95open IN, "embed.fnc" or die $!;
cea2e8a9 96
97# walk table providing an array of components in each line to
98# subroutine, printing the result
99sub walk_table (&@) {
100 my $function = shift;
101 my $filename = shift || '-';
0ea9712b 102 my $leader = shift;
103 defined $leader or $leader = do_not_edit ($filename);
cea2e8a9 104 my $trailer = shift;
105 my $F;
cea2e8a9 106 if (ref $filename) { # filehandle
107 $F = $filename;
108 }
109 else {
b6b9a099 110 # safer_unlink $filename if $filename ne '/dev/null';
424a4936 111 $F = safer_open("$filename-new");
cea2e8a9 112 }
113 print $F $leader if $leader;
94bdecf9 114 seek IN, 0, 0; # so we may restart
115 while (<IN>) {
cea2e8a9 116 chomp;
1d7c1841 117 next if /^:/;
cea2e8a9 118 while (s|\\$||) {
94bdecf9 119 $_ .= <IN>;
cea2e8a9 120 chomp;
121 }
23f1b5c3 122 s/\s+$//;
cea2e8a9 123 my @args;
124 if (/^\s*(#|$)/) {
125 @args = $_;
126 }
127 else {
128 @args = split /\s*\|\s*/, $_;
129 }
4373e329 130 my @outs = &{$function}(@args);
131 print $F @outs; # $function->(@args) is not 5.003
cea2e8a9 132 }
133 print $F $trailer if $trailer;
36bb303b 134 unless (ref $filename) {
08858ed2 135 safer_close($F);
424a4936 136 rename_if_different("$filename-new", $filename);
36bb303b 137 }
cea2e8a9 138}
139
140sub munge_c_files () {
141 my $functions = {};
142 unless (@ARGV) {
4373e329 143 warn "\@ARGV empty, nothing to do\n";
cea2e8a9 144 return;
145 }
146 walk_table {
147 if (@_ > 1) {
148 $functions->{$_[2]} = \@_ if $_[@_-1] =~ /\.\.\./;
149 }
37442d52 150 } '/dev/null', '', '';
cea2e8a9 151 local $^I = '.bak';
152 while (<>) {
cea2e8a9 153 s{(\b(\w+)[ \t]*\([ \t]*(?!aTHX))}
154 {
155 my $repl = $1;
156 my $f = $2;
157 if (exists $functions->{$f}) {
158 $repl .= "aTHX_ ";
159 warn("$ARGV:$.:$`#$repl#$'");
160 }
161 $repl;
162 }eg;
163 print;
164 close ARGV if eof; # restart $.
165 }
166 exit;
167}
168
169#munge_c_files();
170
171# generate proto.h
0cb96387 172my $wrote_protected = 0;
173
cea2e8a9 174sub write_protos {
175 my $ret = "";
176 if (@_ == 1) {
177 my $arg = shift;
1d7c1841 178 $ret .= "$arg\n";
cea2e8a9 179 }
180 else {
7918f24d 181 my ($flags,$retval,$plain_func,@args) = @_;
4373e329 182 my @nonnull;
183 my $has_context = ( $flags !~ /n/ );
88e01c9d 184 my $never_returns = ( $flags =~ /r/ );
185 my $commented_out = ( $flags =~ /m/ );
aa4ca557 186 my $binarycompat = ( $flags =~ /b/ );
88e01c9d 187 my $is_malloc = ( $flags =~ /a/ );
188 my $can_ignore = ( $flags !~ /R/ ) && !$is_malloc;
7918f24d 189 my @names_of_nn;
190 my $func;
88e01c9d 191
192 my $splint_flags = "";
193 if ( $SPLINT && !$commented_out ) {
194 $splint_flags .= '/*@noreturn@*/ ' if $never_returns;
195 if ($can_ignore && ($retval ne 'void') && ($retval !~ /\*/)) {
196 $retval .= " /*\@alt void\@*/";
197 }
198 }
199
cea2e8a9 200 if ($flags =~ /s/) {
88e01c9d 201 $retval = "STATIC $splint_flags$retval";
7918f24d 202 $func = "S_$plain_func";
cea2e8a9 203 }
0cb96387 204 else {
88e01c9d 205 $retval = "PERL_CALLCONV $splint_flags$retval";
25b0f989 206 if ($flags =~ /[bp]/) {
7918f24d 207 $func = "Perl_$plain_func";
208 } else {
209 $func = $plain_func;
0cb96387 210 }
cea2e8a9 211 }
212 $ret .= "$retval\t$func(";
4373e329 213 if ( $has_context ) {
214 $ret .= @args ? "pTHX_ " : "pTHX";
cea2e8a9 215 }
216 if (@args) {
4373e329 217 my $n;
218 for my $arg ( @args ) {
219 ++$n;
7827dc65 220 if ( $arg =~ /\*/ && $arg !~ /\b(NN|NULLOK)\b/ ) {
221 warn "$func: $arg needs NN or NULLOK\n";
222 our $unflagged_pointers;
223 ++$unflagged_pointers;
224 }
88e01c9d 225 my $nn = ( $arg =~ s/\s*\bNN\b\s+// );
226 push( @nonnull, $n ) if $nn;
227
228 my $nullok = ( $arg =~ s/\s*\bNULLOK\b\s+// ); # strip NULLOK with no effect
c48640ec 229
230 # Make sure each arg has at least a type and a var name.
231 # An arg of "int" is valid C, but want it to be "int foo".
232 my $temp_arg = $arg;
233 $temp_arg =~ s/\*//g;
234 $temp_arg =~ s/\s*\bstruct\b\s*/ /g;
7918f24d 235 if ( ($temp_arg ne "...")
236 && ($temp_arg !~ /\w+\s+(\w+)(?:\[\d+\])?\s*$/) ) {
237 warn "$func: $arg ($n) doesn't have a name\n";
c48640ec 238 }
88e01c9d 239 if ( $SPLINT && $nullok && !$commented_out ) {
240 $arg = '/*@null@*/ ' . $arg;
241 }
aa4ca557 242 if (defined $1 && $nn && !($commented_out && !$binarycompat)) {
7918f24d 243 push @names_of_nn, $1;
244 }
4373e329 245 }
cea2e8a9 246 $ret .= join ", ", @args;
247 }
248 else {
4373e329 249 $ret .= "void" if !$has_context;
cea2e8a9 250 }
251 $ret .= ")";
f54cb97a 252 my @attrs;
253 if ( $flags =~ /r/ ) {
abb2c242 254 push @attrs, "__attribute__noreturn__";
f54cb97a 255 }
88e01c9d 256 if ( $is_malloc ) {
abb2c242 257 push @attrs, "__attribute__malloc__";
f54cb97a 258 }
88e01c9d 259 if ( !$can_ignore ) {
abb2c242 260 push @attrs, "__attribute__warn_unused_result__";
f54cb97a 261 }
262 if ( $flags =~ /P/ ) {
abb2c242 263 push @attrs, "__attribute__pure__";
f54cb97a 264 }
1c846c1f 265 if( $flags =~ /f/ ) {
cdfeb707 266 my $prefix = $has_context ? 'pTHX_' : '';
267 my $args = scalar @args;
268 my $pat = $args - 1;
269 my $macro = @nonnull && $nonnull[-1] == $pat
270 ? '__attribute__format__'
271 : '__attribute__format__null_ok__';
272 push @attrs, sprintf "%s(__printf__,%s%d,%s%d)", $macro,
273 $prefix, $pat, $prefix, $args;
894356b3 274 }
4373e329 275 if ( @nonnull ) {
3d42dc86 276 my @pos = map { $has_context ? "pTHX_$_" : $_ } @nonnull;
abb2c242 277 push @attrs, map { sprintf( "__attribute__nonnull__(%s)", $_ ) } @pos;
f54cb97a 278 }
279 if ( @attrs ) {
280 $ret .= "\n";
281 $ret .= join( "\n", map { "\t\t\t$_" } @attrs );
4373e329 282 }
af3c7592 283 $ret .= ";";
88e01c9d 284 $ret = "/* $ret */" if $commented_out;
7918f24d 285 if (@names_of_nn) {
286 $ret .= "\n#define PERL_ARGS_ASSERT_\U$plain_func\E\t\\\n\t"
287 . join '; ', map "assert($_)", @names_of_nn;
288 }
f54cb97a 289 $ret .= @attrs ? "\n\n" : "\n";
cea2e8a9 290 }
291 $ret;
292}
293
2b10efc6 294# generates global.sym (API export list)
295{
296 my %seen;
297 sub write_global_sym {
298 my $ret = "";
299 if (@_ > 1) {
300 my ($flags,$retval,$func,@args) = @_;
301 # If a function is defined twice, for example before and after an
302 # #else, only process the flags on the first instance for global.sym
303 return $ret if $seen{$func}++;
304 if ($flags =~ /[AX]/ && $flags !~ /[xm]/
305 || $flags =~ /b/) { # public API, so export
306 $func = "Perl_$func" if $flags =~ /[pbX]/;
307 $ret = "$func\n";
308 }
309 }
310 $ret;
311 }
cea2e8a9 312}
313
2b10efc6 314
7827dc65 315our $unflagged_pointers;
37442d52 316walk_table(\&write_protos, "proto.h", undef, "/* ex: set ro: */\n");
7827dc65 317warn "$unflagged_pointers pointer arguments to clean up\n" if $unflagged_pointers;
37442d52 318walk_table(\&write_global_sym, "global.sym", undef, "# ex: set ro:\n");
cea2e8a9 319
709f4e38 320# XXX others that may need adding
321# warnhook
322# hints
323# copline
84fee439 324my @extvars = qw(sv_undef sv_yes sv_no na dowarn
4373e329 325 curcop compiling
326 tainting tainted stack_base stack_sp sv_arenaroot
256a4781 327 no_modify
4373e329 328 curstash DBsub DBsingle DBassertion debstash
329 rsfp
330 stdingv
6b88bc9c 331 defgv
332 errgv
3070f6ec 333 rsfp_filters
334 perldb
709f4e38 335 diehook
336 dirty
337 perl_destruct_level
ac634a9a 338 ppaddr
84fee439 339 );
340
5f05dabc 341sub readsyms (\%$) {
342 my ($syms, $file) = @_;
5f05dabc 343 local (*FILE, $_);
344 open(FILE, "< $file")
345 or die "embed.pl: Can't open $file: $!\n";
346 while (<FILE>) {
347 s/[ \t]*#.*//; # Delete comments.
348 if (/^\s*(\S+)\s*$/) {
22c35a8c 349 my $sym = $1;
d1594dd0 350 warn "duplicate symbol $sym while processing $file line $.\n"
22c35a8c 351 if exists $$syms{$sym};
352 $$syms{$sym} = 1;
5f05dabc 353 }
354 }
355 close(FILE);
356}
357
cea2e8a9 358# Perl_pp_* and Perl_ck_* are in pp.sym
359readsyms my %ppsym, 'pp.sym';
5f05dabc 360
c6af7a1a 361sub readvars(\%$$@) {
362 my ($syms, $file,$pre,$keep_pre) = @_;
d4cce5f1 363 local (*FILE, $_);
364 open(FILE, "< $file")
365 or die "embed.pl: Can't open $file: $!\n";
366 while (<FILE>) {
367 s/[ \t]*#.*//; # Delete comments.
27da23d5 368 if (/PERLVARA?I?S?C?\($pre(\w+)/) {
22c35a8c 369 my $sym = $1;
c6af7a1a 370 $sym = $pre . $sym if $keep_pre;
d1594dd0 371 warn "duplicate symbol $sym while processing $file line $.\n"
22c35a8c 372 if exists $$syms{$sym};
51371543 373 $$syms{$sym} = $pre || 1;
d4cce5f1 374 }
375 }
376 close(FILE);
377}
378
379my %intrp;
88e01c9d 380my %globvar;
d4cce5f1 381
382readvars %intrp, 'intrpvar.h','I';
22239a37 383readvars %globvar, 'perlvars.h','G';
d4cce5f1 384
4543f4c0 385my $sym;
d4cce5f1 386
c6af7a1a 387sub undefine ($) {
388 my ($sym) = @_;
389 "#undef $sym\n";
390}
391
5f05dabc 392sub hide ($$) {
393 my ($from, $to) = @_;
394 my $t = int(length($from) / 8);
395 "#define $from" . "\t" x ($t < 3 ? 3 - $t : 1) . "$to\n";
396}
c6af7a1a 397
6f4183fe 398sub bincompat_var ($$) {
51371543 399 my ($pfx, $sym) = @_;
acfe0abc 400 my $arg = ($pfx eq 'G' ? 'NULL' : 'aTHX');
c5be433b 401 undefine("PL_$sym") . hide("PL_$sym", "(*Perl_${pfx}${sym}_ptr($arg))");
c6af7a1a 402}
403
d4cce5f1 404sub multon ($$$) {
405 my ($sym,$pre,$ptr) = @_;
3280af22 406 hide("PL_$sym", "($ptr$pre$sym)");
5f05dabc 407}
54aff467 408
d4cce5f1 409sub multoff ($$) {
410 my ($sym,$pre) = @_;
533c011a 411 return hide("PL_$pre$sym", "PL_$sym");
5f05dabc 412}
413
424a4936 414my $em = safer_open('embed.h-new');
e50aee73 415
424a4936 416print $em do_not_edit ("embed.h"), <<'END';
e50aee73 417
418/* (Doing namespace management portably in C is really gross.) */
419
d51482e4 420/* By defining PERL_NO_SHORT_NAMES (not done by default) the short forms
421 * (like warn instead of Perl_warn) for the API are not defined.
422 * Not defining the short forms is a good thing for cleaner embedding. */
423
424#ifndef PERL_NO_SHORT_NAMES
820c3be9 425
22c35a8c 426/* Hide global symbols */
5f05dabc 427
cea2e8a9 428#if !defined(PERL_IMPLICIT_CONTEXT)
e50aee73 429
e50aee73 430END
431
da4ddda1 432# Try to elimiate lots of repeated
433# #ifdef PERL_CORE
434# foo
435# #endif
436# #ifdef PERL_CORE
437# bar
438# #endif
439# by tracking state and merging foo and bar into one block.
440my $ifdef_state = '';
441
cea2e8a9 442walk_table {
443 my $ret = "";
da4ddda1 444 my $new_ifdef_state = '';
cea2e8a9 445 if (@_ == 1) {
446 my $arg = shift;
12a98ad5 447 $ret .= "$arg\n" if $arg =~ /^#\s*(if|ifn?def|else|endif)\b/;
cea2e8a9 448 }
449 else {
450 my ($flags,$retval,$func,@args) = @_;
af3c7592 451 unless ($flags =~ /[om]/) {
cea2e8a9 452 if ($flags =~ /s/) {
453 $ret .= hide($func,"S_$func");
454 }
455 elsif ($flags =~ /p/) {
456 $ret .= hide($func,"Perl_$func");
457 }
458 }
47e67c64 459 if ($ret ne '' && $flags !~ /A/) {
de37762f 460 if ($flags =~ /E/) {
da4ddda1 461 $new_ifdef_state
462 = "#if defined(PERL_CORE) || defined(PERL_EXT)\n";
463 }
464 else {
465 $new_ifdef_state = "#ifdef PERL_CORE\n";
466 }
467
468 if ($new_ifdef_state ne $ifdef_state) {
469 $ret = $new_ifdef_state . $ret;
de37762f 470 }
471 }
cea2e8a9 472 }
da4ddda1 473 if ($ifdef_state && $new_ifdef_state ne $ifdef_state) {
474 # Close the old one ahead of opening the new one.
475 $ret = "#endif\n$ret";
476 }
477 # Remember the new state.
478 $ifdef_state = $new_ifdef_state;
cea2e8a9 479 $ret;
424a4936 480} $em, "";
cea2e8a9 481
da4ddda1 482if ($ifdef_state) {
424a4936 483 print $em "#endif\n";
da4ddda1 484}
485
cea2e8a9 486for $sym (sort keys %ppsym) {
487 $sym =~ s/^Perl_//;
424a4936 488 print $em hide($sym, "Perl_$sym");
cea2e8a9 489}
490
424a4936 491print $em <<'END';
cea2e8a9 492
493#else /* PERL_IMPLICIT_CONTEXT */
494
495END
496
497my @az = ('a'..'z');
498
da4ddda1 499$ifdef_state = '';
cea2e8a9 500walk_table {
501 my $ret = "";
da4ddda1 502 my $new_ifdef_state = '';
cea2e8a9 503 if (@_ == 1) {
504 my $arg = shift;
12a98ad5 505 $ret .= "$arg\n" if $arg =~ /^#\s*(if|ifn?def|else|endif)\b/;
cea2e8a9 506 }
507 else {
508 my ($flags,$retval,$func,@args) = @_;
af3c7592 509 unless ($flags =~ /[om]/) {
cea2e8a9 510 my $args = scalar @args;
511 if ($args and $args[$args-1] =~ /\.\.\./) {
512 # we're out of luck for varargs functions under CPP
513 }
514 elsif ($flags =~ /n/) {
515 if ($flags =~ /s/) {
516 $ret .= hide($func,"S_$func");
517 }
518 elsif ($flags =~ /p/) {
519 $ret .= hide($func,"Perl_$func");
520 }
521 }
522 else {
523 my $alist = join(",", @az[0..$args-1]);
524 $ret = "#define $func($alist)";
525 my $t = int(length($ret) / 8);
526 $ret .= "\t" x ($t < 4 ? 4 - $t : 1);
527 if ($flags =~ /s/) {
528 $ret .= "S_$func(aTHX";
529 }
530 elsif ($flags =~ /p/) {
531 $ret .= "Perl_$func(aTHX";
532 }
533 $ret .= "_ " if $alist;
534 $ret .= $alist . ")\n";
535 }
536 }
da4ddda1 537 unless ($flags =~ /A/) {
de37762f 538 if ($flags =~ /E/) {
da4ddda1 539 $new_ifdef_state
540 = "#if defined(PERL_CORE) || defined(PERL_EXT)\n";
541 }
542 else {
543 $new_ifdef_state = "#ifdef PERL_CORE\n";
544 }
545
546 if ($new_ifdef_state ne $ifdef_state) {
547 $ret = $new_ifdef_state . $ret;
de37762f 548 }
549 }
cea2e8a9 550 }
da4ddda1 551 if ($ifdef_state && $new_ifdef_state ne $ifdef_state) {
552 # Close the old one ahead of opening the new one.
553 $ret = "#endif\n$ret";
554 }
555 # Remember the new state.
556 $ifdef_state = $new_ifdef_state;
cea2e8a9 557 $ret;
424a4936 558} $em, "";
cea2e8a9 559
da4ddda1 560if ($ifdef_state) {
424a4936 561 print $em "#endif\n";
da4ddda1 562}
563
cea2e8a9 564for $sym (sort keys %ppsym) {
565 $sym =~ s/^Perl_//;
566 if ($sym =~ /^ck_/) {
424a4936 567 print $em hide("$sym(a)", "Perl_$sym(aTHX_ a)");
cea2e8a9 568 }
569 elsif ($sym =~ /^pp_/) {
424a4936 570 print $em hide("$sym()", "Perl_$sym(aTHX)");
cea2e8a9 571 }
572 else {
573 warn "Illegal symbol '$sym' in pp.sym";
574 }
e50aee73 575}
576
424a4936 577print $em <<'END';
e50aee73 578
cea2e8a9 579#endif /* PERL_IMPLICIT_CONTEXT */
22c35a8c 580
d51482e4 581#endif /* #ifndef PERL_NO_SHORT_NAMES */
35209cc8 582
22c35a8c 583END
584
424a4936 585print $em <<'END';
22c35a8c 586
cea2e8a9 587/* Compatibility stubs. Compile extensions with -DPERL_NOCOMPAT to
588 disable them.
589 */
590
538feb02 591#if !defined(PERL_CORE)
5bc28da9 592# define sv_setptrobj(rv,ptr,name) sv_setref_iv(rv,name,PTR2IV(ptr))
a0714e2c 593# define sv_setptrref(rv,ptr) sv_setref_iv(rv,NULL,PTR2IV(ptr))
538feb02 594#endif
cea2e8a9 595
08e5223a 596#if !defined(PERL_CORE) && !defined(PERL_NOCOMPAT)
cea2e8a9 597
598/* Compatibility for various misnamed functions. All functions
599 in the API that begin with "perl_" (not "Perl_") take an explicit
600 interpreter context pointer.
601 The following are not like that, but since they had a "perl_"
602 prefix in previous versions, we provide compatibility macros.
603 */
65cec589 604# define perl_atexit(a,b) call_atexit(a,b)
605# define perl_call_argv(a,b,c) call_argv(a,b,c)
606# define perl_call_pv(a,b) call_pv(a,b)
607# define perl_call_method(a,b) call_method(a,b)
608# define perl_call_sv(a,b) call_sv(a,b)
609# define perl_eval_sv(a,b) eval_sv(a,b)
610# define perl_eval_pv(a,b) eval_pv(a,b)
611# define perl_require_pv(a) require_pv(a)
612# define perl_get_sv(a,b) get_sv(a,b)
613# define perl_get_av(a,b) get_av(a,b)
614# define perl_get_hv(a,b) get_hv(a,b)
615# define perl_get_cv(a,b) get_cv(a,b)
616# define perl_init_i18nl10n(a) init_i18nl10n(a)
617# define perl_init_i18nl14n(a) init_i18nl14n(a)
618# define perl_new_ctype(a) new_ctype(a)
619# define perl_new_collate(a) new_collate(a)
620# define perl_new_numeric(a) new_numeric(a)
cea2e8a9 621
622/* varargs functions can't be handled with CPP macros. :-(
623 This provides a set of compatibility functions that don't take
624 an extra argument but grab the context pointer using the macro
625 dTHX.
626 */
d51482e4 627#if defined(PERL_IMPLICIT_CONTEXT) && !defined(PERL_NO_SHORT_NAMES)
cea2e8a9 628# define croak Perl_croak_nocontext
c5be433b 629# define deb Perl_deb_nocontext
cea2e8a9 630# define die Perl_die_nocontext
631# define form Perl_form_nocontext
e4783991 632# define load_module Perl_load_module_nocontext
5a844595 633# define mess Perl_mess_nocontext
cea2e8a9 634# define newSVpvf Perl_newSVpvf_nocontext
635# define sv_catpvf Perl_sv_catpvf_nocontext
636# define sv_setpvf Perl_sv_setpvf_nocontext
637# define warn Perl_warn_nocontext
c5be433b 638# define warner Perl_warner_nocontext
cea2e8a9 639# define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext
640# define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext
641#endif
642
643#endif /* !defined(PERL_CORE) && !defined(PERL_NOCOMPAT) */
644
645#if !defined(PERL_IMPLICIT_CONTEXT)
646/* undefined symbols, point them back at the usual ones */
647# define Perl_croak_nocontext Perl_croak
648# define Perl_die_nocontext Perl_die
c5be433b 649# define Perl_deb_nocontext Perl_deb
cea2e8a9 650# define Perl_form_nocontext Perl_form
e4783991 651# define Perl_load_module_nocontext Perl_load_module
5a844595 652# define Perl_mess_nocontext Perl_mess
c5be433b 653# define Perl_newSVpvf_nocontext Perl_newSVpvf
654# define Perl_sv_catpvf_nocontext Perl_sv_catpvf
655# define Perl_sv_setpvf_nocontext Perl_sv_setpvf
cea2e8a9 656# define Perl_warn_nocontext Perl_warn
c5be433b 657# define Perl_warner_nocontext Perl_warner
cea2e8a9 658# define Perl_sv_catpvf_mg_nocontext Perl_sv_catpvf_mg
659# define Perl_sv_setpvf_mg_nocontext Perl_sv_setpvf_mg
660#endif
db5cf5a9 661
37442d52 662/* ex: set ro: */
d4cce5f1 663END
664
08858ed2 665safer_close($em);
424a4936 666rename_if_different('embed.h-new', 'embed.h');
d4cce5f1 667
424a4936 668$em = safer_open('embedvar.h-new');
d4cce5f1 669
424a4936 670print $em do_not_edit ("embedvar.h"), <<'END';
d4cce5f1 671
672/* (Doing namespace management portably in C is really gross.) */
673
54aff467 674/*
3db8f154 675 The following combinations of MULTIPLICITY and PERL_IMPLICIT_CONTEXT
676 are supported:
54aff467 677 1) none
678 2) MULTIPLICITY # supported for compatibility
679 3) MULTIPLICITY && PERL_IMPLICIT_CONTEXT
54aff467 680
681 All other combinations of these flags are errors.
682
3db8f154 683 only #3 is supported directly, while #2 is a special
54aff467 684 case of #3 (supported by redefining vTHX appropriately).
685*/
cea2e8a9 686
54aff467 687#if defined(MULTIPLICITY)
3db8f154 688/* cases 2 and 3 above */
cea2e8a9 689
54aff467 690# if defined(PERL_IMPLICIT_CONTEXT)
691# define vTHX aTHX
692# else
693# define vTHX PERL_GET_INTERP
694# endif
cea2e8a9 695
e50aee73 696END
697
d4cce5f1 698for $sym (sort keys %intrp) {
424a4936 699 print $em multon($sym,'I','vTHX->');
d4cce5f1 700}
701
424a4936 702print $em <<'END';
d4cce5f1 703
54aff467 704#else /* !MULTIPLICITY */
1d7c1841 705
3db8f154 706/* case 1 above */
5f05dabc 707
56d28764 708END
e50aee73 709
d4cce5f1 710for $sym (sort keys %intrp) {
424a4936 711 print $em multoff($sym,'I');
d4cce5f1 712}
713
424a4936 714print $em <<'END';
d4cce5f1 715
d4cce5f1 716END
717
424a4936 718print $em <<'END';
d4cce5f1 719
54aff467 720#endif /* MULTIPLICITY */
d4cce5f1 721
54aff467 722#if defined(PERL_GLOBAL_STRUCT)
22239a37 723
724END
725
726for $sym (sort keys %globvar) {
424a4936 727 print $em multon($sym, 'G','my_vars->');
728 print $em multon("G$sym",'', 'my_vars->');
22239a37 729}
730
424a4936 731print $em <<'END';
22239a37 732
733#else /* !PERL_GLOBAL_STRUCT */
734
735END
736
737for $sym (sort keys %globvar) {
424a4936 738 print $em multoff($sym,'G');
22239a37 739}
740
424a4936 741print $em <<'END';
22239a37 742
22239a37 743#endif /* PERL_GLOBAL_STRUCT */
744
85add8c2 745#ifdef PERL_POLLUTE /* disabled by default in 5.6.0 */
84fee439 746
747END
748
749for $sym (sort @extvars) {
424a4936 750 print $em hide($sym,"PL_$sym");
84fee439 751}
752
424a4936 753print $em <<'END';
84fee439 754
db5cf5a9 755#endif /* PERL_POLLUTE */
37442d52 756
757/* ex: set ro: */
84fee439 758END
759
08858ed2 760safer_close($em);
424a4936 761rename_if_different('embedvar.h-new', 'embedvar.h');
c6af7a1a 762
424a4936 763my $capi = safer_open('perlapi.c-new');
764my $capih = safer_open('perlapi.h-new');
51371543 765
424a4936 766print $capih do_not_edit ("perlapi.h"), <<'EOT';
51371543 767
51371543 768/* declare accessor functions for Perl variables */
6f4183fe 769#ifndef __perlapi_h__
770#define __perlapi_h__
51371543 771
acfe0abc 772#if defined (MULTIPLICITY)
c5be433b 773
51371543 774START_EXTERN_C
775
776#undef PERLVAR
777#undef PERLVARA
778#undef PERLVARI
779#undef PERLVARIC
27da23d5 780#undef PERLVARISC
acfe0abc 781#define PERLVAR(v,t) EXTERN_C t* Perl_##v##_ptr(pTHX);
51371543 782#define PERLVARA(v,n,t) typedef t PL_##v##_t[n]; \
acfe0abc 783 EXTERN_C PL_##v##_t* Perl_##v##_ptr(pTHX);
51371543 784#define PERLVARI(v,t,i) PERLVAR(v,t)
c5be433b 785#define PERLVARIC(v,t,i) PERLVAR(v, const t)
27da23d5 786#define PERLVARISC(v,i) typedef const char PL_##v##_t[sizeof(i)]; \
787 EXTERN_C PL_##v##_t* Perl_##v##_ptr(pTHX);
51371543 788
51371543 789#include "intrpvar.h"
790#include "perlvars.h"
791
792#undef PERLVAR
793#undef PERLVARA
794#undef PERLVARI
795#undef PERLVARIC
27da23d5 796#undef PERLVARISC
797
798#ifndef PERL_GLOBAL_STRUCT
799EXTERN_C Perl_ppaddr_t** Perl_Gppaddr_ptr(pTHX);
800EXTERN_C Perl_check_t** Perl_Gcheck_ptr(pTHX);
801EXTERN_C unsigned char** Perl_Gfold_locale_ptr(pTHX);
802#define Perl_ppaddr_ptr Perl_Gppaddr_ptr
803#define Perl_check_ptr Perl_Gcheck_ptr
804#define Perl_fold_locale_ptr Perl_Gfold_locale_ptr
805#endif
51371543 806
807END_EXTERN_C
808
682fc664 809#if defined(PERL_CORE)
6f4183fe 810
682fc664 811/* accessor functions for Perl variables (provide binary compatibility) */
812
813/* these need to be mentioned here, or most linkers won't put them in
814 the perl executable */
815
816#ifndef PERL_NO_FORCE_LINK
817
818START_EXTERN_C
819
820#ifndef DOINIT
27da23d5 821EXTCONST void * const PL_force_link_funcs[];
682fc664 822#else
27da23d5 823EXTCONST void * const PL_force_link_funcs[] = {
682fc664 824#undef PERLVAR
825#undef PERLVARA
826#undef PERLVARI
827#undef PERLVARIC
ea1f607c 828#define PERLVAR(v,t) (void*)Perl_##v##_ptr,
682fc664 829#define PERLVARA(v,n,t) PERLVAR(v,t)
830#define PERLVARI(v,t,i) PERLVAR(v,t)
831#define PERLVARIC(v,t,i) PERLVAR(v,t)
27da23d5 832#define PERLVARISC(v,i) PERLVAR(v,char)
682fc664 833
3c0f78ca 834/* In Tru64 (__DEC && __osf__) the cc option -std1 causes that one
835 * cannot cast between void pointers and function pointers without
836 * info level warnings. The PL_force_link_funcs[] would cause a few
837 * hundred of those warnings. In code one can circumnavigate this by using
838 * unions that overlay the different pointers, but in declarations one
839 * cannot use this trick. Therefore we just disable the warning here
840 * for the duration of the PL_force_link_funcs[] declaration. */
841
842#if defined(__DECC) && defined(__osf__)
843#pragma message save
844#pragma message disable (nonstandcast)
845#endif
846
682fc664 847#include "intrpvar.h"
848#include "perlvars.h"
849
3c0f78ca 850#if defined(__DECC) && defined(__osf__)
851#pragma message restore
852#endif
853
682fc664 854#undef PERLVAR
855#undef PERLVARA
856#undef PERLVARI
857#undef PERLVARIC
27da23d5 858#undef PERLVARISC
682fc664 859};
860#endif /* DOINIT */
861
acfe0abc 862END_EXTERN_C
682fc664 863
864#endif /* PERL_NO_FORCE_LINK */
865
866#else /* !PERL_CORE */
51371543 867
868EOT
869
4543f4c0 870foreach $sym (sort keys %intrp) {
424a4936 871 print $capih bincompat_var('I',$sym);
6f4183fe 872}
873
4543f4c0 874foreach $sym (sort keys %globvar) {
424a4936 875 print $capih bincompat_var('G',$sym);
6f4183fe 876}
877
424a4936 878print $capih <<'EOT';
6f4183fe 879
880#endif /* !PERL_CORE */
acfe0abc 881#endif /* MULTIPLICITY */
6f4183fe 882
883#endif /* __perlapi_h__ */
884
37442d52 885/* ex: set ro: */
6f4183fe 886EOT
08858ed2 887safer_close($capih);
424a4936 888rename_if_different('perlapi.h-new', 'perlapi.h');
51371543 889
424a4936 890print $capi do_not_edit ("perlapi.c"), <<'EOT';
51371543 891
892#include "EXTERN.h"
893#include "perl.h"
894#include "perlapi.h"
895
acfe0abc 896#if defined (MULTIPLICITY)
51371543 897
898/* accessor functions for Perl variables (provides binary compatibility) */
899START_EXTERN_C
900
901#undef PERLVAR
902#undef PERLVARA
903#undef PERLVARI
904#undef PERLVARIC
27da23d5 905#undef PERLVARISC
6f4183fe 906
6f4183fe 907#define PERLVAR(v,t) t* Perl_##v##_ptr(pTHX) \
96a5add6 908 { dVAR; PERL_UNUSED_CONTEXT; return &(aTHX->v); }
6f4183fe 909#define PERLVARA(v,n,t) PL_##v##_t* Perl_##v##_ptr(pTHX) \
96a5add6 910 { dVAR; PERL_UNUSED_CONTEXT; return &(aTHX->v); }
6f4183fe 911
51371543 912#define PERLVARI(v,t,i) PERLVAR(v,t)
c5be433b 913#define PERLVARIC(v,t,i) PERLVAR(v, const t)
27da23d5 914#define PERLVARISC(v,i) PL_##v##_t* Perl_##v##_ptr(pTHX) \
96a5add6 915 { dVAR; PERL_UNUSED_CONTEXT; return &(aTHX->v); }
51371543 916
51371543 917#include "intrpvar.h"
c5be433b 918
919#undef PERLVAR
920#undef PERLVARA
acfe0abc 921#define PERLVAR(v,t) t* Perl_##v##_ptr(pTHX) \
96a5add6 922 { dVAR; PERL_UNUSED_CONTEXT; return &(PL_##v); }
acfe0abc 923#define PERLVARA(v,n,t) PL_##v##_t* Perl_##v##_ptr(pTHX) \
96a5add6 924 { dVAR; PERL_UNUSED_CONTEXT; return &(PL_##v); }
34f7a5fe 925#undef PERLVARIC
27da23d5 926#undef PERLVARISC
927#define PERLVARIC(v,t,i) \
928 const t* Perl_##v##_ptr(pTHX) \
96a5add6 929 { PERL_UNUSED_CONTEXT; return (const t *)&(PL_##v); }
27da23d5 930#define PERLVARISC(v,i) PL_##v##_t* Perl_##v##_ptr(pTHX) \
96a5add6 931 { dVAR; PERL_UNUSED_CONTEXT; return &(PL_##v); }
51371543 932#include "perlvars.h"
933
934#undef PERLVAR
935#undef PERLVARA
936#undef PERLVARI
937#undef PERLVARIC
27da23d5 938#undef PERLVARISC
939
940#ifndef PERL_GLOBAL_STRUCT
941/* A few evil special cases. Could probably macrofy this. */
942#undef PL_ppaddr
943#undef PL_check
944#undef PL_fold_locale
945Perl_ppaddr_t** Perl_Gppaddr_ptr(pTHX) {
88e01c9d 946 static Perl_ppaddr_t* const ppaddr_ptr = PL_ppaddr;
96a5add6 947 PERL_UNUSED_CONTEXT;
27da23d5 948 return (Perl_ppaddr_t**)&ppaddr_ptr;
949}
950Perl_check_t** Perl_Gcheck_ptr(pTHX) {
88e01c9d 951 static Perl_check_t* const check_ptr = PL_check;
96a5add6 952 PERL_UNUSED_CONTEXT;
27da23d5 953 return (Perl_check_t**)&check_ptr;
954}
955unsigned char** Perl_Gfold_locale_ptr(pTHX) {
88e01c9d 956 static unsigned char* const fold_locale_ptr = PL_fold_locale;
96a5add6 957 PERL_UNUSED_CONTEXT;
27da23d5 958 return (unsigned char**)&fold_locale_ptr;
959}
960#endif
51371543 961
acfe0abc 962END_EXTERN_C
6f4183fe 963
acfe0abc 964#endif /* MULTIPLICITY */
37442d52 965
966/* ex: set ro: */
51371543 967EOT
968
08858ed2 969safer_close($capi);
424a4936 970rename_if_different('perlapi.c-new', 'perlapi.c');
acfe0abc 971
c5be433b 972# functions that take va_list* for implementing vararg functions
08cd8952 973# NOTE: makedef.pl must be updated if you add symbols to %vfuncs
acfe0abc 974# XXX %vfuncs currently unused
c5be433b 975my %vfuncs = qw(
976 Perl_croak Perl_vcroak
977 Perl_warn Perl_vwarn
978 Perl_warner Perl_vwarner
979 Perl_die Perl_vdie
980 Perl_form Perl_vform
e4783991 981 Perl_load_module Perl_vload_module
5a844595 982 Perl_mess Perl_vmess
c5be433b 983 Perl_deb Perl_vdeb
984 Perl_newSVpvf Perl_vnewSVpvf
985 Perl_sv_setpvf Perl_sv_vsetpvf
986 Perl_sv_setpvf_mg Perl_sv_vsetpvf_mg
987 Perl_sv_catpvf Perl_sv_vcatpvf
988 Perl_sv_catpvf_mg Perl_sv_vcatpvf_mg
989 Perl_dump_indent Perl_dump_vindent
990 Perl_default_protect Perl_vdefault_protect
991);
1b6737cc 992
993# ex: set ts=8 sts=4 sw=4 noet: