On Thu, 12 Jul 2007 18:31:43 -0700
Mark Glines <[EMAIL PROTECTED]> wrote:
> So here's a patch.  It's a bit quick & dirty, but it'll work.  A
> cleaner solution would probably involve adding a fourth returned
> parameter from parse_flags: a line-count.  Ends up being the same
> thing, really... just keeps the knowledge of the pmclass line's format
> localized to the parse_flags() function.

...and here's the aforementioned cleaner version.  Please review and
apply.

Mark
=== lib/Parrot/Pmc2c/Parser.pm
==================================================================
--- lib/Parrot/Pmc2c/Parser.pm	(revision 21442)
+++ lib/Parrot/Pmc2c/Parser.pm	(local)
@@ -67,10 +67,10 @@
 sub parse_pmc {
     my ( $code, $opt ) = @_;
 
-    my ( $pre, $classname, $flags_ref ) = parse_flags( \$code );
+    my ( $pre, $classname, $flags_ref, $pmclass_lines ) = parse_flags( \$code );
     my ( $classblock, $post ) = extract_balanced($code);
 
-    my $lineno = 1 + count_newlines($pre);
+    my $lineno = 1 + count_newlines($pre) + $pmclass_lines;
     $classblock = substr( $classblock, 1, -1 );    # trim out the { }
 
     my ( @methods, %meth_hash, $class_init );
@@ -174,13 +174,17 @@
 
 =item *
 
-the name of the class; and
+the name of the class;
 
 =item *
 
 a hash ref containing the flags associated with the class (such as
-C<extends> and C<does>).
+C<extends> and C<does>); and
 
+=item *
+
+a count of the newlines we consumed while parsing this statement.
+
 =back
 
 B<Comments:>  Called internally by C<parse_pmc()>.
@@ -197,10 +201,11 @@
     my %has_value = map { $_ => 1 } qw(does extends group lib hll maps);
 
     my ( %flags, $parent_nr );
+    my $skipped_lines = 0;
 
     # look through the pmc declaration header for flags such as noinit
-    while ( $$c =~ s/^\s*(\w+)//s ) {
-        my $flag = $1;
+    while ( $$c =~ s/^(\s*)(\w+)//s ) {
+        my ($whitespace, $flag) = ($1, $2);
         if ( $has_value{$flag} ) {
             $$c =~ s/^\s+(\w+)//s
                 or die "Parser error: no value for '$flag'";
@@ -210,6 +215,7 @@
         else {
             $flags{$flag} = 1;
         }
+        $skipped_lines += count_newlines($whitespace);
     }
 
     # setup some defaults
@@ -218,7 +224,7 @@
         $flags{does}{scalar}     = 1 unless $flags{does};
     }
 
-    return $pre, $classname, \%flags;
+    return $pre, $classname, \%flags, $skipped_lines;
 }
 
 =head3 C<extract_balanced()>

Reply via email to