summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2007-10-17 15:10:58 +0000
committerNicholas Clark <nick@ccl4.org>2007-10-17 15:10:58 +0000
commitd279ab826c469db5d93d3d728fdcf1acd9265665 (patch)
treeaddeb0185f58c60c5cfc3f8cecb80ea1c6b27088
parent7edb818e3f3ca1bd7fb46554919c8cfd222bd37d (diff)
downloadperl-d279ab826c469db5d93d3d728fdcf1acd9265665.tar.gz
Storing the length of all the overloading names saves a strlen() in a
loop in Perl_Gv_AMupdate(). Brought to you by the Campaign for the Elimination of strlen(). p4raw-id: //depot/perl@32124
-rw-r--r--gv.c2
-rw-r--r--overload.c70
-rw-r--r--overload.pl16
3 files changed, 85 insertions, 3 deletions
diff --git a/gv.c b/gv.c
index 8c0b4e10bd..1b4816d878 100644
--- a/gv.c
+++ b/gv.c
@@ -1586,7 +1586,7 @@ Perl_Gv_AMupdate(pTHX_ HV *stash)
const char * const cooky = PL_AMG_names[i];
/* Human-readable form, for debugging: */
const char * const cp = (i >= DESTROY_amg ? cooky : AMG_id2name(i));
- const STRLEN l = strlen(cooky);
+ const STRLEN l = PL_AMG_namelens[i];
DEBUG_o( Perl_deb(aTHX_ "Checking overloading of \"%s\" in package \"%.256s\"\n",
cp, HvNAME_get(stash)) );
diff --git a/overload.c b/overload.c
index 0a220cc4de..bb7f1cbeef 100644
--- a/overload.c
+++ b/overload.c
@@ -14,6 +14,76 @@
#define AMG_id2name(id) (PL_AMG_names[id]+1)
+const U8 PL_AMG_namelens[NofAMmeth] = {
+ 2,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 3,
+ 3,
+ 5,
+ 3,
+ 3,
+ 2,
+ 2,
+ 4,
+ 4,
+ 3,
+ 4,
+ 2,
+ 3,
+ 2,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 9,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 3,
+ 4,
+ 3,
+ 4,
+ 3,
+ 4,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 4,
+ 4,
+ 2,
+ 6,
+ 4,
+ 4,
+ 4,
+ 4,
+ 5,
+ 2,
+ 3,
+ 2,
+ 3,
+ 3,
+ 7
+};
+
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
diff --git a/overload.pl b/overload.pl
index 9def29f429..6b1050e685 100644
--- a/overload.pl
+++ b/overload.pl
@@ -71,15 +71,26 @@ print C <<'EOF';
#define AMG_id2name(id) (PL_AMG_names[id]+1)
+const U8 PL_AMG_namelens[NofAMmeth] = {
+EOF
+
+my $last = pop @names;
+
+print C " $_,\n" foreach map { length $_ } @names;
+
+my $lastlen = length $last;
+print C <<"EOT";
+ $lastlen
+};
+
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
+EOT
-my $last = pop @names;
print C " \"$_\",\n" foreach map { s/(["\\"])/\\$1/g; $_ } @names;
print C <<"EOT";
@@ -88,6 +99,7 @@ print C <<"EOT";
EOT
close H or die $!;
+close C or die $!;
__DATA__
# Fallback should be the first