When lexing a primitive string, always make a "narrow" FastString.
Otherwise when the string contains zeros we get a Unicode string,
which luckily turns into the right thing when compiled but confuses the
byte-code generator.
So this fixes the symptom (byte-code generator can't load files
generated with happy -ag), but not the real bug (byte-code generator
can't handle unicode strings).
= case currentChar# buf of
'"'#{-"-} ->
let buf' = incCurrentPos buf
= case currentChar# buf of
'"'#{-"-} ->
let buf' = incCurrentPos buf
- s' = mkFastString (map chr (reverse s))
in case currentChar# buf' of
in case currentChar# buf' of
- '#'# | glaExtsEnabled exts -> if all (<= 0xFF) s
- then cont (ITprimstring s') (incCurrentPos buf')
- else lexError "primitive string literal must contain only characters <= \'\\xFF\'" buf'
- _ -> cont (ITstring s') buf'
+ '#'# | glaExtsEnabled exts ->
+ if any (> 0xFF) s
+ then lexError "primitive string literal must contain only characters <= \'\\xFF\'" buf'
+ else let s' = mkFastStringNarrow (map chr (reverse s)) in
+ -- always a narrow string/byte array
+ cont (ITprimstring s') (incCurrentPos buf')
+
+ _other -> let s' = mkFastString (map chr (reverse s))
+ in cont (ITstring s') buf'
-- ignore \& in a string, deal with string gaps
'\\'# | next_ch `eqChar#` '&'#
-- ignore \& in a string, deal with string gaps
'\\'# | next_ch `eqChar#` '&'#