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