use std::unreachable;
use crate::{
module::ModuleKind,
vm::{opcode::Operation, ActiveRunnable, CompletionType},
Context, JsObject, JsResult, JsValue,
};
#[derive(Debug, Clone, Copy)]
pub(crate) struct NewTarget;
impl Operation for NewTarget {
const NAME: &'static str = "NewTarget";
const INSTRUCTION: &'static str = "INST - NewTarget";
fn execute(context: &mut Context<'_>) -> JsResult<CompletionType> {
let new_target = if let Some(new_target) = context
.vm
.environments
.get_this_environment()
.as_function()
.and_then(|env| env.slots().new_target().cloned())
{
new_target.into()
} else {
JsValue::undefined()
};
context.vm.push(new_target);
Ok(CompletionType::Normal)
}
}
#[derive(Debug, Clone, Copy)]
pub(crate) struct ImportMeta;
impl Operation for ImportMeta {
const NAME: &'static str = "ImportMeta";
const INSTRUCTION: &'static str = "INST - ImportMeta";
fn execute(context: &mut Context<'_>) -> JsResult<CompletionType> {
let Some(ActiveRunnable::Module(module)) = context.vm.active_runnable.clone() else {
unreachable!("2. Assert: module is a Source Text Module Record.");
};
let ModuleKind::SourceText(src) = module.kind() else {
unreachable!("2. Assert: module is a Source Text Module Record.");
};
let import_meta = src
.import_meta()
.borrow_mut()
.get_or_insert_with(|| {
let import_meta = JsObject::with_null_proto();
context
.module_loader()
.init_import_meta(&import_meta, &module, context);
import_meta
})
.clone();
context.vm.push(import_meta);
Ok(CompletionType::Normal)
}
}