Table of Contents

Class VirtualMachine

Namespace
Pl0.Vm
Assembly
Pl0.Vm.dll

Executes PL/0 P-Code instructions on a stack-based virtual machine.

public sealed class VirtualMachine
Inheritance
VirtualMachine
Inherited Members

Fields

DivisionByZeroExitCode

Exit code for division-by-zero.

private const int DivisionByZeroExitCode = 206

Field Value

int

InputEofExitCode

Exit code for end-of-input during read.

private const int InputEofExitCode = 98

Field Value

int

InputFormatExitCode

Exit code for input format errors.

private const int InputFormatExitCode = 97

Field Value

int

RuntimeErrorExitCode

Exit code for generic runtime errors.

private const int RuntimeErrorExitCode = 99

Field Value

int

_culture

Zielsprache für Fehlertexte; wird in Run() gesetzt.

private CultureInfo _culture

Field Value

CultureInfo

_rm

ResourceManager für lokalisierte Fehlertexte; wird in Run() gesetzt.

private ResourceManager _rm

Field Value

ResourceManager

Methods

BinaryOp(ref int, int[], IList<VmDiagnostic>, Func<int, int, int>)

Executes a binary operation on the stack.

private bool BinaryOp(ref int t, int[] stack, IList<VmDiagnostic> diagnostics, Func<int, int, int> op)

Parameters

t int

Top-of-stack pointer.

stack int[]

Stack storage.

diagnostics IList<VmDiagnostic>

Diagnostics collection.

op Func<int, int, int>

Operation to execute.

Returns

bool

True if execution should continue.

BuildResult(int[], int, IReadOnlyList<VmDiagnostic>)

Builds an execution result with a safe stack snapshot.

private static VmExecutionResult BuildResult(int[] stack, int top, IReadOnlyList<VmDiagnostic> diagnostics)

Parameters

stack int[]

Stack storage.

top int

Top-of-stack pointer.

diagnostics IReadOnlyList<VmDiagnostic>

Diagnostics collection.

Returns

VmExecutionResult

The execution result.

ExecuteOpr(int, ref int, ref int, ref int, int[], IPl0Io, VirtualMachineOptions, IList<VmDiagnostic>)

Executes an OPR instruction.

private bool ExecuteOpr(int code, ref int p, ref int b, ref int t, int[] stack, IPl0Io io, VirtualMachineOptions options, IList<VmDiagnostic> diagnostics)

Parameters

code int

OPR subcode.

p int

Program counter.

b int

Base pointer.

t int

Top-of-stack pointer.

stack int[]

Stack storage.

io IPl0Io

I/O implementation.

options VirtualMachineOptions

VM options.

diagnostics IList<VmDiagnostic>

Diagnostics collection.

Returns

bool

True if execution should continue.

IsValidStackIndex(int, int)

Validates a stack index against bounds.

private static bool IsValidStackIndex(int index, int stackSize)

Parameters

index int

Stack index.

stackSize int

Maximum stack size.

Returns

bool

True if the index is within bounds.

ResolveBase(int, int, int[], IList<VmDiagnostic>)

Resolves the base pointer for a given lexical level.

private int ResolveBase(int level, int currentBase, int[] stack, IList<VmDiagnostic> diagnostics)

Parameters

level int

Lexical level to resolve.

currentBase int

Current base pointer.

stack int[]

Stack storage.

diagnostics IList<VmDiagnostic>

Diagnostics collection.

Returns

int

Resolved base address.

Run(IReadOnlyList<Instruction>, IPl0Io?, VirtualMachineOptions?)

Runs a program and returns the execution result.

public VmExecutionResult Run(IReadOnlyList<Instruction> program, IPl0Io? io = null, VirtualMachineOptions? options = null)

Parameters

program IReadOnlyList<Instruction>

P-Code instructions to execute.

io IPl0Io

Optional I/O implementation.

options VirtualMachineOptions

Optional VM options.

Returns

VmExecutionResult

The execution result.

TryPeek(int, IList<VmDiagnostic>)

Ensures a stack index is valid for reading.

private bool TryPeek(int index, IList<VmDiagnostic> diagnostics)

Parameters

index int

Stack index.

diagnostics IList<VmDiagnostic>

Diagnostics collection.

Returns

bool

True if the index is valid.

TryPush(ref int, int, IList<VmDiagnostic>)

Attempts to push a value onto the stack.

private bool TryPush(ref int t, int stackSize, IList<VmDiagnostic> diagnostics)

Parameters

t int

Top-of-stack pointer.

stackSize int

Maximum stack size.

diagnostics IList<VmDiagnostic>

Diagnostics collection.

Returns

bool

True if push is possible.