From 4a50f9f31ec3f2f3a5623bb9108930aeee4cd9cb Mon Sep 17 00:00:00 2001 From: Lord-McSweeney Date: Tue, 25 Apr 2023 19:50:06 -0700 Subject: [PATCH] avm2: Add make_error_2008() function and use it --- core/src/avm2/error.rs | 17 ++++++++++++ core/src/avm2/filters.rs | 12 +++------ .../avm2/globals/flash/display/bitmap_data.rs | 6 ++--- .../globals/flash/display/display_object.rs | 3 ++- .../avm2/globals/flash/display/graphics.rs | 8 ++---- core/src/avm2/globals/flash/display/stage.rs | 14 +++------- .../globals/flash/display3D/context_3d.rs | 26 ++++--------------- .../avm2/globals/flash/text/text_format.rs | 6 ++--- 8 files changed, 38 insertions(+), 54 deletions(-) diff --git a/core/src/avm2/error.rs b/core/src/avm2/error.rs index d87b98eb7..e283e644b 100644 --- a/core/src/avm2/error.rs +++ b/core/src/avm2/error.rs @@ -133,6 +133,23 @@ pub fn make_reference_error<'gc>( } } +#[inline(never)] +#[cold] +pub fn make_error_2008<'gc>(activation: &mut Activation<'_, 'gc>, param_name: &str) -> Error<'gc> { + let err = argument_error( + activation, + &format!( + "Error #2008: Parameter {} must be one of the accepted values.", + param_name + ), + 2008, + ); + match err { + Ok(err) => Error::AvmError(err), + Err(err) => err, + } +} + #[inline(never)] #[cold] pub fn range_error<'gc>( diff --git a/core/src/avm2/filters.rs b/core/src/avm2/filters.rs index 534c12d9a..747c7ea40 100644 --- a/core/src/avm2/filters.rs +++ b/core/src/avm2/filters.rs @@ -5,7 +5,7 @@ use swf::{ Fixed8, GlowFilter, GlowFilterFlags, GradientFilter, GradientFilterFlags, GradientRecord, }; -use crate::avm2::error::{argument_error, type_error}; +use crate::avm2::error::{make_error_2008, type_error}; use crate::avm2::{Activation, ArrayObject, ClassObject, Error, Object, TObject, Value}; pub trait FilterAvm2Ext { @@ -77,7 +77,7 @@ impl FilterAvm2Ext for Filter { Err(Error::AvmError(type_error( activation, &format!( - "Type Coercion failed: cannot convert {object:?} to flash.filters.BitmapFilter." + "Error #1034: Type Coercion failed: cannot convert {object:?} to flash.filters.BitmapFilter." ), 1034, )?)) @@ -396,11 +396,7 @@ fn avm2_to_displacement_map_filter<'gc>( } else if &mode == b"wrap" { DisplacementMapFilterMode::Wrap } else { - return Err(Error::AvmError(argument_error( - activation, - "Parameter mode must be one of the accepted values.", - 2008, - )?)); + return Err(make_error_2008(activation, "mode")); } } else { DisplacementMapFilterMode::Wrap @@ -420,7 +416,7 @@ fn avm2_to_displacement_map_filter<'gc>( return Err(Error::AvmError(type_error( activation, &format!( - "Type Coercion failed: cannot convert {bitmap:?} to flash.display.BitmapData." + "Error #1034: Type Coercion failed: cannot convert {bitmap:?} to flash.display.BitmapData." ), 1034, )?)); diff --git a/core/src/avm2/globals/flash/display/bitmap_data.rs b/core/src/avm2/globals/flash/display/bitmap_data.rs index f4ed7ab35..a60f791ec 100644 --- a/core/src/avm2/globals/flash/display/bitmap_data.rs +++ b/core/src/avm2/globals/flash/display/bitmap_data.rs @@ -1,7 +1,7 @@ //! `flash.display.BitmapData` builtin/prototype use crate::avm2::activation::Activation; -use crate::avm2::error::argument_error; +use crate::avm2::error::{argument_error, make_error_2008}; use crate::avm2::filters::FilterAvm2Ext; use crate::avm2::object::{BitmapDataObject, ByteArrayObject, Object, TObject, VectorObject}; use crate::avm2::value::Value; @@ -812,7 +812,7 @@ pub fn draw<'gc>( blend_mode = mode; } else { tracing::error!("Unknown blend mode {:?}", mode); - return Err("ArgumentError: Error #2008: Parameter blendMode must be one of the accepted values.".into()); + return Err(make_error_2008(activation, "blendMode")); } } @@ -891,7 +891,7 @@ pub fn draw_with_quality<'gc>( blend_mode = mode; } else { tracing::error!("Unknown blend mode {:?}", mode); - return Err("ArgumentError: Error #2008: Parameter blendMode must be one of the accepted values.".into()); + return Err(make_error_2008(activation, "blendMode")); } } diff --git a/core/src/avm2/globals/flash/display/display_object.rs b/core/src/avm2/globals/flash/display/display_object.rs index 2e25e16bf..6bd8169cd 100644 --- a/core/src/avm2/globals/flash/display/display_object.rs +++ b/core/src/avm2/globals/flash/display/display_object.rs @@ -1,6 +1,7 @@ //! `flash.display.DisplayObject` builtin/prototype use crate::avm2::activation::Activation; +use crate::avm2::error::make_error_2008; use crate::avm2::filters::FilterAvm2Ext; use crate::avm2::object::{Object, TObject}; use crate::avm2::value::Value; @@ -765,7 +766,7 @@ pub fn set_blend_mode<'gc>( dobj.set_blend_mode(activation.context.gc_context, mode); } else { tracing::error!("Unknown blend mode {}", mode); - return Err("ArgumentError: Error #2008: Parameter blendMode must be one of the accepted values.".into()); + return Err(make_error_2008(activation, "blendMode")); } } Ok(Value::Undefined) diff --git a/core/src/avm2/globals/flash/display/graphics.rs b/core/src/avm2/globals/flash/display/graphics.rs index 2252216ec..0b259cd81 100644 --- a/core/src/avm2/globals/flash/display/graphics.rs +++ b/core/src/avm2/globals/flash/display/graphics.rs @@ -1,7 +1,7 @@ //! `flash.display.Graphics` builtin/prototype use crate::avm2::activation::Activation; -use crate::avm2::error::argument_error; +use crate::avm2::error::make_error_2008; use crate::avm2::globals::flash::geom::transform::object_to_matrix; use crate::avm2::object::{Object, TObject, VectorObject}; use crate::avm2::parameters::ParametersExt; @@ -191,11 +191,7 @@ fn parse_gradient_type<'gc>( } else if &gradient_type == b"radial" { Ok(GradientType::Radial) } else { - Err(Error::AvmError(argument_error( - activation, - "Parameter type must be one of the accepted values.", - 2008, - )?)) + Err(make_error_2008(activation, "type")) } } diff --git a/core/src/avm2/globals/flash/display/stage.rs b/core/src/avm2/globals/flash/display/stage.rs index 2ae1d9c76..3c9969a2f 100644 --- a/core/src/avm2/globals/flash/display/stage.rs +++ b/core/src/avm2/globals/flash/display/stage.rs @@ -1,7 +1,7 @@ //! `flash.display.Stage` builtin/prototype use crate::avm2::activation::Activation; -use crate::avm2::error::argument_error; +use crate::avm2::error::make_error_2008; use crate::avm2::object::{Object, TObject}; use crate::avm2::parameters::ParametersExt; use crate::avm2::value::Value; @@ -176,11 +176,7 @@ pub fn set_display_state<'gc>( .stage .set_display_state(&mut activation.context, display_state); } else { - return Err(Error::AvmError(argument_error( - activation, - "Error #2008: Parameter displayState must be one of the accepted values.", - 2008, - )?)); + return Err(make_error_2008(activation, "displayState")); } Ok(Value::Undefined) } @@ -290,11 +286,7 @@ pub fn set_scale_mode<'gc>( .stage .set_scale_mode(&mut activation.context, scale_mode); } else { - return Err(Error::AvmError(argument_error( - activation, - "Error #2008: Parameter scaleMode must be one of the accepted values.", - 2008, - )?)); + return Err(make_error_2008(activation, "scaleMode")); } Ok(Value::Undefined) } diff --git a/core/src/avm2/globals/flash/display3D/context_3d.rs b/core/src/avm2/globals/flash/display3D/context_3d.rs index 3a52e904f..359420a62 100644 --- a/core/src/avm2/globals/flash/display3D/context_3d.rs +++ b/core/src/avm2/globals/flash/display3D/context_3d.rs @@ -1,4 +1,4 @@ -use crate::avm2::error::argument_error; +use crate::avm2::error::make_error_2008; use crate::avm2::parameters::ParametersExt; use crate::avm2::Activation; use crate::avm2::TObject; @@ -618,27 +618,11 @@ pub fn set_sampler_state_at<'gc>( let filter = args[2].coerce_to_string(activation)?; let mip_filter = args[3].coerce_to_string(activation)?; - let wrap = Context3DWrapMode::from_wstr(&wrap).ok_or_else(|| { - Error::AvmError( - argument_error( - activation, - "Error #2008: Parameter wrap must be one of the accepted values.", - 2008, - ) - .expect("Failed to construct error"), - ) - })?; + let wrap = Context3DWrapMode::from_wstr(&wrap) + .ok_or_else(|| make_error_2008(activation, "wrap"))?; - let filter = Context3DTextureFilter::from_wstr(&filter).ok_or_else(|| { - Error::AvmError( - argument_error( - activation, - "Error #2008: Parameter filter must be one of the accepted values.", - 2008, - ) - .expect("Failed to construct error"), - ) - })?; + let filter = Context3DTextureFilter::from_wstr(&filter) + .ok_or_else(|| make_error_2008(activation, "filter"))?; if matches!( filter, diff --git a/core/src/avm2/globals/flash/text/text_format.rs b/core/src/avm2/globals/flash/text/text_format.rs index cad975eae..eaa7e1a51 100644 --- a/core/src/avm2/globals/flash/text/text_format.rs +++ b/core/src/avm2/globals/flash/text/text_format.rs @@ -1,4 +1,5 @@ use crate::avm2::activation::Activation; +use crate::avm2::error::make_error_2008; use crate::avm2::object::{ArrayObject, Object, TObject}; use crate::avm2::value::Value; use crate::avm2::Error; @@ -54,10 +55,7 @@ pub fn set_align<'gc>( } else if value == WStr::from_units(b"justify") { Some(swf::TextAlign::Justify) } else { - return Err( - "ArgumentError: Error #2008: Parameter align must be one of the accepted values." - .into(), - ); + return Err(make_error_2008(activation, "align")); }; } }