Skip to content
This repository was archived by the owner on Dec 29, 2024. It is now read-only.

Commit 4b5d77b

Browse files
authored
Fix some regression issues (#130)
1 parent c796b9a commit 4b5d77b

6 files changed

Lines changed: 119 additions & 13 deletions

File tree

.github/workflows/runner.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ on:
1111
- "**/LICENSE"
1212
- ".github/ISSUE_TEMPLATE/*"
1313
- ".github/CODEOWNERS"
14+
- "project/demo/*"
1415
push:
1516
branches:
1617
- "main"
@@ -20,6 +21,7 @@ on:
2021
- "**/LICENSE"
2122
- ".github/ISSUE_TEMPLATE/*"
2223
- ".github/CODEOWNERS"
24+
- "project/demo/*"
2325

2426
env:
2527
GODOT_VERSION: ${{ vars.GODOT_VERSION }}

project/demo/HelloLua.gd

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ var lua: LuaAPI = LuaAPI.new()
44

55
func _lua_print(message: String):
66
print(message)
7-
return LuaError.new_error("test", LuaError.ERR_RUNTIME)
87

98
func _ready():
109
# All builtin libraries are available to bind with. Use Debug, OS and IO at your own risk.
@@ -22,7 +21,12 @@ func _ready():
2221
return "Hello gdScript!"
2322
end
2423
""")
25-
2624
if err is LuaError:
2725
print("ERROR %d: %s" % [err.type, err.message])
2826
return
27+
28+
var ret = lua.call_function("get_message", [])
29+
if ret is LuaError:
30+
print("ERROR %d: %s" % [err.type, err.message])
31+
return
32+
print(ret)

src/classes/luaAPI.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ void LuaAPI::_bind_methods() {
2323

2424
ClassDB::bind_method(D_METHOD("bind_libraries", "Array"), &LuaAPI::bindLibraries);
2525
ClassDB::bind_method(D_METHOD("set_hook", "Hook", "HookMask", "Count"), &LuaAPI::setHook);
26+
ClassDB::bind_method(D_METHOD("configure_gc", "What", "Data"), &LuaAPI::configure_gc);
2627
ClassDB::bind_method(D_METHOD("push_variant", "Name", "var"), &LuaAPI::pushGlobalVariant);
2728
ClassDB::bind_method(D_METHOD("pull_variant", "Name"), &LuaAPI::pullVariant);
2829
ClassDB::bind_method(D_METHOD("expose_constructor", "LuaConstructorName", "Object"), &LuaAPI::exposeObjectConstructor);
@@ -41,6 +42,15 @@ void LuaAPI::_bind_methods() {
4142
BIND_ENUM_CONSTANT(HOOK_MASK_RETURN);
4243
BIND_ENUM_CONSTANT(HOOK_MASK_LINE);
4344
BIND_ENUM_CONSTANT(HOOK_MASK_COUNT);
45+
46+
BIND_ENUM_CONSTANT(GC_STOP);
47+
BIND_ENUM_CONSTANT(GC_RESTART);
48+
BIND_ENUM_CONSTANT(GC_COLLECT);
49+
BIND_ENUM_CONSTANT(GC_COUNT);
50+
BIND_ENUM_CONSTANT(GC_COUNTB);
51+
BIND_ENUM_CONSTANT(GC_STEP);
52+
BIND_ENUM_CONSTANT(GC_SETPAUSE);
53+
BIND_ENUM_CONSTANT(GC_SETSTEPMUL);
4454
}
4555

4656
// Calls LuaState::bindLibs()

src/classes/luaAPI.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ class LuaAPI : public RefCounted {
3232
void bindLibraries(Array libs);
3333
void setHook(Callable hook, int mask, int count);
3434

35-
inline int confgiure_gc(int what, int data) {
35+
inline int configure_gc(int what, int data) {
3636
return lua_gc(lState, what, data);
3737
}
3838

39-
inline void setPermissive(bool permissive) {
40-
this->permissive = permissive;
39+
inline void setPermissive(bool value) {
40+
permissive = value;
4141
}
4242

4343
inline bool getPermissive() const {
@@ -88,5 +88,6 @@ class LuaAPI : public RefCounted {
8888
};
8989

9090
VARIANT_ENUM_CAST(LuaAPI::HookMask)
91+
VARIANT_ENUM_CAST(LuaAPI::GCOption)
9192

9293
#endif

src/luaState.cpp

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -286,37 +286,61 @@ LuaError *LuaState::pushVariant(lua_State *state, Variant var) {
286286
}
287287
case Variant::Type::VECTOR2: {
288288
Variant *userdata = (Variant *)lua_newuserdata(state, sizeof(Variant));
289+
#ifndef LAPI_GDEXTENSION
290+
*userdata = var;
291+
#else
289292
memmove(userdata, (void *)&var, sizeof(Variant));
293+
#endif
290294
luaL_setmetatable(state, "mt_Vector2");
291295
break;
292296
}
293297
case Variant::Type::VECTOR3: {
294298
Variant *userdata = (Variant *)lua_newuserdata(state, sizeof(Variant));
299+
#ifndef LAPI_GDEXTENSION
300+
*userdata = var;
301+
#else
295302
memmove(userdata, (void *)&var, sizeof(Variant));
303+
#endif
296304
luaL_setmetatable(state, "mt_Vector3");
297305
break;
298306
}
299307
case Variant::Type::COLOR: {
300308
Variant *userdata = (Variant *)lua_newuserdata(state, sizeof(Variant));
309+
#ifndef LAPI_GDEXTENSION
310+
*userdata = var;
311+
#else
301312
memmove(userdata, (void *)&var, sizeof(Variant));
313+
#endif
302314
luaL_setmetatable(state, "mt_Color");
303315
break;
304316
}
305317
case Variant::Type::RECT2: {
306318
Variant *userdata = (Variant *)lua_newuserdata(state, sizeof(Variant));
319+
#ifndef LAPI_GDEXTENSION
320+
*userdata = var;
321+
#else
307322
memmove(userdata, (void *)&var, sizeof(Variant));
323+
#endif
308324
luaL_setmetatable(state, "mt_Rect2");
309325
break;
310326
}
311327
case Variant::Type::PLANE: {
312328
Variant *userdata = (Variant *)lua_newuserdata(state, sizeof(Variant));
329+
#ifndef LAPI_GDEXTENSION
330+
*userdata = var;
331+
#else
313332
memmove(userdata, (void *)&var, sizeof(Variant));
333+
#endif
314334
luaL_setmetatable(state, "mt_Plane");
315335
break;
316336
}
317337
case Variant::Type::SIGNAL: {
318338
Variant *userdata = (Variant *)lua_newuserdata(state, sizeof(Variant));
339+
#ifndef LAPI_GDEXTENSION
340+
*userdata = var;
341+
#else
319342
memmove(userdata, (void *)&var, sizeof(Variant));
343+
#endif
320344
luaL_setmetatable(state, "mt_Signal");
321345
break;
322346
}
@@ -358,10 +382,12 @@ LuaError *LuaState::pushVariant(lua_State *state, Variant var) {
358382
break;
359383
}
360384

385+
#ifdef LAPI_GDEXTENSION
361386
// If the type being pushed is a RefCounted, increase its refcount.
362387
if (RefCounted *ref = Object::cast_to<RefCounted>(var.operator Object *()); ref != nullptr) {
363388
ref->reference();
364389
}
390+
#endif
365391

366392
// If the type being pushed is a LuaCallableExtra. use mt_CallableExtra instead
367393
#ifndef LAPI_GDEXTENSION
@@ -370,33 +396,48 @@ LuaError *LuaState::pushVariant(lua_State *state, Variant var) {
370396
// blame this on https://github.com/godotengine/godot-cpp/issues/995
371397
if (LuaCallableExtra *func = dynamic_cast<LuaCallableExtra *>(var.operator Object *()); func != nullptr) {
372398
#endif
373-
void *userdata = (Variant *)lua_newuserdata(state, sizeof(Variant));
399+
Variant *userdata = (Variant *)lua_newuserdata(state, sizeof(Variant));
400+
#ifndef LAPI_GDEXTENSION
401+
*userdata = var;
402+
#else
374403
memmove(userdata, (void *)&var, sizeof(Variant));
404+
#endif
375405
luaL_setmetatable(state, "mt_CallableExtra");
376406
break;
377407
}
378408

379409
Variant *userdata = (Variant *)lua_newuserdata(state, sizeof(Variant));
410+
#ifndef LAPI_GDEXTENSION
411+
*userdata = var;
412+
#else
380413
memmove(userdata, (void *)&var, sizeof(Variant));
414+
#endif
381415
luaL_setmetatable(state, "mt_Object");
382416
break;
383417
}
384418
case Variant::Type::CALLABLE: {
385-
#ifndef LAPI_GDEXTENSION
386-
// If the callable type is a luaCallable, just push the actual lua function onto the stack.
387419
Callable callable = var.operator Callable();
388420
if (callable.is_custom()) {
389-
CallableCustom *custom = callable.get_custom();
390-
LuaCallable *luaCallable = dynamic_cast<LuaCallable *>(custom);
391-
if (luaCallable != nullptr) {
421+
#ifndef LAPI_GDEXTENSION
422+
// If the callable type is a luaCallable, just push the actual lua function onto the stack.
423+
if (LuaCallable *luaCallable = dynamic_cast<LuaCallable *>(callable.get_custom()); luaCallable != nullptr) {
392424
lua_rawgeti(state, LUA_REGISTRYINDEX, luaCallable->getFuncRef());
393425
break;
394426
}
395-
}
396427
#endif
428+
Ref<LuaCallableExtra> callableCustom;
429+
callableCustom.instantiate();
430+
callableCustom->setInfo(callable, 0, false, false);
431+
LuaState::pushVariant(state, callableCustom);
432+
break;
433+
}
397434

398435
Variant *userdata = (Variant *)lua_newuserdata(state, sizeof(Variant));
436+
#ifndef LAPI_GDEXTENSION
437+
*userdata = var;
438+
#else
399439
memmove(userdata, (void *)&var, sizeof(Variant));
440+
#endif
400441
luaL_setmetatable(state, "mt_Callable");
401442
break;
402443
}

src/metatables.cpp

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,25 @@ LuaError *LuaState::exposeObjectConstructor(String name, Object *obj) {
3333
return LuaError::newError("during \"LuaState::exposeObjectConstructor\" method 'new' does not exist.", LuaError::ERR_RUNTIME);
3434
}
3535
lua_pushlightuserdata(L, obj);
36+
37+
#ifndef LAPI_GDEXTENSION
38+
39+
lua_pushcclosure(L, LUA_LAMBDA_TEMPLATE({
40+
Object *inner_obj = (Object *)lua_touserdata(inner_state, lua_upvalueindex(1));
41+
42+
Variant *userdata = (Variant *)lua_newuserdata(inner_state, sizeof(Variant));
43+
Variant ret = inner_obj->call("new");
44+
45+
*userdata = ret;
46+
47+
luaL_setmetatable(inner_state, "mt_Object");
48+
49+
return 1;
50+
}),
51+
1);
52+
53+
#else
54+
3655
lua_pushcclosure(L, LUA_LAMBDA_TEMPLATE({
3756
Object *inner_obj = (Object *)lua_touserdata(inner_state, lua_upvalueindex(1));
3857

@@ -51,6 +70,8 @@ LuaError *LuaState::exposeObjectConstructor(String name, Object *obj) {
5170
return 1;
5271
}),
5372
1);
73+
#endif
74+
5475
lua_setglobal(L, name.ascii().get_data());
5576
return nullptr;
5677
}
@@ -516,15 +537,31 @@ void LuaState::createObjectMetatable() {
516537
return 1;
517538
});
518539

540+
#ifndef LAPI_GDEXTENSION
541+
LUA_METAMETHOD_TEMPLATE(L, -1, "__gc", {
542+
if (!arg1.has_method("__gc")) {
543+
return 0;
544+
}
545+
546+
LuaState::pushVariant(inner_state, arg1.call("__gc", Ref<LuaAPI>(OBJ)));
547+
return 1;
548+
});
549+
#else
519550
LUA_METAMETHOD_TEMPLATE(L, -1, "__gc", {
520551
// If object is a RefCounted
521552
Ref<RefCounted> ref = Object::cast_to<RefCounted>(arg1);
522553
if (ref != nullptr) {
523554
ref->unreference();
524555
}
525556

526-
return 0;
557+
if (!arg1.has_method("__gc")) {
558+
return 0;
559+
}
560+
561+
LuaState::pushVariant(inner_state, arg1.call("__gc", Ref<LuaAPI>(OBJ)));
562+
return 1;
527563
});
564+
#endif
528565

529566
LUA_METAMETHOD_TEMPLATE(L, -1, "__tostring", {
530567
// If object overrides
@@ -754,6 +791,17 @@ void LuaState::createCallableMetatable() {
754791
void LuaState::createCallableExtraMetatable() {
755792
luaL_newmetatable(L, "mt_CallableExtra");
756793

794+
#ifdef LAPI_GDEXTENSION
795+
LUA_METAMETHOD_TEMPLATE(L, -1, "__gc", {
796+
Ref<RefCounted> ref = Object::cast_to<RefCounted>(arg1);
797+
if (ref != nullptr) {
798+
ref->unreference();
799+
}
800+
801+
return 0;
802+
});
803+
#endif
804+
757805
lua_pushstring(L, "__call");
758806
lua_pushcfunction(L, LuaCallableExtra::call);
759807
lua_settable(L, -3);

0 commit comments

Comments
 (0)