avm2: Impl `Array.toLocaleString`.
This commit is contained in:
parent
2ae3b6445b
commit
ca4982029b
|
@ -130,12 +130,15 @@ fn resolve_array_hole<'gc>(
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Implements `Array.join`
|
pub fn join_inner<'gc, 'a, 'ctxt, C>(
|
||||||
pub fn join<'gc>(
|
activation: &mut Activation<'a, 'gc, 'ctxt>,
|
||||||
activation: &mut Activation<'_, 'gc, '_>,
|
|
||||||
this: Option<Object<'gc>>,
|
this: Option<Object<'gc>>,
|
||||||
args: &[Value<'gc>],
|
args: &[Value<'gc>],
|
||||||
) -> Result<Value<'gc>, Error> {
|
mut conv: C,
|
||||||
|
) -> Result<Value<'gc>, Error>
|
||||||
|
where
|
||||||
|
C: for<'b> FnMut(Value<'gc>, &'b mut Activation<'a, 'gc, 'ctxt>) -> Result<Value<'gc>, Error>,
|
||||||
|
{
|
||||||
let mut separator = args.get(0).cloned().unwrap_or(Value::Undefined);
|
let mut separator = args.get(0).cloned().unwrap_or(Value::Undefined);
|
||||||
if separator == Value::Undefined {
|
if separator == Value::Undefined {
|
||||||
separator = ",".into();
|
separator = ",".into();
|
||||||
|
@ -149,7 +152,11 @@ pub fn join<'gc>(
|
||||||
for (i, item) in array.iter().enumerate() {
|
for (i, item) in array.iter().enumerate() {
|
||||||
let item = resolve_array_hole(activation, this, i, item)?;
|
let item = resolve_array_hole(activation, this, i, item)?;
|
||||||
|
|
||||||
accum.push(item.coerce_to_string(activation)?.to_string());
|
accum.push(
|
||||||
|
conv(item, activation)?
|
||||||
|
.coerce_to_string(activation)?
|
||||||
|
.to_string(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Ok(AvmString::new(
|
return Ok(AvmString::new(
|
||||||
|
@ -163,13 +170,42 @@ pub fn join<'gc>(
|
||||||
Ok(Value::Undefined)
|
Ok(Value::Undefined)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Implements `Array.join`
|
||||||
|
pub fn join<'gc>(
|
||||||
|
activation: &mut Activation<'_, 'gc, '_>,
|
||||||
|
this: Option<Object<'gc>>,
|
||||||
|
args: &[Value<'gc>],
|
||||||
|
) -> Result<Value<'gc>, Error> {
|
||||||
|
join_inner(activation, this, args, |v, _act| Ok(v))
|
||||||
|
}
|
||||||
|
|
||||||
/// Implements `Array.toString`
|
/// Implements `Array.toString`
|
||||||
pub fn to_string<'gc>(
|
pub fn to_string<'gc>(
|
||||||
activation: &mut Activation<'_, 'gc, '_>,
|
activation: &mut Activation<'_, 'gc, '_>,
|
||||||
this: Option<Object<'gc>>,
|
this: Option<Object<'gc>>,
|
||||||
_args: &[Value<'gc>],
|
_args: &[Value<'gc>],
|
||||||
) -> Result<Value<'gc>, Error> {
|
) -> Result<Value<'gc>, Error> {
|
||||||
join(activation, this, &[",".into()])
|
join_inner(activation, this, &[",".into()], |v, _act| Ok(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Implements `Array.toLocaleString`
|
||||||
|
pub fn to_locale_string<'gc>(
|
||||||
|
act: &mut Activation<'_, 'gc, '_>,
|
||||||
|
this: Option<Object<'gc>>,
|
||||||
|
_args: &[Value<'gc>],
|
||||||
|
) -> Result<Value<'gc>, Error> {
|
||||||
|
join_inner(act, this, &[",".into()], |v, activation| {
|
||||||
|
let mut o = v.coerce_to_object(activation)?;
|
||||||
|
|
||||||
|
let tls = o.get_property(
|
||||||
|
o,
|
||||||
|
&QName::new(Namespace::public_namespace(), "toLocaleString"),
|
||||||
|
activation,
|
||||||
|
)?;
|
||||||
|
|
||||||
|
tls.coerce_to_object(activation)?
|
||||||
|
.call(Some(o), &[], activation, o.proto())
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Implements `Array.valueOf`
|
/// Implements `Array.valueOf`
|
||||||
|
@ -178,7 +214,7 @@ pub fn value_of<'gc>(
|
||||||
this: Option<Object<'gc>>,
|
this: Option<Object<'gc>>,
|
||||||
_args: &[Value<'gc>],
|
_args: &[Value<'gc>],
|
||||||
) -> Result<Value<'gc>, Error> {
|
) -> Result<Value<'gc>, Error> {
|
||||||
join(activation, this, &[",".into()])
|
join_inner(activation, this, &[",".into()], |v, _act| Ok(v))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// An iterator that allows iterating over the contents of an array whilst also
|
/// An iterator that allows iterating over the contents of an array whilst also
|
||||||
|
@ -758,6 +794,11 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>
|
||||||
Method::from_builtin(to_string),
|
Method::from_builtin(to_string),
|
||||||
));
|
));
|
||||||
|
|
||||||
|
class.write(mc).define_instance_trait(Trait::from_method(
|
||||||
|
QName::new(Namespace::public_namespace(), "toLocaleString"),
|
||||||
|
Method::from_builtin(to_locale_string),
|
||||||
|
));
|
||||||
|
|
||||||
class.write(mc).define_instance_trait(Trait::from_method(
|
class.write(mc).define_instance_trait(Trait::from_method(
|
||||||
QName::new(Namespace::public_namespace(), "valueOf"),
|
QName::new(Namespace::public_namespace(), "valueOf"),
|
||||||
Method::from_builtin(value_of),
|
Method::from_builtin(value_of),
|
||||||
|
|
|
@ -362,6 +362,7 @@ swf_tests! {
|
||||||
(as3_array_literal, "avm2/array_literal", 1),
|
(as3_array_literal, "avm2/array_literal", 1),
|
||||||
(as3_array_concat, "avm2/array_concat", 1),
|
(as3_array_concat, "avm2/array_concat", 1),
|
||||||
(as3_array_tostring, "avm2/array_tostring", 1),
|
(as3_array_tostring, "avm2/array_tostring", 1),
|
||||||
|
(as3_array_tolocalestring, "avm2/array_tolocalestring", 1),
|
||||||
(as3_array_valueof, "avm2/array_valueof", 1),
|
(as3_array_valueof, "avm2/array_valueof", 1),
|
||||||
(as3_array_join, "avm2/array_join", 1),
|
(as3_array_join, "avm2/array_join", 1),
|
||||||
(as3_array_foreach, "avm2/array_foreach", 1),
|
(as3_array_foreach, "avm2/array_foreach", 1),
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
package {
|
||||||
|
public class Test {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
trace("//var a = new Array(\"a\", \"b\", \"c\");");
|
||||||
|
var a = new Array("a", "b", "c");
|
||||||
|
|
||||||
|
trace("//var b = new Array(1, 2, 3);");
|
||||||
|
var b = new Array(1, 2, 3);
|
||||||
|
|
||||||
|
trace("//var c = new Array(a, b);");
|
||||||
|
var c = new Array(a, b);
|
||||||
|
|
||||||
|
trace("//a.toLocaleString();");
|
||||||
|
trace(a.toLocaleString());
|
||||||
|
|
||||||
|
trace("//b.toLocaleString();");
|
||||||
|
trace(b.toLocaleString());
|
||||||
|
|
||||||
|
trace("//c.toLocaleString();");
|
||||||
|
trace(c.toLocaleString());
|
|
@ -0,0 +1,9 @@
|
||||||
|
//var a = new Array("a", "b", "c");
|
||||||
|
//var b = new Array(1, 2, 3);
|
||||||
|
//var c = new Array(a, b);
|
||||||
|
//a.toLocaleString();
|
||||||
|
[object String],[object String],[object String]
|
||||||
|
//b.toLocaleString();
|
||||||
|
1,2,3
|
||||||
|
//c.toLocaleString();
|
||||||
|
[object String],[object String],[object String],1,2,3
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue