blob: 8662136e7063a50055279cf1899c5d76b9e8ba34 (
plain) (
tree)
|
|
discard """
output: '''BEGIN
END
END 2
cpu.nes false
cpu step nes is nil? - false
0'''
cmd: '''nim c --gc:orc $file'''
"""
# extracted from thavlak.nim
type
BasicBlock = ref object
inEdges: seq[BasicBlock]
outEdges: seq[BasicBlock]
name: int
proc newBasicBlock(name: int): BasicBlock =
result = BasicBlock(
inEdges: newSeq[BasicBlock](),
outEdges: newSeq[BasicBlock](),
name: name
)
type
Cfg = object
basicBlockMap: seq[BasicBlock]
startNode: BasicBlock
proc newCfg(): Cfg =
result = Cfg(
basicBlockMap: newSeq[BasicBlock](),
startNode: nil)
proc createNode(cfg: var Cfg, name: int): BasicBlock =
if name < cfg.basicBlockMap.len:
result = cfg.basicBlockMap[name]
else:
result = newBasicBlock(name)
cfg.basicBlockMap.setLen name+1
cfg.basicBlockMap[name] = result
proc newBasicBlockEdge(cfg: var Cfg, fromName, toName: int) =
echo "BEGIN"
let fr = cfg.createNode(fromName)
let to = cfg.createNode(toName)
fr.outEdges.add(to)
to.inEdges.add(fr)
proc run(cfg: var Cfg) =
cfg.startNode = cfg.createNode(0) # RC = 2
newBasicBlockEdge(cfg, 0, 1) #
echo "END"
discard cfg.createNode(1)
proc main =
var c = newCfg()
c.run
echo "END 2"
# bug #14159
type
NES = ref object
cpu: CPU
apu: APU
CPU = ref object
nes: NES
APU = object
nes: NES
cpu: CPU
proc initAPU(nes: sink NES): APU {.nosinks.} =
result.nes = nes
result.cpu = nes.cpu
proc step(cpu: CPU): int =
echo "cpu.nes ", cpu.isNil
echo "cpu step nes is nil? - ", cpu.nes.isNil()
proc newNES(): NES =
new result
result.cpu = CPU(nes: result)
result.apu = initAPU(result)
proc bug14159 =
var nesConsole = newNES()
discard nesConsole.cpu.step()
let mem = getOccupiedMem()
main()
bug14159()
GC_fullCollect()
echo getOccupiedMem() - mem
|