Skip to content

Commit 578a6b5

Browse files
committed
Remove prismatic error handling from Ck/Cek machines
1 parent f17c02c commit 578a6b5

File tree

20 files changed

+185
-235
lines changed

20 files changed

+185
-235
lines changed

plutus-core/cost-model/budgeting-bench/Benchmarks/Nops.hs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import PlutusCore.Evaluation.Machine.BuiltinCostModel hiding (BuiltinCostModel)
2222
import PlutusCore.Evaluation.Machine.ExBudgetingDefaults
2323
import PlutusCore.Evaluation.Machine.ExMemoryUsage (ExMemoryUsage)
2424
import PlutusCore.Evaluation.Machine.MachineParameters
25-
import PlutusCore.Evaluation.Result (evaluationFailure)
2625
import PlutusCore.Pretty
2726
import PlutusPrelude
2827
import UntypedPlutusCore.Evaluation.Machine.Cek
@@ -137,7 +136,7 @@ infixr >:
137136
n >: k =
138137
case n of
139138
SomeConstant (Some (ValueOf DefaultUniInteger _)) -> k
140-
_ -> evaluationFailure
139+
_ -> builtinResultFailure
141140
{-# INLINE (>:) #-}
142141

143142
{- | The meanings of the builtins. Each one takes a number of arguments and

plutus-core/plutus-core/examples/PlutusCore/Examples/Builtins.hs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import PlutusCore.Data
2424
import PlutusCore.Evaluation.Machine.BuiltinCostModel
2525
import PlutusCore.Evaluation.Machine.ExBudget
2626
import PlutusCore.Evaluation.Machine.ExBudgetStream
27-
import PlutusCore.Evaluation.Result (evaluationFailure)
2827
import PlutusCore.Pretty
2928

3029
import PlutusCore.StdLib.Data.ScottList qualified as Plc
@@ -199,7 +198,7 @@ instance tyname ~ TyName => KnownTypeAst tyname DefaultUni Void where
199198
instance UniOf term ~ DefaultUni => MakeKnownIn DefaultUni term Void where
200199
makeKnown = absurd
201200
instance UniOf term ~ DefaultUni => ReadKnownIn DefaultUni term Void where
202-
readKnown _ = throwing _StructuralUnliftingError "Can't unlift to 'Void'"
201+
readKnown _ = throwStructuralUnliftingError "Can't unlift to 'Void'"
203202

204203
data BuiltinErrorCall = BuiltinErrorCall
205204
deriving stock (Show, Eq)
@@ -286,7 +285,7 @@ instance uni ~ DefaultUni => ToBuiltinMeaning uni ExtensionFun where
286285
idAssumeCheckBoolPlc val =
287286
case asConstant val of
288287
Right (Some (ValueOf DefaultUniBool b)) -> pure b
289-
_ -> evaluationFailure
288+
_ -> builtinResultFailure
290289

291290
toBuiltinMeaning _semvar IdSomeConstantBool =
292291
makeBuiltinMeaning
@@ -296,7 +295,7 @@ instance uni ~ DefaultUni => ToBuiltinMeaning uni ExtensionFun where
296295
idSomeConstantBoolPlc :: SomeConstant uni Bool -> BuiltinResult Bool
297296
idSomeConstantBoolPlc = \case
298297
SomeConstant (Some (ValueOf DefaultUniBool b)) -> pure b
299-
_ -> evaluationFailure
298+
_ -> builtinResultFailure
300299

301300
toBuiltinMeaning _semvar IdIntegerAsBool =
302301
makeBuiltinMeaning
@@ -306,7 +305,7 @@ instance uni ~ DefaultUni => ToBuiltinMeaning uni ExtensionFun where
306305
idIntegerAsBool :: SomeConstant uni Integer -> BuiltinResult (SomeConstant uni Integer)
307306
idIntegerAsBool = \case
308307
con@(SomeConstant (Some (ValueOf DefaultUniBool _))) -> pure con
309-
_ -> evaluationFailure
308+
_ -> builtinResultFailure
310309

311310
toBuiltinMeaning _semvar IdFInteger =
312311
makeBuiltinMeaning
@@ -397,7 +396,7 @@ instance uni ~ DefaultUni => ToBuiltinMeaning uni ExtensionFun where
397396

398397
toBuiltinMeaning _semvar ErrorPrime =
399398
makeBuiltinMeaning
400-
(evaluationFailure :: forall a. BuiltinResult a)
399+
(builtinResultFailure :: forall a. BuiltinResult a)
401400
whatever
402401

403402
toBuiltinMeaning _semvar Comma =

plutus-core/plutus-core/src/PlutusCore/Bitwise.hs

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ module PlutusCore.Bitwise (
2424
maximumOutputLength
2525
) where
2626

27-
import PlutusCore.Builtin (BuiltinResult, emit)
28-
import PlutusCore.Evaluation.Result (evaluationFailure)
27+
import PlutusCore.Builtin (BuiltinResult, builtinResultFailure, emit)
2928

3029
import ByteString.StrictBuilder (Builder)
3130
import ByteString.StrictBuilder qualified as Builder
@@ -64,15 +63,15 @@ integerToByteString endiannessArg lengthArg input
6463
| lengthArg < 0 = do
6564
emit "integerToByteString: negative length argument"
6665
emit $ "Length requested: " <> (pack . show $ input)
67-
evaluationFailure
66+
builtinResultFailure
6867
-- Check that the requested length does not exceed the limit. *NB*: if we remove the limit we'll
6968
-- still have to make sure that the length fits into an Int.
7069
| lengthArg > maximumOutputLength = do
7170
emit . pack $ "integerToByteString: requested length is too long (maximum is "
7271
++ show maximumOutputLength
7372
++ " bytes)"
7473
emit $ "Length requested: " <> (pack . show $ lengthArg)
75-
evaluationFailure
74+
builtinResultFailure
7675
-- If the requested length is zero (ie, an explicit output size is not
7776
-- specified) we still have to make sure that the output won't exceed the size
7877
-- limit. If the requested length is nonzero and less than the limit,
@@ -86,7 +85,7 @@ integerToByteString endiannessArg lengthArg input
8685
++ show (8 * maximumOutputLength)
8786
++ "-1)"
8887
emit $ "Length required: " <> (pack . show $ bytesRequiredFor input)
89-
evaluationFailure
88+
builtinResultFailure
9089
| otherwise = let endianness = endiannessArgToByteOrder endiannessArg in
9190
-- We use fromIntegral here, despite advice to the contrary in general when defining builtin
9291
-- denotations. This is because, if we've made it this far, we know that overflow or truncation
@@ -98,14 +97,14 @@ integerToByteString endiannessArg lengthArg input
9897
-- This does work proportional to the size of input. However, we're in a failing case
9998
-- anyway, and the user's paid for work proportional to this size in any case.
10099
emit $ "Input: " <> (pack . show $ input)
101-
evaluationFailure
100+
builtinResultFailure
102101
NotEnoughDigits -> do
103102
emit "integerToByteString: cannot represent Integer in given number of bytes"
104103
-- This does work proportional to the size of input. However, we're in a failing case
105104
-- anyway, and the user's paid for work proportional to this size in any case.
106105
emit $ "Input: " <> (pack . show $ input)
107106
emit $ "Bytes requested: " <> (pack . show $ lengthArg)
108-
evaluationFailure
107+
builtinResultFailure
109108
Right result -> pure result
110109

111110
-- | Conversion from 'Integer' to 'ByteString', as per
@@ -528,11 +527,11 @@ readBit bs ix
528527
| ix < 0 = do
529528
emit "readBit: index out of bounds"
530529
emit $ "Index: " <> (pack . show $ ix)
531-
evaluationFailure
530+
builtinResultFailure
532531
| ix >= len * 8 = do
533532
emit "readBit: index out of bounds"
534533
emit $ "Index: " <> (pack . show $ ix)
535-
evaluationFailure
534+
builtinResultFailure
536535
| otherwise = do
537536
let (bigIx, littleIx) = ix `quotRem` 8
538537
let flipIx = len - bigIx - 1
@@ -548,7 +547,7 @@ writeBits bs ixs bit = case unsafeDupablePerformIO . try $ go of
548547
Left (WriteBitsException i) -> do
549548
emit "writeBits: index out of bounds"
550549
emit $ "Index: " <> (pack . show $ i)
551-
evaluationFailure
550+
builtinResultFailure
552551
Right result -> pure result
553552
where
554553
-- This is written in a somewhat strange way. See Note [writeBits and
@@ -588,13 +587,13 @@ replicateByte :: Integer -> Word8 -> BuiltinResult ByteString
588587
replicateByte len w8
589588
| len < 0 = do
590589
emit "replicateByte: negative length requested"
591-
evaluationFailure
590+
builtinResultFailure
592591
| len > maximumOutputLength = do
593592
emit . pack $ "replicateByte: requested length is too long (maximum is "
594593
++ show maximumOutputLength
595594
++ " bytes)"
596595
emit $ "Length requested: " <> (pack . show $ len)
597-
evaluationFailure
596+
builtinResultFailure
598597
| otherwise = pure . BS.replicate (fromIntegral len) $ w8
599598

600599
-- | Wrapper for calling 'unsafesShiftByteString' safely. Specifically, we avoid various edge cases:

plutus-core/plutus-core/src/PlutusCore/Builtin/KnownType.hs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
module PlutusCore.Builtin.KnownType
1919
( BuiltinError
20-
, throwBuiltinErrorWithCause
2120
, KnownBuiltinTypeIn
2221
, KnownBuiltinType
2322
, BuiltinResult (..)
@@ -30,7 +29,6 @@ module PlutusCore.Builtin.KnownType
3029
, ReadKnownIn (..)
3130
, ReadKnown
3231
, makeKnownOrFail
33-
, readKnownSelf
3432
) where
3533

3634
import PlutusPrelude
@@ -39,11 +37,10 @@ import PlutusCore.Builtin.HasConstant
3937
import PlutusCore.Builtin.Polymorphism
4038
import PlutusCore.Builtin.Result
4139
import PlutusCore.Core
42-
import PlutusCore.Evaluation.ErrorWithCause
4340
import PlutusCore.Evaluation.Result
4441
import PlutusCore.Pretty
4542

46-
import Data.Either.Extras
43+
import Control.Monad.Except
4744
import Data.Functor.Identity
4845
import Data.String
4946
import GHC.Exts (inline, oneShot)
@@ -276,7 +273,7 @@ readKnownConstant val = asConstant val >>= oneShot \case
276273
-- optimize some of the matching away.
277274
case uniExp `geq` uniAct of
278275
Just Refl -> pure x
279-
Nothing -> throwing _UnliftingEvaluationError $ typeMismatchError uniExp uniAct
276+
Nothing -> throwError $ BuiltinUnliftingEvaluationError $ typeMismatchError uniExp uniAct
280277
{-# INLINE readKnownConstant #-}
281278

282279
-- | A non-empty spine. Isomorphic to 'NonEmpty', except is strict and is defined as a single
@@ -361,13 +358,6 @@ makeKnownOrFail x = case makeKnown x of
361358
BuiltinFailure _ _ -> EvaluationFailure
362359
{-# INLINE makeKnownOrFail #-}
363360

364-
-- | Same as 'readKnown', but the cause of a potential failure is the provided term itself.
365-
readKnownSelf
366-
:: (ReadKnown val a, AsUnliftingEvaluationError err, AsEvaluationFailure err)
367-
=> val -> Either (ErrorWithCause err val) a
368-
readKnownSelf val = fromRightM (throwBuiltinErrorWithCause val) $ readKnown val
369-
{-# INLINE readKnownSelf #-}
370-
371361
instance MakeKnownIn uni val a => MakeKnownIn uni val (BuiltinResult a) where
372362
makeKnown res = res >>= makeKnown
373363
{-# INLINE makeKnown #-}

plutus-core/plutus-core/src/PlutusCore/Builtin/Result.hs

Lines changed: 16 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -10,35 +10,27 @@
1010

1111
module PlutusCore.Builtin.Result
1212
( EvaluationError (..)
13-
, AsEvaluationError (..)
1413
, UnliftingError (..)
1514
, UnliftingEvaluationError (..)
1615
, BuiltinError (..)
1716
, BuiltinResult (..)
18-
, AsUnliftingEvaluationError (..)
19-
, AsUnliftingError (..)
20-
, AsBuiltinError (..)
21-
, AsBuiltinResult (..)
22-
, _UnliftingErrorVia
23-
, _StructuralUnliftingError
24-
, _OperationalUnliftingError
2517
, throwNotAConstant
2618
, throwUnderTypeError
19+
, throwOperationalUnliftingError
20+
, throwStructuralUnliftingError
2721
, emit
2822
, withLogs
2923
, throwing
3024
, throwing_
25+
, builtinResultFailure
3126
) where
3227

3328
import PlutusPrelude
3429

3530
import PlutusCore.Evaluation.Error
36-
import PlutusCore.Evaluation.Result
3731

38-
import Control.Lens
3932
import Control.Monad.Error.Lens (throwing, throwing_)
4033
import Control.Monad.Except
41-
import Data.Bitraversable
4234
import Data.DList (DList)
4335
import Data.String (IsString)
4436
import Data.Text (Text)
@@ -93,56 +85,6 @@ data BuiltinResult a
9385
| BuiltinFailure (DList Text) BuiltinError
9486
deriving stock (Show, Foldable)
9587

96-
mtraverse makeClassyPrisms
97-
[ ''UnliftingError
98-
, ''UnliftingEvaluationError
99-
, ''BuiltinError
100-
, ''BuiltinResult
101-
]
102-
103-
instance AsEvaluationError UnliftingEvaluationError UnliftingError UnliftingError where
104-
_EvaluationError = coerced
105-
{-# INLINE _EvaluationError #-}
106-
107-
-- | An 'UnliftingEvaluationError' /is/ an 'EvaluationError', hence for this instance we only
108-
-- require both @structural@ and @operational@ to have '_UnliftingError' prisms, so that we can
109-
-- handle both the cases pointwisely.
110-
instance (AsUnliftingError structural, AsUnliftingError operational) =>
111-
AsUnliftingEvaluationError (EvaluationError structural operational) where
112-
_UnliftingEvaluationError = go . coerced where
113-
go =
114-
prism'
115-
(bimap
116-
(review _UnliftingError)
117-
(review _UnliftingError))
118-
(bitraverse
119-
(reoption . matching _UnliftingError)
120-
(reoption . matching _UnliftingError))
121-
{-# INLINE _UnliftingEvaluationError #-}
122-
123-
instance AsUnliftingEvaluationError BuiltinError where
124-
_UnliftingEvaluationError = _BuiltinUnliftingEvaluationError . _UnliftingEvaluationError
125-
{-# INLINE _UnliftingEvaluationError #-}
126-
127-
instance AsEvaluationFailure BuiltinError where
128-
_EvaluationFailure = _EvaluationFailureVia BuiltinEvaluationFailure
129-
{-# INLINE _EvaluationFailure #-}
130-
131-
-- >>> import PlutusCore.Evaluation.Result
132-
-- >>> evaluationFailure :: BuiltinResult Bool
133-
-- BuiltinFailure (fromList []) BuiltinEvaluationFailure
134-
--
135-
-- >>> import Control.Lens
136-
-- >>> let res = BuiltinFailure (pure mempty) evaluationFailure :: BuiltinResult Bool
137-
-- >>> matching _EvaluationFailure res
138-
-- Right ()
139-
--
140-
-- >>> matching _BuiltinFailure $ BuiltinSuccess True
141-
-- Left (BuiltinSuccess True)
142-
instance AsEvaluationFailure (BuiltinResult a) where
143-
_EvaluationFailure = _BuiltinFailure . iso (\_ -> ()) (\_ -> pure evaluationFailure)
144-
{-# INLINE _EvaluationFailure #-}
145-
14688
instance MonadFail BuiltinResult where
14789
fail err = BuiltinFailure (pure $ Text.pack err) BuiltinEvaluationFailure
14890
{-# INLINE fail #-}
@@ -184,28 +126,23 @@ variable).
184126
--
185127
-- This is useful for providing 'AsUnliftingError' instances for types such as 'CkUserError' and
186128
-- 'CekUserError'.
187-
_UnliftingErrorVia :: Pretty err => err -> Prism' err UnliftingError
188-
_UnliftingErrorVia err = iso (MkUnliftingError . display) (const err)
189-
{-# INLINE _UnliftingErrorVia #-}
190-
191-
-- | See Note [Structural vs operational errors within builtins]
192-
_StructuralUnliftingError :: AsBuiltinError err => Prism' err UnliftingError
193-
_StructuralUnliftingError = _BuiltinUnliftingEvaluationError . _StructuralError
194-
{-# INLINE _StructuralUnliftingError #-}
195-
196-
-- | See Note [Structural vs operational errors within builtins]
197-
_OperationalUnliftingError :: AsBuiltinError err => Prism' err UnliftingError
198-
_OperationalUnliftingError = _BuiltinUnliftingEvaluationError . _OperationalError
199-
{-# INLINE _OperationalUnliftingError #-}
200129

201130
throwNotAConstant :: MonadError BuiltinError m => m void
202-
throwNotAConstant = throwing _StructuralUnliftingError "Not a constant"
131+
throwNotAConstant = throwError (BuiltinUnliftingEvaluationError $ MkUnliftingEvaluationError $ StructuralError $ MkUnliftingError "Not a constant")
203132
{-# INLINE throwNotAConstant #-}
204133

205134
throwUnderTypeError :: MonadError BuiltinError m => m void
206-
throwUnderTypeError = throwing _StructuralUnliftingError "Panic: 'TypeError' was bypassed"
135+
throwUnderTypeError = throwError (BuiltinUnliftingEvaluationError $ MkUnliftingEvaluationError $ StructuralError $ MkUnliftingError "Panic: 'TypeError' was bypassed")
207136
{-# INLINE throwUnderTypeError #-}
208137

138+
throwOperationalUnliftingError :: MonadError BuiltinError m => UnliftingError -> m void
139+
throwOperationalUnliftingError =
140+
throwError . BuiltinUnliftingEvaluationError . MkUnliftingEvaluationError . OperationalError
141+
142+
throwStructuralUnliftingError :: MonadError BuiltinError m => UnliftingError -> m void
143+
throwStructuralUnliftingError =
144+
throwError . BuiltinUnliftingEvaluationError . MkUnliftingEvaluationError . StructuralError
145+
209146
-- | Add a log line to the logs.
210147
emit :: Text -> BuiltinResult ()
211148
emit txt = BuiltinSuccessWithLogs (pure txt) ()
@@ -284,3 +221,6 @@ instance MonadError BuiltinError BuiltinResult where
284221
BuiltinFailure _ err `catchError` f = f err
285222
res `catchError` _ = res
286223
{-# INLINE catchError #-}
224+
225+
builtinResultFailure :: BuiltinResult a
226+
builtinResultFailure = BuiltinFailure mempty BuiltinEvaluationFailure

plutus-core/plutus-core/src/PlutusCore/Crypto/Utils.hs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33

44
module PlutusCore.Crypto.Utils (failWithMessage, byteStringAsHex) where
55

6-
import PlutusCore.Builtin.Result (BuiltinResult, emit)
7-
import PlutusCore.Evaluation.Result (evaluationFailure)
6+
import PlutusCore.Builtin.Result (BuiltinResult, builtinResultFailure, emit)
87

98
import Data.ByteString (ByteString, foldr')
109
import Data.Kind (Type)
@@ -14,7 +13,7 @@ import Text.Printf (printf)
1413
failWithMessage :: forall (a :: Type). Text -> Text -> BuiltinResult a
1514
failWithMessage location reason = do
1615
emit $ location <> ": " <> reason
17-
evaluationFailure
16+
builtinResultFailure
1817

1918
byteStringAsHex :: ByteString -> String
2019
byteStringAsHex bs = "0x" ++ (Prelude.concat $ foldr' (\w s -> (printf "%02x" w):s) [] bs)

0 commit comments

Comments
 (0)