[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