diff options
author | ringabout <43030857+ringabout@users.noreply.github.com> | 2024-08-24 02:07:00 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-23 20:07:00 +0200 |
commit | 4ef06a5cc56f6ef32b8ac1e7c11592597406486a (patch) | |
tree | 92a6f76567d363560c2347a3e46f25748c2243df /compiler | |
parent | 446501b53bfbb5aa0322e18967dbd0511ddbee37 (diff) | |
download | Nim-4ef06a5cc56f6ef32b8ac1e7c11592597406486a.tar.gz |
fixes `cast` expressions introduces unnecessary copies (#24004)
It speeds up ```nim proc foo = let piece = cast[seq[char]](newSeqUninit[uint8](5220600386'i64)) foo() ``` Notes that `cast[ref](...)` is excluded because we need to keep the ref alive if the parameter is something with pointer types (e.g. `cast[ref](pointer)`or `cast[ref](makePointer(...))`) --------- Co-authored-by: Andreas Rumpf <rumpf_a@web.de>
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/injectdestructors.nim | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/compiler/injectdestructors.nim b/compiler/injectdestructors.nim index 92c823f37..c0bf374d0 100644 --- a/compiler/injectdestructors.nim +++ b/compiler/injectdestructors.nim @@ -501,7 +501,7 @@ proc containsConstSeq(n: PNode): bool = return true result = false case n.kind - of nkExprEqExpr, nkExprColonExpr, nkHiddenStdConv, nkHiddenSubConv: + of nkExprEqExpr, nkExprColonExpr, nkHiddenStdConv, nkHiddenSubConv, nkCast: result = containsConstSeq(n[1]) of nkObjConstr, nkClosure: for i in 1..<n.len: @@ -829,6 +829,9 @@ proc p(n: PNode; c: var Con; s: var Scope; mode: ProcessMode; tmpFlags = {sfSing elif n.kind in {nkObjDownConv, nkObjUpConv}: result = copyTree(n) result[0] = p(n[0], c, s, sinkArg) + elif n.kind == nkCast and n.typ.skipTypes(abstractInst).kind in {tyString, tySequence}: + result = copyTree(n) + result[1] = p(n[1], c, s, sinkArg) elif n.typ == nil: # 'raise X' can be part of a 'case' expression. Deal with it here: result = p(n, c, s, normal) |