lambdalifting: be consistent in its handling for 'func'

This commit is contained in:
Araq 2018-12-05 11:25:47 +01:00
commit 9eaf99f7e6

View file

@ -454,11 +454,10 @@ proc detectCapturedVars(n: PNode; owner: PSym; c: var DetectionPass) =
createUpField(c, w, up, n.info) createUpField(c, w, up, n.info)
w = up w = up
of nkEmpty..pred(nkSym), succ(nkSym)..nkNilLit, of nkEmpty..pred(nkSym), succ(nkSym)..nkNilLit,
nkTemplateDef, nkTypeSection: nkTemplateDef, nkTypeSection, nkProcDef, nkMethodDef,
nkConverterDef, nkMacroDef, nkFuncDef:
discard discard
of nkProcDef, nkMethodDef, nkConverterDef, nkMacroDef: of nkLambdaKinds, nkIteratorDef:
discard
of nkLambdaKinds, nkIteratorDef, nkFuncDef:
if n.typ != nil: if n.typ != nil:
detectCapturedVars(n[namePos], owner, c) detectCapturedVars(n[namePos], owner, c)
of nkReturnStmt: of nkReturnStmt:
@ -672,9 +671,8 @@ proc liftCapturedVars(n: PNode; owner: PSym; d: DetectionPass;
else: else:
result = accessViaEnvVar(n, owner, d, c) result = accessViaEnvVar(n, owner, d, c)
of nkEmpty..pred(nkSym), succ(nkSym)..nkNilLit, nkComesFrom, of nkEmpty..pred(nkSym), succ(nkSym)..nkNilLit, nkComesFrom,
nkTemplateDef, nkTypeSection: nkTemplateDef, nkTypeSection, nkProcDef, nkMethodDef, nkConverterDef,
discard nkMacroDef, nkFuncDef:
of nkProcDef, nkMethodDef, nkConverterDef, nkMacroDef:
discard discard
of nkClosure: of nkClosure:
if n[1].kind == nkNilLit: if n[1].kind == nkNilLit:
@ -685,7 +683,7 @@ proc liftCapturedVars(n: PNode; owner: PSym; d: DetectionPass;
# now we know better, so patch it: # now we know better, so patch it:
n.sons[0] = x.sons[0] n.sons[0] = x.sons[0]
n.sons[1] = x.sons[1] n.sons[1] = x.sons[1]
of nkLambdaKinds, nkIteratorDef, nkFuncDef: of nkLambdaKinds, nkIteratorDef:
if n.typ != nil and n[namePos].kind == nkSym: if n.typ != nil and n[namePos].kind == nkSym:
let oldInContainer = c.inContainer let oldInContainer = c.inContainer
c.inContainer = 0 c.inContainer = 0