Author: jkeenan
Date: Tue Feb 13 19:03:08 2007
New Revision: 16975

Modified:
   branches/buildtools/lib/Parrot/Ops2c/Utils.pm
   branches/buildtools/tools/build/ops2c.pl

Log:
Began refactoring code blocks in ops2c.pl which print to the .c file into
Parrot::Ops2c::Utils::print_c_source_top().  (That name may change.)  Passing
'make', but formal tests not yet written.


Modified: branches/buildtools/lib/Parrot/Ops2c/Utils.pm
==============================================================================
--- branches/buildtools/lib/Parrot/Ops2c/Utils.pm       (original)
+++ branches/buildtools/lib/Parrot/Ops2c/Utils.pm       Tue Feb 13 19:03:08 2007
@@ -237,4 +237,250 @@
 END_C
 }
 
+sub print_c_source_top {
+    my $self = shift;
+    my $defines = $self->{trans}->defines();    # Invoked as:  ${defines}
+    my $bs = "$self->{base}$self->{suffix}_";   # Also invoked as ${bs}
+    my $opsarraytype    = $self->{trans}->opsarraytype();
+
+    ##### BEGIN printing to $SOURCE #####
+    open my $SOURCE, '>', $self->{source}
+        or die "ops2c.pl: Cannot open source file '$self->{source}' for 
writing: $!!\n";
+
+    _print_preamble_source( {
+        fh          => $SOURCE,
+        preamble    => $self->{preamble},
+        include     => $self->{include},
+        defines     => $defines,
+        bs          => $bs,
+        ops         => $self->{ops},
+        trans       => $self->{trans},
+    } );
+
+    _print_ops_addr_decl( {
+        trans   => $self->{trans},
+        fh      => $SOURCE,
+        bs      => $bs,
+    } );
+
+    _print_run_core_func_decl_source( {
+        trans   => $self->{trans},
+        fh      => $SOURCE,
+        base    => $self->{base},
+    } );
+
+    # Iterate over the ops, appending HEADER and SOURCE fragments:
+    my $op_funcs_ref;
+    my $op_func_table_ref;
+    my $cg_jump_table_ref;
+    my $index;
+
+    ($index, $op_funcs_ref, $op_func_table_ref, $cg_jump_table_ref) = 
+        _iterate_over_ops( {
+            ops             => $self->{ops},
+            trans           => $self->{trans},
+            opsarraytype    => $opsarraytype,
+            suffix          => $self->{suffix},
+            bs              => $bs,
+            sym_export      => $self->{sym_export},
+        } );
+
+    my @op_funcs        = @{$op_funcs_ref};
+    my @op_func_table   = @{$op_func_table_ref};
+    my @cg_jump_table   = @{$cg_jump_table_ref};
+
+    _print_cg_jump_table( {
+        fh              => $SOURCE,
+        cg_jump_table   => [EMAIL PROTECTED],
+        suffix          => $self->{suffix},
+        trans           => $self->{trans},
+        bs              => $bs,
+    } );
+
+    _print_goto_opcode( {
+        fh      => $SOURCE,
+        suffix  => $self->{suffix},
+        bs      => $bs,
+    } );
+
+    _print_op_function_definitions( {
+        fh          => $SOURCE,
+        op_funcs    => [EMAIL PROTECTED],
+        trans       => $self->{trans},
+        base        => $self->{base},
+    } );
+    return ($SOURCE, [EMAIL PROTECTED], $bs, $index);
+}
+
+###################
+
+sub _print_preamble_source {
+    my $argsref = shift;
+    my $fh = $argsref->{fh};
+
+    print $fh $argsref->{preamble};
+    print $fh <<END_C;
+#include "$argsref->{include}"
+
+$argsref->{defines}
+static op_lib_t $argsref->{bs}op_lib;
+
+END_C
+
+    my $text = $argsref->{ops}->preamble($argsref->{trans});
+    $text =~ s/\bops_addr\b/$argsref->{bs}ops_addr/g;
+    print $fh $text;
+}
+
+sub _print_ops_addr_decl {
+    my $argsref = shift;
+    if ( $argsref->{trans}->can("ops_addr_decl") ) {
+        my $fh = $argsref->{fh};
+        print $fh $argsref->{trans}->ops_addr_decl($argsref->{bs});
+    } else {
+        return;
+    }
+}
+
+sub _print_run_core_func_decl_source {
+    my $argsref = shift;
+    if ( $argsref->{trans}->can("run_core_func_decl") ) {
+        my $fh = $argsref->{fh};
+        print $fh $argsref->{trans}->run_core_func_decl($argsref->{base});
+        print $fh "\n{\n";
+        print $fh $argsref->{trans}->run_core_func_start;
+    } else {
+        return;
+    }
+}
+
+sub _iterate_over_ops {
+    my $argsref = shift;
+    my @op_funcs;
+    my @op_func_table;
+    my @cg_jump_table;
+    my $index = 0;
+    my ( $prev_src, $prev_index );
+
+    $prev_src = '';
+    foreach my $op ( $argsref->{ops}->ops ) {
+        my $func_name = $op->func_name($argsref->{trans});
+        my $arg_types = "$argsref->{opsarraytype} *, Interp *";
+        my $prototype = "$argsref->{sym_export} $argsref->{opsarraytype} * 
$func_name ($arg_types)";
+        my $args      = "$argsref->{opsarraytype} *cur_opcode, Interp *interp";
+        my $definition;
+        my $comment = '';
+        my $one_op  = "";
+
+        if ( $argsref->{suffix} =~ /cg/ ) {
+            $definition = "PC_$index:";
+            $comment    = "/* " . $op->full_name() . " */";
+        }
+        elsif ( $argsref->{suffix} =~ /switch/ ) {
+            $definition = "case $index:";
+            $comment    = "/* " . $op->full_name() . " */";
+        }
+        else {
+            $definition = "$prototype;\n$argsref->{opsarraytype} *\n$func_name 
($args)";
+        }
+
+        my $src = $op->source($argsref->{trans});
+        $src =~ s/\bop_lib\b/$argsref->{bs}op_lib/g;
+        $src =~ s/\bops_addr\b/$argsref->{bs}ops_addr/g;
+
+        if ( $argsref->{suffix} =~ /cg/ ) {
+            if ( $prev_src eq $src ) {
+                push @cg_jump_table, "        &&PC_$prev_index,\n";
+            }
+            else {
+                push @cg_jump_table, "        &&PC_$index,\n";
+            }
+        }
+        elsif ( $argsref->{suffix} eq '' ) {
+            push @op_func_table, sprintf( "  %-50s /* %6ld */\n", 
"$func_name,", $index );
+        }
+        if ( $prev_src eq $src ) {
+            push @op_funcs, "$comment\n";
+        }
+        else {
+            $one_op .= "$definition $comment {\n$src}\n\n";
+            push @op_funcs, $one_op;
+            $prev_src = $src if ( $argsref->{suffix} eq '_cgp' || 
$argsref->{suffix} eq '_switch' );
+            $prev_index = $index;
+        }
+        $index++;
+    }
+    return ($index, [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED]);
+}
+
+sub _print_cg_jump_table {
+    my $argsref = shift;
+    my $fh = $argsref->{fh};
+    my @cg_jump_table = @{$argsref->{cg_jump_table}};
+
+    if ( $argsref->{suffix} =~ /cg/ ) {
+        print $fh @cg_jump_table;
+        print $fh <<END_C;
+        NULL
+    };
+END_C
+        print $fh $argsref->{trans}->run_core_after_addr_table($argsref->{bs});
+    }
+}
+
+sub _print_goto_opcode {
+    my $argsref = shift;
+    my $fh = $argsref->{fh};
+
+    if ( $argsref->{suffix} =~ /cgp/ ) {
+        print $fh <<END_C;
+#ifdef __GNUC__
+# ifdef I386
+    else if (cur_opcode == (void **) 1)
+    asm ("jmp *4(%ebp)");  /* jump to ret addr, used by JIT */
+# endif
+#endif
+    _reg_base = (char*)interp->ctx.bp.regs_i;
+    goto **cur_opcode;
+
+END_C
+    }
+    elsif ( $argsref->{suffix} =~ /cg/ ) {
+        print $fh <<END_C;
+goto *$argsref->{bs}ops_addr[*cur_opcode];
+
+END_C
+    }
+    return 1;
+}
+
+sub _print_op_function_definitions {
+    my $argsref = shift;
+    my $fh = $argsref->{fh};
+    my @op_funcs = @{$argsref->{op_funcs}};
+    print $fh <<END_C;
+/*
+** Op Function Definitions:
+*/
+
+END_C
+
+    # Finish the SOURCE file's array initializer:
+    my $CORE_SPLIT = 300;
+    for ( my $i = 0 ; $i < @op_funcs ; $i++ ) {
+        if ( $i && 
+            $i % $CORE_SPLIT == 0 && 
+            $argsref->{trans}->can("run_core_split") )
+        {
+            print $fh $argsref->{trans}->run_core_split($argsref->{base});
+        }
+        print $fh $op_funcs[$i];
+    }
+
+    if ( $argsref->{trans}->can("run_core_finish") ) {
+        print $fh $argsref->{trans}->run_core_finish($argsref->{base});
+    }
+    close($fh) || die "Unable to close after writing: $!";
+}
+
 1;

