Skip to content

Commit 107f26a

Browse files
committed
[script] Incremental updates
1 parent 498a48a commit 107f26a

16 files changed

Lines changed: 11049 additions & 117 deletions

File tree

distr/flecs.c

Lines changed: 2711 additions & 57 deletions
Large diffs are not rendered by default.

src/addons/meta/rtt_lifecycle.c

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,4 +1008,99 @@ void flecs_rtt_init_default_hooks(
10081008
}
10091009
}
10101010

1011+
static
1012+
void flecs_rtt_strip_call_data(
1013+
ecs_vec_t *vec,
1014+
const ecs_type_info_t *ti)
1015+
{
1016+
int32_t i = 0;
1017+
while (i < ecs_vec_count(vec)) {
1018+
ecs_rtt_call_data_t *data = ecs_vec_get_t(
1019+
vec, ecs_rtt_call_data_t, i);
1020+
if (data->type_info == ti) {
1021+
ecs_vec_remove_t(vec, ecs_rtt_call_data_t, i);
1022+
} else {
1023+
i ++;
1024+
}
1025+
}
1026+
}
1027+
1028+
void flecs_rtt_type_info_freed(
1029+
ecs_world_t *world,
1030+
const ecs_type_info_t *freed_ti)
1031+
{
1032+
ecs_vec_t invalidated;
1033+
ecs_vec_init_t(NULL, &invalidated, const ecs_type_info_t*, 0);
1034+
ecs_vec_append_t(NULL, &invalidated,
1035+
const ecs_type_info_t*)[0] = freed_ti;
1036+
1037+
int32_t w = 0;
1038+
while (w < ecs_vec_count(&invalidated)) {
1039+
const ecs_type_info_t *cur = ecs_vec_get_t(&invalidated,
1040+
const ecs_type_info_t*, w)[0];
1041+
w ++;
1042+
1043+
ecs_map_iter_t it = ecs_map_iter(&world->type_info);
1044+
while (ecs_map_next(&it)) {
1045+
ecs_type_info_t *ti = ecs_map_ptr(&it);
1046+
if (ti == cur) {
1047+
continue;
1048+
}
1049+
1050+
void *ctx = ti->hooks.lifecycle_ctx;
1051+
if (!ctx) {
1052+
continue;
1053+
}
1054+
1055+
if (ti->hooks.lifecycle_ctx_free ==
1056+
flecs_rtt_free_lifecycle_struct_ctx)
1057+
{
1058+
ecs_rtt_struct_ctx_t *sctx = ctx;
1059+
flecs_rtt_strip_call_data(&sctx->vctor, cur);
1060+
flecs_rtt_strip_call_data(&sctx->vdtor, cur);
1061+
flecs_rtt_strip_call_data(&sctx->vmove, cur);
1062+
flecs_rtt_strip_call_data(&sctx->vcopy, cur);
1063+
flecs_rtt_strip_call_data(&sctx->vcmp, cur);
1064+
flecs_rtt_strip_call_data(&sctx->vequals, cur);
1065+
} else if (ti->hooks.lifecycle_ctx_free ==
1066+
flecs_rtt_free_lifecycle_array_ctx)
1067+
{
1068+
ecs_rtt_array_ctx_t *actx = ctx;
1069+
if (actx->type_info == cur) {
1070+
flecs_rtt_free_lifecycle_array_ctx(actx);
1071+
ti->hooks.lifecycle_ctx = NULL;
1072+
ti->hooks.lifecycle_ctx_free = flecs_rtt_free_lifecycle_nop;
1073+
ti->hooks.ctor = flecs_default_ctor;
1074+
ti->hooks.dtor = NULL;
1075+
ti->hooks.move = NULL;
1076+
ti->hooks.copy = NULL;
1077+
ti->hooks.cmp = NULL;
1078+
ti->hooks.equals = NULL;
1079+
ecs_vec_append_t(NULL, &invalidated,
1080+
const ecs_type_info_t*)[0] = ti;
1081+
}
1082+
} else if (ti->hooks.lifecycle_ctx_free ==
1083+
flecs_rtt_free_lifecycle_vector_ctx)
1084+
{
1085+
ecs_rtt_vector_ctx_t *vctx = ctx;
1086+
if (vctx->type_info == cur) {
1087+
flecs_rtt_free_lifecycle_vector_ctx(vctx);
1088+
ti->hooks.lifecycle_ctx = NULL;
1089+
ti->hooks.lifecycle_ctx_free = flecs_rtt_free_lifecycle_nop;
1090+
ti->hooks.ctor = flecs_default_ctor;
1091+
ti->hooks.dtor = NULL;
1092+
ti->hooks.move = NULL;
1093+
ti->hooks.copy = NULL;
1094+
ti->hooks.cmp = NULL;
1095+
ti->hooks.equals = NULL;
1096+
ecs_vec_append_t(NULL, &invalidated,
1097+
const ecs_type_info_t*)[0] = ti;
1098+
}
1099+
}
1100+
}
1101+
}
1102+
1103+
ecs_vec_fini_t(NULL, &invalidated, const ecs_type_info_t*);
1104+
}
1105+
10111106
#endif

