This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Generate the overload enum and names array programatically, which
[perl5.git] / overload.pl
1 #!/usr/bin/perl -w
2
3 #
4 # Generate overload.h
5 # This allows the order of overloading consants to be changed.
6
7
8 BEGIN {
9     # Get function prototypes
10     require 'regen_lib.pl';
11 }
12
13 use strict;
14
15 my (@enums, @names);
16 while (<DATA>) {
17   next if /^#/;
18   next if /^$/;
19   my ($enum, $name) = /^(\S+)\s+(\S+)/ or die "Can't parse $_";
20   push @enums, $enum;
21   push @names, $name;
22 }
23
24 safer_unlink 'overload.h';
25 die "overload.h: $!" unless open(H, ">overload.h");
26 binmode H;
27 select H;
28 print <<'EOF';
29 /* -*- buffer-read-only: t -*-
30  *
31  *    overload.h
32  *
33  *    Copyright (C) 1997, 1998, 2000, 2001, 2005 and 2006 by Larry Wall and
34  *    others
35  *
36  *    You may distribute under the terms of either the GNU General Public
37  *    License or the Artistic License, as specified in the README file.
38  *
39  *  !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
40  *  This file is built by overload.pl
41  */
42
43 enum {
44 EOF
45
46 print "    ${_}_amg,\n", foreach @enums;
47
48 print <<'EOF';
49     max_amg_code
50     /* Do not leave a trailing comma here.  C9X allows it, C89 doesn't. */
51 };
52
53
54 #define NofAMmeth max_amg_code
55 #define AMG_id2name(id) (PL_AMG_names[id]+1)
56
57 #ifdef DOINIT
58 EXTCONST char * const PL_AMG_names[NofAMmeth] = {
59   /* Names kept in the symbol table.  fallback => "()", the rest has
60      "(" prepended.  The only other place in perl which knows about
61      this convention is AMG_id2name (used for debugging output and
62      'nomethod' only), the only other place which has it hardwired is
63      overload.pm.  */
64 EOF
65
66 my $last = pop @names;
67 print "    \"$_\",\n" foreach map { s/(["\\"])/\\$1/g; $_ } @names;
68
69 print <<"EOT";
70     "$last"
71 };
72 #else
73 EXTCONST char * PL_AMG_names[NofAMmeth];
74 #endif /* def INITAMAGIC */
75 EOT
76
77 __DATA__
78 # Fallback should be the first
79 fallback        ()
80
81 # These 5 are the most common in the fallback switch statement in amagic_call
82 to_sv           (${}
83 to_av           (@{}
84 to_hv           (%{}
85 to_gv           (*{}
86 to_cv           (&{}
87
88 # These have non-default cases in that switch statement
89 inc             (++
90 dec             (--
91 bool_           (bool
92 numer           (0+
93 string          (""
94 not             (!
95 copy            (=
96 abs             (abs
97 neg             (neg
98 iter            (<>
99 int             (int
100
101 # These 12 feature in the next switch statement
102 lt              (<
103 le              (<=
104 gt              (>
105 ge              (>=
106 eq              (==
107 ne              (!=
108 slt             (lt
109 sle             (le
110 sgt             (gt
111 sge             (ge
112 seq             (eq
113 sne             (ne
114
115 nomethod        (nomethod
116 add             (+
117 add_ass         (+=
118 subtr           (-
119 subtr_ass       (-=
120 mult            (*
121 mult_ass        (*=
122 div             (/
123 div_ass         (/=
124 modulo          (%
125 modulo_ass      (%=
126 pow             (**
127 pow_ass         (**=
128 lshift          (<<
129 lshift_ass      (<<=
130 rshift          (>>
131 rshift_ass      (>>=
132 band            (&
133 band_ass        (&=
134 bor             (|
135 bor_ass         (|=
136 bxor            (^
137 bxor_ass        (^=
138 ncmp            (<=>
139 scmp            (cmp
140 compl           (~
141 atan2           (atan2
142 cos             (cos
143 sin             (sin
144 exp             (exp
145 log             (log
146 sqrt            (sqrt
147 repeat          (x
148 repeat_ass      (x=
149 concat          (.
150 concat_ass      (.=
151 smart           (~~
152 # Note: Perl_Gv_AMupdate() assumes that DESTROY is the last entry
153 DESTROY         DESTROY