Modified: branches/buildtools/tools/build/ops2c.pl
==============================================================================
--- branches/buildtools/tools/build/ops2c.pl    (original)
+++ branches/buildtools/tools/build/ops2c.pl    Tue Feb 13 19:03:08 2007
@@ -5,8 +5,6 @@
 use strict;
 use Data::Dumper;
 use lib 'lib';
-#use Parrot::OpsFile;
-#use Parrot::OpLib::core;
 use Parrot::Config;
 use Parrot::Ops2c::Auxiliary qw( Usage getoptions );
 use Parrot::Ops2c::Utils;
@@ -55,76 +53,9 @@
 $self->print_c_header_file();
 ##### END printing to $HEADER #####
 
-my $defines         = $trans->defines();    # Invoked as:  ${defines}
-my $bs = "${base}${suffix}_";   # Also invoked as ${bs}
-my $opsarraytype    = $trans->opsarraytype();
-
-##### BEGIN printing to $SOURCE #####
-open my $SOURCE, '>', $source
-    or die "ops2c.pl: Cannot open source file '$source' for writing: $!!\n";
+my ($SOURCE, $op_func_table_ref, $bs, $index) = $self->print_c_source_top();
 
-_print_preamble_source( {
-    fh          => $SOURCE,
-    preamble    => $preamble,
-    include     => $include,
-    defines     => $defines,
-    bs          => $bs,
-    ops         => $ops,
-    trans       => $trans,
-} );
-
-_print_ops_addr_decl( {
-    trans   => $trans,
-    fh      => $SOURCE,
-    bs      => $bs,
-} );
-
-_print_run_core_func_decl_source( {
-    trans   => $trans,
-    fh      => $SOURCE,
-    base    => $base,
-} );
-
-# Iterate over the ops, appending HEADER and SOURCE fragments:
-my $op_funcs_ref;
-my $op_func_table_ref;
-my $cg_jump_table_ref;
-my $index;
-
-($index, $op_funcs_ref, $op_func_table_ref, $cg_jump_table_ref) = 
-    _iterate_over_ops( {
-        ops             => $ops,
-        trans           => $trans,
-        opsarraytype    => $opsarraytype,
-        suffix          => $suffix,
-        bs              => $bs,
-    } );
-
-my @op_funcs        = @{$op_funcs_ref};
-my @op_func_table   = @{$op_func_table_ref};
-my @cg_jump_table   = @{$cg_jump_table_ref};
-
-_print_cg_jump_table( {
-    fh              => $SOURCE,
-    cg_jump_table   => [EMAIL PROTECTED],
-    suffix          => $suffix,
-    trans           => $trans,
-    bs              => $bs,
-} );
-
-_print_goto_opcode( {
-    fh      => $SOURCE,
-    suffix  => $suffix,
-    bs      => $bs,
-} );
-
-_print_op_function_definitions( {
-    fh          => $SOURCE,
-    op_funcs    => [EMAIL PROTECTED],
-    trans       => $trans,
-    base        => $base,
-} );
-#######
+my @op_func_table = @{$op_func_table_ref};
 
 # reset #line in the SOURCE file.
 $SOURCE = _reset_line_number( {
@@ -220,175 +151,6 @@
 END_C
 }
 
-sub _print_preamble_source {
-    my $argsref = shift;
-    my $fh = $argsref->{fh};
-
-    print $fh $argsref->{preamble};
-    print $fh <<END_C;
-#include "$argsref->{include}"
-
-$argsref->{defines}
-static op_lib_t $argsref->{bs}op_lib;
-
-END_C
-
-    my $text = $argsref->{ops}->preamble($argsref->{trans});
-    $text =~ s/\bops_addr\b/${bs}ops_addr/g;
-    print $fh $text;
-}
-
-sub _print_ops_addr_decl {
-    my $argsref = shift;
-    if ( $argsref->{trans}->can("ops_addr_decl") ) {
-        my $fh = $argsref->{fh};
-        print $fh $argsref->{trans}->ops_addr_decl($argsref->{bs});
-    } else {
-        return;
-    }
-}
-
-sub _print_run_core_func_decl_source {
-    my $argsref = shift;
-    if ( $argsref->{trans}->can("run_core_func_decl") ) {
-        my $fh = $argsref->{fh};
-        print $fh $argsref->{trans}->run_core_func_decl($argsref->{base});
-        print $fh "\n{\n";
-        print $fh $argsref->{trans}->run_core_func_start;
-    } else {
-        return;
-    }
-}
-
-sub _iterate_over_ops {
-    my $argsref = shift;
-    my @op_funcs;
-    my @op_func_table;
-    my @cg_jump_table;
-    my $index = 0;
-    my ( $prev_src, $prev_index );
-    
-    $prev_src = '';
-    foreach my $op ( $argsref->{ops}->ops ) {
-        my $func_name = $op->func_name($argsref->{trans});
-        my $arg_types = "$argsref->{opsarraytype} *, Interp *";
-        my $prototype = "$sym_export $argsref->{opsarraytype} * $func_name 
($arg_types)";
-        my $args      = "$argsref->{opsarraytype} *cur_opcode, Interp *interp";
-        my $definition;
-        my $comment = '';
-        my $one_op  = "";
-    
-        if ( $argsref->{suffix} =~ /cg/ ) {
-            $definition = "PC_$index:";
-            $comment    = "/* " . $op->full_name() . " */";
-        }
-        elsif ( $argsref->{suffix} =~ /switch/ ) {
-            $definition = "case $index:";
-            $comment    = "/* " . $op->full_name() . " */";
-        }
-        else {
-            $definition = "$prototype;\n$argsref->{opsarraytype} *\n$func_name 
($args)";
-        }
-    
-        my $src = $op->source($argsref->{trans});
-        $src =~ s/\bop_lib\b/$argsref->{bs}op_lib/g;
-        $src =~ s/\bops_addr\b/$argsref->{bs}ops_addr/g;
-    
-        if ( $argsref->{suffix} =~ /cg/ ) {
-            if ( $prev_src eq $src ) {
-                push @cg_jump_table, "        &&PC_$prev_index,\n";
-            }
-            else {
-                push @cg_jump_table, "        &&PC_$index,\n";
-            }
-        }
-        elsif ( $argsref->{suffix} eq '' ) {
-            push @op_func_table, sprintf( "  %-50s /* %6ld */\n", 
"$func_name,", $index );
-        }
-        if ( $prev_src eq $src ) {
-            push @op_funcs, "$comment\n";
-        }
-        else {
-            $one_op .= "$definition $comment {\n$src}\n\n";
-            push @op_funcs, $one_op;
-            $prev_src = $src if ( $argsref->{suffix} eq '_cgp' || 
$argsref->{suffix} eq '_switch' );
-            $prev_index = $index;
-        }
-        $index++;
-    }
-    return ($index, [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED]);
-}
-
-sub _print_cg_jump_table {
-    my $argsref = shift;
-    my $fh = $argsref->{fh};
-    my @cg_jump_table = @{$argsref->{cg_jump_table}};
-
-    if ( $argsref->{suffix} =~ /cg/ ) {
-        print $fh @cg_jump_table;
-        print $fh <<END_C;
-        NULL
-    };
-END_C
-        print $fh $argsref->{trans}->run_core_after_addr_table($argsref->{bs});
-    }
-}
-
-sub _print_goto_opcode {
-    my $argsref = shift;
-    my $fh = $argsref->{fh};
-
-    if ( $argsref->{suffix} =~ /cgp/ ) {
-        print $fh <<END_C;
-#ifdef __GNUC__
-# ifdef I386
-    else if (cur_opcode == (void **) 1)
-    asm ("jmp *4(%ebp)");  /* jump to ret addr, used by JIT */
-# endif
-#endif
-    _reg_base = (char*)interp->ctx.bp.regs_i;
-    goto **cur_opcode;
-
-END_C
-    }
-    elsif ( $argsref->{suffix} =~ /cg/ ) {
-        print $fh <<END_C;
-goto *$argsref->{bs}ops_addr[*cur_opcode];
-
-END_C
-    }
-    return 1;
-}
-
-sub _print_op_function_definitions {
-    my $argsref = shift;
-    my $fh = $argsref->{fh};
-    my @op_funcs = @{$argsref->{op_funcs}};
-    print $fh <<END_C;
-/*
-** Op Function Definitions:
-*/
-
-END_C
-
-    # Finish the SOURCE file's array initializer:
-    my $CORE_SPLIT = 300;
-    for ( my $i = 0 ; $i < @op_funcs ; $i++ ) {
-        if ( $i && 
-            $i % $CORE_SPLIT == 0 && 
-            $argsref->{trans}->can("run_core_split") )
-        {
-            print $fh $argsref->{trans}->run_core_split($argsref->{base});
-        }
-        print $fh $op_funcs[$i];
-    }
-    
-    if ( $trans->can("run_core_finish") ) {
-        print $fh $trans->run_core_finish($base);
-    }
-    close($fh) || die "Unable to close after writing: $!";
-}
-
 sub _reset_line_number {
     my $argsref = shift;
     my $fh = $argsref->{fh};

Reply via email to