Changeset 22990

Show
Ignore:
Timestamp:
11/12/08 10:01:29 (8 weeks ago)
Author:
audreyt
Message:

* GHC 6.10 support, part 3 of 3: Adjust for GADT's "rigid types" restriction.

Location:
src/Pugs
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/AST.hs

    r20058 r22990  
    194194                , mc_variants   = Set.singleton var 
    195195                } 
    196             merge _ old = case old of 
    197                 PEConstant{ pe_proto = MkRef (ICode oldCV) } 
    198                     | Just (mc :: VMultiCode) <- fromTypeable oldCV -> protoEntry 
    199                         { pe_proto = MkRef . ICode $ protoCode 
    200                             { mc_assoc      = code_assoc c `mappend` code_assoc mc 
    201                             , mc_variants   = Set.insert var (mc_variants mc) 
    202                             , mc_signature  = if length (mc_signature mc) == length (code_params c) 
    203                                 then code_params c 
    204                                 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] 
    206206                        } 
    207                 _ -> old -- sub overrides multi -- XXX - error? 
     207                    } 
     208            merge _ old = old -- sub overrides multi -- XXX - error? 
    208209       in MkPad (Map.insertWith' merge var' protoEntry (Map.insert var entry map)) 
    209210    | otherwise = MkPad (Map.insert var entry map) 
  • src/Pugs/Compile.hs

    r22313 r22990  
    7777        canCompile (name@('&':_) :: String, sym) = do 
    7878            (ref :: VRef) <- sym 
    79             case ref of 
     79            (case ref of 
    8080                MkRef ICode{} -> do 
    8181                    codes <- readCodesFromRef ref 
     
    8383                MkRef (IScalar sv) | scalar_iType sv == mkType "Scalar::Const" 
    8484                    -> doCode name =<< fromVal =<< scalar_fetch sv 
    85                 _ -> return [] 
     85                _ -> return []) :: Comp [PIL_Decl] 
    8686        canCompile ("@*END", sym) = do 
    8787            ref     <- sym 
  • src/Pugs/Embed/Haskell.hs

    r21673 r22990  
    1 {-# OPTIONS_GHC -fglasgow-exts -cpp -package plugins #-} 
     1{-# OPTIONS_GHC -fglasgow-exts -cpp #-} 
    22 
    33module Pugs.Embed.Haskell where 
  • src/Pugs/Eval.hs

    r21763 r22990  
    196196                -- auto-enreference 
    197197                esc $ VRef ref 
    198             case ref of 
     198            (case ref of 
    199199                MkRef IPair{}   -> esc (VRef ref) 
    200                 _               -> esc =<< readRef ref 
     200                _               -> esc =<< readRef ref) :: Eval () 
    201201        -- LValue here 
    202202        when isCollectionRef $ esc (castV ref) 
     
    508508    sub   <- fromCodeExp body 
    509509    -- XXX this is wrong -- should use Array.next 
    510     elms  <- case av of 
     510    elms  <- (case av of 
    511511        VRef (MkRef sv@IScalar{})   -> return [sv] 
    512         VList xs                    -> return . (`map` xs) $ \x -> case x of 
     512        VList xs                    -> return . (`map` xs) $ \x -> ((case x of 
    513513            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] 
    516516    -- This makes "for @x { ... }" into "for @x -> $_ is rw {...}" 
    517517    let arity = length (subParams sub) 
     
    11511151        | v     <- vals 
    11521152        ] 
     1153    forceThunk :: Val -> Eval Val 
    11531154    forceThunk (VRef (MkRef (IThunk tv)))   = thunk_force tv 
    11541155    forceThunk x                            = return x 
     
    14911492                    --- not scalarRef! -- use the new "transparent IType" thing! 
    14921493                    case showType (typeOfSigilVar var) of 
    1493                         "Hash"  -> ($ v) . fix $ \(redo :: Val -> Eval Val) x -> case x of 
     1494                        "Hash"  -> ($ v) . fix $ \(redo :: Val -> Eval Val) x -> (case x of 
    14941495                            VRef (MkRef (IHash h)) -> return (VRef $ hashRef h)  
    14951496                            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 of 
     1497                            _ -> fmap (VRef . hashRef) (fromVal v :: Eval VHash)) :: Eval Val 
     1498                        "Array" -> ($ v) . fix $ \(redo :: Val -> Eval Val) x -> (case x of 
    14981499                            VRef (MkRef (IArray a)) -> return (VRef $ arrayRef a)  
    14991500                            VRef ref@(MkRef IScalar{}) -> redo =<< readRef ref 
    1500                             _ -> fmap (VRef . arrayRef) (fromVal v :: Eval VArray) 
    1501                         _       -> case v of 
     1501                            _ -> fmap (VRef . arrayRef) (fromVal v :: Eval VArray)) :: Eval Val 
     1502                        _       -> (case v of 
    15021503                            VRef (MkRef IScalar{}) -> return (VRef $ scalarRef v)  
    15031504                            VRef _ -> return v -- XXX - preserving ref 
    1504                             _ -> return (VRef $ scalarRef v)  
     1505                            _ -> return (VRef $ scalarRef v)) :: Eval Val 
    15051506                (False, False)  -> return v -- XXX reduce to val? 
    15061507                (False, True)   -> do 
  • src/Pugs/Parser/Operator.hs

    r21673 r22990  
    204204        Nothing -> do 
    205205            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 
    223225 
    224226inScope :: Pkg -> Var -> Bool