Skip to content

Commit 3ec7684

Browse files
committed
Fix raise error when trying to instantiate abstract classes from Lua
1 parent 35d5f2e commit 3ec7684

File tree

3 files changed

+17
-7
lines changed

3 files changed

+17
-7
lines changed

src/utils/Class.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,21 @@ sol::optional<int64_t> Class::get_constant(const StringName& name) const {
4545
}
4646
}
4747

48-
Variant Class::construct(const sol::variadic_args& args) const {
49-
GDExtensionObjectPtr obj_ptr = godot::internal::gdextension_interface_classdb_construct_object(class_name._native_ptr());
50-
Object *obj = godot::internal::get_object_instance_binding(obj_ptr);
51-
if (obj->has_method("_init")) {
52-
obj->callv("_init", to_array(args));
48+
Variant Class::construct(sol::this_state state, const sol::variadic_args& args) const {
49+
auto class_db = ClassDBSingleton::get_singleton();
50+
if (!class_db->can_instantiate(class_name)) {
51+
luaL_error(
52+
state,
53+
"Class '%s' or its base class cannot be instantiated",
54+
String(class_name).ascii().get_data()
55+
);
5356
}
54-
return obj;
57+
58+
Variant new_obj = class_db->instantiate(class_name);
59+
if (new_obj.has_method("_init")) {
60+
variant_call_string_name(state, new_obj, "_init", args);
61+
}
62+
return new_obj;
5563
}
5664

5765
bool Class::operator==(const Class& other) const {

src/utils/Class.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class Class {
4343
const StringName& get_name() const;
4444
sol::optional<int64_t> get_constant(const StringName& name) const;
4545

46-
Variant construct(const sol::variadic_args& args) const;
46+
Variant construct(sol::this_state state, const sol::variadic_args& args) const;
4747

4848
bool operator==(const Class& other) const;
4949

test/lua_tests/class_construct.lua

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
local obj = assert(RefCounted:new(), "Constructing class failed")
2+
3+
assert(not pcall(function() return LuaObject:new() end), "Instantiating abstract class should raise an error")

0 commit comments

Comments
 (0)