avm2: Add make_error_2008() function and use it

This commit is contained in:
Lord-McSweeney 2023-04-25 19:50:06 -07:00 committed by relrelb
parent 24dfb82d12
commit 4a50f9f31e
8 changed files with 38 additions and 54 deletions

View File

@ -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>(

View File

@ -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,
)?));

View File

@ -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"));
}
}

View File

@ -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)

View File

@ -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"))
}
}

View File

@ -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)
}

View File

@ -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,

View File

@ -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"));
};
}
}