From 9a9c002abe8037944f5f736bb310862a91b59861 Mon Sep 17 00:00:00 2001 From: Andreas Rumpf <rumpf_a@web.de> Date: Tue, 5 Mar 2019 05:54:42 +0100 Subject: make exception handling use owned refs --- lib/system.nim | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'lib/system.nim') diff --git a/lib/system.nim b/lib/system.nim index 840565d51..0bfbd22f7 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -1341,7 +1341,7 @@ proc `is`*[T, S](x: T, y: S): bool {.magic: "Is", noSideEffect.} template `isnot`*(x, y: untyped): untyped = not (x is y) ## Negated version of `is`. Equivalent to ``not(x is y)``. -when defined(nimV2): +when defined(nimV2) and not defined(nimscript): type owned*{.magic: "BuiltinType".}[T] proc new*[T](a: var owned(ref T)) {.magic: "New", noSideEffect.} @@ -3022,8 +3022,10 @@ template newException*(exceptn: typedesc, message: string; parentException: ref Exception = nil): untyped = ## creates an exception object of type ``exceptn`` and sets its ``msg`` field ## to `message`. Returns the new exception object. - var - e: ref exceptn + when declared(owned): + var e: owned(ref exceptn) + else: + var e: ref exceptn new(e) e.msg = message e.parent = parentException @@ -3062,13 +3064,19 @@ when not declared(sysFatal): sysFatal(exceptn, message, "") else: proc sysFatal(exceptn: typedesc, message: string) {.inline, noReturn.} = - var e: ref exceptn + when declared(owned): + var e: owned(ref exceptn) + else: + var e: ref exceptn new(e) e.msg = message raise e proc sysFatal(exceptn: typedesc, message, arg: string) {.inline, noReturn.} = - var e: ref exceptn + when declared(owned): + var e: owned(ref exceptn) + else: + var e: ref exceptn new(e) e.msg = message & arg raise e -- cgit 1.4.1-2-gfad0