made tests green again
This commit is contained in:
parent
adb73ec9ed
commit
991b3096e8
7 changed files with 23 additions and 10 deletions
|
|
@ -278,6 +278,13 @@ proc interestingVar(s: PSym): bool {.inline.} =
|
||||||
result = s.kind in {skVar, skLet, skTemp, skForVar, skParam, skResult} and
|
result = s.kind in {skVar, skLet, skTemp, skForVar, skParam, skResult} and
|
||||||
sfGlobal notin s.flags
|
sfGlobal notin s.flags
|
||||||
|
|
||||||
|
proc semCaptureSym*(s, owner: PSym) =
|
||||||
|
if interestingVar(s) and owner.id != s.owner.id:
|
||||||
|
if owner.typ != nil:
|
||||||
|
owner.typ.callConv = ccClosure
|
||||||
|
# since the analysis is not entirely correct, we don't set 'tfCapturesEnv'
|
||||||
|
# here
|
||||||
|
|
||||||
proc gatherVars(o: POuterContext, i: PInnerContext, n: PNode) =
|
proc gatherVars(o: POuterContext, i: PInnerContext, n: PNode) =
|
||||||
# gather used vars for closure generation
|
# gather used vars for closure generation
|
||||||
if n == nil: return
|
if n == nil: return
|
||||||
|
|
@ -363,6 +370,7 @@ proc closureCreationPoint(n: PNode): PNode =
|
||||||
result.add(n)
|
result.add(n)
|
||||||
|
|
||||||
proc searchForInnerProcs(o: POuterContext, n: PNode) =
|
proc searchForInnerProcs(o: POuterContext, n: PNode) =
|
||||||
|
if n == nil: return
|
||||||
case n.kind
|
case n.kind
|
||||||
of nkEmpty..pred(nkSym), succ(nkSym)..nkNilLit:
|
of nkEmpty..pred(nkSym), succ(nkSym)..nkNilLit:
|
||||||
nil
|
nil
|
||||||
|
|
@ -529,7 +537,7 @@ proc liftLambdas*(fn: PSym, body: PNode): PNode =
|
||||||
if body.kind == nkEmpty or gCmd == cmdCompileToEcmaScript:
|
if body.kind == nkEmpty or gCmd == cmdCompileToEcmaScript:
|
||||||
# ignore forward declaration:
|
# ignore forward declaration:
|
||||||
result = body
|
result = body
|
||||||
elif not containsNode(body, procDefs):
|
elif not containsNode(body, procDefs) and false:
|
||||||
# fast path: no inner procs, so no closure needed:
|
# fast path: no inner procs, so no closure needed:
|
||||||
result = body
|
result = body
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ import
|
||||||
wordrecg, ropes, msgs, os, condsyms, idents, renderer, types, platform, math,
|
wordrecg, ropes, msgs, os, condsyms, idents, renderer, types, platform, math,
|
||||||
magicsys, parser, nversion, nimsets, semfold, importer,
|
magicsys, parser, nversion, nimsets, semfold, importer,
|
||||||
procfind, lookups, rodread, pragmas, passes, semdata, semtypinst, sigmatch,
|
procfind, lookups, rodread, pragmas, passes, semdata, semtypinst, sigmatch,
|
||||||
semthreads, intsets, transf, evals, idgen, aliases, cgmeth
|
semthreads, intsets, transf, evals, idgen, aliases, cgmeth, lambdalifting
|
||||||
|
|
||||||
proc semPass*(): TPass
|
proc semPass*(): TPass
|
||||||
# implementation
|
# implementation
|
||||||
|
|
|
||||||
|
|
@ -107,6 +107,8 @@ proc semSym(c: PContext, n: PNode, s: PSym, flags: TExprFlags): PNode =
|
||||||
incl(c.p.owner.flags, sfSideEffect)
|
incl(c.p.owner.flags, sfSideEffect)
|
||||||
elif s.kind == skParam and s.typ.kind == tyExpr:
|
elif s.kind == skParam and s.typ.kind == tyExpr:
|
||||||
return s.typ.n
|
return s.typ.n
|
||||||
|
else:
|
||||||
|
semCaptureSym(s, c.p.owner)
|
||||||
result = newSymNode(s, n.info)
|
result = newSymNode(s, n.info)
|
||||||
# We cannot check for access to outer vars for example because it's still
|
# We cannot check for access to outer vars for example because it's still
|
||||||
# not sure the symbol really ends up being used:
|
# not sure the symbol really ends up being used:
|
||||||
|
|
@ -1524,7 +1526,7 @@ proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode =
|
||||||
internalError(n.info, "semExpr() to implement") # XXX: to implement
|
internalError(n.info, "semExpr() to implement") # XXX: to implement
|
||||||
of nkPar:
|
of nkPar:
|
||||||
case checkPar(n)
|
case checkPar(n)
|
||||||
of paNone: result = nil
|
of paNone: result = errorNode(c, n)
|
||||||
of paTuplePositions: result = semTuplePositionsConstr(c, n)
|
of paTuplePositions: result = semTuplePositionsConstr(c, n)
|
||||||
of paTupleFields: result = semTupleFieldsConstr(c, n)
|
of paTupleFields: result = semTupleFieldsConstr(c, n)
|
||||||
of paSingle: result = semExpr(c, n.sons[0], flags)
|
of paSingle: result = semExpr(c, n.sons[0], flags)
|
||||||
|
|
|
||||||
|
|
@ -876,7 +876,9 @@ proc semMethod(c: PContext, n: PNode): PNode =
|
||||||
|
|
||||||
# XXX this not really correct way to do it: Perhaps it should be done after
|
# XXX this not really correct way to do it: Perhaps it should be done after
|
||||||
# generic instantiation. Well it's good enough for now:
|
# generic instantiation. Well it's good enough for now:
|
||||||
if not hasObjParam:
|
if hasObjParam:
|
||||||
|
methodDef(s, false)
|
||||||
|
else:
|
||||||
LocalError(n.info, errXNeedsParamObjectType, "method")
|
LocalError(n.info, errXNeedsParamObjectType, "method")
|
||||||
|
|
||||||
proc semConverterDef(c: PContext, n: PNode): PNode =
|
proc semConverterDef(c: PContext, n: PNode): PNode =
|
||||||
|
|
|
||||||
|
|
@ -697,7 +697,6 @@ proc transformBody*(module: PSym, n: PNode, prc: PSym): PNode =
|
||||||
if prc.kind != skMacro:
|
if prc.kind != skMacro:
|
||||||
# XXX no closures yet for macros:
|
# XXX no closures yet for macros:
|
||||||
result = liftLambdas(prc, result)
|
result = liftLambdas(prc, result)
|
||||||
if prc.kind == skMethod: methodDef(prc, false)
|
|
||||||
incl(result.flags, nfTransf)
|
incl(result.flags, nfTransf)
|
||||||
|
|
||||||
proc transformStmt*(module: PSym, n: PNode): PNode =
|
proc transformStmt*(module: PSym, n: PNode): PNode =
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,12 @@
|
||||||
discard """
|
discard """
|
||||||
line: 6
|
line: 12
|
||||||
errormsg: "'ugh' cannot have 'closure' calling convention"
|
errormsg: "type mismatch: got (proc (int){.closure.})"
|
||||||
"""
|
"""
|
||||||
|
|
||||||
proc ugh[T](x: T) {.closure.} =
|
proc ugh[T](x: T) {.closure.} =
|
||||||
echo "ugha"
|
echo "ugha"
|
||||||
|
|
||||||
|
|
||||||
|
proc takeCdecl(p: proc (x: int) {.cdecl.}) = nil
|
||||||
|
|
||||||
|
takeCDecl(ugh[int])
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,3 @@ discard """
|
||||||
|
|
||||||
method m(i: int): int =
|
method m(i: int): int =
|
||||||
return 5
|
return 5
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue