avm2: implement string.split for undefined (#5064)
* avm2: implement string.split for undefined * chore: cargo fmt * dev: avoid explicit ArrayStorage
This commit is contained in:
parent
45d2f3fcde
commit
58c907e985
|
@ -143,7 +143,8 @@ To add a test here, create a .swf file that runs `trace()` statements. You can d
|
|||
* [`mtasc`](http://web.archive.org/web/20210324063628/http://tech.motion-twin.com/mtasc.html) (ActionScript 2 only)
|
||||
* if you create a file `test.as` with a `class Test` with a `static function main` with the code you want to run, you can compile it using `mtasc -main -header 200:150:30 test.as -swf test.swf`
|
||||
* [`mxmlc`](https://helpx.adobe.com/air/kb/archived-air-sdk-version.html) (ActionScript 3 only)
|
||||
* if you create a file `test.as`, you can compile it using `mxmlc test.as`. `mxmlc` is located in the `bin` folder of the downloadable AIR SDK.
|
||||
* if you create a file `test.as` with a `class Test`, you can compile it using `mxmlc Test.as`. `mxmlc` is located in the `bin` folder of the downloadable AIR SDK.
|
||||
* you may want to use docker instead -- something like `docker run -it --rm -v ${PWD}:/src jeko/airbuild mxmlc ./Test.as` works well
|
||||
|
||||
Run the .swf in Flash Player and create a file `output.txt` with the contents of the trace statements. Add the `output.txt`, `test.swf` and either the `test.as` or `test.fla` file to a directory under `core/tests/swfs/avm1` (or `avm2`) named after what your test tests, and add a line in `regression_tests.rs` to have Ruffle run it.
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@ use crate::avm2::ArrayObject;
|
|||
use crate::avm2::Error;
|
||||
use crate::string_utils;
|
||||
use gc_arena::{GcCell, MutationContext};
|
||||
use std::iter;
|
||||
|
||||
/// Implements `String`'s instance initializer.
|
||||
pub fn instance_init<'gc>(
|
||||
|
@ -126,12 +127,16 @@ fn split<'gc>(
|
|||
args: &[Value<'gc>],
|
||||
) -> Result<Value<'gc>, Error> {
|
||||
if let Some(this) = this {
|
||||
if matches!(args.get(0).unwrap_or(&Value::Undefined), Value::Undefined) {
|
||||
log::warn!("string.split(undefined) - not implemented");
|
||||
let delimiter = args.get(0).unwrap_or(&Value::Undefined);
|
||||
if matches!(delimiter, Value::Undefined) {
|
||||
let this = Value::from(this);
|
||||
return Ok(
|
||||
ArrayObject::from_storage(activation, iter::once(this).collect())
|
||||
.unwrap()
|
||||
.into(),
|
||||
);
|
||||
}
|
||||
if args
|
||||
.get(0)
|
||||
.unwrap_or(&Value::Undefined)
|
||||
if delimiter
|
||||
.coerce_to_object(activation)?
|
||||
.as_regexp()
|
||||
.is_some()
|
||||
|
@ -139,10 +144,7 @@ fn split<'gc>(
|
|||
log::warn!("string.split(regex) - not implemented");
|
||||
}
|
||||
let this = Value::from(this).coerce_to_string(activation)?;
|
||||
let delimiter = args
|
||||
.get(0)
|
||||
.unwrap_or(&Value::Undefined)
|
||||
.coerce_to_string(activation)?;
|
||||
let delimiter = delimiter.coerce_to_string(activation)?;
|
||||
let limit = match args.get(1).unwrap_or(&Value::Undefined) {
|
||||
Value::Undefined => usize::MAX,
|
||||
limit => limit.coerce_to_i32(activation)?.max(0) as usize,
|
||||
|
|
|
@ -5,5 +5,6 @@
|
|||
a,b,c
|
||||
// text.split("")
|
||||
a,.,b,.,c
|
||||
// text.split() - unimplemented
|
||||
// text.split()
|
||||
a.b.c
|
||||
// text.split(regex) - unimplemented
|
||||
|
|
|
@ -16,7 +16,8 @@ trace(text.split("."));
|
|||
trace('// text.split("")');
|
||||
trace(text.split(""));
|
||||
|
||||
trace('// text.split() - unimplemented');
|
||||
trace('// text.split()');
|
||||
trace(text.split());
|
||||
trace('// text.split(regex) - unimplemented');
|
||||
|
||||
|
||||
|
|
Binary file not shown.
Loading…
Reference in New Issue