luau/rfcs/function-newproxy-table-support
2023-01-09 11:53:19 -08:00

29 lines
1.5 KiB
Text

# Support table as first argument to newproxy
## Summary
Introduce a new way of creating `userdata` objects from Luau with an existing metatable.
## Motivation
Since Luau is derived from Lua 5.1 it retains the `newproxy` function used to create custom userdata objects from Lua. While this function is used by a number of libraries it has its limitations.
The `newproxy` function accepts a single, boolean parameter which specifies if the newly created userdata should be initialized with a metatable or not. If the userdata is initialized with a metatable then it can be retrieved and edited by calling `getmetatable`. Unfortunately, this means that a userdata created through `newproxy` cannot share a metatable with another userdata. There are two main implications of this:
- Memory - A userdata with a metatable has the same cost as a table with a metatable.
- Usability - userdata with the same 'type' do not have the same metatable.
## Design
Allow `newproxy` to be called with a table or nil instead of a boolean.
- When it is called with a table, the newly constructed userdata will have that table assigned as its metatable.
- When it is called with nil, the newly constructed userdata will have no metatable.
Passing a boolean to `newproxy` will continue to be supported for backwards compatability but is not recommended over the proposed behavior.
## Drawbacks
TODO: It will increase the usage of newproxy which may not be desirable.
## Alternatives
TODO: New method entirely - add more support for userdata