Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Roblox
GitHub Repository: Roblox/luau
Path: blob/master/Require/src/Require.cpp
2725 views
1
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
2
3
#include "Luau/Require.h"
4
5
#include "RequireImpl.h"
6
7
#include "lua.h"
8
#include "lualib.h"
9
10
#include <new>
11
12
static void validateConfig(lua_State* L, const luarequire_Configuration& config)
13
{
14
if (!config.is_require_allowed)
15
luaL_error(L, "require configuration is missing required function pointer: is_require_allowed");
16
if (!config.reset)
17
luaL_error(L, "require configuration is missing required function pointer: reset");
18
if (!config.jump_to_alias)
19
luaL_error(L, "require configuration is missing required function pointer: jump_to_alias");
20
if (!config.to_parent)
21
luaL_error(L, "require configuration is missing required function pointer: to_parent");
22
if (!config.to_child)
23
luaL_error(L, "require configuration is missing required function pointer: to_child");
24
if (!config.is_module_present)
25
luaL_error(L, "require configuration is missing required function pointer: is_module_present");
26
if (!config.get_chunkname)
27
luaL_error(L, "require configuration is missing required function pointer: get_chunkname");
28
if (!config.get_loadname)
29
luaL_error(L, "require configuration is missing required function pointer: get_loadname");
30
if (!config.get_cache_key)
31
luaL_error(L, "require configuration is missing required function pointer: get_cache_key");
32
if (!config.get_config_status)
33
luaL_error(L, "require configuration is missing required function pointer: get_config_status");
34
if (config.get_alias && config.get_config)
35
luaL_error(L, "require configuration cannot define both get_alias and get_config");
36
if (!config.get_alias && !config.get_config)
37
luaL_error(L, "require configuration is missing required function pointer: either get_alias or get_config (not both)");
38
if (!config.load)
39
luaL_error(L, "require configuration is missing required function pointer: load");
40
}
41
42
static int pushrequireclosureinternal(
43
lua_State* L,
44
luarequire_Configuration_init config_init,
45
void* ctx,
46
lua_CFunction requirelikefunc,
47
const char* debugname
48
)
49
{
50
void* ud = (lua_newuserdata(L, sizeof(luarequire_Configuration)));
51
if (!ud)
52
luaL_error(L, "failed to allocate memory for require configuration");
53
54
luarequire_Configuration* config = new (ud) luarequire_Configuration{};
55
config_init(config);
56
validateConfig(L, *config);
57
58
lua_pushlightuserdata(L, ctx);
59
60
// require-like closure captures config and ctx as upvalues
61
lua_pushcclosurek(L, requirelikefunc, debugname, 2, Luau::Require::lua_requirecont);
62
return 1;
63
}
64
65
int luarequire_pushrequire(lua_State* L, luarequire_Configuration_init config_init, void* ctx)
66
{
67
return pushrequireclosureinternal(L, config_init, ctx, Luau::Require::lua_require, "require");
68
}
69
70
void luaopen_require(lua_State* L, luarequire_Configuration_init config_init, void* ctx)
71
{
72
luarequire_pushrequire(L, config_init, ctx);
73
lua_setglobal(L, "require");
74
}
75
76
int luarequire_pushproxyrequire(lua_State* L, luarequire_Configuration_init config_init, void* ctx)
77
{
78
return pushrequireclosureinternal(L, config_init, ctx, Luau::Require::lua_proxyrequire, "proxyrequire");
79
}
80
81
int luarequire_registermodule(lua_State* L)
82
{
83
return Luau::Require::registerModuleImpl(L);
84
}
85
86
int luarequire_clearcacheentry(lua_State* L)
87
{
88
return Luau::Require::clearCacheEntry(L);
89
}
90
91
int luarequire_clearcache(lua_State* L)
92
{
93
return Luau::Require::clearCache(L);
94
}
95
96