diff options
author | Paul "LeoNerd" Evans <leonerd@leonerd.org.uk> | 2022-12-24 13:17:47 +0000 |
---|---|---|
committer | Paul "LeoNerd" Evans <leonerd@leonerd.org.uk> | 2023-02-10 12:07:02 +0000 |
commit | 99b497aa90ed7db99d29a301b47c91fba65c9cb3 (patch) | |
tree | 09e231f3a6838cdb2df9db9454981b9205046ba1 /keywords.c | |
parent | b40895ae558e0aff0c347785dafeaaff40a01801 (diff) | |
download | perl-99b497aa90ed7db99d29a301b47c91fba65c9cb3.tar.gz |
Initial attack at basic 'class' feature
Adds a new experimental warning, feature, keywords and enough parsing to
implement basic classes with an empty `new` constructor method.
Inject a $self lexical into method bodies; populate it with the object instance, suitably shifted
Creates a new OP_METHSTART opcode to perform method setup
Define an aux flag to remark which stashes are classes
Basic implementation of fields.
Basic anonymous methods.
Diffstat (limited to 'keywords.c')
-rw-r--r-- | keywords.c | 146 |
1 files changed, 100 insertions, 46 deletions
diff --git a/keywords.c b/keywords.c index ed26717ba0..54f5d94fd1 100644 --- a/keywords.c +++ b/keywords.c @@ -978,7 +978,7 @@ Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords) goto unknown; } - case 5: /* 41 tokens of length 5 */ + case 5: /* 43 tokens of length 5 */ switch (name[0]) { case 'B': @@ -1119,14 +1119,29 @@ Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords) } case 'l': - if (name[2] == 'o' && - name[3] == 's' && - name[4] == 'e') - { /* close */ - return -KEY_close; - } + switch (name[2]) + { + case 'a': + if (name[3] == 's' && + name[4] == 's') + { /* class */ + return (all_keywords || FEATURE_CLASS_IS_ENABLED ? -KEY_class : 0); + } - goto unknown; + goto unknown; + + case 'o': + if (name[3] == 's' && + name[4] == 'e') + { /* close */ + return -KEY_close; + } + + goto unknown; + + default: + goto unknown; + } case 'r': if (name[2] == 'y' && @@ -1177,6 +1192,16 @@ Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords) goto unknown; + case 'i': + if (name[2] == 'e' && + name[3] == 'l' && + name[4] == 'd') + { /* field */ + return (all_keywords || FEATURE_CLASS_IS_ENABLED ? -KEY_field : 0); + } + + goto unknown; + case 'l': if (name[2] == 'o' && name[3] == 'c' && @@ -1494,9 +1519,21 @@ Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords) goto unknown; } - case 6: /* 33 tokens of length 6 */ + case 6: /* 35 tokens of length 6 */ switch (name[0]) { + case 'A': + if (name[1] == 'D' && + name[2] == 'J' && + name[3] == 'U' && + name[4] == 'S' && + name[5] == 'T') + { /* ADJUST */ + return (all_keywords || FEATURE_CLASS_IS_ENABLED ? KEY_ADJUST : 0); + } + + goto unknown; + case 'a': if (name[1] == 'c' && name[2] == 'c' && @@ -1650,54 +1687,71 @@ Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords) } case 'm': - if (name[1] == 's' && - name[2] == 'g') + switch (name[1]) { - switch (name[3]) - { - case 'c': - if (name[4] == 't' && - name[5] == 'l') - { /* msgctl */ - return -KEY_msgctl; - } + case 'e': + if (name[2] == 't' && + name[3] == 'h' && + name[4] == 'o' && + name[5] == 'd') + { /* method */ + return (all_keywords || FEATURE_CLASS_IS_ENABLED ? -KEY_method : 0); + } - goto unknown; + goto unknown; - case 'g': - if (name[4] == 'e' && - name[5] == 't') - { /* msgget */ - return -KEY_msgget; - } + case 's': + if (name[2] == 'g') + { + switch (name[3]) + { + case 'c': + if (name[4] == 't' && + name[5] == 'l') + { /* msgctl */ + return -KEY_msgctl; + } - goto unknown; + goto unknown; - case 'r': - if (name[4] == 'c' && - name[5] == 'v') - { /* msgrcv */ - return -KEY_msgrcv; - } + case 'g': + if (name[4] == 'e' && + name[5] == 't') + { /* msgget */ + return -KEY_msgget; + } - goto unknown; + goto unknown; - case 's': - if (name[4] == 'n' && - name[5] == 'd') - { /* msgsnd */ - return -KEY_msgsnd; + case 'r': + if (name[4] == 'c' && + name[5] == 'v') + { /* msgrcv */ + return -KEY_msgrcv; + } + + goto unknown; + + case 's': + if (name[4] == 'n' && + name[5] == 'd') + { /* msgsnd */ + return -KEY_msgsnd; + } + + goto unknown; + + default: + goto unknown; } + } - goto unknown; + goto unknown; - default: - goto unknown; - } + default: + goto unknown; } - goto unknown; - case 'p': if (name[1] == 'r' && name[2] == 'i' && @@ -3504,5 +3558,5 @@ unknown: } /* Generated from: - * b680fb3a27b173b65d9c4e534ad92897c925e336476879a6be1da18ac55cbe8b regen/keywords.pl + * eb67e851da14ede1aad67aec4a387fa250c1345407fad0a02988d2d8d3cc27f2 regen/keywords.pl * ex: set ro: */ |