Corrected nkExceptBranch transformation
This commit is contained in:
parent
14ca79fe1f
commit
c854865d3e
1 changed files with 24 additions and 13 deletions
|
|
@ -313,33 +313,44 @@ proc newNullifyCurExc(ctx: var Ctx): PNode =
|
||||||
nilnode.typ = curExc.typ
|
nilnode.typ = curExc.typ
|
||||||
result.add(nilnode)
|
result.add(nilnode)
|
||||||
|
|
||||||
|
proc newOr(a, b: PNode): PNode =
|
||||||
|
result = newNode(nkCall)
|
||||||
|
result.add(newSymNode(getSysMagic("or", mOr)))
|
||||||
|
result.add(a)
|
||||||
|
result.add(b)
|
||||||
|
result.typ = getSysType(tyBool)
|
||||||
|
|
||||||
proc collectExceptState(ctx: var Ctx, n: PNode): PNode =
|
proc collectExceptState(ctx: var Ctx, n: PNode): PNode =
|
||||||
var ifStmt = newNode(nkIfStmt)
|
var ifStmt = newNode(nkIfStmt)
|
||||||
for c in n:
|
for c in n:
|
||||||
if c.kind == nkExceptBranch:
|
if c.kind == nkExceptBranch:
|
||||||
var ifBranch: PNode
|
var ifBranch: PNode
|
||||||
var branchBody: PNode
|
|
||||||
|
|
||||||
if c[0].kind == nkType:
|
if c.len > 1:
|
||||||
assert(c.len == 2)
|
var cond: PNode
|
||||||
|
for i in 0 .. c.len - 2:
|
||||||
|
assert(c[i].kind == nkType)
|
||||||
|
let nextCond = newNodeI(nkCall, n.info)
|
||||||
|
nextCond.add(newSymNode(getSysMagic("of", mOf)))
|
||||||
|
nextCond.add(callCodegenProc("getCurrentException", emptyNode))
|
||||||
|
nextCond.add(c[i])
|
||||||
|
nextCond.typ = getSysType(tyBool)
|
||||||
|
|
||||||
|
if cond.isNil:
|
||||||
|
cond = nextCond
|
||||||
|
else:
|
||||||
|
cond = newOr(cond, nextCond)
|
||||||
|
|
||||||
ifBranch = newNode(nkElifBranch)
|
ifBranch = newNode(nkElifBranch)
|
||||||
let expression = newNodeI(nkCall, n.info)
|
ifBranch.add(cond)
|
||||||
expression.add(newSymNode(getSysMagic("of", mOf)))
|
|
||||||
expression.add(callCodegenProc("getCurrentException", emptyNode))
|
|
||||||
expression.add(c[0])
|
|
||||||
expression.typ = getSysType(tyBool)
|
|
||||||
ifBranch.add(expression)
|
|
||||||
branchBody = c[1]
|
|
||||||
else:
|
else:
|
||||||
assert(c.len == 1)
|
|
||||||
if ifStmt.len == 0:
|
if ifStmt.len == 0:
|
||||||
ifStmt = newNode(nkStmtList)
|
ifStmt = newNode(nkStmtList)
|
||||||
ifBranch = newNode(nkStmtList)
|
ifBranch = newNode(nkStmtList)
|
||||||
else:
|
else:
|
||||||
ifBranch = newNode(nkElse)
|
ifBranch = newNode(nkElse)
|
||||||
branchBody = c[0]
|
|
||||||
|
|
||||||
ifBranch.add(branchBody)
|
ifBranch.add(c[^1])
|
||||||
ifStmt.add(ifBranch)
|
ifStmt.add(ifBranch)
|
||||||
|
|
||||||
if ifStmt.len != 0:
|
if ifStmt.len != 0:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue