Skip to content

Commit 3ca898b

Browse files
committed
new evolved.error_handler function
#45
1 parent e4166b7 commit 3ca898b

3 files changed

Lines changed: 101 additions & 67 deletions

File tree

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1587,6 +1587,7 @@ process :: system... -> ()
15871587
process_with :: system, ... -> ()
15881588
15891589
debug_mode :: boolean -> ()
1590+
error_handler :: {string -> string}? -> ()
15901591
collect_garbage :: boolean? -> ()
15911592
```
15921593

@@ -1682,6 +1683,7 @@ builder_mt:destruction_policy :: id -> builder
16821683

16831684
- Slightly improved performance of modifying operations for fragments with [`ON_INSERT`](#evolvedon_insert) and [`ON_REMOVE`](#evolvedon_remove) hooks
16841685
- Slightly improved performance of queries with [`EXPLICIT`](#evolvedexplicit) fragments
1686+
- Added the new [`evolved.error_handler`](#evolvederror_handler) function that allows setting a custom error handler for better system processing debugging experience
16851687

16861688
### v1.10.0
16871689

@@ -2202,6 +2204,13 @@ function evolved.process_with(system, ...) end
22022204
function evolved.debug_mode(yesno) end
22032205
```
22042206

2207+
### `evolved.error_handler`
2208+
2209+
```lua
2210+
---@param handler? fun(message: string): string
2211+
function evolved.error_handler(handler) end
2212+
```
2213+
22052214
### `evolved.collect_garbage`
22062215

