Skip to content

Commit c995d22

Browse files
#2011 Fix issue with deferred calls to modified() for DontFragment components
1 parent 39ecda8 commit c995d22

File tree

5 files changed

+47
-8
lines changed

5 files changed

+47
-8
lines changed

distr/flecs.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10121,13 +10121,13 @@ void flecs_modified_id_if(
1012110121
ecs_assert(table != NULL, ECS_INTERNAL_ERROR, NULL);
1012210122

1012310123
ecs_component_record_t *cr = flecs_components_get(world, component);
10124-
if (!cr || !flecs_component_get_table(cr, table)) {
10124+
int32_t row = ECS_RECORD_TO_ROW(r->row);
10125+
if (!cr || !flecs_get_component(world, table, row, cr)) {
1012510126
flecs_defer_end(world, stage);
1012610127
return;
1012710128
}
1012810129

10129-
flecs_notify_on_set(
10130-
world, table, ECS_RECORD_TO_ROW(r->row), component, invoke_hook);
10130+
flecs_notify_on_set(world, table, row, component, invoke_hook);
1013110131

1013210132
flecs_table_mark_dirty(world, table, component);
1013310133
flecs_defer_end(world, stage);

src/entity.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2241,13 +2241,13 @@ void flecs_modified_id_if(
22412241
ecs_assert(table != NULL, ECS_INTERNAL_ERROR, NULL);
22422242

22432243
ecs_component_record_t *cr = flecs_components_get(world, component);
2244-
if (!cr || !flecs_component_get_table(cr, table)) {
2244+
int32_t row = ECS_RECORD_TO_ROW(r->row);
2245+
if (!cr || !flecs_get_component(world, table, row, cr)) {
22452246
flecs_defer_end(world, stage);
22462247
return;
22472248
}
22482249

2249-
flecs_notify_on_set(
2250-
world, table, ECS_RECORD_TO_ROW(r->row), component, invoke_hook);
2250+
flecs_notify_on_set(world, table, row, component, invoke_hook);
22512251

22522252
flecs_table_mark_dirty(world, table, component);
22532253
flecs_defer_end(world, stage);

test/core/project.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -742,7 +742,8 @@
742742
"defer_add_two_sparse_w_observer",
743743
"defer_remove_two_sparse_w_observer",
744744
"defer_set_batch_two_sparse_w_observer",
745-
"defer_set_w_sparse_w_observer"
745+
"defer_set_w_sparse_w_observer",
746+
"defer_ensure_modified_w_sparse_w_observer"
746747
]
747748
}, {
748749
"id": "NonFragmentingChildOf",

test/core/src/Sparse.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7425,3 +7425,36 @@ void Sparse_defer_set_w_sparse_w_observer(void) {
74257425

74267426
ecs_fini(world);
74277427
}
7428+
7429+
void Sparse_defer_ensure_modified_w_sparse_w_observer(void) {
7430+
ecs_world_t *world = ecs_mini();
7431+
7432+
ECS_COMPONENT(world, Position);
7433+
ecs_add_id(world, ecs_id(Position), EcsSparse);
7434+
ecs_add_id(world, ecs_id(Position), EcsDontFragment);
7435+
7436+
ecs_observer(world, {
7437+
.query.terms = {{ .id = ecs_id(Position) }},
7438+
.events = { EcsOnSet },
7439+
.callback = DataOnSet
7440+
});
7441+
7442+
ecs_entity_t e = ecs_new(world);
7443+
ecs_set(world, e, Position, { 42 });
7444+
7445+
test_int(DataOnSet_invoked, 1);
7446+
7447+
DataOnSet_invoked = 0;
7448+
7449+
ecs_defer_begin(world);
7450+
Position *ptr = ecs_ensure(world, e, Position);
7451+
ptr->x = 77;
7452+
ecs_modified(world, e, Position);
7453+
ecs_defer_end(world);
7454+
7455+
test_int(DataOnSet_invoked, 1);
7456+
test_int(DataOnSet_value, 77);
7457+
7458+
ecs_fini(world);
7459+
}
7460+

test/core/src/main.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -713,6 +713,7 @@ void Sparse_defer_add_two_sparse_w_observer(void);
713713
void Sparse_defer_remove_two_sparse_w_observer(void);
714714
void Sparse_defer_set_batch_two_sparse_w_observer(void);
715715
void Sparse_defer_set_w_sparse_w_observer(void);
716+
void Sparse_defer_ensure_modified_w_sparse_w_observer(void);
716717

717718
// Testsuite 'NonFragmentingChildOf'
718719
void NonFragmentingChildOf_set_parent_no_ordered_children(void);
@@ -5986,6 +5987,10 @@ bake_test_case Sparse_testcases[] = {
59865987
{
59875988
"defer_set_w_sparse_w_observer",
59885989
Sparse_defer_set_w_sparse_w_observer
5990+
},
5991+
{
5992+
"defer_ensure_modified_w_sparse_w_observer",
5993+
Sparse_defer_ensure_modified_w_sparse_w_observer
59895994
}
59905995
};
59915996

@@ -15916,7 +15921,7 @@ static bake_test_suite suites[] = {
1591615921
"Sparse",
1591715922
Sparse_setup,
1591815923
NULL,
15919-
223,
15924+
224,
1592015925
Sparse_testcases,
1592115926
1,
1592215927
Sparse_params

0 commit comments

Comments
 (0)