diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2018-08-05 09:38:14 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2018-08-05 09:38:14 +0200 |
commit | abe0725ab153b64dae388b99a285066c361f6cab (patch) | |
tree | 7f9451d9d80902567844316b4e3343771b1e0bef /compiler | |
parent | 700448f359fcaa397793d314eff7cf3aa2b13d18 (diff) | |
download | Nim-abe0725ab153b64dae388b99a285066c361f6cab.tar.gz |
WIP: nothing works
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/semtypes.nim | 40 |
1 files changed, 33 insertions, 7 deletions
diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim index c3784f7b6..29ed1b870 100644 --- a/compiler/semtypes.nim +++ b/compiler/semtypes.nim @@ -144,9 +144,7 @@ proc semSet(c: PContext, n: PNode, prev: PType): PType = localError(c.config, n.info, errXExpectsOneTypeParam % "set") addSonSkipIntLit(result, errorType(c)) -proc semContainer(c: PContext, n: PNode, kind: TTypeKind, kindStr: string, - prev: PType): PType = - result = newOrPrevType(kind, prev, c) +proc semContainerArg(c: PContext; n: PNode, kindStr: string; result: PType) = if sonsLen(n) == 2: var base = semTypeNode(c, n.sons[1], nil) if base.kind == tyVoid: @@ -156,6 +154,11 @@ proc semContainer(c: PContext, n: PNode, kind: TTypeKind, kindStr: string, localError(c.config, n.info, errXExpectsOneTypeParam % kindStr) addSonSkipIntLit(result, errorType(c)) +proc semContainer(c: PContext, n: PNode, kind: TTypeKind, kindStr: string, + prev: PType): PType = + result = newOrPrevType(kind, prev, c) + semContainerArg(c, n, kindStr, result) + proc semVarargs(c: PContext, n: PNode, prev: PType): PType = result = newOrPrevType(tyVarargs, prev, c) if sonsLen(n) == 2 or sonsLen(n) == 3: @@ -1505,9 +1508,29 @@ proc semTypeNode(c: PContext, n: PNode, prev: PType): PType = of mSet: result = semSet(c, n, prev) of mOrdinal: result = semOrdinal(c, n, prev) of mSeq: - result = semContainer(c, n, tySequence, "seq", prev) + let s = c.graph.sysTypes[tySequence] + assert s != nil + assert prev == nil + result = copyType(s, s.owner, keepId=false) + # XXX figure out why this has children already... + result.sons.setLen 0 + result.n = nil if c.config.selectedGc == gcDestructors: - incl result.flags, tfHasAsgn + result.flags = {tfHasAsgn} + else: + result.flags = {} + semContainerArg(c, n, "seq", result) + when false: + debugT = true + echo "Start!" + #debug result + assert(not containsGenericType(result)) + debugT = false + echo "End!" + when false: + result = semContainer(c, n, tySequence, "seq", prev) + if c.config.selectedGc == gcDestructors: + incl result.flags, tfHasAsgn of mOpt: result = semContainer(c, n, tyOpt, "opt", prev) of mVarargs: result = semVarargs(c, n, prev) of mTypeDesc, mTypeTy: @@ -1681,8 +1704,9 @@ proc processMagicType(c: PContext, m: PSym) = of mString: setMagicType(c.config, m, tyString, c.config.target.ptrSize) rawAddSon(m.typ, getSysType(c.graph, m.info, tyChar)) - if c.config.selectedGc == gcDestructors: - incl m.typ.flags, tfHasAsgn + when false: + if c.config.selectedGc == gcDestructors: + incl m.typ.flags, tfHasAsgn of mCstring: setMagicType(c.config, m, tyCString, c.config.target.ptrSize) rawAddSon(m.typ, getSysType(c.graph, m.info, tyChar)) @@ -1724,6 +1748,8 @@ proc processMagicType(c: PContext, m: PSym) = setMagicType(c.config, m, tySequence, 0) if c.config.selectedGc == gcDestructors: incl m.typ.flags, tfHasAsgn + assert c.graph.sysTypes[tySequence] == nil + c.graph.sysTypes[tySequence] = m.typ of mOpt: setMagicType(c.config, m, tyOpt, 0) of mOrdinal: |