optimize setting of fragments with required fragments

This commit is contained in:
BlackMATov
2025-12-18 00:01:41 +07:00
parent 47dd1bb30a
commit 8e2a34f2f6
2 changed files with 310 additions and 267 deletions

View File

@@ -243,3 +243,143 @@ do
end
end
end
do
local f1, f2, f3, f4 = evo.id(4)
evo.set(f1, evo.REQUIRES, { f2 })
evo.set(f2, evo.REQUIRES, { f3 })
evo.set(f3, evo.REQUIRES, { f4 })
do
local e1 = evo.builder():set(f1):spawn()
assert(evo.has(e1, f1) and evo.get(e1, f1) == true)
assert(evo.has(e1, f2) and evo.get(e1, f2) == true)
assert(evo.has(e1, f3) and evo.get(e1, f3) == true)
assert(evo.has(e1, f4) and evo.get(e1, f4) == true)
local e2 = evo.builder():set(f2):spawn()
assert(not evo.has(e2, f1) and evo.get(e2, f1) == nil)
assert(evo.has(e2, f2) and evo.get(e2, f2) == true)
assert(evo.has(e2, f3) and evo.get(e2, f3) == true)
assert(evo.has(e2, f4) and evo.get(e2, f4) == true)
local e3 = evo.builder():set(f3):spawn()
assert(not evo.has(e3, f1) and evo.get(e3, f1) == nil)
assert(not evo.has(e3, f2) and evo.get(e3, f2) == nil)
assert(evo.has(e3, f3) and evo.get(e3, f3) == true)
assert(evo.has(e3, f4) and evo.get(e3, f4) == true)
end
do
local e1 = evo.id()
evo.set(e1, f1)
assert(evo.has(e1, f1) and evo.get(e1, f1) == true)
assert(evo.has(e1, f2) and evo.get(e1, f2) == true)
assert(evo.has(e1, f3) and evo.get(e1, f3) == true)
assert(evo.has(e1, f4) and evo.get(e1, f4) == true)
local e2 = evo.id()
evo.set(e2, f2)
assert(not evo.has(e2, f1) and evo.get(e2, f1) == nil)
assert(evo.has(e2, f2) and evo.get(e2, f2) == true)
assert(evo.has(e2, f3) and evo.get(e2, f3) == true)
assert(evo.has(e2, f4) and evo.get(e2, f4) == true)
local e3 = evo.id()
evo.set(e3, f3)
assert(not evo.has(e3, f1) and evo.get(e3, f1) == nil)
assert(not evo.has(e3, f2) and evo.get(e3, f2) == nil)
assert(evo.has(e3, f3) and evo.get(e3, f3) == true)
assert(evo.has(e3, f4) and evo.get(e3, f4) == true)
end
evo.remove(f2, evo.REQUIRES)
do
local e1 = evo.builder():set(f1):spawn()
assert(evo.has(e1, f1) and evo.get(e1, f1) == true)
assert(evo.has(e1, f2) and evo.get(e1, f2) == true)
assert(not evo.has(e1, f3) and evo.get(e1, f3) == nil)
assert(not evo.has(e1, f4) and evo.get(e1, f4) == nil)
local e2 = evo.builder():set(f2):spawn()
assert(not evo.has(e2, f1) and evo.get(e2, f1) == nil)
assert(evo.has(e2, f2) and evo.get(e2, f2) == true)
assert(not evo.has(e2, f3) and evo.get(e2, f3) == nil)
assert(not evo.has(e2, f4) and evo.get(e2, f4) == nil)
local e3 = evo.builder():set(f3):spawn()
assert(not evo.has(e3, f1) and evo.get(e3, f1) == nil)
assert(not evo.has(e3, f2) and evo.get(e3, f2) == nil)
assert(evo.has(e3, f3) and evo.get(e3, f3) == true)
assert(evo.has(e3, f4) and evo.get(e3, f4) == true)
end
do
local e1 = evo.id()
evo.set(e1, f1)
assert(evo.has(e1, f1) and evo.get(e1, f1) == true)
assert(evo.has(e1, f2) and evo.get(e1, f2) == true)
assert(not evo.has(e1, f3) and evo.get(e1, f3) == nil)
assert(not evo.has(e1, f4) and evo.get(e1, f4) == nil)
local e2 = evo.id()
evo.set(e2, f2)
assert(not evo.has(e2, f1) and evo.get(e2, f1) == nil)
assert(evo.has(e2, f2) and evo.get(e2, f2) == true)
assert(not evo.has(e2, f3) and evo.get(e2, f3) == nil)
assert(not evo.has(e2, f4) and evo.get(e2, f4) == nil)
local e3 = evo.id()
evo.set(e3, f3)
assert(not evo.has(e3, f1) and evo.get(e3, f1) == nil)
assert(not evo.has(e3, f2) and evo.get(e3, f2) == nil)
assert(evo.has(e3, f3) and evo.get(e3, f3) == true)
assert(evo.has(e3, f4) and evo.get(e3, f4) == true)
end
evo.set(f2, evo.REQUIRES, { f4 })
do
local e1 = evo.builder():set(f1):spawn()
assert(evo.has(e1, f1) and evo.get(e1, f1) == true)
assert(evo.has(e1, f2) and evo.get(e1, f2) == true)
assert(not evo.has(e1, f3) and evo.get(e1, f3) == nil)
assert(evo.has(e1, f4) and evo.get(e1, f4) == true)
local e2 = evo.builder():set(f2):spawn()
assert(not evo.has(e2, f1) and evo.get(e2, f1) == nil)
assert(evo.has(e2, f2) and evo.get(e2, f2) == true)
assert(not evo.has(e2, f3) and evo.get(e2, f3) == nil)
assert(evo.has(e2, f4) and evo.get(e2, f4) == true)
local e3 = evo.builder():set(f3):spawn()
assert(not evo.has(e3, f1) and evo.get(e3, f1) == nil)
assert(not evo.has(e3, f2) and evo.get(e3, f2) == nil)
assert(evo.has(e3, f3) and evo.get(e3, f3) == true)
assert(evo.has(e3, f4) and evo.get(e3, f4) == true)
end
do
local e1 = evo.id()
evo.set(e1, f1)
assert(evo.has(e1, f1) and evo.get(e1, f1) == true)
assert(evo.has(e1, f2) and evo.get(e1, f2) == true)
assert(not evo.has(e1, f3) and evo.get(e1, f3) == nil)
assert(evo.has(e1, f4) and evo.get(e1, f4) == true)
local e2 = evo.id()
evo.set(e2, f2)
assert(not evo.has(e2, f1) and evo.get(e2, f1) == nil)
assert(evo.has(e2, f2) and evo.get(e2, f2) == true)
assert(not evo.has(e2, f3) and evo.get(e2, f3) == nil)
assert(evo.has(e2, f4) and evo.get(e2, f4) == true)
local e3 = evo.id()
evo.set(e3, f3)
assert(not evo.has(e3, f1) and evo.get(e3, f1) == nil)
assert(not evo.has(e3, f2) and evo.get(e3, f2) == nil)
assert(evo.has(e3, f3) and evo.get(e3, f3) == true)
assert(evo.has(e3, f4) and evo.get(e3, f4) == true)
end
end

