# New Ticket Created by  Steve Fink 
# Please include the string:  [perl #17065]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt2/Ticket/Display.html?id=17065 >


Apply as much or as little of this patch as you want.

- Add a few more patterns to various .cvsignore files
- Add a -e (or --eval) flag to perl6.
- Reindent a bunch of code that had too few spaces
- Make sure P6C::IMCC::code() adds a newline after every line
  (I was getting two consecutive lines of code smashed together)
- redirect stdout differently

The last is somewhat puzzling. perl6 was passing "> outfile" as an
array argument to system(), which on Unix at least won't work.
However, I remember that 'perl6 --test' used to work for me, so I
don't know when this changed. (If I locally revert this patch, it
still doesn't work, so I don't think it's something I did.)

The attached patch does the redirection somewhat differently, but it's
a bit of a kludge.


-- attachment  1 ------------------------------------------------------
url: http://rt.perl.org/rt2/attach/36825/29711/a71e32/patch

Index: .cvsignore
===================================================================
RCS file: /cvs/public/parrot/languages/perl6/.cvsignore,v
retrieving revision 1.3
diff -p -u -r1.3 .cvsignore
--- .cvsignore  27 Aug 2002 08:12:40 -0000      1.3
+++ .cvsignore  7 Sep 2002 00:06:11 -0000
@@ -1,3 +1,4 @@
 Makefile
 Perl6grammar.pm
 perl6-config
+*.tmp
Index: t/compiler/.cvsignore
===================================================================
RCS file: /cvs/public/parrot/languages/perl6/t/compiler/.cvsignore,v
retrieving revision 1.1
diff -p -u -r1.1 .cvsignore
--- t/compiler/.cvsignore       29 Jul 2002 07:58:26 -0000      1.1
+++ t/compiler/.cvsignore       7 Sep 2002 00:06:13 -0000
@@ -4,3 +4,5 @@
 *.pbc
 *.out
 *.err
+*.warn
+*.test
Index: t/rx/.cvsignore
===================================================================
RCS file: /cvs/public/parrot/languages/perl6/t/rx/.cvsignore,v
retrieving revision 1.1
diff -p -u -r1.1 .cvsignore
--- t/rx/.cvsignore     27 Aug 2002 08:13:43 -0000      1.1
+++ t/rx/.cvsignore     7 Sep 2002 00:06:13 -0000
@@ -4,3 +4,5 @@
 *.pbc
 *.out
 *.err
