some simple sub-expression elimination not applied by the previos author
This commit is contained in:
parent
95072fbcc3
commit
97fefa3f50
1 changed files with 13 additions and 11 deletions
|
|
@ -1325,13 +1325,14 @@ proc customPragmaNode(n: NimNode): NimNode =
|
||||||
var typDef = getImpl(getTypeInst(if n.kind == nnkCheckedFieldExpr or n[0].kind == nnkHiddenDeref: n[0][0] else: n[0]))
|
var typDef = getImpl(getTypeInst(if n.kind == nnkCheckedFieldExpr or n[0].kind == nnkHiddenDeref: n[0][0] else: n[0]))
|
||||||
while typDef != nil:
|
while typDef != nil:
|
||||||
typDef.expectKind(nnkTypeDef)
|
typDef.expectKind(nnkTypeDef)
|
||||||
typDef[2].expectKind({nnkRefTy, nnkPtrTy, nnkObjectTy})
|
let typ = typDef[2]
|
||||||
let isRef = typDef[2].kind in {nnkRefTy, nnkPtrTy}
|
typ.expectKind({nnkRefTy, nnkPtrTy, nnkObjectTy})
|
||||||
if isRef and typDef[2][0].kind in {nnkSym, nnkBracketExpr}: # defines ref type for another object(e.g. X = ref X)
|
let isRef = typ.kind in {nnkRefTy, nnkPtrTy}
|
||||||
typDef = getImpl(typDef[2][0])
|
if isRef and typ[0].kind in {nnkSym, nnkBracketExpr}: # defines ref type for another object(e.g. X = ref X)
|
||||||
|
typDef = getImpl(typ[0])
|
||||||
else: # object definition, maybe an object directly defined as a ref type
|
else: # object definition, maybe an object directly defined as a ref type
|
||||||
let
|
let
|
||||||
obj = (if isRef: typDef[2][0] else: typDef[2])
|
obj = (if isRef: typ[0] else: typ)
|
||||||
var identDefsStack = newSeq[NimNode](obj[2].len)
|
var identDefsStack = newSeq[NimNode](obj[2].len)
|
||||||
for i in 0..<identDefsStack.len: identDefsStack[i] = obj[2][i]
|
for i in 0..<identDefsStack.len: identDefsStack[i] = obj[2][i]
|
||||||
while identDefsStack.len > 0:
|
while identDefsStack.len > 0:
|
||||||
|
|
@ -1339,13 +1340,14 @@ proc customPragmaNode(n: NimNode): NimNode =
|
||||||
if identDefs.kind == nnkRecCase:
|
if identDefs.kind == nnkRecCase:
|
||||||
identDefsStack.add(identDefs[0])
|
identDefsStack.add(identDefs[0])
|
||||||
for i in 1..<identDefs.len:
|
for i in 1..<identDefs.len:
|
||||||
|
let varNode = identDefs[i]
|
||||||
# if it is and empty branch, skip
|
# if it is and empty branch, skip
|
||||||
if identDefs[i][0].kind == nnkNilLit: continue
|
if varNode[0].kind == nnkNilLit: continue
|
||||||
if identDefs[i][1].kind == nnkIdentDefs:
|
if varNode[1].kind == nnkIdentDefs:
|
||||||
identDefsStack.add(identDefs[i][1])
|
identDefsStack.add(varNode[1])
|
||||||
else: # nnkRecList
|
else: # nnkRecList
|
||||||
for j in 0..<identDefs[i][1].len:
|
for j in 0 ..< varNode[1].len:
|
||||||
identDefsStack.add(identDefs[i][1][j])
|
identDefsStack.add(varNode[1][j])
|
||||||
|
|
||||||
else:
|
else:
|
||||||
for i in 0 .. identDefs.len - 3:
|
for i in 0 .. identDefs.len - 3:
|
||||||
|
|
@ -1356,7 +1358,7 @@ proc customPragmaNode(n: NimNode): NimNode =
|
||||||
# This is a public field. We are skipping the postfix *
|
# This is a public field. We are skipping the postfix *
|
||||||
varName = varName[1]
|
varName = varName[1]
|
||||||
if eqIdent(varName.strVal, name):
|
if eqIdent(varName.strVal, name):
|
||||||
return identDefs[i][1]
|
return varNode[1]
|
||||||
|
|
||||||
if obj[1].kind == nnkOfInherit: # explore the parent object
|
if obj[1].kind == nnkOfInherit: # explore the parent object
|
||||||
typDef = getImpl(obj[1][0])
|
typDef = getImpl(obj[1][0])
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue