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.
24 if ($file eq 'embed.h') {
25 $years = '1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003';
26 } elsif ($file eq 'embedvar.h') {
27 $years = '1999, 2000, 2001, 2002, 2003';
28 } elsif ($file eq 'global.sym') {
29 $years = '1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003';
30 } elsif ($file eq 'perlapi.c') {
31 $years = '1999, 2000, 2001';
32 } elsif ($file eq 'perlapi.h') {
33 $years = '1999, 2000, 2001, 2002, 2003';
34 } elsif ($file eq 'proto.h') {
35 $years = '1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003';
38 $years =~ s/1999,/1999,\n / if length $years > 40;
44 Copyright (C) $years, by Larry Wall and others
46 You may distribute under the terms of either the GNU General Public
47 License or the Artistic License, as specified in the README file.
49 !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
50 This file is built by embed.pl from data in embed.fnc, embed.pl,
51 pp.sym, intrpvar.h, perlvars.h and thrdvar.h.
52 Any changes made here will be lost!
54 Edit those files and run 'make regen_headers' to effect changes.
58 if ($file =~ m:\.[ch]$:) {
59 $warning =~ s:^: * :gm;
60 $warning =~ s: +$::gm;
65 $warning =~ s:^:# :gm;
66 $warning =~ s: +$::gm;
71 open IN, "embed.fnc" or die $!;
73 # walk table providing an array of components in each line to
74 # subroutine, printing the result
77 my $filename = shift || '-';
79 defined $leader or $leader = do_not_edit ($filename);
83 if (ref $filename) { # filehandle
87 safer_unlink $filename;
88 open F, ">$filename" or die "Can't open $filename: $!";
91 print $F $leader if $leader;
92 seek IN, 0, 0; # so we may restart
105 @args = split /\s*\|\s*/, $_;
107 my @outs = &{$function}(@args);
108 print $F @outs; # $function->(@args) is not 5.003
110 print $F $trailer if $trailer;
111 unless (ref $filename) {
112 close $F or die "Error closing $filename: $!";
116 sub munge_c_files () {
119 warn "\@ARGV empty, nothing to do\n";
124 $functions->{$_[2]} = \@_ if $_[@_-1] =~ /\.\.\./;
129 # if (/^#\s*include\s+"perl.h"/) {
130 # my $file = uc $ARGV;
132 # print "#define PERL_IN_$file\n";
138 # if (exists $functions->{$f}) {
139 # my $flags = $functions->{$f}[0];
140 # $repl = "Perl_$repl" if $flags =~ /p/;
141 # unless ($flags =~ /n/) {
143 # $repl .= "_ " if @{$functions->{$f}} > 3;
145 # warn("$ARGV:$.:$repl\n");
149 s{(\b(\w+)[ \t]*\([ \t]*(?!aTHX))}
153 if (exists $functions->{$f}) {
155 warn("$ARGV:$.:$`#$repl#$'");
160 close ARGV if eof; # restart $.
168 my $wrote_protected = 0;
177 my ($flags,$retval,$func,@args) = @_;
178 $ret .= '/* ' if $flags =~ /m/;
180 $retval = "STATIC $retval";
184 $retval = "PERL_CALLCONV $retval";
186 $func = "Perl_$func";
189 $ret .= "$retval\t$func(";
190 unless ($flags =~ /n/) {
192 $ret .= "_ " if @args;
195 $ret .= join ", ", @args;
198 $ret .= "void" if $flags =~ /n/;
201 $ret .= " __attribute__((noreturn))" if $flags =~ /r/;
202 if( $flags =~ /f/ ) {
203 my $prefix = $flags =~ /n/ ? '' : 'pTHX_';
204 my $args = scalar @args;
205 $ret .= sprintf "\n\t__attribute__format__(__printf__,%s%d,%s%d)",
206 $prefix, $args - 1, $prefix, $args;
209 $ret .= ' */' if $flags =~ /m/;
215 # generates global.sym (API export list), and populates %global with global symbols
216 sub write_global_sym {
219 my ($flags,$retval,$func,@args) = @_;
220 if ($flags =~ /[AX]/ && $flags !~ /[xm]/
221 || $flags =~ /b/) { # public API, so export
222 $func = "Perl_$func" if $flags =~ /[pbX]/;
229 walk_table(\&write_protos, "proto.h", undef);
230 walk_table(\&write_global_sym, "global.sym", undef);
232 # XXX others that may need adding
236 my @extvars = qw(sv_undef sv_yes sv_no na dowarn
238 tainting tainted stack_base stack_sp sv_arenaroot
240 curstash DBsub DBsingle DBassertion debstash
254 my ($syms, $file) = @_;
256 open(FILE, "< $file")
257 or die "embed.pl: Can't open $file: $!\n";
259 s/[ \t]*#.*//; # Delete comments.
260 if (/^\s*(\S+)\s*$/) {
262 warn "duplicate symbol $sym while processing $file\n"
263 if exists $$syms{$sym};
270 # Perl_pp_* and Perl_ck_* are in pp.sym
271 readsyms my %ppsym, 'pp.sym';
273 sub readvars(\%$$@) {
274 my ($syms, $file,$pre,$keep_pre) = @_;
276 open(FILE, "< $file")
277 or die "embed.pl: Can't open $file: $!\n";
279 s/[ \t]*#.*//; # Delete comments.
280 if (/PERLVARA?I?C?\($pre(\w+)/) {
282 $sym = $pre . $sym if $keep_pre;
283 warn "duplicate symbol $sym while processing $file\n"
284 if exists $$syms{$sym};
285 $$syms{$sym} = $pre || 1;
294 readvars %intrp, 'intrpvar.h','I';
295 readvars %thread, 'thrdvar.h','T';
296 readvars %globvar, 'perlvars.h','G';
299 foreach $sym (sort keys %thread) {
300 warn "$sym in intrpvar.h as well as thrdvar.h\n" if exists $intrp{$sym};
309 my ($from, $to) = @_;
310 my $t = int(length($from) / 8);
311 "#define $from" . "\t" x ($t < 3 ? 3 - $t : 1) . "$to\n";
314 sub bincompat_var ($$) {
315 my ($pfx, $sym) = @_;
316 my $arg = ($pfx eq 'G' ? 'NULL' : 'aTHX');
317 undefine("PL_$sym") . hide("PL_$sym", "(*Perl_${pfx}${sym}_ptr($arg))");
321 my ($sym,$pre,$ptr) = @_;
322 hide("PL_$sym", "($ptr$pre$sym)");
327 return hide("PL_$pre$sym", "PL_$sym");
330 safer_unlink 'embed.h';
331 open(EM, '> embed.h') or die "Can't create embed.h: $!\n";
333 print EM do_not_edit ("embed.h"), <<'END';
335 /* (Doing namespace management portably in C is really gross.) */
337 /* By defining PERL_NO_SHORT_NAMES (not done by default) the short forms
338 * (like warn instead of Perl_warn) for the API are not defined.
339 * Not defining the short forms is a good thing for cleaner embedding. */
341 #ifndef PERL_NO_SHORT_NAMES
343 /* Hide global symbols */
345 #if !defined(PERL_IMPLICIT_CONTEXT)
353 $ret .= "$arg\n" if $arg =~ /^#\s*(if|ifn?def|else|endif)\b/;
356 my ($flags,$retval,$func,@args) = @_;
357 unless ($flags =~ /[om]/) {
359 $ret .= hide($func,"S_$func");
361 elsif ($flags =~ /p/) {
362 $ret .= hide($func,"Perl_$func");
365 if ($ret ne '' && $flags !~ /A/) {
367 $ret = "#if defined(PERL_CORE) || defined(PERL_EXT)\n$ret#endif\n";
369 $ret = "#ifdef PERL_CORE\n$ret#endif\n";
376 for $sym (sort keys %ppsym) {
378 print EM hide($sym, "Perl_$sym");
383 #else /* PERL_IMPLICIT_CONTEXT */
393 $ret .= "$arg\n" if $arg =~ /^#\s*(if|ifn?def|else|endif)\b/;
396 my ($flags,$retval,$func,@args) = @_;
397 unless ($flags =~ /[om]/) {
398 my $args = scalar @args;
399 if ($args and $args[$args-1] =~ /\.\.\./) {
400 # we're out of luck for varargs functions under CPP
402 elsif ($flags =~ /n/) {
404 $ret .= hide($func,"S_$func");
406 elsif ($flags =~ /p/) {
407 $ret .= hide($func,"Perl_$func");
411 my $alist = join(",", @az[0..$args-1]);
412 $ret = "#define $func($alist)";
413 my $t = int(length($ret) / 8);
414 $ret .= "\t" x ($t < 4 ? 4 - $t : 1);
416 $ret .= "S_$func(aTHX";
418 elsif ($flags =~ /p/) {
419 $ret .= "Perl_$func(aTHX";
421 $ret .= "_ " if $alist;
422 $ret .= $alist . ")\n";
425 unless ($flags =~ /A/) {
427 $ret = "#if defined(PERL_CORE) || defined(PERL_EXT)\n$ret#endif\n";
429 $ret = "#ifdef PERL_CORE\n$ret#endif\n";
436 for $sym (sort keys %ppsym) {
438 if ($sym =~ /^ck_/) {
439 print EM hide("$sym(a)", "Perl_$sym(aTHX_ a)");
441 elsif ($sym =~ /^pp_/) {
442 print EM hide("$sym()", "Perl_$sym(aTHX)");
445 warn "Illegal symbol '$sym' in pp.sym";
451 #endif /* PERL_IMPLICIT_CONTEXT */
453 #endif /* #ifndef PERL_NO_SHORT_NAMES */
459 /* Compatibility stubs. Compile extensions with -DPERL_NOCOMPAT to
463 #if !defined(PERL_CORE)
464 # define sv_setptrobj(rv,ptr,name) sv_setref_iv(rv,name,PTR2IV(ptr))
465 # define sv_setptrref(rv,ptr) sv_setref_iv(rv,Nullch,PTR2IV(ptr))
468 #if !defined(PERL_CORE) && !defined(PERL_NOCOMPAT)
470 /* Compatibility for various misnamed functions. All functions
471 in the API that begin with "perl_" (not "Perl_") take an explicit
472 interpreter context pointer.
473 The following are not like that, but since they had a "perl_"
474 prefix in previous versions, we provide compatibility macros.
476 # define perl_atexit(a,b) call_atexit(a,b)
477 # define perl_call_argv(a,b,c) call_argv(a,b,c)
478 # define perl_call_pv(a,b) call_pv(a,b)
479 # define perl_call_method(a,b) call_method(a,b)
480 # define perl_call_sv(a,b) call_sv(a,b)
481 # define perl_eval_sv(a,b) eval_sv(a,b)
482 # define perl_eval_pv(a,b) eval_pv(a,b)
483 # define perl_require_pv(a) require_pv(a)
484 # define perl_get_sv(a,b) get_sv(a,b)
485 # define perl_get_av(a,b) get_av(a,b)
486 # define perl_get_hv(a,b) get_hv(a,b)
487 # define perl_get_cv(a,b) get_cv(a,b)
488 # define perl_init_i18nl10n(a) init_i18nl10n(a)
489 # define perl_init_i18nl14n(a) init_i18nl14n(a)
490 # define perl_new_ctype(a) new_ctype(a)
491 # define perl_new_collate(a) new_collate(a)
492 # define perl_new_numeric(a) new_numeric(a)
494 /* varargs functions can't be handled with CPP macros. :-(
495 This provides a set of compatibility functions that don't take
496 an extra argument but grab the context pointer using the macro
499 #if defined(PERL_IMPLICIT_CONTEXT) && !defined(PERL_NO_SHORT_NAMES)
500 # define croak Perl_croak_nocontext
501 # define deb Perl_deb_nocontext
502 # define die Perl_die_nocontext
503 # define form Perl_form_nocontext
504 # define load_module Perl_load_module_nocontext
505 # define mess Perl_mess_nocontext
506 # define newSVpvf Perl_newSVpvf_nocontext
507 # define sv_catpvf Perl_sv_catpvf_nocontext
508 # define sv_setpvf Perl_sv_setpvf_nocontext
509 # define warn Perl_warn_nocontext
510 # define warner Perl_warner_nocontext
511 # define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext
512 # define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext
515 #endif /* !defined(PERL_CORE) && !defined(PERL_NOCOMPAT) */
517 #if !defined(PERL_IMPLICIT_CONTEXT)
518 /* undefined symbols, point them back at the usual ones */
519 # define Perl_croak_nocontext Perl_croak
520 # define Perl_die_nocontext Perl_die
521 # define Perl_deb_nocontext Perl_deb
522 # define Perl_form_nocontext Perl_form
523 # define Perl_load_module_nocontext Perl_load_module
524 # define Perl_mess_nocontext Perl_mess
525 # define Perl_newSVpvf_nocontext Perl_newSVpvf
526 # define Perl_sv_catpvf_nocontext Perl_sv_catpvf
527 # define Perl_sv_setpvf_nocontext Perl_sv_setpvf
528 # define Perl_warn_nocontext Perl_warn
529 # define Perl_warner_nocontext Perl_warner
530 # define Perl_sv_catpvf_mg_nocontext Perl_sv_catpvf_mg
531 # define Perl_sv_setpvf_mg_nocontext Perl_sv_setpvf_mg
536 close(EM) or die "Error closing EM: $!";
538 safer_unlink 'embedvar.h';
539 open(EM, '> embedvar.h')
540 or die "Can't create embedvar.h: $!\n";
542 print EM do_not_edit ("embedvar.h"), <<'END';
544 /* (Doing namespace management portably in C is really gross.) */
547 The following combinations of MULTIPLICITY and PERL_IMPLICIT_CONTEXT
550 2) MULTIPLICITY # supported for compatibility
551 3) MULTIPLICITY && PERL_IMPLICIT_CONTEXT
553 All other combinations of these flags are errors.
555 only #3 is supported directly, while #2 is a special
556 case of #3 (supported by redefining vTHX appropriately).
559 #if defined(MULTIPLICITY)
560 /* cases 2 and 3 above */
562 # if defined(PERL_IMPLICIT_CONTEXT)
565 # define vTHX PERL_GET_INTERP
570 for $sym (sort keys %thread) {
571 print EM multon($sym,'T','vTHX->');
576 /* cases 2 and 3 above */
580 for $sym (sort keys %intrp) {
581 print EM multon($sym,'I','vTHX->');
586 #else /* !MULTIPLICITY */
592 for $sym (sort keys %intrp) {
593 print EM multoff($sym,'I');
600 for $sym (sort keys %thread) {
601 print EM multoff($sym,'T');
606 #endif /* MULTIPLICITY */
608 #if defined(PERL_GLOBAL_STRUCT)
612 for $sym (sort keys %globvar) {
613 print EM multon($sym,'G','PL_Vars.');
618 #else /* !PERL_GLOBAL_STRUCT */
622 for $sym (sort keys %globvar) {
623 print EM multoff($sym,'G');
628 #endif /* PERL_GLOBAL_STRUCT */
630 #ifdef PERL_POLLUTE /* disabled by default in 5.6.0 */
634 for $sym (sort @extvars) {
635 print EM hide($sym,"PL_$sym");
640 #endif /* PERL_POLLUTE */
643 close(EM) or die "Error closing EM: $!";
645 safer_unlink 'perlapi.h';
646 safer_unlink 'perlapi.c';
647 open(CAPI, '> perlapi.c') or die "Can't create perlapi.c: $!\n";
648 open(CAPIH, '> perlapi.h') or die "Can't create perlapi.h: $!\n";
650 print CAPIH do_not_edit ("perlapi.h"), <<'EOT';
652 /* declare accessor functions for Perl variables */
653 #ifndef __perlapi_h__
654 #define __perlapi_h__
656 #if defined (MULTIPLICITY)
664 #define PERLVAR(v,t) EXTERN_C t* Perl_##v##_ptr(pTHX);
665 #define PERLVARA(v,n,t) typedef t PL_##v##_t[n]; \
666 EXTERN_C PL_##v##_t* Perl_##v##_ptr(pTHX);
667 #define PERLVARI(v,t,i) PERLVAR(v,t)
668 #define PERLVARIC(v,t,i) PERLVAR(v, const t)
671 #include "intrpvar.h"
672 #include "perlvars.h"
681 #if defined(PERL_CORE)
683 /* accessor functions for Perl variables (provide binary compatibility) */
685 /* these need to be mentioned here, or most linkers won't put them in
686 the perl executable */
688 #ifndef PERL_NO_FORCE_LINK
693 EXT void *PL_force_link_funcs[];
695 EXT void *PL_force_link_funcs[] = {
700 #define PERLVAR(v,t) (void*)Perl_##v##_ptr,
701 #define PERLVARA(v,n,t) PERLVAR(v,t)
702 #define PERLVARI(v,t,i) PERLVAR(v,t)
703 #define PERLVARIC(v,t,i) PERLVAR(v,t)
706 #include "intrpvar.h"
707 #include "perlvars.h"
718 #endif /* PERL_NO_FORCE_LINK */
720 #else /* !PERL_CORE */
724 foreach $sym (sort keys %intrp) {
725 print CAPIH bincompat_var('I',$sym);
728 foreach $sym (sort keys %thread) {
729 print CAPIH bincompat_var('T',$sym);
732 foreach $sym (sort keys %globvar) {
733 print CAPIH bincompat_var('G',$sym);
738 #endif /* !PERL_CORE */
739 #endif /* MULTIPLICITY */
741 #endif /* __perlapi_h__ */
744 close CAPIH or die "Error closing CAPIH: $!";
746 print CAPI do_not_edit ("perlapi.c"), <<'EOT';
752 #if defined (MULTIPLICITY)
754 /* accessor functions for Perl variables (provides binary compatibility) */
762 #define PERLVAR(v,t) t* Perl_##v##_ptr(pTHX) \
763 { return &(aTHX->v); }
764 #define PERLVARA(v,n,t) PL_##v##_t* Perl_##v##_ptr(pTHX) \
765 { return &(aTHX->v); }
767 #define PERLVARI(v,t,i) PERLVAR(v,t)
768 #define PERLVARIC(v,t,i) PERLVAR(v, const t)
771 #include "intrpvar.h"
775 #define PERLVAR(v,t) t* Perl_##v##_ptr(pTHX) \
776 { return &(PL_##v); }
777 #define PERLVARA(v,n,t) PL_##v##_t* Perl_##v##_ptr(pTHX) \
778 { return &(PL_##v); }
780 #define PERLVARIC(v,t,i) const t* Perl_##v##_ptr(pTHX) \
781 { return (const t *)&(PL_##v); }
782 #include "perlvars.h"
791 #endif /* MULTIPLICITY */
794 close(CAPI) or die "Error closing CAPI: $!";
796 # functions that take va_list* for implementing vararg functions
797 # NOTE: makedef.pl must be updated if you add symbols to %vfuncs
798 # XXX %vfuncs currently unused
800 Perl_croak Perl_vcroak
802 Perl_warner Perl_vwarner
805 Perl_load_module Perl_vload_module
808 Perl_newSVpvf Perl_vnewSVpvf
809 Perl_sv_setpvf Perl_sv_vsetpvf
810 Perl_sv_setpvf_mg Perl_sv_vsetpvf_mg
811 Perl_sv_catpvf Perl_sv_vcatpvf
812 Perl_sv_catpvf_mg Perl_sv_vcatpvf_mg
813 Perl_dump_indent Perl_dump_vindent
814 Perl_default_protect Perl_vdefault_protect