1-- SPDX-FileCopyrightText: 2025 Sören Tempel <soeren+git@soeren-tempel.net>2--3-- SPDX-License-Identifier: GPL-3.0-only45module Language.QBE.Simulator.Default.Funcs (lookupSimFunc) where67import Control.Monad.Error.Class (throwError)8import Control.Monad.IO.Class (MonadIO, liftIO)9import Language.QBE.Simulator.Error (EvalError (FuncArgsMismatch))10import Language.QBE.Simulator.Expression qualified as E11import Language.QBE.Simulator.State (Simulator, readNullArray, toAddress)12import Language.QBE.Types qualified as QBE1314puts :: (MonadIO m, E.ValueRepr v, Simulator m v) => QBE.GlobalIdent -> [v] -> m (Maybe v)15puts _ [strPtr] = do16 bytes <- toAddress strPtr >>= readNullArray17 liftIO $ putStrLn (E.toString bytes)18 pure (Just $ E.fromLit (QBE.Base QBE.Word) 0)19puts ident _ = throwError $ FuncArgsMismatch ident2021------------------------------------------------------------------------2223-- TODO: Register functions dynamically.24lookupSimFunc ::25 (MonadIO m, E.ValueRepr v, Simulator m v) =>26 QBE.GlobalIdent ->27 Maybe ([v] -> m (Maybe v))28lookupSimFunc i@(QBE.GlobalIdent "puts") = Just (puts i)29lookupSimFunc _ = Nothing