Merge branch 'devel' of github.com:Araq/Nimrod into newasync
This commit is contained in:
commit
3dec6483e7
10 changed files with 64 additions and 43 deletions
|
|
@ -637,6 +637,22 @@ proc outerProcSons(o: POuterContext, n: PNode) =
|
||||||
let x = transformOuterProc(o, n.sons[i])
|
let x = transformOuterProc(o, n.sons[i])
|
||||||
if x != nil: n.sons[i] = x
|
if x != nil: n.sons[i] = x
|
||||||
|
|
||||||
|
proc liftIterSym*(n: PNode): PNode =
|
||||||
|
# transforms (iter) to (let env = newClosure[iter](); (iter, env))
|
||||||
|
let iter = n.sym
|
||||||
|
assert iter.kind == skIterator
|
||||||
|
|
||||||
|
result = newNodeIT(nkStmtListExpr, n.info, n.typ)
|
||||||
|
|
||||||
|
var env = copySym(getHiddenParam(iter))
|
||||||
|
env.kind = skLet
|
||||||
|
var v = newNodeI(nkVarSection, n.info)
|
||||||
|
addVar(v, newSymNode(env))
|
||||||
|
result.add(v)
|
||||||
|
# add 'new' statement:
|
||||||
|
result.add(newCall(getSysSym"internalNew", env))
|
||||||
|
result.add makeClosure(iter, env, n.info)
|
||||||
|
|
||||||
proc transformOuterProc(o: POuterContext, n: PNode): PNode =
|
proc transformOuterProc(o: POuterContext, n: PNode): PNode =
|
||||||
if n == nil: return nil
|
if n == nil: return nil
|
||||||
case n.kind
|
case n.kind
|
||||||
|
|
@ -649,18 +665,23 @@ proc transformOuterProc(o: POuterContext, n: PNode): PNode =
|
||||||
return indirectAccess(newSymNode(o.closureParam), local, n.info)
|
return indirectAccess(newSymNode(o.closureParam), local, n.info)
|
||||||
|
|
||||||
var closure = PEnv(idTableGet(o.lambdasToEnv, local))
|
var closure = PEnv(idTableGet(o.lambdasToEnv, local))
|
||||||
if closure != nil:
|
|
||||||
# we need to replace the lambda with '(lambda, env)':
|
if local.kind == skIterator and local.typ.callConv == ccClosure:
|
||||||
if local.kind == skIterator and local.typ.callConv == ccClosure:
|
# consider: [i1, i2, i1] Since we merged the iterator's closure
|
||||||
# consider: [i1, i2, i1] Since we merged the iterator's closure
|
# with the captured owning variables, we need to generate the
|
||||||
# with the captured owning variables, we need to generate the
|
# closure generation code again:
|
||||||
# closure generation code again:
|
if local == o.fn: message(n.info, errRecursiveDependencyX, local.name.s)
|
||||||
#if local == o.fn: message(n.info, errRecursiveDependencyX, local.name.s)
|
# XXX why doesn't this work?
|
||||||
# XXX why doesn't this work?
|
if closure.isNil:
|
||||||
|
return liftIterSym(n)
|
||||||
|
else:
|
||||||
let createdVar = generateIterClosureCreation(o, closure,
|
let createdVar = generateIterClosureCreation(o, closure,
|
||||||
closure.attachedNode)
|
closure.attachedNode)
|
||||||
return makeClosure(local, createdVar, n.info)
|
return makeClosure(local, createdVar, n.info)
|
||||||
|
|
||||||
|
if closure != nil:
|
||||||
|
# we need to replace the lambda with '(lambda, env)':
|
||||||
|
|
||||||
let a = closure.createdVar
|
let a = closure.createdVar
|
||||||
if a != nil:
|
if a != nil:
|
||||||
return makeClosure(local, a, n.info)
|
return makeClosure(local, a, n.info)
|
||||||
|
|
@ -773,22 +794,6 @@ proc liftLambdasForTopLevel*(module: PSym, body: PNode): PNode =
|
||||||
|
|
||||||
# ------------------- iterator transformation --------------------------------
|
# ------------------- iterator transformation --------------------------------
|
||||||
|
|
||||||
proc liftIterSym*(n: PNode): PNode =
|
|
||||||
# transforms (iter) to (let env = newClosure[iter](); (iter, env))
|
|
||||||
let iter = n.sym
|
|
||||||
assert iter.kind == skIterator
|
|
||||||
|
|
||||||
result = newNodeIT(nkStmtListExpr, n.info, n.typ)
|
|
||||||
|
|
||||||
var env = copySym(getHiddenParam(iter))
|
|
||||||
env.kind = skLet
|
|
||||||
var v = newNodeI(nkVarSection, n.info)
|
|
||||||
addVar(v, newSymNode(env))
|
|
||||||
result.add(v)
|
|
||||||
# add 'new' statement:
|
|
||||||
result.add(newCall(getSysSym"internalNew", env))
|
|
||||||
result.add makeClosure(iter, env, n.info)
|
|
||||||
|
|
||||||
proc liftForLoop*(body: PNode): PNode =
|
proc liftForLoop*(body: PNode): PNode =
|
||||||
# problem ahead: the iterator could be invoked indirectly, but then
|
# problem ahead: the iterator could be invoked indirectly, but then
|
||||||
# we don't know what environment to create here:
|
# we don't know what environment to create here:
|
||||||
|
|
|
||||||
|
|
@ -1819,6 +1819,10 @@ proc semExport(c: PContext, n: PNode): PNode =
|
||||||
c.module.ast.add x
|
c.module.ast.add x
|
||||||
result = n
|
result = n
|
||||||
|
|
||||||
|
proc setGenericParams(c: PContext, n: PNode) =
|
||||||
|
for i in 1 .. <n.len:
|
||||||
|
n[i].typ = semTypeNode(c, n[i], nil)
|
||||||
|
|
||||||
proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode =
|
proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode =
|
||||||
result = n
|
result = n
|
||||||
if gCmd == cmdIdeTools: suggestExpr(c, n)
|
if gCmd == cmdIdeTools: suggestExpr(c, n)
|
||||||
|
|
@ -1924,10 +1928,12 @@ proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode =
|
||||||
else:
|
else:
|
||||||
#liMessage(n.info, warnUser, renderTree(n));
|
#liMessage(n.info, warnUser, renderTree(n));
|
||||||
result = semIndirectOp(c, n, flags)
|
result = semIndirectOp(c, n, flags)
|
||||||
elif isSymChoice(n.sons[0]) or n[0].kind == nkBracketExpr and
|
elif n[0].kind == nkBracketExpr and isSymChoice(n[0][0]):
|
||||||
isSymChoice(n[0][0]):
|
# indirectOp can deal with explicit instantiations; the fixes
|
||||||
|
# the 'newSeq[T](x)' bug
|
||||||
|
setGenericParams(c, n.sons[0])
|
||||||
result = semDirectOp(c, n, flags)
|
result = semDirectOp(c, n, flags)
|
||||||
elif nfDelegate in n.flags:
|
elif isSymChoice(n.sons[0]) or nfDelegate in n.flags:
|
||||||
result = semDirectOp(c, n, flags)
|
result = semDirectOp(c, n, flags)
|
||||||
else:
|
else:
|
||||||
result = semIndirectOp(c, n, flags)
|
result = semIndirectOp(c, n, flags)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
# The Nimrod Compiler
|
# The Nimrod Compiler
|
||||||
# (c) Copyright 2012 Andreas Rumpf
|
# (c) Copyright 2014 Andreas Rumpf
|
||||||
#
|
#
|
||||||
# See the file "copying.txt", included in this
|
# See the file "copying.txt", included in this
|
||||||
# distribution, for details about the copyright.
|
# distribution, for details about the copyright.
|
||||||
|
|
@ -215,8 +215,7 @@ proc semGenericStmt(c: PContext, n: PNode,
|
||||||
if (a.kind != nkIdentDefs) and (a.kind != nkVarTuple): illFormedAst(a)
|
if (a.kind != nkIdentDefs) and (a.kind != nkVarTuple): illFormedAst(a)
|
||||||
checkMinSonsLen(a, 3)
|
checkMinSonsLen(a, 3)
|
||||||
var L = sonsLen(a)
|
var L = sonsLen(a)
|
||||||
a.sons[L-2] = semGenericStmt(c, a.sons[L-2], flags+{withinTypeDesc},
|
a.sons[L-2] = semGenericStmt(c, a.sons[L-2], flags+{withinTypeDesc}, ctx)
|
||||||
ctx)
|
|
||||||
a.sons[L-1] = semGenericStmt(c, a.sons[L-1], flags, ctx)
|
a.sons[L-1] = semGenericStmt(c, a.sons[L-1], flags, ctx)
|
||||||
for j in countup(0, L-3):
|
for j in countup(0, L-3):
|
||||||
addPrelimDecl(c, newSymS(skUnknown, getIdentNode(a.sons[j]), c))
|
addPrelimDecl(c, newSymS(skUnknown, getIdentNode(a.sons[j]), c))
|
||||||
|
|
@ -226,8 +225,7 @@ proc semGenericStmt(c: PContext, n: PNode,
|
||||||
if (a.kind != nkIdentDefs): illFormedAst(a)
|
if (a.kind != nkIdentDefs): illFormedAst(a)
|
||||||
checkMinSonsLen(a, 3)
|
checkMinSonsLen(a, 3)
|
||||||
var L = sonsLen(a)
|
var L = sonsLen(a)
|
||||||
a.sons[L-2] = semGenericStmt(c, a.sons[L-2], flags+{withinTypeDesc},
|
a.sons[L-2] = semGenericStmt(c, a.sons[L-2], flags+{withinTypeDesc}, ctx)
|
||||||
ctx)
|
|
||||||
# do not perform symbol lookup for default expressions
|
# do not perform symbol lookup for default expressions
|
||||||
for j in countup(0, L-3):
|
for j in countup(0, L-3):
|
||||||
addPrelimDecl(c, newSymS(skUnknown, getIdentNode(a.sons[j]), c))
|
addPrelimDecl(c, newSymS(skUnknown, getIdentNode(a.sons[j]), c))
|
||||||
|
|
@ -281,8 +279,7 @@ proc semGenericStmt(c: PContext, n: PNode,
|
||||||
if (a.kind != nkIdentDefs): illFormedAst(a)
|
if (a.kind != nkIdentDefs): illFormedAst(a)
|
||||||
checkMinSonsLen(a, 3)
|
checkMinSonsLen(a, 3)
|
||||||
var L = sonsLen(a)
|
var L = sonsLen(a)
|
||||||
a.sons[L-2] = semGenericStmt(c, a.sons[L-2], flags+{withinTypeDesc},
|
a.sons[L-2] = semGenericStmt(c, a.sons[L-2], flags+{withinTypeDesc}, ctx)
|
||||||
ctx)
|
|
||||||
a.sons[L-1] = semGenericStmt(c, a.sons[L-1], flags, ctx)
|
a.sons[L-1] = semGenericStmt(c, a.sons[L-1], flags, ctx)
|
||||||
for j in countup(0, L-3):
|
for j in countup(0, L-3):
|
||||||
addPrelimDecl(c, newSymS(skUnknown, getIdentNode(a.sons[j]), c))
|
addPrelimDecl(c, newSymS(skUnknown, getIdentNode(a.sons[j]), c))
|
||||||
|
|
|
||||||
|
|
@ -358,7 +358,7 @@ proc analyse(c: PProcCtx, n: PNode): TThreadOwner =
|
||||||
of nkConstSection: result = analyseConstSection(c, n)
|
of nkConstSection: result = analyseConstSection(c, n)
|
||||||
of nkTypeSection, nkCommentStmt: result = toVoid
|
of nkTypeSection, nkCommentStmt: result = toVoid
|
||||||
of nkIfStmt, nkWhileStmt, nkTryStmt, nkCaseStmt, nkStmtList, nkBlockStmt,
|
of nkIfStmt, nkWhileStmt, nkTryStmt, nkCaseStmt, nkStmtList, nkBlockStmt,
|
||||||
nkElifBranch, nkElse, nkExceptBranch, nkOfBranch:
|
nkElifBranch, nkElse, nkExceptBranch, nkOfBranch, nkFinally:
|
||||||
for i in 0 .. <n.len: discard analyse(c, n[i])
|
for i in 0 .. <n.len: discard analyse(c, n[i])
|
||||||
result = toVoid
|
result = toVoid
|
||||||
of nkBreakStmt, nkContinueStmt: result = toVoid
|
of nkBreakStmt, nkContinueStmt: result = toVoid
|
||||||
|
|
|
||||||
|
|
@ -105,6 +105,7 @@ proc initCandidate*(ctx: PContext, c: var TCandidate, callee: PSym,
|
||||||
var bound = binding[i].typ
|
var bound = binding[i].typ
|
||||||
if bound != nil and formalTypeParam.kind != tyTypeDesc:
|
if bound != nil and formalTypeParam.kind != tyTypeDesc:
|
||||||
bound = bound.skipTypes({tyTypeDesc})
|
bound = bound.skipTypes({tyTypeDesc})
|
||||||
|
assert bound != nil
|
||||||
put(c.bindings, formalTypeParam, bound)
|
put(c.bindings, formalTypeParam, bound)
|
||||||
|
|
||||||
proc newCandidate*(ctx: PContext, callee: PSym,
|
proc newCandidate*(ctx: PContext, callee: PSym,
|
||||||
|
|
|
||||||
|
|
@ -2931,7 +2931,7 @@ parameters of an outer factory proc:
|
||||||
yield x
|
yield x
|
||||||
inc x
|
inc x
|
||||||
|
|
||||||
let foo = mycount 1, 4
|
let foo = mycount(1, 4)
|
||||||
|
|
||||||
for f in foo():
|
for f in foo():
|
||||||
echo f
|
echo f
|
||||||
|
|
|
||||||
|
|
@ -802,7 +802,7 @@ when defined(sparc): # For SPARC architecture.
|
||||||
# Addresses decrease as the stack grows.
|
# Addresses decrease as the stack grows.
|
||||||
while sp <= max:
|
while sp <= max:
|
||||||
gcMark(gch, sp[])
|
gcMark(gch, sp[])
|
||||||
sp = cast[ppointer](cast[TAddress](sp) +% sizeof(pointer))
|
sp = cast[PPointer](cast[TAddress](sp) +% sizeof(pointer))
|
||||||
|
|
||||||
elif defined(ELATE):
|
elif defined(ELATE):
|
||||||
{.error: "stack marking code is to be written for this architecture".}
|
{.error: "stack marking code is to be written for this architecture".}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,18 @@ var a: PA[string]
|
||||||
new(a)
|
new(a)
|
||||||
a.field = "some string"
|
a.field = "some string"
|
||||||
|
|
||||||
|
|
||||||
|
proc someOther[T](len: string): seq[T] = discard
|
||||||
|
proc someOther[T](len: int): seq[T] = echo "we"
|
||||||
|
|
||||||
|
proc foo[T](x: T) =
|
||||||
|
var s = someOther[T](34)
|
||||||
|
#newSeq[T](34)
|
||||||
|
|
||||||
|
foo 23
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
when false:
|
when false:
|
||||||
# Compiles unless you use var a: PA[string]
|
# Compiles unless you use var a: PA[string]
|
||||||
type
|
type
|
||||||
|
|
|
||||||
|
|
@ -22,11 +22,11 @@ proc factory2(a, b: int): iterator (): int =
|
||||||
yield x
|
yield x
|
||||||
inc x
|
inc x
|
||||||
|
|
||||||
let foo = factory 1, 4
|
let foo = factory(1, 4)
|
||||||
|
|
||||||
for f in foo():
|
for f in foo():
|
||||||
echo f
|
echo f
|
||||||
|
|
||||||
let foo2 = factory2 1,2
|
let foo2 = factory2(1,2)
|
||||||
|
|
||||||
for f in foo2(): echo f
|
for f in foo2(): echo f
|
||||||
|
|
|
||||||
8
todo.txt
8
todo.txt
|
|
@ -4,10 +4,7 @@ version 0.9.4
|
||||||
- fix GC issues
|
- fix GC issues
|
||||||
- fix macros\tstringinterp.nim
|
- fix macros\tstringinterp.nim
|
||||||
- test and fix showoff
|
- test and fix showoff
|
||||||
- test C source code generation
|
- fix closure iterators
|
||||||
- fix closures
|
|
||||||
- test and fix exception handling
|
|
||||||
- implement 'union' and 'bits' pragmas
|
|
||||||
|
|
||||||
|
|
||||||
Bugs
|
Bugs
|
||||||
|
|
@ -28,6 +25,9 @@ Bugs
|
||||||
version 0.9.x
|
version 0.9.x
|
||||||
=============
|
=============
|
||||||
|
|
||||||
|
- implement 'union' and 'bits' pragmas
|
||||||
|
- fix closures
|
||||||
|
- test and fix exception handling
|
||||||
- ensure (ref T)(a, b) works as a type conversion and type constructor
|
- ensure (ref T)(a, b) works as a type conversion and type constructor
|
||||||
- optimize 'genericReset'; 'newException' leads to code bloat
|
- optimize 'genericReset'; 'newException' leads to code bloat
|
||||||
- stack-less GC
|
- stack-less GC
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue