@@ -20257,8 +20257,14 @@ int32_t flecs_relation_depth_walk(
2025720257 return 0;
2025820258 }
2025920259
20260- int32_t i = tr->index, end = i + tr->count;
20261- for (; i != end; i ++) {
20260+ int32_t i = tr->index, remaining = tr->count;
20261+ for (; remaining; i ++) {
20262+ i = flecs_table_offset_search_w_inherited(world, table, i, cr->id, NULL);
20263+ if (i == -1) {
20264+ break;
20265+ }
20266+ remaining --;
20267+
2026220268 ecs_entity_t o = ecs_pair_second(world, table->type.array[i]);
2026320269 if (!o) {
2026420270 /* Rare, but can happen during cleanup when an intermediate table is
@@ -20273,7 +20279,7 @@ int32_t flecs_relation_depth_walk(
2027320279 if (!ot) {
2027420280 continue;
2027520281 }
20276-
20282+
2027720283 ecs_assert(ot != first, ECS_CYCLE_DETECTED, NULL);
2027820284 int32_t cur = flecs_relation_depth_walk(world, cr, first, ot);
2027920285 if (cur > result) {
@@ -39305,7 +39311,21 @@ bool flecs_query_finalize_simple(
3930539311 }
3930639312 }
3930739313
39308- if (flecs_components_get(world, ecs_pair(EcsIsA, first)) != NULL) {
39314+ bool first_inherited =
39315+ flecs_components_get(world, ecs_pair(EcsIsA, first)) != NULL;
39316+ if (!first_inherited) {
39317+ first_inherited = (cr_flags & EcsIdInheritable) != 0;
39318+ }
39319+ if (!first_inherited) {
39320+ ecs_record_t *first_record = flecs_entities_get(world, first);
39321+ ecs_table_t *first_table = first_record ? first_record->table : NULL;
39322+ if (first_table && (first_table->flags & EcsTableHasIsA)) {
39323+ first_inherited = !ecs_table_has_id(
39324+ world, first_table, EcsFinal);
39325+ }
39326+ }
39327+
39328+ if (first_inherited) {
3930939329 term->flags_ |= EcsTermIdInherited;
3931039330 q->flags |= EcsQueryHasComponentInheritance;
3931139331 trivial = false;
@@ -70461,12 +70481,16 @@ void ecs_script_vars_from_iter(
7046170481 continue;
7046270482 }
7046370483
70464- void *ptr = ecs_field_w_size (it, flecs_itosize(size), i);
70484+ void *ptr = ecs_base_field_w_size (it, flecs_itosize(size), i);
7046570485 if (!ptr) {
7046670486 continue;
7046770487 }
7046870488
70469- ptr = ECS_OFFSET(ptr, offset * size);
70489+ if (!it->sources[i]) {
70490+ ecs_size_t stride = flecs_uto(ecs_size_t,
70491+ ecs_field_stride(it, i));
70492+ ptr = ECS_OFFSET(ptr, offset * stride);
70493+ }
7047070494
7047170495 const char *name = flecs_script_iter_field_names[i];
7047270496 ecs_script_var_t *var = ecs_script_vars_lookup(vars, name);
@@ -90082,8 +90106,15 @@ ecs_trav_up_t* flecs_query_get_up_cache(
9008290106 return NULL; /* Table doesn't have the relationship */
9008390107 }
9008490108
90085- int32_t i = tr->index, end = i + tr->count;
90086- for (; i < end; i ++) {
90109+ int32_t i = tr->index, remaining = tr->count;
90110+ for (; remaining; i ++) {
90111+ i = flecs_table_offset_search_w_inherited(
90112+ world, table, i, cr_trav->id, NULL);
90113+ if (i == -1) {
90114+ break;
90115+ }
90116+ remaining --;
90117+
9008790118 ecs_id_t id = table->type.array[i];
9008890119 ecs_entity_t tgt = ECS_PAIR_SECOND(id);
9008990120 ecs_trav_up_t *result = &cache->up;
0 commit comments