diff options
author | Araq <rumpf_a@web.de> | 2019-04-29 13:35:30 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2019-04-29 13:36:00 +0200 |
commit | 0a84b8fb4d154cb04b1383aa2bf3fcf606b4b8a4 (patch) | |
tree | 5f223c13db101977e9260cc3536019897c62872c /compiler | |
parent | ddc86d1b4b8104758f95a82534ff945c6853b803 (diff) | |
download | Nim-0a84b8fb4d154cb04b1383aa2bf3fcf606b4b8a4.tar.gz |
added system.unown to make 'owned' sane to use in practice; later on we might change the type inference rules to make it more convenient
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/ast.nim | 2 | ||||
-rw-r--r-- | compiler/ccgexprs.nim | 2 | ||||
-rw-r--r-- | compiler/jsgen.nim | 2 | ||||
-rw-r--r-- | compiler/semmagic.nim | 35 | ||||
-rw-r--r-- | compiler/semstmts.nim | 12 | ||||
-rw-r--r-- | compiler/vmgen.nim | 2 |
6 files changed, 47 insertions, 8 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim index c98b2a576..aeb19ae1a 100644 --- a/compiler/ast.nim +++ b/compiler/ast.nim @@ -644,7 +644,7 @@ type mSwap, mIsNil, mArrToSeq, mCopyStr, mCopyStrLast, mNewString, mNewStringOfCap, mParseBiggestFloat, mMove, mWasMoved, mDestroy, - mDefault, mAccessEnv, mReset, + mDefault, mUnown, mAccessEnv, mReset, mArray, mOpenArray, mRange, mSet, mSeq, mOpt, mVarargs, mRef, mPtr, mVar, mDistinct, mVoid, mTuple, mOrdinal, diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 0ac6b42f4..e03c4b1c1 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -2179,7 +2179,7 @@ proc genMagicExpr(p: BProc, e: PNode, d: var TLoc, op: TMagic) = of mCharToStr: genDollar(p, e, d, "#nimCharToStr($1)") of mFloatToStr: genDollar(p, e, d, "#nimFloatToStr($1)") of mCStrToStr: genDollar(p, e, d, "#cstrToNimstr($1)") - of mStrToStr: expr(p, e.sons[1], d) + of mStrToStr, mUnown: expr(p, e.sons[1], d) of mEnumToStr: if optNimV2 in p.config.globalOptions: genEnumToStr(p, e, d) diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index 750d7c2c2..8f15d8f49 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -640,7 +640,7 @@ proc arithAux(p: PProc, n: PNode, r: var TCompRes, op: TMagic) = of mInt64ToStr: applyFormat("cstrToNimstr(($1)+\"\")", "cstrToNimstr(($1)+\"\")") of mFloatToStr: applyFormat("cstrToNimstr(($1)+\"\")", "cstrToNimstr(($1)+\"\")") of mCStrToStr: applyFormat("cstrToNimstr($1)", "cstrToNimstr($1)") - of mStrToStr: applyFormat("$1", "$1") + of mStrToStr, mUnown: applyFormat("$1", "$1") else: assert false, $op diff --git a/compiler/semmagic.nim b/compiler/semmagic.nim index f290a08d5..7c75d8624 100644 --- a/compiler/semmagic.nim +++ b/compiler/semmagic.nim @@ -322,6 +322,39 @@ proc semOf(c: PContext, n: PNode): PNode = n.typ = getSysType(c.graph, n.info, tyBool) result = n +proc semUnown(c: PContext; n: PNode): PNode = + proc unownedType(c: PContext; t: PType): PType = + case t.kind + of tyTuple: + var elems = newSeq[PType](t.len) + var someChange = false + for i in 0..<t.len: + elems[i] = unownedType(c, t[i]) + if elems[i] != t[i]: someChange = true + if someChange: + result = newType(tyTuple, t.owner) + # we have to use 'rawAddSon' here so that type flags are + # properly computed: + for e in elems: result.rawAddSon(e) + else: + result = t + of tyOwned: result = t.sons[0] + of tySequence, tyOpenArray, tyArray, tyVarargs, tyVar, tyLent, + tyGenericInst, tyAlias: + let L = t.len-1 + let b = unownedType(c, t[L]) + if b != t[L]: + result = copyType(t, t.owner, keepId = false) + result[L] = b + result.flags.excl tfHasOwned + else: + result = t + else: + result = t + + result = copyTree(n[1]) + result.typ = unownedType(c, result.typ) + proc magicsAfterOverloadResolution(c: PContext, n: PNode, flags: TExprFlags): PNode = ## This is the preferred code point to implement magics. @@ -433,4 +466,6 @@ proc magicsAfterOverloadResolution(c: PContext, n: PNode, let t = n[1].typ.skipTypes(abstractVar) if t.destructor != nil: result.sons[0] = newSymNode(t.destructor) + of mUnown: + result = semUnown(c, n) else: result = n diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index a71a57175..230a9c0d4 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -471,10 +471,14 @@ proc semVarOrLet(c: PContext, n: PNode, symkind: TSymKind): PNode = ($typ.kind).substr(2).toLowerAscii) elif typ.kind == tyProc and tfUnresolved in typ.flags: localError(c.config, def.info, errProcHasNoConcreteType % def.renderTree) - elif symkind == skVar and typ.kind == tyOwned and def.kind notin nkCallKinds: - # special type inference rule: 'var it = ownedPointer' is turned - # into an unowned pointer. - typ = typ.lastSon + when false: + # XXX This typing rule is neither documented nor complete enough to + # justify it. Instead use the newer 'unowned x' until we figured out + # a more general solution. + if symkind == skVar and typ.kind == tyOwned and def.kind notin nkCallKinds: + # special type inference rule: 'var it = ownedPointer' is turned + # into an unowned pointer. + typ = typ.lastSon else: if symkind == skLet: localError(c.config, a.info, errLetNeedsInit) diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim index 8dbcc03a4..3a46af08a 100644 --- a/compiler/vmgen.nim +++ b/compiler/vmgen.nim @@ -957,7 +957,7 @@ proc genMagic(c: PCtx; n: PNode; dest: var TDest; m: TMagic) = c.genNarrow(n.sons[1], d) c.genAsgnPatch(n.sons[1], d) c.freeTemp(d) - of mOrd, mChr, mArrToSeq: c.gen(n.sons[1], dest) + of mOrd, mChr, mArrToSeq, mUnown: c.gen(n.sons[1], dest) of mNew, mNewFinalize: unused(c, n, dest) c.genNew(n) |