diff --git a/core/src/avm1.rs b/core/src/avm1.rs index bb7fc5bfa..2fc60ab5d 100644 --- a/core/src/avm1.rs +++ b/core/src/avm1.rs @@ -763,8 +763,9 @@ impl<'gc> Avm1<'gc> { // AS1 logical and let a = self.pop()?; let b = self.pop()?; - let result = b.into_number_v1() != 0.0 && a.into_number_v1() != 0.0; - self.push(Value::from_bool_v1(result, self.current_swf_version())); + let version = self.current_swf_version(); + let result = b.as_bool(version) && a.as_bool(version); + self.push(Value::from_bool(result, self.current_swf_version())); Ok(()) } @@ -1208,7 +1209,7 @@ impl<'gc> Avm1<'gc> { let a = self.pop()?; let b = self.pop()?; let result = b.into_number_v1() == a.into_number_v1(); - self.push(Value::from_bool_v1(result, self.current_swf_version())); + self.push(Value::from_bool(result, self.current_swf_version())); Ok(()) } @@ -1275,7 +1276,7 @@ impl<'gc> Avm1<'gc> { Value::Undefined } } else { - log::warn!("GetProperty: Invalid target {}", path); + //log::warn!("GetProperty: Invalid target {}", path); Value::Undefined } } else { @@ -1593,7 +1594,7 @@ impl<'gc> Avm1<'gc> { let a = self.pop()?; let b = self.pop()?; let result = b.into_number_v1() < a.into_number_v1(); - self.push(Value::from_bool_v1(result, self.current_swf_version())); + self.push(Value::from_bool(result, self.current_swf_version())); Ok(()) } @@ -1669,10 +1670,9 @@ impl<'gc> Avm1<'gc> { } fn action_not(&mut self, _context: &mut UpdateContext<'_, 'gc, '_>) -> Result<(), Error> { - // AS1 logical not - let val = self.pop()?; - let result = val.into_number_v1() == 0.0; - self.push(Value::from_bool_v1(result, self.current_swf_version())); + let version = self.current_swf_version(); + let val = !self.pop()?.as_bool(version); + self.push(Value::from_bool(val, version)); Ok(()) } @@ -1769,8 +1769,9 @@ impl<'gc> Avm1<'gc> { // AS1 logical or let a = self.pop()?; let b = self.pop()?; - let result = b.into_number_v1() != 0.0 || a.into_number_v1() != 0.0; - self.push(Value::from_bool_v1(result, self.current_swf_version())); + let version = self.current_swf_version(); + let result = b.as_bool(version) || a.as_bool(version); + self.push(Value::from_bool(result, version)); Ok(()) } @@ -2163,7 +2164,7 @@ impl<'gc> Avm1<'gc> { let a = self.pop()?; let b = self.pop()?; let result = b.coerce_to_string(self, context)? == a.coerce_to_string(self, context)?; - self.push(Value::from_bool_v1(result, self.current_swf_version())); + self.push(Value::from_bool(result, self.current_swf_version())); Ok(()) } @@ -2197,7 +2198,7 @@ impl<'gc> Avm1<'gc> { .coerce_to_string(self, context)? .bytes() .gt(a.coerce_to_string(self, context)?.bytes()); - self.push(Value::from_bool_v1(result, self.current_swf_version())); + self.push(Value::from_bool(result, self.current_swf_version())); Ok(()) } @@ -2222,7 +2223,7 @@ impl<'gc> Avm1<'gc> { .coerce_to_string(self, context)? .bytes() .lt(a.coerce_to_string(self, context)?.bytes()); - self.push(Value::from_bool_v1(result, self.current_swf_version())); + self.push(Value::from_bool(result, self.current_swf_version())); Ok(()) } diff --git a/core/src/avm1/value.rs b/core/src/avm1/value.rs index 71ba931ec..e89ae709a 100644 --- a/core/src/avm1/value.rs +++ b/core/src/avm1/value.rs @@ -368,7 +368,10 @@ impl<'gc> Value<'gc> { } } - pub fn from_bool_v1(value: bool, swf_version: u8) -> Value<'gc> { + /// Converts a bool value into the appropriate value for the platform. + /// This should be used when pushing a bool onto the stack. + /// This handles SWFv4 pushing a Number, 0 or 1. + pub fn from_bool(value: bool, swf_version: u8) -> Value<'gc> { // SWF version 4 did not have true bools and will push bools as 0 or 1. // e.g. SWF19 p. 72: // "If the numbers are equal, true is pushed to the stack for SWF 5 and later. For SWF 4, 1 is pushed to the stack."