data GState = GState {
generated :: [Instruction], -- ^ Already generated code (in current method)
currentPool :: Pool Direct, -- ^ Already generated constants pool
+ nextPoolIndex :: Word16,
doneMethods :: [Method Direct], -- ^ Already generated class methods
currentMethod :: Maybe (Method Direct), -- ^ Current method
stackSize :: Word16, -- ^ Maximum stack size for current method
emptyGState = GState {
generated = [],
currentPool = M.empty,
+ nextPoolIndex = 1,
doneMethods = [],
currentMethod = Nothing,
stackSize = 496,
st <- St.get
St.put $ st {classPath = res}
--- | Append a constant to pool
-appendPool :: Constant Direct -> Pool Direct -> (Pool Direct, Word16)
-appendPool c pool =
- let ix = if M.null pool then 1 else maximum (M.keys pool) + 1
- pool' = M.insert ix c pool
- in (pool', ix)
-
-- | Add a constant to pool
addItem :: (Generator e g) => Constant Direct -> g e Word16
addItem c = do
case lookupPool c pool of
Just i -> return i
Nothing -> do
- let (pool', i) = appendPool c pool
+ i <- St.gets nextPoolIndex
+ let pool' = M.insert i c pool
+ i' = if long c
+ then i+2
+ else i+1
st <- St.get
- St.put $ st {currentPool = pool'}
+ St.put $ st {currentPool = pool',
+ nextPoolIndex = i'}
return i
-- | Lookup in a pool
NameType (..),
fieldNameType, methodNameType,
lookupField, lookupMethod,
+ long,
toString,
className,
apsize, arsize, arlist
return (x: next)
Nothing -> return []
+long :: Constant stage -> Bool
long (CLong _) = True
long (CDouble _) = True
long _ = False