avm1: Use `PropertyMap::get_index` for stage object properties
This commit is contained in:
parent
4ea609cca1
commit
f7375c3700
|
@ -380,18 +380,12 @@ unsafe impl<'gc> Collect for DisplayProperty<'gc> {
|
||||||
/// The map from key/index to function pointers for special display object properties.
|
/// The map from key/index to function pointers for special display object properties.
|
||||||
#[derive(Collect)]
|
#[derive(Collect)]
|
||||||
#[collect(no_drop)]
|
#[collect(no_drop)]
|
||||||
pub struct DisplayPropertyMap<'gc> {
|
pub struct DisplayPropertyMap<'gc>(PropertyMap<DisplayProperty<'gc>>);
|
||||||
property_by_name: PropertyMap<DisplayProperty<'gc>>,
|
|
||||||
property_by_index: Vec<DisplayProperty<'gc>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'gc> DisplayPropertyMap<'gc> {
|
impl<'gc> DisplayPropertyMap<'gc> {
|
||||||
/// Creates the display property map.
|
/// Creates the display property map.
|
||||||
pub fn new(gc_context: MutationContext<'gc, '_>) -> GcCell<'gc, DisplayPropertyMap<'gc>> {
|
pub fn new(gc_context: MutationContext<'gc, '_>) -> GcCell<'gc, DisplayPropertyMap<'gc>> {
|
||||||
let mut property_map = DisplayPropertyMap {
|
let mut property_map = DisplayPropertyMap(PropertyMap::new());
|
||||||
property_by_name: PropertyMap::new(),
|
|
||||||
property_by_index: Vec::with_capacity(21),
|
|
||||||
};
|
|
||||||
|
|
||||||
// Order is important:
|
// Order is important:
|
||||||
// should match the SWF specs for GetProperty/SetProperty.
|
// should match the SWF specs for GetProperty/SetProperty.
|
||||||
|
@ -426,7 +420,7 @@ impl<'gc> DisplayPropertyMap<'gc> {
|
||||||
pub fn get_by_name(&self, name: &str) -> Option<&DisplayProperty<'gc>> {
|
pub fn get_by_name(&self, name: &str) -> Option<&DisplayProperty<'gc>> {
|
||||||
// Display object properties are case insensitive, regardless of SWF version!?
|
// Display object properties are case insensitive, regardless of SWF version!?
|
||||||
// TODO: Another string alloc; optimize this eventually.
|
// TODO: Another string alloc; optimize this eventually.
|
||||||
self.property_by_name.get(&name, false)
|
self.0.get(&name, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Gets a property slot by SWF4 index.
|
/// Gets a property slot by SWF4 index.
|
||||||
|
@ -434,7 +428,7 @@ impl<'gc> DisplayPropertyMap<'gc> {
|
||||||
/// Used by `GetProperty`/`SetProperty`.
|
/// Used by `GetProperty`/`SetProperty`.
|
||||||
/// SWF19 pp. 85-86
|
/// SWF19 pp. 85-86
|
||||||
pub fn get_by_index(&self, index: usize) -> Option<&DisplayProperty<'gc>> {
|
pub fn get_by_index(&self, index: usize) -> Option<&DisplayProperty<'gc>> {
|
||||||
self.property_by_index.get(index)
|
self.0.get_index(index)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_property(
|
fn add_property(
|
||||||
|
@ -444,9 +438,7 @@ impl<'gc> DisplayPropertyMap<'gc> {
|
||||||
set: Option<DisplaySetter<'gc>>,
|
set: Option<DisplaySetter<'gc>>,
|
||||||
) {
|
) {
|
||||||
let prop = DisplayProperty { get, set };
|
let prop = DisplayProperty { get, set };
|
||||||
self.property_by_name
|
self.0.insert(name.to_string(), prop.clone(), false);
|
||||||
.insert(name.to_string(), prop.clone(), false);
|
|
||||||
self.property_by_index.push(prop);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -71,6 +71,11 @@ impl<V> PropertyMap<V> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Gets a value by index, based on insertion order.
|
||||||
|
pub fn get_index(&self, index: usize) -> Option<&V> {
|
||||||
|
self.0.get_index(index).map(|(_, v)| v)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn insert(&mut self, key: String, value: V, case_sensitive: bool) -> Option<V> {
|
pub fn insert(&mut self, key: String, value: V, case_sensitive: bool) -> Option<V> {
|
||||||
match self.entry(key, case_sensitive) {
|
match self.entry(key, case_sensitive) {
|
||||||
Entry::Occupied(entry) => Some(entry.insert(value)),
|
Entry::Occupied(entry) => Some(entry.insert(value)),
|
||||||
|
|
Loading…
Reference in New Issue