module STGState where import IntState import Gcode import ForeignCode import Maybe data Where = Arg Int | Stack Int | Heap Int | HeapLate | Direct Gcode instance Show Where where showsPrec d (Arg i) = showString "Arg " . shows i showsPrec d (Stack i) = showString "Stack " . shows i showsPrec d (Heap i) = showString "Heap " . shows i showsPrec d (HeapLate ) = showString "HeapLate" showsPrec d (Direct g) = showString "Direct " --- prof fun maxDepth failstack state env data Thread = Thread Bool Int Int [(Int,Int)] IntState [[(Int,Where)]] --- lateenv depth heap depth stack [[(Int,Where)]] Int Int [Int] --- foreigns foreignMemo ([Foreign], Maybe ForeignMemo) sums xs = sums' 0 xs where sums' k [] = [k] sums' k (x:xs) = k : sums' (k+x) xs needstack 0 gs = gs needstack n gs = NEEDSTACK n : gs ------ pushFail down up@(Thread prof fun maxDepth fds state env lateenv d h dhs fs) = case uniqueIS state of (i,state) -> (fromEnum i,Thread prof fun maxDepth ((fromEnum i,d):fds) state env lateenv d h dhs fs) popFail down up@(Thread prof fun maxDepth (_:fds) state env lateenv d h dhs fs) = Thread prof fun maxDepth fds state env lateenv d h dhs fs getFail down up@(Thread prof fun maxDepth fds@[] state env lateenv d h dhs fs) = (Nothing,up) getFail down up@(Thread prof fun maxDepth fds@((f,fd):_) state env lateenv d h dhs fs) = (Just (f,d-fd),up) maxDepth down up@(Thread prof fun mD fds state env lateenv d h dhs fs) = (mD,up) getDepth down up@(Thread prof fun maxDepth fds state env lateenv d h dhs fs) = (d,up) incDepthIf False down up@(Thread prof fun maxDepth fds state env lateenv d h dhs fs) = (d,up) incDepthIf True down up@(Thread prof fun maxDepth fds state (e:env) lateenv d h dhs fs) = case d + 1 of d' -> if d' > maxDepth then (d',Thread prof fun d' fds state (((-1,Stack d'):e):env) lateenv d' h dhs fs) else (d',Thread prof fun maxDepth fds state (((-1,Stack d'):e):env) lateenv d' h dhs fs) {- ---- -- Niklas reckons that the updTOS code here is completely useless, -- so we're following his advice and replacing it with a lifted identity. -- ---- -- NOTE why is old_i sometimes -1, and if not why did the old code change i? updTOS False i down up = up updTOS True i down up@(Thread prof fun maxDepth fds state (((old_i,w):e):env) lateenv d h dhs fs) | old_i == -1 = Thread prof fun maxDepth fds state (((i,w):e):env) lateenv d h dhs fs updTOS True i down up@(Thread prof fun maxDepth fds state (((old_i,w):e):env) lateenv d h dhs fs) | old_i == i = up updTOS _ i down up@(Thread prof fun maxDepth fds state (e:env) lateenv d h dhs fs) = strace ("nhc98 is in deep trouble and might produce faulty code for "++show i++" \n fun= " ++ show fun ++ " e = " ++ show e ++ "\n") $ up -} -- However, I'm going to keep the warning just in case it's useful. -- ... but now it is commented out because it is annoying, and we still -- believe it is harmless. --updTOS True i down up@(Thread prof fun maxDepth fds state (((oi,w):e):env) lateenv d h dhs fs) -- | oi/=i && oi /= -1 = -- strace ("Warning: nhc98 might produce faulty code:"++ -- "\n i="++show i++"\n oi="++show oi++ -- "\n fun="++show fun++ -- "\n e = " ++ show e ++ "\n") $ up updTOS _ i down up = up incDepth down up@(Thread prof fun maxDepth fds state env lateenv d h dhs fs) = case d + 1 of d' -> if d' > maxDepth then Thread prof fun d' fds state env lateenv d' h dhs fs else Thread prof fun maxDepth fds state env lateenv d' h dhs fs decDepth s down up@(Thread prof fun maxDepth fds state env lateenv d h dhs fs) = Thread prof fun maxDepth fds state env lateenv (d-s) h dhs fs clrHeap down up@(Thread prof fun maxDepth fds state env lateenv d h dhs fs) = Thread prof fun maxDepth fds state env lateenv d 0 dhs fs getHeap down up@(Thread prof fun maxDepth fds state env lateenv d h dhs fs) = (h,up) updHeap s down up@(Thread prof fun maxDepth fds state env lateenv d h dhs fs) = (h,Thread prof fun maxDepth fds state env lateenv d (h+s) dhs fs) pushDH down up@(Thread prof fun maxDepth fds state env lateenv d h dhs fs) = Thread prof fun maxDepth fds state env lateenv d h (d:dhs) fs cloneDH down up@(Thread prof fun maxDepth fds state env lateenv _ h dhs@(d:_) fs) = Thread prof fun maxDepth fds state env lateenv d h dhs fs popDH down up@(Thread prof fun maxDepth fds state env lateenv _ h (d:dhs) fs) = Thread prof fun maxDepth fds state env lateenv d h dhs fs pushEnv es down up@(Thread prof fun maxDepth fds state env lateenv d h dhs fs) = -- strace ("Pushenv (" ++ s ++ ") " ++ show es) $ Thread prof fun maxDepth fds state (es:env) lateenv d h dhs fs pushStack es down up@(Thread prof fun maxDepth fds state env lateenv d h dhs fs) = let es' = zip es (map Stack [d+1 .. ]) in -- strace ("pushStack (" {- ++ s ++ ") "-} ++ show es') $ Thread prof fun maxDepth fds state (es':env) lateenv (d+length es') h dhs fs popEnv down up@(Thread prof fun maxDepth fds state (_:env) lateenv d h dhs fs) = Thread prof fun maxDepth fds state env lateenv d h dhs fs gUnique down up@(Thread prof fun maxDepth fds state env lateenv d h dhs fs) = case uniqueIS state of (u,state) -> (u,Thread prof fun maxDepth fds state env lateenv d h dhs fs) gProf down up@(Thread prof fun maxDepth fds state env lateenv d h dhs fs) = (prof,up) setFun fun down up@(Thread prof _ maxDepth fds state env lateenv d h dhs fs) = (Thread prof fun maxDepth fds state env [] d h dhs fs) getExtra c down up@(Thread prof fun maxDepth fds state env lateenv d h dhs fs) = if prof then ((4,[HEAP_STATIC fun c,HEAP_CREATE,HEAP_SPACE,HEAP_SPACE]),Thread prof fun maxDepth fds state env lateenv d h dhs fs) else ((0::Int,[]),up) gState down up@(Thread prof fun maxDepth fds state env lateenv d h dhs fs) = (state,up) gOnly con down up@(Thread prof fun maxDepth fds state env lateenv d h dhs fs) = (((1==) . length . constrsI . fromJust . lookupIS state . belongstoI . fromJust . lookupIS state) con ,up) gWhere i down up@(Thread prof fun maxDepth fds state env lateenv d h dhs fs) = (case lookups i env of Nothing -> Nothing Just (Arg i) -> Just (Arg i) Just (Stack i)-> Just (Stack (d-i)) Just (Heap i) -> Just (Heap (i-h)) -- always incHeap before lookup Just (HeapLate) -> Just HeapLate ,up ) gWhereAbs i down up@(Thread prof fun maxDepth fds state env lateenv d h dhs fs) = (lookups i env ,up ) makeForeign s a v c ie down up@(Thread prof fun maxDepth fds state env lateenv d h dhs fs) = let (IntState _ _ st _ _) = state newfs = case fs of (fs,Nothing) -> let mm = foreignMemo st tf = toForeign st mm c ie s a v in (tf:fs, Just mm) (fs,m@(Just mm)) -> let tf = toForeign st mm c ie s a v in (tf:fs, m) in Thread prof fun maxDepth fds state env lateenv d h dhs newfs lateWhere v down up@(Thread prof fun maxDepth fds state env lateenv d h dhs fs) = (case lookups v lateenv of Just x@(Heap i) -> x -- always incHeap before lookup Just x@(Direct g) -> x Just x@(Stack i) -> x Just _ -> error ("lateWhere (just) failed on " ++ show v ++ " lateenv = " ++ show lateenv) _ -> error ("lateWhere (nothing) failed on " ++ show v ++ " lateenv = " ++ show lateenv) ,up ) updWhere i down up@(Thread prof fun maxDepth fds state (e:env) lateenv d h dhs fs) = -- strace ("updWhere: i = " ++ show i ++ " e = " ++ show e) $ Thread prof fun maxDepth fds state (((i,Stack d):e):env) lateenv d h dhs fs -- hide old definition gArity i down up@(Thread prof fun maxDepth fds state env lateenv d h dhs fs) = case lookups i env of Nothing -> (Just (arityIS state (toEnum i)),up) Just _ -> (Nothing,up) lookups i [] = Nothing lookups i (x:xs) = case lookup i x of Just v -> Just v Nothing -> lookups i xs