perl 5.003_05: pod/perlvar.pod
[p5sagit/p5-mst-13.2.git] / opcode.pl
index dcd03b5..50cf214 100755 (executable)
--- a/opcode.pl
+++ b/opcode.pl
@@ -9,9 +9,15 @@ while (<DATA>) {
     chop;
     next unless $_;
     next if /^#/;
-    ($key, $name, $check, $flags, $args) = split(/\t+/, $_, 5);
+    ($key, $desc, $check, $flags, $args) = split(/\t+/, $_, 5);
+
+    warn qq[Description "$desc" duplicates $seen{$desc}\n] if $seen{$desc};
+    die qq[Opcode "$key" duplicates $seen{$key}\n] if $seen{$key};
+    $seen{$desc} = qq[description of opcode "$key"];
+    $seen{$key} = qq[opcode "$key"];
+
     push(@ops, $key);
-    $name{$key} = $name;
+    $desc{$key} = $desc;
     $check{$key} = $check;
     $ckname{$check}++;
     $flags{$key} = $flags;
@@ -36,7 +42,7 @@ print "\t", &tab(3,"OP_max"), "\n";
 print "} opcode;\n";
 print "\n#define MAXO ", scalar @ops, "\n\n"; 
 
-# Emit opnames.
+# Emit op names and descriptions.
 
 print <<END;
 #ifndef DOINIT
@@ -46,7 +52,24 @@ EXT char *op_name[] = {
 END
 
 for (@ops) {
-    print qq(\t"$name{$_}",\n);
+    print qq(\t"$_",\n);
+}
+
+print <<END;
+};
+#endif
+
+END
+
+print <<END;
+#ifndef DOINIT
+EXT char *op_desc[];
+#else
+EXT char *op_desc[] = {
+END
+
+for (@ops) {
+    print qq(\t"$desc{$_}",\n);
 }
 
 print <<END;
@@ -176,6 +199,7 @@ const               constant item           ck_svconst      s
 
 gvsv           scalar variable         ck_null         ds      
 gv             glob value              ck_null         ds      
+gelem          glob elem               ck_null         d       S S
 padsv          private variable        ck_null         ds
 padav          private array           ck_null         d
 padhv          private hash            ck_null         d
@@ -186,11 +210,11 @@ pushre            push regexp             ck_null         0
 # References and stuff.
 
 rv2gv          ref-to-glob cast        ck_rvconst      ds      
-sv2len         scalar value length     ck_null         ist     
 rv2sv          scalar deref            ck_rvconst      ds      
 av2arylen      array length            ck_null         is      
 rv2cv          subroutine deref        ck_rvconst      d
 anoncode       anonymous subroutine    ck_null         0       
+prototype      subroutine prototype    ck_null         s       S
 refgen         reference constructor   ck_spair        m       L
 srefgen                scalar ref constructor  ck_null         fs      S
 ref            reference-type operator ck_fun          stu     S?
@@ -223,7 +247,7 @@ chomp               safe chop               ck_spair        mts     L
 schomp         scalar safe chop        ck_null         stu     S?
 defined                defined operator        ck_rfun         isu     S?
 undef          undef operator          ck_lfun         s       S?
-study          study                   ck_fun          stu     S?
+study          study                   ck_fun          su      S?
 pos            match position          ck_lfun         stu     S?
 
 preinc         preincrement            ck_lfun         dIs     S
@@ -382,7 +406,7 @@ flop                range (or flop)         ck_null         0
 and            logical and             ck_null         0       
 or             logical or              ck_null         0       
 xor            logical xor             ck_null         fs      S S     
-cond_expr      conditional expression  ck_null         0       
+cond_expr      conditional expression  ck_null         d       
 andassign      logical and assignment  ck_null         s       
 orassign       logical or assignment   ck_null         s       
 
@@ -428,6 +452,7 @@ binmode             binmode                 ck_fun          s       F
 
 tie            tie                     ck_fun          idms    R S L
 untie          untie                   ck_fun          is      R
+tied           tied                    ck_fun          s       R
 dbmopen                dbmopen                 ck_fun          is      H S S
 dbmclose       dbmclose                ck_fun          is      H
 
@@ -442,6 +467,7 @@ leavewrite  write exit              ck_null         0
 prtf           printf                  ck_listiob      ims     F? L
 print          print                   ck_listiob      ims     F? L
 
+sysopen                sysopen                 ck_fun          s       F S S S?
 sysread                sysread                 ck_fun          imst    F R S S?
 syswrite       syswrite                ck_fun          imst    F S S S?
 
@@ -451,6 +477,7 @@ recv                recv                    ck_fun          imst    F R S S
 eof            eof                     ck_eof          is      F?
 tell           tell                    ck_fun          st      F?
 seek           seek                    ck_fun          s       F S S
+# truncate really behaves as if it had both "S S" and "F S"
 truncate       truncate                ck_trunc        is      S S
 
 fcntl          fcntl                   ck_fun          st      F S S
@@ -558,7 +585,7 @@ sleep               sleep                   ck_fun          ist     S?
 shmget         shmget                  ck_fun          imst    S S S
 shmctl         shmctl                  ck_fun          imst    S S S
 shmread                shmread                 ck_fun          imst    S S S S
-shmwrite       shmwrite                ck_fun          ist     S S S S
+shmwrite       shmwrite                ck_fun          imst    S S S S
 
 # Message passing.