mirror of
https://github.com/BlackMATov/evolved.lua.git
synced 2025-12-14 12:10:23 +07:00
use xpcall to process systems
This commit is contained in:
1
.vscode/settings.json
vendored
1
.vscode/settings.json
vendored
@@ -8,7 +8,6 @@
|
|||||||
"markdown.extension.toc.levels": "2..6",
|
"markdown.extension.toc.levels": "2..6",
|
||||||
"markdown.extension.toc.omittedFromToc": {
|
"markdown.extension.toc.omittedFromToc": {
|
||||||
"README.md": [
|
"README.md": [
|
||||||
"# Changelog",
|
|
||||||
"# API Reference"
|
"# API Reference"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
24
README.md
24
README.md
@@ -57,6 +57,11 @@
|
|||||||
- [Classes](#classes)
|
- [Classes](#classes)
|
||||||
- [Chunk](#chunk)
|
- [Chunk](#chunk)
|
||||||
- [Builder](#builder)
|
- [Builder](#builder)
|
||||||
|
- [Changelog](#changelog)
|
||||||
|
- [vX.X.X](#vxxx)
|
||||||
|
- [v1.2.0](#v120)
|
||||||
|
- [v1.1.0](#v110)
|
||||||
|
- [v1.0.0](#v100)
|
||||||
- [License](#license)
|
- [License](#license)
|
||||||
|
|
||||||
## Introduction
|
## Introduction
|
||||||
@@ -1246,32 +1251,33 @@ builder_mt:epilogue :: {} -> builder
|
|||||||
builder_mt:destruction_policy :: id -> builder
|
builder_mt:destruction_policy :: id -> builder
|
||||||
```
|
```
|
||||||
|
|
||||||
## License
|
## Changelog
|
||||||
|
|
||||||
`evolved.lua` is licensed under the [MIT License][license]. For more details, see the [LICENSE.md](./LICENSE.md) file in the repository.
|
### vX.X.X
|
||||||
|
|
||||||
# Changelog
|
|
||||||
|
|
||||||
## vX.X.X
|
|
||||||
|
|
||||||
- The internal garbage collector now collects more garbage
|
- The internal garbage collector now collects more garbage
|
||||||
- Added the new [`evolved.cancel`](#evolvedcancel) function
|
- Added the new [`evolved.cancel`](#evolvedcancel) function
|
||||||
|
- Improved system processing debugging experience with stack traces on errors
|
||||||
|
|
||||||
## v1.2.0
|
### v1.2.0
|
||||||
|
|
||||||
- Added the new [`evolved.name`](#evolvedname-1) function
|
- Added the new [`evolved.name`](#evolvedname-1) function
|
||||||
- Added the new [`evolved.multi_spawn`](#evolvedmulti_spawn) and [`evolved.multi_clone`](#evolvedmulti_clone) functions
|
- Added the new [`evolved.multi_spawn`](#evolvedmulti_spawn) and [`evolved.multi_clone`](#evolvedmulti_clone) functions
|
||||||
- Added the new [`evolved.INTERNAL`](#evolvedinternal) fragment trait
|
- Added the new [`evolved.INTERNAL`](#evolvedinternal) fragment trait
|
||||||
|
|
||||||
## v1.1.0
|
### v1.1.0
|
||||||
|
|
||||||
- [`Systems`](#systems) can be queries themselves now
|
- [`Systems`](#systems) can be queries themselves now
|
||||||
- Added the new [`evolved.REQUIRES`](#evolvedrequires) fragment trait
|
- Added the new [`evolved.REQUIRES`](#evolvedrequires) fragment trait
|
||||||
|
|
||||||
## v1.0.0
|
### v1.0.0
|
||||||
|
|
||||||
- Initial release
|
- Initial release
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
`evolved.lua` is licensed under the [MIT License][license]. For more details, see the [LICENSE.md](./LICENSE.md) file in the repository.
|
||||||
|
|
||||||
# API Reference
|
# API Reference
|
||||||
|
|
||||||
## Predefs
|
## Predefs
|
||||||
|
|||||||
61
evolved.lua
61
evolved.lua
@@ -191,7 +191,6 @@ __builder_mt.__index = __builder_mt
|
|||||||
|
|
||||||
local __lua_error = error
|
local __lua_error = error
|
||||||
local __lua_next = next
|
local __lua_next = next
|
||||||
local __lua_pcall = pcall
|
|
||||||
local __lua_print = print
|
local __lua_print = print
|
||||||
local __lua_select = select
|
local __lua_select = select
|
||||||
local __lua_setmetatable = setmetatable
|
local __lua_setmetatable = setmetatable
|
||||||
@@ -199,6 +198,7 @@ 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
|
local __lua_tostring = tostring
|
||||||
|
local __lua_xpcall = xpcall
|
||||||
|
|
||||||
---@type fun(narray: integer, nhash: integer): table
|
---@type fun(narray: integer, nhash: integer): table
|
||||||
local __lua_table_new = (function()
|
local __lua_table_new = (function()
|
||||||
@@ -207,7 +207,7 @@ local __lua_table_new = (function()
|
|||||||
-- https://forum.defold.com/t/solved-is-luajit-table-new-function-available-in-defold/78623
|
-- https://forum.defold.com/t/solved-is-luajit-table-new-function-available-in-defold/78623
|
||||||
|
|
||||||
do
|
do
|
||||||
---@diagnostic disable-next-line: undefined-field
|
---@diagnostic disable-next-line: deprecated, undefined-field
|
||||||
local table_new = table and table.new
|
local table_new = table and table.new
|
||||||
if table_new then
|
if table_new then
|
||||||
---@cast table_new fun(narray: integer, nhash: integer): table
|
---@cast table_new fun(narray: integer, nhash: integer): table
|
||||||
@@ -216,7 +216,7 @@ local __lua_table_new = (function()
|
|||||||
end
|
end
|
||||||
|
|
||||||
do
|
do
|
||||||
---@diagnostic disable-next-line: undefined-field
|
---@diagnostic disable-next-line: deprecated, undefined-field
|
||||||
local table_create = table and table.create
|
local table_create = table and table.create
|
||||||
if table_create then
|
if table_create then
|
||||||
---@cast table_create fun(count: integer, value: any): table
|
---@cast table_create fun(count: integer, value: any): table
|
||||||
@@ -248,7 +248,7 @@ local __lua_table_clear = (function()
|
|||||||
-- https://forum.defold.com/t/solved-is-luajit-table-new-function-available-in-defold/78623
|
-- https://forum.defold.com/t/solved-is-luajit-table-new-function-available-in-defold/78623
|
||||||
|
|
||||||
do
|
do
|
||||||
---@diagnostic disable-next-line: undefined-field
|
---@diagnostic disable-next-line: deprecated, undefined-field
|
||||||
local table_clear = table and table.clear
|
local table_clear = table and table.clear
|
||||||
if table_clear then
|
if table_clear then
|
||||||
---@cast table_clear fun(tab: table)
|
---@cast table_clear fun(tab: table)
|
||||||
@@ -279,7 +279,7 @@ local __lua_table_move = (function()
|
|||||||
-- https://create.roblox.com/docs/reference/engine/libraries/table#move
|
-- https://create.roblox.com/docs/reference/engine/libraries/table#move
|
||||||
|
|
||||||
do
|
do
|
||||||
---@diagnostic disable-next-line: deprecated
|
---@diagnostic disable-next-line: deprecated, undefined-field
|
||||||
local table_move = table and table.move
|
local table_move = table and table.move
|
||||||
if table_move then
|
if table_move then
|
||||||
---@cast table_move fun(a1: table, f: integer, e: integer, t: integer, a2?: table): table
|
---@cast table_move fun(a1: table, f: integer, e: integer, t: integer, a2?: table): table
|
||||||
@@ -316,18 +316,34 @@ end)()
|
|||||||
---@type fun(lst: table, i: integer, j: integer): ...
|
---@type fun(lst: table, i: integer, j: integer): ...
|
||||||
local __lua_table_unpack = (function()
|
local __lua_table_unpack = (function()
|
||||||
do
|
do
|
||||||
---@diagnostic disable-next-line: deprecated
|
---@diagnostic disable-next-line: deprecated, undefined-field
|
||||||
local table_unpack = unpack
|
local table_unpack = unpack
|
||||||
if table_unpack then return table_unpack end
|
if table_unpack then return table_unpack end
|
||||||
end
|
end
|
||||||
|
|
||||||
do
|
do
|
||||||
---@diagnostic disable-next-line: deprecated
|
---@diagnostic disable-next-line: deprecated, undefined-field
|
||||||
local table_unpack = table and table.unpack
|
local table_unpack = table and table.unpack
|
||||||
if table_unpack then return table_unpack end
|
if table_unpack then return table_unpack end
|
||||||
end
|
end
|
||||||
end)()
|
end)()
|
||||||
|
|
||||||
|
---@type fun(message?: any, level?: integer): string
|
||||||
|
local __lua_debug_traceback = (function()
|
||||||
|
do
|
||||||
|
---@diagnostic disable-next-line: deprecated, undefined-field
|
||||||
|
local debug_traceback = debug and debug.traceback
|
||||||
|
if debug_traceback then
|
||||||
|
return debug_traceback
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
---@type fun(message?: any, level?: integer): string
|
||||||
|
return function(message)
|
||||||
|
return __lua_tostring(message)
|
||||||
|
end
|
||||||
|
end)()
|
||||||
|
|
||||||
---
|
---
|
||||||
---
|
---
|
||||||
---
|
---
|
||||||
@@ -344,8 +360,8 @@ end
|
|||||||
---@param fmt string
|
---@param fmt string
|
||||||
---@param ... any
|
---@param ... any
|
||||||
local function __warning_fmt(fmt, ...)
|
local function __warning_fmt(fmt, ...)
|
||||||
__lua_print(__lua_string_format('| evolved.lua (w) | %s',
|
__lua_print(__lua_debug_traceback(__lua_string_format('| evolved.lua (w) | %s',
|
||||||
__lua_string_format(fmt, ...)))
|
__lua_string_format(fmt, ...))))
|
||||||
end
|
end
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -4446,6 +4462,24 @@ function __iterator_fns.__execute_iterator(execute_state)
|
|||||||
__release_table(__table_pool_tag.execute_state, execute_state, true)
|
__release_table(__table_pool_tag.execute_state, execute_state, true)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---@type { [1]: evolved.query, [2]: evolved.execute }
|
||||||
|
local __query_execute_external_arguments = {}
|
||||||
|
|
||||||
|
---@param query? evolved.query
|
||||||
|
---@param execute? evolved.execute
|
||||||
|
local function __query_execute(query, execute)
|
||||||
|
-- we use the external arguments here to support lua 5.1 xpcall (which does not support argument passing)
|
||||||
|
-- also, we can not use upvalues directly, because the function may be called recursively in that case
|
||||||
|
-- storing the arguments in local variables makes them invulnerable to changes during recursive calls
|
||||||
|
|
||||||
|
query = query or __query_execute_external_arguments[1]
|
||||||
|
execute = execute or __query_execute_external_arguments[2]
|
||||||
|
|
||||||
|
for chunk, entity_list, entity_count in __evolved_execute(query) do
|
||||||
|
execute(chunk, entity_list, entity_count)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
---@param system evolved.system
|
---@param system evolved.system
|
||||||
local function __system_process(system)
|
local function __system_process(system)
|
||||||
---@type evolved.query?, evolved.execute?, evolved.prologue?, evolved.epilogue?
|
---@type evolved.query?, evolved.execute?, evolved.prologue?, evolved.epilogue?
|
||||||
@@ -4453,7 +4487,7 @@ local function __system_process(system)
|
|||||||
__QUERY, __EXECUTE, __PROLOGUE, __EPILOGUE)
|
__QUERY, __EXECUTE, __PROLOGUE, __EPILOGUE)
|
||||||
|
|
||||||
if prologue then
|
if prologue then
|
||||||
local success, result = __lua_pcall(prologue)
|
local success, result = __lua_xpcall(prologue, __lua_debug_traceback)
|
||||||
|
|
||||||
if not success then
|
if not success then
|
||||||
__error_fmt('system prologue failed: %s', result)
|
__error_fmt('system prologue failed: %s', result)
|
||||||
@@ -4462,8 +4496,9 @@ local function __system_process(system)
|
|||||||
|
|
||||||
if execute then
|
if execute then
|
||||||
__evolved_defer()
|
__evolved_defer()
|
||||||
for chunk, entity_list, entity_count in __evolved_execute(query or system) do
|
do
|
||||||
local success, result = __lua_pcall(execute, chunk, entity_list, entity_count)
|
__query_execute_external_arguments[1], __query_execute_external_arguments[2] = query or system, execute
|
||||||
|
local success, result = __lua_xpcall(__query_execute, __lua_debug_traceback, query or system, execute)
|
||||||
|
|
||||||
if not success then
|
if not success then
|
||||||
__evolved_cancel()
|
__evolved_cancel()
|
||||||
@@ -4497,7 +4532,7 @@ local function __system_process(system)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if epilogue then
|
if epilogue then
|
||||||
local success, result = __lua_pcall(epilogue)
|
local success, result = __lua_xpcall(epilogue, __lua_debug_traceback)
|
||||||
|
|
||||||
if not success then
|
if not success then
|
||||||
__error_fmt('system epilogue failed: %s', result)
|
__error_fmt('system epilogue failed: %s', result)
|
||||||
|
|||||||
Reference in New Issue
Block a user