This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Replace OP stubs in mathoms.c with #define aliases in opcode.h
[perl5.git] / regen / opcode.pl
index d1a47d5..5b7aee7 100755 (executable)
@@ -38,7 +38,8 @@ while (<DATA>) {
     my ($key, $desc, $check, $flags, $args) = split(/\t+/, $_, 5);
     $args = '' unless defined $args;
 
-    warn qq[Description "$desc" duplicates $seen{$desc}\n] if $seen{$desc};
+    warn qq[Description "$desc" duplicates $seen{$desc}\n]
+     if $seen{$desc} and $key ne "transr";
     die qq[Opcode "$key" duplicates $seen{$key}\n] if $seen{$key};
     $seen{$desc} = qq[description of opcode "$key"];
     $seen{$key} = qq[opcode "$key"];
@@ -105,6 +106,15 @@ my @raw_alias = (
                 Perl_pp_bit_or => ['bit_xor'],
                 Perl_pp_rv2av => ['rv2hv'],
                 Perl_pp_akeys => ['avalues'],
+                Perl_pp_rkeys => [qw(rvalues reach)],
+                Perl_pp_trans => ['transr'],
+                Perl_pp_chop => ['chomp'],
+                Perl_pp_schop => ['schomp'],
+                Perl_pp_bind => ['connect'],
+                Perl_pp_preinc => ['i_preinc'],
+                Perl_pp_predec => ['i_predec'],
+                Perl_pp_postinc => ['i_postinc'],
+                Perl_pp_postdec => ['i_postdec'],
                );
 
 while (my ($func, $names) = splice @raw_alias, 0, 2) {
@@ -133,10 +143,13 @@ print <<"END";
 
 #ifndef PERL_GLOBAL_STRUCT_INIT
 
-#define Perl_pp_i_preinc Perl_pp_preinc
-#define Perl_pp_i_predec Perl_pp_predec
-#define Perl_pp_i_postinc Perl_pp_postinc
-#define Perl_pp_i_postdec Perl_pp_postdec
+END
+
+for (@ops) {
+    print "#define Perl_pp_$_ $alias{$_}\n" if $alias{$_};
+}
+
+print <<'END';
 
 PERL_PPDEF(Perl_unimplemented_op)
 
@@ -170,19 +183,12 @@ for (@ops) {
 print $on "\t", &tab(3,"OP_max"), "\n";
 print $on "} opcode;\n";
 print $on "\n#define MAXO ", scalar @ops, "\n";
-print $on "#define OP_phoney_INPUT_ONLY -1\n";
-print $on "#define OP_phoney_OUTPUT_ONLY -2\n\n";
 
 # Emit op names and descriptions.
 
 print <<END;
 START_EXTERN_C
 
-#define OP_NAME(o) ((o)->op_type == OP_CUSTOM ? custom_op_name(o) : \\
-                    PL_op_name[(o)->op_type])
-#define OP_DESC(o) ((o)->op_type == OP_CUSTOM ? custom_op_desc(o) : \\
-                    PL_op_desc[(o)->op_type])
-
 #ifndef DOINIT
 EXTCONST char* const PL_op_name[];
 #else
@@ -652,6 +658,7 @@ qr          pattern quote (qr//)    ck_match        s/
 subst          substitution (s///)     ck_match        dis/    S
 substcont      substitution iterator   ck_null         dis|    
 trans          transliteration (tr///) ck_match        is"     S
+# transr (the /r version) is further down.
 
 # Lvalue operators.
 # sassign is special-cased for op class
@@ -808,11 +815,11 @@ lslice            list slice              ck_null         2       H L L
 anonlist       anonymous list ([])     ck_fun          ms@     L
 anonhash       anonymous hash ({})     ck_fun          ms@     L
 
-splice         splice                  ck_fun          m@      A S? S? L
-push           push                    ck_fun          imsT@   A L
+splice         splice                  ck_push         m@      A S? S? L
+push           push                    ck_push         imsT@   A L
 pop            pop                     ck_shift        s%      A?
 shift          shift                   ck_shift        s%      A?
-unshift                unshift                 ck_fun          imsT@   A L
+unshift                unshift                 ck_push         imsT@   A L
 sort           sort                    ck_sort         dm@     C? L
 reverse                reverse                 ck_fun          mt@     L
 
@@ -1050,7 +1057,7 @@ hintseval eval hints              ck_svconst      s$
 entereval      eval "string"           ck_eval         d%      S
 leaveeval      eval "string" exit      ck_null         1       S
 #evalonce      eval constant string    ck_null         d1      S
-entertry       eval {block}            ck_eval         d%      
+entertry       eval {block}            ck_eval         d|      
 leavetry       eval {block} exit       ck_null         @       
 
 # Get system info.
@@ -1099,3 +1106,11 @@ lock             lock                    ck_rfun         s%      R
 once           once                    ck_null         |       
 
 custom         unknown custom operator         ck_null         0
+
+# For smart dereference for each/keys/values
+reach          each on reference                       ck_each         %       S
+rkeys          keys on reference                       ck_each         t%      S
+rvalues                values on reference                     ck_each         t%      S
+
+# y///r
+transr         transliteration (tr///) ck_match        is"     S