diff options
author | Nicholas Clark <nick@ccl4.org> | 2006-10-06 21:19:26 +0000 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2006-10-06 21:19:26 +0000 |
commit | bab3dc31a54b991bcbbb7b33bb5ede8251f0e056 (patch) | |
tree | 49c57511090c50636f82738e294d2f6f9e59f9fb /overload.pl | |
parent | 8175493de8aa14da9d45b777a870a8e3de6e1135 (diff) | |
download | perl-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
Diffstat (limited to 'overload.pl')
-rw-r--r-- | overload.pl | 153 |
1 files changed, 153 insertions, 0 deletions
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 |