Skip to content

Commit ccdebc0

Browse files
committed
optimize InternalArgs
1 parent a1dca60 commit ccdebc0

File tree

2 files changed

+49
-19
lines changed

2 files changed

+49
-19
lines changed

src/lang/BindingsHooks.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -130,24 +130,24 @@ bool GDNativeClass_getunboundmethod(py_Ref self, py_Name name) {
130130
std::pair<GDNativeClass, py_Name> pair = stack->operator[](last_idx);
131131
stack->remove_at(last_idx);
132132

133-
InternalArguments args;
134-
135133
Variant r_ret;
136134
GDExtensionCallError r_error;
137135
StringName method = python_name_to_godot(pair.second);
138136
if (pair.first.type == Variant::OBJECT) {
139-
args.append(python_name_to_godot(pair.first.name));
140-
args.append(method);
137+
InternalArguments args(2 + argc - 1);
138+
args.set(0, python_name_to_godot(pair.first.name));
139+
args.set(1, method);
141140
for (int i = 1; i < argc; i++) {
142-
args.append(py_tovariant(&argv[i]));
141+
args.set(i + 1, py_tovariant(&argv[i]));
143142
}
144143
ClassDBSingleton *singleton = ClassDBSingleton::get_singleton();
145144
static GDExtensionMethodBindPtr _gde_method_bind = internal::gdextension_interface_classdb_get_method_bind(singleton->get_class_static()._native_ptr(), StringName("class_call_static")._native_ptr(), 3344196419);
146145
CHECK_METHOD_BIND_RET(_gde_method_bind, (Variant()));
147146
internal::gdextension_interface_object_method_bind_call(_gde_method_bind, singleton->_owner, args.ptr(), args.size(), &r_ret, &r_error);
148147
} else {
148+
InternalArguments args(argc - 1);
149149
for (int i = 1; i < argc; i++) {
150-
args.append(py_tovariant(&argv[i]));
150+
args.set(i - 1, py_tovariant(&argv[i]));
151151
}
152152
godot::internal::gdextension_interface_variant_call_static(
153153
(GDExtensionVariantType)pair.first.type, &method, args.ptr(), args.size(), &r_ret, &r_error);

src/lang/Common.hpp

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,28 +46,58 @@ struct PythonScriptReloadingContext {
4646
};
4747

4848
struct InternalArguments {
49-
Vector<Variant> _args;
50-
Vector<GDExtensionConstVariantPtr> _pointers;
49+
union {
50+
struct {
51+
Vector<Variant> _args;
52+
Vector<GDExtensionConstVariantPtr> _pointers;
53+
} dyn;
54+
55+
struct {
56+
Variant _args[4];
57+
GDExtensionConstVariantPtr _pointers[4];
58+
} stc;
59+
};
60+
61+
int length;
62+
63+
InternalArguments(int length) : length(length) {
64+
if (length > 4) {
65+
dyn._args.resize(length);
66+
dyn._pointers.resize(length);
67+
for (int i = 0; i < length; i++) {
68+
dyn._pointers.write[i] = &dyn._args[i];
69+
}
70+
} else {
71+
for (int i = 0; i < length; i++) {
72+
stc._pointers[i] = &stc._args[i];
73+
}
74+
}
75+
}
5176

52-
inline void reset() {
53-
_args.clear();
54-
_pointers.clear();
77+
~InternalArguments() {
78+
if (length > 4) {
79+
using DynType = decltype(dyn);
80+
dyn.~DynType();
81+
} else {
82+
using StcType = decltype(stc);
83+
stc.~StcType();
84+
}
5585
}
5686

57-
inline void append(const Variant &v) {
58-
_args.push_back(v);
87+
inline void set(int index, const Variant &val) {
88+
if (length > 4) {
89+
dyn._args.write[index] = val;
90+
} else {
91+
stc._args[index] = val;
92+
}
5993
}
6094

6195
inline const GDExtensionConstVariantPtr *ptr() {
62-
_pointers.resize(_args.size());
63-
for (int i = 0; i < _args.size(); i++) {
64-
_pointers.write[i] = &_args[i];
65-
}
66-
return _pointers.ptr();
96+
return length > 4 ? dyn._pointers.ptr() : stc._pointers;
6797
}
6898

6999
inline int size() const {
70-
return (int)_args.size();
100+
return length;
71101
}
72102
};
73103

0 commit comments

Comments
 (0)