avm2: Prevent circularly referential scripts from causing stack overflows or double-borrows.
This commit is contained in:
parent
a484861f79
commit
50d6ffb510
|
@ -347,11 +347,16 @@ impl<'gc> Script<'gc> {
|
||||||
&mut self,
|
&mut self,
|
||||||
context: &mut UpdateContext<'_, 'gc, '_>,
|
context: &mut UpdateContext<'_, 'gc, '_>,
|
||||||
) -> Result<Object<'gc>, Error> {
|
) -> Result<Object<'gc>, Error> {
|
||||||
if !self.0.read().initialized {
|
let mut write = self.0.write(context.gc_context);
|
||||||
let mut globals = self.0.read().globals;
|
if !write.initialized {
|
||||||
|
write.initialized = true;
|
||||||
|
|
||||||
|
let mut globals = write.globals;
|
||||||
let scope = Scope::push_scope(None, globals, context.gc_context);
|
let scope = Scope::push_scope(None, globals, context.gc_context);
|
||||||
let mut null_activation = Activation::from_nothing(context.reborrow());
|
let mut null_activation = Activation::from_nothing(context.reborrow());
|
||||||
|
|
||||||
|
drop(write);
|
||||||
|
|
||||||
for trait_entry in self.traits()?.iter() {
|
for trait_entry in self.traits()?.iter() {
|
||||||
globals.install_foreign_trait(
|
globals.install_foreign_trait(
|
||||||
&mut null_activation,
|
&mut null_activation,
|
||||||
|
@ -362,12 +367,11 @@ impl<'gc> Script<'gc> {
|
||||||
}
|
}
|
||||||
|
|
||||||
Avm2::run_script_initializer(*self, context)?;
|
Avm2::run_script_initializer(*self, context)?;
|
||||||
|
|
||||||
|
Ok(globals)
|
||||||
|
} else {
|
||||||
|
Ok(write.globals)
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut write = self.0.write(context.gc_context);
|
|
||||||
|
|
||||||
write.initialized = true;
|
|
||||||
Ok(write.globals)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return traits for this script.
|
/// Return traits for this script.
|
||||||
|
|
Loading…
Reference in New Issue