1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- #
- #
- # The Nim Compiler
- # (c) Copyright 2022 Andreas Rumpf
- #
- # See the file "copying.txt", included in this
- # distribution, for details about the copyright.
- #
- ## New "strict funcs" checking. Much simpler and hopefully easier to teach than
- ## the old but more advanced algorithm that can/could be found in `varpartitions.nim`.
- import ast, typeallowed, renderer
- from aliasanalysis import PathKinds0, PathKinds1
- from trees import getMagic
- proc isDangerousLocation*(n: PNode; owner: PSym): bool =
- var n = n
- var hasDeref = false
- while true:
- case n.kind
- of nkDerefExpr, nkHiddenDeref:
- if n[0].typ.kind != tyVar:
- hasDeref = true
- n = n[0]
- of PathKinds0 - {nkDerefExpr, nkHiddenDeref}:
- n = n[0]
- of PathKinds1:
- n = n[1]
- of nkCallKinds:
- if n.len > 1:
- if (n.typ != nil and classifyViewType(n.typ) != noView) or getMagic(n) == mSlice:
- # borrow from first parameter:
- n = n[1]
- else:
- break
- else:
- break
- else:
- break
- if n.kind == nkSym:
- # dangerous if contains a pointer deref or if it doesn't belong to us:
- result = hasDeref or n.sym.owner != owner
- when false:
- # store to something that belongs to a `var` parameter is fine:
- let s = n.sym
- if s.kind == skParam:
- # dangerous unless a `var T` parameter:
- result = s.typ.kind != tyVar
- else:
- # dangerous if contains a pointer deref or if it doesn't belong to us:
- result = hasDeref or s.owner != owner
- else:
- # dangerous if it contains a pointer deref
- result = hasDeref
|