[svn:parrot] r46889 - in branches/ops_pct/compilers/opsc: . src/Ops

cotto at svn.parrot.org cotto at svn.parrot.org
Sat May 22 19:09:46 UTC 2010


Author: cotto
Date: Sat May 22 19:09:45 2010
New Revision: 46889
URL: https://trac.parrot.org/parrot/changeset/46889

Log:
[opsc] add Ops::Renumberer to Ops::File, add code to regenerate ops.num and opsenum.h

Modified:
   branches/ops_pct/compilers/opsc/ops2c.nqp
   branches/ops_pct/compilers/opsc/src/Ops/File.pm
   branches/ops_pct/compilers/opsc/src/Ops/OpLib.pm
   branches/ops_pct/compilers/opsc/src/Ops/Renumberer.pm

Modified: branches/ops_pct/compilers/opsc/ops2c.nqp
==============================================================================
--- branches/ops_pct/compilers/opsc/ops2c.nqp	Sat May 22 18:40:06 2010	(r46888)
+++ branches/ops_pct/compilers/opsc/ops2c.nqp	Sat May 22 19:09:45 2010	(r46889)
@@ -81,15 +81,6 @@
         :skip_file('src/ops/ops.skip'),
     );
     $f := Ops::File.new(|@files, :oplib($lib), :core(1));
