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

ast, idents, options, modulegraphs, lineinfos

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