diff --git a/plutus-benchmark/common/PlutusBenchmark/Common.hs b/plutus-benchmark/common/PlutusBenchmark/Common.hs index 2a58f44dc6d..0ab911e06b9 100644 --- a/plutus-benchmark/common/PlutusBenchmark/Common.hs +++ b/plutus-benchmark/common/PlutusBenchmark/Common.hs @@ -54,6 +54,7 @@ import Data.ByteString qualified as BS import Data.SatInt (fromSatInt) import Flat qualified import GHC.IO.Encoding (setLocaleEncoding) +import GHC.Magic (inline) import System.Directory import System.FilePath import System.IO @@ -124,7 +125,12 @@ evaluateCekLikeInProd evalCtx term = do let (getRes, _, _) = let -- The validation benchmarks were all created from PlutusV1 scripts pv = LedgerApi.ledgerLanguageIntroducedIn LedgerApi.PlutusV1 - in LedgerApi.evaluateTerm UPLC.restrictingEnormous pv LedgerApi.Quiet evalCtx term + in inline LedgerApi.evaluateTerm + (inline UPLC.restrictingEnormous) + pv + LedgerApi.Quiet + evalCtx + term getRes -- | Evaluate a term and either throw if evaluation fails or discard the result and return '()'. diff --git a/plutus-benchmark/plutus-benchmark.cabal b/plutus-benchmark/plutus-benchmark.cabal index a8aa6e25ae9..35ee78dc447 100644 --- a/plutus-benchmark/plutus-benchmark.cabal +++ b/plutus-benchmark/plutus-benchmark.cabal @@ -95,6 +95,7 @@ library plutus-benchmark-common , directory , filepath , flat ^>=0.6 + , ghc-prim , plutus-core ^>=1.43 , plutus-ledger-api ^>=1.43 , plutus-tx-test-util diff --git a/plutus-core/untyped-plutus-core/src/UntypedPlutusCore/Evaluation/Machine/Cek/EmitterMode.hs b/plutus-core/untyped-plutus-core/src/UntypedPlutusCore/Evaluation/Machine/Cek/EmitterMode.hs index 44548468a25..692091e8170 100644 --- a/plutus-core/untyped-plutus-core/src/UntypedPlutusCore/Evaluation/Machine/Cek/EmitterMode.hs +++ b/plutus-core/untyped-plutus-core/src/UntypedPlutusCore/Evaluation/Machine/Cek/EmitterMode.hs @@ -29,6 +29,7 @@ import PlutusCore.Evaluation.Machine.ExMemory -- | No emitter. noEmitter :: EmitterMode uni fun noEmitter = EmitterMode $ \_ -> pure $ CekEmitterInfo (\_ -> pure ()) (pure mempty) +{-# INLINABLE noEmitter #-} -- | Emits log only. logEmitter :: EmitterMode uni fun @@ -36,6 +37,7 @@ logEmitter = EmitterMode $ \_ -> do logsRef <- newSTRef DList.empty let emitter logs = CekM $ modifySTRef logsRef (`DList.append` logs) pure $ CekEmitterInfo emitter (DList.toList <$> readSTRef logsRef) +{-# INLINABLE logEmitter #-} -- A wrapper around encoding a record. `cassava` insists on including a trailing newline, which is -- annoying since we're recording the output line-by-line. diff --git a/plutus-core/untyped-plutus-core/src/UntypedPlutusCore/Evaluation/Machine/Cek/ExBudgetMode.hs b/plutus-core/untyped-plutus-core/src/UntypedPlutusCore/Evaluation/Machine/Cek/ExBudgetMode.hs index 9b044f916ab..105a94d7c9f 100644 --- a/plutus-core/untyped-plutus-core/src/UntypedPlutusCore/Evaluation/Machine/Cek/ExBudgetMode.hs +++ b/plutus-core/untyped-plutus-core/src/UntypedPlutusCore/Evaluation/Machine/Cek/ExBudgetMode.hs @@ -159,6 +159,7 @@ restricting (ExRestrictingBudget initB@(ExBudget cpuInit memInit)) = ExBudgetMod pure $ initB `minusExBudget` r final = RestrictingSt . ExRestrictingBudget <$> remaining pure $ ExBudgetInfo spender final cumulative +{-# INLINE restricting #-} -- | 'restricting' instantiated at 'largeBudget'. restrictingLarge :: ThrowableBuiltins uni fun => ExBudgetMode RestrictingSt uni fun @@ -167,3 +168,4 @@ restrictingLarge = restricting largeBudget -- | 'restricting' instantiated at 'enormousBudget'. restrictingEnormous :: ThrowableBuiltins uni fun => ExBudgetMode RestrictingSt uni fun restrictingEnormous = restricting enormousBudget +{-# INLINE restrictingEnormous #-} diff --git a/plutus-core/untyped-plutus-core/src/UntypedPlutusCore/Evaluation/Machine/Cek/Internal.hs b/plutus-core/untyped-plutus-core/src/UntypedPlutusCore/Evaluation/Machine/Cek/Internal.hs index 7f710eb0877..98036a67127 100644 --- a/plutus-core/untyped-plutus-core/src/UntypedPlutusCore/Evaluation/Machine/Cek/Internal.hs +++ b/plutus-core/untyped-plutus-core/src/UntypedPlutusCore/Evaluation/Machine/Cek/Internal.hs @@ -102,6 +102,7 @@ import Data.Text (Text) import Data.Vector qualified as V import Data.Word import GHC.Generics +import GHC.Magic (inline) import GHC.TypeLits import Prettyprinter import Universe @@ -459,6 +460,7 @@ throwingDischarged -> CekValue uni fun ann -> CekM uni fun s x throwingDischarged l t = throwingWithCause l t . Just . dischargeCekValue +{-# INLINE throwingDischarged #-} instance ThrowableBuiltins uni fun => MonadError (CekEvaluationException NamedDeBruijn uni fun) (CekM uni fun s) where @@ -946,7 +948,8 @@ runCekDeBruijn runCekDeBruijn params mode emitMode term = runCekM params mode emitMode $ do unCekBudgetSpender ?cekBudgetSpender BStartup $ runIdentity $ cekStartupCost ?cekCosts - enterComputeCek NoFrame Env.empty term + inline enterComputeCek NoFrame Env.empty term +{-# INLINE runCekDeBruijn #-} {- Note [Accumulators for terms] At a couple of points in the CEK machine (notably building the arguments to a constructor value) diff --git a/plutus-ledger-api/plutus-ledger-api.cabal b/plutus-ledger-api/plutus-ledger-api.cabal index 2480f04a243..f4b48d4a350 100644 --- a/plutus-ledger-api/plutus-ledger-api.cabal +++ b/plutus-ledger-api/plutus-ledger-api.cabal @@ -115,6 +115,7 @@ library , cborg , containers , deepseq + , ghc-prim , lens , mtl , nothunks diff --git a/plutus-ledger-api/src/PlutusLedgerApi/Common/Eval.hs b/plutus-ledger-api/src/PlutusLedgerApi/Common/Eval.hs index 180b136790a..c2fcc2d831c 100644 --- a/plutus-ledger-api/src/PlutusLedgerApi/Common/Eval.hs +++ b/plutus-ledger-api/src/PlutusLedgerApi/Common/Eval.hs @@ -44,6 +44,7 @@ import Control.Monad.Writer (MonadWriter (..), runWriter) import Data.Set as Set import Data.Text (Text) import Data.Tuple +import GHC.Magic (inline) import NoThunks.Class -- | Errors that can be thrown when evaluating a Plutus script. @@ -200,10 +201,10 @@ evaluateTerm , [Text] ) evaluateTerm budgetMode pv verbose ectx = - UPLC.runCekDeBruijn + inline UPLC.runCekDeBruijn (toMachineParameters pv ectx) budgetMode - (if verbose == Verbose then UPLC.logEmitter else UPLC.noEmitter) + (if verbose == Verbose then inline UPLC.logEmitter else inline UPLC.noEmitter) -- Just replicating the old behavior, probably doesn't matter. {-# INLINE evaluateTerm #-}