-    $renum := Ops::Renumberer.new( :ops_file($f) );
-
-    if $renum.needs_renumbering {
-        say("# renumbering ops.num...");
-        $renum.renumber_ops();
-    }
-    else {
-        say("# ops.num looks fine: no renumbering needed");
-    }
 }
 else {
     $f := Ops::File.new(|@files, :core(0));

Modified: branches/ops_pct/compilers/opsc/src/Ops/File.pm
==============================================================================
--- branches/ops_pct/compilers/opsc/src/Ops/File.pm	Sat May 22 18:40:06 2010	(r46888)
+++ branches/ops_pct/compilers/opsc/src/Ops/File.pm	Sat May 22 19:09:45 2010	(r46889)
@@ -190,6 +190,7 @@
     self<preamble>:= '';
     self<compiler>:= pir::compreg__Ps('Ops');
     self<op_order>:= 0;
+    self<renum>   := Ops::Renumberer.new( :ops_file(self) );
 
     if $core {
         self<oplib> := $oplib;
@@ -203,6 +204,10 @@
 
     for @files { self.read_ops( $_, $nolines ) }
 
+    if self<renum>.need_regeneration() {
+        self<renum>.regenerate_ops_num();
+    }
+
     self._calculate_op_codes();
                                 
     self;

Modified: branches/ops_pct/compilers/opsc/src/Ops/OpLib.pm
==============================================================================
--- branches/ops_pct/compilers/opsc/src/Ops/OpLib.pm	Sat May 22 18:40:06 2010	(r46888)
+++ branches/ops_pct/compilers/opsc/src/Ops/OpLib.pm	Sat May 22 19:09:45 2010	(r46889)
@@ -103,6 +103,7 @@
     self<op_skip_table> := hash();
     self<num_file_lines>:= list();
     self<ops_past>      := list();
+    self<regen_ops_num> := 0;
 
     self.load_op_map_files();
 
@@ -153,10 +154,12 @@
             my $number  := +$_<op><number>;
             if (+$number) eq $number {
                 if ($prev + 1 != $number) {
-                    die("hole in ops.num before #$number");
+                    self<regen_ops_num> := 1;
+                    say("# hole in ops.num before #$number: will regenerate ops.num");
                 }
                 if self<op_num_table>.exists($name) {
-                    die("duplicate opcode $name and $number");
+                    self<regen_ops_num> := 1;
+                    say("# duplicate opcode $name and $number: will regenerate ops.num");
                 }
 
                 $prev := $number;
@@ -188,7 +191,7 @@
     my $lines := SKIP.parse($buf);
 
     for $lines<op> {
-        if self<op_num_table>.exists($_<name>) {
+        if self<op_num_table> && self<op_num_table>.exists($_<name>) {
             die("skipped opcode '$_' is also in num_file");
         }
         self<op_skip_table>{$_<name>} := 1;

Modified: branches/ops_pct/compilers/opsc/src/Ops/Renumberer.pm
==============================================================================
--- branches/ops_pct/compilers/opsc/src/Ops/Renumberer.pm	Sat May 22 18:40:06 2010	(r46888)
+++ branches/ops_pct/compilers/opsc/src/Ops/Renumberer.pm	Sat May 22 19:09:45 2010	(r46889)
@@ -61,34 +61,48 @@
 
 =begin METHODS
 
-=item C<needs_renumbering>
+=item C<need_renumbering>
 
 Check if ops.num needs to be renumbered.
 
 =end METHODS
 
-method needs_renumbering() {
-    #find out if the order in ops.num reflects the order in Ops::File
+method need_regeneration() {
+
+    #only need renumbering for core ops
+    unless self<ops_file>.oplib {
+        return 0;
+    }
+
+    #shortcut in case the oplib found an invalid ops.num
+    if self<ops_file>.oplib<regen_ops_num>{
+        return 1;
+    }
+
     my $op_num_table := self<ops_file>.oplib.op_num_table;
     my $opsfile_ops  := self<ops_file>.ops;
     my $opsfile_num  := 0;
-    my $needs_renumbering := 0;
+    my $need_renumbering := 0;
 
+    #find out if the order in ops.num reflects the order in Ops::File
     for $opsfile_ops -> $opsfile_op {
-        my $op_name := $opsfile_op.full_name;
+
+        my $op_name          := $opsfile_op.full_name;
         my $op_num_table_num := +$op_num_table{ $op_name };
-        #say("op_num_table says $op_name has number $op_num_table_num, opsfile says $opsfile_num");
+        #say("ops.num says $op_name is $op_num_table_num, opsfile says $opsfile_num");
+
         if (!$opsfile_op<experimental> && $opsfile_num != $op_num_table_num) {
-            say("Opsfile and optable disagree about $op_name: $opsfile_num vs $op_num_table_num");
-            $needs_renumbering := 1;
+            say("# Opsfile and ops.num disagree about $op_name: $opsfile_num vs $op_num_table_num");
+            $need_renumbering := 1;
         }
         $opsfile_num++;
     }
 
-    $needs_renumbering;
+    $need_renumbering;
 }
 
-method renumber_ops() {
+method regenerate_ops_num() {
+
     #grab all ops in ops.num
     my %fixed_ops     := hash();
     my %numbered_ops  := hash();
@@ -98,6 +112,7 @@
         || die("Can't open "~ self<ops_file>.oplib.num_file);
 
     #record which ones have fixed numbers and which just need to be somewhere in ops.num
+    say("# regenerating ops.num and include/parrot/opsenum.h");
     for self<ops_file>.oplib.num_file_lines -> $line {
 
         #copy all lines through ###DYNAMIC### into the new ops.num verbatim
@@ -108,6 +123,7 @@
         if $line<op> {
             if $found_dynamic {
                 %numbered_ops{ $line<op><name> } := 1;
+                #say("# added '"~$line<op><name> ~" to numered ops");
             }
             else {
                 %fixed_ops{ $line<op><name> } := +$line<op><number>;
@@ -119,16 +135,61 @@
         }
     }
 
-    #XXX: print header to include/parrot/opsenum.h (ignore fixed ops)
+    my $opsenum_fh := pir::open__pss("include/parrot/opsenum.h", "w");
+    $opsenum_fh.print( self._opsenum_h_preamble )
+        || die("Can't open include/parrot/opsenum.h");
 
     for self<ops_file>.ops -> $op {
         if %numbered_ops.exists( $op.full_name ) {
             $max_op_num++;
-            $ops_num_fh.print($op.full_name ~ "    " ~ $max_op_num ~ "\n");
+            my $space := pir::repeat__SsI(' ', 
+                35 - pir::length__Is($op.full_name) - pir::length__Is(~$max_op_num));
+            $ops_num_fh.print($op.full_name ~ $space ~ $max_op_num ~ "\n");
+
+            $space := pir::repeat__SsI(' ', 30 - pir::length__Is($op.full_name));
+            $opsenum_fh.print("    enum_ops_" ~ $op.full_name ~ $space ~ "=");
+            $space := pir::repeat__SsI(' ', 5 - pir::length__Is(~$max_op_num));
+            $opsenum_fh.print($space ~ $max_op_num ~ ",\n");
         }
     }
+
+    $opsenum_fh.print( self._opsenum_h_postamble );
+
+    $opsenum_fh.close();
+    $ops_num_fh.close();
 }
 
+method _opsenum_h_preamble() {
+    return q|
+/* ex: set ro ft=c:
+* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
+*
+* This file is generated automatically from 'ops2c'.
+*
+* Any changes made here will be lost!
+*
+*/
+
+#ifndef OPSENUM_H_GUARD
+#define OPSENUM_H_GUARD
+
+enum OPS_ENUM {
+|; 
+}
+
+method _opsenum_h_postamble() {
+    return q|};
+
+#endif /* OPSENUM_H_GUARD */
+
+/* GENERATED BY ops2c */
+/*
+* Local variables:
+*   c-file-style: "parrot"
+* End:
+* vim: expandtab shiftwidth=4:
+*/|;
+}
 # Local Variables:
 #   mode: perl6
 #   fill-column: 100


More information about the parrot-commits mailing list