3 require 5.003; # keep this compatible, an old perl is all we may have before
7 # Get function prototypes
12 # See database of global and static function prototypes in embed.fnc
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.
25 Copyright (c) 1997-2002, Larry Wall
27 You may distribute under the terms of either the GNU General Public
28 License or the Artistic License, as specified in the README file.
30 !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
31 This file is built by embed.pl from data in embed.fnc, embed.pl,
32 pp.sym, intrpvar.h, perlvars.h and thrdvar.h.
33 Any changes made here will be lost!
35 Edit those files and run 'make regen_headers' to effect changes.
39 if ($file =~ m:\.[ch]$:) {
40 $warning =~ s:^: * :gm;
41 $warning =~ s: +$::gm;
46 $warning =~ s:^:# :gm;
47 $warning =~ s: +$::gm;
52 open IN, "embed.fnc" or die $!;
54 # walk table providing an array of components in each line to
55 # subroutine, printing the result
58 my $filename = shift || '-';
60 defined $leader or $leader = do_not_edit ($filename);
64 if (ref $filename) { # filehandle
68 safer_unlink $filename;
69 open F, ">$filename" or die "Can't open $filename: $!";
72 print $F $leader if $leader;
73 seek IN, 0, 0; # so we may restart
86 @args = split /\s*\|\s*/, $_;
88 my @outs = &{$function}(@args);
89 print $F @outs; # $function->(@args) is not 5.003
91 print $F $trailer if $trailer;
92 unless (ref $filename) {
93 close $F or die "Error closing $filename: $!";
97 sub munge_c_files () {
100 warn "\@ARGV empty, nothing to do\n";
105 $functions->{$_[2]} = \@_ if $_[@_-1] =~ /\.\.\./;
110 # if (/^#\s*include\s+"perl.h"/) {
111 # my $file = uc $ARGV;
113 # print "#define PERL_IN_$file\n";
119 # if (exists $functions->{$f}) {
120 # my $flags = $functions->{$f}[0];
121 # $repl = "Perl_$repl" if $flags =~ /p/;
122 # unless ($flags =~ /n/) {
124 # $repl .= "_ " if @{$functions->{$f}} > 3;
126 # warn("$ARGV:$.:$repl\n");
130 s{(\b(\w+)[ \t]*\([ \t]*(?!aTHX))}
134 if (exists $functions->{$f}) {
136 warn("$ARGV:$.:$`#$repl#$'");
141 close ARGV if eof; # restart $.
149 my $wrote_protected = 0;
158 my ($flags,$retval,$func,@args) = @_;
159 $ret .= '/* ' if $flags =~ /m/;
161 $retval = "STATIC $retval";
165 $retval = "PERL_CALLCONV $retval";
167 $func = "Perl_$func";
170 $ret .= "$retval\t$func(";
171 unless ($flags =~ /n/) {
173 $ret .= "_ " if @args;
176 $ret .= join ", ", @args;
179 $ret .= "void" if $flags =~ /n/;
182 $ret .= " __attribute__((noreturn))" if $flags =~ /r/;
183 if( $flags =~ /f/ ) {
184 my $prefix = $flags =~ /n/ ? '' : 'pTHX_';
185 my $args = scalar @args;
186 $ret .= "\n#ifdef CHECK_FORMAT\n";
187 $ret .= sprintf " __attribute__((format(printf,%s%d,%s%d)))",
188 $prefix, $args - 1, $prefix, $args;
189 $ret .= "\n#endif\n";
192 $ret .= ' */' if $flags =~ /m/;
198 # generates global.sym (API export list), and populates %global with global symbols
199 sub write_global_sym {
202 my ($flags,$retval,$func,@args) = @_;
203 if ($flags =~ /A/ && $flags !~ /[xm]/) { # public API, so export
204 $func = "Perl_$func" if $flags =~ /p/;
211 walk_table(\&write_protos, "proto.h", undef);
212 walk_table(\&write_global_sym, "global.sym", undef);
214 # XXX others that may need adding
218 my @extvars = qw(sv_undef sv_yes sv_no na dowarn
220 tainting tainted stack_base stack_sp sv_arenaroot
222 curstash DBsub DBsingle DBassertion debstash
236 my ($syms, $file) = @_;
238 open(FILE, "< $file")
239 or die "embed.pl: Can't open $file: $!\n";
241 s/[ \t]*#.*//; # Delete comments.
242 if (/^\s*(\S+)\s*$/) {
244 warn "duplicate symbol $sym while processing $file\n"
245 if exists $$syms{$sym};
252 # Perl_pp_* and Perl_ck_* are in pp.sym
253 readsyms my %ppsym, 'pp.sym';
255 sub readvars(\%$$@) {
256 my ($syms, $file,$pre,$keep_pre) = @_;
258 open(FILE, "< $file")
259 or die "embed.pl: Can't open $file: $!\n";
261 s/[ \t]*#.*//; # Delete comments.
262 if (/PERLVARA?I?C?\($pre(\w+)/) {
264 $sym = $pre . $sym if $keep_pre;
265 warn "duplicate symbol $sym while processing $file\n"
266 if exists $$syms{$sym};
267 $$syms{$sym} = $pre || 1;
276 readvars %intrp, 'intrpvar.h','I';
277 readvars %thread, 'thrdvar.h','T';
278 readvars %globvar, 'perlvars.h','G';
281 foreach $sym (sort keys %thread) {
282 warn "$sym in intrpvar.h as well as thrdvar.h\n" if exists $intrp{$sym};
291 my ($from, $to) = @_;
292 my $t = int(length($from) / 8);
293 "#define $from" . "\t" x ($t < 3 ? 3 - $t : 1) . "$to\n";
296 sub bincompat_var ($$) {
297 my ($pfx, $sym) = @_;
298 my $arg = ($pfx eq 'G' ? 'NULL' : 'aTHX');
299 undefine("PL_$sym") . hide("PL_$sym", "(*Perl_${pfx}${sym}_ptr($arg))");
303 my ($sym,$pre,$ptr) = @_;
304 hide("PL_$sym", "($ptr$pre$sym)");
309 return hide("PL_$pre$sym", "PL_$sym");
312 safer_unlink 'embed.h';
313 open(EM, '> embed.h') or die "Can't create embed.h: $!\n";
315 print EM do_not_edit ("embed.h"), <<'END';
317 /* (Doing namespace management portably in C is really gross.) */
319 /* By defining PERL_NO_SHORT_NAMES (not done by default) the short forms
320 * (like warn instead of Perl_warn) for the API are not defined.
321 * Not defining the short forms is a good thing for cleaner embedding. */
323 #ifndef PERL_NO_SHORT_NAMES
325 /* Hide global symbols */
327 #if !defined(PERL_IMPLICIT_CONTEXT)
335 $ret .= "$arg\n" if $arg =~ /^#\s*(if|ifn?def|else|endif)\b/;
338 my ($flags,$retval,$func,@args) = @_;
339 unless ($flags =~ /[om]/) {
341 $ret .= hide($func,"S_$func");
343 elsif ($flags =~ /p/) {
344 $ret .= hide($func,"Perl_$func");
347 unless ($flags =~ /A/) {
349 $ret = "#if defined(PERL_CORE) || defined(PERL_EXT)\n$ret#endif\n";
351 $ret = "#ifdef PERL_CORE\n$ret#endif\n";
358 for $sym (sort keys %ppsym) {
360 print EM hide($sym, "Perl_$sym");
365 #else /* PERL_IMPLICIT_CONTEXT */
375 $ret .= "$arg\n" if $arg =~ /^#\s*(if|ifn?def|else|endif)\b/;
378 my ($flags,$retval,$func,@args) = @_;
379 unless ($flags =~ /[om]/) {
380 my $args = scalar @args;
381 if ($args and $args[$args-1] =~ /\.\.\./) {
382 # we're out of luck for varargs functions under CPP
384 elsif ($flags =~ /n/) {
386 $ret .= hide($func,"S_$func");
388 elsif ($flags =~ /p/) {
389 $ret .= hide($func,"Perl_$func");
393 my $alist = join(",", @az[0..$args-1]);
394 $ret = "#define $func($alist)";
395 my $t = int(length($ret) / 8);
396 $ret .= "\t" x ($t < 4 ? 4 - $t : 1);
398 $ret .= "S_$func(aTHX";
400 elsif ($flags =~ /p/) {
401 $ret .= "Perl_$func(aTHX";
403 $ret .= "_ " if $alist;
404 $ret .= $alist . ")\n";
407 unless ($flags =~ /A/) {
409 $ret = "#if defined(PERL_CORE) || defined(PERL_EXT)\n$ret#endif\n";
411 $ret = "#ifdef PERL_CORE\n$ret#endif\n";
418 for $sym (sort keys %ppsym) {
420 if ($sym =~ /^ck_/) {
421 print EM hide("$sym(a)", "Perl_$sym(aTHX_ a)");
423 elsif ($sym =~ /^pp_/) {
424 print EM hide("$sym()", "Perl_$sym(aTHX)");
427 warn "Illegal symbol '$sym' in pp.sym";
433 #endif /* PERL_IMPLICIT_CONTEXT */
435 #endif /* #ifndef PERL_NO_SHORT_NAMES */
441 /* Compatibility stubs. Compile extensions with -DPERL_NOCOMPAT to
445 #if !defined(PERL_CORE)
446 # define sv_setptrobj(rv,ptr,name) sv_setref_iv(rv,name,PTR2IV(ptr))
447 # define sv_setptrref(rv,ptr) sv_setref_iv(rv,Nullch,PTR2IV(ptr))
450 #if !defined(PERL_CORE) && !defined(PERL_NOCOMPAT)
452 /* Compatibility for various misnamed functions. All functions
453 in the API that begin with "perl_" (not "Perl_") take an explicit
454 interpreter context pointer.
455 The following are not like that, but since they had a "perl_"
456 prefix in previous versions, we provide compatibility macros.
458 # define perl_atexit(a,b) call_atexit(a,b)
459 # define perl_call_argv(a,b,c) call_argv(a,b,c)
460 # define perl_call_pv(a,b) call_pv(a,b)
461 # define perl_call_method(a,b) call_method(a,b)
462 # define perl_call_sv(a,b) call_sv(a,b)
463 # define perl_eval_sv(a,b) eval_sv(a,b)
464 # define perl_eval_pv(a,b) eval_pv(a,b)
465 # define perl_require_pv(a) require_pv(a)
466 # define perl_get_sv(a,b) get_sv(a,b)
467 # define perl_get_av(a,b) get_av(a,b)
468 # define perl_get_hv(a,b) get_hv(a,b)
469 # define perl_get_cv(a,b) get_cv(a,b)
470 # define perl_init_i18nl10n(a) init_i18nl10n(a)
471 # define perl_init_i18nl14n(a) init_i18nl14n(a)
472 # define perl_new_ctype(a) new_ctype(a)
473 # define perl_new_collate(a) new_collate(a)
474 # define perl_new_numeric(a) new_numeric(a)
476 /* varargs functions can't be handled with CPP macros. :-(
477 This provides a set of compatibility functions that don't take
478 an extra argument but grab the context pointer using the macro
481 #if defined(PERL_IMPLICIT_CONTEXT) && !defined(PERL_NO_SHORT_NAMES)
482 # define croak Perl_croak_nocontext
483 # define deb Perl_deb_nocontext
484 # define die Perl_die_nocontext
485 # define form Perl_form_nocontext
486 # define load_module Perl_load_module_nocontext
487 # define mess Perl_mess_nocontext
488 # define newSVpvf Perl_newSVpvf_nocontext
489 # define sv_catpvf Perl_sv_catpvf_nocontext
490 # define sv_setpvf Perl_sv_setpvf_nocontext
491 # define warn Perl_warn_nocontext
492 # define warner Perl_warner_nocontext
493 # define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext
494 # define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext
497 #endif /* !defined(PERL_CORE) && !defined(PERL_NOCOMPAT) */
499 #if !defined(PERL_IMPLICIT_CONTEXT)
500 /* undefined symbols, point them back at the usual ones */
501 # define Perl_croak_nocontext Perl_croak
502 # define Perl_die_nocontext Perl_die
503 # define Perl_deb_nocontext Perl_deb
504 # define Perl_form_nocontext Perl_form
505 # define Perl_load_module_nocontext Perl_load_module
506 # define Perl_mess_nocontext Perl_mess
507 # define Perl_newSVpvf_nocontext Perl_newSVpvf
508 # define Perl_sv_catpvf_nocontext Perl_sv_catpvf
509 # define Perl_sv_setpvf_nocontext Perl_sv_setpvf
510 # define Perl_warn_nocontext Perl_warn
511 # define Perl_warner_nocontext Perl_warner
512 # define Perl_sv_catpvf_mg_nocontext Perl_sv_catpvf_mg
513 # define Perl_sv_setpvf_mg_nocontext Perl_sv_setpvf_mg
518 close(EM) or die "Error closing EM: $!";
520 safer_unlink 'embedvar.h';
521 open(EM, '> embedvar.h')
522 or die "Can't create embedvar.h: $!\n";
524 print EM do_not_edit ("embedvar.h"), <<'END';
526 /* (Doing namespace management portably in C is really gross.) */
529 The following combinations of MULTIPLICITY and PERL_IMPLICIT_CONTEXT
532 2) MULTIPLICITY # supported for compatibility
533 3) MULTIPLICITY && PERL_IMPLICIT_CONTEXT
535 All other combinations of these flags are errors.
537 only #3 is supported directly, while #2 is a special
538 case of #3 (supported by redefining vTHX appropriately).
541 #if defined(MULTIPLICITY)
542 /* cases 2 and 3 above */
544 # if defined(PERL_IMPLICIT_CONTEXT)
547 # define vTHX PERL_GET_INTERP
552 for $sym (sort keys %thread) {
553 print EM multon($sym,'T','vTHX->');
558 /* cases 2 and 3 above */
562 for $sym (sort keys %intrp) {
563 print EM multon($sym,'I','vTHX->');
568 #else /* !MULTIPLICITY */
574 for $sym (sort keys %intrp) {
575 print EM multoff($sym,'I');
582 for $sym (sort keys %thread) {
583 print EM multoff($sym,'T');
588 #endif /* MULTIPLICITY */
590 #if defined(PERL_GLOBAL_STRUCT)
594 for $sym (sort keys %globvar) {
595 print EM multon($sym,'G','PL_Vars.');
600 #else /* !PERL_GLOBAL_STRUCT */
604 for $sym (sort keys %globvar) {
605 print EM multoff($sym,'G');
610 #endif /* PERL_GLOBAL_STRUCT */
612 #ifdef PERL_POLLUTE /* disabled by default in 5.6.0 */
616 for $sym (sort @extvars) {
617 print EM hide($sym,"PL_$sym");
622 #endif /* PERL_POLLUTE */
625 close(EM) or die "Error closing EM: $!";
627 safer_unlink 'perlapi.h';
628 safer_unlink 'perlapi.c';
629 open(CAPI, '> perlapi.c') or die "Can't create perlapi.c: $!\n";
630 open(CAPIH, '> perlapi.h') or die "Can't create perlapi.h: $!\n";
632 print CAPIH do_not_edit ("perlapi.h"), <<'EOT';
634 /* declare accessor functions for Perl variables */
635 #ifndef __perlapi_h__
636 #define __perlapi_h__
638 #if defined (MULTIPLICITY)
646 #define PERLVAR(v,t) EXTERN_C t* Perl_##v##_ptr(pTHX);
647 #define PERLVARA(v,n,t) typedef t PL_##v##_t[n]; \
648 EXTERN_C PL_##v##_t* Perl_##v##_ptr(pTHX);
649 #define PERLVARI(v,t,i) PERLVAR(v,t)
650 #define PERLVARIC(v,t,i) PERLVAR(v, const t)
653 #include "intrpvar.h"
654 #include "perlvars.h"
663 #if defined(PERL_CORE)
665 /* accessor functions for Perl variables (provide binary compatibility) */
667 /* these need to be mentioned here, or most linkers won't put them in
668 the perl executable */
670 #ifndef PERL_NO_FORCE_LINK
675 EXT void *PL_force_link_funcs[];
677 EXT void *PL_force_link_funcs[] = {
682 #define PERLVAR(v,t) (void*)Perl_##v##_ptr,
683 #define PERLVARA(v,n,t) PERLVAR(v,t)
684 #define PERLVARI(v,t,i) PERLVAR(v,t)
685 #define PERLVARIC(v,t,i) PERLVAR(v,t)
688 #include "intrpvar.h"
689 #include "perlvars.h"
700 #endif /* PERL_NO_FORCE_LINK */
702 #else /* !PERL_CORE */
706 foreach $sym (sort keys %intrp) {
707 print CAPIH bincompat_var('I',$sym);
710 foreach $sym (sort keys %thread) {
711 print CAPIH bincompat_var('T',$sym);
714 foreach $sym (sort keys %globvar) {
715 print CAPIH bincompat_var('G',$sym);
720 #endif /* !PERL_CORE */
721 #endif /* MULTIPLICITY */
723 #endif /* __perlapi_h__ */
726 close CAPIH or die "Error closing CAPIH: $!";
728 print CAPI do_not_edit ("perlapi.c"), <<'EOT';
734 #if defined (MULTIPLICITY)
736 /* accessor functions for Perl variables (provides binary compatibility) */
744 #define PERLVAR(v,t) t* Perl_##v##_ptr(pTHX) \
745 { return &(aTHX->v); }
746 #define PERLVARA(v,n,t) PL_##v##_t* Perl_##v##_ptr(pTHX) \
747 { return &(aTHX->v); }
749 #define PERLVARI(v,t,i) PERLVAR(v,t)
750 #define PERLVARIC(v,t,i) PERLVAR(v, const t)
753 #include "intrpvar.h"
757 #define PERLVAR(v,t) t* Perl_##v##_ptr(pTHX) \
758 { return &(PL_##v); }
759 #define PERLVARA(v,n,t) PL_##v##_t* Perl_##v##_ptr(pTHX) \
760 { return &(PL_##v); }
762 #define PERLVARIC(v,t,i) const t* Perl_##v##_ptr(pTHX) \
763 { return (const t *)&(PL_##v); }
764 #include "perlvars.h"
773 #endif /* MULTIPLICITY */
776 close(CAPI) or die "Error closing CAPI: $!";
778 # functions that take va_list* for implementing vararg functions
779 # NOTE: makedef.pl must be updated if you add symbols to %vfuncs
780 # XXX %vfuncs currently unused
782 Perl_croak Perl_vcroak
784 Perl_warner Perl_vwarner
787 Perl_load_module Perl_vload_module
790 Perl_newSVpvf Perl_vnewSVpvf
791 Perl_sv_setpvf Perl_sv_vsetpvf
792 Perl_sv_setpvf_mg Perl_sv_vsetpvf_mg
793 Perl_sv_catpvf Perl_sv_vcatpvf
794 Perl_sv_catpvf_mg Perl_sv_vcatpvf_mg
795 Perl_dump_indent Perl_dump_vindent
796 Perl_default_protect Perl_vdefault_protect