diff --git a/core/src/avm2/globals/boolean.rs b/core/src/avm2/globals/boolean.rs index 9c1217813..073edc881 100644 --- a/core/src/avm2/globals/boolean.rs +++ b/core/src/avm2/globals/boolean.rs @@ -4,18 +4,31 @@ use crate::avm2::activation::Activation; use crate::avm2::class::Class; use crate::avm2::method::Method; use crate::avm2::names::{Namespace, QName}; -use crate::avm2::object::{primitive_allocator, Object}; +use crate::avm2::object::{primitive_allocator, Object, TObject}; use crate::avm2::value::Value; use crate::avm2::Error; use gc_arena::{GcCell, MutationContext}; /// Implements `Boolean`'s instance initializer. pub fn instance_init<'gc>( - _activation: &mut Activation<'_, 'gc, '_>, - _this: Option>, - _args: &[Value<'gc>], + activation: &mut Activation<'_, 'gc, '_>, + this: Option>, + args: &[Value<'gc>], ) -> Result, Error> { - Err("Boolean constructor is a stub.".into()) + if let Some(this) = this { + if let Some(mut prim) = this.as_primitive_mut(activation.context.gc_context) { + if matches!(*prim, Value::Undefined | Value::Null) { + *prim = args + .get(0) + .cloned() + .unwrap_or(Value::Bool(false)) + .coerce_to_boolean() + .into(); + } + } + } + + Ok(Value::Undefined) } /// Implements `Boolean`'s native instance initializer. diff --git a/core/src/avm2/globals/number.rs b/core/src/avm2/globals/number.rs index 08688ac9e..a35569300 100644 --- a/core/src/avm2/globals/number.rs +++ b/core/src/avm2/globals/number.rs @@ -11,11 +11,24 @@ use gc_arena::{GcCell, MutationContext}; /// Implements `Number`'s instance initializer. pub fn instance_init<'gc>( - _activation: &mut Activation<'_, 'gc, '_>, - _this: Option>, - _args: &[Value<'gc>], + activation: &mut Activation<'_, 'gc, '_>, + this: Option>, + args: &[Value<'gc>], ) -> Result, Error> { - Err("Number constructor is a stub.".into()) + if let Some(this) = this { + if let Some(mut prim) = this.as_primitive_mut(activation.context.gc_context) { + if matches!(*prim, Value::Undefined | Value::Null) { + *prim = args + .get(0) + .cloned() + .unwrap_or(Value::Number(0.0)) + .coerce_to_number(activation)? + .into(); + } + } + } + + Ok(Value::Undefined) } /// Implements `Number`'s native instance initializer. diff --git a/core/src/avm2/globals/uint.rs b/core/src/avm2/globals/uint.rs index e67cb8a89..4d45d4ce5 100644 --- a/core/src/avm2/globals/uint.rs +++ b/core/src/avm2/globals/uint.rs @@ -4,18 +4,31 @@ use crate::avm2::activation::Activation; use crate::avm2::class::Class; use crate::avm2::method::{Method, ParamConfig}; use crate::avm2::names::{Namespace, QName}; -use crate::avm2::object::{primitive_allocator, Object}; +use crate::avm2::object::{primitive_allocator, Object, TObject}; use crate::avm2::value::Value; use crate::avm2::Error; use gc_arena::{GcCell, MutationContext}; /// Implements `uint`'s instance initializer. pub fn instance_init<'gc>( - _activation: &mut Activation<'_, 'gc, '_>, - _this: Option>, - _args: &[Value<'gc>], + activation: &mut Activation<'_, 'gc, '_>, + this: Option>, + args: &[Value<'gc>], ) -> Result, Error> { - Err("uint constructor is a stub.".into()) + if let Some(this) = this { + if let Some(mut prim) = this.as_primitive_mut(activation.context.gc_context) { + if matches!(*prim, Value::Undefined | Value::Null) { + *prim = args + .get(0) + .cloned() + .unwrap_or(Value::Undefined) + .coerce_to_u32(activation)? + .into(); + } + } + } + + Ok(Value::Undefined) } /// Implements `uint`'s native instance initializer. @@ -45,16 +58,7 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> let class = Class::new( QName::new(Namespace::public(), "uint"), Some(QName::new(Namespace::public(), "Object").into()), - Method::from_builtin_and_params( - instance_init, - "", - vec![ParamConfig::of_type( - "num", - QName::new(Namespace::public(), "Object").into(), - )], - false, - mc, - ), + Method::from_builtin(instance_init, "", mc), Method::from_builtin(class_init, "", mc), mc, );