Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fixes #10981; fixes #7261 #12217

Merged
merged 1 commit into from
Sep 19, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion compiler/vmgen.nim
Original file line number Diff line number Diff line change
Expand Up @@ -1361,6 +1361,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 @@ -2232,7 +2235,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!"