22072216
```lua

evolved.lua

Lines changed: 84 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -120,49 +120,6 @@ local evolved = {
120120
---
121121
---
122122

123-
local __debug_mode = false ---@type boolean
124-
125-
local __freelist_ids = {} ---@type integer[]
126-
local __acquired_count = 0 ---@type integer
127-
local __available_primary = 0 ---@type integer
128-
129-
local __defer_depth = 0 ---@type integer
130-
local __defer_points = {} ---@type integer[]
131-
local __defer_length = 0 ---@type integer
132-
local __defer_bytecode = {} ---@type any[]
133-
134-
local __root_set = {} ---@type table<evolved.fragment, integer>
135-
local __root_list = {} ---@type evolved.chunk[]
136-
local __root_count = 0 ---@type integer
137-
138-
local __major_chunks = {} ---@type table<evolved.fragment, evolved.assoc_list<evolved.chunk>>
139-
local __minor_chunks = {} ---@type table<evolved.fragment, evolved.assoc_list<evolved.chunk>>
140-
141-
local __query_chunks = {} ---@type table<evolved.query, evolved.assoc_list<evolved.chunk>>
142-
local __major_queries = {} ---@type table<evolved.fragment, evolved.assoc_list<evolved.query>>
143-
144-
local __entity_chunks = {} ---@type (evolved.chunk|false)[]
145-
local __entity_places = {} ---@type integer[]
146-
147-
local __named_entity = {} ---@type table<string, evolved.entity>
148-
local __named_entities = {} ---@type table<string, evolved.assoc_list<evolved.entity>>
149-
150-
local __sorted_includes = {} ---@type table<evolved.query, evolved.assoc_list<evolved.fragment>>
151-
local __sorted_excludes = {} ---@type table<evolved.query, evolved.assoc_list<evolved.fragment>>
152-
local __sorted_variants = {} ---@type table<evolved.query, evolved.assoc_list<evolved.fragment>>
153-
local __sorted_requires = {} ---@type table<evolved.fragment, evolved.assoc_list<evolved.fragment>>
154-
155-
local __subsystem_groups = {} ---@type table<evolved.system, evolved.system>
156-
local __group_subsystems = {} ---@type table<evolved.system, evolved.assoc_list<evolved.system>>
157-
158-
local __structural_changes = 0 ---@type integer
159-
160-
---
161-
---
162-
---
163-
---
164-
---
165-
166123
---@class evolved.chunk
167124
---@field package __parent? evolved.chunk
168125
---@field package __child_set table<evolved.chunk, integer>
@@ -648,6 +605,50 @@ end
648605
---
649606
---
650607

608+
local __debug_mode = false ---@type boolean
609+
local __error_handler = __lua_debug_traceback ---@type fun(message: string): string
610+
611+
local __freelist_ids = {} ---@type integer[]
612+
local __acquired_count = 0 ---@type integer
613+
local __available_primary = 0 ---@type integer
614+
615+
local __defer_depth = 0 ---@type integer
616+
local __defer_points = {} ---@type integer[]
617+
local __defer_length = 0 ---@type integer
618+
local __defer_bytecode = {} ---@type any[]
619+
620+
local __root_set = {} ---@type table<evolved.fragment, integer>
621+
local __root_list = {} ---@type evolved.chunk[]
622+
local __root_count = 0 ---@type integer
623+
624+
local __major_chunks = {} ---@type table<evolved.fragment, evolved.assoc_list<evolved.chunk>>
625+
local __minor_chunks = {} ---@type table<evolved.fragment, evolved.assoc_list<evolved.chunk>>
626+
627+
local __query_chunks = {} ---@type table<evolved.query, evolved.assoc_list<evolved.chunk>>
628+
local __major_queries = {} ---@type table<evolved.fragment, evolved.assoc_list<evolved.query>>
629+
630+
local __entity_chunks = {} ---@type (evolved.chunk|false)[]
631+
local __entity_places = {} ---@type integer[]
632+
633+
local __named_entity = {} ---@type table<string, evolved.entity>
634+
local __named_entities = {} ---@type table<string, evolved.assoc_list<evolved.entity>>
635+
636+
local __sorted_includes = {} ---@type table<evolved.query, evolved.assoc_list<evolved.fragment>>
637+
local __sorted_excludes = {} ---@type table<evolved.query, evolved.assoc_list<evolved.fragment>>
638+
local __sorted_variants = {} ---@type table<evolved.query, evolved.assoc_list<evolved.fragment>>
639+
local __sorted_requires = {} ---@type table<evolved.fragment, evolved.assoc_list<evolved.fragment>>
640+
641+
local __subsystem_groups = {} ---@type table<evolved.system, evolved.system>
642+
local __group_subsystems = {} ---@type table<evolved.system, evolved.assoc_list<evolved.system>>
643+
644+
local __structural_changes = 0 ---@type integer
645+
646+
---
647+
---
648+
---
649+
---
650+
---
651+
651652
---@return evolved.id
652653
---@nodiscard
653654
local function __acquire_id()
@@ -1233,6 +1234,7 @@ local __evolved_process
12331234
local __evolved_process_with
12341235

12351236
local __evolved_debug_mode
1237+
local __evolved_error_handler
12361238
local __evolved_collect_garbage
12371239

12381240
local __evolved_chunk
@@ -4768,7 +4770,7 @@ local function __system_process(system, ...)
47684770
__QUERY, __EXECUTE, __PROLOGUE, __EPILOGUE)
47694771

47704772
if prologue then
4771-
local success, result = __lua_xpcall(prologue, __lua_debug_traceback, ...)
4773+
local success, result = __lua_xpcall(prologue, __error_handler, ...)
47724774

47734775
if not success then
47744776
__error_fmt('system prologue failed: %s', result)
@@ -4778,7 +4780,7 @@ local function __system_process(system, ...)
47784780
if execute then
47794781
__evolved_defer()
47804782
do
4781-
local success, result = __lua_xpcall(__query_execute, __lua_debug_traceback, query or system, execute, ...)
4783+
local success, result = __lua_xpcall(__query_execute, __error_handler, query or system, execute, ...)
47824784

47834785
if not success then
47844786
__evolved_cancel()
@@ -4814,7 +4816,7 @@ local function __system_process(system, ...)
48144816
end
48154817

48164818
if epilogue then
4817-
local success, result = __lua_xpcall(epilogue, __lua_debug_traceback, ...)
4819+
local success, result = __lua_xpcall(epilogue, __error_handler, ...)
48184820

48194821
if not success then
48204822
__error_fmt('system epilogue failed: %s', result)
@@ -6413,6 +6415,11 @@ function __evolved_debug_mode(yesno)
64136415
__debug_mode = yesno
64146416
end
64156417

6418+
---@param handler? fun(message: string): string
6419+
function __evolved_error_handler(handler)
6420+
__error_handler = handler or __lua_debug_traceback
6421+
end
6422+
64166423
---@param no_shrink boolean?
64176424
function __evolved_collect_garbage(no_shrink)
64186425
if __defer_depth > 0 then
@@ -7601,8 +7608,10 @@ end)
76017608
---
76027609
---
76037610

7611+
local __query_hook_fns = {}
7612+
76047613
---@param query evolved.query
7605-
local function __insert_query(query)
7614+
function __query_hook_fns.insert_query(query)
76067615
local query_includes = __sorted_includes[query]
76077616
local query_include_list = query_includes and query_includes.__item_list
76087617
local query_include_count = query_includes and query_includes.__item_count or 0
@@ -7642,7 +7651,7 @@ local function __insert_query(query)
76427651
end
76437652

76447653
---@param query evolved.query
7645-
local function __remove_query(query)
7654+
function __query_hook_fns.remove_query(query)
76467655
local query_includes = __sorted_includes[query]
76477656
local query_include_list = query_includes and query_includes.__item_list
76487657
local query_include_count = query_includes and query_includes.__item_count or 0
@@ -7684,7 +7693,7 @@ end
76847693
---@param query evolved.query
76857694
---@param include_list evolved.fragment[]
76867695
__evolved_set(__INCLUDES, __ON_SET, function(query, _, include_list)
7687-
__remove_query(query)
7696+
__query_hook_fns.remove_query(query)
76887697

76897698
local include_count = #include_list
76907699

@@ -7700,16 +7709,16 @@ __evolved_set(__INCLUDES, __ON_SET, function(query, _, include_list)
77007709
__sorted_includes[query] = nil
77017710
end
77027711

7703-
__insert_query(query)
7712+
__query_hook_fns.insert_query(query)
77047713
__update_major_chunks(query)
77057714
end)
77067715

77077716
__evolved_set(__INCLUDES, __ON_REMOVE, function(query)
7708-
__remove_query(query)
7717+
__query_hook_fns.remove_query(query)
77097718

77107719
__sorted_includes[query] = nil
77117720

7712-
__insert_query(query)
7721+
__query_hook_fns.insert_query(query)
77137722
__update_major_chunks(query)
77147723
end)
77157724

@@ -7722,7 +7731,7 @@ end)
77227731
---@param query evolved.query
77237732
---@param exclude_list evolved.fragment[]
77247733
__evolved_set(__EXCLUDES, __ON_SET, function(query, _, exclude_list)
7725-
__remove_query(query)
7734+
__query_hook_fns.remove_query(query)
77267735

77277736
local exclude_count = #exclude_list
77287737

@@ -7738,16 +7747,16 @@ __evolved_set(__EXCLUDES, __ON_SET, function(query, _, exclude_list)
77387747
__sorted_excludes[query] = nil
77397748
end
77407749

7741-
__insert_query(query)
7750+
__query_hook_fns.insert_query(query)
77427751
__update_major_chunks(query)
77437752
end)
77447753

77457754
__evolved_set(__EXCLUDES, __ON_REMOVE, function(query)
7746-
__remove_query(query)
7755+
__query_hook_fns.remove_query(query)
77477756

77487757
__sorted_excludes[query] = nil
77497758

7750-
__insert_query(query)
7759+
__query_hook_fns.insert_query(query)
77517760
__update_major_chunks(query)
77527761
end)
77537762

@@ -7760,7 +7769,7 @@ end)
77607769
---@param query evolved.query
77617770
---@param variant_list evolved.fragment[]
77627771
__evolved_set(__VARIANTS, __ON_SET, function(query, _, variant_list)
7763-
__remove_query(query)
7772+
__query_hook_fns.remove_query(query)
77647773

77657774
local variant_count = #variant_list
77667775

@@ -7776,16 +7785,16 @@ __evolved_set(__VARIANTS, __ON_SET, function(query, _, variant_list)
77767785
__sorted_variants[query] = nil
77777786
end
77787787

7779-
__insert_query(query)
7788+
__query_hook_fns.insert_query(query)
77807789
__update_major_chunks(query)
77817790
end)
77827791

77837792
__evolved_set(__VARIANTS, __ON_REMOVE, function(query)
7784-
__remove_query(query)
7793+
__query_hook_fns.remove_query(query)
77857794

77867795
__sorted_variants[query] = nil
77877796

7788-
__insert_query(query)
7797+
__query_hook_fns.insert_query(query)
77897798
__update_major_chunks(query)
77907799
end)
77917800

@@ -7826,8 +7835,10 @@ end)
78267835
---
78277836
---
78287837

7838+
local __group_hook_fns = {}
7839+
78297840
---@param subsystem evolved.system
7830-
local function __add_subsystem(subsystem)
7841+
function __group_hook_fns.add_subsystem(subsystem)
78317842
local subsystem_group = __subsystem_groups[subsystem]
78327843

78337844
if subsystem_group then
@@ -7844,7 +7855,7 @@ local function __add_subsystem(subsystem)
78447855
end
78457856

78467857
---@param subsystem evolved.system
7847-
local function __remove_subsystem(subsystem)
7858+
function __group_hook_fns.remove_subsystem(subsystem)
78487859
local subsystem_group = __subsystem_groups[subsystem]
78497860

78507861
if subsystem_group then
@@ -7856,23 +7867,29 @@ local function __remove_subsystem(subsystem)
78567867
end
78577868
end
78587869

7870+
---
7871+
---
7872+
---
7873+
---
7874+
---
7875+
78597876
---@param system evolved.system
78607877
__evolved_set(__GROUP, __ON_SET, function(system, _, group)
7861-
__remove_subsystem(system)
7878+
__group_hook_fns.remove_subsystem(system)
78627879

78637880
__subsystem_groups[system] = group
78647881

7865-
__add_subsystem(system)
7882+
__group_hook_fns.add_subsystem(system)
78667883
__update_major_chunks(system)
78677884
end)
78687885

78697886
---@param system evolved.system
78707887
__evolved_set(__GROUP, __ON_REMOVE, function(system)
7871-
__remove_subsystem(system)
7888+
__group_hook_fns.remove_subsystem(system)
78727889

78737890
__subsystem_groups[system] = nil
78747891

7875-
__add_subsystem(system)
7892+
__group_hook_fns.add_subsystem(system)
78767893
__update_major_chunks(system)
78777894
end)
78787895

@@ -7984,6 +8001,7 @@ evolved.process = __evolved_process
79848001
evolved.process_with = __evolved_process_with
79858002

79868003
evolved.debug_mode = __evolved_debug_mode
8004+
evolved.error_handler = __evolved_error_handler
79878005
evolved.collect_garbage = __evolved_collect_garbage
79888006

79898007
evolved.chunk = __evolved_chunk

example/conf.lua

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
if os.getenv('LOCAL_LUA_DEBUGGER_VSCODE') == '1' then
2-
require('lldebugger').start()
2+
local debugger = require 'lldebugger'
3+
debugger.start()
4+
5+
local evolved = require 'evolved'
6+
evolved.error_handler(function(err)
7+
debugger.requestBreak()
8+
return debug.traceback(err)
9+
end)
310
end
411

512
---@type love.conf

0 commit comments

Comments
 (0)