Skip to content

Commit

Permalink
fixes #10981; fixes #7261 (#12217)
Browse files Browse the repository at this point in the history
  • Loading branch information
Araq authored Sep 19, 2019
1 parent 363d0ad commit 162d74d
Show file tree
Hide file tree
Showing 2 changed files with 103 additions and 1 deletion.
5 changes: 4 additions & 1 deletion compiler/vmgen.nim
Original file line number Diff line number Diff line change
Expand Up @@ -1363,6 +1363,9 @@ proc unneededIndirection(n: PNode): bool =
n.typ.skipTypes(abstractInstOwned-{tyTypeDesc}).kind == tyRef

proc canElimAddr(n: PNode): PNode =
if n.sons[0].typ.skipTypes(abstractInst).kind in {tyObject, tyTuple, tyArray}:
# objects are reference types in the VM
return n[0]
case n.sons[0].kind
of nkObjUpConv, nkObjDownConv, nkChckRange, nkChckRangeF, nkChckRange64:
var m = n.sons[0].sons[0]
Expand Down Expand Up @@ -2234,7 +2237,7 @@ proc genProc(c: PCtx; s: PSym): int =
c.gABC(body, opcEof, eofInstr.regA)
c.optimizeJumps(result)
s.offset = c.prc.maxSlots
#if s.name.s == "main":
#if s.name.s == "main" or s.name.s == "[]":
# echo renderTree(body)
# c.echoCode(result)
c.prc = oldPrc
Expand Down
99 changes: 99 additions & 0 deletions tests/vm/tmisc_vm.nim
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ discard """
nimout: '''caught Exception
main:begin
main:end
@[{0}]
(width: 0, height: 0, path: "")
@[(width: 0, height: 0, path: ""), (width: 0, height: 0, path: "")]
Done!
'''
"""

Expand Down Expand Up @@ -81,3 +85,98 @@ proc simpleTryFinally()=
echo "main:end"

static: simpleTryFinally()

# bug #10981

import sets

proc main =
for i in 0..<15:
var someSets = @[initHashSet[int]()]
someSets[^1].incl(0) # <-- segfaults
if i == 0:
echo someSets

static:
main()

# bug #7261
const file = """
sprites.png
size: 1024,1024
format: RGBA8888
filter: Linear,Linear
repeat: none
char/slide_down
rotate: false
xy: 730, 810
size: 204, 116
orig: 204, 116
offset: 0, 0
index: -1
"""

type
AtlasPage = object
width, height: int
path: string

CtsStream = object
data: string
pos: int

proc atEnd(stream: CtsStream): bool =
stream.pos >= stream.data.len

proc readChar(stream: var CtsStream): char =
if stream.atEnd:
result = '\0'
else:
result = stream.data[stream.pos]
inc stream.pos

proc readLine(s: var CtsStream, line: var string): bool =
# This is pretty much copied from the standard library:
line.setLen(0)
while true:
var c = readChar(s)
if c == '\c':
c = readChar(s)
break
elif c == '\L': break
elif c == '\0':
if line.len > 0: break
else: return false
line.add(c)
result = true

proc peekLine(s: var CtsStream, line: var string): bool =
let oldPos = s.pos
result = s.readLine(line)
s.pos = oldPos

proc initCtsStream(data: string): CtsStream =
CtsStream(
pos: 0,
data: data
)

# ********************
# Interesting stuff happens here:
# ********************

proc parseAtlas(stream: var CtsStream) =
var pages = @[AtlasPage(), AtlasPage()]
var line = ""

block:
let page = addr pages[^1]
discard stream.peekLine(line)
discard stream.peekLine(line)
echo page[]
echo pages

static:
var stream = initCtsStream(file)
parseAtlas(stream)
echo "Done!"

0 comments on commit 162d74d

Please sign in to comment.