@@ -202,11 +202,11 @@ fromVarIndex :: Int -> Name
202fromVarIndex n =
202fromVarIndex n =
205− do let !size = getIndexSize n
205+ do let !size = 2 + getIndexSize n
206 mba <- newByteArray size
206 mba <- newByteArray size
207 writeWord8 mba 0 0x5F {- _ -}
207 writeWord8 mba 0 0x5F {- _ -}
208 writeWord8 mba 1 0x76 {- v -}
208 writeWord8 mba 1 0x76 {- v -}
209− writeDigits mba (size - 1) n
209+ writeDigitsAtEnd mba size n
210 freeze mba
210 freeze mba
@@ -214,19 +214,20 @@ fromVarIndex n =
214{-# INLINE getIndexSize #-}
214{-# INLINE getIndexSize #-}
215getIndexSize :: Int -> Int
215getIndexSize :: Int -> Int
216getIndexSize n
216getIndexSize n
217− | n < 10 = 3
217+ | n < 10 = 1
218− | n < 100 = 4
218+ | n < 100 = 2
219− | True = 2 + ceiling (logBase 10 (fromIntegral n + 1) :: Float)
219+ | True = ceiling (logBase 10 (fromIntegral n + 1) :: Float)
223−writeDigits :: MBA s -> Int -> Int -> ST s ()
223+writeDigitsAtEnd :: MBA s -> Int -> Int -> ST s ()
224−writeDigits !mba !offset !n =
224+writeDigitsAtEnd !mba !oldOffset !n =
225 do let (q,r) = quotRem n 10
225 do let (q,r) = quotRem n 10
226+ let !newOffset = oldOffset - 1
226− writeWord8 mba offset (0x30 + fromIntegral r)
227+ writeWord8 mba newOffset (0x30 + fromIntegral r)
227 if q <= 0
228 if q <= 0
228 then return ()
229 then return ()
229− else writeDigits mba (offset-1) q
230+ else writeDigitsAtEnd mba newOffset q
@@ -249,7 +250,7 @@ fromTypeVariable name@(Utf8.Utf8 ba#) index =
249 mba <- newByteArray size
250 mba <- newByteArray size
250 copyToMBA name mba
251 copyToMBA name mba
251 writeWord8 mba (I# len#) 0x5F {- _ -}
252 writeWord8 mba (I# len#) 0x5F {- _ -}
252− writeDigits mba (size - 1) index
253+ writeDigitsAtEnd mba size index
253 freeze mba
254 freeze mba
@@ -258,7 +259,7 @@ fromTypeVariable name@(Utf8.Utf8 ba#) index =
258 do let !size = I# len# + getIndexSize index
259 do let !size = I# len# + getIndexSize index
259 mba <- newByteArray size
260 mba <- newByteArray size
260 copyToMBA name mba
261 copyToMBA name mba
261− writeDigits mba (size - 1) index
262+ writeDigitsAtEnd mba size index
262 freeze mba
263 freeze mba
@@ -277,10 +278,10 @@ fromTypeVariableScheme scheme =
277 freeze mba
278 freeze mba
279 do let (extra, letter) = quotRem scheme 26
280 do let (extra, letter) = quotRem scheme 26
280− let !size = getIndexSize extra
281+ let !size = 1 + getIndexSize extra
281 mba <- newByteArray size
282 mba <- newByteArray size
282 writeWord8 mba 0 (0x61 + fromIntegral letter)
283 writeWord8 mba 0 (0x61 + fromIntegral letter)
283− writeDigits mba (size - 1) extra
284+ writeDigitsAtEnd mba size extra
284 freeze mba
285 freeze mba