---
title: "debug.setupvalue"
description: "Replaces one upvalue in a Lua closure."
---

```lua
debug.setupvalue(target: function | number, index: number, value: any): function
```

---

## Aliases

- `setupvalue`

---

## Arguments

<ParamField body="target" type="function | number" required>
  The function to inspect, or a positive stack level identifying a caller.
</ParamField>

<ParamField body="index" type="number" required>
  A 1-based slot index.
</ParamField>

<ParamField body="value" type="any" required>
  The replacement captured value.
</ParamField>

---

## Returns

<ResponseField name="function" type="function">
  The resolved target function after its upvalue is changed.
</ResponseField>

Requires a valid existing slot. The resolved target function remains on the native stack and is returned; this is not the standard Lua upvalue-name return.

**Related types:** [Debug types & behavior](/reference/debug/types).

---

## Example

```lua
local captured = {value = 1}
local function sample() return captured.value end
debug.setupvalue(sample, 1, {value = 2})
print(sample())
```
