package vm import ( "fmt" "jinx/pkg/lang/vm/code" "jinx/pkg/lang/vm/mem" "jinx/pkg/lang/vm/text" "jinx/pkg/lang/vm/value" ) type Error struct { Pc int Line int Err error } func (e Error) Error() string { if e.Line == -1 { return fmt.Sprintf("vm error at pc %d, unknown line: %v", e.Pc, e.Err) } return fmt.Sprintf("vm error at pc %d, line %d: %v", e.Pc, e.Line, e.Err) } // Fatal errors type ErrNullPtrDereference struct { At mem.Ptr } func (e ErrNullPtrDereference) Error() string { return fmt.Sprintf("null pointer dereference at %v", e.At) } type ErrInvalidOp struct { Op uint8 } func (e ErrInvalidOp) Error() string { return fmt.Sprintf("invalid opcode: %d", e.Op) } type ErrUnexpectedMemCell struct { Ptr mem.Ptr Expected mem.CellKind Got mem.CellKind } func (e ErrUnexpectedMemCell) Error() string { return fmt.Sprintf("unexpected memory cell at %s: expected %v, got %v", e.Ptr.String(), e.Expected, e.Got) } type ErrMemNilCell struct { Ptr mem.Ptr } func (e ErrMemNilCell) Error() string { return fmt.Sprintf("found no value at %s", e.Ptr.String()) } type ErrCorruptedMemCell struct { Ptr mem.Ptr } func (e ErrCorruptedMemCell) Error() string { return fmt.Sprintf("corrupted memory cell at %s", e.Ptr.String()) } type ErrCantReanchorType struct { Type value.TypeKind } func (e ErrCantReanchorType) Error() string { return fmt.Sprintf("can't reanchor type of value which already is of type %v", e.Type) } // Non-fatal errors, which will later be implemented as catchable exceptions type ErrInvalidOperandType struct { Op code.Op X value.TypeKind } func (e ErrInvalidOperandType) Error() string { return fmt.Sprintf("invalid operand type for op %s: %v", text.OpToString(e.Op), e.X) } type ErrInvalidOperandTypes struct { Op code.Op X value.TypeKind Y value.TypeKind } func (e ErrInvalidOperandTypes) Error() string { return fmt.Sprintf("invalid operand types for op %s: %v, %v", text.OpToString(e.Op), e.X, e.Y) } type ErrArrayIndexOutOfBounds struct { Index int Len int } func (e ErrArrayIndexOutOfBounds) Error() string { return fmt.Sprintf("array index out of bounds: %d (len: %d)", e.Index, e.Len) } type ErrWrongNumberOfArguments struct { Needed uint Got uint } func (e ErrWrongNumberOfArguments) Error() string { return fmt.Sprintf("wrong number of arguments: needed %d, got %d", e.Needed, e.Got) }