diff --git a/ranges/typedranges.nim b/ranges/typedranges.nim index f16537e..4cc09ee 100644 --- a/ranges/typedranges.nim +++ b/ranges/typedranges.nim @@ -17,10 +17,19 @@ type ByteRange* = Range[byte] MutByteRange* = MutRange[byte] +proc isLiteral[T](s: seq[T]): bool {.inline.} = + type + SeqHeader = object + length, reserved: int + (cast[ptr SeqHeader](s).reserved and (1 shl (sizeof(int) * 8 - 2))) != 0 + proc toImmutableRange[T](a: seq[T]): Range[T] = if a.len != 0: when rangesGCHoldEnabled: - result.gcHold = a + if not isLiteral(a): + shallowCopy(result.gcHold, a) + else: + result.gcHold = a result.start = addr result.gcHold[0] result.mLen = a.len diff --git a/tests/ttypedranges.nim b/tests/ttypedranges.nim index 1f682ff..8a94a08 100644 --- a/tests/ttypedranges.nim +++ b/tests/ttypedranges.nim @@ -71,7 +71,7 @@ suite "Typed ranges": var r = s.toRange() var r2 = r s[0] = 5 - # check(r[0] == 5) # XXX: Uncomment once nim bug #8044 is fixed + check(r[0] == 5) r[1] = 10 check(r2[1] == 10)