Changeset 13861 for src/Pugs/Eval

Show
Ignore:
Timestamp:
10/04/06 15:43:36 (2 years ago)
Author:
audreyt
Message:

* Pugs.Eval.Var: Refactor the arityMatch algorithm to use a

custom data type to improve conciseness.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Eval/Var.hs

    r13827 r13861  
    1 {-# OPTIONS_GHC -fglasgow-exts -cpp -fallow-overlapping-instances #-} 
     1{-# OPTIONS_GHC -fglasgow-exts -cpp -fallow-overlapping-instances -funbox-strict-fields #-} 
    22 
    33module Pugs.Eval.Var ( 
     
    1818import Pugs.Monads 
    1919import qualified Pugs.Val as Val 
    20 import qualified Data.ByteString.Char8 as Str 
     20import qualified Data.ByteString.Char8 as Buf 
    2121 
    2222findVar :: Var -> Eval (Maybe VRef) 
     
    191191        case subs' of 
    192192            -- Recursion prevention -- SUPER::foo should not go back to ThisClas::foo 
    193             Right sub | cast (Str.cons '&' $ subName sub) == var{ v_package = pkg } -> do 
     193            Right sub | cast (Buf.cons '&' $ subName sub) == var{ v_package = pkg } -> do 
    194194                return (Left . NoSuchMethod $ cast pkg) 
    195195            _   -> do 
     
    654654                    return (var, val) 
    655655            Nothing -> mzero 
    656          
     656 
     657 
     658data ArityMatchData = MkArityMatchData 
     659    { d_reqLen      :: !Int 
     660    , d_optLen      :: !Int 
     661    , d_slurpLen    :: !Int 
     662    , d_hasArray    :: !Bool 
     663    , d_hasHash     :: !Bool 
     664    } 
     665 
    657666arityMatch :: VCode -> Int -> Int -> [Int] -> Maybe VCode 
    658667arityMatch sub@MkCode{ subAssoc = assoc, subParams = prms } posLen namLen argSlurpLens 
     
    660669    | A_chain   <- assoc = Just sub 
    661670 
    662 {- 
    663     | isNothing $ find (not . isSlurpy) prms -- XXX - what about empty ones? 
    664     , slurpLen  <- length $ filter (\p -> isSlurpy p && v_sigil (paramName p) == SScalar) prms 
    665     , hasArray  <- isJust $ find (\p -> isSlurpy p && v_sigil (paramName p) == SArray) prms 
     671    | argLen >= reqLen 
     672    , hasArray || ((if hasHash then posLen else argLen) <= (reqLen + optLen + slurpLen)) 
    666673    , if hasArray then slurpLen <= argSlurpLen else slurpLen == argSlurpLen 
    667     = Just sub 
    668 -} 
    669  
    670     | reqLen    <- length $ filter (\p -> not (isOptional p || isSlurpy p)) prms 
    671     , optLen    <- length $ filter (\p -> isOptional p) prms 
    672     , hasArray  <- isJust $ find (\p -> isSlurpy p && v_sigil (paramName p) == SArray) prms 
    673     , hasHash   <- isJust $ find (\p -> isSlurpy p && v_sigil (paramName p) == SHash) prms 
    674     , slurpLen  <- length $ filter (\p -> isSlurpy p && v_sigil (paramName p) == SScalar) prms 
    675     , argLen >= reqLen && (hasArray || (if hasHash then posLen else argLen) <= (reqLen + optLen)) 
    676     , if hasArray then slurpLen <= sum (drop reqLen argSlurpLens) else slurpLen == sum (drop argLen argSlurpLens) 
    677674    = Just sub 
    678675 
     
    680677    = Nothing 
    681678    where 
    682     argLen = posLen + namLen 
     679    argLen      = posLen + namLen 
     680    argSlurpLen = sum (drop (reqLen + optLen) argSlurpLens) 
     681    ~(MkArityMatchData reqLen optLen slurpLen hasArray hasHash) = foldl unwindPrm initArityMatchData prms 
     682 
     683initArityMatchData :: ArityMatchData 
     684initArityMatchData = MkArityMatchData 0 0 0 False False 
     685 
     686unwindPrm :: ArityMatchData -> Param -> ArityMatchData 
     687unwindPrm dat p 
     688    | isSlurpy p = case v_sigil (paramName p) of 
     689        SArray  -> dat{ d_hasArray = True } 
     690        SHash   -> dat{ d_hasHash  = True } 
     691        _       -> dat{ d_slurpLen = succ (d_slurpLen dat) } 
     692    | isOptional p  = dat{ d_optLen = succ (d_optLen dat) } 
     693    | otherwise     = dat{ d_reqLen = succ (d_reqLen dat) } 
    683694 
    684695toPackage :: Pkg -> Var -> Var