mirror of
https://github.com/BlackMATov/evolved.lua.git
synced 2025-12-15 12:19:47 +07:00
update chunk flags for pair major chunks
This commit is contained in:
@@ -1408,5 +1408,36 @@ do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
do
|
||||||
|
do
|
||||||
|
local p, s = evo.id(2)
|
||||||
|
|
||||||
|
local e = evo.builder():set(p, 21):set(evo.pair(p, s), 42):spawn()
|
||||||
|
assert(evo.has(e, p) and evo.get(e, p) == 21)
|
||||||
|
assert(evo.has(e, evo.pair(p, s)) and evo.get(e, evo.pair(p, s)) == 42)
|
||||||
|
|
||||||
|
evo.set(s, evo.TAG)
|
||||||
|
assert(evo.has(e, p) and evo.get(e, p) == 21)
|
||||||
|
assert(evo.has(e, evo.pair(p, s)) and evo.get(e, evo.pair(p, s)) == 42)
|
||||||
|
|
||||||
|
evo.set(p, evo.TAG)
|
||||||
|
assert(evo.has(e, p) and evo.get(e, p) == nil)
|
||||||
|
assert(evo.has(e, evo.pair(p, s)) and evo.get(e, evo.pair(p, s)) == nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
do
|
||||||
|
local p, s = evo.id(2)
|
||||||
|
|
||||||
|
local e = evo.builder():set(evo.pair(p, s), 42):spawn()
|
||||||
|
assert(evo.has(e, evo.pair(p, s)) and evo.get(e, evo.pair(p, s)) == 42)
|
||||||
|
|
||||||
|
evo.set(s, evo.TAG)
|
||||||
|
assert(evo.has(e, evo.pair(p, s)) and evo.get(e, evo.pair(p, s)) == 42)
|
||||||
|
|
||||||
|
evo.set(p, evo.TAG)
|
||||||
|
assert(evo.has(e, evo.pair(p, s)) and evo.get(e, evo.pair(p, s)) == nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- TODO:
|
-- TODO:
|
||||||
-- Add errors on modifying pairs
|
-- Add errors on modifying pairs
|
||||||
|
|||||||
159
evolved.lua
159
evolved.lua
@@ -150,8 +150,10 @@ local __defer_bytecode = {} ---@type any[]
|
|||||||
local __root_chunks = {} ---@type table<evolved.fragment, evolved.chunk>
|
local __root_chunks = {} ---@type table<evolved.fragment, evolved.chunk>
|
||||||
local __major_chunks = {} ---@type table<evolved.fragment, evolved.assoc_list>
|
local __major_chunks = {} ---@type table<evolved.fragment, evolved.assoc_list>
|
||||||
local __minor_chunks = {} ---@type table<evolved.fragment, evolved.assoc_list>
|
local __minor_chunks = {} ---@type table<evolved.fragment, evolved.assoc_list>
|
||||||
local __primary_chunks = {} ---@type table<evolved.fragment, evolved.assoc_list>
|
local __primary_major_chunks = {} ---@type table<evolved.fragment, evolved.assoc_list>
|
||||||
local __secondary_chunks = {} ---@type table<evolved.fragment, evolved.assoc_list>
|
local __secondary_major_chunks = {} ---@type table<evolved.fragment, evolved.assoc_list>
|
||||||
|
local __primary_minor_chunks = {} ---@type table<evolved.fragment, evolved.assoc_list>
|
||||||
|
local __secondary_minor_chunks = {} ---@type table<evolved.fragment, evolved.assoc_list>
|
||||||
|
|
||||||
local __pinned_chunks = {} ---@type table<evolved.chunk, integer>
|
local __pinned_chunks = {} ---@type table<evolved.chunk, integer>
|
||||||
|
|
||||||
@@ -234,6 +236,7 @@ local __lua_setmetatable = setmetatable
|
|||||||
local __lua_string_format = string.format
|
local __lua_string_format = string.format
|
||||||
local __lua_table_concat = table.concat
|
local __lua_table_concat = table.concat
|
||||||
local __lua_table_sort = table.sort
|
local __lua_table_sort = table.sort
|
||||||
|
local __lua_tostring = tostring
|
||||||
|
|
||||||
---@type fun(narray: integer, nhash: integer): table
|
---@type fun(narray: integer, nhash: integer): table
|
||||||
local __lua_table_new = (function()
|
local __lua_table_new = (function()
|
||||||
@@ -1359,8 +1362,11 @@ function __new_chunk(chunk_parent, chunk_fragment)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if not chunk_parent then
|
if not chunk_parent then
|
||||||
local root_fragment = chunk_fragment
|
if __root_chunks[chunk_fragment] ~= nil then
|
||||||
__root_chunks[root_fragment] = chunk
|
__error_fmt('unexpected root chunk %s',
|
||||||
|
__lua_tostring(__root_chunks[chunk_fragment]))
|
||||||
|
end
|
||||||
|
__root_chunks[chunk_fragment] = chunk
|
||||||
end
|
end
|
||||||
|
|
||||||
do
|
do
|
||||||
@@ -1387,25 +1393,48 @@ function __new_chunk(chunk_parent, chunk_fragment)
|
|||||||
__assoc_list_insert(minor_chunks, chunk)
|
__assoc_list_insert(minor_chunks, chunk)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if __is_pair(chunk_fragment) then
|
||||||
|
local major_fragment = chunk_fragment
|
||||||
|
local major_primary_fragment, major_secondary_fragment =
|
||||||
|
__evolved_unpair(major_fragment)
|
||||||
|
|
||||||
|
local primary_major_chunks = __primary_major_chunks[major_primary_fragment]
|
||||||
|
local secondary_major_chunks = __secondary_major_chunks[major_secondary_fragment]
|
||||||
|
|
||||||
|
if not primary_major_chunks then
|
||||||
|
primary_major_chunks = __assoc_list_new(4)
|
||||||
|
__primary_major_chunks[major_primary_fragment] = primary_major_chunks
|
||||||
|
end
|
||||||
|
|
||||||
|
if not secondary_major_chunks then
|
||||||
|
secondary_major_chunks = __assoc_list_new(4)
|
||||||
|
__secondary_major_chunks[major_secondary_fragment] = secondary_major_chunks
|
||||||
|
end
|
||||||
|
|
||||||
|
__assoc_list_insert(primary_major_chunks, chunk)
|
||||||
|
__assoc_list_insert(secondary_major_chunks, chunk)
|
||||||
|
end
|
||||||
|
|
||||||
for i = 1, chunk_pair_count do
|
for i = 1, chunk_pair_count do
|
||||||
local pair = chunk_pair_list[i]
|
local minor_fragment = chunk_pair_list[i]
|
||||||
local primary, secondary = __evolved_unpair(pair)
|
local minor_primary_fragment, minor_secondary_fragment =
|
||||||
|
__evolved_unpair(minor_fragment)
|
||||||
|
|
||||||
local primary_chunks = __primary_chunks[primary]
|
local primary_minor_chunks = __primary_minor_chunks[minor_primary_fragment]
|
||||||
local secondary_chunks = __secondary_chunks[secondary]
|
local secondary_minor_chunks = __secondary_minor_chunks[minor_secondary_fragment]
|
||||||
|
|
||||||
if not primary_chunks then
|
if not primary_minor_chunks then
|
||||||
primary_chunks = __assoc_list_new(4)
|
primary_minor_chunks = __assoc_list_new(4)
|
||||||
__primary_chunks[primary] = primary_chunks
|
__primary_minor_chunks[minor_primary_fragment] = primary_minor_chunks
|
||||||
end
|
end
|
||||||
|
|
||||||
if not secondary_chunks then
|
if not secondary_minor_chunks then
|
||||||
secondary_chunks = __assoc_list_new(4)
|
secondary_minor_chunks = __assoc_list_new(4)
|
||||||
__secondary_chunks[secondary] = secondary_chunks
|
__secondary_minor_chunks[minor_secondary_fragment] = secondary_minor_chunks
|
||||||
end
|
end
|
||||||
|
|
||||||
__assoc_list_insert(primary_chunks, chunk)
|
__assoc_list_insert(primary_minor_chunks, chunk)
|
||||||
__assoc_list_insert(secondary_chunks, chunk)
|
__assoc_list_insert(secondary_minor_chunks, chunk)
|
||||||
end
|
end
|
||||||
|
|
||||||
__update_chunk_tags(chunk)
|
__update_chunk_tags(chunk)
|
||||||
@@ -1560,6 +1589,34 @@ function __trace_major_chunks(major, trace, ...)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
do
|
||||||
|
local major_chunks = __primary_major_chunks[major]
|
||||||
|
local major_chunk_list = major_chunks and major_chunks.__item_list --[=[@as evolved.chunk[]]=]
|
||||||
|
local major_chunk_count = major_chunks and major_chunks.__item_count or 0 --[[@as integer]]
|
||||||
|
|
||||||
|
if major_chunk_count > 0 then
|
||||||
|
__lua_table_move(
|
||||||
|
major_chunk_list, 1, major_chunk_count,
|
||||||
|
chunk_stack_size + 1, chunk_stack)
|
||||||
|
|
||||||
|
chunk_stack_size = chunk_stack_size + major_chunk_count
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
do
|
||||||
|
local major_chunks = __secondary_major_chunks[major]
|
||||||
|
local major_chunk_list = major_chunks and major_chunks.__item_list --[=[@as evolved.chunk[]]=]
|
||||||
|
local major_chunk_count = major_chunks and major_chunks.__item_count or 0 --[[@as integer]]
|
||||||
|
|
||||||
|
if major_chunk_count > 0 then
|
||||||
|
__lua_table_move(
|
||||||
|
major_chunk_list, 1, major_chunk_count,
|
||||||
|
chunk_stack_size + 1, chunk_stack)
|
||||||
|
|
||||||
|
chunk_stack_size = chunk_stack_size + major_chunk_count
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
while chunk_stack_size > 0 do
|
while chunk_stack_size > 0 do
|
||||||
local chunk = chunk_stack[chunk_stack_size]
|
local chunk = chunk_stack[chunk_stack_size]
|
||||||
|
|
||||||
@@ -1568,6 +1625,7 @@ function __trace_major_chunks(major, trace, ...)
|
|||||||
chunk_stack[chunk_stack_size] = nil
|
chunk_stack[chunk_stack_size] = nil
|
||||||
chunk_stack_size = chunk_stack_size - 1
|
chunk_stack_size = chunk_stack_size - 1
|
||||||
|
|
||||||
|
do
|
||||||
local chunk_child_list = chunk.__child_list
|
local chunk_child_list = chunk.__child_list
|
||||||
local chunk_child_count = chunk.__child_count
|
local chunk_child_count = chunk.__child_count
|
||||||
|
|
||||||
@@ -1577,6 +1635,7 @@ function __trace_major_chunks(major, trace, ...)
|
|||||||
|
|
||||||
chunk_stack_size = chunk_stack_size + chunk_child_count
|
chunk_stack_size = chunk_stack_size + chunk_child_count
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
__release_table(__table_pool_tag.chunk_list, chunk_stack, true)
|
__release_table(__table_pool_tag.chunk_list, chunk_stack, true)
|
||||||
end
|
end
|
||||||
@@ -1604,30 +1663,30 @@ function __trace_minor_chunks(minor, trace, ...)
|
|||||||
end
|
end
|
||||||
|
|
||||||
do
|
do
|
||||||
local primary_chunks = __primary_chunks[minor]
|
local minor_chunks = __primary_minor_chunks[minor]
|
||||||
local primary_chunk_list = primary_chunks and primary_chunks.__item_list --[=[@as evolved.chunk[]]=]
|
local minor_chunk_list = minor_chunks and minor_chunks.__item_list --[=[@as evolved.chunk[]]=]
|
||||||
local primary_chunk_count = primary_chunks and primary_chunks.__item_count or 0 --[[@as integer]]
|
local minor_chunk_count = minor_chunks and minor_chunks.__item_count or 0 --[[@as integer]]
|
||||||
|
|
||||||
if primary_chunk_count > 0 then
|
if minor_chunk_count > 0 then
|
||||||
__lua_table_move(
|
__lua_table_move(
|
||||||
primary_chunk_list, 1, primary_chunk_count,
|
minor_chunk_list, 1, minor_chunk_count,
|
||||||
chunk_stack_size + 1, chunk_stack)
|
chunk_stack_size + 1, chunk_stack)
|
||||||
|
|
||||||
chunk_stack_size = chunk_stack_size + primary_chunk_count
|
chunk_stack_size = chunk_stack_size + minor_chunk_count
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
do
|
do
|
||||||
local secondary_chunks = __secondary_chunks[minor]
|
local minor_chunks = __secondary_minor_chunks[minor]
|
||||||
local secondary_chunk_list = secondary_chunks and secondary_chunks.__item_list --[=[@as evolved.chunk[]]=]
|
local minor_chunk_list = minor_chunks and minor_chunks.__item_list --[=[@as evolved.chunk[]]=]
|
||||||
local secondary_chunk_count = secondary_chunks and secondary_chunks.__item_count or 0 --[[@as integer]]
|
local minor_chunk_count = minor_chunks and minor_chunks.__item_count or 0 --[[@as integer]]
|
||||||
|
|
||||||
if secondary_chunk_count > 0 then
|
if minor_chunk_count > 0 then
|
||||||
__lua_table_move(
|
__lua_table_move(
|
||||||
secondary_chunk_list, 1, secondary_chunk_count,
|
minor_chunk_list, 1, minor_chunk_count,
|
||||||
chunk_stack_size + 1, chunk_stack)
|
chunk_stack_size + 1, chunk_stack)
|
||||||
|
|
||||||
chunk_stack_size = chunk_stack_size + secondary_chunk_count
|
chunk_stack_size = chunk_stack_size + minor_chunk_count
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -2286,8 +2345,8 @@ local function __chunk_required_fragments(chunk, req_fragment_set, req_fragment_
|
|||||||
end
|
end
|
||||||
|
|
||||||
local fragment_requires = __sorted_requires[stack_fragment]
|
local fragment_requires = __sorted_requires[stack_fragment]
|
||||||
local fragment_require_list = fragment_requires and fragment_requires.__item_list
|
local fragment_require_list = fragment_requires and fragment_requires.__item_list --[=[@as evolved.fragment[]]=]
|
||||||
local fragment_require_count = fragment_requires and fragment_requires.__item_count or 0
|
local fragment_require_count = fragment_requires and fragment_requires.__item_count or 0 --[[@as integer]]
|
||||||
|
|
||||||
for fragment_require_index = 1, fragment_require_count do
|
for fragment_require_index = 1, fragment_require_count do
|
||||||
local required_fragment = fragment_require_list[fragment_require_index]
|
local required_fragment = fragment_require_list[fragment_require_index]
|
||||||
@@ -2336,8 +2395,8 @@ local function __fragment_required_fragments(fragment, req_fragment_set, req_fra
|
|||||||
end
|
end
|
||||||
|
|
||||||
local fragment_requires = __sorted_requires[stack_fragment]
|
local fragment_requires = __sorted_requires[stack_fragment]
|
||||||
local fragment_require_list = fragment_requires and fragment_requires.__item_list
|
local fragment_require_list = fragment_requires and fragment_requires.__item_list --[=[@as evolved.fragment[]]=]
|
||||||
local fragment_require_count = fragment_requires and fragment_requires.__item_count or 0
|
local fragment_require_count = fragment_requires and fragment_requires.__item_count or 0 --[[@as integer]]
|
||||||
|
|
||||||
for fragment_require_index = 1, fragment_require_count do
|
for fragment_require_index = 1, fragment_require_count do
|
||||||
local required_fragment = fragment_require_list[fragment_require_index]
|
local required_fragment = fragment_require_list[fragment_require_index]
|
||||||
@@ -2911,7 +2970,11 @@ local function __purge_chunk(chunk)
|
|||||||
local with_fragment_edges = chunk.__with_fragment_edges
|
local with_fragment_edges = chunk.__with_fragment_edges
|
||||||
local without_fragment_edges = chunk.__without_fragment_edges
|
local without_fragment_edges = chunk.__without_fragment_edges
|
||||||
|
|
||||||
if __root_chunks[chunk_fragment] == chunk then
|
if not chunk_parent then
|
||||||
|
if __root_chunks[chunk_fragment] ~= chunk then
|
||||||
|
__error_fmt('unexpected root chunk %s',
|
||||||
|
__lua_tostring(__root_chunks[chunk_fragment]))
|
||||||
|
end
|
||||||
__root_chunks[chunk_fragment] = nil
|
__root_chunks[chunk_fragment] = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -2934,18 +2997,28 @@ local function __purge_chunk(chunk)
|
|||||||
end
|
end
|
||||||
|
|
||||||
for primary_fragment in __lua_next, chunk.__primary_pairs do
|
for primary_fragment in __lua_next, chunk.__primary_pairs do
|
||||||
local primary_chunks = __primary_chunks[primary_fragment]
|
local primary_major_chunks = __primary_major_chunks[primary_fragment]
|
||||||
|
local primary_minor_chunks = __primary_minor_chunks[primary_fragment]
|
||||||
|
|
||||||
if primary_chunks and __assoc_list_remove(primary_chunks, chunk) == 0 then
|
if primary_major_chunks and __assoc_list_remove(primary_major_chunks, chunk) == 0 then
|
||||||
__primary_chunks[primary_fragment] = nil
|
__primary_major_chunks[primary_fragment] = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
if primary_minor_chunks and __assoc_list_remove(primary_minor_chunks, chunk) == 0 then
|
||||||
|
__primary_minor_chunks[primary_fragment] = nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
for secondary_fragment in __lua_next, chunk.__secondary_pairs do
|
for secondary_fragment in __lua_next, chunk.__secondary_pairs do
|
||||||
local secondary_chunks = __secondary_chunks[secondary_fragment]
|
local secondary_major_chunks = __secondary_major_chunks[secondary_fragment]
|
||||||
|
local secondary_minor_chunks = __secondary_minor_chunks[secondary_fragment]
|
||||||
|
|
||||||
if secondary_chunks and __assoc_list_remove(secondary_chunks, chunk) == 0 then
|
if secondary_major_chunks and __assoc_list_remove(secondary_major_chunks, chunk) == 0 then
|
||||||
__secondary_chunks[secondary_fragment] = nil
|
__secondary_major_chunks[secondary_fragment] = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
if secondary_minor_chunks and __assoc_list_remove(secondary_minor_chunks, chunk) == 0 then
|
||||||
|
__secondary_minor_chunks[secondary_fragment] = nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -5482,8 +5555,8 @@ function __evolved_destroy(...)
|
|||||||
|
|
||||||
do
|
do
|
||||||
local minor_chunks = __minor_chunks
|
local minor_chunks = __minor_chunks
|
||||||
local primary_chunks = __primary_chunks
|
local primary_chunks = __primary_minor_chunks
|
||||||
local secondary_chunks = __secondary_chunks
|
local secondary_chunks = __secondary_minor_chunks
|
||||||
|
|
||||||
local purging_entity_list = __acquire_table(__table_pool_tag.entity_list)
|
local purging_entity_list = __acquire_table(__table_pool_tag.entity_list)
|
||||||
local purging_entity_count = 0
|
local purging_entity_count = 0
|
||||||
@@ -5679,8 +5752,8 @@ function __evolved_batch_destroy(...)
|
|||||||
|
|
||||||
do
|
do
|
||||||
local minor_chunks = __minor_chunks
|
local minor_chunks = __minor_chunks
|
||||||
local primary_chunks = __primary_chunks
|
local primary_chunks = __primary_minor_chunks
|
||||||
local secondary_chunks = __secondary_chunks
|
local secondary_chunks = __secondary_minor_chunks
|
||||||
|
|
||||||
local clearing_chunk_list = __acquire_table(__table_pool_tag.chunk_list)
|
local clearing_chunk_list = __acquire_table(__table_pool_tag.chunk_list)
|
||||||
local clearing_chunk_count = 0
|
local clearing_chunk_count = 0
|
||||||
|
|||||||
Reference in New Issue
Block a user