more fixes for dy(n)lib typo; fixes #15

This commit is contained in:
Araq 2011-03-08 22:45:57 +01:00
commit 62b4cc6c02
17 changed files with 140 additions and 101 deletions

View file

@ -38,42 +38,34 @@ type
efNone, efLValue
TEvalFlags = set[TEvalFlag]
proc newStackFrame*(): PStackFrame
proc pushStackFrame*(c: PEvalContext, t: PStackFrame)
proc popStackFrame*(c: PEvalContext)
proc newEvalContext*(module: PSym, filename: string,
optEval: bool): PEvalContext
proc eval*(c: PEvalContext, n: PNode): PNode
# eval never returns nil! This simplifies the code a lot and
# makes it faster too.
proc evalConstExpr*(module: PSym, e: PNode): PNode
proc evalPass*(): TPass
# implementation
const
evalMaxIterations = 500_000 # max iterations of all loops
evalMaxRecDepth = 10_000 # max recursion depth for evaluation
evalMaxRecDepth = 10_000 # max recursion depth for evaluation
# Much better: use a timeout! -> Wether code compiles depends on the machine
# the compiler runs on then! Bad idea!
proc newStackFrame(): PStackFrame =
proc newStackFrame*(): PStackFrame =
new(result)
initIdNodeTable(result.mapping)
result.params = @[]
proc newEvalContext(module: PSym, filename: string,
optEval: bool): PEvalContext =
proc newEvalContext*(module: PSym, filename: string,
optEval: bool): PEvalContext =
new(result)
result.module = module
result.optEval = optEval
proc pushStackFrame(c: PEvalContext, t: PStackFrame) =
proc pushStackFrame*(c: PEvalContext, t: PStackFrame) {.inline.} =
t.next = c.tos
c.tos = t
proc popStackFrame(c: PEvalContext) =
proc popStackFrame*(c: PEvalContext) {.inline.} =
if (c.tos == nil): InternalError("popStackFrame")
c.tos = c.tos.next
@ -83,10 +75,19 @@ proc stackTraceAux(x: PStackFrame) =
if x != nil:
stackTraceAux(x.next)
var info = if x.call != nil: x.call.info else: UnknownLineInfo()
MsgWriteln(`%`("file: $1, line: $2",
[toFilename(info), $(toLineNumber(info))]))
# we now use the same format as in system/except.nim
var s = toFilename(info)
var line = toLineNumber(info)
if line > 0:
add(s, '(')
add(s, $line)
add(s, ')')
if x.prc != nil:
for k in 1..max(1, 25-s.len): add(s, ' ')
add(s, x.prc.name.s)
MsgWriteln(s)
proc stackTrace(c: PEvalContext, n: PNode, msg: TMsgKind, arg: string = "") =
proc stackTrace(c: PEvalContext, n: PNode, msg: TMsgKind, arg = "") =
MsgWriteln("stack trace: (most recent call last)")
stackTraceAux(c.tos)
Fatal(n.info, msg, arg)
@ -253,7 +254,6 @@ proc evalVar(c: PEvalContext, n: PNode): PNode =
assert(a.sons[0].kind == nkSym)
var v = a.sons[0].sym
if a.sons[2].kind != nkEmpty:
#if a.sons[2].kind == nkNone: echo "Yep"
result = evalAux(c, a.sons[2], {})
if isSpecial(result): return
else:
@ -373,6 +373,7 @@ proc evalAsgn(c: PEvalContext, n: PNode): PNode =
discardSons(x)
for i in countup(0, sonsLen(result) - 1): addSon(x, result.sons[i])
result = emptyNode
assert result.kind == nkEmpty
proc evalSwap(c: PEvalContext, n: PNode): PNode =
result = evalAux(c, n.sons[0], {efLValue})
@ -918,7 +919,7 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode =
result = evalAux(c, n.sons[2], {efLValue})
if result.kind == nkExceptBranch: return
var a = result
if (k < 0) or (k > ord(high(TNodeKind))):
if k < 0 or k > ord(high(TNodeKind)):
internalError(n.info, "request to create a NimNode with invalid kind")
result = newNodeI(TNodeKind(int(k)),
if a.kind == nkNilLit: n.info else: a.info)
@ -1015,8 +1016,7 @@ proc evalAux(c: PEvalContext, n: PNode, flags: TEvalFlags): PNode =
case n.kind # atoms:
of nkEmpty: result = n
of nkSym: result = evalSym(c, n, flags)
of nkType..pred(nkNilLit): result = copyNode(n)
of nkNilLit: result = n # end of atoms
of nkType..nkNilLit: result = copyNode(n) # end of atoms
of nkCall, nkHiddenCallConv, nkMacroStmt, nkCommand, nkCallStrLit:
result = evalMagicOrCall(c, n)
of nkCurly, nkBracket, nkRange:
@ -1089,7 +1089,7 @@ proc evalConstExpr(module: PSym, e: PNode): PNode =
s.call = e
pushStackFrame(p, s)
result = eval(p, e)
if (result != nil) and (result.kind == nkExceptBranch): result = nil
if result != nil and result.kind == nkExceptBranch: result = nil
popStackFrame(p)
proc myOpen(module: PSym, filename: string): PPassContext =
@ -1100,7 +1100,7 @@ proc myOpen(module: PSym, filename: string): PPassContext =
proc myProcess(c: PPassContext, n: PNode): PNode =
result = eval(PEvalContext(c), n)
proc evalPass(): TPass =
proc evalPass*(): TPass =
initPass(result)
result.open = myOpen
result.close = myProcess