+*.warn
+*.test
Index: P6C/IMCC.pm
===================================================================
RCS file: /cvs/public/parrot/languages/perl6/P6C/IMCC.pm,v
retrieving revision 1.19
diff -p -u -r1.19 IMCC.pm
--- P6C/IMCC.pm 5 Sep 2002 16:07:50 -0000       1.19
+++ P6C/IMCC.pm 7 Sep 2002 00:07:06 -0000
@@ -223,6 +223,7 @@ parameter-passing scheme, not just this 
 sub code {                     # add code to current function
     die "Code must live within a function" unless defined $curfunc;
     $funcs{$curfunc}->{code} .= join "\n", @_;
+    $funcs{$curfunc}->{code} .= "\n" if @_ > 0;
 }
 
 sub fixup_label {
Index: perl6
===================================================================
RCS file: /cvs/public/parrot/languages/perl6/perl6,v
retrieving revision 1.17
diff -p -u -r1.17 perl6
--- perl6       6 Sep 2002 23:34:24 -0000       1.17
+++ perl6       7 Sep 2002 00:25:11 -0000
@@ -116,7 +118,9 @@ Parser options:
         --force-grammar
                      Rebuild grammar even if it exists.
       Misc:
-        --add-main     suround code by the main() function
+        -e|--eval 'command'
+                       evaluate perl6 command (implies --add-main)
+        --add-main     surround code by the main() function
         --rule NAME    start with rule NAME (default = "prog")
                            (only useful in interactive mode)
 END
@@ -154,7 +158,7 @@ Getopt::Long::Configure(qw(bundling));
 GetOptions(\%OPT,qw{
     test-parser test
     trace hitem tree raw-tree
-    add-main rule=s grammar=s force-grammar
+    eval|e=s add-main rule=s grammar=s force-grammar
     debug yydebug life-info
     debug-info|g
     verbose|v+
@@ -188,6 +192,7 @@ $OPT{grammar} ||= 'Perl6grammar';
 $OPT{'parrot-options'} ||= '';
 $OPT{verbose} = 0 unless (defined $OPT{verbose});
 $OPT{tree} = 1 if $OPT{'test-parser'};
+$OPT{'add-main'} = 1 if defined $OPT{'eval'};
 
 my $filebase = 'a';            # basename for output files.
 
@@ -386,14 +391,19 @@ END
     $parser;
 }
 
-sub pass1($$$) {
-    my ($parser, $f, $fw) = @_;
+sub pass1($$$;$) {
+    my ($parser, $f, $fw, $expr) = @_;
     my $in = '';
     local $/ = undef;
     verbose(1, "P6C '$f'");
-    open(IN, $f) or die("Can't read '$f': $!");
-    $in = <IN>;
-    close(IN);
+    if ($f eq '__eval__') {
+        $in = $expr;
+    }
+    else {
+        open(IN, $f) or die("Can't read '$f': $!");
+        $in = <IN>;
+        close(IN);
+    }
     verbose(2, "Parsing");
     P6C::IMCC::init() unless $OPT{tree};
     my $result = warnings(sub {$parser->$::rule($in,0,$f)}, $fw);
@@ -423,40 +433,41 @@ sub run {
        return;
     }
     $ARGV[0] = '-' unless(@ARGV);
+    unshift(@ARGV, "__eval__") if defined($OPT{'eval'});
     while (@ARGV) {
-    my $f = shift @ARGV;
-    print STDERR "processing file '$f'\n" if($OPT{verbose}>1);
-    if ($f eq '-') {
-       $filebase = 'a';
-    } else {
-       ($filebase = $f) =~ s/\.[^.]*$//;
-    }
+        my $f = shift @ARGV;
+        print STDERR "processing file '$f'\n" if($OPT{verbose}>1);
+        if ($f eq '-') {
+            $filebase = 'a';
+        } else {
+            ($filebase = $f) =~ s/\.[^.]*$//;
+        }
        # special, clean all generated files
-    if ($OPT{clean}) {
+        if ($OPT{clean}) {
            clean_files($filebase) if ($f =~ /\.p6$/ || $f eq '-');
-       next;
-    }
+            next;
+        }
 
        # normal processing, passes rest of ARGV to running prog
-    # run next passes
-    my $fw = "$filebase.warn";
-    unlink($fw);
-    if ($OPT{quick} && -e "$filebase.pbc" && pbc_is_newer($filebase)) {
-       pass4("$filebase.pbc", $fw);
-    }
-    elsif ($f =~ /\.imc$/) {
-       pass2($f, $fw);
-    }
-    elsif ($f =~ /\.pasm$/) {
-       pass3($f, $fw);
-    }
-    elsif ($f =~ /\.(?:pb)?c$/) {
-       pass4($f, $fw);
-    }
-    else {
-       $parser = get_parser() unless ($parser);
-       pass1($parser, $f, $fw);
-    }
+        # run next passes
+        my $fw = "$filebase.warn";
+        unlink($fw);
+        if ($OPT{quick} && -e "$filebase.pbc" && pbc_is_newer($filebase)) {
+            pass4("$filebase.pbc", $fw);
+        }
+        elsif ($f =~ /\.imc$/) {
+            pass2($f, $fw);
+        }
+        elsif ($f =~ /\.pasm$/) {
+            pass3($f, $fw);
+        }
+        elsif ($f =~ /\.(?:pb)?c$/) {
+            pass4($f, $fw);
+        }
+        else {
+            $parser = get_parser() unless ($parser);
+            pass1($parser, $f, $fw, $OPT{'eval'});
+        }
        return;
     }
 }
@@ -690,9 +701,18 @@ sub pass4($$) {
        my @opt = map { "-$_" } split(//, $OPT{'parrot-options'});
        my $cmd = "$PARROT @opt $file @ARGV";
        verbose(1, "running: $cmd");
+
+        local *SAVEOUT;
+        open(SAVEOUT, ">&STDOUT");
+        if ($ARGV[0] =~ /> (.*)/) {
+            open(STDOUT, $ARGV[0]);
+            shift(@ARGV);
+        }
        if (system($PARROT, @opt, $file, @ARGV) && !$OPT{'ignore-exitcode'}) {
+            open(STDOUT, ">&SAVEOUT");
            mydie($?, $cmd);
        }
+        open(STDOUT, ">&SAVEOUT");
     }
 }
 

Reply via email to