diff --git a/core/src/avm2/globals.rs b/core/src/avm2/globals.rs index d3f5bd549..12a6678ec 100644 --- a/core/src/avm2/globals.rs +++ b/core/src/avm2/globals.rs @@ -111,6 +111,7 @@ pub struct SystemPrototypes<'gc> { pub stage: Object<'gc>, pub sprite: Object<'gc>, pub simplebutton: Object<'gc>, + pub regexp: Object<'gc>, } impl<'gc> SystemPrototypes<'gc> { @@ -158,6 +159,7 @@ impl<'gc> SystemPrototypes<'gc> { stage: empty, sprite: empty, simplebutton: empty, + regexp: empty, } } } @@ -196,6 +198,7 @@ pub struct SystemConstructors<'gc> { pub stage: Object<'gc>, pub sprite: Object<'gc>, pub simplebutton: Object<'gc>, + pub regexp: Object<'gc>, } impl<'gc> SystemConstructors<'gc> { @@ -243,6 +246,7 @@ impl<'gc> SystemConstructors<'gc> { stage: empty, sprite: empty, simplebutton: empty, + regexp: empty, } } } @@ -478,7 +482,7 @@ pub fn load_player_globals<'gc>( constant(mc, "", "Infinity", f64::INFINITY.into(), domain, script)?; class(activation, math::create_class(mc), domain, script)?; - class(activation, regexp::create_class(mc), domain, script)?; + avm2_system_class!(regexp, activation, regexp::create_class(mc), domain, script); avm2_system_class!(xml, activation, xml::create_class(mc), domain, script); avm2_system_class!( diff --git a/core/src/avm2/object/regexp_object.rs b/core/src/avm2/object/regexp_object.rs index 779c59d46..5045cd40e 100644 --- a/core/src/avm2/object/regexp_object.rs +++ b/core/src/avm2/object/regexp_object.rs @@ -21,11 +21,16 @@ pub fn regexp_deriver<'gc>( proto: Object<'gc>, activation: &mut Activation<'_, 'gc, '_>, ) -> Result, Error> { - Ok(RegExpObject::derive( - constr, - proto, + let base = ScriptObjectData::base_new(Some(proto), ScriptObjectClass::ClassInstance(constr)); + + Ok(RegExpObject(GcCell::allocate( activation.context.gc_context, + RegExpObjectData { + base, + regexp: RegExp::new(""), + }, )) + .into()) } #[derive(Clone, Collect, Debug, Copy)] @@ -43,33 +48,23 @@ pub struct RegExpObjectData<'gc> { impl<'gc> RegExpObject<'gc> { pub fn from_regexp( - mc: MutationContext<'gc, '_>, - constr: Object<'gc>, - base_proto: Option>, + activation: &mut Activation<'_, 'gc, '_>, regexp: RegExp<'gc>, - ) -> Object<'gc> { - let base = ScriptObjectData::base_new(base_proto, ScriptObjectClass::ClassInstance(constr)); - - RegExpObject(GcCell::allocate(mc, RegExpObjectData { base, regexp })).into() - } - - /// Instantiate a regexp subclass. - pub fn derive( - constr: Object<'gc>, - base_proto: Object<'gc>, - mc: MutationContext<'gc, '_>, - ) -> Object<'gc> { + ) -> Result, Error> { + let constr = activation.avm2().constructors().regexp; + let proto = activation.avm2().prototypes().regexp; let base = - ScriptObjectData::base_new(Some(base_proto), ScriptObjectClass::ClassInstance(constr)); + ScriptObjectData::base_new(Some(proto), ScriptObjectClass::ClassInstance(constr)); - RegExpObject(GcCell::allocate( - mc, - RegExpObjectData { - base, - regexp: RegExp::new(""), - }, + let this = RegExpObject(GcCell::allocate( + activation.context.gc_context, + RegExpObjectData { base, regexp }, )) - .into() + .into(); + + constr.call_native_initializer(Some(this), &[], activation, Some(constr))?; + + Ok(this) } }