@@ -202,11 +202,11 @@ fromVarIndex :: Int -> Name
202202fromVarIndex n =
203203 runST
204204 (
205− do let !size = getIndexSize n
205+ do let !size = 2 + getIndexSize n
206206 mba <- newByteArray size
207207 writeWord8 mba 0 0x5F {- _ -}
208208 writeWord8 mba 1 0x76 {- v -}
209− writeDigits mba (size - 1) n
209+ writeDigitsAtEnd mba size n
210210 freeze mba
211211 )
212212
@@ -214,19 +214,20 @@ fromVarIndex n =
214214{-# INLINE getIndexSize #-}
215215getIndexSize :: Int -> Int
216216getIndexSize n
217− | n < 10 = 3
218− | n < 100 = 4
219− | True = 2 + ceiling (logBase 10 (fromIntegral n + 1) :: Float)
217+ | n < 10 = 1
218+ | n < 100 = 2
219+ | True = ceiling (logBase 10 (fromIntegral n + 1) :: Float)
220220
221221
222222
223−writeDigits :: MBA s -> Int -> Int -> ST s ()
224−writeDigits !mba !offset !n =
223+writeDigitsAtEnd :: MBA s -> Int -> Int -> ST s ()
224+writeDigitsAtEnd !mba !oldOffset !n =
225225 do let (q,r) = quotRem n 10
226− writeWord8 mba offset (0x30 + fromIntegral r)
226+ let !newOffset = oldOffset - 1
227+ writeWord8 mba newOffset (0x30 + fromIntegral r)
227228 if q <= 0
228229 then return ()
229− else writeDigits mba (offset-1) q
230+ else writeDigitsAtEnd mba newOffset q
230231
231232
232233
@@ -249,7 +250,7 @@ fromTypeVariable name@(Utf8.Utf8 ba#) index =
249250 mba <- newByteArray size
250251 copyToMBA name mba
251252 writeWord8 mba (I# len#) 0x5F {- _ -}
252− writeDigits mba (size - 1) index
253+ writeDigitsAtEnd mba size index
253254 freeze mba
254255 )
255256 else
@@ -258,7 +259,7 @@ fromTypeVariable name@(Utf8.Utf8 ba#) index =
258259 do let !size = I# len# + getIndexSize index
259260 mba <- newByteArray size
260261 copyToMBA name mba
261− writeDigits mba (size - 1) index
262+ writeDigitsAtEnd mba size index
262263 freeze mba
263264 )
264265
@@ -277,10 +278,10 @@ fromTypeVariableScheme scheme =
277278 freeze mba
278279 else
279280 do let (extra, letter) = quotRem scheme 26
280− let !size = getIndexSize extra
281+ let !size = 1 + getIndexSize extra
281282 mba <- newByteArray size
282283 writeWord8 mba 0 (0x61 + fromIntegral letter)
283− writeDigits mba (size - 1) extra
284+ writeDigitsAtEnd mba size extra
284285 freeze mba
285286 )
286287