avm1_types/
raw.rs

1pub use crate::action::*;
2use crate::error::InvalidActionError;
3use crate::CatchTarget;
4use crate::{action, FunctionFlags, Parameter};
5#[cfg(feature = "serde")]
6use serde::{Deserialize, Serialize};
7use static_assertions::const_assert;
8use std::convert::TryFrom;
9
10#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
11#[cfg_attr(
12  feature = "serde",
13  derive(Serialize, Deserialize),
14  serde(tag = "action", rename_all = "PascalCase")
15)]
16pub enum Action {
17  Add,
18  Add2,
19  And,
20  AsciiToChar,
21  BitAnd,
22  BitOr,
23  BitLShift,
24  BitRShift,
25  BitURShift,
26  BitXor,
27  Call,
28  CallFunction,
29  CallMethod,
30  CharToAscii,
31  CastOp,
32  CloneSprite,
33  ConstantPool(action::ConstantPool),
34  Decrement,
35  DefineFunction(Box<DefineFunction>),
36  DefineFunction2(Box<DefineFunction2>),
37  DefineLocal,
38  DefineLocal2,
39  Delete,
40  Delete2,
41  Divide,
42  EndDrag,
43  Enumerate,
44  Enumerate2,
45  Equals,
46  Equals2,
47  Extends,
48  FsCommand2,
49  GetMember,
50  GetProperty,
51  GetTime,
52  GetUrl(Box<action::GetUrl>),
53  GetUrl2(action::GetUrl2),
54  GetVariable,
55  GotoFrame(action::GotoFrame),
56  GotoFrame2(action::GotoFrame2),
57  GotoLabel(action::GoToLabel),
58  Greater,
59  ImplementsOp,
60  Increment,
61  InitArray,
62  InitObject,
63  InstanceOf,
64  Less,
65  Less2,
66  MbAsciiToChar,
67  MbCharToAscii,
68  MbStringExtract,
69  MbStringLength,
70  Modulo,
71  Multiply,
72  NewMethod,
73  NewObject,
74  NextFrame,
75  Not,
76  Or,
77  Play,
78  Pop,
79  PrevFrame,
80  Push(action::Push),
81  PushDuplicate,
82  RandomNumber,
83  Raw(Box<action::Raw>),
84  RemoveSprite,
85  SetMember,
86  SetProperty,
87  SetTarget(action::SetTarget),
88  SetTarget2,
89  SetVariable,
90  StackSwap,
91  StartDrag,
92  Stop,
93  StopSounds,
94  StoreRegister(action::StoreRegister),
95  StrictEquals,
96  StrictMode(action::StrictMode),
97  StringAdd,
98  StringEquals,
99  StringExtract,
100  StringGreater,
101  StringLength,
102  StringLess,
103  Subtract,
104  TargetPath,
105  ToInteger,
106  ToNumber,
107  ToString,
108  ToggleQuality,
109  Trace,
110  TypeOf,
111
112  // These variants aren't present in `cfg::Action`; keep them at the end
113  // so that the discriminants of the shared variants match.
114  End,
115  Jump(Jump),
116  If(If),
117  Throw,
118  Return,
119  Try(Box<Try>),
120  WaitForFrame(WaitForFrame),
121  WaitForFrame2(WaitForFrame2),
122  With(With),
123  Error(Error),
124}
125
126const_assert!(std::mem::size_of::<Action>() <= 32);
127
128#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
129#[cfg_attr(
130  feature = "serde",
131  derive(Serialize, Deserialize),
132  serde(tag = "action", rename_all = "PascalCase")
133)]
134pub enum FromCfgActionError {
135  DefineFunction(Box<crate::cfg::DefineFunction>),
136  DefineFunction2(Box<crate::cfg::DefineFunction2>),
137}
138
139impl TryFrom<crate::cfg::Action> for Action {
140  type Error = FromCfgActionError;
141
142  fn try_from(value: crate::cfg::Action) -> Result<Self, FromCfgActionError> {
143    match value {
144      crate::cfg::Action::Add => Ok(Self::Add),
145      crate::cfg::Action::Add2 => Ok(Self::Add2),
146      crate::cfg::Action::And => Ok(Self::And),
147      crate::cfg::Action::AsciiToChar => Ok(Self::AsciiToChar),
148      crate::cfg::Action::BitAnd => Ok(Self::BitAnd),
149      crate::cfg::Action::BitOr => Ok(Self::BitOr),
150      crate::cfg::Action::BitLShift => Ok(Self::BitLShift),
151      crate::cfg::Action::BitRShift => Ok(Self::BitRShift),
152      crate::cfg::Action::BitURShift => Ok(Self::BitURShift),
153      crate::cfg::Action::BitXor => Ok(Self::BitXor),
154      crate::cfg::Action::Call => Ok(Self::Call),
155      crate::cfg::Action::CallFunction => Ok(Self::CallFunction),
156      crate::cfg::Action::CallMethod => Ok(Self::CallMethod),
157      crate::cfg::Action::CharToAscii => Ok(Self::CharToAscii),
158      crate::cfg::Action::CastOp => Ok(Self::CastOp),
159      crate::cfg::Action::CloneSprite => Ok(Self::CloneSprite),
160      crate::cfg::Action::ConstantPool(action) => Ok(Self::ConstantPool(action)),
161      crate::cfg::Action::Decrement => Ok(Self::Decrement),
162      crate::cfg::Action::DefineFunction(action) => Err(FromCfgActionError::DefineFunction(action)),
163      crate::cfg::Action::DefineFunction2(action) => Err(FromCfgActionError::DefineFunction2(action)),
164      crate::cfg::Action::DefineLocal => Ok(Self::DefineLocal),
165      crate::cfg::Action::DefineLocal2 => Ok(Self::DefineLocal2),
166      crate::cfg::Action::Delete => Ok(Self::Delete),
167      crate::cfg::Action::Delete2 => Ok(Self::Delete2),
168      crate::cfg::Action::Divide => Ok(Self::Divide),
169      crate::cfg::Action::EndDrag => Ok(Self::EndDrag),
170      crate::cfg::Action::Enumerate => Ok(Self::Enumerate),
171      crate::cfg::Action::Enumerate2 => Ok(Self::Enumerate2),
172      crate::cfg::Action::Equals => Ok(Self::Equals),
173      crate::cfg::Action::Equals2 => Ok(Self::Equals2),
174      crate::cfg::Action::Extends => Ok(Self::Extends),
175      crate::cfg::Action::FsCommand2 => Ok(Self::FsCommand2),
176      crate::cfg::Action::GetMember => Ok(Self::GetMember),
177      crate::cfg::Action::GetProperty => Ok(Self::GetProperty),
178      crate::cfg::Action::GetTime => Ok(Self::GetTime),
179      crate::cfg::Action::GetUrl(action) => Ok(Self::GetUrl(action)),
180      crate::cfg::Action::GetUrl2(action) => Ok(Self::GetUrl2(action)),
181      crate::cfg::Action::GetVariable => Ok(Self::GetVariable),
182      crate::cfg::Action::GotoFrame(action) => Ok(Self::GotoFrame(action)),
183      crate::cfg::Action::GotoFrame2(action) => Ok(Self::GotoFrame2(action)),
184      crate::cfg::Action::GotoLabel(action) => Ok(Self::GotoLabel(action)),
185      crate::cfg::Action::Greater => Ok(Self::Greater),
186      crate::cfg::Action::ImplementsOp => Ok(Self::ImplementsOp),
187      crate::cfg::Action::Increment => Ok(Self::Increment),
188      crate::cfg::Action::InitArray => Ok(Self::InitArray),
189      crate::cfg::Action::InitObject => Ok(Self::InitObject),
190      crate::cfg::Action::InstanceOf => Ok(Self::InstanceOf),
191      crate::cfg::Action::Less => Ok(Self::Less),
192      crate::cfg::Action::Less2 => Ok(Self::Less2),
193      crate::cfg::Action::MbAsciiToChar => Ok(Self::MbAsciiToChar),
194      crate::cfg::Action::MbCharToAscii => Ok(Self::MbCharToAscii),
195      crate::cfg::Action::MbStringExtract => Ok(Self::MbStringExtract),
196      crate::cfg::Action::MbStringLength => Ok(Self::MbStringLength),
197      crate::cfg::Action::Modulo => Ok(Self::Modulo),
198      crate::cfg::Action::Multiply => Ok(Self::Multiply),
199      crate::cfg::Action::NewMethod => Ok(Self::NewMethod),
200      crate::cfg::Action::NewObject => Ok(Self::NewObject),
201      crate::cfg::Action::NextFrame => Ok(Self::NextFrame),
202      crate::cfg::Action::Not => Ok(Self::Not),
203      crate::cfg::Action::Or => Ok(Self::Or),
204      crate::cfg::Action::Play => Ok(Self::Play),
205      crate::cfg::Action::Pop => Ok(Self::Pop),
206      crate::cfg::Action::PrevFrame => Ok(Self::PrevFrame),
207      crate::cfg::Action::Push(action) => Ok(Self::Push(action)),
208      crate::cfg::Action::PushDuplicate => Ok(Self::PushDuplicate),
209      crate::cfg::Action::RandomNumber => Ok(Self::RandomNumber),
210      crate::cfg::Action::Raw(action) => Ok(Self::Raw(action)),
211      crate::cfg::Action::RemoveSprite => Ok(Self::RemoveSprite),
212      crate::cfg::Action::SetMember => Ok(Self::SetMember),
213      crate::cfg::Action::SetProperty => Ok(Self::SetProperty),
214      crate::cfg::Action::SetTarget(action) => Ok(Self::SetTarget(action)),
215      crate::cfg::Action::SetTarget2 => Ok(Self::SetTarget2),
216      crate::cfg::Action::SetVariable => Ok(Self::SetVariable),
217      crate::cfg::Action::StackSwap => Ok(Self::StackSwap),
218      crate::cfg::Action::StartDrag => Ok(Self::StartDrag),
219      crate::cfg::Action::Stop => Ok(Self::Stop),
220      crate::cfg::Action::StopSounds => Ok(Self::StopSounds),
221      crate::cfg::Action::StoreRegister(action) => Ok(Self::StoreRegister(action)),
222      crate::cfg::Action::StrictEquals => Ok(Self::StrictEquals),
223      crate::cfg::Action::StrictMode(action) => Ok(Self::StrictMode(action)),
224      crate::cfg::Action::StringAdd => Ok(Self::StringAdd),
225      crate::cfg::Action::StringEquals => Ok(Self::StringEquals),
226      crate::cfg::Action::StringExtract => Ok(Self::StringExtract),
227      crate::cfg::Action::StringGreater => Ok(Self::StringGreater),
228      crate::cfg::Action::StringLength => Ok(Self::StringLength),
229      crate::cfg::Action::StringLess => Ok(Self::StringLess),
230      crate::cfg::Action::Subtract => Ok(Self::Subtract),
231      crate::cfg::Action::TargetPath => Ok(Self::TargetPath),
232      crate::cfg::Action::ToInteger => Ok(Self::ToInteger),
233      crate::cfg::Action::ToNumber => Ok(Self::ToNumber),
234      crate::cfg::Action::ToString => Ok(Self::ToString),
235      crate::cfg::Action::ToggleQuality => Ok(Self::ToggleQuality),
236      crate::cfg::Action::Trace => Ok(Self::Trace),
237      crate::cfg::Action::TypeOf => Ok(Self::TypeOf),
238    }
239  }
240}
241
242#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
243#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
244pub struct DefineFunction {
245  // Empty string if anonymous
246  pub name: String,
247  pub parameters: Vec<String>,
248  pub body_size: u16,
249}
250
251#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
252#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
253pub struct DefineFunction2 {
254  // Empty string if anonymous
255  pub name: String,
256  pub register_count: u8,
257  #[cfg_attr(feature = "serde", serde(flatten))]
258  pub flags: FunctionFlags,
259  pub parameters: Vec<Parameter>,
260  pub body_size: u16,
261}
262
263#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
264#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
265pub struct Error {
266  #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
267  pub error: Option<InvalidActionError>,
268}
269
270#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
271#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
272pub struct If {
273  pub offset: i16,
274}
275
276#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
277#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
278pub struct Jump {
279  pub offset: i16,
280}
281
282#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
283#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
284pub struct CatchBlock {
285  pub target: CatchTarget,
286  pub size: u16,
287}
288
289#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
290#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
291pub struct Try {
292  pub r#try: u16,
293  #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
294  pub catch: Option<CatchBlock>,
295  #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
296  pub finally: Option<u16>,
297}
298
299#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
300#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
301pub struct WaitForFrame {
302  pub frame: u16,
303  pub skip: u8,
304}
305
306#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
307#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
308pub struct WaitForFrame2 {
309  pub skip: u8,
310}
311
312#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
313#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
314pub struct With {
315  pub size: u16,
316}