This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Stop lexical CORE sub from interfering with CORE::
authorFather Chrysostomos <sprout@cpan.org>
Thu, 7 Nov 2013 00:18:48 +0000 (16:18 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Fri, 8 Nov 2013 16:15:58 +0000 (08:15 -0800)
The way CORE:: was handled in the lexer was convoluted.

CORE was treated initially as a keyword, with exceptions in the lexer
to make it behave correctly.  If it turned out not to be followed
by ::, then the lexer would fall back to treating it as a bareword
or sub name.

Before even checking for a keyword, the lexer looks for :: and goes
to the bareword/sub code.  But it made a special exception there
for CORE::.

In the end, treating CORE as a keyword recognized by the keyword()
function requires more special cases than simply special-casing CORE::
in toke.c.

This fixes the lexical CORE sub bug, while reducing the total num-
ber of lines.

gv.c
keywords.c
keywords.h
op.c
pp.c
regen/keywords.pl
t/op/lexsub.t
toke.c

diff --git a/gv.c b/gv.c
index 136bada..1c86029 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -463,7 +463,7 @@ S_maybe_add_coresub(pTHX_ HV * const stash, GV *gv,
      /* no support for \&CORE::infix;
         no support for funcs that do not parse like funcs */
     case KEY___DATA__: case KEY___END__: case KEY_and: case KEY_AUTOLOAD:
-    case KEY_BEGIN   : case KEY_CHECK  : case KEY_cmp: case KEY_CORE    :
+    case KEY_BEGIN   : case KEY_CHECK  : case KEY_cmp:
     case KEY_default : case KEY_DESTROY:
     case KEY_do      : case KEY_dump   : case KEY_else  : case KEY_elsif  :
     case KEY_END     : case KEY_eq     : case KEY_eval  :
index 23d550d..cd8a99e 100644 (file)
@@ -490,19 +490,9 @@ Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords)
           goto unknown;
       }
 
