summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2006-10-06 21:19:26 +0000
committerNicholas Clark <nick@ccl4.org>2006-10-06 21:19:26 +0000
commitbab3dc31a54b991bcbbb7b33bb5ede8251f0e056 (patch)
tree49c57511090c50636f82738e294d2f6f9e59f9fb
parent8175493de8aa14da9d45b777a870a8e3de6e1135 (diff)
downloadperl-bab3dc31a54b991bcbbb7b33bb5ede8251f0e056.tar.gz
Generate the overload enum and names array programatically, which
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
-rw-r--r--MANIFEST2
-rw-r--r--overload.h168
-rw-r--r--overload.pl153
-rw-r--r--perl.h91
4 files changed, 324 insertions, 90 deletions
diff --git a/MANIFEST b/MANIFEST
index baf849a5fb..83fce2d8c2 100644
--- 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
index 0000000000..adf1feae2d
--- /dev/null
+++ b/overload.h
@@ -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
index 0000000000..640f4fdf29
--- /dev/null
+++ b/overload.pl
@@ -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 363fa0cdb4..93b4d62f11 100644
--- 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