avm2: Rename native instance initializer to super initializer
This commit is contained in:
parent
fc820b7710
commit
b4b9c75118
|
@ -29,7 +29,7 @@ const RUFFLE_METADATA_NAME: &str = "Ruffle";
|
|||
const METADATA_INSTANCE_ALLOCATOR: &str = "InstanceAllocator";
|
||||
// Indicates that we should generate a reference to a native initializer
|
||||
// method (used as a metadata key with `Ruffle` metadata)
|
||||
const METADATA_NATIVE_INSTANCE_INIT: &str = "NativeInstanceInit";
|
||||
const METADATA_SUPER_INITIALIZER: &str = "SuperInitializer";
|
||||
/// Indicates that we should generate a reference to a class call handler
|
||||
/// method (used as a metadata key with `Ruffle` metadata)
|
||||
const METADATA_CALL_HANDLER: &str = "CallHandler";
|
||||
|
@ -363,7 +363,7 @@ fn write_native_table(data: &[u8], out_dir: &Path) -> Result<Vec<u8>, Box<dyn st
|
|||
let none_tokens = quote! { None };
|
||||
let mut rust_paths = vec![none_tokens.clone(); abc.methods.len()];
|
||||
let mut rust_instance_allocators = vec![none_tokens.clone(); abc.classes.len()];
|
||||
let mut rust_native_instance_initializers = vec![none_tokens.clone(); abc.classes.len()];
|
||||
let mut rust_super_initializers = vec![none_tokens.clone(); abc.classes.len()];
|
||||
let mut rust_call_handlers = vec![none_tokens; abc.classes.len()];
|
||||
|
||||
let mut check_trait = |trait_: &Trait, parent: Option<Index<Multiname>>| {
|
||||
|
@ -417,7 +417,7 @@ fn write_native_table(data: &[u8], out_dir: &Path) -> Result<Vec<u8>, Box<dyn st
|
|||
|
||||
let instance_allocator_method_name =
|
||||
"::".to_string() + &flash_to_rust_path(&class_name) + "_allocator";
|
||||
let native_instance_init_method_name = "::native_instance_init".to_string();
|
||||
let super_init_method_name = "::super_init".to_string();
|
||||
let call_handler_method_name = "::call_handler".to_string();
|
||||
for metadata_idx in &trait_.metadata {
|
||||
let metadata = &abc.metadata[metadata_idx.0 as usize];
|
||||
|
@ -451,15 +451,14 @@ fn write_native_table(data: &[u8], out_dir: &Path) -> Result<Vec<u8>, Box<dyn st
|
|||
&instance_allocator_method_name,
|
||||
);
|
||||
}
|
||||
(None, METADATA_NATIVE_INSTANCE_INIT) if !is_versioning => {
|
||||
rust_native_instance_initializers[class_id as usize] =
|
||||
rust_method_name_and_path(
|
||||
&abc,
|
||||
trait_,
|
||||
None,
|
||||
"",
|
||||
&native_instance_init_method_name,
|
||||
)
|
||||
(None, METADATA_SUPER_INITIALIZER) if !is_versioning => {
|
||||
rust_super_initializers[class_id as usize] = rust_method_name_and_path(
|
||||
&abc,
|
||||
trait_,
|
||||
None,
|
||||
"",
|
||||
&super_init_method_name,
|
||||
)
|
||||
}
|
||||
(None, METADATA_CALL_HANDLER) if !is_versioning => {
|
||||
rust_call_handlers[class_id as usize] = rust_method_name_and_path(
|
||||
|
@ -531,13 +530,13 @@ fn write_native_table(data: &[u8], out_dir: &Path) -> Result<Vec<u8>, Box<dyn st
|
|||
|
||||
// This is very similar to `NATIVE_METHOD_TABLE`, but we have one entry per
|
||||
// class, rather than per method. When an entry is `Some(fn_ptr)`, we use
|
||||
// `fn_ptr` as the native initializer for the corresponding class when we
|
||||
// `fn_ptr` as the super initializer for the corresponding class when we
|
||||
// load it into Ruffle.
|
||||
pub const NATIVE_INSTANCE_INIT_TABLE: &[Option<(&'static str, crate::avm2::method::NativeMethodImpl)>] = &[
|
||||
#(#rust_native_instance_initializers,)*
|
||||
pub const NATIVE_SUPER_INITIALIZER_TABLE: &[Option<(&'static str, crate::avm2::method::NativeMethodImpl)>] = &[
|
||||
#(#rust_super_initializers,)*
|
||||
];
|
||||
|
||||
// This is very similar to `NATIVE_INSTANCE_INIT_TABLE`.
|
||||
// This is very similar to `NATIVE_SUPER_INITIALIZER_TABLE`.
|
||||
// When an entry is `Some(fn_ptr)`, we use
|
||||
// `fn_ptr` as the native call handler for the corresponding class when we
|
||||
// load it into Ruffle.
|
||||
|
|
|
@ -160,7 +160,7 @@ pub struct Avm2<'gc> {
|
|||
native_instance_allocator_table: &'static [Option<(&'static str, AllocatorFn)>],
|
||||
|
||||
#[collect(require_static)]
|
||||
native_instance_init_table: &'static [Option<(&'static str, NativeMethodImpl)>],
|
||||
native_super_initializer_table: &'static [Option<(&'static str, NativeMethodImpl)>],
|
||||
|
||||
#[collect(require_static)]
|
||||
native_call_handler_table: &'static [Option<(&'static str, NativeMethodImpl)>],
|
||||
|
@ -257,7 +257,7 @@ impl<'gc> Avm2<'gc> {
|
|||
|
||||
native_method_table: Default::default(),
|
||||
native_instance_allocator_table: Default::default(),
|
||||
native_instance_init_table: Default::default(),
|
||||
native_super_initializer_table: Default::default(),
|
||||
native_call_handler_table: Default::default(),
|
||||
broadcast_list: Default::default(),
|
||||
|
||||
|
|
|
@ -567,7 +567,7 @@ impl<'a, 'gc> Activation<'a, 'gc> {
|
|||
.bound_superclass_object
|
||||
.expect("Superclass object is required to run super_init");
|
||||
|
||||
bound_superclass_object.call_native_init(receiver.into(), args, self)
|
||||
bound_superclass_object.call_super_init(receiver.into(), args, self)
|
||||
}
|
||||
|
||||
/// Retrieve a local register.
|
||||
|
|
|
@ -129,19 +129,20 @@ pub struct ClassData<'gc> {
|
|||
/// Must be called each time a new class instance is constructed.
|
||||
instance_init: Method<'gc>,
|
||||
|
||||
/// The native instance initializer for this class.
|
||||
/// The super initializer for this class, called when super() is called for
|
||||
/// a subclass.
|
||||
///
|
||||
/// This may be provided to allow natively-constructed classes to
|
||||
/// initialize themselves in a different manner from user-constructed ones.
|
||||
/// For example, the user-accessible constructor may error out (as it's not
|
||||
/// a valid class to construct for users), but native code may still call
|
||||
/// it's constructor stack.
|
||||
/// its constructor stack.
|
||||
///
|
||||
/// By default, a class's `native_instance_init` will be initialized to the
|
||||
/// same method as the regular one. You must specify a separate native
|
||||
/// By default, a class's `super_init` will be initialized to the
|
||||
/// same method as the regular one. You must specify a separate super
|
||||
/// initializer to change initialization behavior based on what code is
|
||||
/// constructing the class.
|
||||
native_instance_init: Method<'gc>,
|
||||
super_init: Method<'gc>,
|
||||
|
||||
/// Traits for a given class.
|
||||
///
|
||||
|
@ -221,7 +222,7 @@ impl<'gc> Class<'gc> {
|
|||
class_i_class: Class<'gc>,
|
||||
mc: &Mutation<'gc>,
|
||||
) -> Self {
|
||||
let native_instance_init = instance_init;
|
||||
let super_init = instance_init;
|
||||
|
||||
let instance_allocator = super_class
|
||||
.map(|c| c.instance_allocator())
|
||||
|
@ -239,7 +240,7 @@ impl<'gc> Class<'gc> {
|
|||
all_interfaces: Vec::new(),
|
||||
instance_allocator,
|
||||
instance_init,
|
||||
native_instance_init,
|
||||
super_init,
|
||||
traits: Vec::new(),
|
||||
vtable: VTable::empty(mc),
|
||||
call_handler: None,
|
||||
|
@ -269,7 +270,7 @@ impl<'gc> Class<'gc> {
|
|||
all_interfaces: Vec::new(),
|
||||
instance_allocator: Allocator(scriptobject_allocator),
|
||||
instance_init: class_init,
|
||||
native_instance_init: class_init,
|
||||
super_init: class_init,
|
||||
traits: Vec::new(),
|
||||
vtable: VTable::empty(mc),
|
||||
call_handler: None,
|
||||
|
@ -292,7 +293,7 @@ impl<'gc> Class<'gc> {
|
|||
instance_init: Method<'gc>,
|
||||
mc: &Mutation<'gc>,
|
||||
) -> Self {
|
||||
let native_instance_init = instance_init;
|
||||
let super_init = instance_init;
|
||||
|
||||
Class(GcCell::new(
|
||||
mc,
|
||||
|
@ -306,7 +307,7 @@ impl<'gc> Class<'gc> {
|
|||
all_interfaces: Vec::new(),
|
||||
instance_allocator: Allocator(scriptobject_allocator),
|
||||
instance_init,
|
||||
native_instance_init,
|
||||
super_init,
|
||||
traits: Vec::new(),
|
||||
vtable: VTable::empty(mc),
|
||||
call_handler: None,
|
||||
|
@ -482,7 +483,7 @@ impl<'gc> Class<'gc> {
|
|||
}
|
||||
|
||||
let instance_init = unit.load_method(abc_instance.init_method, false, activation)?;
|
||||
let mut native_instance_init = instance_init;
|
||||
let mut super_init = instance_init;
|
||||
let class_init = unit.load_method(abc_class.init_method, false, activation)?;
|
||||
let mut native_call_handler = None;
|
||||
|
||||
|
@ -501,7 +502,7 @@ impl<'gc> Class<'gc> {
|
|||
.map(|(_name, ptr)| Allocator(ptr));
|
||||
|
||||
if let Some((name, table_native_init)) =
|
||||
activation.avm2().native_instance_init_table[class_index as usize]
|
||||
activation.avm2().native_super_initializer_table[class_index as usize]
|
||||
{
|
||||
let method = Method::from_builtin_and_params(
|
||||
table_native_init,
|
||||
|
@ -511,7 +512,7 @@ impl<'gc> Class<'gc> {
|
|||
instance_init.is_variadic(),
|
||||
activation.context.gc_context,
|
||||
);
|
||||
native_instance_init = method;
|
||||
super_init = method;
|
||||
}
|
||||
|
||||
if let Some((name, table_native_call_handler)) =
|
||||
|
@ -547,7 +548,7 @@ impl<'gc> Class<'gc> {
|
|||
all_interfaces: Vec::new(),
|
||||
instance_allocator,
|
||||
instance_init,
|
||||
native_instance_init,
|
||||
super_init,
|
||||
traits: Vec::new(),
|
||||
vtable: VTable::empty(activation.context.gc_context),
|
||||
call_handler: native_call_handler,
|
||||
|
@ -580,7 +581,7 @@ impl<'gc> Class<'gc> {
|
|||
all_interfaces: Vec::new(),
|
||||
instance_allocator: Allocator(scriptobject_allocator),
|
||||
instance_init: class_init,
|
||||
native_instance_init: class_init,
|
||||
super_init: class_init,
|
||||
traits: Vec::new(),
|
||||
vtable: VTable::empty(activation.context.gc_context),
|
||||
call_handler: None,
|
||||
|
@ -841,7 +842,7 @@ impl<'gc> Class<'gc> {
|
|||
"<Activation object constructor>",
|
||||
activation.context.gc_context,
|
||||
),
|
||||
native_instance_init: Method::from_builtin(
|
||||
super_init: Method::from_builtin(
|
||||
|_, _, _| Ok(Value::Undefined),
|
||||
"<Activation object constructor>",
|
||||
activation.context.gc_context,
|
||||
|
@ -882,7 +883,7 @@ impl<'gc> Class<'gc> {
|
|||
"<Activation object class constructor>",
|
||||
activation.context.gc_context,
|
||||
),
|
||||
native_instance_init: Method::from_builtin(
|
||||
super_init: Method::from_builtin(
|
||||
|_, _, _| Ok(Value::Undefined),
|
||||
"<Activation object class constructor>",
|
||||
activation.context.gc_context,
|
||||
|
@ -1250,14 +1251,14 @@ impl<'gc> Class<'gc> {
|
|||
self.0.read().instance_init
|
||||
}
|
||||
|
||||
/// Get this class's native-code instance initializer.
|
||||
pub fn native_instance_init(self) -> Method<'gc> {
|
||||
self.0.read().native_instance_init
|
||||
/// Get this class's super() initializer.
|
||||
pub fn super_init(self) -> Method<'gc> {
|
||||
self.0.read().super_init
|
||||
}
|
||||
|
||||
/// Set a native-code instance initializer for this class.
|
||||
pub fn set_native_instance_init(self, mc: &Mutation<'gc>, new_native_init: Method<'gc>) {
|
||||
self.0.write(mc).native_instance_init = new_native_init;
|
||||
/// Set a super() initializer for this class.
|
||||
pub fn set_super_init(self, mc: &Mutation<'gc>, new_super_init: Method<'gc>) {
|
||||
self.0.write(mc).super_init = new_super_init;
|
||||
}
|
||||
|
||||
/// Set a call handler for this class.
|
||||
|
|
|
@ -761,7 +761,7 @@ fn load_playerglobal<'gc>(
|
|||
) -> Result<(), Error<'gc>> {
|
||||
activation.avm2().native_method_table = native::NATIVE_METHOD_TABLE;
|
||||
activation.avm2().native_instance_allocator_table = native::NATIVE_INSTANCE_ALLOCATOR_TABLE;
|
||||
activation.avm2().native_instance_init_table = native::NATIVE_INSTANCE_INIT_TABLE;
|
||||
activation.avm2().native_super_initializer_table = native::NATIVE_SUPER_INITIALIZER_TABLE;
|
||||
activation.avm2().native_call_handler_table = native::NATIVE_CALL_HANDLER_TABLE;
|
||||
|
||||
let movie = Arc::new(
|
||||
|
|
|
@ -30,7 +30,7 @@ fn instance_init<'gc>(
|
|||
}
|
||||
|
||||
/// Implements `Boolean`'s native instance initializer.
|
||||
fn native_instance_init<'gc>(
|
||||
fn super_init<'gc>(
|
||||
activation: &mut Activation<'_, 'gc>,
|
||||
this: Object<'gc>,
|
||||
args: &[Value<'gc>],
|
||||
|
@ -145,13 +145,9 @@ pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> Class<'gc> {
|
|||
|
||||
class.set_attributes(mc, ClassAttributes::FINAL | ClassAttributes::SEALED);
|
||||
class.set_instance_allocator(mc, primitive_allocator);
|
||||
class.set_native_instance_init(
|
||||
class.set_super_init(
|
||||
mc,
|
||||
Method::from_builtin(
|
||||
native_instance_init,
|
||||
"<Boolean native instance initializer>",
|
||||
mc,
|
||||
),
|
||||
Method::from_builtin(super_init, "<Boolean native instance initializer>", mc),
|
||||
);
|
||||
class.set_call_handler(
|
||||
mc,
|
||||
|
|
|
@ -23,7 +23,7 @@ pub fn instance_init<'gc>(
|
|||
/// Implements `Class`'s native instance initializer.
|
||||
///
|
||||
/// This exists so that super() calls in class initializers will work.
|
||||
fn native_instance_init<'gc>(
|
||||
fn super_init<'gc>(
|
||||
_activation: &mut Activation<'_, 'gc>,
|
||||
_this: Object<'gc>,
|
||||
_args: &[Value<'gc>],
|
||||
|
@ -68,10 +68,10 @@ pub fn create_i_class<'gc>(
|
|||
// throws a VerifyError
|
||||
class_i_class.set_attributes(gc_context, ClassAttributes::FINAL);
|
||||
|
||||
class_i_class.set_native_instance_init(
|
||||
class_i_class.set_super_init(
|
||||
gc_context,
|
||||
Method::from_builtin(
|
||||
native_instance_init,
|
||||
super_init,
|
||||
"<Class native instance initializer>",
|
||||
gc_context,
|
||||
),
|
||||
|
|
|
@ -11,7 +11,7 @@ package flash.display {
|
|||
import flash.events.EventDispatcher;
|
||||
|
||||
[Ruffle(InstanceAllocator)]
|
||||
[Ruffle(NativeInstanceInit)]
|
||||
[Ruffle(SuperInitializer)]
|
||||
public class DisplayObject extends EventDispatcher implements IBitmapDrawable {
|
||||
private var _accessibilityProperties:AccessibilityProperties;
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@ package flash.display {
|
|||
import flash.display.InteractiveObject;
|
||||
import flash.text.TextSnapshot;
|
||||
|
||||
[Ruffle(NativeInstanceInit)]
|
||||
[Ruffle(SuperInitializer)]
|
||||
public class DisplayObjectContainer extends InteractiveObject {
|
||||
|
||||
public function DisplayObjectContainer() {
|
||||
|
|
|
@ -5,7 +5,7 @@ package flash.display {
|
|||
import flash.geom.Rectangle;
|
||||
import flash.ui.ContextMenu;
|
||||
|
||||
[Ruffle(NativeInstanceInit)]
|
||||
[Ruffle(SuperInitializer)]
|
||||
public class InteractiveObject extends DisplayObject {
|
||||
private var _accessibilityImpl:AccessibilityImplementation = null;
|
||||
private var _needsSoftKeyboard:Boolean = false;
|
||||
|
|
|
@ -5,7 +5,7 @@ package flash.display {
|
|||
import flash.events.UncaughtErrorEvents;
|
||||
|
||||
[Ruffle(InstanceAllocator)]
|
||||
[Ruffle(NativeInstanceInit)]
|
||||
[Ruffle(SuperInitializer)]
|
||||
public class LoaderInfo extends EventDispatcher {
|
||||
public function LoaderInfo() {
|
||||
throw new Error("LoaderInfo cannot be constructed");
|
||||
|
|
|
@ -10,13 +10,13 @@ package flash.display {
|
|||
import flash.text.TextSnapshot;
|
||||
import flash.ui.ContextMenu;
|
||||
|
||||
[Ruffle(NativeInstanceInit)]
|
||||
[Ruffle(SuperInitializer)]
|
||||
public class Stage extends DisplayObjectContainer {
|
||||
private var _colorCorrection:String = ColorCorrection.DEFAULT;
|
||||
private var _mouseLock:Boolean = false;
|
||||
|
||||
public function Stage() {
|
||||
throw new Error("You cannot construct new instances of the Stage.")
|
||||
throw new Error("You cannot construct new instances of the Stage.");
|
||||
}
|
||||
|
||||
override public function set accessibilityProperties(value:AccessibilityProperties):void {
|
||||
|
|
|
@ -63,7 +63,7 @@ pub fn initialize_for_allocator<'gc>(
|
|||
}
|
||||
|
||||
/// Implements `flash.display.DisplayObject`'s native instance constructor.
|
||||
pub fn native_instance_init<'gc>(
|
||||
pub fn super_init<'gc>(
|
||||
activation: &mut Activation<'_, 'gc>,
|
||||
this: Object<'gc>,
|
||||
_args: &[Value<'gc>],
|
||||
|
|
|
@ -16,7 +16,7 @@ use crate::display_object::{DisplayObject, TDisplayObject, TDisplayObjectContain
|
|||
use std::cmp::min;
|
||||
|
||||
/// Implements `flash.display.DisplayObjectContainer`'s native instance constructor.
|
||||
pub fn native_instance_init<'gc>(
|
||||
pub fn super_init<'gc>(
|
||||
activation: &mut Activation<'_, 'gc>,
|
||||
this: Object<'gc>,
|
||||
_args: &[Value<'gc>],
|
||||
|
|
|
@ -9,7 +9,7 @@ use crate::avm2::Error;
|
|||
use crate::display_object::{TDisplayObject, TInteractiveObject};
|
||||
|
||||
/// Implements `flash.display.InteractiveObject`'s native instance constructor.
|
||||
pub fn native_instance_init<'gc>(
|
||||
pub fn super_init<'gc>(
|
||||
activation: &mut Activation<'_, 'gc>,
|
||||
this: Object<'gc>,
|
||||
_args: &[Value<'gc>],
|
||||
|
|
|
@ -17,7 +17,7 @@ const INSUFFICIENT: &str =
|
|||
"Error #2099: The loading object is not sufficiently loaded to provide this information.";
|
||||
|
||||
/// Implements `flash.display.LoaderInfo`'s native instance constructor.
|
||||
pub fn native_instance_init<'gc>(
|
||||
pub fn super_init<'gc>(
|
||||
activation: &mut Activation<'_, 'gc>,
|
||||
this: Object<'gc>,
|
||||
_args: &[Value<'gc>],
|
||||
|
|
|
@ -15,7 +15,7 @@ use crate::{avm2_stub_getter, avm2_stub_setter};
|
|||
use swf::Color;
|
||||
|
||||
/// Implements `flash.display.Stage`'s native instance constructor.
|
||||
pub fn native_instance_init<'gc>(
|
||||
pub fn super_init<'gc>(
|
||||
activation: &mut Activation<'_, 'gc>,
|
||||
this: Object<'gc>,
|
||||
args: &[Value<'gc>],
|
||||
|
|
|
@ -12,7 +12,7 @@ package flash.text.engine {
|
|||
// the TextLine class in Ruffle, despite the methods working fine in FP-
|
||||
// however, it's unlikely that SWFs will actually attempt to add children
|
||||
// to a TextLine.
|
||||
[Ruffle(NativeInstanceInit)]
|
||||
[Ruffle(SuperInitializer)]
|
||||
public final class TextLine extends DisplayObjectContainer {
|
||||
internal var _specifiedWidth:Number = 0.0;
|
||||
internal var _textBlock:TextBlock = null;
|
||||
|
|
|
@ -80,7 +80,7 @@ pub fn create_text_line<'gc>(
|
|||
apply_format(activation, display_object, text.as_wstr(), element_format)?;
|
||||
|
||||
let instance = initialize_for_allocator(activation, display_object.into(), class)?;
|
||||
class.call_native_init(instance.into(), &[], activation)?;
|
||||
class.call_super_init(instance.into(), &[], activation)?;
|
||||
|
||||
instance.set_property(
|
||||
&Multiname::new(activation.avm2().flash_text_engine_internal, "_textBlock"),
|
||||
|
|
|
@ -4,7 +4,7 @@ use crate::avm2::object::{Object, TObject};
|
|||
use crate::avm2::value::Value;
|
||||
use crate::display_object::TDisplayObject;
|
||||
|
||||
pub fn native_instance_init<'gc>(
|
||||
pub fn super_init<'gc>(
|
||||
activation: &mut Activation<'_, 'gc>,
|
||||
this: Object<'gc>,
|
||||
_args: &[Value<'gc>],
|
||||
|
|
|
@ -30,7 +30,7 @@ fn instance_init<'gc>(
|
|||
}
|
||||
|
||||
/// Implements `int`'s native instance initializer.
|
||||
fn native_instance_init<'gc>(
|
||||
fn super_init<'gc>(
|
||||
activation: &mut Activation<'_, 'gc>,
|
||||
this: Object<'gc>,
|
||||
args: &[Value<'gc>],
|
||||
|
@ -241,13 +241,9 @@ pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> Class<'gc> {
|
|||
|
||||
class.set_attributes(mc, ClassAttributes::FINAL | ClassAttributes::SEALED);
|
||||
class.set_instance_allocator(mc, primitive_allocator);
|
||||
class.set_native_instance_init(
|
||||
class.set_super_init(
|
||||
mc,
|
||||
Method::from_builtin(
|
||||
native_instance_init,
|
||||
"<int native instance initializer>",
|
||||
mc,
|
||||
),
|
||||
Method::from_builtin(super_init, "<int native instance initializer>", mc),
|
||||
);
|
||||
class.set_call_handler(
|
||||
mc,
|
||||
|
|
|
@ -101,7 +101,7 @@ fn class_call<'gc>(
|
|||
}
|
||||
|
||||
/// Implements `Namespace`'s native instance initializer.
|
||||
pub fn native_instance_init<'gc>(
|
||||
pub fn super_init<'gc>(
|
||||
activation: &mut Activation<'_, 'gc>,
|
||||
this: Object<'gc>,
|
||||
args: &[Value<'gc>],
|
||||
|
@ -182,13 +182,9 @@ pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> Class<'gc> {
|
|||
);
|
||||
|
||||
class.set_instance_allocator(mc, namespace_allocator);
|
||||
class.set_native_instance_init(
|
||||
class.set_super_init(
|
||||
mc,
|
||||
Method::from_builtin(
|
||||
native_instance_init,
|
||||
"<Namespace native instance initializer>",
|
||||
mc,
|
||||
),
|
||||
Method::from_builtin(super_init, "<Namespace native instance initializer>", mc),
|
||||
);
|
||||
class.set_call_handler(
|
||||
mc,
|
||||
|
|
|
@ -30,7 +30,7 @@ fn instance_init<'gc>(
|
|||
}
|
||||
|
||||
/// Implements `Number`'s native instance initializer.
|
||||
fn native_instance_init<'gc>(
|
||||
fn super_init<'gc>(
|
||||
activation: &mut Activation<'_, 'gc>,
|
||||
this: Object<'gc>,
|
||||
args: &[Value<'gc>],
|
||||
|
@ -385,13 +385,9 @@ pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> Class<'gc> {
|
|||
|
||||
class.set_attributes(mc, ClassAttributes::FINAL | ClassAttributes::SEALED);
|
||||
class.set_instance_allocator(mc, primitive_allocator);
|
||||
class.set_native_instance_init(
|
||||
class.set_super_init(
|
||||
mc,
|
||||
Method::from_builtin(
|
||||
native_instance_init,
|
||||
"<Number native instance initializer>",
|
||||
mc,
|
||||
),
|
||||
Method::from_builtin(super_init, "<Number native instance initializer>", mc),
|
||||
);
|
||||
class.set_call_handler(
|
||||
mc,
|
||||
|
|
|
@ -30,7 +30,7 @@ fn instance_init<'gc>(
|
|||
}
|
||||
|
||||
/// Implements `uint`'s native instance initializer.
|
||||
fn native_instance_init<'gc>(
|
||||
fn super_init<'gc>(
|
||||
activation: &mut Activation<'_, 'gc>,
|
||||
this: Object<'gc>,
|
||||
args: &[Value<'gc>],
|
||||
|
@ -242,13 +242,9 @@ pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> Class<'gc> {
|
|||
|
||||
class.set_attributes(mc, ClassAttributes::FINAL | ClassAttributes::SEALED);
|
||||
class.set_instance_allocator(mc, primitive_allocator);
|
||||
class.set_native_instance_init(
|
||||
class.set_super_init(
|
||||
mc,
|
||||
Method::from_builtin(
|
||||
native_instance_init,
|
||||
"<uint native instance initializer>",
|
||||
mc,
|
||||
),
|
||||
Method::from_builtin(super_init, "<uint native instance initializer>", mc),
|
||||
);
|
||||
class.set_call_handler(
|
||||
mc,
|
||||
|
|
|
@ -87,7 +87,7 @@ impl<'gc> ArrayObject<'gc> {
|
|||
))
|
||||
.into();
|
||||
|
||||
class.call_native_init(instance.into(), &[], activation)?;
|
||||
class.call_super_init(instance.into(), &[], activation)?;
|
||||
|
||||
Ok(instance)
|
||||
}
|
||||
|
|
|
@ -95,7 +95,7 @@ impl<'gc> BitmapDataObject<'gc> {
|
|||
// when the custom class makes a super() call, the BitmapData constructor will
|
||||
// load in the real data from the linked SymbolClass.
|
||||
if class != activation.avm2().classes().bitmapdata {
|
||||
class.call_native_init(instance.into(), &[1.into(), 1.into()], activation)?;
|
||||
class.call_super_init(instance.into(), &[1.into(), 1.into()], activation)?;
|
||||
}
|
||||
|
||||
Ok(instance)
|
||||
|
|
|
@ -98,7 +98,7 @@ impl<'gc> ByteArrayObject<'gc> {
|
|||
))
|
||||
.into();
|
||||
|
||||
class.call_native_init(instance.into(), &[], activation)?;
|
||||
class.call_super_init(instance.into(), &[], activation)?;
|
||||
|
||||
Ok(instance)
|
||||
}
|
||||
|
|
|
@ -377,14 +377,14 @@ impl<'gc> ClassObject<'gc> {
|
|||
/// The native initializer is called when native code needs to construct an
|
||||
/// object, or when supercalling into a parent constructor (as there are
|
||||
/// classes that cannot be constructed but can be supercalled).
|
||||
pub fn call_native_init(
|
||||
pub fn call_super_init(
|
||||
self,
|
||||
receiver: Value<'gc>,
|
||||
arguments: &[Value<'gc>],
|
||||
activation: &mut Activation<'_, 'gc>,
|
||||
) -> Result<Value<'gc>, Error<'gc>> {
|
||||
let scope = self.0.instance_scope.get();
|
||||
let method = self.native_constructor();
|
||||
let method = self.super_constructor();
|
||||
exec(
|
||||
method,
|
||||
scope,
|
||||
|
@ -675,8 +675,8 @@ impl<'gc> ClassObject<'gc> {
|
|||
self.inner_class_definition().instance_init()
|
||||
}
|
||||
|
||||
pub fn native_constructor(self) -> Method<'gc> {
|
||||
self.inner_class_definition().native_instance_init()
|
||||
pub fn super_constructor(self) -> Method<'gc> {
|
||||
self.inner_class_definition().super_init()
|
||||
}
|
||||
|
||||
pub fn call_handler(self) -> Option<Method<'gc>> {
|
||||
|
|
|
@ -49,7 +49,7 @@ impl<'gc> Context3DObject<'gc> {
|
|||
))
|
||||
.into();
|
||||
|
||||
class.call_native_init(this.into(), &[], activation)?;
|
||||
class.call_super_init(this.into(), &[], activation)?;
|
||||
|
||||
Ok(this)
|
||||
}
|
||||
|
|
|
@ -55,7 +55,7 @@ impl<'gc> DateObject<'gc> {
|
|||
))
|
||||
.into();
|
||||
|
||||
class.call_native_init(instance.into(), &[], activation)?;
|
||||
class.call_super_init(instance.into(), &[], activation)?;
|
||||
|
||||
Ok(instance)
|
||||
}
|
||||
|
|
|
@ -84,7 +84,7 @@ impl<'gc> DomainObject<'gc> {
|
|||
class
|
||||
.superclass_object()
|
||||
.unwrap()
|
||||
.call_native_init(this.into(), &[], activation)?;
|
||||
.call_super_init(this.into(), &[], activation)?;
|
||||
Ok(this)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -38,7 +38,7 @@ impl<'gc> IndexBuffer3DObject<'gc> {
|
|||
))
|
||||
.into();
|
||||
|
||||
class.call_native_init(this.into(), &[], activation)?;
|
||||
class.call_super_init(this.into(), &[], activation)?;
|
||||
|
||||
Ok(this)
|
||||
}
|
||||
|
|
|
@ -167,7 +167,7 @@ impl<'gc> LoaderInfoObject<'gc> {
|
|||
))
|
||||
.into();
|
||||
|
||||
class.call_native_init(this.into(), &[], activation)?;
|
||||
class.call_super_init(this.into(), &[], activation)?;
|
||||
|
||||
Ok(this)
|
||||
}
|
||||
|
@ -214,7 +214,7 @@ impl<'gc> LoaderInfoObject<'gc> {
|
|||
))
|
||||
.into();
|
||||
|
||||
class.call_native_init(this.into(), &[], activation)?;
|
||||
class.call_super_init(this.into(), &[], activation)?;
|
||||
|
||||
Ok(this)
|
||||
}
|
||||
|
@ -355,7 +355,7 @@ impl<'gc> LoaderInfoObject<'gc> {
|
|||
.expect("for_display_object cannot return Err");
|
||||
|
||||
class_object
|
||||
.call_native_init(object.into(), &[], activation)
|
||||
.call_super_init(object.into(), &[], activation)
|
||||
.expect("Native init should succeed");
|
||||
|
||||
unlock!(
|
||||
|
|
|
@ -93,7 +93,7 @@ impl<'gc> NamespaceObject<'gc> {
|
|||
))
|
||||
.into();
|
||||
|
||||
class.call_native_init(this.into(), &[], activation)?;
|
||||
class.call_super_init(this.into(), &[], activation)?;
|
||||
|
||||
Ok(this)
|
||||
}
|
||||
|
|
|
@ -38,7 +38,7 @@ impl<'gc> Program3DObject<'gc> {
|
|||
))
|
||||
.into();
|
||||
|
||||
class.call_native_init(this.into(), &[], activation)?;
|
||||
class.call_super_init(this.into(), &[], activation)?;
|
||||
|
||||
Ok(this)
|
||||
}
|
||||
|
|
|
@ -76,7 +76,7 @@ impl<'gc> RegExpObject<'gc> {
|
|||
))
|
||||
.into();
|
||||
|
||||
class.call_native_init(this.into(), &[], activation)?;
|
||||
class.call_super_init(this.into(), &[], activation)?;
|
||||
|
||||
Ok(this)
|
||||
}
|
||||
|
|
|
@ -96,7 +96,7 @@ impl<'gc> SoundChannelObject<'gc> {
|
|||
},
|
||||
));
|
||||
|
||||
class.call_native_init(Value::Object(sound_object.into()), &[], activation)?;
|
||||
class.call_super_init(Value::Object(sound_object.into()), &[], activation)?;
|
||||
|
||||
Ok(sound_object)
|
||||
}
|
||||
|
|
|
@ -71,7 +71,7 @@ impl<'gc> StageObject<'gc> {
|
|||
) -> Result<Self, Error<'gc>> {
|
||||
let this = Self::for_display_object(activation, display_object, class)?;
|
||||
|
||||
class.call_native_init(this.into(), &[], activation)?;
|
||||
class.call_super_init(this.into(), &[], activation)?;
|
||||
|
||||
Ok(this)
|
||||
}
|
||||
|
@ -86,7 +86,7 @@ impl<'gc> StageObject<'gc> {
|
|||
) -> Result<Self, Error<'gc>> {
|
||||
let this = Self::for_display_object(activation, display_object, class)?;
|
||||
|
||||
class.call_native_init(this.into(), args, activation)?;
|
||||
class.call_super_init(this.into(), args, activation)?;
|
||||
|
||||
Ok(this)
|
||||
}
|
||||
|
|
|
@ -38,7 +38,7 @@ impl<'gc> TextureObject<'gc> {
|
|||
))
|
||||
.into();
|
||||
|
||||
class.call_native_init(this.into(), &[], activation)?;
|
||||
class.call_super_init(this.into(), &[], activation)?;
|
||||
|
||||
Ok(this)
|
||||
}
|
||||
|
|
|
@ -39,7 +39,7 @@ impl<'gc> VertexBuffer3DObject<'gc> {
|
|||
))
|
||||
.into();
|
||||
|
||||
class.call_native_init(this.into(), &[], activation)?;
|
||||
class.call_super_init(this.into(), &[], activation)?;
|
||||
|
||||
Ok(this)
|
||||
}
|
||||
|
|
|
@ -552,7 +552,7 @@ impl<'gc> TDisplayObject<'gc> for Avm2Button<'gc> {
|
|||
|
||||
if let Some(avm2_object) = self.0.object.get() {
|
||||
let mut activation = Avm2Activation::from_nothing(context);
|
||||
if let Err(e) = class.call_native_init(avm2_object.into(), &[], &mut activation)
|
||||
if let Err(e) = class.call_super_init(avm2_object.into(), &[], &mut activation)
|
||||
{
|
||||
tracing::error!("Got {} when constructing AVM2 side of button", e);
|
||||
}
|
||||
|
|
|
@ -2192,7 +2192,7 @@ impl<'gc> MovieClip<'gc> {
|
|||
if let Avm2Value::Object(object) = self.object2() {
|
||||
let mut constr_thing = || {
|
||||
let mut activation = Avm2Activation::from_nothing(context);
|
||||
class_object.call_native_init(object.into(), &[], &mut activation)?;
|
||||
class_object.call_super_init(object.into(), &[], &mut activation)?;
|
||||
|
||||
Ok(())
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue