Update read-only-environment.md

This commit is contained in:
Gael 2023-08-14 15:48:33 +01:00 committed by GitHub
parent d9d3b1dc20
commit 7ac31cfd8c
Signed by: DevComp
GPG key ID: 4AEE18F83AFDEB23

View file

@ -2,32 +2,19 @@
## Summary ## Summary
Add a way to access a read-only version of the environment without disabling `safeenv`. Add `_ENV` as a safe alternative to `getfenv`.
## Motivation ## Motivation
There are valid use cases for accessing the environment in a read-only way. As defined in the [RFC](https://github.com/Roblox/luau/blob/master/rfcs/deprecate-getfenv-setfenv.md) for deprecating There are valid use cases for accessing the environment in a read-only way. As defined in the [RFC](https://github.com/Roblox/luau/blob/master/rfcs/deprecate-getfenv-setfenv.md) for deprecating
getfenv and setfenv there are outlined cases where reading the environment is useful. getfenv and setfenv there are outlined cases where reading the environment is useful.
Increased performance can be achieved for transpilers written in Luau that may not be able to have a static environment created to access functions from or cant directly transpile 1:1. Similarly Increased performance can be achieved for transpilers written in Luau that may not be able to have a static environment created to access functions from or cant directly transpile 1:1. Similarly interpreters written in Luau can benefit from being able to access functions without deoptimization, making other optimizations still active.
interpreters written in Luau can benefit from being able to access functions without deoptimization, making other optimizations still active.
## Design ## Design
A safe way to access the environment is with a read-only table with `__index` and `__iter` metamethods. A read-only global table `_ENV` with clones of all base functions and libraries.
a) `_ENV` table
A read-only global table with metamethods that point to `LUA_ENVIRONINDEX`.
b) `getenv` or `getrenv` function
Works identically to `getfenv` but only provides read-only access to the function's environment.
## Drawbacks ## Drawbacks
Type-checking can be difficult. Roblox's marketplace currently hides assets that use `getfenv` so it would need to be updated to hide assets with `_ENV`.
Roblox's marketplace currently hides assets that use `getfenv` so it would need to be updated to hide assets with `_ENV`/`getenv`/`getrenv`.
Environments can have metamethods of their own which may not interface well with a read-only `getenv`/`getrenv`.