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