src/addons/script/ast.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ typedef enum ecs_script_node_kind_t {
3434
typedef struct ecs_script_node_t {
3535
ecs_script_node_kind_t kind;
3636
const char *pos;
37+
uint64_t depends_on;
38+
bool contains_entities;
3739
} ecs_script_node_t;
3840

3941
struct ecs_script_scope_t {
@@ -45,6 +47,15 @@ struct ecs_script_scope_t {
4547
/* Array with component ids that are added in scope. Used to limit
4648
* archetype moves. */
4749
ecs_vec_t components; /* vec<ecs_id_t> */
50+
51+
int32_t slot_start;
52+
int32_t slot_end;
53+
int32_t dyn_start;
54+
int32_t dyn_end;
55+
int32_t control_start;
56+
int32_t control_end;
57+
int32_t loop_id_start;
58+
int32_t loop_id_end;
4859
};
4960

5061
typedef struct ecs_script_id_t {
@@ -66,6 +77,10 @@ typedef struct ecs_script_id_t {
6677
* for entities that are defined inside of templates, which have different
6778
* values for each instantiation. */
6879
bool dynamic;
80+
81+
int32_t target_slot;
82+
int32_t id_slot;
83+
int32_t loop_id_slot;
6984
} ecs_script_id_t;
7085

7186
typedef struct ecs_script_tag_t {
@@ -85,6 +100,7 @@ typedef struct ecs_script_default_component_t {
85100
ecs_script_node_t node;
86101
ecs_expr_node_t *expr;
87102
ecs_value_t eval;
103+
int32_t loop_id_slot;
88104
} ecs_script_default_component_t;
89105

90106
typedef struct ecs_script_var_component_t {
@@ -100,19 +116,25 @@ struct ecs_script_entity_t {
100116
bool name_is_var;
101117
bool kind_w_expr;
102118
bool non_fragmenting_parent;
119+
bool is_expr_entity;
103120
ecs_script_scope_t *scope;
104121
ecs_expr_node_t *name_expr;
105122

106123
/* Populated during eval */
107124
ecs_script_entity_t *parent;
108125
ecs_entity_t eval;
109126
ecs_entity_t eval_kind;
127+
128+
int32_t slot;
129+
int32_t dyn_slot;
130+
uint64_t name_depends_on;
110131
};
111132

112133
typedef struct ecs_script_with_t {
113134
ecs_script_node_t node;
114135
ecs_script_scope_t *expressions;
115136
ecs_script_scope_t *scope;
137+
uint64_t expr_depends_on;
116138
} ecs_script_with_t;
117139

118140
typedef struct ecs_script_inherit_t {
@@ -124,6 +146,7 @@ typedef struct ecs_script_pair_scope_t {
124146
ecs_script_node_t node;
125147
ecs_script_id_t id;
126148
ecs_script_scope_t *scope;
149+
uint64_t expr_depends_on;
127150
} ecs_script_pair_scope_t;
128151

129152
typedef struct ecs_script_using_t {
@@ -160,6 +183,8 @@ typedef struct ecs_script_if_t {
160183
ecs_script_scope_t *if_true;
161184
ecs_script_scope_t *if_false;
162185
ecs_expr_node_t *expr;
186+
uint64_t expr_depends_on;
187+
int32_t control_slot;
163188
} ecs_script_if_t;
164189

165190
typedef struct ecs_script_for_range_t {
@@ -168,6 +193,7 @@ typedef struct ecs_script_for_range_t {
168193
ecs_expr_node_t *from;
169194
ecs_expr_node_t *to;
170195
ecs_script_scope_t *scope;
196+
uint64_t expr_depends_on;
171197
} ecs_script_for_range_t;
172198

173199
typedef struct ecs_script_include_t {

src/addons/script/expr/visit_eval.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -940,10 +940,20 @@ int flecs_expr_new_visit_eval(
940940
ecs_script_eval_visitor_t temp_v = {0};
941941
ecs_script_eval_desc_t desc = {0};
942942

943+
if (v && v->template) {
944+
if (ecs_script_visit_node(v, node->entity)) {
945+
return -1;
946+
}
947+
948+
*(ecs_entity_t*)out->value.ptr = 0;
949+
out->value.type = ecs_id(ecs_entity_t);
950+
return 0;
951+
}
952+
943953
if (!v) {
944-
/* Safe const cast, script won't modify variables since it only contains
954+
/* Safe const cast, script won't modify variables since it only contains
945955
* an entity statement. */
946-
desc.vars = ctx->desc ?
956+
desc.vars = ctx->desc ?
947957
ECS_CONST_CAST(ecs_script_vars_t*, ctx->desc->vars) : NULL;
948958
flecs_script_eval_visit_init(
949959
(const ecs_script_impl_t*)ctx->script, &temp_v, &desc);

src/addons/script/expr/visit_free.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ void flecs_expr_value_visit_free(
1414
ecs_expr_value_node_t *node)
1515
{
1616
if (node->ptr != &node->storage) {
17-
ecs_value_free(script->world, node->node.type, node->ptr);
17+
if (ecs_is_alive(script->world, node->node.type) &&
18+
ecs_get_type_info(script->world, node->node.type))
19+
{
20+
ecs_value_free(script->world, node->node.type, node->ptr);
21+
}
1822
}
1923
}
2024

0 commit comments

Comments
 (0)