View File

@@ -891,6 +891,7 @@ local __chunk_without_fragments
local __chunk_without_unique_fragments
local __chunk_matches
local __chunk_requires
local __chunk_fragments
local __chunk_components
@@ -902,9 +903,6 @@ local __chunk_has_any_fragment_list
local __chunk_get_all_components
local __chunk_required_chunk
local __fragment_required_fragments
local __detach_entity
local __detach_all_entities
@@ -1608,6 +1606,29 @@ function __chunk_matches(chunk, query)
return true
end
---@param chunk evolved.chunk
---@return evolved.chunk
---@nodiscard
function __chunk_requires(chunk)
local chunk_fragment_list = chunk.__fragment_list
local chunk_fragment_count = chunk.__fragment_count
for chunk_fragment_index = 1, chunk_fragment_count do
local chunk_fragment = chunk_fragment_list[chunk_fragment_index]
local chunk_fragment_requires = __sorted_requires[chunk_fragment]
local chunk_fragment_require_list = chunk_fragment_requires and chunk_fragment_requires.__item_list
local chunk_fragment_require_count = chunk_fragment_requires and chunk_fragment_requires.__item_count or 0
for chunk_fragment_require_index = 1, chunk_fragment_require_count do
local chunk_fragment_require = chunk_fragment_require_list[chunk_fragment_require_index]
chunk = __chunk_with_fragment(chunk, chunk_fragment_require)
end
end
return chunk
end
---@param head_fragment evolved.fragment
---@param ... evolved.fragment tail_fragments
---@return evolved.chunk
@@ -1844,100 +1865,6 @@ function __chunk_get_all_components(chunk, place, ...)
end
end
---@param ini_chunk evolved.chunk
---@return evolved.chunk required_chunk
---@nodiscard
function __chunk_required_chunk(ini_chunk)
local req_chunk = ini_chunk
local ini_fragment_list = ini_chunk.__fragment_list
local ini_fragment_count = ini_chunk.__fragment_count
for ini_fragment_index = 1, ini_fragment_count do
local ini_fragment = ini_fragment_list[ini_fragment_index]
local ini_fragment_requires = __sorted_requires[ini_fragment]
local ini_fragment_require_list = ini_fragment_requires and ini_fragment_requires.__item_list
local ini_fragment_require_count = ini_fragment_requires and ini_fragment_requires.__item_count or 0
for ini_fragment_require_index = 1, ini_fragment_require_count do
local ini_fragment_require = ini_fragment_require_list[ini_fragment_require_index]
req_chunk = __chunk_with_fragment(req_chunk, ini_fragment_require)
end
end
return req_chunk
end
---@param ini_chunk evolved.chunk
---@param ini_fragment evolved.fragment
---@param req_fragment_set table<evolved.fragment, integer>
---@param req_fragment_list evolved.fragment[]
---@param req_fragment_count integer
---@return integer
---@nodiscard
function __fragment_required_fragments(ini_chunk, ini_fragment, req_fragment_set, req_fragment_list, req_fragment_count)
---@type evolved.fragment[]
local fragment_stack = __acquire_table(__table_pool_tag.fragment_list)
local fragment_stack_size = 0
local ini_fragment_set = ini_chunk.__fragment_set
do
local ini_fragment_requires = __sorted_requires[ini_fragment]
local ini_fragment_require_list = ini_fragment_requires and ini_fragment_requires.__item_list
local ini_fragment_require_count = ini_fragment_requires and ini_fragment_requires.__item_count or 0
for required_fragment_index = 1, ini_fragment_require_count do
local required_fragment = ini_fragment_require_list[required_fragment_index]
if ini_fragment_set[required_fragment] or req_fragment_set[required_fragment] then
-- this fragment has already been gathered
else
req_fragment_count = req_fragment_count + 1
req_fragment_set[required_fragment] = req_fragment_count
req_fragment_list[req_fragment_count] = required_fragment
if __sorted_requires[required_fragment] then
fragment_stack_size = fragment_stack_size + 1
fragment_stack[fragment_stack_size] = required_fragment
end
end
end
end
while fragment_stack_size > 0 do
local stack_fragment = fragment_stack[fragment_stack_size]
fragment_stack[fragment_stack_size] = nil
fragment_stack_size = fragment_stack_size - 1
local fragment_requires = __sorted_requires[stack_fragment]
local fragment_require_list = fragment_requires and fragment_requires.__item_list
local fragment_require_count = fragment_requires and fragment_requires.__item_count or 0
for fragment_require_index = 1, fragment_require_count do
local required_fragment = fragment_require_list[fragment_require_index]
if ini_fragment_set[required_fragment] or req_fragment_set[required_fragment] then
-- this fragment has already been gathered
else
req_fragment_count = req_fragment_count + 1
req_fragment_set[required_fragment] = req_fragment_count
req_fragment_list[req_fragment_count] = required_fragment
if __sorted_requires[required_fragment] then
fragment_stack_size = fragment_stack_size + 1
fragment_stack[fragment_stack_size] = required_fragment
end
end
end
end
__release_table(__table_pool_tag.fragment_list, fragment_stack, true)
return req_fragment_count
end
---@param chunk evolved.chunk
---@param place integer
function __detach_entity(chunk, place)
@@ -2009,7 +1936,7 @@ function __spawn_entity(chunk, entity, components)
if required_chunk and not required_chunk.__unreachable_or_collected then
chunk = required_chunk
else
required_chunk = __chunk_required_chunk(chunk)
required_chunk = __chunk_requires(chunk)
chunk.__with_required_fragments, chunk = required_chunk, required_chunk
end
end
@@ -2128,7 +2055,7 @@ function __multi_spawn_entity(chunk, entity_list, entity_count, components)
if required_chunk and not required_chunk.__unreachable_or_collected then
chunk = required_chunk
else
required_chunk = __chunk_required_chunk(chunk)
required_chunk = __chunk_requires(chunk)
chunk.__with_required_fragments, chunk = required_chunk, required_chunk
end
end
@@ -2279,7 +2206,7 @@ function __clone_entity(prefab, entity, components)
if required_chunk and not required_chunk.__unreachable_or_collected then
chunk = required_chunk
else
required_chunk = __chunk_required_chunk(chunk)
required_chunk = __chunk_requires(chunk)
chunk.__with_required_fragments, chunk = required_chunk, required_chunk
end
end
@@ -2425,7 +2352,7 @@ function __multi_clone_entity(prefab, entity_list, entity_count, components)
if required_chunk and not required_chunk.__unreachable_or_collected then
chunk = required_chunk
else
required_chunk = __chunk_required_chunk(chunk)
required_chunk = __chunk_requires(chunk)
chunk.__with_required_fragments, chunk = required_chunk, required_chunk
end
end
@@ -2921,26 +2848,17 @@ function __chunk_set(old_chunk, fragment, component)
end
end
else
local req_fragment_set
local req_fragment_list
local req_fragment_count = 0
local ini_new_chunk = new_chunk
local ini_fragment_set = ini_new_chunk.__fragment_set
if new_chunk.__has_required_fragments then
---@type table<evolved.fragment, integer>
req_fragment_set = __acquire_table(__table_pool_tag.fragment_set)
while new_chunk and new_chunk.__has_required_fragments do
local required_chunk = new_chunk.__with_required_fragments
---@type evolved.fragment[]
req_fragment_list = __acquire_table(__table_pool_tag.fragment_list)
req_fragment_count = __fragment_required_fragments(ini_new_chunk, fragment,
req_fragment_set, req_fragment_list, req_fragment_count)
for req_fragment_index = 1, req_fragment_count do
local req_fragment = req_fragment_list[req_fragment_index]
new_chunk = __chunk_with_fragment(new_chunk, req_fragment)
if required_chunk and not required_chunk.__unreachable_or_collected then
new_chunk = required_chunk
else
required_chunk = __chunk_requires(new_chunk)
new_chunk.__with_required_fragments, new_chunk = required_chunk, required_chunk
end
end
@@ -3097,110 +3015,107 @@ function __chunk_set(old_chunk, fragment, component)
end
end
for req_fragment_index = 1, req_fragment_count do
local req_fragment = req_fragment_list[req_fragment_index]
if ini_new_chunk.__has_required_fragments then
local req_fragment_list = new_chunk.__fragment_list
local req_fragment_count = new_chunk.__fragment_count
if ini_fragment_set[req_fragment] then
-- this fragment has already been initialized
else
---@type evolved.default?, evolved.duplicate?, evolved.set_hook?, evolved.insert_hook?
local req_fragment_default, req_fragment_duplicate, req_fragment_on_set, req_fragment_on_insert
for req_fragment_index = 1, req_fragment_count do
local req_fragment = req_fragment_list[req_fragment_index]
if new_chunk_has_setup_hooks or new_chunk_has_insert_hooks then
req_fragment_default, req_fragment_duplicate, req_fragment_on_set, req_fragment_on_insert =
__evolved_get(req_fragment, __DEFAULT, __DUPLICATE, __ON_SET, __ON_INSERT)
end
if req_fragment_on_set or req_fragment_on_insert then
local req_component_index = new_component_indices[req_fragment]
if req_component_index then
local req_component_storage = new_component_storages[req_component_index]
if req_fragment_duplicate then
for new_place = new_entity_count + 1, sum_entity_count do
local entity = new_entity_list[new_place]
local req_component = req_fragment_default
if req_component ~= nil then req_component = req_fragment_duplicate(req_component) end
if req_component == nil then req_component = true end
req_component_storage[new_place] = req_component
if req_fragment_on_set then
__defer_call_hook(req_fragment_on_set, entity, req_fragment, req_component)
end
if req_fragment_on_insert then
__defer_call_hook(req_fragment_on_insert, entity, req_fragment, req_component)
end
end
else
local req_component = req_fragment_default
if req_component == nil then req_component = true end
for new_place = new_entity_count + 1, sum_entity_count do
local entity = new_entity_list[new_place]
req_component_storage[new_place] = req_component
if req_fragment_on_set then
__defer_call_hook(req_fragment_on_set, entity, req_fragment, req_component)
end
if req_fragment_on_insert then
__defer_call_hook(req_fragment_on_insert, entity, req_fragment, req_component)
end
end
end
else
for new_place = new_entity_count + 1, sum_entity_count do
local entity = new_entity_list[new_place]
if req_fragment_on_set then
__defer_call_hook(req_fragment_on_set, entity, req_fragment)
end
if req_fragment_on_insert then
__defer_call_hook(req_fragment_on_insert, entity, req_fragment)
end
end
end
if ini_fragment_set[req_fragment] then
-- this fragment has already been initialized
else
local req_component_index = new_component_indices[req_fragment]
---@type evolved.default?, evolved.duplicate?, evolved.set_hook?, evolved.insert_hook?
local req_fragment_default, req_fragment_duplicate, req_fragment_on_set, req_fragment_on_insert
if req_component_index then
local req_component_storage = new_component_storages[req_component_index]
if new_chunk_has_setup_hooks or new_chunk_has_insert_hooks then
req_fragment_default, req_fragment_duplicate, req_fragment_on_set, req_fragment_on_insert =
__evolved_get(req_fragment, __DEFAULT, __DUPLICATE, __ON_SET, __ON_INSERT)
end
if req_fragment_duplicate then
for new_place = new_entity_count + 1, sum_entity_count do
if req_fragment_on_set or req_fragment_on_insert then
local req_component_index = new_component_indices[req_fragment]
if req_component_index then
local req_component_storage = new_component_storages[req_component_index]
if req_fragment_duplicate then
for new_place = new_entity_count + 1, sum_entity_count do
local entity = new_entity_list[new_place]
local req_component = req_fragment_default
if req_component ~= nil then req_component = req_fragment_duplicate(req_component) end
if req_component == nil then req_component = true end
req_component_storage[new_place] = req_component
if req_fragment_on_set then
__defer_call_hook(req_fragment_on_set, entity, req_fragment, req_component)
end
if req_fragment_on_insert then
__defer_call_hook(req_fragment_on_insert, entity, req_fragment, req_component)
end
end
else
local req_component = req_fragment_default
if req_component ~= nil then req_component = req_fragment_duplicate(req_component) end
if req_component == nil then req_component = true end
req_component_storage[new_place] = req_component
for new_place = new_entity_count + 1, sum_entity_count do
local entity = new_entity_list[new_place]
req_component_storage[new_place] = req_component
if req_fragment_on_set then
__defer_call_hook(req_fragment_on_set, entity, req_fragment, req_component)
end
if req_fragment_on_insert then
__defer_call_hook(req_fragment_on_insert, entity, req_fragment, req_component)
end
end
end
else
local req_component = req_fragment_default
if req_component == nil then req_component = true end
for new_place = new_entity_count + 1, sum_entity_count do
req_component_storage[new_place] = req_component
local entity = new_entity_list[new_place]
if req_fragment_on_set then
__defer_call_hook(req_fragment_on_set, entity, req_fragment)
end
if req_fragment_on_insert then
__defer_call_hook(req_fragment_on_insert, entity, req_fragment)
end
end
end
else
-- nothing
local req_component_index = new_component_indices[req_fragment]
if req_component_index then
local req_component_storage = new_component_storages[req_component_index]
if req_fragment_duplicate then
for new_place = new_entity_count + 1, sum_entity_count do
local req_component = req_fragment_default
if req_component ~= nil then req_component = req_fragment_duplicate(req_component) end
if req_component == nil then req_component = true end
req_component_storage[new_place] = req_component
end
else
local req_component = req_fragment_default
if req_component == nil then req_component = true end
for new_place = new_entity_count + 1, sum_entity_count do
req_component_storage[new_place] = req_component
end
end
else
-- nothing
end
end
end
end
end
if req_fragment_set then
__release_table(__table_pool_tag.fragment_set, req_fragment_set)
end
if req_fragment_list then
__release_table(__table_pool_tag.fragment_list, req_fragment_list)
end
__structural_changes = __structural_changes + 1
end
end
@@ -4412,26 +4327,17 @@ function __evolved_set(entity, fragment, component)
-- nothing
end
else
local req_fragment_set
local req_fragment_list
local req_fragment_count = 0
local ini_new_chunk = new_chunk
local ini_fragment_set = ini_new_chunk.__fragment_set
if new_chunk.__has_required_fragments then
---@type table<evolved.fragment, integer>
req_fragment_set = __acquire_table(__table_pool_tag.fragment_set)
while new_chunk and new_chunk.__has_required_fragments do
local required_chunk = new_chunk.__with_required_fragments
---@type evolved.fragment[]
req_fragment_list = __acquire_table(__table_pool_tag.fragment_list)
req_fragment_count = __fragment_required_fragments(ini_new_chunk, fragment,
req_fragment_set, req_fragment_list, req_fragment_count)
for req_fragment_index = 1, req_fragment_count do
local req_fragment = req_fragment_list[req_fragment_index]
new_chunk = __chunk_with_fragment(new_chunk, req_fragment)
if required_chunk and not required_chunk.__unreachable_or_collected then
new_chunk = required_chunk
else
required_chunk = __chunk_requires(new_chunk)
new_chunk.__with_required_fragments, new_chunk = required_chunk, required_chunk
end
end
@@ -4513,63 +4419,60 @@ function __evolved_set(entity, fragment, component)
end
end
for req_fragment_index = 1, req_fragment_count do
local req_fragment = req_fragment_list[req_fragment_index]
if ini_new_chunk.__has_required_fragments then
local req_fragment_list = new_chunk.__fragment_list
local req_fragment_count = new_chunk.__fragment_count
if ini_fragment_set[req_fragment] then
-- this fragment has already been initialized
else
---@type evolved.default?, evolved.duplicate?, evolved.set_hook?, evolved.insert_hook?
local req_fragment_default, req_fragment_duplicate, req_fragment_on_set, req_fragment_on_insert
for req_fragment_index = 1, req_fragment_count do
local req_fragment = req_fragment_list[req_fragment_index]
if new_chunk_has_setup_hooks or new_chunk_has_insert_hooks then
req_fragment_default, req_fragment_duplicate, req_fragment_on_set, req_fragment_on_insert =
__evolved_get(req_fragment, __DEFAULT, __DUPLICATE, __ON_SET, __ON_INSERT)
end
local req_component_index = new_component_indices[req_fragment]
if req_component_index then
local req_component_storage = new_component_storages[req_component_index]
local req_component = req_fragment_default
if req_component ~= nil and req_fragment_duplicate then
req_component = req_fragment_duplicate(req_component)
end
if req_component == nil then
req_component = true
end
req_component_storage[new_place] = req_component
if req_fragment_on_set then
__defer_call_hook(req_fragment_on_set, entity, req_fragment, req_component)
end
if req_fragment_on_insert then
__defer_call_hook(req_fragment_on_insert, entity, req_fragment, req_component)
end
if ini_fragment_set[req_fragment] then
-- this fragment has already been initialized
else
if req_fragment_on_set then
__defer_call_hook(req_fragment_on_set, entity, req_fragment)
---@type evolved.default?, evolved.duplicate?, evolved.set_hook?, evolved.insert_hook?
local req_fragment_default, req_fragment_duplicate, req_fragment_on_set, req_fragment_on_insert
if new_chunk_has_setup_hooks or new_chunk_has_insert_hooks then
req_fragment_default, req_fragment_duplicate, req_fragment_on_set, req_fragment_on_insert =
__evolved_get(req_fragment, __DEFAULT, __DUPLICATE, __ON_SET, __ON_INSERT)
end
if req_fragment_on_insert then
__defer_call_hook(req_fragment_on_insert, entity, req_fragment)
local req_component_index = new_component_indices[req_fragment]
if req_component_index then
local req_component_storage = new_component_storages[req_component_index]
local req_component = req_fragment_default
if req_component ~= nil and req_fragment_duplicate then
req_component = req_fragment_duplicate(req_component)
end
if req_component == nil then
req_component = true
end
req_component_storage[new_place] = req_component
if req_fragment_on_set then
__defer_call_hook(req_fragment_on_set, entity, req_fragment, req_component)
end
if req_fragment_on_insert then
__defer_call_hook(req_fragment_on_insert, entity, req_fragment, req_component)
end
else
if req_fragment_on_set then
__defer_call_hook(req_fragment_on_set, entity, req_fragment)
end
if req_fragment_on_insert then
__defer_call_hook(req_fragment_on_insert, entity, req_fragment)
end
end
end
end
end
if req_fragment_set then
__release_table(__table_pool_tag.fragment_set, req_fragment_set)
end
if req_fragment_list then
__release_table(__table_pool_tag.fragment_list, req_fragment_list)
end
end
__evolved_commit()