pub struct Lambda {
pub decls: usize,
pub code: Vec<u8>,
pub spans: Vec<(usize, Span)>,
pub constants: Vec<Data>,
pub captures: Vec<Captured>,
pub ffi: Vec<FFIFunction>,
}
Expand description
Represents a single interpretable chunk of bytecode, think a function.
Fields§
§decls: usize
Number of variables declared in this scope.
code: Vec<u8>
Each byte is an opcode or a number-stream.
spans: Vec<(usize, Span)>
Each usize indexes the bytecode op that begins each line.
constants: Vec<Data>
Number-stream indexed, used to load constants.
captures: Vec<Captured>
List of positions of locals in the scope where this lambda is defined, indexes must be gauranteed to be data on the heap.
ffi: Vec<FFIFunction>
List of FFI functions (i.e. Rust functions) that can be called from this function.
Implementations§
Source§impl Lambda
impl Lambda
Sourcepub fn emit_bytes(&mut self, bytes: &mut Vec<u8>)
pub fn emit_bytes(&mut self, bytes: &mut Vec<u8>)
Emits a series of bytes.
Sourcepub fn emit_span(&mut self, span: &Span)
pub fn emit_span(&mut self, span: &Span)
Emits a span, should be called before an opcode is emmited. This function ties opcodes to spans in source. See index_span as well.
Sourcepub fn index_data(&mut self, data: Data) -> usize
pub fn index_data(&mut self, data: Data) -> usize
Given some data, this function adds it to the constants table, and returns the data’s index. The constants table is push only, so constants are identified by their index. The resulting usize can be split up into a number byte stream, and be inserted into the bytecode.
Sourcepub fn index_span(&self, index: usize) -> Span
pub fn index_span(&self, index: usize) -> Span
Look up the nearest span at or before the index of a specific bytecode op.
Sourcepub fn add_ffi(&mut self, function: FFIFunction) -> usize
pub fn add_ffi(&mut self, function: FFIFunction) -> usize
Adds a ffi function to the ffi table,
without checking for duplicates.
The Compiler
ensures that functions are valid
and not duplicated during codegen.