summaryrefslogtreecommitdiff
path: root/keywords.c
diff options
context:
space:
mode:
authorPaul "LeoNerd" Evans <leonerd@leonerd.org.uk>2022-12-24 13:17:47 +0000
committerPaul "LeoNerd" Evans <leonerd@leonerd.org.uk>2023-02-10 12:07:02 +0000
commit99b497aa90ed7db99d29a301b47c91fba65c9cb3 (patch)
tree09e231f3a6838cdb2df9db9454981b9205046ba1 /keywords.c
parentb40895ae558e0aff0c347785dafeaaff40a01801 (diff)
downloadperl-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.c146
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: */