On Thu, 12 Jul 2007 09:26:25 -0700 Mark Glines <[EMAIL PROTECTED]> wrote: > > Interestingly, if I take all of the crud in this pmclass statement > > and stick them all on one line, like this: > > > > pmclass Perl6Str extends String does string dynpmc group perl6_group > > hll Perl6 maps String { > > > > ...The #line numbers do not change at all (get_string in the .c file > > is still #lined to 154), but now the get_string implementation in > > the .pmc file is also on line 154, so everything lines up. > > I don't have a fix (yet), but here's a patch to add a couple of tests > for it. One test makes sure it emits the right #line when a complex > pmclass statement is all on one line, and the second makes sure #line > is adjusted when pmclass *isn't* on the same line. > > The first test succeeds, the second one fails.
In the pmc2c parser, parse_pmc() calls parse_flags() to parse the pmclass line, and sort out all of the necessary attributes. parse_flags() consumes everything from "pmclass" to "{", and parse_pmc assumes that it was all on one line, and just uses the the magic number 1 to represent that line. 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. Mark
=== lib/Parrot/Pmc2c/Parser.pm ================================================================== --- lib/Parrot/Pmc2c/Parser.pm (revision 21442) +++ lib/Parrot/Pmc2c/Parser.pm (local) @@ -67,10 +67,14 @@ sub parse_pmc { my ( $code, $opt ) = @_; + my $lineno = 1; + if($code =~ /(pmclass[^{]+{)/) { + $lineno += count_newlines($1); + } my ( $pre, $classname, $flags_ref ) = parse_flags( \$code ); my ( $classblock, $post ) = extract_balanced($code); - my $lineno = 1 + count_newlines($pre); + $lineno += count_newlines($pre); $classblock = substr( $classblock, 1, -1 ); # trim out the { } my ( @methods, %meth_hash, $class_init );