nestedTryStmts removed

It makes tests fail and they work fine without. Given my ignorance of
the exact workings, I can only rely on the tests.
This commit is contained in:
Simon Hafner 2013-03-10 19:49:02 -05:00
commit d34f95d194
3 changed files with 15 additions and 23 deletions

View file

@ -44,7 +44,6 @@ type
TBlock{.final.} = object TBlock{.final.} = object
id: int # the ID of the label; positive means that it id: int # the ID of the label; positive means that it
# has been used (i.e. the label should be emitted) # has been used (i.e. the label should be emitted)
nestedTryStmts: int # how many try statements is it nested into
isLoop: bool # whether it's a 'block' or 'while' isLoop: bool # whether it's a 'block' or 'while'
TGlobals{.final.} = object TGlobals{.final.} = object
@ -62,7 +61,6 @@ type
module: BModule module: BModule
g: PGlobals g: PGlobals
BeforeRetNeeded: bool BeforeRetNeeded: bool
nestedTryStmts: int
unique: int unique: int
blocks: seq[TBlock] blocks: seq[TBlock]
@ -485,10 +483,6 @@ proc genLineDir(p: var TProc, n: PNode, r: var TCompRes) =
((p.prc == nil) or not (sfPure in p.prc.flags)): ((p.prc == nil) or not (sfPure in p.prc.flags)):
appf(r.com, "F.line = $1;$n", [toRope(line)]) appf(r.com, "F.line = $1;$n", [toRope(line)])
proc finishTryStmt(p: var TProc, r: var TCompRes, howMany: int) =
for i in countup(1, howMany):
app(r.com, "excHandler = excHandler.prev;" & tnl)
proc genWhileStmt(p: var TProc, n: PNode, r: var TCompRes) = proc genWhileStmt(p: var TProc, n: PNode, r: var TCompRes) =
var var
cond, stmt: TCompRes cond, stmt: TCompRes
@ -498,7 +492,6 @@ proc genWhileStmt(p: var TProc, n: PNode, r: var TCompRes) =
length = len(p.blocks) length = len(p.blocks)
setlen(p.blocks, length + 1) setlen(p.blocks, length + 1)
p.blocks[length].id = - p.unique p.blocks[length].id = - p.unique
p.blocks[length].nestedTryStmts = p.nestedTryStmts
p.blocks[length].isLoop = true p.blocks[length].isLoop = true
labl = p.unique labl = p.unique
gen(p, n.sons[0], cond) gen(p, n.sons[0], cond)
@ -543,7 +536,6 @@ proc genTryStmt(p: var TProc, n: PNode, r: var TCompRes) =
if optStackTrace in p.Options: app(r.com, "framePtr = F;" & tnl) if optStackTrace in p.Options: app(r.com, "framePtr = F;" & tnl)
app(r.com, "try {" & tnl) app(r.com, "try {" & tnl)
length = sonsLen(n) length = sonsLen(n)
inc(p.nestedTryStmts)
genStmt(p, n.sons[0], a) genStmt(p, n.sons[0], a)
app(r.com, mergeStmt(a)) app(r.com, mergeStmt(a))
i = 1 i = 1
@ -571,8 +563,6 @@ proc genTryStmt(p: var TProc, n: PNode, r: var TCompRes) =
appf(epart, "$1}$n", [mergeStmt(a)]) appf(epart, "$1}$n", [mergeStmt(a)])
inc(i) inc(i)
if epart != nil: appf(r.com, "} catch (EXC) {$n$1", [epart]) if epart != nil: appf(r.com, "} catch (EXC) {$n$1", [epart])
finishTryStmt(p, r, p.nestedTryStmts)
dec(p.nestedTryStmts)
app(r.com, "} finally {" & tnl & "excHandler = excHandler.prev;" & tnl) app(r.com, "} finally {" & tnl & "excHandler = excHandler.prev;" & tnl)
if (i < length) and (n.sons[i].kind == nkFinally): if (i < length) and (n.sons[i].kind == nkFinally):
genStmt(p, n.sons[i].sons[0], a) genStmt(p, n.sons[i].sons[0], a)
@ -655,7 +645,6 @@ proc genBlock(p: var TProc, n: PNode, r: var TCompRes) =
sym.loc.a = idx sym.loc.a = idx
setlen(p.blocks, idx + 1) setlen(p.blocks, idx + 1)
p.blocks[idx].id = - p.unique # negative because it isn't used yet p.blocks[idx].id = - p.unique # negative because it isn't used yet
p.blocks[idx].nestedTryStmts = p.nestedTryStmts
labl = p.unique labl = p.unique
if n.kind == nkBlockExpr: genStmtListExpr(p, n.sons[1], r) if n.kind == nkBlockExpr: genStmtListExpr(p, n.sons[1], r)
else: genStmt(p, n.sons[1], r) else: genStmt(p, n.sons[1], r)
@ -682,7 +671,6 @@ proc genBreakStmt(p: var TProc, n: PNode, r: var TCompRes) =
if idx < 0 or not p.blocks[idx].isLoop: if idx < 0 or not p.blocks[idx].isLoop:
InternalError(n.info, "no loop to break") InternalError(n.info, "no loop to break")
p.blocks[idx].id = abs(p.blocks[idx].id) # label is used p.blocks[idx].id = abs(p.blocks[idx].id) # label is used
finishTryStmt(p, r, p.nestedTryStmts - p.blocks[idx].nestedTryStmts)
appf(r.com, "break L$1;$n", [toRope(p.blocks[idx].id)]) appf(r.com, "break L$1;$n", [toRope(p.blocks[idx].id)])
proc genAsmStmt(p: var TProc, n: PNode, r: var TCompRes) = proc genAsmStmt(p: var TProc, n: PNode, r: var TCompRes) =
@ -1433,7 +1421,6 @@ proc genReturnStmt(p: var TProc, n: PNode, r: var TCompRes) =
if a.com != nil: appf(r.com, "$1;$n", mergeStmt(a)) if a.com != nil: appf(r.com, "$1;$n", mergeStmt(a))
else: else:
genLineDir(p, n, r) genLineDir(p, n, r)
finishTryStmt(p, r, p.nestedTryStmts)
app(r.com, "break BeforeRet;" & tnl) app(r.com, "break BeforeRet;" & tnl)
proc genProcBody(p: var TProc, prc: PSym, r: TCompRes): PRope = proc genProcBody(p: var TProc, prc: PSym, r: TCompRes): PRope =

View file

@ -1,6 +1,8 @@
discard """ discard """
file: "tfinally.nim" file: "tfinally.nim"
output: "came here 3" output: "came
here
3"
""" """
# Test return in try statement: # Test return in try statement:
@ -9,10 +11,10 @@ proc main: int =
try: try:
return 1 return 1
finally: finally:
stdout.write("came ") echo("came")
return 2 return 2
finally: finally:
stdout.write("here ") echo("here ")
return 3 return 3
echo main() #OUT came here 3 echo main() #OUT came here 3

View file

@ -1,6 +1,9 @@
discard """ discard """
file: "tfinally2.nim" file: "tfinally2.nim"
output: "ABCD" output: "A
B
C
D"
""" """
# Test break in try statement: # Test break in try statement:
@ -11,15 +14,15 @@ proc main: int =
try: try:
break AB break AB
finally: finally:
stdout.write("A") echo("A")
stdout.write("skipped") echo("skipped")
finally: finally:
block B: block B:
stdout.write("B") echo("B")
stdout.write("skipped") echo("skipped")
stdout.write("C") echo("C")
finally: finally:
stdout.writeln("D") echo("D")
discard main() #OUT ABCD discard main() #OUT ABCD