diff options
Diffstat (limited to 'compiler/lowerings.nim')
-rw-r--r-- | compiler/lowerings.nim | 152 |
1 files changed, 76 insertions, 76 deletions
diff --git a/compiler/lowerings.nim b/compiler/lowerings.nim index 96afc4828..894efab5c 100644 --- a/compiler/lowerings.nim +++ b/compiler/lowerings.nim @@ -16,41 +16,41 @@ import ast, astalgo, types, idents, magicsys, msgs, options, modulegraphs, lineinfos proc newDeref*(n: PNode): PNode {.inline.} = - result = newNodeIT(nkHiddenDeref, n.info, n.typ.sons[0]) - addSon(result, n) + result = newNodeIT(nkHiddenDeref, n.info, n.typ[0]) + result.add n proc newTupleAccess*(g: ModuleGraph; tup: PNode, i: int): PNode = if tup.kind == nkHiddenAddr: result = newNodeIT(nkHiddenAddr, tup.info, tup.typ.skipTypes(abstractInst+{tyPtr, tyVar, tyLent})) - result.addSon(newNodeIT(nkBracketExpr, tup.info, tup.typ.skipTypes(abstractInst+{tyPtr, tyVar, tyLent}).sons[i])) - addSon(result[0], tup[0]) + result.add newNodeIT(nkBracketExpr, tup.info, tup.typ.skipTypes(abstractInst+{tyPtr, tyVar, tyLent})[i]) + result[0].add tup[0] var lit = newNodeIT(nkIntLit, tup.info, getSysType(g, tup.info, tyInt)) lit.intVal = i - addSon(result[0], lit) + result[0].add lit else: result = newNodeIT(nkBracketExpr, tup.info, tup.typ.skipTypes( - abstractInst).sons[i]) - addSon(result, copyTree(tup)) + abstractInst)[i]) + result.add copyTree(tup) var lit = newNodeIT(nkIntLit, tup.info, getSysType(g, tup.info, tyInt)) lit.intVal = i - addSon(result, lit) + result.add lit proc addVar*(father, v: PNode) = var vpart = newNodeI(nkIdentDefs, v.info, 3) - vpart.sons[0] = v - vpart.sons[1] = newNodeI(nkEmpty, v.info) - vpart.sons[2] = vpart[1] - addSon(father, vpart) + vpart[0] = v + vpart[1] = newNodeI(nkEmpty, v.info) + vpart[2] = vpart[1] + father.add vpart proc newAsgnStmt*(le, ri: PNode): PNode = result = newNodeI(nkAsgn, le.info, 2) - result.sons[0] = le - result.sons[1] = ri + result[0] = le + result[1] = ri proc newFastAsgnStmt*(le, ri: PNode): PNode = result = newNodeI(nkFastAsgn, le.info, 2) - result.sons[0] = le - result.sons[1] = ri + result[0] = le + result[1] = ri proc lowerTupleUnpacking*(g: ModuleGraph; n: PNode; owner: PSym): PNode = assert n.kind == nkVarTuple @@ -68,9 +68,9 @@ proc lowerTupleUnpacking*(g: ModuleGraph; n: PNode; owner: PSym): PNode = result.add(v) result.add newAsgnStmt(tempAsNode, value) - for i in 0 .. n.len-3: - if n.sons[i].kind == nkSym: v.addVar(n.sons[i]) - result.add newAsgnStmt(n.sons[i], newTupleAccess(g, tempAsNode, i)) + for i in 0..<n.len-2: + if n[i].kind == nkSym: v.addVar(n[i]) + result.add newAsgnStmt(n[i], newTupleAccess(g, tempAsNode, i)) proc evalOnce*(g: ModuleGraph; value: PNode; owner: PSym): PNode = ## Turns (value) into (let tmp = value; tmp) so that 'value' can be re-used @@ -90,10 +90,10 @@ proc evalOnce*(g: ModuleGraph; value: PNode; owner: PSym): PNode = proc newTupleAccessRaw*(tup: PNode, i: int): PNode = result = newNodeI(nkBracketExpr, tup.info) - addSon(result, copyTree(tup)) + result.add copyTree(tup) var lit = newNodeI(nkIntLit, tup.info) lit.intVal = i - addSon(result, lit) + result.add lit proc newTryFinally*(body, final: PNode): PNode = result = newTree(nkHiddenTryStmt, body, newTree(nkFinally, final)) @@ -107,31 +107,31 @@ proc lowerTupleUnpackingForAsgn*(g: ModuleGraph; n: PNode; owner: PSym): PNode = let tempAsNode = newSymNode(temp) #newIdentNode(getIdent(genPrefix & $temp.id), value.info) var vpart = newNodeI(nkIdentDefs, tempAsNode.info, 3) - vpart.sons[0] = tempAsNode - vpart.sons[1] = newNodeI(nkEmpty, value.info) - vpart.sons[2] = value - addSon(v, vpart) + vpart[0] = tempAsNode + vpart[1] = newNodeI(nkEmpty, value.info) + vpart[2] = value + v.add vpart result.add(v) - let lhs = n.sons[0] - for i in 0 .. lhs.len-1: - result.add newAsgnStmt(lhs.sons[i], newTupleAccessRaw(tempAsNode, i)) + let lhs = n[0] + for i in 0..<lhs.len: + result.add newAsgnStmt(lhs[i], newTupleAccessRaw(tempAsNode, i)) proc lowerSwap*(g: ModuleGraph; n: PNode; owner: PSym): PNode = result = newNodeI(nkStmtList, n.info) # note: cannot use 'skTemp' here cause we really need the copy for the VM :-( var temp = newSym(skVar, getIdent(g.cache, genPrefix), owner, n.info, owner.options) - temp.typ = n.sons[1].typ + temp.typ = n[1].typ incl(temp.flags, sfFromGeneric) var v = newNodeI(nkVarSection, n.info) let tempAsNode = newSymNode(temp) var vpart = newNodeI(nkIdentDefs, v.info, 3) - vpart.sons[0] = tempAsNode - vpart.sons[1] = newNodeI(nkEmpty, v.info) - vpart.sons[2] = n[1] - addSon(v, vpart) + vpart[0] = tempAsNode + vpart[1] = newNodeI(nkEmpty, v.info) + vpart[2] = n[1] + v.add vpart result.add(v) result.add newFastAsgnStmt(n[1], n[2]) @@ -159,8 +159,8 @@ template fieldCheck {.dirty.} = proc rawAddField*(obj: PType; field: PSym) = assert field.kind == skField - field.position = len(obj.n) - addSon(obj.n, newSymNode(field)) + field.position = obj.n.len + obj.n.add newSymNode(field) propagateToOwner(obj, field.typ) fieldCheck() @@ -168,36 +168,36 @@ proc rawIndirectAccess*(a: PNode; field: PSym; info: TLineInfo): PNode = # returns a[].field as a node assert field.kind == skField var deref = newNodeI(nkHiddenDeref, info) - deref.typ = a.typ.skipTypes(abstractInst).sons[0] - addSon(deref, a) + deref.typ = a.typ.skipTypes(abstractInst)[0] + deref.add a result = newNodeI(nkDotExpr, info) - addSon(result, deref) - addSon(result, newSymNode(field)) + result.add deref + result.add newSymNode(field) result.typ = field.typ proc rawDirectAccess*(obj, field: PSym): PNode = # returns a.field as a node assert field.kind == skField result = newNodeI(nkDotExpr, field.info) - addSon(result, newSymNode obj) - addSon(result, newSymNode field) + result.add newSymNode(obj) + result.add newSymNode(field) result.typ = field.typ proc lookupInRecord(n: PNode, id: int): PSym = result = nil case n.kind of nkRecList: - for i in 0 ..< len(n): - result = lookupInRecord(n.sons[i], id) + for i in 0..<n.len: + result = lookupInRecord(n[i], id) if result != nil: return of nkRecCase: - if n.sons[0].kind != nkSym: return - result = lookupInRecord(n.sons[0], id) + if n[0].kind != nkSym: return + result = lookupInRecord(n[0], id) if result != nil: return - for i in 1 ..< len(n): - case n.sons[i].kind + for i in 1..<n.len: + case n[i].kind of nkOfBranch, nkElse: - result = lookupInRecord(lastSon(n.sons[i]), id) + result = lookupInRecord(lastSon(n[i]), id) if result != nil: return else: discard of nkSym: @@ -214,8 +214,8 @@ proc addField*(obj: PType; s: PSym; cache: IdentCache) = field.typ = t assert t.kind != tyTyped propagateToOwner(obj, t) - field.position = len(obj.n) - addSon(obj.n, newSymNode(field)) + field.position = obj.n.len + obj.n.add newSymNode(field) fieldCheck() proc addUniqueField*(obj: PType; s: PSym; cache: IdentCache): PSym {.discardable.} = @@ -228,45 +228,45 @@ proc addUniqueField*(obj: PType; s: PSym; cache: IdentCache): PSym {.discardable field.typ = t assert t.kind != tyTyped propagateToOwner(obj, t) - field.position = len(obj.n) - addSon(obj.n, newSymNode(field)) + field.position = obj.n.len + obj.n.add newSymNode(field) result = field proc newDotExpr*(obj, b: PSym): PNode = result = newNodeI(nkDotExpr, obj.info) let field = lookupInRecord(obj.typ.n, b.id) assert field != nil, b.name.s - addSon(result, newSymNode(obj)) - addSon(result, newSymNode(field)) + result.add newSymNode(obj) + result.add newSymNode(field) result.typ = field.typ proc indirectAccess*(a: PNode, b: int, info: TLineInfo): PNode = # returns a[].b as a node var deref = newNodeI(nkHiddenDeref, info) - deref.typ = a.typ.skipTypes(abstractInst).sons[0] + deref.typ = a.typ.skipTypes(abstractInst)[0] var t = deref.typ.skipTypes(abstractInst) var field: PSym while true: assert t.kind == tyObject field = lookupInRecord(t.n, b) if field != nil: break - t = t.sons[0] + t = t[0] if t == nil: break t = t.skipTypes(skipPtrs) #if field == nil: # echo "FIELD ", b # debug deref.typ assert field != nil - addSon(deref, a) + deref.add a result = newNodeI(nkDotExpr, info) - addSon(result, deref) - addSon(result, newSymNode(field)) + result.add deref + result.add newSymNode(field) result.typ = field.typ proc indirectAccess*(a: PNode, b: string, info: TLineInfo; cache: IdentCache): PNode = # returns a[].b as a node var deref = newNodeI(nkHiddenDeref, info) - deref.typ = a.typ.skipTypes(abstractInst).sons[0] + deref.typ = a.typ.skipTypes(abstractInst)[0] var t = deref.typ.skipTypes(abstractInst) var field: PSym let bb = getIdent(cache, b) @@ -274,17 +274,17 @@ proc indirectAccess*(a: PNode, b: string, info: TLineInfo; cache: IdentCache): P assert t.kind == tyObject field = getSymFromList(t.n, bb) if field != nil: break - t = t.sons[0] + t = t[0] if t == nil: break t = t.skipTypes(skipPtrs) #if field == nil: # echo "FIELD ", b # debug deref.typ assert field != nil - addSon(deref, a) + deref.add a result = newNodeI(nkDotExpr, info) - addSon(result, deref) - addSon(result, newSymNode(field)) + result.add deref + result.add newSymNode(field) result.typ = field.typ proc getFieldFromObj*(t: PType; v: PSym): PSym = @@ -294,7 +294,7 @@ proc getFieldFromObj*(t: PType; v: PSym): PSym = assert t.kind == tyObject result = lookupInRecord(t.n, v.id) if result != nil: break - t = t.sons[0] + t = t[0] if t == nil: break t = t.skipTypes(skipPtrs) @@ -307,13 +307,13 @@ proc indirectAccess*(a, b: PSym, info: TLineInfo): PNode = proc genAddrOf*(n: PNode): PNode = result = newNodeI(nkAddr, n.info, 1) - result.sons[0] = n + result[0] = n result.typ = newType(tyPtr, n.typ.owner) result.typ.rawAddSon(n.typ) proc genDeref*(n: PNode; k = nkHiddenDeref): PNode = result = newNodeIT(k, n.info, - n.typ.skipTypes(abstractInst).sons[0]) + n.typ.skipTypes(abstractInst)[0]) result.add n proc callCodegenProc*(g: ModuleGraph; name: string; @@ -329,9 +329,9 @@ proc callCodegenProc*(g: ModuleGraph; name: string; if arg2 != nil: result.add arg2 if arg3 != nil: result.add arg3 if optionalArgs != nil: - for i in 1..optionalArgs.len-3: + for i in 1..<optionalArgs.len-2: result.add optionalArgs[i] - result.typ = sym.typ.sons[0] + result.typ = sym.typ[0] proc newIntLit*(g: ModuleGraph; info: TLineInfo; value: BiggestInt): PNode = result = nkIntLit.newIntNode(value) @@ -343,8 +343,8 @@ proc genHigh*(g: ModuleGraph; n: PNode): PNode = else: result = newNodeI(nkCall, n.info, 2) result.typ = getSysType(g, n.info, tyInt) - result.sons[0] = newSymNode(getSysMagic(g, n.info, "high", mHigh)) - result.sons[1] = n + result[0] = newSymNode(getSysMagic(g, n.info, "high", mHigh)) + result[1] = n proc genLen*(g: ModuleGraph; n: PNode): PNode = if skipTypes(n.typ, abstractVar).kind == tyArray: @@ -352,8 +352,8 @@ proc genLen*(g: ModuleGraph; n: PNode): PNode = else: result = newNodeI(nkCall, n.info, 2) result.typ = getSysType(g, n.info, tyInt) - result.sons[0] = newSymNode(getSysMagic(g, n.info, "len", mLengthSeq)) - result.sons[1] = n + result[0] = newSymNode(getSysMagic(g, n.info, "len", mLengthSeq)) + result[1] = n proc hoistExpr*(varSection, expr: PNode, name: PIdent, owner: PSym): PSym = result = newSym(skLet, name, owner, varSection.info, owner.options) @@ -361,8 +361,8 @@ proc hoistExpr*(varSection, expr: PNode, name: PIdent, owner: PSym): PSym = result.typ = expr.typ var varDef = newNodeI(nkIdentDefs, varSection.info, 3) - varDef.sons[0] = newSymNode(result) - varDef.sons[1] = newNodeI(nkEmpty, varSection.info) - varDef.sons[2] = expr + varDef[0] = newSymNode(result) + varDef[1] = newNodeI(nkEmpty, varSection.info) + varDef[2] = expr varSection.add varDef |