mirror of
https://github.com/godotengine/godot.git
synced 2025-12-08 06:09:55 +00:00
Optimize RequiredParam to not increase and decrease refcounts on call.
This commit is contained in:
parent
2ecefada8d
commit
ebc9aebb69
4 changed files with 35 additions and 36 deletions
|
|
@ -596,26 +596,27 @@ TEST_CASE("[Object] Destruction at the end of the call chain is safe") {
|
|||
"Object was tail-deleted without crashes.");
|
||||
}
|
||||
|
||||
int required_param_compare(const Ref<RefCounted> &p_ref, const RequiredParam<RefCounted> &p_required) {
|
||||
EXTRACT_PARAM_OR_FAIL_V(extract, p_required, false);
|
||||
ERR_FAIL_COND_V(p_ref->get_reference_count() != extract->get_reference_count(), -1);
|
||||
int required_param_compare(const Ref<RefCounted> &p_ref, const RequiredParam<RefCounted> &rp_required) {
|
||||
EXTRACT_PARAM_OR_FAIL_V(p_required, rp_required, false);
|
||||
ERR_FAIL_COND_V(p_ref->get_reference_count() != p_required->get_reference_count(), -1);
|
||||
return p_ref->get_reference_count();
|
||||
}
|
||||
|
||||
TEST_CASE("[Object] RequiredParam Ref<T>") {
|
||||
Ref<RefCounted> ref;
|
||||
ref.instantiate();
|
||||
const Ref<RefCounted> &ref_ref = ref;
|
||||
|
||||
RequiredParam<RefCounted> required = ref;
|
||||
EXTRACT_PARAM_OR_FAIL(extract, required);
|
||||
|
||||
static_assert(std::is_same_v<decltype(ref), decltype(extract)>);
|
||||
static_assert(std::is_same_v<decltype(ref_ref), decltype(extract)>);
|
||||
|
||||
CHECK_EQ(ref->get_reference_count(), extract->get_reference_count());
|
||||
|
||||
const int count = required_param_compare(ref, ref);
|
||||
CHECK_NE(count, -1);
|
||||
CHECK_NE(count, ref->get_reference_count());
|
||||
CHECK_EQ(count, ref->get_reference_count());
|
||||
|
||||
CHECK_EQ(ref->get_reference_count(), extract->get_reference_count());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@ TEST_CASE("[SceneTree][InstancePlaceholder] Instantiate from placeholder with no
|
|||
scene->set_int_property(12);
|
||||
|
||||
// Pack the scene.
|
||||
PackedScene *packed_scene = memnew(PackedScene);
|
||||
Ref<PackedScene> packed_scene = memnew(PackedScene);
|
||||
const Error err = packed_scene->pack(scene);
|
||||
REQUIRE(err == OK);
|
||||
|
||||
|
|
@ -138,7 +138,7 @@ TEST_CASE("[SceneTree][InstancePlaceholder] Instantiate from placeholder with no
|
|||
referenced->set_owner(scene);
|
||||
scene->set_reference_property(referenced);
|
||||
// Pack the scene.
|
||||
PackedScene *packed_scene = memnew(PackedScene);
|
||||
Ref<PackedScene> packed_scene = memnew(PackedScene);
|
||||
const Error err = packed_scene->pack(scene);
|
||||
REQUIRE(err == OK);
|
||||
|
||||
|
|
@ -175,7 +175,7 @@ TEST_CASE("[SceneTree][InstancePlaceholder] Instantiate from placeholder with no
|
|||
node_array.push_back(referenced2);
|
||||
scene->set_reference_array_property(node_array);
|
||||
// Pack the scene.
|
||||
PackedScene *packed_scene = memnew(PackedScene);
|
||||
Ref<PackedScene> packed_scene = memnew(PackedScene);
|
||||
const Error err = packed_scene->pack(scene);
|
||||
REQUIRE(err == OK);
|
||||
|
||||
|
|
@ -219,7 +219,7 @@ TEST_CASE("[SceneTree][InstancePlaceholder] Instantiate from placeholder with ov
|
|||
scene->set_int_property(12);
|
||||
|
||||
// Pack the scene.
|
||||
PackedScene *packed_scene = memnew(PackedScene);
|
||||
Ref<PackedScene> packed_scene = memnew(PackedScene);
|
||||
packed_scene->pack(scene);
|
||||
|
||||
// Instantiate the scene.
|
||||
|
|
@ -248,7 +248,7 @@ TEST_CASE("[SceneTree][InstancePlaceholder] Instantiate from placeholder with ov
|
|||
referenced->set_owner(scene);
|
||||
scene->set_reference_property(referenced);
|
||||
// Pack the scene.
|
||||
PackedScene *packed_scene = memnew(PackedScene);
|
||||
Ref<PackedScene> packed_scene = memnew(PackedScene);
|
||||
const Error err = packed_scene->pack(scene);
|
||||
REQUIRE(err == OK);
|
||||
|
||||
|
|
@ -303,7 +303,7 @@ TEST_CASE("[SceneTree][InstancePlaceholder] Instantiate from placeholder with ov
|
|||
|
||||
scene->set_reference_array_property(referenced_array);
|
||||
// Pack the scene.
|
||||
PackedScene *packed_scene = memnew(PackedScene);
|
||||
Ref<PackedScene> packed_scene = memnew(PackedScene);
|
||||
const Error err = packed_scene->pack(scene);
|
||||
REQUIRE(err == OK);
|
||||
|
||||
|
|
@ -346,7 +346,7 @@ TEST_CASE("[SceneTree][InstancePlaceholder] Instance a PackedScene containing an
|
|||
internal->set_reference_property(referenced);
|
||||
|
||||
// Pack the internal scene.
|
||||
PackedScene *internal_scene = memnew(PackedScene);
|
||||
Ref<PackedScene> internal_scene = memnew(PackedScene);
|
||||
Error err = internal_scene->pack(internal);
|
||||
REQUIRE(err == OK);
|
||||
|
||||
|
|
@ -375,7 +375,7 @@ TEST_CASE("[SceneTree][InstancePlaceholder] Instance a PackedScene containing an
|
|||
internal_created->set("reference_property", NodePath("OriginalReference"));
|
||||
|
||||
// Pack the main scene.
|
||||
PackedScene *main_scene = memnew(PackedScene);
|
||||
Ref<PackedScene> main_scene = memnew(PackedScene);
|
||||
err = main_scene->pack(root);
|
||||
REQUIRE(err == OK);
|
||||
|
||||
|
|
@ -435,7 +435,7 @@ TEST_CASE("[SceneTree][InstancePlaceholder] Instance a PackedScene containing an
|
|||
internal->set_reference_array_property(referenced_array);
|
||||
|
||||
// Pack the internal scene.
|
||||
PackedScene *internal_scene = memnew(PackedScene);
|
||||
Ref<PackedScene> internal_scene = memnew(PackedScene);
|
||||
Error err = internal_scene->pack(internal);
|
||||
REQUIRE(err == OK);
|
||||
|
||||
|
|
@ -476,7 +476,7 @@ TEST_CASE("[SceneTree][InstancePlaceholder] Instance a PackedScene containing an
|
|||
internal_created->set_reference_array_property(override_array);
|
||||
|
||||
// Pack the main scene.
|
||||
PackedScene *main_scene = memnew(PackedScene);
|
||||
Ref<PackedScene> main_scene = memnew(PackedScene);
|
||||
err = main_scene->pack(root);
|
||||
REQUIRE(err == OK);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue