[svn:parrot] r44677 - in branches/ops_pct/compilers/opsc/src/Ops: . Trans
bacek at svn.parrot.org
bacek at svn.parrot.org
Sat Mar 6 01:39:16 UTC 2010
Author: bacek
Date: Sat Mar 6 01:39:15 2010
New Revision: 44677
URL: https://trac.parrot.org/parrot/changeset/44677
Log:
Add preparing ops to Tanscode
Modified:
branches/ops_pct/compilers/opsc/src/Ops/Trans.pm
branches/ops_pct/compilers/opsc/src/Ops/Trans/C.pm
Modified: branches/ops_pct/compilers/opsc/src/Ops/Trans.pm
==============================================================================
--- branches/ops_pct/compilers/opsc/src/Ops/Trans.pm Sat Mar 6 01:38:48 2010 (r44676)
+++ branches/ops_pct/compilers/opsc/src/Ops/Trans.pm Sat Mar 6 01:39:15 2010 (r44677)
@@ -1,6 +1,6 @@
#! nqp
-class Ops::Trans;
+class Ops::Trans is Hash;
=begin
@@ -8,7 +8,20 @@
=end
+method prefix() { 'Parrot_' };
+
# We can't use yada-yada-yada
method suffix() { die("...") }
+# Prepare internal structures from Ops::File.ops.
+method prepare_ops($emitter, $ops_file) { die('...') }
+
+#
+method emit_c_header_part($fh) { die('...') }
+
+# Called from Ops::Op.
+method body_prelude() { '' }
+
+
+
# vim: expandtab shiftwidth=4 ft=perl6:
Modified: branches/ops_pct/compilers/opsc/src/Ops/Trans/C.pm
==============================================================================
--- branches/ops_pct/compilers/opsc/src/Ops/Trans/C.pm Sat Mar 6 01:38:48 2010 (r44676)
+++ branches/ops_pct/compilers/opsc/src/Ops/Trans/C.pm Sat Mar 6 01:39:15 2010 (r44677)
@@ -1,6 +1,50 @@
-class Ops::Trans::C;
+class Ops::Trans::C is Ops::Trans;
+
+method new() {
+ # Storage for generated ops functions.
+ self<op_funcs> := list();
+ # Storage for generated ops functions prototypes.
+ self<op_protos> := list();
+
+ self;
+}
method suffix() { '' };
+method prepare_ops($emitter, $ops_file) {
+
+ my $index := 0;
+ my @op_protos;
+ my @op_funcs;
+ my @op_func_table;
+
+ for $ops_file.ops -> $op {
+ #say("# preparing " ~ $op);
+ my $func_name := self.suffix ~ $op.full_name;
+ my $definition := "opcode_t *\n$func_name (opcode_t *cur_opcode, PARROT_INTERP)";
+ my $prototype := ~$emitter<sym_export>
+ ~ "opcode_t * $func_name (opcode_t *cur_opcode, PARROT_INTERP);\n";
+
+ my $src := $op.source( self );
+
+ @op_func_table.push(sprintf( " %-50s /* %6ld */\n", "$func_name,", $index ));
+
+ my $body := join(' ', $definition, '{', "\n", $src, '}', "\n\n");
+ @op_funcs.push($body);
+ @op_protos.push($prototype);
+ $index++;
+ }
+
+ self<op_funcs> := @op_funcs;
+ self<op_protos> := @op_protos;
+ self<op_func_table> := @op_func_table;
+}
+
+method emit_c_header_part($fh) {
+ for self<op_protos> -> $proto {
+ $fh.print($proto);
+ }
+}
+
# vim: expandtab shiftwidth=4 ft=perl6:
More information about the parrot-commits
mailing list