From 1b3725e3954ca01e5f37e82845549bdcce7d3901 Mon Sep 17 00:00:00 2001 From: c-blake Date: Fri, 12 Oct 2018 11:40:07 -0400 Subject: [PATCH] Add `toOpenArray[T](ptr UncheckedArray[T])` for clarity. (#9316) * Add `toOpenArray[T](ptr UncheckedArray[T])` for clarity. `ptr array[0,T]` for some unchecked type already works but A) `UncheckedArray` seems to be the intended future way for this kind of access, and B) essentially all use cases will have a `ptr` for that kind of array source and this call signature lets callers drop the trailing `[]` corresponding to that `ptr` deref. This PR relates to issue https://github.com/nim-lang/Nim/issues/9001 . * Add a test for toOpenArray() for UncheckedArray[T]s. --- compiler/ccgcalls.nim | 2 +- lib/system.nim | 2 ++ tests/system/tsystem_misc.nim | 5 +++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/compiler/ccgcalls.nim b/compiler/ccgcalls.nim index 33b07a5a7ee1..b23cd598ecce 100644 --- a/compiler/ccgcalls.nim +++ b/compiler/ccgcalls.nim @@ -106,7 +106,7 @@ proc openArrayLoc(p: BProc, n: PNode): Rope = result = "($1)+($2), ($3)-($2)+1" % [rdLoc(a), rdLoc(b), rdLoc(c)] else: result = "($1)+(($2)-($4)), ($3)-($2)+1" % [rdLoc(a), rdLoc(b), rdLoc(c), intLiteral(first)] - of tyOpenArray, tyVarargs: + of tyOpenArray, tyVarargs, tyUncheckedArray: result = "($1)+($2), ($3)-($2)+1" % [rdLoc(a), rdLoc(b), rdLoc(c)] of tyString, tySequence: if skipTypes(n.typ, abstractInst).kind == tyVar and diff --git a/lib/system.nim b/lib/system.nim index dff14924986c..08d4d9411930 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -4338,6 +4338,8 @@ when not defined(js): magic: "Slice".} proc toOpenArray*[T](x: openarray[T]; first, last: int): openarray[T] {. magic: "Slice".} + proc toOpenArray*[T](x: ptr UncheckedArray[T]; first, last: int): openarray[T] {. + magic: "Slice".} proc toOpenArray*[I, T](x: array[I, T]; first, last: I): openarray[T] {. magic: "Slice".} proc toOpenArray*(x: string; first, last: int): openarray[char] {. diff --git a/tests/system/tsystem_misc.nim b/tests/system/tsystem_misc.nim index c8189b3b14a3..3bbb5eff12a4 100644 --- a/tests/system/tsystem_misc.nim +++ b/tests/system/tsystem_misc.nim @@ -15,6 +15,7 @@ discard """ 1 2 3 +2 48 49 50 @@ -98,6 +99,10 @@ doAssertRaises(IndexError): doAssertRaises(IndexError): foo(toOpenArray(arrNeg, -1, -3)) +type seqqType = ptr UncheckedArray[int] +let qData = cast[seqqType](addr seqq[0]) +oaFirstElm(toOpenArray(qData, 1, 3)) + proc foo(a: openArray[byte]) = for x in a: echo x