Skip to content

Commit 7a1586b

Browse files
committed
feat(sugar): raise OSError now raises PyOSError over Nim's...
... in general, `raise Xx` will try raise new[Py]Xx first
1 parent 4625dcc commit 7a1586b

File tree

1 file changed

+26
-7
lines changed

1 file changed

+26
-7
lines changed

src/pylib/pysugar/stmt/pyraise.nim

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,38 @@
33

44
import std/macros
55

6+
proc add_parent(e: ref Exception; e2: ref Exception): ref Exception =
7+
result = e
8+
result.parent = e2
9+
610
func rewriteRaiseImpl(res: var NimNode, raiseCont: NimNode, parent=newNilLit()): bool =
711
var msg = newLit ""
12+
res = newNimNode nnkWhenStmt
13+
template callIfValid(chkDest, dest) =
14+
res.add nnkElifExpr.newTree(
15+
newCall("compiles", chkDest),
16+
dest
17+
)
18+
template callAddParent(ori) =
19+
callIfValid(ori,
20+
newCall(bindSym"add_parent", ori, parent)
21+
)
822
template rewriteWith(err: NimNode){.dirty.} =
23+
callAddParent(
24+
newCall("newPy" & err.strVal, msg))
25+
callAddParent(
26+
newCall("new" & err.strVal, msg))
927
let nExc = newCall("newException", err, msg, parent)
28+
callIfValid(nExc, nExc)
29+
res.add(
1030
# User may define some routinues that are used in `raise`,
11-
res = nnkWhenStmt.newTree(
12-
nnkElifExpr.newTree(
13-
newCall(bindSym"compiles", nExc), nExc
14-
),
1531
nnkElseExpr.newTree(
1632
raiseCont
1733
)
1834
)
1935
#[
20-
when compiles(`nExc`):
36+
when ...
37+
elif compiles(`nExc`):
2138
`nExc`
2239
else:
2340
`raiseCont`
@@ -45,8 +62,10 @@ func rewriteRaiseImpl(res: var NimNode, raiseCont: NimNode, parent=newNilLit()):
4562
return
4663

4764
proc rewriteRaise*(rStmt: NimNode): NimNode =
48-
## Rewrites `raise ErrType/ErrType()/ErrType(msg)`
49-
## to `raise newException(ErrType, msg/"")`
65+
## - Rewrites `raise ErrType/ErrType()/ErrType(msg)`
66+
## to `raise newException(ErrType, msg/"")`
67+
## - Rewrites `raise XxError[(...)]` to `raise new[Py]XxError(...)`
68+
## - Rewrites `raise XxError[(...)] from P` to `raise new[Py]OSError(...).add_parent(P)`
5069
##
5170
## assume `rStmt` is nnkRaiseStmt
5271
var res: NimNode

0 commit comments

Comments
 (0)