From: Nicholas Clark Date: Fri, 6 Oct 2006 21:19:26 +0000 (+0000) Subject: Generate the overload enum and names array programatically, which X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=bab3dc31a54b991bcbbb7b33bb5ede8251f0e056;p=p5sagit%2Fp5-mst-13.2.git 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 --- diff --git a/MANIFEST b/MANIFEST index baf849a..83fce2d 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 0000000..adf1fea --- /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 0000000..640f4fd --- /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 () { + 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 --- 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