pub enum Inst {
Show 53 variants
Not,
Add,
AddAssign {
offset: usize,
},
Sub,
SubAssign {
offset: usize,
},
Mul,
MulAssign {
offset: usize,
},
Div,
DivAssign {
offset: usize,
},
Call {
hash: Hash,
args: usize,
},
CallInstance {
hash: Hash,
args: usize,
},
LoadInstanceFn {
hash: Hash,
},
CallFn {
args: usize,
},
IndexGet,
ArrayIndexGet {
index: usize,
},
ObjectSlotIndexGet {
slot: usize,
},
IndexSet,
Integer {
number: i64,
},
Float {
number: f64,
},
Pop,
PopN {
count: usize,
},
Clean {
count: usize,
},
Copy {
offset: usize,
},
Dup,
Replace {
offset: usize,
},
Return,
ReturnUnit,
Lt,
Gt,
Lte,
Gte,
Eq,
Neq,
Jump {
offset: isize,
},
JumpIf {
offset: isize,
},
JumpIfNot {
offset: isize,
},
Unit,
Bool {
value: bool,
},
Array {
count: usize,
},
Object {
slot: usize,
},
Char {
c: char,
},
String {
slot: usize,
},
Is,
And,
Or,
IsUnit,
EqCharacter {
character: char,
},
EqInteger {
integer: i64,
},
EqStaticString {
slot: usize,
},
MatchArray {
len: usize,
exact: bool,
},
MatchObject {
slot: usize,
exact: bool,
},
Type {
hash: Hash,
},
Panic {
reason: Panic,
},
}Expand description
An operation in the stack-based virtual machine.
Variants§
Not
Not operator. Takes a boolean from the top of the stack and inverts its logical value.
§Operation
<bool>
=> <bool>Add
Add two things together.
This is the result of an <a> + <b> expression.
AddAssign
Add a value to the given frame offset.
This is the result of an <offset> += <b> expression.
Sub
Subtract two things.
This is the result of an <a> - <b> expression.
SubAssign
Subtract a value to the given frame offset.
This is the result of an <offset> -= <b> expression.
Mul
Multiply two things.
This is the result of an <a> * <b> expression.
MulAssign
Multiply a value to the given frame offset.
This is the result of an <offset> *= <b> expression.
Div
Divide two things.
This is the result of an <a> / <b> expression.
DivAssign
Divide a value to the given frame offset.
This is the result of an <offset> /= <b> expression.
Call
Perform a function call.
It will construct a new stack frame which includes the last args
number of entries.
Fields
CallInstance
Perform a instance function call.
The instance being called on should be on top of the stack, followed by
args number of arguments.
Fields
LoadInstanceFn
Lookup the specified instance function and put it on the stack. This might help in cases where a single instance function is called many times (like in a loop) since it avoids calculating its full hash on every iteration.
Note that this does not resolve that the instance function exists, only that the instance does.
§Operation
<value>
=> <fn>CallFn
Perform a function call on a function pointer stored on the stack.
§Operation
<fn>
<args...>
=> <ret>IndexGet
Perform an index get operation. Pushing the result on the stack.
§Operation
<target>
<index>
=> <value>ArrayIndexGet
Get the given index out of an array on the top of the stack. Errors if the item doesn’t exist or the item at the top of the stack is not an array.
Note: this is a specialized variant of ExprIndexGet where we know that the
top of the stack is supposed to be an array.
§Operation
<array>
=> <value>ObjectSlotIndexGet
Get the given index out of an object on the top of the stack. Errors if the item doesn’t exist or the item at the top of the stack is not an array.
The index is identifier by a static string slot, which is provided as an argument.
Note: this is a specialized variant of ExprIndexGet where we know that the
top of the stack is supposed to be an array.
§Operation
<object>
=> <value>IndexSet
Integer
Push a literal integer.
Float
Push a literal float into a slot.
Pop
Pop the value on the stack.
PopN
Clean
Clean the stack by keeping the top of it, and popping count values
under it.
§Operation
<top>
<value..>
=> <top>Copy
Push a variable from a location offset relative to the current call
frame.
A copy is very cheap. It simply means pushing a reference to the stack and increasing a reference count.
Dup
Replace
Replace a value at the offset relative from the top of the stack, with the top of the stack.
Return
Pop the current stack frame and restore the instruction pointer from it.
The stack frame will be cleared, and the value on the top of the stack will be left on top of it.
ReturnUnit
Pop the current stack frame and restore the instruction pointer from it.
The stack frame will be cleared, and a unit value will be pushed to the top of the stack.
Lt
Compare two values on the stack for lt and push the result as a boolean on the stack.
Gt
Compare two values on the stack for gt and push the result as a boolean on the stack.
Lte
Compare two values on the stack for lte and push the result as a boolean on the stack.
Gte
Compare two values on the stack for gte and push the result as a boolean on the stack.
Eq
Compare two values on the stack for equality and push the result as a boolean on the stack.
§Operation
<b>
<a>
=> <bool>Neq
Compare two values on the stack for inequality and push the result as a boolean on the stack.
§Operation
<b>
<a>
=> <bool>Jump
Unconditionally jump to offset relative to the current instruction
pointer.
§Operation
*nothing*
=> *nothing*JumpIf
Jump to offset relative to the current instruction pointer if the
condition is true.
§Operation
<boolean>
=> *nothing*JumpIfNot
Jump to offset relative to the current instruction pointer if the
condition is false.
§Operation
<boolean>
=> *nothing*Unit
Bool
Array
Construct a push an array value onto the stack. The number of elements
in the array are determined by count and are popped from the stack.
Object
Construct a push an object onto the stack. The number of elements
in the object are determined the slot of the object keys slot and are
popped from the stack.
For each element, a value is popped corresponding to the object key.
§Operation
<value..>
=> <object>Char
Load a literal character.
String
Load a literal string.
Is
Test if the top of the stack is an instance of the second item on the stack.
§Operation
<value>
<type>
=> <boolean>And
Pop two values from the stack and test if they are both boolean true.
§Operation
<boolean>
<boolean>
=> <boolean>Or
Pop two values from the stack and test if either of them are boolean true.
§Operation
<boolean>
<boolean>
=> <boolean>IsUnit
EqCharacter
EqInteger
EqStaticString
MatchArray
Test that the top of the stack is an array with the given length requirements.
§Operation
<value>
=> <boolean>Fields
MatchObject
Test that the top of the stack is an object matching the given slot of object keys.
§Operation
<object>
=> <boolean>Fields
Type
Panic
Cause the VM to panic and error out without a reason.
This should only be used during testing or extreme scenarios that are completely unrecoverable.