use crate::{
vm::{opcode::Operation, CompletionType},
Context, JsResult, JsValue,
};
pub(crate) mod class;
pub(crate) mod own_property;
pub(crate) use class::*;
pub(crate) use own_property::*;
#[derive(Debug, Clone, Copy)]
pub(crate) struct DefVar;
impl DefVar {
#[allow(clippy::unnecessary_wraps)]
fn operation(context: &mut Context, index: usize) -> JsResult<CompletionType> {
let binding_locator = context.vm.frame().code_block.bindings[index].clone();
context.vm.environments.put_value_if_uninitialized(
binding_locator.environment(),
binding_locator.binding_index(),
JsValue::undefined(),
);
Ok(CompletionType::Normal)
}
}
impl Operation for DefVar {
const NAME: &'static str = "DefVar";
const INSTRUCTION: &'static str = "INST - DefVar";
const COST: u8 = 3;
fn execute(context: &mut Context) -> JsResult<CompletionType> {
let index = context.vm.read::<u8>();
Self::operation(context, index as usize)
}
fn execute_with_u16_operands(context: &mut Context) -> JsResult<CompletionType> {
let index = context.vm.read::<u16>() as usize;
Self::operation(context, index)
}
fn execute_with_u32_operands(context: &mut Context) -> JsResult<CompletionType> {
let index = context.vm.read::<u32>();
Self::operation(context, index as usize)
}
}
#[derive(Debug, Clone, Copy)]
pub(crate) struct DefInitVar;
impl DefInitVar {
fn operation(context: &mut Context, index: usize) -> JsResult<CompletionType> {
let value = context.vm.pop();
let frame = context.vm.frame();
let strict = frame.code_block.strict();
let mut binding_locator = frame.code_block.bindings[index].clone();
context.find_runtime_binding(&mut binding_locator)?;
context.set_binding(&binding_locator, value, strict)?;
Ok(CompletionType::Normal)
}
}
impl Operation for DefInitVar {
const NAME: &'static str = "DefInitVar";
const INSTRUCTION: &'static str = "INST - DefInitVar";
const COST: u8 = 3;
fn execute(context: &mut Context) -> JsResult<CompletionType> {
let index = context.vm.read::<u8>();
Self::operation(context, index as usize)
}
fn execute_with_u16_operands(context: &mut Context) -> JsResult<CompletionType> {
let index = context.vm.read::<u16>() as usize;
Self::operation(context, index)
}
fn execute_with_u32_operands(context: &mut Context) -> JsResult<CompletionType> {
let index = context.vm.read::<u32>();
Self::operation(context, index as usize)
}
}
#[derive(Debug, Clone, Copy)]
pub(crate) struct PutLexicalValue;
impl PutLexicalValue {
#[allow(clippy::unnecessary_wraps)]
fn operation(context: &mut Context, index: usize) -> JsResult<CompletionType> {
let value = context.vm.pop();
let binding_locator = context.vm.frame().code_block.bindings[index].clone();
context.vm.environments.put_lexical_value(
binding_locator.environment(),
binding_locator.binding_index(),
value,
);
Ok(CompletionType::Normal)
}
}
impl Operation for PutLexicalValue {
const NAME: &'static str = "PutLexicalValue";
const INSTRUCTION: &'static str = "INST - PutLexicalValue";
const COST: u8 = 3;
fn execute(context: &mut Context) -> JsResult<CompletionType> {
let index = context.vm.read::<u8>();
Self::operation(context, index as usize)
}
fn execute_with_u16_operands(context: &mut Context) -> JsResult<CompletionType> {
let index = context.vm.read::<u16>() as usize;
Self::operation(context, index)
}
fn execute_with_u32_operands(context: &mut Context) -> JsResult<CompletionType> {
let index = context.vm.read::<u32>();
Self::operation(context, index as usize)
}
}