3 require 5.003; # keep this compatible, an old perl is all we may have before
7 # Get function prototypes
8 require 'regen_lib.pl';
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-2003, 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 =~ /[AX]/ && $flags !~ /[xm]/
204 || $flags =~ /b/) { # public API, so export
205 $func = "Perl_$func" if $flags =~ /[pbX]/;
212 walk_table(\&write_protos, "proto.h", undef);
213 walk_table(\&write_global_sym, "global.sym", undef);
215 # XXX others that may need adding
219 my @extvars = qw(sv_undef sv_yes sv_no na dowarn
221 tainting tainted stack_base stack_sp sv_arenaroot
223 curstash DBsub DBsingle DBassertion debstash
237 my ($syms, $file) = @_;
239 open(FILE, "< $file")
240 or die "embed.pl: Can't open $file: $!\n";
242 s/[ \t]*#.*//; # Delete comments.
243 if (/^\s*(\S+)\s*$/) {
245 warn "duplicate symbol $sym while processing $file\n"
246 if exists $$syms{$sym};
253 # Perl_pp_* and Perl_ck_* are in pp.sym
254 readsyms my %ppsym, 'pp.sym';
256 sub readvars(\%$$@) {
257 my ($syms, $file,$pre,$keep_pre) = @_;
259 open(FILE, "< $file")
260 or die "embed.pl: Can't open $file: $!\n";
262 s/[ \t]*#.*//; # Delete comments.
263 if (/PERLVARA?I?C?\($pre(\w+)/) {
265 $sym = $pre . $sym if $keep_pre;
266 warn "duplicate symbol $sym while processing $file\n"
267 if exists $$syms{$sym};
268 $$syms{$sym} = $pre || 1;
277 readvars %intrp, 'intrpvar.h','I';
278 readvars %thread, 'thrdvar.h','T';
279 readvars %globvar, 'perlvars.h','G';
282 foreach $sym (sort keys %thread) {
283 warn "$sym in intrpvar.h as well as thrdvar.h\n" if exists $intrp{$sym};
292 my ($from, $to) = @_;
293 my $t = int(length($from) / 8);
294 "#define $from" . "\t" x ($t < 3 ? 3 - $t : 1) . "$to\n";
297 sub bincompat_var ($$) {
298 my ($pfx, $sym) = @_;
299 my $arg = ($pfx eq 'G' ? 'NULL' : 'aTHX');
300 undefine("PL_$sym") . hide("PL_$sym", "(*Perl_${pfx}${sym}_ptr($arg))");
304 my ($sym,$pre,$ptr) = @_;
305 hide("PL_$sym", "($ptr$pre$sym)");
310 return hide("PL_$pre$sym", "PL_$sym");
313 safer_unlink 'embed.h';
314 open(EM, '> embed.h') or die "Can't create embed.h: $!\n";
316 print EM do_not_edit ("embed.h"), <<'END';
318 /* (Doing namespace management portably in C is really gross.) */
320 /* By defining PERL_NO_SHORT_NAMES (not done by default) the short forms
321 * (like warn instead of Perl_warn) for the API are not defined.
322 * Not defining the short forms is a good thing for cleaner embedding. */
324 #ifndef PERL_NO_SHORT_NAMES
326 /* Hide global symbols */
328 #if !defined(PERL_IMPLICIT_CONTEXT)
336 $ret .= "$arg\n" if $arg =~ /^#\s*(if|ifn?def|else|endif)\b/;
339 my ($flags,$retval,$func,@args) = @_;
340 unless ($flags =~ /[om]/) {
342 $ret .= hide($func,"S_$func");
344 elsif ($flags =~ /p/) {
345 $ret .= hide($func,"Perl_$func");
348 if ($ret ne '' && $flags !~ /A/) {
350 $ret = "#if defined(PERL_CORE) || defined(PERL_EXT)\n$ret#endif\n";
352 $ret = "#ifdef PERL_CORE\n$ret#endif\n";
359 for $sym (sort keys %ppsym) {
361 print EM hide($sym, "Perl_$sym");
366 #else /* PERL_IMPLICIT_CONTEXT */
376 $ret .= "$arg\n" if $arg =~ /^#\s*(if|ifn?def|else|endif)\b/;
379 my ($flags,$retval,$func,@args) = @_;
380 unless ($flags =~ /[om]/) {
381 my $args = scalar @args;
382 if ($args and $args[$args-1] =~ /\.\.\./) {
383 # we're out of luck for varargs functions under CPP
385 elsif ($flags =~ /n/) {
387 $ret .= hide($func,"S_$func");
389 elsif ($flags =~ /p/) {
390 $ret .= hide($func,"Perl_$func");
394 my $alist = join(",", @az[0..$args-1]);
395 $ret = "#define $func($alist)";
396 my $t = int(length($ret) / 8);
397 $ret .= "\t" x ($t < 4 ? 4 - $t : 1);
399 $ret .= "S_$func(aTHX";
401 elsif ($flags =~ /p/) {
402 $ret .= "Perl_$func(aTHX";
404 $ret .= "_ " if $alist;
405 $ret .= $alist . ")\n";
408 unless ($flags =~ /A/) {
410 $ret = "#if defined(PERL_CORE) || defined(PERL_EXT)\n$ret#endif\n";
412 $ret = "#ifdef PERL_CORE\n$ret#endif\n";
419 for $sym (sort keys %ppsym) {
421 if ($sym =~ /^ck_/) {
422 print EM hide("$sym(a)", "Perl_$sym(aTHX_ a)");
424 elsif ($sym =~ /^pp_/) {
425 print EM hide("$sym()", "Perl_$sym(aTHX)");
428 warn "Illegal symbol '$sym' in pp.sym";
434 #endif /* PERL_IMPLICIT_CONTEXT */
436 #endif /* #ifndef PERL_NO_SHORT_NAMES */
442 /* Compatibility stubs. Compile extensions with -DPERL_NOCOMPAT to
446 #if !defined(PERL_CORE)
447 # define sv_setptrobj(rv,ptr,name) sv_setref_iv(rv,name,PTR2IV(ptr))
448 # define sv_setptrref(rv,ptr) sv_setref_iv(rv,Nullch,PTR2IV(ptr))
451 #if !defined(PERL_CORE) && !defined(PERL_NOCOMPAT)
453 /* Compatibility for various misnamed functions. All functions
454 in the API that begin with "perl_" (not "Perl_") take an explicit
455 interpreter context pointer.
456 The following are not like that, but since they had a "perl_"
457 prefix in previous versions, we provide compatibility macros.
459 # define perl_atexit(a,b) call_atexit(a,b)
460 # define perl_call_argv(a,b,c) call_argv(a,b,c)
461 # define perl_call_pv(a,b) call_pv(a,b)
462 # define perl_call_method(a,b) call_method(a,b)
463 # define perl_call_sv(a,b) call_sv(a,b)
464 # define perl_eval_sv(a,b) eval_sv(a,b)
465 # define perl_eval_pv(a,b) eval_pv(a,b)
466 # define perl_require_pv(a) require_pv(a)
467 # define perl_get_sv(a,b) get_sv(a,b)
468 # define perl_get_av(a,b) get_av(a,b)
469 # define perl_get_hv(a,b) get_hv(a,b)
470 # define perl_get_cv(a,b) get_cv(a,b)
471 # define perl_init_i18nl10n(a) init_i18nl10n(a)
472 # define perl_init_i18nl14n(a) init_i18nl14n(a)
473 # define perl_new_ctype(a) new_ctype(a)
474 # define perl_new_collate(a) new_collate(a)
475 # define perl_new_numeric(a) new_numeric(a)
477 /* varargs functions can't be handled with CPP macros. :-(
478 This provides a set of compatibility functions that don't take
479 an extra argument but grab the context pointer using the macro
482 #if defined(PERL_IMPLICIT_CONTEXT) && !defined(PERL_NO_SHORT_NAMES)
483 # define croak Perl_croak_nocontext
484 # define deb Perl_deb_nocontext
485 # define die Perl_die_nocontext
486 # define form Perl_form_nocontext
487 # define load_module Perl_load_module_nocontext
488 # define mess Perl_mess_nocontext
489 # define newSVpvf Perl_newSVpvf_nocontext
490 # define sv_catpvf Perl_sv_catpvf_nocontext
491 # define sv_setpvf Perl_sv_setpvf_nocontext
492 # define warn Perl_warn_nocontext
493 # define warner Perl_warner_nocontext
494 # define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext
495 # define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext
498 #endif /* !defined(PERL_CORE) && !defined(PERL_NOCOMPAT) */
500 #if !defined(PERL_IMPLICIT_CONTEXT)
501 /* undefined symbols, point them back at the usual ones */
502 # define Perl_croak_nocontext Perl_croak
503 # define Perl_die_nocontext Perl_die
504 # define Perl_deb_nocontext Perl_deb
505 # define Perl_form_nocontext Perl_form
506 # define Perl_load_module_nocontext Perl_load_module
507 # define Perl_mess_nocontext Perl_mess
508 # define Perl_newSVpvf_nocontext Perl_newSVpvf
509 # define Perl_sv_catpvf_nocontext Perl_sv_catpvf
510 # define Perl_sv_setpvf_nocontext Perl_sv_setpvf
511 # define Perl_warn_nocontext Perl_warn
512 # define Perl_warner_nocontext Perl_warner
513 # define Perl_sv_catpvf_mg_nocontext Perl_sv_catpvf_mg
514 # define Perl_sv_setpvf_mg_nocontext Perl_sv_setpvf_mg
519 close(EM) or die "Error closing EM: $!";
521 safer_unlink 'embedvar.h';
522 open(EM, '> embedvar.h')
523 or die "Can't create embedvar.h: $!\n";
525 print EM do_not_edit ("embedvar.h"), <<'END';
527 /* (Doing namespace management portably in C is really gross.) */
530 The following combinations of MULTIPLICITY and PERL_IMPLICIT_CONTEXT
533 2) MULTIPLICITY # supported for compatibility
534 3) MULTIPLICITY && PERL_IMPLICIT_CONTEXT
536 All other combinations of these flags are errors.
538 only #3 is supported directly, while #2 is a special
539 case of #3 (supported by redefining vTHX appropriately).
542 #if defined(MULTIPLICITY)
543 /* cases 2 and 3 above */
545 # if defined(PERL_IMPLICIT_CONTEXT)
548 # define vTHX PERL_GET_INTERP
553 for $sym (sort keys %thread) {
554 print EM multon($sym,'T','vTHX->');
559 /* cases 2 and 3 above */
563 for $sym (sort keys %intrp) {
564 print EM multon($sym,'I','vTHX->');
569 #else /* !MULTIPLICITY */
575 for $sym (sort keys %intrp) {
576 print EM multoff($sym,'I');
583 for $sym (sort keys %thread) {
584 print EM multoff($sym,'T');
589 #endif /* MULTIPLICITY */
591 #if defined(PERL_GLOBAL_STRUCT)
595 for $sym (sort keys %globvar) {
596 print EM multon($sym,'G','PL_Vars.');
601 #else /* !PERL_GLOBAL_STRUCT */
605 for $sym (sort keys %globvar) {
606 print EM multoff($sym,'G');
611 #endif /* PERL_GLOBAL_STRUCT */
613 #ifdef PERL_POLLUTE /* disabled by default in 5.6.0 */
617 for $sym (sort @extvars) {
618 print EM hide($sym,"PL_$sym");
623 #endif /* PERL_POLLUTE */
626 close(EM) or die "Error closing EM: $!";
628 safer_unlink 'perlapi.h';
629 safer_unlink 'perlapi.c';
630 open(CAPI, '> perlapi.c') or die "Can't create perlapi.c: $!\n";
631 open(CAPIH, '> perlapi.h') or die "Can't create perlapi.h: $!\n";
633 print CAPIH do_not_edit ("perlapi.h"), <<'EOT';
635 /* declare accessor functions for Perl variables */
636 #ifndef __perlapi_h__
637 #define __perlapi_h__
639 #if defined (MULTIPLICITY)
647 #define PERLVAR(v,t) EXTERN_C t* Perl_##v##_ptr(pTHX);
648 #define PERLVARA(v,n,t) typedef t PL_##v##_t[n]; \
649 EXTERN_C PL_##v##_t* Perl_##v##_ptr(pTHX);
650 #define PERLVARI(v,t,i) PERLVAR(v,t)
651 #define PERLVARIC(v,t,i) PERLVAR(v, const t)
654 #include "intrpvar.h"
655 #include "perlvars.h"
664 #if defined(PERL_CORE)
666 /* accessor functions for Perl variables (provide binary compatibility) */
668 /* these need to be mentioned here, or most linkers won't put them in
669 the perl executable */
671 #ifndef PERL_NO_FORCE_LINK
676 EXT void *PL_force_link_funcs[];
678 EXT void *PL_force_link_funcs[] = {
683 #define PERLVAR(v,t) (void*)Perl_##v##_ptr,
684 #define PERLVARA(v,n,t) PERLVAR(v,t)
685 #define PERLVARI(v,t,i) PERLVAR(v,t)
686 #define PERLVARIC(v,t,i) PERLVAR(v,t)
689 #include "intrpvar.h"
690 #include "perlvars.h"
701 #endif /* PERL_NO_FORCE_LINK */
703 #else /* !PERL_CORE */
707 foreach $sym (sort keys %intrp) {
708 print CAPIH bincompat_var('I',$sym);
711 foreach $sym (sort keys %thread) {
712 print CAPIH bincompat_var('T',$sym);
715 foreach $sym (sort keys %globvar) {
716 print CAPIH bincompat_var('G',$sym);
721 #endif /* !PERL_CORE */
722 #endif /* MULTIPLICITY */
724 #endif /* __perlapi_h__ */
727 close CAPIH or die "Error closing CAPIH: $!";
729 print CAPI do_not_edit ("perlapi.c"), <<'EOT';
735 #if defined (MULTIPLICITY)
737 /* accessor functions for Perl variables (provides binary compatibility) */
745 #define PERLVAR(v,t) t* Perl_##v##_ptr(pTHX) \
746 { return &(aTHX->v); }
747 #define PERLVARA(v,n,t) PL_##v##_t* Perl_##v##_ptr(pTHX) \
748 { return &(aTHX->v); }
750 #define PERLVARI(v,t,i) PERLVAR(v,t)
751 #define PERLVARIC(v,t,i) PERLVAR(v, const t)
754 #include "intrpvar.h"
758 #define PERLVAR(v,t) t* Perl_##v##_ptr(pTHX) \
759 { return &(PL_##v); }
760 #define PERLVARA(v,n,t) PL_##v##_t* Perl_##v##_ptr(pTHX) \
761 { return &(PL_##v); }
763 #define PERLVARIC(v,t,i) const t* Perl_##v##_ptr(pTHX) \
764 { return (const t *)&(PL_##v); }
765 #include "perlvars.h"
774 #endif /* MULTIPLICITY */
777 close(CAPI) or die "Error closing CAPI: $!";
779 # functions that take va_list* for implementing vararg functions
780 # NOTE: makedef.pl must be updated if you add symbols to %vfuncs
781 # XXX %vfuncs currently unused
783 Perl_croak Perl_vcroak
785 Perl_warner Perl_vwarner
788 Perl_load_module Perl_vload_module
791 Perl_newSVpvf Perl_vnewSVpvf
792 Perl_sv_setpvf Perl_sv_vsetpvf
793 Perl_sv_setpvf_mg Perl_sv_vsetpvf_mg
794 Perl_sv_catpvf Perl_sv_vcatpvf
795 Perl_sv_catpvf_mg Perl_sv_vcatpvf_mg
796 Perl_dump_indent Perl_dump_vindent
797 Perl_default_protect Perl_vdefault_protect