summary refs log tree commit diff stats
path: root/compiler/vmconv.nim
blob: 7db3906c2091c597a41cd4e54c1f0142f9508267 (plain) (blame)
1
2
3
4
5
6pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { col
import ast

template elementType*(T: typedesc): typedesc =
  typeof(block:
    var a: T
    for ai in a: ai)

proc fromLit*(a: PNode, T: typedesc): auto =
  ## generic PNode => type
  ## see also reverse operation `toLit`
  when T is set:
    result = default(T)
    type Ti = elementType(T)
    for ai in a:
      result.incl Ti(ai.intVal)
  else:
    static: doAssert false, "not yet supported: " & $T # add as needed

proc toLit*[T](a: T): PNode =
  ## generic type => PNode
  ## see also reverse operation `fromLit`
  when T is string: newStrNode(nkStrLit, a)
  elif T is Ordinal: newIntNode(nkIntLit, a.ord)
  elif T is (proc): newNode(nkNilLit)
  elif T is ref:
    if a == nil: newNode(nkNilLit)
    else: toLit(a[])
  elif T is tuple:
    result = newTree(nkTupleConstr)
    for ai in fields(a): result.add toLit(ai)
  elif T is object:
    result = newTree(nkObjConstr)
    result.add(newNode(nkEmpty))
    for k, ai in fieldPairs(a):
      let reti = newNode(nkExprColonExpr)
      reti.add k.toLit
      reti.add ai.toLit
      result.add reti
  else:
    static: doAssert false, "not yet supported: " & $T # add as needed