diff options
Diffstat (limited to 'compiler/transf.nim')
-rwxr-xr-x | compiler/transf.nim | 41 |
1 files changed, 33 insertions, 8 deletions
diff --git a/compiler/transf.nim b/compiler/transf.nim index cdc89538c..f0a8caadb 100755 --- a/compiler/transf.nim +++ b/compiler/transf.nim @@ -17,7 +17,7 @@ # * introduces method dispatchers import - strutils, lists, options, ast, astalgo, trees, treetab, evals, msgs, os, + strutils, lists, options, ast, astalgo, trees, treetab, msgs, os, idents, renderer, types, passes, semfold, magicsys, cgmeth const @@ -178,10 +178,10 @@ proc transformSymAux(c: PTransf, n: PNode): PNode = result = b case b.sym.kind of skConst, skEnumField: - # BUGFIX: skEnumField was missing - if not (skipTypes(b.sym.typ, abstractInst).kind in ConstantDataTypes): - result = getConstExpr(c.module, b) - if result == nil: InternalError(b.info, "transformSym: const") + if sfFakeConst notin b.sym.flags: + if skipTypes(b.sym.typ, abstractInst).kind notin ConstantDataTypes: + result = getConstExpr(c.module, b) + if result == nil: InternalError(b.info, "transformSym: const") else: nil @@ -223,6 +223,26 @@ proc transformVarSection(c: PTransf, v: PNode): PTransNode = defs[L-1] = transform(c, it.sons[L-1]) result[i] = defs +proc transformConstSection(c: PTransf, v: PNode): PTransNode = + result = newTransNode(v) + for i in countup(0, sonsLen(v)-1): + var it = v.sons[i] + if it.kind == nkCommentStmt: + result[i] = PTransNode(it) + else: + if it.kind != nkConstDef: InternalError(it.info, "transformConstSection") + if it.sons[0].kind != nkSym: + InternalError(it.info, "transformConstSection") + if sfFakeConst in it[0].sym.flags: + var b = newNodeI(nkConstDef, it.info) + addSon(b, it[0]) + addSon(b, ast.emptyNode) # no type description + addSon(b, transform(c, it[2]).pnode) + result[i] = PTransNode(b) + else: + result[i] = PTransNode(it) + + proc hasContinue(n: PNode): bool = case n.kind of nkEmpty..nkNilLit, nkForStmt, nkWhileStmt: nil @@ -532,7 +552,7 @@ proc addFormalParam(routine: PSym, param: PSym) = addSon(routine.ast.sons[paramsPos], newSymNode(param)) proc indirectAccess(a, b: PSym): PNode = - # returns a^ .b as a node + # returns a[].b as a node var x = newSymNode(a) var y = newSymNode(b) var deref = newNodeI(nkHiddenDeref, x.info) @@ -698,9 +718,9 @@ proc transform(c: PTransf, n: PNode): PTransNode = result = PTransNode(newNode(nkCommentStmt)) of nkCommentStmt, nkTemplateDef: return n.ptransNode - of nkConstSection: + of nkConstSection: # do not replace ``const c = 3`` with ``const 3 = 3`` - return n.ptransNode + return transformConstSection(c, n) of nkVarSection: if c.inlining > 0: # we need to copy the variables for multiple yield statements: @@ -722,6 +742,7 @@ proc processTransf(context: PPassContext, n: PNode): PNode = # Note: For interactive mode we cannot call 'passes.skipCodegen' and skip # this step! We have to rely that the semantic pass transforms too errornous # nodes into an empty node. + if passes.skipCodegen(n): return n var c = PTransf(context) pushTransCon(c, newTransCon(getCurrOwner(c))) result = PNode(transform(c, n)) @@ -740,3 +761,7 @@ proc transfPass(): TPass = result.process = processTransf result.close = processTransf # we need to process generics too! +proc transform*(module: PSym, n: PNode): PNode = + var c = openTransf(module, "") + result = processTransf(c, n) + |