little unroll some defer operations

This commit is contained in:
BlackMATov
2025-01-22 13:06:21 +07:00
parent c1a259ed3d
commit 85ff3c4a57
2 changed files with 783 additions and 24 deletions

View File

@@ -5120,3 +5120,450 @@ do
assert(c4 and #c4 == 1 and c4[1] == 4) assert(c4 and #c4 == 1 and c4[1] == 4)
end end
end end
do
local f0, f1, f2, f3, f4 = evo.id(5)
evo.set(f0, evo.CONSTRUCT, function()
return 42
end)
evo.set(f1, evo.CONSTRUCT, function(a1)
return a1
end)
evo.set(f2, evo.CONSTRUCT, function(a1, a2)
return a1 + a2
end)
evo.set(f3, evo.CONSTRUCT, function(a1, a2, a3)
return a1 + a2 + a3
end)
evo.set(f4, evo.CONSTRUCT, function(a1, a2, a3, a4)
return a1 + a2 + a3 + a4
end)
do
local e1 = evo.id()
evo.set(e1, f0)
evo.set(e1, f1, 1)
evo.set(e1, f2, 1, 2)
evo.set(e1, f3, 1, 2, 3)
evo.set(e1, f4, 1, 2, 3, 4)
assert(evo.get(e1, f0) == 42)
assert(evo.get(e1, f1) == 1)
assert(evo.get(e1, f2) == 1 + 2)
assert(evo.get(e1, f3) == 1 + 2 + 3)
assert(evo.get(e1, f4) == 1 + 2 + 3 + 4)
end
do
local e1 = evo.id()
evo.insert(e1, f0)
evo.insert(e1, f1, 1)
evo.insert(e1, f2, 1, 2)
evo.insert(e1, f3, 1, 2, 3)
evo.insert(e1, f4, 1, 2, 3, 4)
assert(evo.get(e1, f0) == 42)
assert(evo.get(e1, f1) == 1)
assert(evo.get(e1, f2) == 1 + 2)
assert(evo.get(e1, f3) == 1 + 2 + 3)
assert(evo.get(e1, f4) == 1 + 2 + 3 + 4)
end
do
local e1 = evo.id()
evo.multi_insert(e1, { f0, f1, f2, f3, f4 })
evo.assign(e1, f0)
evo.assign(e1, f1, 1)
evo.assign(e1, f2, 1, 2)
evo.assign(e1, f3, 1, 2, 3)
evo.assign(e1, f4, 1, 2, 3, 4)
assert(evo.get(e1, f0) == 42)
assert(evo.get(e1, f1) == 1)
assert(evo.get(e1, f2) == 1 + 2)
assert(evo.get(e1, f3) == 1 + 2 + 3)
assert(evo.get(e1, f4) == 1 + 2 + 3 + 4)
end
do
local e1, e2, e3, e4 = evo.id(4)
evo.multi_insert(e1, { f1, f2, f3, f4 })
evo.multi_insert(e2, { f1, f2, f3, f4 })
evo.multi_insert(e3, { f1, f2, f3, f4 })
evo.multi_insert(e4, { f1, f2, f3, f4 })
evo.remove(e1, f0, f1)
evo.remove(e2, f0, f1, f2)
evo.remove(e3, f0, f1, f2, f3)
evo.remove(e4, f0, f1, f2, f3, f4)
assert(evo.get(e1, f1) == nil and evo.get(e1, f2) == true and evo.get(e1, f3) == true and evo.get(e1, f4) == true)
assert(evo.get(e2, f1) == nil and evo.get(e2, f2) == nil and evo.get(e2, f3) == true and evo.get(e2, f4) == true)
assert(evo.get(e3, f1) == nil and evo.get(e3, f2) == nil and evo.get(e3, f3) == nil and evo.get(e3, f4) == true)
assert(evo.get(e4, f1) == nil and evo.get(e4, f2) == nil and evo.get(e4, f3) == nil and evo.get(e4, f4) == nil)
end
do
local e1, e2 = evo.id(2)
assert(evo.defer())
evo.set(e1, f0)
evo.set(e1, f1, 1)
evo.set(e1, f2, 1, 2)
evo.set(e1, f3, 1, 2, 3)
evo.set(e1, f4, 1, 2, 3, 4)
evo.set(e2, f0)
evo.set(e2, f1, 1)
evo.set(e2, f2, 1, 2)
evo.set(e2, f3, 1, 2, 3)
evo.set(e2, f4, 1, 2, 3, 4)
assert(evo.commit())
assert(evo.get(e1, f0) == 42)
assert(evo.get(e1, f1) == 1)
assert(evo.get(e1, f2) == 1 + 2)
assert(evo.get(e1, f3) == 1 + 2 + 3)
assert(evo.get(e1, f4) == 1 + 2 + 3 + 4)
assert(evo.get(e2, f0) == 42)
assert(evo.get(e2, f1) == 1)
assert(evo.get(e2, f2) == 1 + 2)
assert(evo.get(e2, f3) == 1 + 2 + 3)
assert(evo.get(e2, f4) == 1 + 2 + 3 + 4)
end
do
local e1, e2 = evo.id(2)
assert(evo.defer())
evo.insert(e1, f0)
evo.insert(e1, f1, 1)
evo.insert(e1, f2, 1, 2)
evo.insert(e1, f3, 1, 2, 3)
evo.insert(e1, f4, 1, 2, 3, 4)
evo.insert(e2, f0)
evo.insert(e2, f1, 1)
evo.insert(e2, f2, 1, 2)
evo.insert(e2, f3, 1, 2, 3)
evo.insert(e2, f4, 1, 2, 3, 4)
assert(evo.commit())
assert(evo.get(e1, f0) == 42)
assert(evo.get(e1, f1) == 1)
assert(evo.get(e1, f2) == 1 + 2)
assert(evo.get(e1, f3) == 1 + 2 + 3)
assert(evo.get(e1, f4) == 1 + 2 + 3 + 4)
assert(evo.get(e2, f0) == 42)
assert(evo.get(e2, f1) == 1)
assert(evo.get(e2, f2) == 1 + 2)
assert(evo.get(e2, f3) == 1 + 2 + 3)
assert(evo.get(e2, f4) == 1 + 2 + 3 + 4)
end
do
local e1, e2 = evo.id(2)
evo.multi_insert(e1, { f0, f1, f2, f3, f4 })
evo.multi_insert(e2, { f0, f1, f2, f3, f4 })
assert(evo.defer())
evo.assign(e1, f0)
evo.assign(e1, f1, 1)
evo.assign(e1, f2, 1, 2)
evo.assign(e1, f3, 1, 2, 3)
evo.assign(e1, f4, 1, 2, 3, 4)
evo.assign(e2, f0)
evo.assign(e2, f1, 1)
evo.assign(e2, f2, 1, 2)
evo.assign(e2, f3, 1, 2, 3)
evo.assign(e2, f4, 1, 2, 3, 4)
assert(evo.commit())
assert(evo.get(e1, f0) == 42)
assert(evo.get(e1, f1) == 1)
assert(evo.get(e1, f2) == 1 + 2)
assert(evo.get(e1, f3) == 1 + 2 + 3)
assert(evo.get(e1, f4) == 1 + 2 + 3 + 4)
assert(evo.get(e2, f0) == 42)
assert(evo.get(e2, f1) == 1)
assert(evo.get(e2, f2) == 1 + 2)
assert(evo.get(e2, f3) == 1 + 2 + 3)
assert(evo.get(e2, f4) == 1 + 2 + 3 + 4)
end
do
local e1, e2, e3, e4 = evo.id(4)
evo.multi_insert(e1, { f1, f2, f3, f4 })
evo.multi_insert(e2, { f1, f2, f3, f4 })
evo.multi_insert(e3, { f1, f2, f3, f4 })
evo.multi_insert(e4, { f1, f2, f3, f4 })
assert(evo.defer())
evo.remove(e1, f1)
evo.remove(e2, f1, f2)
evo.remove(e3, f1, f2, f3)
evo.remove(e4, f1, f2, f3, f4)
assert(evo.commit())
assert(evo.get(e1, f1) == nil and evo.get(e1, f2) == true and evo.get(e1, f3) == true and evo.get(e1, f4) == true)
assert(evo.get(e2, f1) == nil and evo.get(e2, f2) == nil and evo.get(e2, f3) == true and evo.get(e2, f4) == true)
assert(evo.get(e3, f1) == nil and evo.get(e3, f2) == nil and evo.get(e3, f3) == nil and evo.get(e3, f4) == true)
assert(evo.get(e4, f1) == nil and evo.get(e4, f2) == nil and evo.get(e4, f3) == nil and evo.get(e4, f4) == nil)
end
end
do
local fa, f0, f1, f2, f3, f4 = evo.id(6)
local q0 = evo.query():include(fa):build()
evo.set(f0, evo.CONSTRUCT, function()
return 42
end)
evo.set(f1, evo.CONSTRUCT, function(a1)
return a1
end)
evo.set(f2, evo.CONSTRUCT, function(a1, a2)
return a1 + a2
end)
evo.set(f3, evo.CONSTRUCT, function(a1, a2, a3)
return a1 + a2 + a3
end)
evo.set(f4, evo.CONSTRUCT, function(a1, a2, a3, a4)
return a1 + a2 + a3 + a4
end)
do
local e1 = evo.entity():set(fa):build()
local e2 = evo.entity():set(fa):build()
assert(evo.defer())
evo.batch_set(q0, f0)
assert(evo.commit())
assert(evo.get(e1, f0) == 42)
assert(evo.get(e2, f0) == 42)
assert(evo.defer())
evo.batch_set(q0, f1, 1)
assert(evo.commit())
assert(evo.get(e1, f1) == 1)
assert(evo.get(e2, f1) == 1)
assert(evo.defer())
evo.batch_set(q0, f2, 1, 2)
assert(evo.commit())
assert(evo.get(e1, f0) == 42)
assert(evo.get(e2, f0) == 42)
assert(evo.get(e1, f1) == 1)
assert(evo.get(e1, f2) == 1 + 2)
assert(evo.get(e2, f1) == 1)
assert(evo.get(e2, f2) == 1 + 2)
assert(evo.defer())
evo.batch_set(q0, f3, 1, 2, 3)
assert(evo.commit())
assert(evo.get(e1, f0) == 42)
assert(evo.get(e2, f0) == 42)
assert(evo.get(e1, f1) == 1)
assert(evo.get(e1, f2) == 1 + 2)
assert(evo.get(e1, f3) == 1 + 2 + 3)
assert(evo.get(e2, f1) == 1)
assert(evo.get(e2, f2) == 1 + 2)
assert(evo.get(e2, f3) == 1 + 2 + 3)
assert(evo.defer())
evo.batch_set(q0, f4, 1, 2, 3, 4)
assert(evo.commit())
assert(evo.get(e1, f0) == 42)
assert(evo.get(e2, f0) == 42)
assert(evo.get(e1, f1) == 1)
assert(evo.get(e1, f2) == 1 + 2)
assert(evo.get(e1, f3) == 1 + 2 + 3)
assert(evo.defer())
evo.batch_set(q0, f4, 1, 2, 3, 4)
assert(evo.commit())
assert(evo.get(e1, f0) == 42)
assert(evo.get(e2, f0) == 42)
assert(evo.get(e1, f1) == 1)
assert(evo.get(e1, f2) == 1 + 2)
assert(evo.get(e1, f3) == 1 + 2 + 3)
assert(evo.get(e1, f4) == 1 + 2 + 3 + 4)
assert(evo.get(e2, f1) == 1)
assert(evo.get(e2, f2) == 1 + 2)
assert(evo.get(e2, f3) == 1 + 2 + 3)
assert(evo.get(e2, f4) == 1 + 2 + 3 + 4)
end
do
local e1 = evo.entity():set(fa):build()
local e2 = evo.entity():set(fa):build()
assert(evo.defer())
evo.batch_insert(q0, f0)
assert(evo.commit())
assert(evo.get(e1, f0) == 42)
assert(evo.get(e2, f0) == 42)
assert(evo.defer())
evo.batch_insert(q0, f1, 1)
assert(evo.commit())
assert(evo.get(e1, f1) == 1)
assert(evo.get(e2, f1) == 1)
assert(evo.defer())
evo.batch_insert(q0, f2, 1, 2)
assert(evo.commit())
assert(evo.get(e1, f1) == 1)
assert(evo.get(e1, f2) == 1 + 2)
assert(evo.get(e2, f1) == 1)
assert(evo.get(e2, f2) == 1 + 2)
assert(evo.defer())
evo.batch_insert(q0, f3, 1, 2, 3)
assert(evo.commit())
assert(evo.get(e1, f1) == 1)
assert(evo.get(e1, f2) == 1 + 2)
assert(evo.get(e1, f3) == 1 + 2 + 3)
assert(evo.get(e2, f1) == 1)
assert(evo.get(e2, f2) == 1 + 2)
assert(evo.get(e2, f3) == 1 + 2 + 3)
assert(evo.defer())
evo.batch_insert(q0, f4, 1, 2, 3, 4)
assert(evo.commit())
assert(evo.get(e1, f1) == 1)
assert(evo.get(e1, f2) == 1 + 2)
assert(evo.get(e1, f3) == 1 + 2 + 3)
assert(evo.get(e1, f4) == 1 + 2 + 3 + 4)
assert(evo.get(e2, f1) == 1)
assert(evo.get(e2, f2) == 1 + 2)
assert(evo.get(e2, f3) == 1 + 2 + 3)
assert(evo.get(e2, f4) == 1 + 2 + 3 + 4)
end
do
local e1 = evo.entity():set(fa):build()
local e2 = evo.entity():set(fa):build()
assert(evo.defer())
evo.batch_insert(q0, f0, 0)
evo.batch_assign(q0, f0)
assert(evo.commit())
assert(evo.get(e1, f0) == 42)
assert(evo.get(e2, f0) == 42)
assert(evo.defer())
evo.batch_insert(q0, f1, 0)
evo.batch_assign(q0, f1, 1)
assert(evo.commit())
assert(evo.get(e1, f0) == 42)
assert(evo.get(e2, f0) == 42)
assert(evo.get(e1, f1) == 1)
assert(evo.get(e2, f1) == 1)
assert(evo.defer())
evo.batch_insert(q0, f2, 0, 0)
evo.batch_assign(q0, f2, 1, 2)
assert(evo.commit())
assert(evo.get(e1, f0) == 42)
assert(evo.get(e2, f0) == 42)
assert(evo.get(e1, f1) == 1)
assert(evo.get(e1, f2) == 1 + 2)
assert(evo.get(e2, f1) == 1)
assert(evo.get(e2, f2) == 1 + 2)
assert(evo.defer())
evo.batch_insert(q0, f3, 0, 0, 0)
evo.batch_assign(q0, f3, 1, 2, 3)
assert(evo.commit())
assert(evo.get(e1, f0) == 42)
assert(evo.get(e2, f0) == 42)
assert(evo.get(e1, f1) == 1)
assert(evo.get(e1, f2) == 1 + 2)
assert(evo.get(e1, f3) == 1 + 2 + 3)
assert(evo.get(e2, f1) == 1)
assert(evo.get(e2, f2) == 1 + 2)
assert(evo.get(e2, f3) == 1 + 2 + 3)
assert(evo.defer())
evo.batch_insert(q0, f4, 0, 0, 0, 0)
evo.batch_assign(q0, f4, 1, 2, 3, 4)
assert(evo.commit())
assert(evo.get(e1, f0) == 42)
assert(evo.get(e2, f0) == 42)
assert(evo.get(e1, f1) == 1)
assert(evo.get(e1, f2) == 1 + 2)
assert(evo.get(e1, f3) == 1 + 2 + 3)
assert(evo.get(e1, f4) == 1 + 2 + 3 + 4)
assert(evo.get(e2, f1) == 1)
assert(evo.get(e2, f2) == 1 + 2)
assert(evo.get(e2, f3) == 1 + 2 + 3)
assert(evo.get(e2, f4) == 1 + 2 + 3 + 4)
end
do
local e1 = evo.entity()
:set(fa)
:build()
local e2 = evo.entity()
:set(fa)
:build()
assert(evo.defer())
evo.batch_remove(q0)
assert(evo.commit())
assert(evo.get(e1, fa) == true)
assert(evo.get(e2, fa) == true)
end
do
local e1 = evo.entity()
:set(fa)
:set(f1, 1)
:build()
local e2 = evo.entity()
:set(fa)
:set(f1, 1)
:build()
assert(evo.defer())
evo.batch_remove(q0, f1)
assert(evo.commit())
assert(evo.get(e1, f1) == nil)
assert(evo.get(e2, f1) == nil)
end
do
local e1 = evo.entity()
:set(fa)
:set(f1, 1)
:set(f2, 1, 2)
:build()
local e2 = evo.entity()
:set(fa)
:set(f1, 1)
:set(f2, 1, 2)
:build()
assert(evo.defer())
evo.batch_remove(q0, f1, f2)
assert(evo.commit())
assert(evo.get(e1, f1) == nil)
assert(evo.get(e2, f1) == nil)
assert(evo.get(e1, f2) == nil)
assert(evo.get(e2, f2) == nil)
end
do
local e1 = evo.entity()
:set(fa)
:set(f1, 1)
:set(f2, 1, 2)
:set(f3, 1, 2, 3)
:build()
local e2 = evo.entity()
:set(fa)
:set(f1, 1)
:set(f2, 1, 2)
:set(f3, 1, 2, 3)
:build()
assert(evo.defer())
evo.batch_remove(q0, f1, f2, f3)
assert(evo.commit())
assert(evo.get(e1, f1) == nil)
assert(evo.get(e2, f1) == nil)
assert(evo.get(e1, f2) == nil)
assert(evo.get(e2, f2) == nil)
assert(evo.get(e1, f3) == nil)
assert(evo.get(e2, f3) == nil)
end
do
local e1 = evo.entity()
:set(fa)
:set(f1, 1)
:set(f2, 1, 2)
:set(f3, 1, 2, 3)
:set(f4, 1, 2, 3, 4)
:build()
local e2 = evo.entity()
:set(fa)
:set(f1, 1)
:set(f2, 1, 2)
:set(f3, 1, 2, 3)
:set(f4, 1, 2, 3, 4)
:build()
assert(evo.defer())
evo.batch_remove(q0, f1, f2, f3, f4)
assert(evo.commit())
assert(evo.get(e1, f1) == nil)
assert(evo.get(e2, f1) == nil)
assert(evo.get(e1, f2) == nil)
assert(evo.get(e2, f2) == nil)
assert(evo.get(e1, f3) == nil)
assert(evo.get(e2, f3) == nil)
assert(evo.get(e1, f4) == nil)
assert(evo.get(e2, f4) == nil)
end
end

View File

@@ -2339,8 +2339,28 @@ local function __defer_set(entity, fragment, ...)
bytecode[length + 3] = fragment bytecode[length + 3] = fragment
bytecode[length + 4] = argument_count bytecode[length + 4] = argument_count
for i = 1, argument_count do if argument_count == 0 then
bytecode[length + 4 + i] = select(i, ...) -- nothing
elseif argument_count == 1 then
local a1 = select(1, ...)
bytecode[length + 5] = a1
elseif argument_count == 2 then
local a1, a2 = select(1, ...)
bytecode[length + 5] = a1
bytecode[length + 6] = a2
elseif argument_count == 3 then
local a1, a2, a3 = select(1, ...)
bytecode[length + 5] = a1
bytecode[length + 6] = a2
bytecode[length + 7] = a3
else
local a1, a2, a3 = select(1, ...)
bytecode[length + 5] = a1
bytecode[length + 6] = a2
bytecode[length + 7] = a3
for i = 4, argument_count do
bytecode[length + 4 + i] = select(i, ...)
end
end end
__defer_length = length + 4 + argument_count __defer_length = length + 4 + argument_count
@@ -2350,7 +2370,26 @@ __defer_ops[__defer_op.set] = function(bytes, index)
local entity = bytes[index + 0] local entity = bytes[index + 0]
local fragment = bytes[index + 1] local fragment = bytes[index + 1]
local argument_count = bytes[index + 2] local argument_count = bytes[index + 2]
evolved.set(entity, fragment, __table_unpack(bytes, index + 3, index + 2 + argument_count))
local set = evolved.set
if argument_count == 0 then
set(entity, fragment)
elseif argument_count == 1 then
local a1 = bytes[index + 3]
set(entity, fragment, a1)
elseif argument_count == 2 then
local a1, a2 = bytes[index + 3], bytes[index + 4]
set(entity, fragment, a1, a2)
elseif argument_count == 3 then
local a1, a2, a3 = bytes[index + 3], bytes[index + 4], bytes[index + 5]
set(entity, fragment, a1, a2, a3)
else
local a1, a2, a3 = bytes[index + 3], bytes[index + 4], bytes[index + 5]
set(entity, fragment, a1, a2, a3,
__table_unpack(bytes, index + 6, index + 2 + argument_count))
end
return 3 + argument_count return 3 + argument_count
end end
@@ -2368,8 +2407,28 @@ local function __defer_assign(entity, fragment, ...)
bytecode[length + 3] = fragment bytecode[length + 3] = fragment
bytecode[length + 4] = argument_count bytecode[length + 4] = argument_count
for i = 1, argument_count do if argument_count == 0 then
bytecode[length + 4 + i] = select(i, ...) -- nothing
elseif argument_count == 1 then
local a1 = select(1, ...)
bytecode[length + 5] = a1
elseif argument_count == 2 then
local a1, a2 = select(1, ...)
bytecode[length + 5] = a1
bytecode[length + 6] = a2
elseif argument_count == 3 then
local a1, a2, a3 = select(1, ...)
bytecode[length + 5] = a1
bytecode[length + 6] = a2
bytecode[length + 7] = a3
else
local a1, a2, a3 = select(1, ...)
bytecode[length + 5] = a1
bytecode[length + 6] = a2
bytecode[length + 7] = a3
for i = 4, argument_count do
bytecode[length + 4 + i] = select(i, ...)
end
end end
__defer_length = length + 4 + argument_count __defer_length = length + 4 + argument_count
@@ -2379,7 +2438,26 @@ __defer_ops[__defer_op.assign] = function(bytes, index)
local entity = bytes[index + 0] local entity = bytes[index + 0]
local fragment = bytes[index + 1] local fragment = bytes[index + 1]
local argument_count = bytes[index + 2] local argument_count = bytes[index + 2]
evolved.assign(entity, fragment, __table_unpack(bytes, index + 3, index + 2 + argument_count))
local assign = evolved.assign
if argument_count == 0 then
assign(entity, fragment)
elseif argument_count == 1 then
local a1 = bytes[index + 3]
assign(entity, fragment, a1)
elseif argument_count == 2 then
local a1, a2 = bytes[index + 3], bytes[index + 4]
assign(entity, fragment, a1, a2)
elseif argument_count == 3 then
local a1, a2, a3 = bytes[index + 3], bytes[index + 4], bytes[index + 5]
assign(entity, fragment, a1, a2, a3)
else
local a1, a2, a3 = bytes[index + 3], bytes[index + 4], bytes[index + 5]
assign(entity, fragment, a1, a2, a3,
__table_unpack(bytes, index + 6, index + 2 + argument_count))
end
return 3 + argument_count return 3 + argument_count
end end
@@ -2397,8 +2475,28 @@ local function __defer_insert(entity, fragment, ...)
bytecode[length + 3] = fragment bytecode[length + 3] = fragment
bytecode[length + 4] = argument_count bytecode[length + 4] = argument_count
for i = 1, argument_count do if argument_count == 0 then
bytecode[length + 4 + i] = select(i, ...) -- nothing
elseif argument_count == 1 then
local a1 = select(1, ...)
bytecode[length + 5] = a1
elseif argument_count == 2 then
local a1, a2 = select(1, ...)
bytecode[length + 5] = a1
bytecode[length + 6] = a2
elseif argument_count == 3 then
local a1, a2, a3 = select(1, ...)
bytecode[length + 5] = a1
bytecode[length + 6] = a2
bytecode[length + 7] = a3
else
local a1, a2, a3 = select(1, ...)
bytecode[length + 5] = a1
bytecode[length + 6] = a2
bytecode[length + 7] = a3
for i = 4, argument_count do
bytecode[length + 4 + i] = select(i, ...)
end
end end
__defer_length = length + 4 + argument_count __defer_length = length + 4 + argument_count
@@ -2408,7 +2506,26 @@ __defer_ops[__defer_op.insert] = function(bytes, index)
local entity = bytes[index + 0] local entity = bytes[index + 0]
local fragment = bytes[index + 1] local fragment = bytes[index + 1]
local argument_count = bytes[index + 2] local argument_count = bytes[index + 2]
evolved.insert(entity, fragment, __table_unpack(bytes, index + 3, index + 2 + argument_count))
local insert = evolved.insert
if argument_count == 0 then
insert(entity, fragment)
elseif argument_count == 1 then
local a1 = bytes[index + 3]
insert(entity, fragment, a1)
elseif argument_count == 2 then
local a1, a2 = bytes[index + 3], bytes[index + 4]
insert(entity, fragment, a1, a2)
elseif argument_count == 3 then
local a1, a2, a3 = bytes[index + 3], bytes[index + 4], bytes[index + 5]
insert(entity, fragment, a1, a2, a3)
else
local a1, a2, a3 = bytes[index + 3], bytes[index + 4], bytes[index + 5]
insert(entity, fragment, a1, a2, a3,
__table_unpack(bytes, index + 6, index + 2 + argument_count))
end
return 3 + argument_count return 3 + argument_count
end end
@@ -2425,8 +2542,28 @@ local function __defer_remove(entity, ...)
bytecode[length + 2] = entity bytecode[length + 2] = entity
bytecode[length + 3] = fragment_count bytecode[length + 3] = fragment_count
for i = 1, fragment_count do if fragment_count == 0 then
bytecode[length + 3 + i] = select(i, ...) -- nothing
elseif fragment_count == 1 then
local f1 = select(1, ...)
bytecode[length + 4] = f1
elseif fragment_count == 2 then
local f1, f2 = select(1, ...)
bytecode[length + 4] = f1
bytecode[length + 5] = f2
elseif fragment_count == 3 then
local f1, f2, f3 = select(1, ...)
bytecode[length + 4] = f1
bytecode[length + 5] = f2
bytecode[length + 6] = f3
else
local f1, f2, f3 = select(1, ...)
bytecode[length + 4] = f1
bytecode[length + 5] = f2
bytecode[length + 6] = f3
for i = 4, fragment_count do
bytecode[length + 3 + i] = select(i, ...)
end
end end
__defer_length = length + 3 + fragment_count __defer_length = length + 3 + fragment_count
@@ -2435,7 +2572,26 @@ end
__defer_ops[__defer_op.remove] = function(bytes, index) __defer_ops[__defer_op.remove] = function(bytes, index)
local entity = bytes[index + 0] local entity = bytes[index + 0]
local fragment_count = bytes[index + 1] local fragment_count = bytes[index + 1]
evolved.remove(entity, __table_unpack(bytes, index + 2, index + 1 + fragment_count))
local remove = evolved.remove
if fragment_count == 0 then
-- nothing
elseif fragment_count == 1 then
local f1 = bytes[index + 2]
remove(entity, f1)
elseif fragment_count == 2 then
local f1, f2 = bytes[index + 2], bytes[index + 3]
remove(entity, f1, f2)
elseif fragment_count == 3 then
local f1, f2, f3 = bytes[index + 2], bytes[index + 3], bytes[index + 4]
remove(entity, f1, f2, f3)
else
local f1, f2, f3 = bytes[index + 2], bytes[index + 3], bytes[index + 4]
remove(entity, f1, f2, f3,
__table_unpack(bytes, index + 5, index + 1 + fragment_count))
end
return 2 + fragment_count return 2 + fragment_count
end end
@@ -2611,8 +2767,28 @@ local function __defer_batch_set(query, fragment, ...)
bytecode[length + 3] = fragment bytecode[length + 3] = fragment
bytecode[length + 4] = argument_count bytecode[length + 4] = argument_count
for i = 1, argument_count do if argument_count == 0 then
bytecode[length + 4 + i] = select(i, ...) -- nothing
elseif argument_count == 1 then
local a1 = select(1, ...)
bytecode[length + 5] = a1
elseif argument_count == 2 then
local a1, a2 = select(1, ...)
bytecode[length + 5] = a1
bytecode[length + 6] = a2
elseif argument_count == 3 then
local a1, a2, a3 = select(1, ...)
bytecode[length + 5] = a1
bytecode[length + 6] = a2
bytecode[length + 7] = a3
else
local a1, a2, a3 = select(1, ...)
bytecode[length + 5] = a1
bytecode[length + 6] = a2
bytecode[length + 7] = a3
for i = 4, argument_count do
bytecode[length + 4 + i] = select(i, ...)
end
end end
__defer_length = length + 4 + argument_count __defer_length = length + 4 + argument_count
@@ -2622,7 +2798,26 @@ __defer_ops[__defer_op.batch_set] = function(bytes, index)
local query = bytes[index + 0] local query = bytes[index + 0]
local fragment = bytes[index + 1] local fragment = bytes[index + 1]
local argument_count = bytes[index + 2] local argument_count = bytes[index + 2]
evolved.batch_set(query, fragment, __table_unpack(bytes, index + 3, index + 2 + argument_count))
local batch_set = evolved.batch_set
if argument_count == 0 then
batch_set(query, fragment)
elseif argument_count == 1 then
local a1 = bytes[index + 3]
batch_set(query, fragment, a1)
elseif argument_count == 2 then
local a1, a2 = bytes[index + 3], bytes[index + 4]
batch_set(query, fragment, a1, a2)
elseif argument_count == 3 then
local a1, a2, a3 = bytes[index + 3], bytes[index + 4], bytes[index + 5]
batch_set(query, fragment, a1, a2, a3)
else
local a1, a2, a3 = bytes[index + 3], bytes[index + 4], bytes[index + 5]
batch_set(query, fragment, a1, a2, a3,
__table_unpack(bytes, index + 6, index + 2 + argument_count))
end
return 3 + argument_count return 3 + argument_count
end end
@@ -2640,8 +2835,28 @@ local function __defer_batch_assign(query, fragment, ...)
bytecode[length + 3] = fragment bytecode[length + 3] = fragment
bytecode[length + 4] = argument_count bytecode[length + 4] = argument_count
for i = 1, argument_count do if argument_count == 0 then
bytecode[length + 4 + i] = select(i, ...) -- nothing
elseif argument_count == 1 then
local a1 = select(1, ...)
bytecode[length + 5] = a1
elseif argument_count == 2 then
local a1, a2 = select(1, ...)
bytecode[length + 5] = a1
bytecode[length + 6] = a2
elseif argument_count == 3 then
local a1, a2, a3 = select(1, ...)
bytecode[length + 5] = a1
bytecode[length + 6] = a2
bytecode[length + 7] = a3
else
local a1, a2, a3 = select(1, ...)
bytecode[length + 5] = a1
bytecode[length + 6] = a2
bytecode[length + 7] = a3
for i = 4, argument_count do
bytecode[length + 4 + i] = select(i, ...)
end
end end
__defer_length = length + 4 + argument_count __defer_length = length + 4 + argument_count
@@ -2651,7 +2866,26 @@ __defer_ops[__defer_op.batch_assign] = function(bytes, index)
local query = bytes[index + 0] local query = bytes[index + 0]
local fragment = bytes[index + 1] local fragment = bytes[index + 1]
local argument_count = bytes[index + 2] local argument_count = bytes[index + 2]
evolved.batch_assign(query, fragment, __table_unpack(bytes, index + 3, index + 2 + argument_count))
local batch_assign = evolved.batch_assign
if argument_count == 0 then
batch_assign(query, fragment)
elseif argument_count == 1 then
local a1 = bytes[index + 3]
batch_assign(query, fragment, a1)
elseif argument_count == 2 then
local a1, a2 = bytes[index + 3], bytes[index + 4]
batch_assign(query, fragment, a1, a2)
elseif argument_count == 3 then
local a1, a2, a3 = bytes[index + 3], bytes[index + 4], bytes[index + 5]
batch_assign(query, fragment, a1, a2, a3)
else
local a1, a2, a3 = bytes[index + 3], bytes[index + 4], bytes[index + 5]
batch_assign(query, fragment, a1, a2, a3,
__table_unpack(bytes, index + 6, index + 2 + argument_count))
end
return 3 + argument_count return 3 + argument_count
end end
@@ -2669,8 +2903,28 @@ local function __defer_batch_insert(query, fragment, ...)
bytecode[length + 3] = fragment bytecode[length + 3] = fragment
bytecode[length + 4] = argument_count bytecode[length + 4] = argument_count
for i = 1, argument_count do if argument_count == 0 then
bytecode[length + 4 + i] = select(i, ...) -- nothing
elseif argument_count == 1 then
local a1 = select(1, ...)
bytecode[length + 5] = a1
elseif argument_count == 2 then
local a1, a2 = select(1, ...)
bytecode[length + 5] = a1
bytecode[length + 6] = a2
elseif argument_count == 3 then
local a1, a2, a3 = select(1, ...)
bytecode[length + 5] = a1
bytecode[length + 6] = a2
bytecode[length + 7] = a3
else
local a1, a2, a3 = select(1, ...)
bytecode[length + 5] = a1
bytecode[length + 6] = a2
bytecode[length + 7] = a3
for i = 4, argument_count do
bytecode[length + 4 + i] = select(i, ...)
end
end end
__defer_length = length + 4 + argument_count __defer_length = length + 4 + argument_count
@@ -2680,7 +2934,26 @@ __defer_ops[__defer_op.batch_insert] = function(bytes, index)
local query = bytes[index + 0] local query = bytes[index + 0]
local fragment = bytes[index + 1] local fragment = bytes[index + 1]
local argument_count = bytes[index + 2] local argument_count = bytes[index + 2]
evolved.batch_insert(query, fragment, __table_unpack(bytes, index + 3, index + 2 + argument_count))
local batch_insert = evolved.batch_insert
if argument_count == 0 then
batch_insert(query, fragment)
elseif argument_count == 1 then
local a1 = bytes[index + 3]
batch_insert(query, fragment, a1)
elseif argument_count == 2 then
local a1, a2 = bytes[index + 3], bytes[index + 4]
batch_insert(query, fragment, a1, a2)
elseif argument_count == 3 then
local a1, a2, a3 = bytes[index + 3], bytes[index + 4], bytes[index + 5]
batch_insert(query, fragment, a1, a2, a3)
else
local a1, a2, a3 = bytes[index + 3], bytes[index + 4], bytes[index + 5]
batch_insert(query, fragment, a1, a2, a3,
__table_unpack(bytes, index + 6, index + 2 + argument_count))
end
return 3 + argument_count return 3 + argument_count
end end
@@ -2697,8 +2970,28 @@ local function __defer_batch_remove(query, ...)
bytecode[length + 2] = query bytecode[length + 2] = query
bytecode[length + 3] = fragment_count bytecode[length + 3] = fragment_count
for i = 1, fragment_count do if fragment_count == 0 then
bytecode[length + 3 + i] = select(i, ...) -- nothing
elseif fragment_count == 1 then
local f1 = select(1, ...)
bytecode[length + 4] = f1
elseif fragment_count == 2 then
local f1, f2 = select(1, ...)
bytecode[length + 4] = f1
bytecode[length + 5] = f2
elseif fragment_count == 3 then
local f1, f2, f3 = select(1, ...)
bytecode[length + 4] = f1
bytecode[length + 5] = f2
bytecode[length + 6] = f3
else
local f1, f2, f3 = select(1, ...)
bytecode[length + 4] = f1
bytecode[length + 5] = f2
bytecode[length + 6] = f3
for i = 4, fragment_count do
bytecode[length + 3 + i] = select(i, ...)
end
end end
__defer_length = length + 3 + fragment_count __defer_length = length + 3 + fragment_count
@@ -2707,7 +3000,26 @@ end
__defer_ops[__defer_op.batch_remove] = function(bytes, index) __defer_ops[__defer_op.batch_remove] = function(bytes, index)
local query = bytes[index + 0] local query = bytes[index + 0]
local fragment_count = bytes[index + 1] local fragment_count = bytes[index + 1]
evolved.batch_remove(query, __table_unpack(bytes, index + 2, index + 1 + fragment_count))
local batch_remove = evolved.batch_remove
if fragment_count == 0 then
-- nothing
elseif fragment_count == 1 then
local f1 = bytes[index + 2]
batch_remove(query, f1)
elseif fragment_count == 2 then
local f1, f2 = bytes[index + 2], bytes[index + 3]
batch_remove(query, f1, f2)
elseif fragment_count == 3 then
local f1, f2, f3 = bytes[index + 2], bytes[index + 3], bytes[index + 4]
batch_remove(query, f1, f2, f3)
else
local f1, f2, f3 = bytes[index + 2], bytes[index + 3], bytes[index + 4]
batch_remove(query, f1, f2, f3,
__table_unpack(bytes, index + 5, index + 1 + fragment_count))
end
return 2 + fragment_count return 2 + fragment_count
end end