Skip to content

Commit 059e89c

Browse files
committed
Add load_buffer and do_buffer, remove load mode from load_string and do_string
1 parent b5d7360 commit 059e89c

File tree

7 files changed

+70
-16
lines changed

7 files changed

+70
-16
lines changed

src/LuaState.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -134,16 +134,24 @@ Ref<LuaTable> LuaState::create_table(const Dictionary& initial_values) {
134134
return memnew(LuaTable(to_table(lua_state, initial_values)));
135135
}
136136

137-
Variant LuaState::load_string(const String& chunk, const String& chunkname, LoadMode mode, LuaTable *env) {
138-
return ::luagdextension::load_string(lua_state, chunk, chunkname, (sol::load_mode) mode, env);
137+
Variant LuaState::load_buffer(const PackedByteArray& chunk, const String& chunkname, LoadMode mode, LuaTable *env) {
138+
return ::luagdextension::load_buffer(lua_state, chunk, chunkname, (sol::load_mode) mode, env);
139+
}
140+
141+
Variant LuaState::load_string(const String& chunk, const String& chunkname, LuaTable *env) {
142+
return ::luagdextension::load_buffer(lua_state, chunk.to_utf8_buffer(), chunkname, sol::load_mode::text, env);
139143
}
140144

141145
Variant LuaState::load_file(const String& filename, LoadMode mode, LuaTable *env) {
142146
return ::luagdextension::load_file(lua_state, filename, (sol::load_mode) mode, env);
143147
}
144148

145-
Variant LuaState::do_string(const String& chunk, const String& chunkname, LoadMode mode, LuaTable *env) {
146-
return ::luagdextension::do_string(lua_state, chunk, chunkname, (sol::load_mode) mode, env);
149+
Variant LuaState::do_buffer(const PackedByteArray& chunk, const String& chunkname, LoadMode mode, LuaTable *env) {
150+
return ::luagdextension::do_buffer(lua_state, chunk, chunkname, (sol::load_mode) mode, env);
151+
}
152+
153+
Variant LuaState::do_string(const String& chunk, const String& chunkname, LuaTable *env) {
154+
return ::luagdextension::do_buffer(lua_state, chunk.to_utf8_buffer(), chunkname, sol::load_mode::text, env);
147155
}
148156

149157
Variant LuaState::do_file(const String& filename, LoadMode mode, LuaTable *env) {
@@ -203,9 +211,11 @@ void LuaState::_bind_methods() {
203211
// Methods
204212
ClassDB::bind_method(D_METHOD("open_libraries", "libraries"), &LuaState::open_libraries, DEFVAL(BitField<Library>(ALL_LIBS)));
205213
ClassDB::bind_method(D_METHOD("create_table", "initial_values"), &LuaState::create_table, DEFVAL(Dictionary()));
206-
ClassDB::bind_method(D_METHOD("load_string", "chunk", "chunkname", "mode", "env"), &LuaState::load_string, DEFVAL(""), DEFVAL(LOAD_MODE_ANY), DEFVAL(nullptr));
214+
ClassDB::bind_method(D_METHOD("load_buffer", "chunk", "chunkname", "mode", "env"), &LuaState::load_buffer, DEFVAL(""), DEFVAL(LOAD_MODE_ANY), DEFVAL(nullptr));
215+
ClassDB::bind_method(D_METHOD("load_string", "chunk", "chunkname", "env"), &LuaState::load_string, DEFVAL(""), DEFVAL(nullptr));
207216
ClassDB::bind_method(D_METHOD("load_file", "filename", "mode", "env"), &LuaState::load_file, DEFVAL(LOAD_MODE_ANY), DEFVAL(nullptr));
208-
ClassDB::bind_method(D_METHOD("do_string", "chunk", "chunkname", "mode", "env"), &LuaState::do_string, DEFVAL(""), DEFVAL(LOAD_MODE_ANY), DEFVAL(nullptr));
217+
ClassDB::bind_method(D_METHOD("do_buffer", "chunk", "chunkname", "mode", "env"), &LuaState::do_buffer, DEFVAL(""), DEFVAL(LOAD_MODE_ANY), DEFVAL(nullptr));
218+
ClassDB::bind_method(D_METHOD("do_string", "chunk", "chunkname", "env"), &LuaState::do_string, DEFVAL(""), DEFVAL(nullptr));
209219
ClassDB::bind_method(D_METHOD("do_file", "filename", "mode", "env"), &LuaState::do_file, DEFVAL(LOAD_MODE_ANY), DEFVAL(nullptr));
210220
ClassDB::bind_method(D_METHOD("get_globals"), &LuaState::get_globals);
211221
ClassDB::bind_method(D_METHOD("get_registry"), &LuaState::get_registry);

src/LuaState.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,11 @@ class LuaState : public RefCounted {
103103
void open_libraries(BitField<Library> libraries = ALL_LIBS);
104104

105105
Ref<LuaTable> create_table(const Dictionary& initial_values = {});
106-
Variant load_string(const String& chunk, const String& chunkname = "", LoadMode mode = LOAD_MODE_ANY, LuaTable *env = nullptr);
106+
Variant load_buffer(const PackedByteArray& chunk, const String& chunkname = "", LoadMode mode = LOAD_MODE_ANY, LuaTable *env = nullptr);
107+
Variant load_string(const String& chunk, const String& chunkname = "", LuaTable *env = nullptr);
107108
Variant load_file(const String& filename, LoadMode mode = LOAD_MODE_ANY, LuaTable *env = nullptr);
108-
Variant do_string(const String& chunk, const String& chunkname = "", LoadMode mode = LOAD_MODE_ANY, LuaTable *env = nullptr);
109+
Variant do_buffer(const PackedByteArray& chunk, const String& chunkname = "", LoadMode mode = LOAD_MODE_ANY, LuaTable *env = nullptr);
110+
Variant do_string(const String& chunk, const String& chunkname = "", LuaTable *env = nullptr);
109111
Variant do_file(const String& filename, LoadMode mode = LOAD_MODE_ANY, LuaTable *env = nullptr);
110112

111113
LuaTable *get_globals() const;

src/utils/convert_godot_lua.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -268,8 +268,8 @@ std::tuple<bool, sol::object> variant_pcall(sol::this_state state, Variant& vari
268268
return variant_pcall_string_name(state, variant, method, args);
269269
}
270270

271-
Variant do_string(sol::state_view& lua_state, const String& chunk, const String& chunkname, sol::load_mode mode, LuaTable *env) {
272-
Variant load_result = load_string(lua_state, chunk, chunkname, mode, env);
271+
Variant do_buffer(sol::state_view& lua_state, const PackedByteArray& chunk, const String& chunkname, sol::load_mode mode, LuaTable *env) {
272+
Variant load_result = load_buffer(lua_state, chunk, chunkname, mode, env);
273273
if (LuaFunction *func = Object::cast_to<LuaFunction>(load_result)) {
274274
return func->invokev(Array());
275275
}
@@ -288,9 +288,8 @@ Variant do_file(sol::state_view& lua_state, const String& filename, sol::load_mo
288288
}
289289
}
290290

291-
Variant load_string(sol::state_view& lua_state, const String& chunk, const String& chunkname, sol::load_mode mode, LuaTable *env) {
292-
PackedByteArray bytes = chunk.to_utf8_buffer();
293-
sol::load_result result = lua_state.load(to_string_view(bytes), to_std_string(chunkname), sol::load_mode::text);
291+
Variant load_buffer(sol::state_view& lua_state, const PackedByteArray& chunk, const String& chunkname, sol::load_mode mode, LuaTable *env) {
292+
sol::load_result result = lua_state.load(to_string_view(chunk), to_std_string(chunkname), mode);
294293
if (result.valid() && env) {
295294
lua_push(lua_state, (const Object *) env);
296295
lua_setupvalue(lua_state, result.stack_index(), 1);

src/utils/convert_godot_lua.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ sol::object variant_call(sol::this_state state, Variant& variant, const char *me
5252
std::tuple<bool, sol::object> variant_pcall_string_name(sol::this_state state, Variant& variant, const StringName& method, const sol::variadic_args& args);
5353
std::tuple<bool, sol::object> variant_pcall(sol::this_state state, Variant& variant, const char *method, const sol::variadic_args& args);
5454

55-
Variant do_string(sol::state_view& lua_state, const String& chunk, const String& chunkname = "", sol::load_mode mode = sol::load_mode::any, LuaTable *env = nullptr);
55+
Variant do_buffer(sol::state_view& lua_state, const PackedByteArray& chunk, const String& chunkname = "", sol::load_mode mode = sol::load_mode::any, LuaTable *env = nullptr);
5656
Variant do_file(sol::state_view& lua_state, const String& filename, sol::load_mode mode = sol::load_mode::any, LuaTable *env = nullptr);
57-
Variant load_string(sol::state_view& lua_state, const String& chunk, const String& chunkname = "", sol::load_mode mode = sol::load_mode::any, LuaTable *env = nullptr);
57+
Variant load_buffer(sol::state_view& lua_state, const PackedByteArray& chunk, const String& chunkname = "", sol::load_mode mode = sol::load_mode::any, LuaTable *env = nullptr);
5858
Variant load_file(sol::state_view& lua_state, const String& filename, sol::load_mode mode = sol::load_mode::any, LuaTable *env = nullptr);
5959

6060
void lua_error(lua_State *L, const GDExtensionCallError& call_error, const String& prefix_message);

test/gdscript_tests/load_buffer.gd

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
extends RefCounted
2+
3+
4+
var lua_state
5+
var function
6+
7+
8+
func _init():
9+
lua_state = LuaState.new()
10+
lua_state.open_libraries()
11+
12+
13+
func test_load_fail() -> bool:
14+
var result = lua_state.load_buffer("this is an invalid Lua script".to_ascii_buffer())
15+
assert(result is LuaError, "load_buffer with invalid Lua script should return LuaError")
16+
return true
17+
18+
19+
func test_load_function() -> bool:
20+
var result = lua_state.load_buffer("return ...".to_ascii_buffer())
21+
assert(result is LuaFunction, "load_buffer with valid Lua script should return LuaFunction")
22+
assert(result.invoke(1) == 1)
23+
assert(result.invoke(2) == 2)
24+
assert(result.invoke(1, 2, 3) == [1, 2, 3])
25+
return true
26+
27+
28+
func test_load_mode() -> bool:
29+
var result = lua_state.load_buffer("return ...".to_ascii_buffer(), "", LuaState.LOAD_MODE_TEXT)
30+
assert(result is LuaFunction, "load_buffer with valid Lua script should return LuaFunction")
31+
result = lua_state.load_buffer("return ...".to_ascii_buffer(), "", LuaState.LOAD_MODE_BINARY)
32+
assert(result is LuaError, "load_buffer loading a text chunk in binary mode should return LuaError")
33+
return true
34+
35+
36+
func test_load_function_env() -> bool:
37+
var env = lua_state.create_table()
38+
var result = lua_state.load_buffer("value = 42".to_ascii_buffer(), "", LuaState.LOAD_MODE_TEXT, env)
39+
assert(result is LuaFunction, "load_buffer with valid Lua script should return LuaFunction")
40+
assert(result.invoke() == null)
41+
assert(env.value == 42)
42+
return true
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
uid://bypxcju7632mv

test/gdscript_tests/load_string.gd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ func test_load_function() -> bool:
2727

2828
func test_load_function_env() -> bool:
2929
var env = lua_state.create_table()
30-
var result = lua_state.load_string("value = 42", "", LuaState.LOAD_MODE_ANY, env)
30+
var result = lua_state.load_string("value = 42", "", env)
3131
assert(result is LuaFunction, "load_string with valid Lua script should return LuaFunction")
3232
assert(result.invoke() == null)
3333
assert(env.value == 42)

0 commit comments

Comments
 (0)