Skip to content

Commit 6870ac2

Browse files
committed
Avoid creating objects that Godot is going to use placement new to initialize
1 parent 36847f6 commit 6870ac2

File tree

3 files changed

+15
-8
lines changed

3 files changed

+15
-8
lines changed

binding_generator.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,8 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
454454
result.append("")
455455
result.append("\tstatic struct _MethodBindings {")
456456

457+
result.append(f'\t\tGDExtensionTypeFromVariantConstructorFunc from_variant_constructor;')
458+
457459
if "constructors" in builtin_api:
458460
for constructor in builtin_api["constructors"]:
459461
result.append(f'\t\tGDExtensionPtrConstructor constructor_{constructor["index"]};')
@@ -494,6 +496,9 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
494496
result.append("\tstatic void init_bindings();")
495497
result.append("\tstatic void _init_bindings_constructors_destructor();")
496498

499+
result.append("")
500+
result.append(f"\t{class_name}(const Variant *p_variant);")
501+
497502
result.append("")
498503
result.append("public:")
499504

@@ -818,6 +823,8 @@ def generate_builtin_class_source(builtin_api, size, used_classes, fully_used_cl
818823

819824
result.append(f"void {class_name}::_init_bindings_constructors_destructor() {{")
820825

826+
result.append(f'\t_method_bindings.from_variant_constructor = internal::gdextension_interface_get_variant_to_type_constructor({enum_type_name});')
827+
821828
if "constructors" in builtin_api:
822829
for constructor in builtin_api["constructors"]:
823830
result.append(
@@ -899,6 +906,11 @@ def generate_builtin_class_source(builtin_api, size, used_classes, fully_used_cl
899906

900907
copy_constructor_index = -1
901908

909+
result.append(f"{class_name}::{class_name}(const Variant *p_variant) {{")
910+
result.append("\t_method_bindings.from_variant_constructor(&opaque, this->_native_ptr());")
911+
result.append("}");
912+
result.append("");
913+
902914
if "constructors" in builtin_api:
903915
for constructor in builtin_api["constructors"]:
904916
method_signature = f"{class_name}::{class_name}("

include/godot_cpp/variant/variant.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,6 @@ class ObjectID;
4747
class Variant {
4848
uint8_t opaque[GODOT_CPP_VARIANT_SIZE]{ 0 };
4949

50-
_FORCE_INLINE_ GDExtensionVariantPtr _native_ptr() const { return const_cast<uint8_t(*)[GODOT_CPP_VARIANT_SIZE]>(&opaque); }
51-
5250
friend class GDExtensionBinding;
5351
friend class MethodBind;
5452

@@ -145,6 +143,7 @@ class Variant {
145143
static GDExtensionTypeFromVariantConstructorFunc to_type_constructor[VARIANT_MAX];
146144

147145
public:
146+
_FORCE_INLINE_ GDExtensionVariantPtr _native_ptr() const { return const_cast<uint8_t(*)[GODOT_CPP_VARIANT_SIZE]>(&opaque); }
148147
Variant();
149148
Variant(std::nullptr_t n) :
150149
Variant() {}

src/variant/variant.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -459,15 +459,11 @@ Variant::operator Signal() const {
459459
}
460460

461461
Variant::operator Dictionary() const {
462-
Dictionary result;
463-
to_type_constructor[DICTIONARY](result._native_ptr(), _native_ptr());
464-
return result;
462+
return Dictionary(this);
465463
}
466464

467465
Variant::operator Array() const {
468-
Array result;
469-
to_type_constructor[ARRAY](result._native_ptr(), _native_ptr());
470-
return result;
466+
return Array(this);
471467
}
472468

473469
Variant::operator PackedByteArray() const {

0 commit comments

Comments
 (0)