Skip to content

Commit 8f49fbe

Browse files
committed
#124 fix issue with linking component id symbols, appending long strbuf strings
1 parent 0ec9bd5 commit 8f49fbe

File tree

4 files changed

+53
-15
lines changed

4 files changed

+53
-15
lines changed

flecs.c

+35-10
Original file line numberDiff line numberDiff line change
@@ -11337,7 +11337,8 @@ bool appendstr(
1133711337
/* Update to number of characters copied to new buffer */
1133811338
b->current->pos += n;
1133911339
} else {
11340-
char *remainder = ecs_os_strdup(str);
11340+
/* String doesn't fit in a single element, strdup */
11341+
char *remainder = ecs_os_strdup(str + memLeftInElement);
1134111342
ecs_strbuf_grow_str(b, remainder, remainder, n);
1134211343
}
1134311344
} else {
@@ -37049,17 +37050,41 @@ void rematch_table(
3704937050
resolve_cascade_subject(world, query, match, table, table->type);
3705037051

3705137052
/* If query has optional columns, it is possible that a column that
37052-
* previously had data no longer has data, or vice versa. Do a full
37053+
* previously had data no longer has data, or vice versa. Do a
3705337054
* rematch to make sure data is consistent. */
3705437055
} else if (query->flags & EcsQueryHasOptional) {
37055-
unmatch_table(query, table);
37056-
if (!(query->flags & EcsQueryIsSubquery)) {
37057-
flecs_table_notify(world, table, &(ecs_table_event_t){
37058-
.kind = EcsTableQueryUnmatch,
37059-
.query = query
37060-
});
37056+
/* Check if optional terms that weren't matched before are matched
37057+
* now & vice versa */
37058+
ecs_query_table_match_t *qt = match->first;
37059+
37060+
bool rematch = false;
37061+
int32_t i, count = query->filter.term_count_actual;
37062+
for (i = 0; i < count; i ++) {
37063+
ecs_term_t *term = &query->filter.terms[i];
37064+
37065+
if (term->oper == EcsOptional) {
37066+
int32_t t = term->index;
37067+
int32_t column = 0;
37068+
flecs_term_match_table(world, term, table,
37069+
table->type, 0, &column, 0, 0, true);
37070+
if (column && (qt->columns[t] == 0)) {
37071+
rematch = true;
37072+
} else if (!column && (qt->columns[t] != 0)) {
37073+
rematch = true;
37074+
}
37075+
}
37076+
}
37077+
37078+
if (rematch) {
37079+
unmatch_table(query, table);
37080+
if (!(query->flags & EcsQueryIsSubquery)) {
37081+
flecs_table_notify(world, table, &(ecs_table_event_t){
37082+
.kind = EcsTableQueryUnmatch,
37083+
.query = query
37084+
});
37085+
}
37086+
add_table(world, query, table);
3706137087
}
37062-
add_table(world, query, table);
3706337088
}
3706437089
} else {
3706537090
/* Table no longer matches, remove */
@@ -37120,7 +37145,7 @@ void rematch_tables(
3712037145
ecs_world_t *world,
3712137146
ecs_query_t *query,
3712237147
ecs_query_t *parent_query)
37123-
{
37148+
{
3712437149
if (parent_query) {
3712537150
ecs_query_table_t *tables = ecs_vector_first(
3712637151
parent_query->cache.tables, ecs_query_table_t);

flecs.h

+8-2
Original file line numberDiff line numberDiff line change
@@ -9201,12 +9201,14 @@ int ecs_meta_from_desc(
92019201
#define ECS_STRUCT_ECS_META_IMPL ECS_STRUCT_IMPL
92029202

92039203
#define ECS_STRUCT_IMPL(name, type_desc)\
9204+
FLECS_META_C_EXPORT extern ECS_COMPONENT_DECLARE(name);\
92049205
static const char *FLECS__##name##_desc = type_desc;\
92059206
static ecs_type_kind_t FLECS__##name##_kind = EcsStructType;\
9206-
FLECS_META_C_EXPORT ECS_COMPONENT_DECLARE(name)
9207+
FLECS_META_C_EXPORT ECS_COMPONENT_DECLARE(name) = 0
92079208

92089209
#define ECS_STRUCT_DECLARE(name, type_desc)\
9209-
FLECS_META_C_EXPORT ECS_COMPONENT_DECLARE(name)
9210+
FLECS_META_C_EXPORT extern ECS_COMPONENT_DECLARE(name);\
9211+
FLECS_META_C_EXPORT ECS_COMPONENT_DECLARE(name) = 0
92109212

92119213
#define ECS_STRUCT_EXTERN(name, type_desc)\
92129214
FLECS_META_C_IMPORT extern ECS_COMPONENT_DECLARE(name)
@@ -9219,11 +9221,13 @@ int ecs_meta_from_desc(
92199221
#define ECS_ENUM_ECS_META_IMPL ECS_ENUM_IMPL
92209222

92219223
#define ECS_ENUM_IMPL(name, type_desc)\
9224+
FLECS_META_C_EXPORT extern ECS_COMPONENT_DECLARE(name);\
92229225
static const char *FLECS__##name##_desc = type_desc;\
92239226
static ecs_type_kind_t FLECS__##name##_kind = EcsEnumType;\
92249227
FLECS_META_C_EXPORT ECS_COMPONENT_DECLARE(name)
92259228

92269229
#define ECS_ENUM_DECLARE(name, type_desc)\
9230+
FLECS_META_C_EXPORT extern ECS_COMPONENT_DECLARE(name);\
92279231
FLECS_META_C_EXPORT ECS_COMPONENT_DECLARE(name)
92289232

92299233
#define ECS_ENUM_EXTERN(name, type_desc)\
@@ -9237,11 +9241,13 @@ int ecs_meta_from_desc(
92379241
#define ECS_BITMASK_ECS_META_IMPL ECS_BITMASK_IMPL
92389242

92399243
#define ECS_BITMASK_IMPL(name, type_desc)\
9244+
FLECS_META_C_EXPORT extern ECS_COMPONENT_DECLARE(name);\
92409245
static const char *FLECS__##name##_desc = type_desc;\
92419246
static ecs_type_kind_t FLECS__##name##_kind = EcsBitmaskType;\
92429247
FLECS_META_C_EXPORT ECS_COMPONENT_DECLARE(name)
92439248

92449249
#define ECS_BITMASK_DECLARE(name, type_desc)\
9250+
FLECS_META_C_EXPORT extern ECS_COMPONENT_DECLARE(name);\
92459251
FLECS_META_C_EXPORT ECS_COMPONENT_DECLARE(name)
92469252

92479253
#define ECS_BITMASK_EXTERN(name, type_desc)\

include/flecs/addons/meta_c.h

+8-2
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,14 @@ int ecs_meta_from_desc(
8787
#define ECS_STRUCT_ECS_META_IMPL ECS_STRUCT_IMPL
8888

8989
#define ECS_STRUCT_IMPL(name, type_desc)\
90+
FLECS_META_C_EXPORT extern ECS_COMPONENT_DECLARE(name);\
9091
static const char *FLECS__##name##_desc = type_desc;\
9192
static ecs_type_kind_t FLECS__##name##_kind = EcsStructType;\
92-
FLECS_META_C_EXPORT ECS_COMPONENT_DECLARE(name)
93+
FLECS_META_C_EXPORT ECS_COMPONENT_DECLARE(name) = 0
9394

9495
#define ECS_STRUCT_DECLARE(name, type_desc)\
95-
FLECS_META_C_EXPORT ECS_COMPONENT_DECLARE(name)
96+
FLECS_META_C_EXPORT extern ECS_COMPONENT_DECLARE(name);\
97+
FLECS_META_C_EXPORT ECS_COMPONENT_DECLARE(name) = 0
9698

9799
#define ECS_STRUCT_EXTERN(name, type_desc)\
98100
FLECS_META_C_IMPORT extern ECS_COMPONENT_DECLARE(name)
@@ -105,11 +107,13 @@ int ecs_meta_from_desc(
105107
#define ECS_ENUM_ECS_META_IMPL ECS_ENUM_IMPL
106108

107109
#define ECS_ENUM_IMPL(name, type_desc)\
110+
FLECS_META_C_EXPORT extern ECS_COMPONENT_DECLARE(name);\
108111
static const char *FLECS__##name##_desc = type_desc;\
109112
static ecs_type_kind_t FLECS__##name##_kind = EcsEnumType;\
110113
FLECS_META_C_EXPORT ECS_COMPONENT_DECLARE(name)
111114

112115
#define ECS_ENUM_DECLARE(name, type_desc)\
116+
FLECS_META_C_EXPORT extern ECS_COMPONENT_DECLARE(name);\
113117
FLECS_META_C_EXPORT ECS_COMPONENT_DECLARE(name)
114118

115119
#define ECS_ENUM_EXTERN(name, type_desc)\
@@ -123,11 +127,13 @@ int ecs_meta_from_desc(
123127
#define ECS_BITMASK_ECS_META_IMPL ECS_BITMASK_IMPL
124128

125129
#define ECS_BITMASK_IMPL(name, type_desc)\
130+
FLECS_META_C_EXPORT extern ECS_COMPONENT_DECLARE(name);\
126131
static const char *FLECS__##name##_desc = type_desc;\
127132
static ecs_type_kind_t FLECS__##name##_kind = EcsBitmaskType;\
128133
FLECS_META_C_EXPORT ECS_COMPONENT_DECLARE(name)
129134

130135
#define ECS_BITMASK_DECLARE(name, type_desc)\
136+
FLECS_META_C_EXPORT extern ECS_COMPONENT_DECLARE(name);\
131137
FLECS_META_C_EXPORT ECS_COMPONENT_DECLARE(name)
132138

133139
#define ECS_BITMASK_EXTERN(name, type_desc)\

src/datastructures/strbuf.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,8 @@ bool appendstr(
307307
/* Update to number of characters copied to new buffer */
308308
b->current->pos += n;
309309
} else {
310-
char *remainder = ecs_os_strdup(str);
310+
/* String doesn't fit in a single element, strdup */
311+
char *remainder = ecs_os_strdup(str + memLeftInElement);
311312
ecs_strbuf_grow_str(b, remainder, remainder, n);
312313
}
313314
} else {

0 commit comments

Comments
 (0)