This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #73374] gccversion not always set with MinGW
[perl5.git] / embed.pl
CommitLineData
5f05dabc 1#!/usr/bin/perl -w
6294c161
DM
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#
6294c161
DM
19# Accepts the standard regen_lib -q and -v args.
20#
21# This script is normally invoked from regen.pl.
e50aee73 22
916e4025 23require 5.004; # keep this compatible, an old perl is all we may have before
954c1994 24 # we build the new one
5f05dabc 25
88e01c9d
AL
26use strict;
27
36bb303b
NC
28BEGIN {
29 # Get function prototypes
9ad884cb 30 require 'regen_lib.pl';
36bb303b
NC
31}
32
88e01c9d 33my $SPLINT = 0; # Turn true for experimental splint support http://www.splint.org
916e4025 34my $unflagged_pointers;
88e01c9d 35
cea2e8a9 36#
346f75ff 37# See database of global and static function prototypes in embed.fnc
cea2e8a9
GS
38# This is used to generate prototype headers under various configurations,
39# export symbols lists for different platforms, and macros to provide an
40# implicit interpreter context argument.
41#
42
7f1be197
MB
43sub do_not_edit ($)
44{
45 my $file = shift;
4373e329 46
83706693 47 my $years = '1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009';
4bb101f2
JH
48
49 $years =~ s/1999,/1999,\n / if length $years > 40;
50
7f1be197 51 my $warning = <<EOW;
37442d52 52 -*- buffer-read-only: t -*-
7f1be197
MB
53
54 $file
55
4bb101f2 56 Copyright (C) $years, by Larry Wall and others
7f1be197
MB
57
58 You may distribute under the terms of either the GNU General Public
59 License or the Artistic License, as specified in the README file.
60
61!!!!!!! DO NOT EDIT THIS FILE !!!!!!!
62This file is built by embed.pl from data in embed.fnc, embed.pl,
907b3e23 63pp.sym, intrpvar.h, and perlvars.h.
7f1be197
MB
64Any changes made here will be lost!
65
66Edit those files and run 'make regen_headers' to effect changes.
67
68EOW
69
cfa0b873
AT
70 $warning .= <<EOW if $file eq 'perlapi.c';
71
72Up to the threshold of the door there mounted a flight of twenty-seven
73broad stairs, hewn by some unknown art of the same black stone. This
4ac71550
TC
74was the only entrance to the tower; ...
75
76 [p.577 of _The Lord of the Rings_, III/x: "The Voice of Saruman"]
cfa0b873
AT
77
78
79EOW
80
7f1be197 81 if ($file =~ m:\.[ch]$:) {
0ea9712b
MB
82 $warning =~ s:^: * :gm;
83 $warning =~ s: +$::gm;
84 $warning =~ s: :/:;
85 $warning =~ s:$:/:;
7f1be197
MB
86 }
87 else {
0ea9712b
MB
88 $warning =~ s:^:# :gm;
89 $warning =~ s: +$::gm;
7f1be197
MB
90 }
91 $warning;
92} # do_not_edit
93
94bdecf9 94open IN, "embed.fnc" or die $!;
cea2e8a9 95
881a2100 96my @embed;
125218eb 97my (%has_va, %has_nocontext);
881a2100
NC
98
99while (<IN>) {
100 chomp;
101 next if /^:/;
102 while (s|\\$||) {
103 $_ .= <IN>;
104 chomp;
105 }
106 s/\s+$//;
107 my @args;
108 if (/^\s*(#|$)/) {
109 @args = $_;
110 }
111 else {
112 @args = split /\s*\|\s*/, $_;
125218eb
NC
113 my $func = $args[2];
114 if ($func) {
115 ++$has_va{$func} if $args[-1] =~ /\.\.\./;
116 ++$has_nocontext{$1} if $func =~ /(.*)_nocontext/;
117 }
881a2100
NC
118 }
119 push @embed, \@args;
120}
121
cea2e8a9
GS
122# walk table providing an array of components in each line to
123# subroutine, printing the result
124sub walk_table (&@) {
1028dc3c 125 my ($function, $filename, $trailer) = @_;
cea2e8a9 126 my $F;
cea2e8a9
GS
127 if (ref $filename) { # filehandle
128 $F = $filename;
129 }
d0ee0d3d 130 else {
424a4936 131 $F = safer_open("$filename-new");
1028dc3c 132 print $F do_not_edit ($filename);
cea2e8a9 133 }
881a2100
NC
134 foreach (@embed) {
135 my @outs = &{$function}(@$_);
1028dc3c 136 # $function->(@args) is not 5.003
d0ee0d3d 137 print $F @outs;
cea2e8a9
GS
138 }
139 print $F $trailer if $trailer;
d0ee0d3d 140 unless (ref $filename) {
08858ed2 141 safer_close($F);
424a4936 142 rename_if_different("$filename-new", $filename);
36bb303b 143 }
cea2e8a9
GS
144}
145
cea2e8a9 146# generate proto.h
0cb96387
GS
147my $wrote_protected = 0;
148
cea2e8a9 149sub write_protos {
f8394530 150 my $ret;
cea2e8a9
GS
151 if (@_ == 1) {
152 my $arg = shift;
f8394530 153 $ret = "$arg\n";
cea2e8a9
GS
154 }
155 else {
7918f24d 156 my ($flags,$retval,$plain_func,@args) = @_;
4373e329
AL
157 my @nonnull;
158 my $has_context = ( $flags !~ /n/ );
88e01c9d
AL
159 my $never_returns = ( $flags =~ /r/ );
160 my $commented_out = ( $flags =~ /m/ );
aa4ca557 161 my $binarycompat = ( $flags =~ /b/ );
88e01c9d
AL
162 my $is_malloc = ( $flags =~ /a/ );
163 my $can_ignore = ( $flags !~ /R/ ) && !$is_malloc;
7918f24d
NC
164 my @names_of_nn;
165 my $func;
88e01c9d
AL
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";
7918f24d 177 $func = "S_$plain_func";
cea2e8a9 178 }
0cb96387 179 else {
88e01c9d 180 $retval = "PERL_CALLCONV $splint_flags$retval";
25b0f989 181 if ($flags =~ /[bp]/) {
7918f24d
NC
182 $func = "Perl_$plain_func";
183 } else {
184 $func = $plain_func;
0cb96387 185 }
cea2e8a9 186 }
f8394530 187 $ret = "$retval\t$func(";
4373e329
AL
188 if ( $has_context ) {
189 $ret .= @args ? "pTHX_ " : "pTHX";
cea2e8a9
GS
190 }
191 if (@args) {
4373e329
AL
192 my $n;
193 for my $arg ( @args ) {
194 ++$n;
7827dc65
AL
195 if ( $arg =~ /\*/ && $arg !~ /\b(NN|NULLOK)\b/ ) {
196 warn "$func: $arg needs NN or NULLOK\n";
7827dc65
AL
197 ++$unflagged_pointers;
198 }
88e01c9d
AL
199 my $nn = ( $arg =~ s/\s*\bNN\b\s+// );
200 push( @nonnull, $n ) if $nn;
201
202 my $nullok = ( $arg =~ s/\s*\bNULLOK\b\s+// ); # strip NULLOK with no effect
c48640ec
AL
203
204 # Make sure each arg has at least a type and a var name.
205 # An arg of "int" is valid C, but want it to be "int foo".
206 my $temp_arg = $arg;
207 $temp_arg =~ s/\*//g;
208 $temp_arg =~ s/\s*\bstruct\b\s*/ /g;
7918f24d
NC
209 if ( ($temp_arg ne "...")
210 && ($temp_arg !~ /\w+\s+(\w+)(?:\[\d+\])?\s*$/) ) {
211 warn "$func: $arg ($n) doesn't have a name\n";
c48640ec 212 }
88e01c9d
AL
213 if ( $SPLINT && $nullok && !$commented_out ) {
214 $arg = '/*@null@*/ ' . $arg;
215 }
aa4ca557 216 if (defined $1 && $nn && !($commented_out && !$binarycompat)) {
7918f24d
NC
217 push @names_of_nn, $1;
218 }
4373e329 219 }
cea2e8a9
GS
220 $ret .= join ", ", @args;
221 }
222 else {
4373e329 223 $ret .= "void" if !$has_context;
cea2e8a9
GS
224 }
225 $ret .= ")";
f54cb97a
AL
226 my @attrs;
227 if ( $flags =~ /r/ ) {
abb2c242 228 push @attrs, "__attribute__noreturn__";
f54cb97a 229 }
a5c26493
RGS
230 if ( $flags =~ /D/ ) {
231 push @attrs, "__attribute__deprecated__";
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
AL
238 }
239 if ( $flags =~ /P/ ) {
abb2c242 240 push @attrs, "__attribute__pure__";
f54cb97a 241 }
1c846c1f 242 if( $flags =~ /f/ ) {
cdfeb707
RB
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
AL
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
NC
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
GS
267 }
268 $ret;
269}
270
2b10efc6
NC
271# generates global.sym (API export list)
272{
273 my %seen;
274 sub write_global_sym {
2b10efc6
NC
275 if (@_ > 1) {
276 my ($flags,$retval,$func,@args) = @_;
277 # If a function is defined twice, for example before and after an
278 # #else, only process the flags on the first instance for global.sym
f8394530 279 return '' if $seen{$func}++;
2b10efc6
NC
280 if ($flags =~ /[AX]/ && $flags !~ /[xm]/
281 || $flags =~ /b/) { # public API, so export
282 $func = "Perl_$func" if $flags =~ /[pbX]/;
f8394530 283 return "$func\n";
2b10efc6
NC
284 }
285 }
f8394530 286 return '';
2b10efc6 287 }
cea2e8a9
GS
288}
289
1028dc3c 290walk_table(\&write_protos, "proto.h", "/* ex: set ro: */\n");
7827dc65 291warn "$unflagged_pointers pointer arguments to clean up\n" if $unflagged_pointers;
1028dc3c 292walk_table(\&write_global_sym, "global.sym", "# ex: set ro:\n");
cea2e8a9 293
5f05dabc 294sub readsyms (\%$) {
295 my ($syms, $file) = @_;
5f05dabc 296 local (*FILE, $_);
297 open(FILE, "< $file")
298 or die "embed.pl: Can't open $file: $!\n";
299 while (<FILE>) {
300 s/[ \t]*#.*//; # Delete comments.
301 if (/^\s*(\S+)\s*$/) {
22c35a8c 302 my $sym = $1;
d1594dd0 303 warn "duplicate symbol $sym while processing $file line $.\n"
22c35a8c
GS
304 if exists $$syms{$sym};
305 $$syms{$sym} = 1;
5f05dabc 306 }
307 }
308 close(FILE);
309}
310
cea2e8a9
GS
311# Perl_pp_* and Perl_ck_* are in pp.sym
312readsyms my %ppsym, 'pp.sym';
5f05dabc 313
c6af7a1a
GS
314sub readvars(\%$$@) {
315 my ($syms, $file,$pre,$keep_pre) = @_;
d4cce5f1
NIS
316 local (*FILE, $_);
317 open(FILE, "< $file")
318 or die "embed.pl: Can't open $file: $!\n";
319 while (<FILE>) {
320 s/[ \t]*#.*//; # Delete comments.
27da23d5 321 if (/PERLVARA?I?S?C?\($pre(\w+)/) {
22c35a8c 322 my $sym = $1;
c6af7a1a 323 $sym = $pre . $sym if $keep_pre;
d1594dd0 324 warn "duplicate symbol $sym while processing $file line $.\n"
22c35a8c 325 if exists $$syms{$sym};
51371543 326 $$syms{$sym} = $pre || 1;
d4cce5f1
NIS
327 }
328 }
329 close(FILE);
330}
331
332my %intrp;
88e01c9d 333my %globvar;
d4cce5f1
NIS
334
335readvars %intrp, 'intrpvar.h','I';
22239a37 336readvars %globvar, 'perlvars.h','G';
d4cce5f1 337
4543f4c0 338my $sym;
d4cce5f1 339
c6af7a1a
GS
340sub undefine ($) {
341 my ($sym) = @_;
342 "#undef $sym\n";
343}
344
125218eb
NC
345sub hide {
346 my ($from, $to, $indent) = @_;
347 $indent = '' unless defined $indent;
348 my $t = int(length("$indent$from") / 8);
349 "#${indent}define $from" . "\t" x ($t < 3 ? 3 - $t : 1) . "$to\n";
5f05dabc 350}
c6af7a1a 351
6f4183fe 352sub bincompat_var ($$) {
51371543 353 my ($pfx, $sym) = @_;
acfe0abc 354 my $arg = ($pfx eq 'G' ? 'NULL' : 'aTHX');
c5be433b 355 undefine("PL_$sym") . hide("PL_$sym", "(*Perl_${pfx}${sym}_ptr($arg))");
c6af7a1a
GS
356}
357
d4cce5f1
NIS
358sub multon ($$$) {
359 my ($sym,$pre,$ptr) = @_;
3280af22 360 hide("PL_$sym", "($ptr$pre$sym)");
5f05dabc 361}
54aff467 362
d4cce5f1
NIS
363sub multoff ($$) {
364 my ($sym,$pre) = @_;
533c011a 365 return hide("PL_$pre$sym", "PL_$sym");
5f05dabc 366}
367
424a4936 368my $em = safer_open('embed.h-new');
e50aee73 369
424a4936 370print $em do_not_edit ("embed.h"), <<'END';
e50aee73
AD
371
372/* (Doing namespace management portably in C is really gross.) */
373
d51482e4
JH
374/* By defining PERL_NO_SHORT_NAMES (not done by default) the short forms
375 * (like warn instead of Perl_warn) for the API are not defined.
376 * Not defining the short forms is a good thing for cleaner embedding. */
377
378#ifndef PERL_NO_SHORT_NAMES
820c3be9 379
22c35a8c 380/* Hide global symbols */
5f05dabc 381
e50aee73
AD
382END
383
da4ddda1
NC
384# Try to elimiate lots of repeated
385# #ifdef PERL_CORE
386# foo
387# #endif
388# #ifdef PERL_CORE
389# bar
390# #endif
391# by tracking state and merging foo and bar into one block.
392my $ifdef_state = '';
393
cea2e8a9
GS
394my @az = ('a'..'z');
395
396walk_table {
397 my $ret = "";
da4ddda1 398 my $new_ifdef_state = '';
cea2e8a9
GS
399 if (@_ == 1) {
400 my $arg = shift;
f8394530 401 $ret = "$arg\n" if $arg =~ /^#\s*(if|ifn?def|else|endif)\b/;
cea2e8a9
GS
402 }
403 else {
404 my ($flags,$retval,$func,@args) = @_;
af3c7592 405 unless ($flags =~ /[om]/) {
cea2e8a9 406 my $args = scalar @args;
7a5a24f7 407 if ($flags =~ /n/) {
cea2e8a9 408 if ($flags =~ /s/) {
f8394530 409 $ret = hide($func,"S_$func");
cea2e8a9
GS
410 }
411 elsif ($flags =~ /p/) {
f8394530 412 $ret = hide($func,"Perl_$func");
cea2e8a9
GS
413 }
414 }
7a5a24f7 415 elsif ($args and $args[$args-1] =~ /\.\.\./) {
e64ca59f
NC
416 if ($flags =~ /p/) {
417 # we're out of luck for varargs functions under CPP
418 # So we can only do these macros for no implicit context:
419 $ret = "#ifndef PERL_IMPLICIT_CONTEXT\n"
420 . hide($func,"Perl_$func") . "#endif\n";
421 }
7a5a24f7 422 }
cea2e8a9
GS
423 else {
424 my $alist = join(",", @az[0..$args-1]);
425 $ret = "#define $func($alist)";
426 my $t = int(length($ret) / 8);
427 $ret .= "\t" x ($t < 4 ? 4 - $t : 1);
428 if ($flags =~ /s/) {
429 $ret .= "S_$func(aTHX";
430 }
431 elsif ($flags =~ /p/) {
432 $ret .= "Perl_$func(aTHX";
433 }
434 $ret .= "_ " if $alist;
435 $ret .= $alist . ")\n";
436 }
437 }
da4ddda1 438 unless ($flags =~ /A/) {
de37762f 439 if ($flags =~ /E/) {
da4ddda1
NC
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
HS
449 }
450 }
cea2e8a9 451 }
da4ddda1
NC
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;
1028dc3c 459} $em;
cea2e8a9 460
da4ddda1 461if ($ifdef_state) {
424a4936 462 print $em "#endif\n";
da4ddda1
NC
463}
464
cea2e8a9
GS
465for $sym (sort keys %ppsym) {
466 $sym =~ s/^Perl_//;
467 if ($sym =~ /^ck_/) {
424a4936 468 print $em hide("$sym(a)", "Perl_$sym(aTHX_ a)");
cea2e8a9
GS
469 }
470 elsif ($sym =~ /^pp_/) {
424a4936 471 print $em hide("$sym()", "Perl_$sym(aTHX)");
cea2e8a9
GS
472 }
473 else {
474 warn "Illegal symbol '$sym' in pp.sym";
475 }
e50aee73
AD
476}
477
424a4936 478print $em <<'END';
e50aee73 479
d51482e4 480#endif /* #ifndef PERL_NO_SHORT_NAMES */
35209cc8 481
cea2e8a9
GS
482/* Compatibility stubs. Compile extensions with -DPERL_NOCOMPAT to
483 disable them.
484 */
485
538feb02 486#if !defined(PERL_CORE)
5bc28da9 487# define sv_setptrobj(rv,ptr,name) sv_setref_iv(rv,name,PTR2IV(ptr))
a0714e2c 488# define sv_setptrref(rv,ptr) sv_setref_iv(rv,NULL,PTR2IV(ptr))
538feb02 489#endif
cea2e8a9 490
08e5223a 491#if !defined(PERL_CORE) && !defined(PERL_NOCOMPAT)
cea2e8a9
GS
492
493/* Compatibility for various misnamed functions. All functions
494 in the API that begin with "perl_" (not "Perl_") take an explicit
495 interpreter context pointer.
496 The following are not like that, but since they had a "perl_"
497 prefix in previous versions, we provide compatibility macros.
498 */
65cec589 499# define perl_atexit(a,b) call_atexit(a,b)
7b53c8ee
NC
500END
501
502walk_table {
503 my ($flags,$retval,$func,@args) = @_;
504 return unless $func;
505 return unless $flags =~ /O/;
506
507 my $alist = join ",", @az[0..$#args];
508 my $ret = "# define perl_$func($alist)";
509 my $t = (length $ret) >> 3;
510 $ret .= "\t" x ($t < 5 ? 5 - $t : 1);
511 "$ret$func($alist)\n";
1028dc3c 512} $em;
7b53c8ee
NC
513
514print $em <<'END';
cea2e8a9
GS
515
516/* varargs functions can't be handled with CPP macros. :-(
517 This provides a set of compatibility functions that don't take
518 an extra argument but grab the context pointer using the macro
519 dTHX.
520 */
d51482e4 521#if defined(PERL_IMPLICIT_CONTEXT) && !defined(PERL_NO_SHORT_NAMES)
125218eb
NC
522END
523
524foreach (sort keys %has_va) {
525 next unless $has_nocontext{$_};
526 next if /printf/; # Not clear to me why these are skipped but they are.
527 print $em hide($_, "Perl_${_}_nocontext", " ");
528}
529
530print $em <<'END';
cea2e8a9
GS
531#endif
532
533#endif /* !defined(PERL_CORE) && !defined(PERL_NOCOMPAT) */
534
535#if !defined(PERL_IMPLICIT_CONTEXT)
536/* undefined symbols, point them back at the usual ones */
125218eb
NC
537END
538
539foreach (sort keys %has_va) {
540 next unless $has_nocontext{$_};
541 next if /printf/; # Not clear to me why these are skipped but they are.
542 print $em hide("Perl_${_}_nocontext", "Perl_$_", " ");
543}
544
545print $em <<'END';
cea2e8a9 546#endif
db5cf5a9 547
37442d52 548/* ex: set ro: */
d4cce5f1
NIS
549END
550
08858ed2 551safer_close($em);
424a4936 552rename_if_different('embed.h-new', 'embed.h');
d4cce5f1 553
424a4936 554$em = safer_open('embedvar.h-new');
d4cce5f1 555
424a4936 556print $em do_not_edit ("embedvar.h"), <<'END';
d4cce5f1
NIS
557
558/* (Doing namespace management portably in C is really gross.) */
559
54aff467 560/*
3db8f154
MB
561 The following combinations of MULTIPLICITY and PERL_IMPLICIT_CONTEXT
562 are supported:
54aff467
GS
563 1) none
564 2) MULTIPLICITY # supported for compatibility
565 3) MULTIPLICITY && PERL_IMPLICIT_CONTEXT
54aff467
GS
566
567 All other combinations of these flags are errors.
568
3db8f154 569 only #3 is supported directly, while #2 is a special
54aff467
GS
570 case of #3 (supported by redefining vTHX appropriately).
571*/
cea2e8a9 572
54aff467 573#if defined(MULTIPLICITY)
3db8f154 574/* cases 2 and 3 above */
cea2e8a9 575
54aff467
GS
576# if defined(PERL_IMPLICIT_CONTEXT)
577# define vTHX aTHX
578# else
579# define vTHX PERL_GET_INTERP
580# endif
cea2e8a9 581
e50aee73
AD
582END
583
d4cce5f1 584for $sym (sort keys %intrp) {
424a4936 585 print $em multon($sym,'I','vTHX->');
d4cce5f1
NIS
586}
587
424a4936 588print $em <<'END';
d4cce5f1 589
54aff467 590#else /* !MULTIPLICITY */
1d7c1841 591
3db8f154 592/* case 1 above */
5f05dabc 593
56d28764 594END
e50aee73 595
d4cce5f1 596for $sym (sort keys %intrp) {
424a4936 597 print $em multoff($sym,'I');
d4cce5f1
NIS
598}
599
424a4936 600print $em <<'END';
d4cce5f1 601
d4cce5f1
NIS
602END
603
424a4936 604print $em <<'END';
d4cce5f1 605
54aff467 606#endif /* MULTIPLICITY */
d4cce5f1 607
54aff467 608#if defined(PERL_GLOBAL_STRUCT)
22239a37
NIS
609
610END
611
612for $sym (sort keys %globvar) {
424a4936
NC
613 print $em multon($sym, 'G','my_vars->');
614 print $em multon("G$sym",'', 'my_vars->');
22239a37
NIS
615}
616
424a4936 617print $em <<'END';
22239a37
NIS
618
619#else /* !PERL_GLOBAL_STRUCT */
620
621END
622
623for $sym (sort keys %globvar) {
424a4936 624 print $em multoff($sym,'G');
22239a37
NIS
625}
626
424a4936 627print $em <<'END';
22239a37 628
22239a37
NIS
629#endif /* PERL_GLOBAL_STRUCT */
630
37442d52 631/* ex: set ro: */
84fee439
NIS
632END
633
08858ed2 634safer_close($em);
424a4936 635rename_if_different('embedvar.h-new', 'embedvar.h');
c6af7a1a 636
424a4936
NC
637my $capi = safer_open('perlapi.c-new');
638my $capih = safer_open('perlapi.h-new');
51371543 639
424a4936 640print $capih do_not_edit ("perlapi.h"), <<'EOT';
51371543 641
51371543 642/* declare accessor functions for Perl variables */
6f4183fe
GS
643#ifndef __perlapi_h__
644#define __perlapi_h__
51371543 645
87b9e160 646#if defined (MULTIPLICITY) && defined (PERL_GLOBAL_STRUCT)
c5be433b 647
51371543
GS
648START_EXTERN_C
649
650#undef PERLVAR
651#undef PERLVARA
652#undef PERLVARI
653#undef PERLVARIC
27da23d5 654#undef PERLVARISC
acfe0abc 655#define PERLVAR(v,t) EXTERN_C t* Perl_##v##_ptr(pTHX);
51371543 656#define PERLVARA(v,n,t) typedef t PL_##v##_t[n]; \
acfe0abc 657 EXTERN_C PL_##v##_t* Perl_##v##_ptr(pTHX);
51371543 658#define PERLVARI(v,t,i) PERLVAR(v,t)
c5be433b 659#define PERLVARIC(v,t,i) PERLVAR(v, const t)
27da23d5
JH
660#define PERLVARISC(v,i) typedef const char PL_##v##_t[sizeof(i)]; \
661 EXTERN_C PL_##v##_t* Perl_##v##_ptr(pTHX);
51371543 662
51371543
GS
663#include "perlvars.h"
664
665#undef PERLVAR
666#undef PERLVARA
667#undef PERLVARI
668#undef PERLVARIC
27da23d5
JH
669#undef PERLVARISC
670
51371543
GS
671END_EXTERN_C
672
682fc664 673#if defined(PERL_CORE)
6f4183fe 674
87b9e160 675/* accessor functions for Perl "global" variables */
682fc664
GS
676
677/* these need to be mentioned here, or most linkers won't put them in
678 the perl executable */
679
680#ifndef PERL_NO_FORCE_LINK
681
682START_EXTERN_C
683
684#ifndef DOINIT
27da23d5 685EXTCONST void * const PL_force_link_funcs[];
682fc664 686#else
27da23d5 687EXTCONST void * const PL_force_link_funcs[] = {
682fc664
GS
688#undef PERLVAR
689#undef PERLVARA
690#undef PERLVARI
691#undef PERLVARIC
ea1f607c 692#define PERLVAR(v,t) (void*)Perl_##v##_ptr,
682fc664
GS
693#define PERLVARA(v,n,t) PERLVAR(v,t)
694#define PERLVARI(v,t,i) PERLVAR(v,t)
695#define PERLVARIC(v,t,i) PERLVAR(v,t)
27da23d5 696#define PERLVARISC(v,i) PERLVAR(v,char)
682fc664 697
3c0f78ca
JH
698/* In Tru64 (__DEC && __osf__) the cc option -std1 causes that one
699 * cannot cast between void pointers and function pointers without
700 * info level warnings. The PL_force_link_funcs[] would cause a few
701 * hundred of those warnings. In code one can circumnavigate this by using
702 * unions that overlay the different pointers, but in declarations one
703 * cannot use this trick. Therefore we just disable the warning here
704 * for the duration of the PL_force_link_funcs[] declaration. */
705
706#if defined(__DECC) && defined(__osf__)
707#pragma message save
708#pragma message disable (nonstandcast)
709#endif
710
682fc664
GS
711#include "perlvars.h"
712
3c0f78ca
JH
713#if defined(__DECC) && defined(__osf__)
714#pragma message restore
715#endif
716
682fc664
GS
717#undef PERLVAR
718#undef PERLVARA
719#undef PERLVARI
720#undef PERLVARIC
27da23d5 721#undef PERLVARISC
682fc664
GS
722};
723#endif /* DOINIT */
724
acfe0abc 725END_EXTERN_C
682fc664
GS
726
727#endif /* PERL_NO_FORCE_LINK */
728
729#else /* !PERL_CORE */
51371543
GS
730
731EOT
732
4543f4c0 733foreach $sym (sort keys %globvar) {
424a4936 734 print $capih bincompat_var('G',$sym);
6f4183fe
GS
735}
736
424a4936 737print $capih <<'EOT';
6f4183fe
GS
738
739#endif /* !PERL_CORE */
87b9e160 740#endif /* MULTIPLICITY && PERL_GLOBAL_STRUCT */
6f4183fe
GS
741
742#endif /* __perlapi_h__ */
743
37442d52 744/* ex: set ro: */
6f4183fe 745EOT
08858ed2 746safer_close($capih);
424a4936 747rename_if_different('perlapi.h-new', 'perlapi.h');
51371543 748
424a4936 749print $capi do_not_edit ("perlapi.c"), <<'EOT';
51371543
GS
750
751#include "EXTERN.h"
752#include "perl.h"
753#include "perlapi.h"
754
87b9e160 755#if defined (MULTIPLICITY) && defined (PERL_GLOBAL_STRUCT)
51371543 756
87b9e160 757/* accessor functions for Perl "global" variables */
51371543
GS
758START_EXTERN_C
759
51371543 760#undef PERLVARI
87b9e160 761#define PERLVARI(v,t,i) PERLVAR(v,t)
c5be433b
GS
762
763#undef PERLVAR
764#undef PERLVARA
acfe0abc 765#define PERLVAR(v,t) t* Perl_##v##_ptr(pTHX) \
96a5add6 766 { dVAR; PERL_UNUSED_CONTEXT; return &(PL_##v); }
acfe0abc 767#define PERLVARA(v,n,t) PL_##v##_t* Perl_##v##_ptr(pTHX) \
96a5add6 768 { dVAR; PERL_UNUSED_CONTEXT; return &(PL_##v); }
34f7a5fe 769#undef PERLVARIC
27da23d5
JH
770#undef PERLVARISC
771#define PERLVARIC(v,t,i) \
772 const t* Perl_##v##_ptr(pTHX) \
96a5add6 773 { PERL_UNUSED_CONTEXT; return (const t *)&(PL_##v); }
27da23d5 774#define PERLVARISC(v,i) PL_##v##_t* Perl_##v##_ptr(pTHX) \
96a5add6 775 { dVAR; PERL_UNUSED_CONTEXT; return &(PL_##v); }
51371543
GS
776#include "perlvars.h"
777
778#undef PERLVAR
779#undef PERLVARA
780#undef PERLVARI
781#undef PERLVARIC
27da23d5
JH
782#undef PERLVARISC
783
acfe0abc 784END_EXTERN_C
6f4183fe 785
87b9e160 786#endif /* MULTIPLICITY && PERL_GLOBAL_STRUCT */
37442d52
RGS
787
788/* ex: set ro: */
51371543
GS
789EOT
790
08858ed2 791safer_close($capi);
424a4936 792rename_if_different('perlapi.c-new', 'perlapi.c');
acfe0abc 793
1b6737cc 794# ex: set ts=8 sts=4 sw=4 noet: