@@ -50,8 +50,7 @@ import PlutusPrelude
5050import UntypedPlutusCore.Core
5151import UntypedPlutusCore.Evaluation.Machine.Cek.CekMachineCosts (CekMachineCosts ,
5252 CekMachineCostsBase (.. ))
53- import UntypedPlutusCore.Evaluation.Machine.Cek.Internal hiding (Context (.. ), runCekDeBruijn ,
54- transferArgStack )
53+ import UntypedPlutusCore.Evaluation.Machine.Cek.Internal hiding (Context (.. ), runCekDeBruijn )
5554import UntypedPlutusCore.Evaluation.Machine.Cek.StepCounter
5655
5756import Control.Lens hiding (Context )
@@ -98,6 +97,7 @@ data Context uni fun ann
9897 = FrameAwaitArg ann ! (CekValue uni fun ann ) ! (Context uni fun ann ) -- ^ @[V _]@
9998 | FrameAwaitFunTerm ann ! (CekValEnv uni fun ann ) ! (NTerm uni fun ann ) ! (Context uni fun ann ) -- ^ @[_ N]@
10099 | FrameAwaitFunValue ann ! (CekValue uni fun ann ) ! (Context uni fun ann )
100+ | FrameAwaitFunValueN ann ! (ArgStack uni fun ann ) ! (Context uni fun ann )
101101 | FrameForce ann ! (Context uni fun ann ) -- ^ @(force _)@
102102 | FrameConstr ann ! (CekValEnv uni fun ann ) {- # UNPACK #-} !Word64 ! [NTerm uni fun ann ] ! (ArgStack uni fun ann ) ! (Context uni fun ann )
103103 | FrameCases ann ! (CekValEnv uni fun ann ) ! (V. Vector (NTerm uni fun ann )) ! (Context uni fun ann )
@@ -106,16 +106,10 @@ data Context uni fun ann
106106deriving stock instance (GShow uni , Everywhere uni Show , Show fun , Show ann , Closed uni )
107107 => Show (Context uni fun ann )
108108
109- -- | Transfers an 'ArgStack' to a series of 'Context' frames.
110- transferArgStack :: ann -> ArgStack uni fun ann -> Context uni fun ann -> Context uni fun ann
111- transferArgStack ann = go
112- where
113- go EmptyStack c = c
114- go (ConsStack arg rest) c = go rest (FrameAwaitFunValue ann arg c)
115-
116109-- | Transfers a 'Spine' of contant values onto the stack. The first argument will be at the top of the stack.
117110transferConstantSpine :: ann -> Spine (Some (ValueOf uni )) -> Context uni fun ann -> Context uni fun ann
118- transferConstantSpine ann args ctx = foldr (FrameAwaitFunValue ann . VCon ) ctx args
111+ transferConstantSpine ann args ctx =
112+ foldr (FrameAwaitFunValue ann . VCon ) ctx args
119113
120114computeCek
121115 :: forall uni fun ann s
@@ -191,13 +185,24 @@ returnCek (FrameAwaitArg _ fun ctx) arg =
191185 applyEvaluate ctx fun arg
192186-- s , [_ V1 .. Vn] ◅ lam x (M,ρ) ↦ s , [_ V2 .. Vn]; ρ [ x ↦ V1 ] ▻ M
193187returnCek (FrameAwaitFunValue _ arg ctx) fun =
194- applyEvaluate ctx fun arg
188+ applyEvaluate ctx fun arg
189+ -- s , [_ V1 .. Vn] ◅ lam x (M,ρ) ↦ s , [_ V2 .. Vn]; ρ [ x ↦ V1 ] ▻ M
190+ returnCek (FrameAwaitFunValueN ann args ctx) fun =
191+ case args of
192+ EmptyStack -> returnCek ctx fun
193+ ConsStack arg rest ->
194+ applyEvaluate (FrameAwaitFunValueN ann rest ctx) fun arg
195195-- s , constr I V0 ... Vj-1 _ (Tj+1 ... Tn, ρ) ◅ Vj ↦ s , constr i V0 ... Vj _ (Tj+2... Tn, ρ) ; ρ ▻ Tj+1
196196returnCek (FrameConstr ann env i todo done ctx) e = do
197- let done' = ConsStack e done
197+ let
198+ reverseArgStack = go EmptyStack
199+ where
200+ go acc EmptyStack = acc
201+ go acc (ConsStack x xs) = go (ConsStack x acc) xs
202+ done' = ConsStack e done
198203 case todo of
199204 (next : todo') -> computeCek (FrameConstr ann env i todo' done' ctx) env next
200- [] -> returnCek ctx $ VConstr i done'
205+ [] -> returnCek ctx $ VConstr i (reverseArgStack done')
201206-- s , case _ (C0 ... CN, ρ) ◅ constr i V1 .. Vm ↦ s , [_ V1 ... Vm] ; ρ ▻ Ci
202207returnCek (FrameCases ann env cs ctx) e = case e of
203208 -- If the index is larger than the max bound of an Int, or negative, then it's a bad index
@@ -208,7 +213,7 @@ returnCek (FrameCases ann env cs ctx) e = case e of
208213 throwErrorDischarged (StructuralError $ MissingCaseBranchMachineError i) e
209214 (VConstr i args) -> case (V. !?) cs (fromIntegral i) of
210215 Just t ->
211- let ctx' = transferArgStack ann args ctx
216+ let ctx' = FrameAwaitFunValueN ann args ctx
212217 in computeCek ctx' env t
213218 Nothing -> throwErrorDischarged (StructuralError $ MissingCaseBranchMachineError i) e
214219 VCon val -> case unCaserBuiltin ? cekCaserBuiltin val cs of
@@ -387,6 +392,7 @@ contextAnn = \case
387392 FrameAwaitArg ann _ _ -> pure ann
388393 FrameAwaitFunTerm ann _ _ _ -> pure ann
389394 FrameAwaitFunValue ann _ _ -> pure ann
395+ FrameAwaitFunValueN ann _ _ -> pure ann
390396 FrameForce ann _ -> pure ann
391397 FrameConstr ann _ _ _ _ _ -> pure ann
392398 FrameCases ann _ _ _ -> pure ann
@@ -400,6 +406,7 @@ lenContext = go 0
400406 FrameAwaitArg _ _ k -> go (n+ 1 ) k
401407 FrameAwaitFunTerm _ _ _ k -> go (n+ 1 ) k
402408 FrameAwaitFunValue _ _ k -> go (n+ 1 ) k
409+ FrameAwaitFunValueN _ _ k -> go (n+ 1 ) k
403410 FrameForce _ k -> go (n+ 1 ) k
404411 FrameConstr _ _ _ _ _ k -> go (n+ 1 ) k
405412 FrameCases _ _ _ k -> go (n+ 1 ) k
0 commit comments