packages feed

qute-0.1.0: src/Language/QBE/Simulator/Error.hs

-- SPDX-FileCopyrightText: 2025 Sören Tempel <soeren+git@soeren-tempel.net>
--
-- SPDX-License-Identifier: GPL-3.0-only

module Language.QBE.Simulator.Error (EvalError (..)) where

import Control.Monad.Catch (Exception)
import Language.QBE.Simulator.Memory (Address, showAddr)
import Language.QBE.Types qualified as QBE

-- TODO: Differentiate different typing errors.
data EvalError
  = TypingError
  | UnknownVariable String
  | EmptyStack
  | EncounteredHalt
  | InvalidReturnValue
  | UnknownBlock QBE.BlockIdent
  | InvalidMemoryLoad
  | UnknownFunction QBE.GlobalIdent
  | UnknownFunctionAddr Address
  | MissingFunctionReturn
  | FunctionReturnIgnored
  | AssignedVoidReturnValue
  | InvaldSubWordExtension
  | InvalidAddressType
  | OverlappingBlit Address Address
  | FuncArgsMismatch QBE.GlobalIdent
  | InvalidPhiPosition
  | MemoryError String
  deriving (Eq)

instance Show EvalError where
  show TypingError = "TypingError"
  show (UnknownVariable s) = "UnknownVariable: '" ++ show s ++ "'"
  show EmptyStack = "EmptyStack"
  show EncounteredHalt = "EncounteredHalt"
  show InvalidReturnValue = "InvalidReturnValue"
  show (UnknownBlock block) = "UnknownBlock: '" ++ show block ++ "'"
  show InvalidMemoryLoad = "InvalidMemoryLoad"
  show (UnknownFunction ident) = "UnknownFunction: '" ++ show ident ++ "'"
  show (UnknownFunctionAddr addr) = "UnknownFunctionAddr: '" ++ showAddr addr ++ "'"
  show MissingFunctionReturn = "MissingFunctionReturn"
  show FunctionReturnIgnored = "FunctionReturnIgnored"
  show AssignedVoidReturnValue = "AssignedVoidReturnValue"
  show InvaldSubWordExtension = "InvaldSubWordExtension"
  show InvalidAddressType = "InvalidAddressType"
  show (OverlappingBlit a1 a2) = "Addresses for Blit instruction overlap: " ++ show a1 ++ " and " ++ show a2
  show (FuncArgsMismatch ident) = "FuncArgsMismatch: '" ++ show ident ++ "'"
  show InvalidPhiPosition = "InvalidPhiPosition"
  show (MemoryError msg) = "MemoryError: " ++ show msg

instance Exception EvalError