This module contains the type definitions for the new evaluation engine. An instruction is 1-3 int32s in memory, it is a register based VM.
Types
TInstrType = uint64
- Source Edit
TRegister = range[0 .. 65535'u64.int]
- Source Edit
TDest = range[-1 .. 65535'u64.int]
- Source Edit
TInstr = distinct TInstrType
- Source Edit
TOpcode = enum opcEof, opcRet, opcYldYoid, opcYldVal, opcAsgnInt, opcAsgnFloat, opcAsgnRef, opcAsgnComplex, opcCastIntToFloat32, opcCastIntToFloat64, opcCastFloatToInt32, opcCastFloatToInt64, opcCastPtrToInt, opcCastIntToPtr, opcFastAsgnComplex, opcNodeToReg, opcLdArr, opcLdArrAddr, opcWrArr, opcLdObj, opcLdObjAddr, opcWrObj, opcAddrReg, opcAddrNode, opcLdDeref, opcWrDeref, opcWrStrIdx, opcLdStrIdx, opcAddInt, opcAddImmInt, opcSubInt, opcSubImmInt, opcLenSeq, opcLenStr, opcIncl, opcInclRange, opcExcl, opcCard, opcMulInt, opcDivInt, opcModInt, opcAddFloat, opcSubFloat, opcMulFloat, opcDivFloat, opcShrInt, opcShlInt, opcAshrInt, opcBitandInt, opcBitorInt, opcBitxorInt, opcAddu, opcSubu, opcMulu, opcDivu, opcModu, opcEqInt, opcLeInt, opcLtInt, opcEqFloat, opcLeFloat, opcLtFloat, opcLeu, opcLtu, opcEqRef, opcEqNimNode, opcSameNodeType, opcXor, opcNot, opcUnaryMinusInt, opcUnaryMinusFloat, opcBitnotInt, opcEqStr, opcLeStr, opcLtStr, opcEqSet, opcLeSet, opcLtSet, opcMulSet, opcPlusSet, opcMinusSet, opcConcatStr, opcContainsSet, opcRepr, opcSetLenStr, opcSetLenSeq, opcIsNil, opcOf, opcIs, opcSubStr, opcParseFloat, opcConv, opcCast, opcQuit, opcInvalidField, opcNarrowS, opcNarrowU, opcSignExtend, opcAddStrCh, opcAddStrStr, opcAddSeqElem, opcRangeChck, opcNAdd, opcNAddMultiple, opcNKind, opcNSymKind, opcNIntVal, opcNFloatVal, opcNSymbol, opcNIdent, opcNGetType, opcNStrVal, opcNSigHash, opcNGetSize, opcNSetIntVal, opcNSetFloatVal, opcNSetSymbol, opcNSetIdent, opcNSetType, opcNSetStrVal, opcNNewNimNode, opcNCopyNimNode, opcNCopyNimTree, opcNDel, opcGenSym, opcNccValue, opcNccInc, opcNcsAdd, opcNcsIncl, opcNcsLen, opcNcsAt, opcNctPut, opcNctLen, opcNctGet, opcNctHasNext, opcNctNext, opcNodeId, opcSlurp, opcGorge, opcParseExprToAst, opcParseStmtToAst, opcQueryErrorFlag, opcNError, opcNWarning, opcNHint, opcNGetLineInfo, opcNSetLineInfo, opcEqIdent, opcStrToIdent, opcGetImpl, opcGetImplTransf, opcEcho, opcIndCall, opcIndCallAsgn, opcRaise, opcNChild, opcNSetChild, opcCallSite, opcNewStr, opcTJmp, opcFJmp, opcJmp, opcJmpBack, opcBranch, opcTry, opcExcept, opcFinally, opcFinallyEnd, opcNew, opcNewSeq, opcLdNull, opcLdNullReg, opcLdConst, opcAsgnConst, opcLdGlobal, opcLdGlobalAddr, opcLdGlobalDerefFFI, opcLdGlobalAddrDerefFFI, opcLdImmInt, opcNBindSym, opcNDynBindSym, opcSetType, opcTypeTrait, opcMarshalLoad, opcMarshalStore, opcSymOwner, opcSymIsInstantiationOf
- Source Edit
TBlock = object label*: PSym fixups*: seq[TPosition]
- Source Edit
TEvalMode = enum emRepl, emConst, emOptimize, emStaticExpr, emStaticStmt
- reason for evaluation Source Edit
TSandboxFlag = enum allowCast, allowInfiniteLoops
- what the evaluation engine should allow Source Edit
TSandboxFlags = set[TSandboxFlag]
- Source Edit
TSlotKind = enum slotEmpty, slotFixedVar, slotFixedLet, slotTempUnknown, slotTempInt, slotTempFloat, slotTempStr, slotTempComplex, slotTempPerm
- Source Edit
TRegisterKind = enum rkNone, rkNode, rkInt, rkFloat, rkRegisterAddr, rkNodeAddr
- Source Edit
TFullReg = object case kind*: TRegisterKind of rkNone: nil of rkInt: intVal*: BiggestInt of rkFloat: floatVal*: BiggestFloat of rkNode: node*: PNode of rkRegisterAddr: regAddr*: ptr TFullReg of rkNodeAddr: nodeAddr*: ptr PNode
- Source Edit
PProc = ref object blocks*: seq[TBlock] sym*: PSym slots*: array[TRegister, tuple[inUse: bool, kind: TSlotKind]] maxSlots*: int
- Source Edit
VmArgs = object ra*, rb*, rc*: Natural slots*: ptr UncheckedArray[TFullReg] currentException*: PNode currentLineInfo*: TLineInfo
- Source Edit
VmCallback = proc (args: VmArgs) {...}{.closure.}
- Source Edit
PCtx = ref TCtx
- Source Edit
TCtx = object of TPassContext code*: seq[TInstr] debug*: seq[TLineInfo] globals*: PNode constants*: PNode types*: seq[PType] currentExceptionA*, currentExceptionB*: PNode exceptionInstr*: int prc*: PProc module*: PSym callsite*: PNode mode*: TEvalMode features*: TSandboxFlags traceActive*: bool loopIterations*: int comesFromHeuristic*: TLineInfo callbacks*: seq[tuple[key: string, value: VmCallback]] errorFlag*: string cache*: IdentCache config*: ConfigRef graph*: ModuleGraph oldErrorCount*: int profiler*: Profiler templInstCounter*: ref int
- Source Edit
PStackFrame = ref TStackFrame
- Source Edit
TStackFrame = object prc*: PSym slots*: seq[TFullReg] next*: PStackFrame comesFrom*: int safePoints*: seq[int]
- Source Edit
Profiler = object tEnter*: float tos*: PStackFrame
- Source Edit
TPosition = distinct int
- Source Edit
PEvalContext = PCtx
- Source Edit
Consts
byteExcess = 128
- Source Edit
regOShift = 0'u
- Source Edit
regAShift = 8'u64
- Source Edit
regBShift = 24'u64
- Source Edit
regCShift = 40'u64
- Source Edit
regBxShift = 24'u64
- Source Edit
regOMask = 255'u64
- Source Edit
regAMask = 65535'u64
- Source Edit
regBMask = 65535'u64
- Source Edit
regCMask = 65535'u64
- Source Edit
regBxMask = 16777215'u64
- Source Edit
wordExcess = 8388608
- Source Edit
regBxMin = -8388607
- Source Edit
regBxMax = 8388607
- Source Edit
firstABxInstr = opcTJmp
- Source Edit
largeInstrs = {opcSubStr, opcConv, opcCast, opcNewSeq, opcOf, opcMarshalLoad, opcMarshalStore}
- Source Edit
slotSomeTemp = slotTempUnknown
- Source Edit
relativeJumps = {opcTJmp, opcFJmp, opcJmp, opcJmpBack}
- Source Edit
nimNodeFlag = 16
- Source Edit
Procs
proc newCtx(module: PSym; cache: IdentCache; g: ModuleGraph): PCtx {...}{.raises: [], tags: [].}
- Source Edit
proc refresh(c: PCtx; module: PSym) {...}{.raises: [], tags: [].}
- Source Edit
proc registerCallback(c: PCtx; name: string; callback: VmCallback): int {...}{. discardable, raises: [], tags: [].}
- Source Edit