summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2019-11-29 16:43:45 +0100
committerAndreas Rumpf <rumpf_a@web.de>2019-11-29 19:46:21 +0100
commit7e6e399d10691fa12dae101839611bcf2f0d8ae4 (patch)
treec76616168630c7ec6ffb6765247c1e23a05c9819 /compiler
parentb688250202ea479a51cbd20003e2ea2a147a3c3d (diff)
downloadNim-7e6e399d10691fa12dae101839611bcf2f0d8ae4.tar.gz
fixes #12669
Diffstat (limited to 'compiler')
-rw-r--r--compiler/dfa.nim37
1 files changed, 26 insertions, 11 deletions
diff --git a/compiler/dfa.nim b/compiler/dfa.nim
index c97e39460..cc0b8f7ae 100644
--- a/compiler/dfa.nim
+++ b/compiler/dfa.nim
@@ -572,16 +572,6 @@ const
                 nkObjDownConv, nkObjUpConv}
   PathKinds1 = {nkHiddenStdConv, nkHiddenSubConv}
 
-proc getRoot(n: PNode): PNode =
-  result = n
-  while true:
-    case result.kind
-    of PathKinds0:
-      result = result[0]
-    of PathKinds1:
-      result = result[1]
-    else: break
-
 proc skipConvDfa*(n: PNode): PNode =
   result = n
   while true:
@@ -593,7 +583,17 @@ proc skipConvDfa*(n: PNode): PNode =
     else: break
 
 proc genUse(c: var Con; orig: PNode) =
-  let n = dfa.getRoot(orig)
+  var n = orig
+  while true:
+    case n.kind
+    of PathKinds0 - {nkBracketExpr}:
+      n = n[0]
+    of nkBracketExpr:
+      gen(c, n[1])
+      n = n[0]
+    of PathKinds1:
+      n = n[1]
+    else: break
   if n.kind == nkSym and n.sym.kind in InterestingSyms:
     c.code.add Instr(n: orig, kind: use, sym: if orig != n: nil else: n.sym)
 
@@ -673,6 +673,21 @@ proc isAnalysableFieldAccess*(orig: PNode; owner: PSym): bool =
   # lower level C++ optimizer to specialize this code.
 
 proc genDef(c: var Con; n: PNode) =
+  var m = n
+  # XXX do something about this duplicated logic here.
+  while true:
+    case m.kind
+    of nkDotExpr, nkCheckedFieldExpr, nkHiddenSubConv, nkHiddenStdConv,
+        nkObjDownConv, nkObjUpConv, nkHiddenAddr, nkAddr:
+      m = m[0]
+    of nkBracketExpr:
+      gen(c, m[1])
+      m = m[0]
+    of nkHiddenDeref, nkDerefExpr:
+      m = m[0]
+    else:
+      break
+
   if n.kind == nkSym and n.sym.kind in InterestingSyms:
     c.code.add Instr(n: n, kind: def, sym: n.sym)
   elif isAnalysableFieldAccess(n, c.owner):