use crate::{
Context, JsNativeError, JsResult,
object::internal_methods::InternalMethodPropertyContext,
property::PropertyDescriptor,
vm::opcode::{Operation, VaryingOperand},
};
#[derive(Debug, Clone, Copy)]
pub(crate) struct DefineOwnPropertyByName;
impl DefineOwnPropertyByName {
#[inline(always)]
pub(crate) fn operation(
(object, value, index): (VaryingOperand, VaryingOperand, VaryingOperand),
context: &mut Context,
) -> JsResult<()> {
let object = context.vm.get_register(object.into()).clone();
let value = context.vm.get_register(value.into()).clone();
let name = context
.vm
.frame()
.code_block()
.constant_string(index.into());
let object = object.to_object(context)?;
object.__define_own_property__(
&name.into(),
PropertyDescriptor::builder()
.value(value.clone())
.writable(true)
.enumerable(true)
.configurable(true)
.build(),
&mut InternalMethodPropertyContext::new(context),
)?;
Ok(())
}
}
impl Operation for DefineOwnPropertyByName {
const NAME: &'static str = "DefineOwnPropertyByName";
const INSTRUCTION: &'static str = "INST - DefineOwnPropertyByName";
const COST: u8 = 4;
}
#[derive(Debug, Clone, Copy)]
pub(crate) struct DefineOwnPropertyByValue;
impl DefineOwnPropertyByValue {
#[inline(always)]
pub(crate) fn operation(
(value, key, object): (VaryingOperand, VaryingOperand, VaryingOperand),
context: &mut Context,
) -> JsResult<()> {
let value = context.vm.get_register(value.into()).clone();
let key = context.vm.get_register(key.into()).clone();
let object = context.vm.get_register(object.into()).clone();
let object = object.to_object(context)?;
let key = key.to_property_key(context)?;
let success = object.__define_own_property__(
&key,
PropertyDescriptor::builder()
.value(value.clone())
.writable(true)
.enumerable(true)
.configurable(true)
.build(),
&mut InternalMethodPropertyContext::new(context),
)?;
if !success {
return Err(JsNativeError::typ()
.with_message("failed to defined own property")
.into());
}
Ok(())
}
}
impl Operation for DefineOwnPropertyByValue {
const NAME: &'static str = "DefineOwnPropertyByValue";
const INSTRUCTION: &'static str = "INST - DefineOwnPropertyByValue";
const COST: u8 = 4;
}