On this page
vmdef
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.
Imports
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, ## evaluate because in REPL mode emConst, ## evaluate for 'const' according to spec emOptimize, ## evaluate for optimization purposes (same as ## emConst?) emStaticExpr, ## evaluate for enforced compile time eval ## ('static' context) emStaticStmt ## 'static' as an expression
- reason for evaluation Source Edit
-
TSandboxFlag = enum allowCast, ## allow unsafe language feature: 'cast' allowInfiniteLoops ## allow endless loops
- 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 {...}{.acyclic.} = 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
Templates
-
template opcode(x: TInstr): TOpcode
- Source Edit
-
template regA(x: TInstr): TRegister
- Source Edit
-
template regB(x: TInstr): TRegister
- Source Edit
-
template regC(x: TInstr): TRegister
- Source Edit
-
template regBx(x: TInstr): int
- Source Edit
-
template jmpDiff(x: TInstr): int
- Source Edit
© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/compiler/vmdef.html