- Timestamp:
- 11/12/08 10:01:29 (8 weeks ago)
- Location:
- src/Pugs
- Files:
-
- 5 modified
-
AST.hs (modified) (1 diff)
-
Compile.hs (modified) (2 diffs)
-
Embed/Haskell.hs (modified) (1 diff)
-
Eval.hs (modified) (4 diffs)
-
Parser/Operator.hs (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/AST.hs
r20058 r22990 194 194 , mc_variants = Set.singleton var 195 195 } 196 merge _ old = case old of197 PEConstant{ pe_proto = MkRef (ICode oldCV) }198 | Just (mc :: VMultiCode) <- fromTypeable oldCV -> protoEntry199 { pe_proto = MkRef . ICode $ protoCode200 { mc_assoc = code_assoc c `mappend` code_assoc mc201 , mc_variants = Set.insert var (mc_variants mc)202 , mc_signature = if length (mc_signature mc) == length (code_paramsc)203 then code_params c204 else [defaultArrayParam]205 }196 merge :: PadEntry -> PadEntry -> PadEntry 197 merge _ PEConstant{ pe_proto = MkRef (ICode oldCV) } 198 | Just (mc :: VMultiCode) <- fromTypeable oldCV 199 = protoEntry 200 { pe_proto = MkRef . ICode $ protoCode 201 { mc_assoc = code_assoc c `mappend` code_assoc mc 202 , mc_variants = Set.insert var (mc_variants mc) 203 , mc_signature = if length (mc_signature mc) == length (code_params c) 204 then code_params c 205 else [defaultArrayParam] 206 206 } 207 _ -> old -- sub overrides multi -- XXX - error? 207 } 208 merge _ old = old -- sub overrides multi -- XXX - error? 208 209 in MkPad (Map.insertWith' merge var' protoEntry (Map.insert var entry map)) 209 210 | otherwise = MkPad (Map.insert var entry map) -
src/Pugs/Compile.hs
r22313 r22990 77 77 canCompile (name@('&':_) :: String, sym) = do 78 78 (ref :: VRef) <- sym 79 case ref of79 (case ref of 80 80 MkRef ICode{} -> do 81 81 codes <- readCodesFromRef ref … … 83 83 MkRef (IScalar sv) | scalar_iType sv == mkType "Scalar::Const" 84 84 -> doCode name =<< fromVal =<< scalar_fetch sv 85 _ -> return [] 85 _ -> return []) :: Comp [PIL_Decl] 86 86 canCompile ("@*END", sym) = do 87 87 ref <- sym -
src/Pugs/Embed/Haskell.hs
r21673 r22990 1 {-# OPTIONS_GHC -fglasgow-exts -cpp -package plugins#-}1 {-# OPTIONS_GHC -fglasgow-exts -cpp #-} 2 2 3 3 module Pugs.Embed.Haskell where -
src/Pugs/Eval.hs
r21763 r22990 196 196 -- auto-enreference 197 197 esc $ VRef ref 198 case ref of198 (case ref of 199 199 MkRef IPair{} -> esc (VRef ref) 200 _ -> esc =<< readRef ref 200 _ -> esc =<< readRef ref) :: Eval () 201 201 -- LValue here 202 202 when isCollectionRef $ esc (castV ref) … … 508 508 sub <- fromCodeExp body 509 509 -- XXX this is wrong -- should use Array.next 510 elms <- case av of510 elms <- (case av of 511 511 VRef (MkRef sv@IScalar{}) -> return [sv] 512 VList xs -> return . (`map` xs) $ \x -> case x of512 VList xs -> return . (`map` xs) $ \x -> ((case x of 513 513 VRef (MkRef sv@IScalar{}) -> sv 514 _ -> (IScalar x) 515 _ -> join $ doArray av array_fetchElemAll 514 _ -> (IScalar x)) :: IVar VScalar) 515 _ -> join $ doArray av array_fetchElemAll) :: Eval [IVar VScalar] 516 516 -- This makes "for @x { ... }" into "for @x -> $_ is rw {...}" 517 517 let arity = length (subParams sub) … … 1151 1151 | v <- vals 1152 1152 ] 1153 forceThunk :: Val -> Eval Val 1153 1154 forceThunk (VRef (MkRef (IThunk tv))) = thunk_force tv 1154 1155 forceThunk x = return x … … 1491 1492 --- not scalarRef! -- use the new "transparent IType" thing! 1492 1493 case showType (typeOfSigilVar var) of 1493 "Hash" -> ($ v) . fix $ \(redo :: Val -> Eval Val) x -> case x of1494 "Hash" -> ($ v) . fix $ \(redo :: Val -> Eval Val) x -> (case x of 1494 1495 VRef (MkRef (IHash h)) -> return (VRef $ hashRef h) 1495 1496 VRef ref@(MkRef IScalar{}) -> redo =<< readRef ref 1496 _ -> fmap (VRef . hashRef) (fromVal v :: Eval VHash) 1497 "Array" -> ($ v) . fix $ \(redo :: Val -> Eval Val) x -> case x of1497 _ -> fmap (VRef . hashRef) (fromVal v :: Eval VHash)) :: Eval Val 1498 "Array" -> ($ v) . fix $ \(redo :: Val -> Eval Val) x -> (case x of 1498 1499 VRef (MkRef (IArray a)) -> return (VRef $ arrayRef a) 1499 1500 VRef ref@(MkRef IScalar{}) -> redo =<< readRef ref 1500 _ -> fmap (VRef . arrayRef) (fromVal v :: Eval VArray) 1501 _ -> case v of1501 _ -> fmap (VRef . arrayRef) (fromVal v :: Eval VArray)) :: Eval Val 1502 _ -> (case v of 1502 1503 VRef (MkRef IScalar{}) -> return (VRef $ scalarRef v) 1503 1504 VRef _ -> return v -- XXX - preserving ref 1504 _ -> return (VRef $ scalarRef v) 1505 _ -> return (VRef $ scalarRef v)) :: Eval Val 1505 1506 (False, False) -> return v -- XXX reduce to val? 1506 1507 (False, True) -> do -
src/Pugs/Parser/Operator.hs
r21673 r22990 204 204 Nothing -> do 205 205 ref <- readPadEntry entry 206 case ref of 207 MkRef (ICode cv) 208 | relevantToParsing (code_type cv) (code_assoc cv) -> do 209 let rv = MkCurrentFunction var (code_assoc cv) (code_params cv) 210 res = seq rv (Just rv) 211 unsafeIOToSTM (H.insert _RefToFunction entry res) 212 return res 213 MkRef (IScalar sv) 214 | Just (VCode cv) <- scalar_const sv 215 , relevantToParsing (code_type cv) (code_assoc cv) -> do 216 let rv = MkCurrentFunction var (code_assoc cv) (code_params cv) 217 res = seq rv (Just rv) 218 unsafeIOToSTM (H.insert _RefToFunction entry res) 219 return res 220 _ -> do 221 unsafeIOToSTM (H.insert _RefToFunction entry Nothing) 222 return Nothing 206 filterRef ref 207 where 208 filterRef :: VRef -> STM (Maybe CurrentFunction) 209 filterRef (MkRef (ICode cv)) 210 | relevantToParsing (code_type cv) (code_assoc cv) = do 211 let rv = MkCurrentFunction var (code_assoc cv) (code_params cv) 212 res = seq rv (Just rv) 213 unsafeIOToSTM (H.insert _RefToFunction entry res) 214 return res 215 filterRef (MkRef (IScalar sv)) 216 | Just (VCode cv) <- scalar_const sv 217 , relevantToParsing (code_type cv) (code_assoc cv) = do 218 let rv = MkCurrentFunction var (code_assoc cv) (code_params cv) 219 res = seq rv (Just rv) 220 unsafeIOToSTM (H.insert _RefToFunction entry res) 221 return res 222 filterRef _ = do 223 unsafeIOToSTM (H.insert _RefToFunction entry Nothing) 224 return Nothing 223 225 224 226 inScope :: Pkg -> Var -> Bool
