From: Rafael Garcia-Suarez Date: Mon, 17 Dec 2001 16:37:18 +0000 (+0100) Subject: [PATCH] Re: chomp/chop prototype changed? X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=77bc9082d5f32bccec35cc0887964884d1ca682b;p=p5sagit%2Fp5-mst-13.2.git [PATCH] Re: chomp/chop prototype changed? Date: Mon, 17 Dec 2001 16:37:18 +0100 Message-ID: <20011217163718.A2292@rafael> Subject: Re: [PATCH] Re: chomp/chop prototype changed? From: Rafael Garcia-Suarez Date: Mon, 17 Dec 2001 23:17:06 +0100 Message-ID: <20011217231706.A730@rafael> p4raw-id: //depot/perl@13747 --- diff --git a/pod/perlsub.pod b/pod/perlsub.pod index 4329c16..efadf8f 100644 --- a/pod/perlsub.pod +++ b/pod/perlsub.pod @@ -1194,6 +1194,30 @@ a properly written override. For a fully functional example of overriding C, study the implementation of C in the standard library. +When you override a built-in, your replacement should be consistent (if +possible) with the built-in native syntax. You can achieve this by using +a suitable prototype. To get the prototype of an overridable built-in, +use the C function with an argument of C<"CORE::builtin_name"> +(see L). + +Note however that some built-ins can't have their syntax expressed by a +prototype (such as C or C). If you override them you won't +be able to fully mimic their original syntax. + +The built-ins C, C and C can also be overriden, but due +to special magic, their original syntax is preserved, and you don't have +to define a prototype for their replacements. (You can't override the +C syntax, though). + +C has special additional dark magic: if you invoke your +C replacement as C, it will actually receive +the argument C<"Foo/Bar.pm"> in @_. See L. + +And, as you'll have noticed from the previous example, if you override +C, the C*E> glob operator is overriden as well. + +Finally, some built-ins (e.g. C or C) can't be overriden. + =head2 Autoloading If you call a subroutine that is undefined, you would ordinarily diff --git a/pp.c b/pp.c index 9237a8b..23bf1ff 100644 --- a/pp.c +++ b/pp.c @@ -15,6 +15,7 @@ #include "EXTERN.h" #define PERL_IN_PP_C #include "perl.h" +#include "keywords.h" /* variations on pp_null */ @@ -365,6 +366,8 @@ PP(pp_prototype) I32 oa; char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */ + if (code == -KEY_chop || code == -KEY_chomp) + goto set; while (i < MAXO) { /* The slow way. */ if (strEQ(s + 6, PL_op_name[i]) || strEQ(s + 6, PL_op_desc[i])) diff --git a/toke.c b/toke.c index 314753f..1527daa 100644 --- a/toke.c +++ b/toke.c @@ -5330,12 +5330,12 @@ Perl_keyword(pTHX_ register char *d, I32 len) if (strEQ(d,"cos")) return -KEY_cos; break; case 4: - if (strEQ(d,"chop")) return KEY_chop; + if (strEQ(d,"chop")) return -KEY_chop; break; case 5: if (strEQ(d,"close")) return -KEY_close; if (strEQ(d,"chdir")) return -KEY_chdir; - if (strEQ(d,"chomp")) return KEY_chomp; + if (strEQ(d,"chomp")) return -KEY_chomp; if (strEQ(d,"chmod")) return -KEY_chmod; if (strEQ(d,"chown")) return -KEY_chown; if (strEQ(d,"crypt")) return -KEY_crypt;