Changeset 13861 for src/Pugs/Eval
- Timestamp:
- 10/04/06 15:43:36 (2 years ago)
- Files:
-
- 1 modified
-
src/Pugs/Eval/Var.hs (modified) (6 diffs)
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 #-} 2 2 3 3 module Pugs.Eval.Var ( … … 18 18 import Pugs.Monads 19 19 import qualified Pugs.Val as Val 20 import qualified Data.ByteString.Char8 as Str20 import qualified Data.ByteString.Char8 as Buf 21 21 22 22 findVar :: Var -> Eval (Maybe VRef) … … 191 191 case subs' of 192 192 -- Recursion prevention -- SUPER::foo should not go back to ThisClas::foo 193 Right sub | cast ( Str.cons '&' $ subName sub) == var{ v_package = pkg } -> do193 Right sub | cast (Buf.cons '&' $ subName sub) == var{ v_package = pkg } -> do 194 194 return (Left . NoSuchMethod $ cast pkg) 195 195 _ -> do … … 654 654 return (var, val) 655 655 Nothing -> mzero 656 656 657 658 data ArityMatchData = MkArityMatchData 659 { d_reqLen :: !Int 660 , d_optLen :: !Int 661 , d_slurpLen :: !Int 662 , d_hasArray :: !Bool 663 , d_hasHash :: !Bool 664 } 665 657 666 arityMatch :: VCode -> Int -> Int -> [Int] -> Maybe VCode 658 667 arityMatch sub@MkCode{ subAssoc = assoc, subParams = prms } posLen namLen argSlurpLens … … 660 669 | A_chain <- assoc = Just sub 661 670 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)) 666 673 , if hasArray then slurpLen <= argSlurpLen else slurpLen == argSlurpLen 667 = Just sub668 -}669 670 | reqLen <- length $ filter (\p -> not (isOptional p || isSlurpy p)) prms671 , optLen <- length $ filter (\p -> isOptional p) prms672 , hasArray <- isJust $ find (\p -> isSlurpy p && v_sigil (paramName p) == SArray) prms673 , hasHash <- isJust $ find (\p -> isSlurpy p && v_sigil (paramName p) == SHash) prms674 , slurpLen <- length $ filter (\p -> isSlurpy p && v_sigil (paramName p) == SScalar) prms675 , 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)677 674 = Just sub 678 675 … … 680 677 = Nothing 681 678 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 683 initArityMatchData :: ArityMatchData 684 initArityMatchData = MkArityMatchData 0 0 0 False False 685 686 unwindPrm :: ArityMatchData -> Param -> ArityMatchData 687 unwindPrm 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) } 683 694 684 695 toPackage :: Pkg -> Var -> Var
