{-|
Module      : Lua.Debug
Copyright   : © 2023-2024 Albert Krewinkel
License     : MIT
Maintainer  : Albert Krewinkel <tarleb@hslua.org>

Haskell bindings to Lua's debug interface.
-}
module Lua.Debug
  ( lua_getupvalue
  , lua_setupvalue
  )
where

import Foreign.C
import Lua.Types as Lua

-- | Gets information about the @n@-th upvalue of the closure at index
-- @funcindex@. It pushes the upvalue\'s value onto the stack and
-- returns its name. Returns @NULL@ (and pushes nothing) when the index
-- @n@ is greater than the number of upvalues.
--
-- See
-- <https://www.lua.org/manual/5.4/manual.html#pdf-debug.getupvalue debug.getupvalue>
-- for more information about upvalues.
--
-- @[0, +(0|1), -]@
--
-- <https://www.lua.org/manual/5.4/manual.html#lua_getupvalue lua_getupvalue>.
foreign import ccall unsafe "lua.h lua_getupvalue"
  lua_getupvalue :: Lua.State
                 -> StackIndex  -- ^ funcindex
                 -> CInt        -- ^ n
                 -> IO CString

-- | Sets the value of a closure’s upvalue. It assigns the value on the
-- top of the stack to the upvalue and returns its name. It also pops
-- the value from the stack.
--
-- Returns @NULL@ (and pops nothing) when the index @n@ is greater than
-- the number of upvalues.
--
-- Parameters @funcindex@ and @n@ are as in the function
-- 'lua_getupvalue'.
--
-- @[-(0|1), +0, -]@
--
-- <https://www.lua.org/manual/5.4/manual.html#lua_setupvalue lua_setupvalue>.
foreign import ccall unsafe "lua.h lua_setupvalue"
  lua_setupvalue :: Lua.State
                 -> StackIndex  -- ^ funcindex
                 -> CInt        -- ^ n
                 -> IO CString