Skip to content

Commit 895b0ac

Browse files
committed
avm1: clean up Activation's register manipulation methods
1 parent 1e0f128 commit 895b0ac

File tree

1 file changed

+28
-38
lines changed

1 file changed

+28
-38
lines changed

core/src/avm1/activation.rs

Lines changed: 28 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2380,28 +2380,44 @@ impl<'a, 'gc> Activation<'a, 'gc> {
23802380
/// If a given register does not exist, this function yields
23812381
/// Value::Undefined, which is also a valid register value.
23822382
pub fn current_register(&self, id: u8) -> Value<'gc> {
2383-
if self.has_local_register(id) {
2384-
self.local_register(id).unwrap_or(Value::Undefined)
2385-
} else {
2386-
self.context
2387-
.avm1
2388-
.get_register(id as usize)
2389-
.cloned()
2390-
.unwrap_or(Value::Undefined)
2383+
let id = id as usize;
2384+
if let Some(local_registers) = &self.local_registers {
2385+
if let Some(reg) = local_registers.get(id) {
2386+
return reg.get();
2387+
}
23912388
}
2389+
2390+
self.context
2391+
.avm1
2392+
.get_register(id)
2393+
.copied()
2394+
.unwrap_or(Value::Undefined)
23922395
}
23932396

23942397
/// Set a register to a given value.
23952398
///
23962399
/// If a given register does not exist, this function does nothing.
23972400
pub fn set_current_register(&mut self, id: u8, value: Value<'gc>) {
2398-
if self.has_local_register(id) {
2399-
self.set_local_register(id, value);
2400-
} else if let Some(v) = self.context.avm1.get_register_mut(id as usize) {
2401-
*v = value;
2401+
if !self.set_local_register(id, value) {
2402+
if let Some(reg) = self.context.avm1.get_register_mut(id as usize) {
2403+
*reg = value;
2404+
}
24022405
}
24032406
}
24042407

2408+
/// Set a local register to a given value, and returns `true` if successful.
2409+
///
2410+
/// If a given local register does not exist, this function does nothing.
2411+
pub fn set_local_register(&mut self, id: u8, value: Value<'gc>) -> bool {
2412+
if let Some(local_registers) = &self.local_registers {
2413+
if let Some(reg) = local_registers.get(id as usize) {
2414+
reg.set(value);
2415+
return true;
2416+
}
2417+
}
2418+
false
2419+
}
2420+
24052421
/// Convert the enumerable properties of an object into a set of form values.
24062422
///
24072423
/// This is necessary to support form submission from Flash via a couple of
@@ -3021,39 +3037,13 @@ impl<'a, 'gc> Activation<'a, 'gc> {
30213037
self.this
30223038
}
30233039

3024-
/// Returns true if this activation has a given local register ID.
3025-
pub fn has_local_register(&self, id: u8) -> bool {
3026-
self.local_registers
3027-
.as_deref()
3028-
.map(|rs| usize::from(id) < rs.len())
3029-
.unwrap_or(false)
3030-
}
3031-
30323040
pub fn allocate_local_registers(&mut self, num: u8) {
30333041
self.local_registers = match num {
30343042
0 => None,
30353043
num => Some((0..num).map(|_| Cell::new(Value::Undefined)).collect()),
30363044
};
30373045
}
30383046

3039-
/// Retrieve a local register.
3040-
pub fn local_register(&self, id: u8) -> Option<Value<'gc>> {
3041-
if let Some(local_registers) = self.local_registers.as_deref() {
3042-
local_registers.get(usize::from(id)).map(Cell::get)
3043-
} else {
3044-
None
3045-
}
3046-
}
3047-
3048-
/// Set a local register.
3049-
pub fn set_local_register(&mut self, id: u8, value: Value<'gc>) {
3050-
if let Some(ref mut local_registers) = self.local_registers {
3051-
if let Some(r) = local_registers.get(usize::from(id)) {
3052-
r.set(value);
3053-
}
3054-
}
3055-
}
3056-
30573047
pub fn constant_pool(&self) -> Gc<'gc, Vec<Value<'gc>>> {
30583048
self.constant_pool
30593049
}

0 commit comments

Comments
 (0)