Skip to content

Commit 04f6a30

Browse files
committed
Fix conflicting RegisterEvent systems
1 parent 71050a0 commit 04f6a30

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

src/necsus/compiletime/registerSystemGen.nim

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import macros
1+
import macros, strutils
22
import common, systemGen, ../runtime/directives
3+
import ../util/nimNode
34

45
proc fields(name: string): seq[WorldField] =
56
@[(name, bindSym("DynamicSystem"))]
@@ -26,12 +27,16 @@ proc generate(details: GenerateContext, arg: SystemArg, name: string): NimNode =
2627
else:
2728
return newEmptyNode()
2829

30+
proc chooseRegisterSystemName(context, name: NimNode): string =
31+
var hash: string
32+
hash.addSignature(context)
33+
context.symbols.join("_") & "_" & hash & "_" & name.strVal
34+
2935
let registerSystemGenerator* {.compileTime.} = newGenerator(
3036
ident = "RegisterSystem",
3137
interest = {Standard, LoopInPlace},
3238
generate = generate,
3339
worldFields = fields,
3440
systemArg = sysArg,
35-
chooseName = proc(context, name: NimNode): string =
36-
name.strVal,
41+
chooseName = chooseRegisterSystemName,
3742
)

tests/t_registerSystem_multi.nim

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import unittest, necsus
2+
3+
var value: seq[string]
4+
5+
proc systemA(system: RegisterSystem) {.startupSys.} =
6+
system do() -> void:
7+
value.add("a")
8+
9+
proc systemB(system: RegisterSystem) {.startupSys.} =
10+
system do() -> void:
11+
value.add("b")
12+
13+
proc runner(tick: proc(): void) =
14+
tick()
15+
16+
proc app() {.necsus(runner, [~systemA, ~systemB], newNecsusConf()).}
17+
18+
test "RegisterSystems from multiple systems should all have their own storage":
19+
app()
20+
check "a" in value
21+
check "b" in value

0 commit comments

Comments
 (0)