-    case 4: /* 41 tokens of length 4 */
+    case 4: /* 40 tokens of length 4 */
       switch (name[0])
       {
-        case 'C':
-          if (name[1] == 'O' &&
-              name[2] == 'R' &&
-              name[3] == 'E')
-          {                                       /* CORE             */
-            return -KEY_CORE;
-          }
-
-          goto unknown;
-
         case 'I':
           if (name[1] == 'N' &&
               name[2] == 'I' &&
@@ -3449,5 +3439,5 @@ unknown:
 }
 
 /* Generated from:
- * e5a540774760ea54c761ef17ee4a153cc264e9a700b817d561e390730c457406 regen/keywords.pl
+ * 7c6d47fd2890b2422a40331ec90eac08f9808209b01f2b9c113141410fea91b5 regen/keywords.pl
  * ex: set ro: */
index 5ebde87..f23896c 100644 (file)
 #define KEY_AUTOLOAD           7
 #define KEY_BEGIN              8
 #define KEY_UNITCHECK          9
-#define KEY_CORE               10
-#define KEY_DESTROY            11
-#define KEY_END                        12
-#define KEY_INIT               13
-#define KEY_CHECK              14
-#define KEY_abs                        15
-#define KEY_accept             16
-#define KEY_alarm              17
-#define KEY_and                        18
-#define KEY_atan2              19
-#define KEY_bind               20
-#define KEY_binmode            21
-#define KEY_bless              22
-#define KEY_break              23
-#define KEY_caller             24
-#define KEY_chdir              25
-#define KEY_chmod              26
-#define KEY_chomp              27
-#define KEY_chop               28
-#define KEY_chown              29
-#define KEY_chr                        30
-#define KEY_chroot             31
-#define KEY_close              32
-#define KEY_closedir           33
-#define KEY_cmp                        34
-#define KEY_connect            35
-#define KEY_continue           36
-#define KEY_cos                        37
-#define KEY_crypt              38
-#define KEY_dbmclose           39
-#define KEY_dbmopen            40
-#define KEY_default            41
-#define KEY_defined            42
-#define KEY_delete             43
-#define KEY_die                        44
-#define KEY_do                 45
-#define KEY_dump               46
-#define KEY_each               47
-#define KEY_else               48
-#define KEY_elsif              49
-#define KEY_endgrent           50
-#define KEY_endhostent         51
-#define KEY_endnetent          52
-#define KEY_endprotoent                53
-#define KEY_endpwent           54
-#define KEY_endservent         55
-#define KEY_eof                        56
-#define KEY_eq                 57
-#define KEY_eval               58
-#define KEY_evalbytes          59
-#define KEY_exec               60
-#define KEY_exists             61
-#define KEY_exit               62
-#define KEY_exp                        63
-#define KEY_fc                 64
-#define KEY_fcntl              65
-#define KEY_fileno             66
-#define KEY_flock              67
-#define KEY_for                        68
-#define KEY_foreach            69
-#define KEY_fork               70
-#define KEY_format             71
-#define KEY_formline           72
-#define KEY_ge                 73
-#define KEY_getc               74
-#define KEY_getgrent           75
-#define KEY_getgrgid           76
-#define KEY_getgrnam           77
-#define KEY_gethostbyaddr      78
-#define KEY_gethostbyname      79
-#define KEY_gethostent         80
-#define KEY_getlogin           81
-#define KEY_getnetbyaddr       82
-#define KEY_getnetbyname       83
-#define KEY_getnetent          84
-#define KEY_getpeername                85
-#define KEY_getpgrp            86
-#define KEY_getppid            87
-#define KEY_getpriority                88
-#define KEY_getprotobyname     89
-#define KEY_getprotobynumber   90
-#define KEY_getprotoent                91
-#define KEY_getpwent           92
-#define KEY_getpwnam           93
-#define KEY_getpwuid           94
-#define KEY_getservbyname      95
-#define KEY_getservbyport      96
-#define KEY_getservent         97
-#define KEY_getsockname                98
-#define KEY_getsockopt         99
-#define KEY_given              100
-#define KEY_glob               101
-#define KEY_gmtime             102
-#define KEY_goto               103
-#define KEY_grep               104
-#define KEY_gt                 105
-#define KEY_hex                        106
-#define KEY_if                 107
-#define KEY_index              108
-#define KEY_int                        109
-#define KEY_ioctl              110
-#define KEY_join               111
-#define KEY_keys               112
-#define KEY_kill               113
-#define KEY_last               114
-#define KEY_lc                 115
-#define KEY_lcfirst            116
-#define KEY_le                 117
-#define KEY_length             118
-#define KEY_link               119
-#define KEY_listen             120
-#define KEY_local              121
-#define KEY_localtime          122
-#define KEY_lock               123
-#define KEY_log                        124
-#define KEY_lstat              125
-#define KEY_lt                 126
-#define KEY_m                  127
-#define KEY_map                        128
-#define KEY_mkdir              129
-#define KEY_msgctl             130
-#define KEY_msgget             131
-#define KEY_msgrcv             132
-#define KEY_msgsnd             133
-#define KEY_my                 134
-#define KEY_ne                 135
-#define KEY_next               136
-#define KEY_no                 137
-#define KEY_not                        138
-#define KEY_oct                        139
-#define KEY_open               140
-#define KEY_opendir            141
-#define KEY_or                 142
-#define KEY_ord                        143
-#define KEY_our                        144
-#define KEY_pack               145
-#define KEY_package            146
-#define KEY_pipe               147
-#define KEY_pop                        148
-#define KEY_pos                        149
-#define KEY_print              150
-#define KEY_printf             151
-#define KEY_prototype          152
-#define KEY_push               153
-#define KEY_q                  154
-#define KEY_qq                 155
-#define KEY_qr                 156
-#define KEY_quotemeta          157
-#define KEY_qw                 158
-#define KEY_qx                 159
-#define KEY_rand               160
-#define KEY_read               161
-#define KEY_readdir            162
-#define KEY_readline           163
-#define KEY_readlink           164
-#define KEY_readpipe           165
-#define KEY_recv               166
-#define KEY_redo               167
-#define KEY_ref                        168
-#define KEY_rename             169
-#define KEY_require            170
-#define KEY_reset              171
-#define KEY_return             172
-#define KEY_reverse            173
-#define KEY_rewinddir          174
-#define KEY_rindex             175
-#define KEY_rmdir              176
-#define KEY_s                  177
-#define KEY_say                        178
-#define KEY_scalar             179
-#define KEY_seek               180
-#define KEY_seekdir            181
-#define KEY_select             182
-#define KEY_semctl             183
-#define KEY_semget             184
-#define KEY_semop              185
-#define KEY_send               186
-#define KEY_setgrent           187
-#define KEY_sethostent         188
-#define KEY_setnetent          189
-#define KEY_setpgrp            190
-#define KEY_setpriority                191
-#define KEY_setprotoent                192
-#define KEY_setpwent           193
-#define KEY_setservent         194
-#define KEY_setsockopt         195
-#define KEY_shift              196
-#define KEY_shmctl             197
-#define KEY_shmget             198
-#define KEY_shmread            199
-#define KEY_shmwrite           200
-#define KEY_shutdown           201
-#define KEY_sin                        202
-#define KEY_sleep              203
-#define KEY_socket             204
-#define KEY_socketpair         205
-#define KEY_sort               206
-#define KEY_splice             207
-#define KEY_split              208
-#define KEY_sprintf            209
-#define KEY_sqrt               210
-#define KEY_srand              211
-#define KEY_stat               212
-#define KEY_state              213
-#define KEY_study              214
-#define KEY_sub                        215
-#define KEY_substr             216
-#define KEY_symlink            217
-#define KEY_syscall            218
-#define KEY_sysopen            219
-#define KEY_sysread            220
-#define KEY_sysseek            221
-#define KEY_system             222
-#define KEY_syswrite           223
-#define KEY_tell               224
-#define KEY_telldir            225
-#define KEY_tie                        226
-#define KEY_tied               227
-#define KEY_time               228
-#define KEY_times              229
-#define KEY_tr                 230
-#define KEY_truncate           231
-#define KEY_uc                 232
-#define KEY_ucfirst            233
-#define KEY_umask              234
-#define KEY_undef              235
-#define KEY_unless             236
-#define KEY_unlink             237
-#define KEY_unpack             238
-#define KEY_unshift            239
-#define KEY_untie              240
-#define KEY_until              241
-#define KEY_use                        242
-#define KEY_utime              243
-#define KEY_values             244
-#define KEY_vec                        245
-#define KEY_wait               246
-#define KEY_waitpid            247
-#define KEY_wantarray          248
-#define KEY_warn               249
-#define KEY_when               250
-#define KEY_while              251
-#define KEY_write              252
-#define KEY_x                  253
-#define KEY_xor                        254
-#define KEY_y                  255
+#define KEY_DESTROY            10
+#define KEY_END                        11
+#define KEY_INIT               12
+#define KEY_CHECK              13
+#define KEY_abs                        14
+#define KEY_accept             15
+#define KEY_alarm              16
+#define KEY_and                        17
+#define KEY_atan2              18
+#define KEY_bind               19
+#define KEY_binmode            20
+#define KEY_bless              21
+#define KEY_break              22
+#define KEY_caller             23
+#define KEY_chdir              24
+#define KEY_chmod              25
+#define KEY_chomp              26
+#define KEY_chop               27
+#define KEY_chown              28
+#define KEY_chr                        29
+#define KEY_chroot             30
+#define KEY_close              31
+#define KEY_closedir           32
+#define KEY_cmp                        33
+#define KEY_connect            34
+#define KEY_continue           35
+#define KEY_cos                        36
+#define KEY_crypt              37
+#define KEY_dbmclose           38
+#define KEY_dbmopen            39
+#define KEY_default            40
+#define KEY_defined            41
+#define KEY_delete             42
+#define KEY_die                        43
+#define KEY_do                 44
+#define KEY_dump               45
+#define KEY_each               46
+#define KEY_else               47
+#define KEY_elsif              48
+#define KEY_endgrent           49
+#define KEY_endhostent         50
+#define KEY_endnetent          51
+#define KEY_endprotoent                52
+#define KEY_endpwent           53
+#define KEY_endservent         54
+#define KEY_eof                        55
+#define KEY_eq                 56
+#define KEY_eval               57
+#define KEY_evalbytes          58
+#define KEY_exec               59
+#define KEY_exists             60
+#define KEY_exit               61
+#define KEY_exp                        62
+#define KEY_fc                 63
+#define KEY_fcntl              64
+#define KEY_fileno             65
+#define KEY_flock              66
+#define KEY_for                        67
+#define KEY_foreach            68
+#define KEY_fork               69
+#define KEY_format             70
+#define KEY_formline           71
+#define KEY_ge                 72
+#define KEY_getc               73
+#define KEY_getgrent           74
+#define KEY_getgrgid           75
+#define KEY_getgrnam           76
+#define KEY_gethostbyaddr      77
+#define KEY_gethostbyname      78
+#define KEY_gethostent         79
+#define KEY_getlogin           80
+#define KEY_getnetbyaddr       81
+#define KEY_getnetbyname       82
+#define KEY_getnetent          83
+#define KEY_getpeername                84
+#define KEY_getpgrp            85
+#define KEY_getppid            86
+#define KEY_getpriority                87
+#define KEY_getprotobyname     88
+#define KEY_getprotobynumber   89
+#define KEY_getprotoent                90
+#define KEY_getpwent           91
+#define KEY_getpwnam           92
+#define KEY_getpwuid           93
+#define KEY_getservbyname      94
+#define KEY_getservbyport      95
+#define KEY_getservent         96
+#define KEY_getsockname                97
+#define KEY_getsockopt         98
+#define KEY_given              99
+#define KEY_glob               100
+#define KEY_gmtime             101
+#define KEY_goto               102
+#define KEY_grep               103
+#define KEY_gt                 104
+#define KEY_hex                        105
+#define KEY_if                 106
+#define KEY_index              107
+#define KEY_int                        108
+#define KEY_ioctl              109
+#define KEY_join               110
+#define KEY_keys               111
+#define KEY_kill               112
+#define KEY_last               113
+#define KEY_lc                 114
+#define KEY_lcfirst            115
+#define KEY_le                 116
+#define KEY_length             117
+#define KEY_link               118
+#define KEY_listen             119
+#define KEY_local              120
+#define KEY_localtime          121
+#define KEY_lock               122
+#define KEY_log                        123
+#define KEY_lstat              124
+#define KEY_lt                 125
+#define KEY_m                  126
+#define KEY_map                        127
+#define KEY_mkdir              128
+#define KEY_msgctl             129
+#define KEY_msgget             130
+#define KEY_msgrcv             131
+#define KEY_msgsnd             132
+#define KEY_my                 133
+#define KEY_ne                 134
+#define KEY_next               135
+#define KEY_no                 136
+#define KEY_not                        137
+#define KEY_oct                        138
+#define KEY_open               139
+#define KEY_opendir            140
+#define KEY_or                 141
+#define KEY_ord                        142
+#define KEY_our                        143
+#define KEY_pack               144
+#define KEY_package            145
+#define KEY_pipe               146
+#define KEY_pop                        147
+#define KEY_pos                        148
+#define KEY_print              149
+#define KEY_printf             150
+#define KEY_prototype          151
+#define KEY_push               152
+#define KEY_q                  153
+#define KEY_qq                 154
+#define KEY_qr                 155
+#define KEY_quotemeta          156
+#define KEY_qw                 157
+#define KEY_qx                 158
+#define KEY_rand               159
+#define KEY_read               160
+#define KEY_readdir            161
+#define KEY_readline           162
+#define KEY_readlink           163
+#define KEY_readpipe           164
+#define KEY_recv               165
+#define KEY_redo               166
+#define KEY_ref                        167
+#define KEY_rename             168
+#define KEY_require            169
+#define KEY_reset              170
+#define KEY_return             171
+#define KEY_reverse            172
+#define KEY_rewinddir          173
+#define KEY_rindex             174
+#define KEY_rmdir              175
+#define KEY_s                  176
+#define KEY_say                        177
+#define KEY_scalar             178
+#define KEY_seek               179
+#define KEY_seekdir            180
+#define KEY_select             181
+#define KEY_semctl             182
+#define KEY_semget             183
+#define KEY_semop              184
+#define KEY_send               185
+#define KEY_setgrent           186
+#define KEY_sethostent         187
+#define KEY_setnetent          188
+#define KEY_setpgrp            189
+#define KEY_setpriority                190
+#define KEY_setprotoent                191
+#define KEY_setpwent           192
+#define KEY_setservent         193
+#define KEY_setsockopt         194
+#define KEY_shift              195
+#define KEY_shmctl             196
+#define KEY_shmget             197
+#define KEY_shmread            198
+#define KEY_shmwrite           199
+#define KEY_shutdown           200
+#define KEY_sin                        201
+#define KEY_sleep              202
+#define KEY_socket             203
+#define KEY_socketpair         204
+#define KEY_sort               205
+#define KEY_splice             206
+#define KEY_split              207
+#define KEY_sprintf            208
+#define KEY_sqrt               209
+#define KEY_srand              210
+#define KEY_stat               211
+#define KEY_state              212
+#define KEY_study              213
+#define KEY_sub                        214
+#define KEY_substr             215
+#define KEY_symlink            216
+#define KEY_syscall            217
+#define KEY_sysopen            218
+#define KEY_sysread            219
+#define KEY_sysseek            220
+#define KEY_system             221
+#define KEY_syswrite           222
+#define KEY_tell               223
+#define KEY_telldir            224
+#define KEY_tie                        225
+#define KEY_tied               226
+#define KEY_time               227
+#define KEY_times              228
+#define KEY_tr                 229
+#define KEY_truncate           230
+#define KEY_uc                 231
+#define KEY_ucfirst            232
+#define KEY_umask              233
+#define KEY_undef              234
+#define KEY_unless             235
+#define KEY_unlink             236
+#define KEY_unpack             237
+#define KEY_unshift            238
+#define KEY_untie              239
+#define KEY_until              240
+#define KEY_use                        241
+#define KEY_utime              242
+#define KEY_values             243
+#define KEY_vec                        244
+#define KEY_wait               245
+#define KEY_waitpid            246
+#define KEY_wantarray          247
+#define KEY_warn               248
+#define KEY_when               249
+#define KEY_while              250
+#define KEY_write              251
+#define KEY_x                  252
+#define KEY_xor                        253
+#define KEY_y                  254
 
 /* Generated from:
- * e5a540774760ea54c761ef17ee4a153cc264e9a700b817d561e390730c457406 regen/keywords.pl
+ * 7c6d47fd2890b2422a40331ec90eac08f9808209b01f2b9c113141410fea91b5 regen/keywords.pl
  * ex: set ro: */
diff --git a/op.c b/op.c
index fcefa23..dc0a4e3 100644 (file)
--- a/op.c
+++ b/op.c
@@ -11881,7 +11881,7 @@ Perl_custom_op_register(pTHX_ Perl_ppaddr_t ppaddr, const XOP *xop)
 This function assigns the prototype of the named core function to C<sv>, or
 to a new mortal SV if C<sv> is NULL.  It returns the modified C<sv>, or
 NULL if the core function has no prototype.  C<code> is a code as returned
-by C<keyword()>.  It must not be equal to 0 or -KEY_CORE.
+by C<keyword()>.  It must not be equal to 0.
 
 =cut
 */
@@ -11898,7 +11898,7 @@ Perl_core_prototype(pTHX_ SV *sv, const char *name, const int code,
 
     PERL_ARGS_ASSERT_CORE_PROTOTYPE;
 
-    assert (code && code != -KEY_CORE);
+    assert (code);
 
     if (!sv) sv = sv_newmortal();
 
diff --git a/pp.c b/pp.c
index d090069..a6ab24d 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -493,7 +493,7 @@ PP(pp_prototype)
        const char * s = SvPVX_const(TOPs);
        if (strnEQ(s, "CORE::", 6)) {
            const int code = keyword(s + 6, SvCUR(TOPs) - 6, 1);
-           if (!code || code == -KEY_CORE)
+           if (!code)
                DIE(aTHX_ "Can't find an opnumber for \"%"UTF8f"\"",
                   UTF8fARG(SvFLAGS(TOPs) & SVf_UTF8, SvCUR(TOPs)-6, s+6));
            {
index b783d08..bbc4188 100755 (executable)
@@ -124,7 +124,6 @@ __END__
 +AUTOLOAD
 +BEGIN
 +UNITCHECK
--CORE
 +DESTROY
 +END
 +INIT
index 0be305b..07bfce5 100644 (file)
@@ -8,7 +8,7 @@ BEGIN {
     *bar::like = *like;
 }
 no warnings 'deprecated';
-plan 139;
+plan 140;
 
 # -------------------- Errors with feature disabled -------------------- #
 
@@ -284,6 +284,9 @@ sub make_anon_with_state_sub{
   state sub END { shift }
   is eval{END('jkqeudth')}, jkqeudth,
     'state sub END {shift} implies @_, not @ARGV';
+  state sub CORE { scalar reverse shift }
+  is CORE::uc("hello"), "HELLO",
+    'lexical CORE does not interfere with CORE::...';
 }
 {
   state sub redef {}
diff --git a/toke.c b/toke.c
index 1b26d43..d7de0db 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -7004,8 +7004,10 @@ Perl_yylex(pTHX)
        anydelim = word_takes_any_delimeter(PL_tokenbuf, len);
 
        /* x::* is just a word, unless x is "CORE" */
-       if (!anydelim && *s == ':' && s[1] == ':' && strNE(PL_tokenbuf, "CORE"))
+       if (!anydelim && *s == ':' && s[1] == ':') {
+           if (strEQ(PL_tokenbuf, "CORE")) goto case_KEY_CORE;
            goto just_a_word;
+       }
 
        d = s;
        while (d < PL_bufend && isSPACE(*d))
@@ -7144,7 +7146,7 @@ Perl_yylex(pTHX)
                }
                gv = NULL;
                gvp = 0;
-               if (hgv && tmp != KEY_x && tmp != KEY_CORE)     /* never ambiguous */
+               if (hgv && tmp != KEY_x)        /* never ambiguous */
                    Perl_ck_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
                                   "Ambiguous call resolved as CORE::%s(), "
                                   "qualify as such or use &",
@@ -7750,8 +7752,8 @@ Perl_yylex(pTHX)
            }
            goto just_a_word;
 
-       case KEY_CORE:
-           if (*s == ':' && s[1] == ':') {
+       case_KEY_CORE:
+           {
                STRLEN olen = len;
                d = s;
                s += 2;
@@ -7775,7 +7777,6 @@ Perl_yylex(pTHX)
                    orig_keyword = tmp;
                goto reserved_word;
            }
-           goto just_a_word;
 
        case KEY_abs:
            UNI(OP_ABS);