Generate the overload enum and names array programatically, which
Nicholas Clark [Fri, 6 Oct 2006 21:19:26 +0000 (21:19 +0000)]
allows experimentation with the order. The new order shaves nearly
900 bytes from gv.o, because the compiler can make smaller branch
tables for switch statements.

p4raw-id: //depot/perl@28950

MANIFEST
overload.h [new file with mode: 0644]
overload.pl [new file with mode: 0644]
perl.h

index baf849a..83fce2d 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -2804,6 +2804,8 @@ os2/OS2/typemap                   Common typemap for OS/2 types
 os2/perl2cmd.pl                        Corrects installed binaries under OS/2
 os2/perlrexx.c                 Support perl interpreter embedded in REXX
 os2/perlrexx.cmd               Test perl interpreter embedded in REXX
+overload.h                     generated overload enum and name table
+overload.pl                    generate overload.h
 pad.c                          Scratchpad functions
 pad.h                          Scratchpad headers
 patchlevel.h                   The current patch level of perl
diff --git a/overload.h b/overload.h
new file mode 100644 (file)
index 0000000..adf1fea
--- /dev/null
@@ -0,0 +1,168 @@
+/* -*- buffer-read-only: t -*-
+ *
+ *    overload.h
+ *
+ *    Copyright (C) 1997, 1998, 2000, 2001, 2005 and 2006 by Larry Wall and
+ *    others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ *  !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
+ *  This file is built by overload.pl
+ */
+
+enum {
+    fallback_amg,
+    to_sv_amg,
+    to_av_amg,
+    to_hv_amg,
+    to_gv_amg,
+    to_cv_amg,
+    inc_amg,
+    dec_amg,
+    bool__amg,
+    numer_amg,
+    string_amg,
+    not_amg,
+    copy_amg,
+    abs_amg,
+    neg_amg,
+    iter_amg,
+    int_amg,
+    lt_amg,
+    le_amg,
+    gt_amg,
+    ge_amg,
+    eq_amg,
+    ne_amg,
+    slt_amg,
+    sle_amg,
+    sgt_amg,
+    sge_amg,
+    seq_amg,
+    sne_amg,
+    nomethod_amg,
+    add_amg,
+    add_ass_amg,
+    subtr_amg,
+    subtr_ass_amg,
+    mult_amg,
+    mult_ass_amg,
+    div_amg,
+    div_ass_amg,
+    modulo_amg,
+    modulo_ass_amg,
+    pow_amg,
+    pow_ass_amg,
+    lshift_amg,
+    lshift_ass_amg,
+    rshift_amg,
+    rshift_ass_amg,
+    band_amg,
+    band_ass_amg,
+    bor_amg,
+    bor_ass_amg,
+    bxor_amg,
+    bxor_ass_amg,
+    ncmp_amg,
+    scmp_amg,
+    compl_amg,
+    atan2_amg,
+    cos_amg,
+    sin_amg,
+    exp_amg,
+    log_amg,
+    sqrt_amg,
+    repeat_amg,
+    repeat_ass_amg,
+    concat_amg,
+    concat_ass_amg,
+    smart_amg,
+    DESTROY_amg,
+    max_amg_code
+    /* Do not leave a trailing comma here.  C9X allows it, C89 doesn't. */
+};
+
+
+#define NofAMmeth max_amg_code
+#define AMG_id2name(id) (PL_AMG_names[id]+1)
+
+#ifdef DOINIT
+EXTCONST char * const PL_AMG_names[NofAMmeth] = {
+  /* Names kept in the symbol table.  fallback => "()", the rest has
+     "(" prepended.  The only other place in perl which knows about
+     this convention is AMG_id2name (used for debugging output and
+     'nomethod' only), the only other place which has it hardwired is
+     overload.pm.  */
+    "()",
+    "(${}",
+    "(@{}",
+    "(%{}",
+    "(*{}",
+    "(&{}",
+    "(++",
+    "(--",
+    "(bool",
+    "(0+",
+    "(\"\"",
+    "(!",
+    "(=",
+    "(abs",
+    "(neg",
+    "(<>",
+    "(int",
+    "(<",
+    "(<=",
+    "(>",
+    "(>=",
+    "(==",
+    "(!=",
+    "(lt",
+    "(le",
+    "(gt",
+    "(ge",
+    "(eq",
+    "(ne",
+    "(nomethod",
+    "(+",
+    "(+=",
+    "(-",
+    "(-=",
+    "(*",
+    "(*=",
+    "(/",
+    "(/=",
+    "(%",
+    "(%=",
+    "(**",
+    "(**=",
+    "(<<",
+    "(<<=",
+    "(>>",
+    "(>>=",
+    "(&",
+    "(&=",
+    "(|",
+    "(|=",
+    "(^",
+    "(^=",
+    "(<=>",
+    "(cmp",
+    "(~",
+    "(atan2",
+    "(cos",
+    "(sin",
+    "(exp",
+    "(log",
+    "(sqrt",
+    "(x",
+    "(x=",
+    "(.",
+    "(.=",
+    "(~~",
+    "DESTROY"
+};
+#else
+EXTCONST char * PL_AMG_names[NofAMmeth];
+#endif /* def INITAMAGIC */
diff --git a/overload.pl b/overload.pl
new file mode 100644 (file)
index 0000000..640f4fd
--- /dev/null
@@ -0,0 +1,153 @@
+#!/usr/bin/perl -w
+
+#
+# Generate overload.h
+# This allows the order of overloading consants to be changed.
+# 
+
+BEGIN {
+    # Get function prototypes
+    require 'regen_lib.pl';
+}
+
+use strict;
+
+my (@enums, @names);
+while (<DATA>) {
+  next if /^#/;
+  next if /^$/;
+  my ($enum, $name) = /^(\S+)\s+(\S+)/ or die "Can't parse $_";
+  push @enums, $enum;
+  push @names, $name;
+}
+
+safer_unlink 'overload.h';
+die "overload.h: $!" unless open(H, ">overload.h");
+binmode H;
+select H;
+print <<'EOF';
+/* -*- buffer-read-only: t -*-
+ *
+ *    overload.h
+ *
+ *    Copyright (C) 1997, 1998, 2000, 2001, 2005 and 2006 by Larry Wall and
+ *    others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ *  !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
+ *  This file is built by overload.pl
+ */
+
+enum {
+EOF
+
+print "    ${_}_amg,\n", foreach @enums;
+
+print <<'EOF';
+    max_amg_code
+    /* Do not leave a trailing comma here.  C9X allows it, C89 doesn't. */
+};
+
+
+#define NofAMmeth max_amg_code
+#define AMG_id2name(id) (PL_AMG_names[id]+1)
+
+#ifdef DOINIT
+EXTCONST char * const PL_AMG_names[NofAMmeth] = {
+  /* Names kept in the symbol table.  fallback => "()", the rest has
+     "(" prepended.  The only other place in perl which knows about
+     this convention is AMG_id2name (used for debugging output and
+     'nomethod' only), the only other place which has it hardwired is
+     overload.pm.  */
+EOF
+
+my $last = pop @names;
+print "    \"$_\",\n" foreach map { s/(["\\"])/\\$1/g; $_ } @names;
+
+print <<"EOT";
+    "$last"
+};
+#else
+EXTCONST char * PL_AMG_names[NofAMmeth];
+#endif /* def INITAMAGIC */
+EOT
+
+__DATA__
+# Fallback should be the first
+fallback       ()
+
+# These 5 are the most common in the fallback switch statement in amagic_call
+to_sv          (${}
+to_av          (@{}
+to_hv          (%{}
+to_gv          (*{}
+to_cv          (&{}
+
+# These have non-default cases in that switch statement
+inc            (++
+dec            (--
+bool_          (bool
+numer          (0+
+string         (""
+not            (!
+copy           (=
+abs            (abs
+neg            (neg
+iter           (<>
+int            (int
+
+# These 12 feature in the next switch statement
+lt             (<
+le             (<=
+gt             (>
+ge             (>=
+eq             (==
+ne             (!=
+slt            (lt
+sle            (le
+sgt            (gt
+sge            (ge
+seq            (eq
+sne            (ne
+
+nomethod       (nomethod
+add            (+
+add_ass                (+=
+subtr          (-
+subtr_ass      (-=
+mult           (*
+mult_ass       (*=
+div            (/
+div_ass                (/=
+modulo         (%
+modulo_ass     (%=
+pow            (**
+pow_ass                (**=
+lshift         (<<
+lshift_ass     (<<=
+rshift         (>>
+rshift_ass     (>>=
+band           (&
+band_ass       (&=
+bor            (|
+bor_ass                (|=
+bxor           (^
+bxor_ass       (^=
+ncmp           (<=>
+scmp           (cmp
+compl          (~
+atan2          (atan2
+cos            (cos
+sin            (sin
+exp            (exp
+log            (log
+sqrt           (sqrt
+repeat         (x
+repeat_ass     (x=
+concat         (.
+concat_ass     (.=
+smart          (~~
+# Note: Perl_Gv_AMupdate() assumes that DESTROY is the last entry
+DESTROY                DESTROY
diff --git a/perl.h b/perl.h
index 363fa0c..93b4d62 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -4938,96 +4938,7 @@ MGVTBL_SET(
     NULL
 );
 
-
-enum {
-  fallback_amg,        abs_amg,
-  bool__amg,   nomethod_amg,
-  string_amg,  numer_amg,
-  add_amg,     add_ass_amg,
-  subtr_amg,   subtr_ass_amg,
-  mult_amg,    mult_ass_amg,
-  div_amg,     div_ass_amg,
-  modulo_amg,  modulo_ass_amg,
-  pow_amg,     pow_ass_amg,
-  lshift_amg,  lshift_ass_amg,
-  rshift_amg,  rshift_ass_amg,
-  band_amg,    band_ass_amg,
-  bor_amg,     bor_ass_amg,
-  bxor_amg,    bxor_ass_amg,
-  lt_amg,      le_amg,
-  gt_amg,      ge_amg,
-  eq_amg,      ne_amg,
-  ncmp_amg,    scmp_amg,
-  slt_amg,     sle_amg,
-  sgt_amg,     sge_amg,
-  seq_amg,     sne_amg,
-  not_amg,     compl_amg,
-  inc_amg,     dec_amg,
-  atan2_amg,   cos_amg,
-  sin_amg,     exp_amg,
-  log_amg,     sqrt_amg,
-  repeat_amg,   repeat_ass_amg,
-  concat_amg,  concat_ass_amg,
-  copy_amg,    neg_amg,
-  to_sv_amg,   to_av_amg,
-  to_hv_amg,   to_gv_amg,
-  to_cv_amg,   iter_amg,
-  int_amg,     smart_amg,
-
-  /* Note: Perl_Gv_AMupdate() assumes that DESTROY is the last entry */
-  DESTROY_amg,
-  max_amg_code
-  /* Do not leave a trailing comma here.  C9X allows it, C89 doesn't. */
-};
-
-#define NofAMmeth max_amg_code
-#define AMG_id2name(id) (PL_AMG_names[id]+1)
-
-#ifdef DOINIT
-EXTCONST char * const PL_AMG_names[NofAMmeth] = {
-  /* Names kept in the symbol table.  fallback => "()", the rest has
-     "(" prepended.  The only other place in perl which knows about
-     this convention is AMG_id2name (used for debugging output and
-     'nomethod' only), the only other place which has it hardwired is
-     overload.pm.  */
-  "()",                "(abs",                 /* "fallback" should be the first. */
-  "(bool",     "(nomethod",
-  "(\"\"",     "(0+",
-  "(+",                "(+=",
-  "(-",                "(-=",
-  "(*",                "(*=",
-  "(/",                "(/=",
-  "(%",                "(%=",
-  "(**",       "(**=",
-  "(<<",       "(<<=",
-  "(>>",       "(>>=",
-  "(&",                "(&=",
-  "(|",                "(|=",
-  "(^",                "(^=",
-  "(<",                "(<=",
-  "(>",                "(>=",
-  "(==",       "(!=",
-  "(<=>",      "(cmp",
-  "(lt",       "(le",
-  "(gt",       "(ge",
-  "(eq",       "(ne",
-  "(!",                "(~",
-  "(++",       "(--",
-  "(atan2",    "(cos",
-  "(sin",      "(exp",
-  "(log",      "(sqrt",
-  "(x",                "(x=",
-  "(.",                "(.=",
-  "(=",                "(neg",
-  "(${}",      "(@{}",
-  "(%{}",      "(*{}",
-  "(&{}",      "(<>",
-  "(int",      "(~~",
-  "DESTROY"
-};
-#else
-EXTCONST char * PL_AMG_names[NofAMmeth];
-#endif /* def INITAMAGIC */
+#include "overload.h"
 
 END_EXTERN_C