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