diff options
author | ringabout <43030857+ringabout@users.noreply.github.com> | 2022-11-23 03:07:00 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-22 20:07:00 +0100 |
commit | 0448f30fd9c2e53084ee8b284f6fa24684661bc3 (patch) | |
tree | 04ce8580c319f10684ee390edd2aea85c13624ab /lib/system/indices.nim | |
parent | 354eb2a86c75335c34cab8074b8b3532f09ecccf (diff) | |
download | Nim-0448f30fd9c2e53084ee8b284f6fa24684661bc3.tar.gz |
fixes #20026; marks system procs which can raise defects (#20864)
* marks system procs which can raise defects * add tests * add more systemRaisesDefect * add comment
Diffstat (limited to 'lib/system/indices.nim')
-rw-r--r-- | lib/system/indices.nim | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/lib/system/indices.nim b/lib/system/indices.nim index 3f90d4399..fd6770e23 100644 --- a/lib/system/indices.nim +++ b/lib/system/indices.nim @@ -1,3 +1,6 @@ +when not defined(nimHasSystemRaisesDefect): + {.pragma: systemRaisesDefect.} + type BackwardsIndex* = distinct int ## Type that is constructed by `^` for ## reversed array accesses. @@ -16,24 +19,24 @@ template `^`*(x: int): BackwardsIndex = BackwardsIndex(x) ## echo b[^2] # => g ## ``` -proc `[]`*[T](s: openArray[T]; i: BackwardsIndex): T {.inline.} = +proc `[]`*[T](s: openArray[T]; i: BackwardsIndex): T {.inline, systemRaisesDefect.} = system.`[]`(s, s.len - int(i)) -proc `[]`*[Idx, T](a: array[Idx, T]; i: BackwardsIndex): T {.inline.} = +proc `[]`*[Idx, T](a: array[Idx, T]; i: BackwardsIndex): T {.inline, systemRaisesDefect.} = a[Idx(a.len - int(i) + int low(a))] -proc `[]`*(s: string; i: BackwardsIndex): char {.inline.} = s[s.len - int(i)] +proc `[]`*(s: string; i: BackwardsIndex): char {.inline, systemRaisesDefect.} = s[s.len - int(i)] -proc `[]`*[T](s: var openArray[T]; i: BackwardsIndex): var T {.inline.} = +proc `[]`*[T](s: var openArray[T]; i: BackwardsIndex): var T {.inline, systemRaisesDefect.} = system.`[]`(s, s.len - int(i)) -proc `[]`*[Idx, T](a: var array[Idx, T]; i: BackwardsIndex): var T {.inline.} = +proc `[]`*[Idx, T](a: var array[Idx, T]; i: BackwardsIndex): var T {.inline, systemRaisesDefect.} = a[Idx(a.len - int(i) + int low(a))] -proc `[]`*(s: var string; i: BackwardsIndex): var char {.inline.} = s[s.len - int(i)] +proc `[]`*(s: var string; i: BackwardsIndex): var char {.inline, systemRaisesDefect.} = s[s.len - int(i)] -proc `[]=`*[T](s: var openArray[T]; i: BackwardsIndex; x: T) {.inline.} = +proc `[]=`*[T](s: var openArray[T]; i: BackwardsIndex; x: T) {.inline, systemRaisesDefect.} = system.`[]=`(s, s.len - int(i), x) -proc `[]=`*[Idx, T](a: var array[Idx, T]; i: BackwardsIndex; x: T) {.inline.} = +proc `[]=`*[Idx, T](a: var array[Idx, T]; i: BackwardsIndex; x: T) {.inline, systemRaisesDefect.} = a[Idx(a.len - int(i) + int low(a))] = x -proc `[]=`*(s: var string; i: BackwardsIndex; x: char) {.inline.} = +proc `[]=`*(s: var string; i: BackwardsIndex; x: char) {.inline, systemRaisesDefect.} = s[s.len - int(i)] = x template `..^`*(a, b: untyped): untyped = @@ -70,7 +73,7 @@ template spliceImpl(s, a, L, b: typed): untyped = # fill the hole: for i in 0 ..< b.len: s[a+i] = b[i] -proc `[]`*[T, U: Ordinal](s: string, x: HSlice[T, U]): string {.inline.} = +proc `[]`*[T, U: Ordinal](s: string, x: HSlice[T, U]): string {.inline, systemRaisesDefect.} = ## Slice operation for strings. ## Returns the inclusive range `[s[x.a], s[x.b]]`: ## ``` @@ -82,7 +85,7 @@ proc `[]`*[T, U: Ordinal](s: string, x: HSlice[T, U]): string {.inline.} = result = newString(L) for i in 0 ..< L: result[i] = s[i + a] -proc `[]=`*[T, U: Ordinal](s: var string, x: HSlice[T, U], b: string) = +proc `[]=`*[T, U: Ordinal](s: var string, x: HSlice[T, U], b: string) {.systemRaisesDefect.} = ## Slice assignment for strings. ## ## If `b.len` is not exactly the number of elements that are referred to @@ -100,7 +103,7 @@ proc `[]=`*[T, U: Ordinal](s: var string, x: HSlice[T, U], b: string) = else: spliceImpl(s, a, L, b) -proc `[]`*[Idx, T; U, V: Ordinal](a: array[Idx, T], x: HSlice[U, V]): seq[T] = +proc `[]`*[Idx, T; U, V: Ordinal](a: array[Idx, T], x: HSlice[U, V]): seq[T] {.systemRaisesDefect.} = ## Slice operation for arrays. ## Returns the inclusive range `[a[x.a], a[x.b]]`: ## ``` @@ -112,7 +115,7 @@ proc `[]`*[Idx, T; U, V: Ordinal](a: array[Idx, T], x: HSlice[U, V]): seq[T] = result = newSeq[T](L) for i in 0..<L: result[i] = a[Idx(i + xa)] -proc `[]=`*[Idx, T; U, V: Ordinal](a: var array[Idx, T], x: HSlice[U, V], b: openArray[T]) = +proc `[]=`*[Idx, T; U, V: Ordinal](a: var array[Idx, T], x: HSlice[U, V], b: openArray[T]) {.systemRaisesDefect.} = ## Slice assignment for arrays. ## ``` ## var a = [10, 20, 30, 40, 50] @@ -126,7 +129,7 @@ proc `[]=`*[Idx, T; U, V: Ordinal](a: var array[Idx, T], x: HSlice[U, V], b: ope else: sysFatal(RangeDefect, "different lengths for slice assignment") -proc `[]`*[T; U, V: Ordinal](s: openArray[T], x: HSlice[U, V]): seq[T] = +proc `[]`*[T; U, V: Ordinal](s: openArray[T], x: HSlice[U, V]): seq[T] {.systemRaisesDefect.} = ## Slice operation for sequences. ## Returns the inclusive range `[s[x.a], s[x.b]]`: ## ``` @@ -138,7 +141,7 @@ proc `[]`*[T; U, V: Ordinal](s: openArray[T], x: HSlice[U, V]): seq[T] = newSeq(result, L) for i in 0 ..< L: result[i] = s[i + a] -proc `[]=`*[T; U, V: Ordinal](s: var seq[T], x: HSlice[U, V], b: openArray[T]) = +proc `[]=`*[T; U, V: Ordinal](s: var seq[T], x: HSlice[U, V], b: openArray[T]) {.systemRaisesDefect.} = ## Slice assignment for sequences. ## ## If `b.len` is not exactly the number of elements that are referred to |