variable dynamic lib names
This commit is contained in:
parent
3b7ef2288f
commit
7063670a2c
14 changed files with 504 additions and 766 deletions
243
rod/evals.nim
243
rod/evals.nim
|
|
@ -54,9 +54,10 @@ var emptyNode: PNode
|
|||
proc newStackFrame(): PStackFrame =
|
||||
new(result)
|
||||
initIdNodeTable(result.mapping)
|
||||
result.params = @ []
|
||||
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
|
||||
|
|
@ -70,6 +71,7 @@ proc popStackFrame(c: PEvalContext) =
|
|||
c.tos = c.tos.next
|
||||
|
||||
proc evalAux(c: PEvalContext, n: PNode): PNode
|
||||
|
||||
proc stackTraceAux(x: PStackFrame) =
|
||||
if x != nil:
|
||||
stackTraceAux(x.next)
|
||||
|
|
@ -85,9 +87,8 @@ proc isSpecial(n: PNode): bool =
|
|||
result = (n.kind == nkExceptBranch) or (n.kind == nkEmpty)
|
||||
|
||||
proc evalIf(c: PEvalContext, n: PNode): PNode =
|
||||
var i, length: int
|
||||
i = 0
|
||||
length = sonsLen(n)
|
||||
var i = 0
|
||||
var length = sonsLen(n)
|
||||
while (i < length) and (sonsLen(n.sons[i]) >= 2):
|
||||
result = evalAux(c, n.sons[i].sons[0])
|
||||
if isSpecial(result): return
|
||||
|
|
@ -100,10 +101,9 @@ proc evalIf(c: PEvalContext, n: PNode): PNode =
|
|||
result = emptyNode
|
||||
|
||||
proc evalCase(c: PEvalContext, n: PNode): PNode =
|
||||
var res: PNode
|
||||
result = evalAux(c, n.sons[0])
|
||||
if isSpecial(result): return
|
||||
res = result
|
||||
var res = result
|
||||
result = emptyNode
|
||||
for i in countup(1, sonsLen(n) - 1):
|
||||
if n.sons[i].kind == nkOfBranch:
|
||||
|
|
@ -114,11 +114,11 @@ proc evalCase(c: PEvalContext, n: PNode): PNode =
|
|||
result = evalAux(c, lastSon(n.sons[i]))
|
||||
|
||||
var
|
||||
gWhileCounter: int # Use a counter to prevent endless loops!
|
||||
# We make this counter global, because otherwise
|
||||
# nested loops could make the compiler extremely slow.
|
||||
gNestedEvals: int # count the recursive calls to ``evalAux`` to prevent
|
||||
# endless recursion
|
||||
gWhileCounter: int # Use a counter to prevent endless loops!
|
||||
# We make this counter global, because otherwise
|
||||
# nested loops could make the compiler extremely slow.
|
||||
gNestedEvals: int # count the recursive calls to ``evalAux`` to prevent
|
||||
# endless recursion
|
||||
|
||||
proc evalWhile(c: PEvalContext, n: PNode): PNode =
|
||||
while true:
|
||||
|
|
@ -152,8 +152,7 @@ proc evalBlock(c: PEvalContext, n: PNode): PNode =
|
|||
result = emptyNode # consume ``break`` token
|
||||
|
||||
proc evalFinally(c: PEvalContext, n, exc: PNode): PNode =
|
||||
var finallyNode: PNode
|
||||
finallyNode = lastSon(n)
|
||||
var finallyNode = lastSon(n)
|
||||
if finallyNode.kind == nkFinally:
|
||||
result = evalAux(c, finallyNode)
|
||||
if result.kind != nkExceptBranch: result = exc
|
||||
|
|
@ -161,9 +160,6 @@ proc evalFinally(c: PEvalContext, n, exc: PNode): PNode =
|
|||
result = exc
|
||||
|
||||
proc evalTry(c: PEvalContext, n: PNode): PNode =
|
||||
var
|
||||
exc: PNode
|
||||
i, length, blen: int
|
||||
result = evalAux(c, n.sons[0])
|
||||
case result.kind
|
||||
of nkBreakStmt, nkReturnToken:
|
||||
|
|
@ -172,11 +168,11 @@ proc evalTry(c: PEvalContext, n: PNode): PNode =
|
|||
if sonsLen(result) >= 1:
|
||||
# creating a nkExceptBranch without sons means that it could not be
|
||||
# evaluated
|
||||
exc = result
|
||||
i = 1
|
||||
length = sonsLen(n)
|
||||
var exc = result
|
||||
var i = 1
|
||||
var length = sonsLen(n)
|
||||
while (i < length) and (n.sons[i].kind == nkExceptBranch):
|
||||
blen = sonsLen(n.sons[i])
|
||||
var blen = sonsLen(n.sons[i])
|
||||
if blen == 1:
|
||||
# general except section:
|
||||
result = evalAux(c, n.sons[i].sons[0])
|
||||
|
|
@ -194,8 +190,7 @@ proc evalTry(c: PEvalContext, n: PNode): PNode =
|
|||
else: result = evalFinally(c, n, emptyNode)
|
||||
|
||||
proc getNullValue(typ: PType, info: TLineInfo): PNode =
|
||||
var t: PType
|
||||
t = skipTypes(typ, abstractRange)
|
||||
var t = skipTypes(typ, abstractRange)
|
||||
result = emptyNode
|
||||
case t.kind
|
||||
of tyBool, tyChar, tyInt..tyInt64:
|
||||
|
|
@ -219,15 +214,12 @@ proc getNullValue(typ: PType, info: TLineInfo): PNode =
|
|||
else: InternalError("getNullValue")
|
||||
|
||||
proc evalVar(c: PEvalContext, n: PNode): PNode =
|
||||
var
|
||||
v: PSym
|
||||
a: PNode
|
||||
for i in countup(0, sonsLen(n) - 1):
|
||||
a = n.sons[i]
|
||||
var a = n.sons[i]
|
||||
if a.kind == nkCommentStmt: continue
|
||||
assert(a.kind == nkIdentDefs)
|
||||
assert(a.sons[0].kind == nkSym)
|
||||
v = a.sons[0].sym
|
||||
var v = a.sons[0].sym
|
||||
if a.sons[2] != nil:
|
||||
result = evalAux(c, a.sons[2])
|
||||
if isSpecial(result): return
|
||||
|
|
@ -237,14 +229,11 @@ proc evalVar(c: PEvalContext, n: PNode): PNode =
|
|||
result = emptyNode
|
||||
|
||||
proc evalCall(c: PEvalContext, n: PNode): PNode =
|
||||
var
|
||||
d: PStackFrame
|
||||
prc: PNode
|
||||
result = evalAux(c, n.sons[0])
|
||||
if isSpecial(result): return
|
||||
prc = result # bind the actual params to the local parameter
|
||||
# of a new binding
|
||||
d = newStackFrame()
|
||||
var prc = result
|
||||
# bind the actual params to the local parameter of a new binding
|
||||
var d = newStackFrame()
|
||||
d.call = n
|
||||
if prc.kind == nkSym:
|
||||
d.prc = prc.sym
|
||||
|
|
@ -265,8 +254,7 @@ proc evalCall(c: PEvalContext, n: PNode): PNode =
|
|||
proc evalVariable(c: PStackFrame, sym: PSym): PNode =
|
||||
# We need to return a node to the actual value,
|
||||
# which can be modified.
|
||||
var x: PStackFrame
|
||||
x = c
|
||||
var x = c
|
||||
while x != nil:
|
||||
if sfResult in sym.flags:
|
||||
return x.params[0]
|
||||
|
|
@ -276,15 +264,12 @@ proc evalVariable(c: PStackFrame, sym: PSym): PNode =
|
|||
result = emptyNode
|
||||
|
||||
proc evalArrayAccess(c: PEvalContext, n: PNode): PNode =
|
||||
var
|
||||
x: PNode
|
||||
idx: biggestInt
|
||||
result = evalAux(c, n.sons[0])
|
||||
if isSpecial(result): return
|
||||
x = result
|
||||
var x = result
|
||||
result = evalAux(c, n.sons[1])
|
||||
if isSpecial(result): return
|
||||
idx = getOrdValue(result)
|
||||
var idx = getOrdValue(result)
|
||||
result = emptyNode
|
||||
case x.kind
|
||||
of nkBracket, nkPar, nkMetaNode:
|
||||
|
|
@ -436,15 +421,14 @@ proc evalAnd(c: PEvalContext, n: PNode): PNode =
|
|||
if result.intVal != 0: result = evalAux(c, n.sons[2])
|
||||
|
||||
proc evalNoOpt(c: PEvalContext, n: PNode): PNode =
|
||||
result = newNodeI(nkExceptBranch, n.info) # creating a nkExceptBranch without sons means that it could not be
|
||||
# evaluated
|
||||
result = newNodeI(nkExceptBranch, n.info)
|
||||
# creating a nkExceptBranch without sons means that it could not be evaluated
|
||||
|
||||
proc evalNew(c: PEvalContext, n: PNode): PNode =
|
||||
var t: PType
|
||||
if c.optEval:
|
||||
result = evalNoOpt(c, n)
|
||||
else:
|
||||
t = skipTypes(n.sons[1].typ, abstractVar)
|
||||
var t = skipTypes(n.sons[1].typ, abstractVar)
|
||||
result = newNodeIT(nkRefTy, n.info, t)
|
||||
addSon(result, getNullValue(t.sons[0], n.info))
|
||||
|
||||
|
|
@ -457,13 +441,10 @@ proc evalDeref(c: PEvalContext, n: PNode): PNode =
|
|||
else: InternalError(n.info, "evalDeref " & $result.kind)
|
||||
|
||||
proc evalAddr(c: PEvalContext, n: PNode): PNode =
|
||||
var
|
||||
a: PNode
|
||||
t: PType
|
||||
result = evalAux(c, n.sons[0])
|
||||
if isSpecial(result): return
|
||||
a = result
|
||||
t = newType(tyPtr, c.module)
|
||||
var a = result
|
||||
var t = newType(tyPtr, c.module)
|
||||
addSon(t, a.typ)
|
||||
result = newNodeIT(nkRefTy, n.info, t)
|
||||
addSon(result, a)
|
||||
|
|
@ -477,11 +458,10 @@ proc evalCheckedFieldAccess(c: PEvalContext, n: PNode): PNode =
|
|||
result = evalAux(c, n.sons[0])
|
||||
|
||||
proc evalUpConv(c: PEvalContext, n: PNode): PNode =
|
||||
var dest, src: PType
|
||||
result = evalAux(c, n.sons[0])
|
||||
if isSpecial(result): return
|
||||
dest = skipTypes(n.typ, abstractPtrs)
|
||||
src = skipTypes(result.typ, abstractPtrs)
|
||||
var dest = skipTypes(n.typ, abstractPtrs)
|
||||
var src = skipTypes(result.typ, abstractPtrs)
|
||||
if inheritanceDiff(src, dest) > 0:
|
||||
stackTrace(c, n, errInvalidConversionFromTypeX, typeToString(src))
|
||||
|
||||
|
|
@ -710,48 +690,27 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode =
|
|||
k: biggestInt
|
||||
m = getMagic(n)
|
||||
case m
|
||||
of mNone:
|
||||
result = evalCall(c, n)
|
||||
of mIs:
|
||||
result = evalIs(c, n)
|
||||
of mSizeOf:
|
||||
internalError(n.info, "sizeof() should have been evaluated")
|
||||
of mHigh:
|
||||
result = evalHigh(c, n)
|
||||
of mAssert:
|
||||
result = evalAssert(c, n)
|
||||
of mExit:
|
||||
result = evalExit(c, n)
|
||||
of mNew, mNewFinalize:
|
||||
result = evalNew(c, n)
|
||||
of mNewSeq:
|
||||
result = evalNewSeq(c, n)
|
||||
of mSwap:
|
||||
result = evalSwap(c, n)
|
||||
of mInc:
|
||||
result = evalIncDec(c, n, 1)
|
||||
of ast.mDec:
|
||||
result = evalIncDec(c, n, - 1)
|
||||
of mEcho:
|
||||
result = evalEcho(c, n)
|
||||
of mSetLengthStr:
|
||||
result = evalSetLengthStr(c, n)
|
||||
of mSetLengthSeq:
|
||||
result = evalSetLengthSeq(c, n)
|
||||
of mIncl:
|
||||
result = evalIncl(c, n)
|
||||
of mExcl:
|
||||
result = evalExcl(c, n)
|
||||
of mAnd:
|
||||
result = evalAnd(c, n)
|
||||
of mOr:
|
||||
result = evalOr(c, n)
|
||||
of mAppendStrCh:
|
||||
result = evalAppendStrCh(c, n)
|
||||
of mAppendStrStr:
|
||||
result = evalAppendStrStr(c, n)
|
||||
of mAppendSeqElem:
|
||||
result = evalAppendSeqElem(c, n)
|
||||
of mNone: result = evalCall(c, n)
|
||||
of mIs: result = evalIs(c, n)
|
||||
of mSizeOf: internalError(n.info, "sizeof() should have been evaluated")
|
||||
of mHigh: result = evalHigh(c, n)
|
||||
of mAssert: result = evalAssert(c, n)
|
||||
of mExit: result = evalExit(c, n)
|
||||
of mNew, mNewFinalize: result = evalNew(c, n)
|
||||
of mNewSeq: result = evalNewSeq(c, n)
|
||||
of mSwap: result = evalSwap(c, n)
|
||||
of mInc: result = evalIncDec(c, n, 1)
|
||||
of ast.mDec: result = evalIncDec(c, n, - 1)
|
||||
of mEcho: result = evalEcho(c, n)
|
||||
of mSetLengthStr: result = evalSetLengthStr(c, n)
|
||||
of mSetLengthSeq: result = evalSetLengthSeq(c, n)
|
||||
of mIncl: result = evalIncl(c, n)
|
||||
of mExcl: result = evalExcl(c, n)
|
||||
of mAnd: result = evalAnd(c, n)
|
||||
of mOr: result = evalOr(c, n)
|
||||
of mAppendStrCh: result = evalAppendStrCh(c, n)
|
||||
of mAppendStrStr: result = evalAppendStrStr(c, n)
|
||||
of mAppendSeqElem: result = evalAppendSeqElem(c, n)
|
||||
of mNLen:
|
||||
result = evalAux(c, n.sons[1])
|
||||
if isSpecial(result): return
|
||||
|
|
@ -848,8 +807,7 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode =
|
|||
result = evalAux(c, n.sons[1])
|
||||
if isSpecial(result): return
|
||||
if result.kind != nkIdent: InternalError(n.info, "no symbol")
|
||||
of mNGetType:
|
||||
result = evalAux(c, n.sons[1])
|
||||
of mNGetType: result = evalAux(c, n.sons[1])
|
||||
of mNStrVal:
|
||||
result = evalAux(c, n.sons[1])
|
||||
if isSpecial(result): return
|
||||
|
|
@ -1009,14 +967,10 @@ proc evalAux(c: PEvalContext, n: PNode): PNode =
|
|||
dec(gNestedEvals)
|
||||
if gNestedEvals <= 0: stackTrace(c, n, errTooManyIterations)
|
||||
case n.kind # atoms:
|
||||
of nkEmpty:
|
||||
result = n
|
||||
of nkSym:
|
||||
result = evalSym(c, n)
|
||||
of nkType..pred(nkNilLit):
|
||||
result = copyNode(n)
|
||||
of nkNilLit:
|
||||
result = n # end of atoms
|
||||
of nkEmpty: result = n
|
||||
of nkSym: result = evalSym(c, n)
|
||||
of nkType..pred(nkNilLit): result = copyNode(n)
|
||||
of nkNilLit: result = n # end of atoms
|
||||
of nkCall, nkHiddenCallConv, nkMacroStmt, nkCommand, nkCallStrLit:
|
||||
result = evalMagicOrCall(c, n)
|
||||
of nkCurly, nkBracket, nkRange:
|
||||
|
|
@ -1033,52 +987,29 @@ proc evalAux(c: PEvalContext, n: PNode): PNode =
|
|||
if isSpecial(result): return
|
||||
a.sons[i].sons[1] = result
|
||||
result = a
|
||||
of nkBracketExpr:
|
||||
result = evalArrayAccess(c, n)
|
||||
of nkDotExpr:
|
||||
result = evalFieldAccess(c, n)
|
||||
of nkDerefExpr, nkHiddenDeref:
|
||||
result = evalDeref(c, n)
|
||||
of nkAddr, nkHiddenAddr:
|
||||
result = evalAddr(c, n)
|
||||
of nkHiddenStdConv, nkHiddenSubConv, nkConv:
|
||||
result = evalConv(c, n)
|
||||
of nkAsgn, nkFastAsgn:
|
||||
result = evalAsgn(c, n)
|
||||
of nkWhenStmt, nkIfStmt, nkIfExpr:
|
||||
result = evalIf(c, n)
|
||||
of nkWhileStmt:
|
||||
result = evalWhile(c, n)
|
||||
of nkCaseStmt:
|
||||
result = evalCase(c, n)
|
||||
of nkVarSection:
|
||||
result = evalVar(c, n)
|
||||
of nkTryStmt:
|
||||
result = evalTry(c, n)
|
||||
of nkRaiseStmt:
|
||||
result = evalRaise(c, n)
|
||||
of nkReturnStmt:
|
||||
result = evalReturn(c, n)
|
||||
of nkBreakStmt, nkReturnToken:
|
||||
result = n
|
||||
of nkBlockExpr, nkBlockStmt:
|
||||
result = evalBlock(c, n)
|
||||
of nkDiscardStmt:
|
||||
result = evalAux(c, n.sons[0])
|
||||
of nkCheckedFieldExpr:
|
||||
result = evalCheckedFieldAccess(c, n)
|
||||
of nkObjDownConv:
|
||||
result = evalAux(c, n.sons[0])
|
||||
of nkObjUpConv:
|
||||
result = evalUpConv(c, n)
|
||||
of nkChckRangeF, nkChckRange64, nkChckRange:
|
||||
result = evalRangeChck(c, n)
|
||||
of nkStringToCString:
|
||||
result = evalConvStrToCStr(c, n)
|
||||
of nkCStringToString:
|
||||
result = evalConvCStrToStr(c, n)
|
||||
of nkPassAsOpenArray:
|
||||
result = evalAux(c, n.sons[0])
|
||||
of nkBracketExpr: result = evalArrayAccess(c, n)
|
||||
of nkDotExpr: result = evalFieldAccess(c, n)
|
||||
of nkDerefExpr, nkHiddenDeref: result = evalDeref(c, n)
|
||||
of nkAddr, nkHiddenAddr: result = evalAddr(c, n)
|
||||
of nkHiddenStdConv, nkHiddenSubConv, nkConv: result = evalConv(c, n)
|
||||
of nkAsgn, nkFastAsgn: result = evalAsgn(c, n)
|
||||
of nkWhenStmt, nkIfStmt, nkIfExpr: result = evalIf(c, n)
|
||||
of nkWhileStmt: result = evalWhile(c, n)
|
||||
of nkCaseStmt: result = evalCase(c, n)
|
||||
of nkVarSection: result = evalVar(c, n)
|
||||
of nkTryStmt: result = evalTry(c, n)
|
||||
of nkRaiseStmt: result = evalRaise(c, n)
|
||||
of nkReturnStmt: result = evalReturn(c, n)
|
||||
of nkBreakStmt, nkReturnToken: result = n
|
||||
of nkBlockExpr, nkBlockStmt: result = evalBlock(c, n)
|
||||
of nkDiscardStmt: result = evalAux(c, n.sons[0])
|
||||
of nkCheckedFieldExpr: result = evalCheckedFieldAccess(c, n)
|
||||
of nkObjDownConv: result = evalAux(c, n.sons[0])
|
||||
of nkObjUpConv: result = evalUpConv(c, n)
|
||||
of nkChckRangeF, nkChckRange64, nkChckRange: result = evalRangeChck(c, n)
|
||||
of nkStringToCString: result = evalConvStrToCStr(c, n)
|
||||
of nkCStringToString: result = evalConvCStrToStr(c, n)
|
||||
of nkPassAsOpenArray: result = evalAux(c, n.sons[0])
|
||||
of nkStmtListExpr, nkStmtList, nkModule:
|
||||
for i in countup(0, sonsLen(n) - 1):
|
||||
result = evalAux(c, n.sons[i])
|
||||
|
|
@ -1106,11 +1037,8 @@ proc eval(c: PEvalContext, n: PNode): PNode =
|
|||
stackTrace(c, n, errUnhandledExceptionX, typeToString(result.typ))
|
||||
|
||||
proc evalConstExpr(module: PSym, e: PNode): PNode =
|
||||
var
|
||||
p: PEvalContext
|
||||
s: PStackFrame
|
||||
p = newEvalContext(module, "", true)
|
||||
s = newStackFrame()
|
||||
var p = newEvalContext(module, "", true)
|
||||
var s = newStackFrame()
|
||||
s.call = e
|
||||
pushStackFrame(p, s)
|
||||
result = eval(p, e)
|
||||
|
|
@ -1118,8 +1046,7 @@ proc evalConstExpr(module: PSym, e: PNode): PNode =
|
|||
popStackFrame(p)
|
||||
|
||||
proc myOpen(module: PSym, filename: string): PPassContext =
|
||||
var c: PEvalContext
|
||||
c = newEvalContext(module, filename, false)
|
||||
var c = newEvalContext(module, filename, false)
|
||||
pushStackFrame(c, newStackFrame())
|
||||
result = c
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue