oden/oden-js/src/atom.rs
John Doty c96a1a4979 [quickjs][oden][oden-js] Source maps
The worst support but it should cost very little if nobody is using
them (psst we're using them)
2023-09-21 01:51:55 -05:00

78 lines
1.7 KiB
Rust

use crate::{ContextRef, Runtime, ValueResult};
use oden_js_sys as sys;
use std::ops::Deref;
#[derive(Eq, PartialEq, Debug, Hash)]
pub struct AtomRef {
pub(crate) atom: sys::JSAtom,
}
impl AtomRef {
pub(crate) fn from_raw(atom: sys::JSAtom, _ctx: &ContextRef) -> AtomRef {
AtomRef { atom }
}
pub fn dup(&self, context: &ContextRef) -> Atom {
unsafe {
sys::JS_DupAtom(context.ctx, self.atom);
}
Atom::from_raw(self.atom, context)
}
pub fn to_value(&self, context: &ContextRef) -> ValueResult {
context.check_exception(unsafe { sys::JS_AtomToValue(context.ctx, self.atom) })
}
pub fn to_string_value(&self, context: &ContextRef) -> ValueResult {
context.check_exception(unsafe { sys::JS_AtomToString(context.ctx, self.atom) })
}
}
pub struct Atom {
atom: AtomRef,
rt: Runtime,
}
impl Atom {
pub(crate) fn from_raw(atom: sys::JSAtom, ctx: &ContextRef) -> Self {
Atom {
atom: AtomRef::from_raw(atom, ctx),
rt: Runtime::from_raw(unsafe { sys::JS_GetRuntime(ctx.ctx) }),
}
}
pub(crate) fn consume(atom: Atom) -> u32 {
let atom = std::mem::ManuallyDrop::new(atom);
atom.atom.atom
}
}
impl Deref for Atom {
type Target = AtomRef;
fn deref(&self) -> &Self::Target {
&self.atom
}
}
impl Drop for Atom {
fn drop(&mut self) {
unsafe {
sys::JS_FreeAtomRT(self.rt.rt, self.atom.atom);
}
}
}
impl PartialEq for Atom {
fn eq(&self, other: &Self) -> bool {
self.atom == other.atom
}
}
impl Eq for Atom {}
impl std::hash::Hash for Atom {
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
self.atom.hash(state)
}
}