This patch should fix the problem.
Note that one needs to run flex so as to generate the dependant file
that is tracked by svn.
cd compilers/imcc
flex -d -o imclexer.c imcc.l
Index: compilers/imcc/imcc.l
===================================================================
--- compilers/imcc/imcc.l (revision 26966)
+++ compilers/imcc/imcc.l (working copy)
@@ -629,25 +629,36 @@
<emit,INITIAL>\$I[0-9]+ {
if (valp) (valp)->s = yytext;
+ if (IMCC_INFO(interp)->state->pasm_file)
+ REJECT;
return IREG;
}
<emit,INITIAL>\$N[0-9]+ {
if (valp) (valp)->s = yytext;
+ if (IMCC_INFO(interp)->state->pasm_file)
+ REJECT;
return NREG;
}
<emit,INITIAL>\$S[0-9]+ {
if (valp) (valp)->s = yytext;
+ if (IMCC_INFO(interp)->state->pasm_file)
+ REJECT;
return SREG;
}
<emit,INITIAL>\$P[0-9]+ {
if (valp) (valp)->s = yytext;
+ if (IMCC_INFO(interp)->state->pasm_file)
+ REJECT;
return PREG;
}
<emit,INITIAL>\$[a-zA-Z0-9]+ {
+ if (!IMCC_INFO(interp)->state->pasm_file)
+ IMCC_fataly(interp, E_SyntaxError,
+ "'%s' is not a valid identifier or register name
in pir mode", yytext);
IMCC_fataly(interp, E_SyntaxError,
"'%s' is not a valid register name", yytext);
}
On Apr 14, 10:22 am, [EMAIL PROTECTED] (Klaas-Jan Stol) wrote:
> On Mon, Apr 14, 2008 at 12:26 AM, via RT Bob Rogers
>
>
> <[EMAIL PROTECTED]> wrote:
> > # New Ticket Created by Bob Rogers
> > # Please include the string: [perl #52858]
> > # in the subject line of all future correspondence about this issue.
> > # <URL:http://rt.perl.org/rt3/Ticket/Display.html?id=52858>
>
> > If you run the following PASM code:
>
> > new P0, 'Integer'
> > set P0, 77
> > set $N1, 1
> > set $N2, 2
> > set $N3, 3
> > print $N1
> > print ' '
> > print $N2
> > print ' '
> > print $N3
> > print "\n"
> > print P0
> > print "\n"
> > end
>
> > you will see something like the following output:
>
> > [EMAIL PROTECTED]> ./parrot dollar-vars.pasm
> > 3.000000 3.000000 3.000000
> > Segmentation fault
> > [EMAIL PROTECTED]>
>
> > The reason for this odd behavior is that all of the $N registers are
> > getting mapped to "N-1" (that's the register *before* N0); disassembly
> > shows the bogus register numbers clearly. This happens to overwrite P0,
> > hence the segfault.
>
> > So either the "$" syntax for registers must be disabled in PASM, or
> > it must be implemented properly. (I don't particularly care, and
> > haven't the IMCC-fu to do anything about it myself.)
>
> > -- Bob Rogers
> > http://rgrjr.dyndns.org/
>
> IMCC's lexer has a number of states, one of which is "emit". I'm not
> clear on how all these states are interacting,and to what cases these
> states correspond, but I think "emit" is "pasm" mode (I might be wrong
> here! I never really figured out what all states in IMCC are). The
> lexer recognizes virtual registers (with the $) in this "emit" state
> too.
>
> Ideally, the lexer could be tweaked that when reading $P0 in pasm
> mode, it emits an error message saying you can't use virtual registers
> in pasm mode. Rewriting the lexer rules (and states) might be tricky,
> but a simple solution would to check whether the lexer is in pasm mode
> in the action body of the rule for registers. (I think there's a flag
> in IMCC_INFO).
>
> I don't have time currently to work on this, unfortunately
>
> kjs