avm2: Swap Multiname flags to bitflags
This commit is contained in:
parent
782f670c39
commit
acdb767862
|
@ -4,6 +4,7 @@ use crate::avm2::Error;
|
||||||
use crate::avm2::Namespace;
|
use crate::avm2::Namespace;
|
||||||
use crate::avm2::QName;
|
use crate::avm2::QName;
|
||||||
use crate::string::{AvmString, WStr, WString};
|
use crate::string::{AvmString, WStr, WString};
|
||||||
|
use bitflags::bitflags;
|
||||||
use gc_arena::Gc;
|
use gc_arena::Gc;
|
||||||
use gc_arena::{Collect, MutationContext};
|
use gc_arena::{Collect, MutationContext};
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
|
@ -46,6 +47,19 @@ impl<'gc> NamespaceSet<'gc> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bitflags! {
|
||||||
|
#[derive(Default, Collect)]
|
||||||
|
#[collect(require_static)]
|
||||||
|
pub struct MultinameFlags: u8 {
|
||||||
|
/// Whether the namespace needs to be read at runtime before use.
|
||||||
|
/// This should only be set when lazy-initialized in Activation.
|
||||||
|
const HAS_LAZY_NS = 1 << 0;
|
||||||
|
/// Whether the name needs to be read at runtime before use
|
||||||
|
/// This should only be set when lazy-initialized in Activation.
|
||||||
|
const HAS_LAZY_NAME = 1 << 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// A `Multiname` consists of a name which could be resolved in one or more
|
/// A `Multiname` consists of a name which could be resolved in one or more
|
||||||
/// potential namespaces.
|
/// potential namespaces.
|
||||||
///
|
///
|
||||||
|
@ -67,28 +81,23 @@ pub struct Multiname<'gc> {
|
||||||
/// this multiname is satisfied by any type parameters in any amount.
|
/// this multiname is satisfied by any type parameters in any amount.
|
||||||
params: Vec<Gc<'gc, Multiname<'gc>>>,
|
params: Vec<Gc<'gc, Multiname<'gc>>>,
|
||||||
|
|
||||||
/// Whether the namespace needs to be read at runtime before use.
|
flags: MultinameFlags,
|
||||||
/// This should only be `false` when lazy-initialized in Activation.
|
|
||||||
has_lazy_ns: bool,
|
|
||||||
/// Whether the name needs to be read at runtime before use
|
|
||||||
/// This should only be `false` when lazy-initialized in Activation.
|
|
||||||
has_lazy_name: bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'gc> Multiname<'gc> {
|
impl<'gc> Multiname<'gc> {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn has_lazy_ns(&self) -> bool {
|
pub fn has_lazy_ns(&self) -> bool {
|
||||||
self.has_lazy_ns
|
self.flags.contains(MultinameFlags::HAS_LAZY_NS)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn has_lazy_name(&self) -> bool {
|
pub fn has_lazy_name(&self) -> bool {
|
||||||
self.has_lazy_name
|
self.flags.contains(MultinameFlags::HAS_LAZY_NAME)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn has_lazy_component(&self) -> bool {
|
pub fn has_lazy_component(&self) -> bool {
|
||||||
self.has_lazy_ns || self.has_lazy_name
|
self.has_lazy_ns() || self.has_lazy_name()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Read a namespace set from the ABC constant pool, and return a list of
|
/// Read a namespace set from the ABC constant pool, and return a list of
|
||||||
|
@ -148,23 +157,20 @@ impl<'gc> Multiname<'gc> {
|
||||||
)?),
|
)?),
|
||||||
name: translation_unit.pool_string_option(name.0, mc)?,
|
name: translation_unit.pool_string_option(name.0, mc)?,
|
||||||
params: Vec::new(),
|
params: Vec::new(),
|
||||||
has_lazy_ns: false,
|
flags: Default::default(),
|
||||||
has_lazy_name: false,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AbcMultiname::RTQName { name } | AbcMultiname::RTQNameA { name } => Self {
|
AbcMultiname::RTQName { name } | AbcMultiname::RTQNameA { name } => Self {
|
||||||
ns: NamespaceSet::multiple(vec![], mc),
|
ns: NamespaceSet::multiple(vec![], mc),
|
||||||
name: translation_unit.pool_string_option(name.0, mc)?,
|
name: translation_unit.pool_string_option(name.0, mc)?,
|
||||||
params: Vec::new(),
|
params: Vec::new(),
|
||||||
has_lazy_ns: true,
|
flags: MultinameFlags::HAS_LAZY_NS,
|
||||||
has_lazy_name: false,
|
|
||||||
},
|
},
|
||||||
AbcMultiname::RTQNameL | AbcMultiname::RTQNameLA => Self {
|
AbcMultiname::RTQNameL | AbcMultiname::RTQNameLA => Self {
|
||||||
ns: NamespaceSet::multiple(vec![], mc),
|
ns: NamespaceSet::multiple(vec![], mc),
|
||||||
name: None,
|
name: None,
|
||||||
params: Vec::new(),
|
params: Vec::new(),
|
||||||
has_lazy_ns: true,
|
flags: MultinameFlags::HAS_LAZY_NS | MultinameFlags::HAS_LAZY_NAME,
|
||||||
has_lazy_name: true,
|
|
||||||
},
|
},
|
||||||
AbcMultiname::Multiname {
|
AbcMultiname::Multiname {
|
||||||
namespace_set,
|
namespace_set,
|
||||||
|
@ -177,16 +183,14 @@ impl<'gc> Multiname<'gc> {
|
||||||
ns: Self::abc_namespace_set(translation_unit, *namespace_set, mc)?,
|
ns: Self::abc_namespace_set(translation_unit, *namespace_set, mc)?,
|
||||||
name: translation_unit.pool_string_option(name.0, mc)?,
|
name: translation_unit.pool_string_option(name.0, mc)?,
|
||||||
params: Vec::new(),
|
params: Vec::new(),
|
||||||
has_lazy_ns: false,
|
flags: Default::default(),
|
||||||
has_lazy_name: false,
|
|
||||||
},
|
},
|
||||||
AbcMultiname::MultinameL { namespace_set }
|
AbcMultiname::MultinameL { namespace_set }
|
||||||
| AbcMultiname::MultinameLA { namespace_set } => Self {
|
| AbcMultiname::MultinameLA { namespace_set } => Self {
|
||||||
ns: Self::abc_namespace_set(translation_unit, *namespace_set, mc)?,
|
ns: Self::abc_namespace_set(translation_unit, *namespace_set, mc)?,
|
||||||
name: None,
|
name: None,
|
||||||
params: Vec::new(),
|
params: Vec::new(),
|
||||||
has_lazy_ns: false,
|
flags: MultinameFlags::HAS_LAZY_NAME,
|
||||||
has_lazy_name: true,
|
|
||||||
},
|
},
|
||||||
AbcMultiname::TypeName {
|
AbcMultiname::TypeName {
|
||||||
base_type,
|
base_type,
|
||||||
|
@ -220,13 +224,13 @@ impl<'gc> Multiname<'gc> {
|
||||||
&self,
|
&self,
|
||||||
activation: &mut Activation<'_, 'gc, '_>,
|
activation: &mut Activation<'_, 'gc, '_>,
|
||||||
) -> Result<Self, Error> {
|
) -> Result<Self, Error> {
|
||||||
let name = if self.has_lazy_name {
|
let name = if self.has_lazy_name() {
|
||||||
Some(activation.avm2().pop().coerce_to_string(activation)?)
|
Some(activation.avm2().pop().coerce_to_string(activation)?)
|
||||||
} else {
|
} else {
|
||||||
self.name
|
self.name
|
||||||
};
|
};
|
||||||
|
|
||||||
let ns = if self.has_lazy_ns {
|
let ns = if self.has_lazy_ns() {
|
||||||
let ns_value = activation.avm2().pop();
|
let ns_value = activation.avm2().pop();
|
||||||
let ns = ns_value.as_namespace()?;
|
let ns = ns_value.as_namespace()?;
|
||||||
NamespaceSet::single(*ns)
|
NamespaceSet::single(*ns)
|
||||||
|
@ -238,8 +242,7 @@ impl<'gc> Multiname<'gc> {
|
||||||
ns,
|
ns,
|
||||||
name,
|
name,
|
||||||
params: self.params.clone(),
|
params: self.params.clone(),
|
||||||
has_lazy_ns: false,
|
flags: Default::default(),
|
||||||
has_lazy_name: false,
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -266,8 +269,7 @@ impl<'gc> Multiname<'gc> {
|
||||||
ns: NamespaceSet::single(Namespace::Any),
|
ns: NamespaceSet::single(Namespace::Any),
|
||||||
name: None,
|
name: None,
|
||||||
params: Vec::new(),
|
params: Vec::new(),
|
||||||
has_lazy_ns: false,
|
flags: Default::default(),
|
||||||
has_lazy_name: false,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -276,8 +278,7 @@ impl<'gc> Multiname<'gc> {
|
||||||
ns: NamespaceSet::single(Namespace::public()),
|
ns: NamespaceSet::single(Namespace::public()),
|
||||||
name: Some(name.into()),
|
name: Some(name.into()),
|
||||||
params: Vec::new(),
|
params: Vec::new(),
|
||||||
has_lazy_ns: false,
|
flags: Default::default(),
|
||||||
has_lazy_name: false,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -364,8 +365,7 @@ impl<'gc> From<QName<'gc>> for Multiname<'gc> {
|
||||||
ns: NamespaceSet::single(q.namespace()),
|
ns: NamespaceSet::single(q.namespace()),
|
||||||
name: Some(q.local_name()),
|
name: Some(q.local_name()),
|
||||||
params: Vec::new(),
|
params: Vec::new(),
|
||||||
has_lazy_ns: false,
|
flags: Default::default(),
|
||||||
has_lazy_name: false,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue