Skip to content

Commit e66b387

Browse files
committed
avm1: Remove Option for Activation.local_registers field
`Some(&[])` could never happen, and allocating an empty `Box<[_]>` is free, so we can treat `&[]` as "has no local registers". Also remove a misleading comment concerning local register #0 (which *does* exist, even though most AS2 compilers don't like to use it for some reason).
1 parent d868228 commit e66b387

File tree

2 files changed

+16
-26
lines changed

2 files changed

+16
-26
lines changed

core/src/avm1/activation.rs

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -161,13 +161,8 @@ pub struct Activation<'a, 'gc: 'a> {
161161

162162
/// Local registers, if any.
163163
///
164-
/// None indicates a function executing out of the global register set.
165-
/// Some indicates the existence of local registers, even if none exist.
166-
/// i.e. None(Vec::new()) means no registers should exist at all.
167-
///
168-
/// Registers are numbered from 1; r0 does not exist. Therefore this vec,
169-
/// while nominally starting from zero, actually starts from r1.
170-
local_registers: Option<&'a [Cell<Value<'gc>>]>,
164+
/// An empty slice indicates a function executing out of the global register set.
165+
local_registers: &'a [Cell<Value<'gc>>],
171166

172167
/// The base clip of this stack frame.
173168
/// This will be the MovieClip that contains the bytecode.
@@ -234,7 +229,7 @@ impl<'a, 'gc> Activation<'a, 'gc> {
234229
base_clip: DisplayObject<'gc>,
235230
this: Value<'gc>,
236231
callee: Option<Object<'gc>>,
237-
registers: &'a [Cell<Value<'gc>>],
232+
local_registers: &'a [Cell<Value<'gc>>],
238233
) -> Self {
239234
avm_debug!(context.avm1, "START {id}");
240235
Self {
@@ -247,7 +242,7 @@ impl<'a, 'gc> Activation<'a, 'gc> {
247242
target_clip: Some(base_clip),
248243
this,
249244
callee,
250-
local_registers: Some(registers).filter(|r| !r.is_empty()),
245+
local_registers,
251246
}
252247
}
253248

@@ -298,7 +293,7 @@ impl<'a, 'gc> Activation<'a, 'gc> {
298293
target_clip: Some(base_clip),
299294
this: scope.locals_cell().into(),
300295
callee: None,
301-
local_registers: None,
296+
local_registers: &[],
302297
context,
303298
}
304299
}
@@ -2399,13 +2394,11 @@ impl<'a, 'gc> Activation<'a, 'gc> {
23992394
/// Value::Undefined, which is also a valid register value.
24002395
pub fn current_register(&self, id: u8) -> Value<'gc> {
24012396
let id = id as usize;
2402-
if let Some(local_registers) = &self.local_registers {
2403-
if let Some(reg) = local_registers.get(id) {
2404-
return reg.get();
2405-
} else if self.context.player_version <= 10 {
2406-
// Old FP versions do not fall back to the global register set.
2407-
return Value::Undefined;
2408-
}
2397+
if let Some(reg) = self.local_registers.get(id) {
2398+
return reg.get();
2399+
} else if !self.local_registers.is_empty() && self.context.player_version <= 10 {
2400+
// Old FP versions do not fall back to the global register set.
2401+
return Value::Undefined;
24092402
}
24102403

24112404
self.context
@@ -2430,16 +2423,12 @@ impl<'a, 'gc> Activation<'a, 'gc> {
24302423
///
24312424
/// If a given local register does not exist, this function does nothing.
24322425
pub fn set_local_register(&mut self, id: u8, value: Value<'gc>) -> bool {
2433-
if let Some(local_registers) = &self.local_registers {
2434-
if let Some(reg) = local_registers.get(id as usize) {
2435-
reg.set(value);
2436-
true
2437-
} else {
2438-
// Old FP versions do not fall back to the global register set.
2439-
self.context.player_version <= 10
2440-
}
2426+
if let Some(reg) = self.local_registers.get(id as usize) {
2427+
reg.set(value);
2428+
true
24412429
} else {
2442-
false
2430+
// Old FP versions do not fall back to the global register set.
2431+
!self.local_registers.is_empty() && self.context.player_version <= 10
24432432
}
24442433
}
24452434

core/src/avm1/function.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,7 @@ impl<'gc> Avm1Function<'gc> {
358358
&local_registers,
359359
);
360360

361+
// Local register #0 is always left free.
361362
let mut preload_r = 1;
362363
self.load_this(&mut frame, this, &mut preload_r);
363364
self.load_arguments(&mut frame, args, arguments_caller, &mut preload_r);

0 commit comments

Comments
 (0)