diff --git a/flecs.c b/flecs.c index 2427182f0..4053fca62 100644 --- a/flecs.c +++ b/flecs.c @@ -66642,6 +66642,8 @@ bool flecs_rule_up_select( continue; } + op_ctx->row = row; + down = op_ctx->down = flecs_rule_get_down_cache(ctx, &op_ctx->cache, op_ctx->trav, entity, op_ctx->idr_with, self); op_ctx->cache_elem = -1; diff --git a/src/addons/rules/engine.c b/src/addons/rules/engine.c index edd2d07b3..a1ad88cc9 100644 --- a/src/addons/rules/engine.c +++ b/src/addons/rules/engine.c @@ -761,6 +761,8 @@ bool flecs_rule_up_select( continue; } + op_ctx->row = row; + down = op_ctx->down = flecs_rule_get_down_cache(ctx, &op_ctx->cache, op_ctx->trav, entity, op_ctx->idr_with, self); op_ctx->cache_elem = -1; diff --git a/test/addons/project.json b/test/addons/project.json index 55a1d5668..408fb8c23 100644 --- a/test/addons/project.json +++ b/test/addons/project.json @@ -1426,6 +1426,7 @@ "this_written_self_up_childof_pair_for_var_written", "this_self_up_childof_pair_for_var_written_n_targets", "this_written_self_up_childof_pair_for_var_written_n_targets", + "self_up_mixed_traversable", "self_up_2_levels", "not_up_disabled", "up_2_rel_instances", diff --git a/test/addons/src/RulesTraversal.c b/test/addons/src/RulesTraversal.c index 0c93b65b1..8760dd9e0 100644 --- a/test/addons/src/RulesTraversal.c +++ b/test/addons/src/RulesTraversal.c @@ -8200,3 +8200,40 @@ void RulesTraversal_this_written_cascade_childof_w_parent_flag(void) { ecs_fini(world); } + +void RulesTraversal_self_up_mixed_traversable(void) { + ecs_world_t *world = ecs_mini(); + + ECS_TAG(world, TagA); + + ecs_entity_t p1 = ecs_new_id(world); + ecs_entity_t p2 = ecs_new_id(world); + ecs_entity_t c = ecs_new_w_pair(world, EcsChildOf, p2); + + ecs_add(world, p1, TagA); + ecs_add(world, p2, TagA); + + ecs_rule_t *q = ecs_rule(world, { + .expr = "TagA(self|up(ChildOf))" + }); + + test_assert(q != NULL); + + ecs_iter_t it = ecs_rule_iter(world, q); + test_bool(true, ecs_rule_next(&it)); + test_int(2, it.count); + test_uint(p1, it.entities[0]); + test_uint(p2, it.entities[1]); + test_uint(0, ecs_field_src(&it, 1)); + + test_bool(true, ecs_rule_next(&it)); + test_int(1, it.count); + test_uint(c, it.entities[0]); + test_uint(p2, ecs_field_src(&it, 1)); + + test_bool(false, ecs_rule_next(&it)); + + ecs_rule_fini(q); + + ecs_fini(world); +} diff --git a/test/addons/src/main.c b/test/addons/src/main.c index cd23e9ef5..a2b04e989 100644 --- a/test/addons/src/main.c +++ b/test/addons/src/main.c @@ -1395,6 +1395,7 @@ void RulesTraversal_this_up_childof_pair_for_var_written(void); void RulesTraversal_this_written_self_up_childof_pair_for_var_written(void); void RulesTraversal_this_self_up_childof_pair_for_var_written_n_targets(void); void RulesTraversal_this_written_self_up_childof_pair_for_var_written_n_targets(void); +void RulesTraversal_self_up_mixed_traversable(void); void RulesTraversal_self_up_2_levels(void); void RulesTraversal_not_up_disabled(void); void RulesTraversal_up_2_rel_instances(void); @@ -7357,6 +7358,10 @@ bake_test_case RulesTraversal_testcases[] = { "this_written_self_up_childof_pair_for_var_written_n_targets", RulesTraversal_this_written_self_up_childof_pair_for_var_written_n_targets }, + { + "self_up_mixed_traversable", + RulesTraversal_self_up_mixed_traversable + }, { "self_up_2_levels", RulesTraversal_self_up_2_levels @@ -9238,7 +9243,7 @@ static bake_test_suite suites[] = { "RulesTraversal", NULL, NULL, - 92, + 93, RulesTraversal_testcases }, {