chore: switch to num-derive crate

This commit is contained in:
Mike Welsh 2018-06-10 01:23:11 -07:00
parent dbb4167e9e
commit 120f94711a
8 changed files with 131 additions and 135 deletions

View File

@ -11,9 +11,9 @@ description = "Read and write the Adobe Flash SWF file format."
[dependencies] [dependencies]
clippy = {version = "*", optional = true} clippy = {version = "*", optional = true}
byteorder = "1.0" byteorder = "1.0"
enum_primitive = "0.1.1"
flate2 = "1.0" flate2 = "1.0"
num = "0.1" num-derive = "0.2"
num-traits = "0.2"
xz2 = "0.1.5" xz2 = "0.1.5"
[features] [features]

View File

@ -1,6 +1,5 @@
enum_from_primitive! {
#[allow(dead_code)] #[allow(dead_code)]
#[derive(Debug,PartialEq,Clone,Copy)] #[derive(Debug,PartialEq,Clone,Copy,FromPrimitive)]
pub enum OpCode { pub enum OpCode {
End = 0x00, End = 0x00,
@ -117,4 +116,3 @@ pub enum OpCode {
Call = 0x9E, Call = 0x9E,
GotoFrame2 = 0x9F, GotoFrame2 = 0x9F,
} }
}

View File

@ -31,82 +31,83 @@ impl<R: Read> Reader<R> {
} }
pub fn read_action(&mut self) -> Result<Option<Action>> { pub fn read_action(&mut self) -> Result<Option<Action>> {
use num_traits::FromPrimitive;
let (opcode, length) = try!(self.read_opcode_and_length()); let (opcode, length) = try!(self.read_opcode_and_length());
let mut action_reader = Reader::new(self.inner.by_ref().take(length as u64), self.version); let mut action_reader = Reader::new(self.inner.by_ref().take(length as u64), self.version);
use num::FromPrimitive;
let action = if let Some(op) = OpCode::from_u8(opcode) { let action = if let Some(op) = OpCode::from_u8(opcode) {
match op { match op {
OpCode::End => return Ok(None), OpCode::End => return Ok(None),
OpCode::Add => Action::Add, OpCode::Add => Action::Add,
OpCode::Add2 => Action::Add2, OpCode::Add2 => Action::Add2,
OpCode::And => Action::And, OpCode::And => Action::And,
OpCode::AsciiToChar => Action::AsciiToChar, OpCode::AsciiToChar => Action::AsciiToChar,
OpCode::BitAnd => Action::BitAnd, OpCode::BitAnd => Action::BitAnd,
OpCode::BitLShift => Action::BitLShift, OpCode::BitLShift => Action::BitLShift,
OpCode::BitOr => Action::BitOr, OpCode::BitOr => Action::BitOr,
OpCode::BitRShift => Action::BitRShift, OpCode::BitRShift => Action::BitRShift,
OpCode::BitURShift => Action::BitURShift, OpCode::BitURShift => Action::BitURShift,
OpCode::BitXor => Action::BitXor, OpCode::BitXor => Action::BitXor,
OpCode::Call => Action::Call, OpCode::Call => Action::Call,
OpCode::CallFunction => Action::CallFunction, OpCode::CallFunction => Action::CallFunction,
OpCode::CallMethod => Action::CallMethod, OpCode::CallMethod => Action::CallMethod,
OpCode::CastOp => Action::CastOp, OpCode::CastOp => Action::CastOp,
OpCode::CharToAscii => Action::CharToAscii, OpCode::CharToAscii => Action::CharToAscii,
OpCode::CloneSprite => Action::CloneSprite, OpCode::CloneSprite => Action::CloneSprite,
OpCode::ConstantPool => { OpCode::ConstantPool => {
let mut constants = vec![]; let mut constants = vec![];
for _ in 0..action_reader.read_u16()? { for _ in 0..action_reader.read_u16()? {
constants.push(action_reader.read_c_string()?); constants.push(action_reader.read_c_string()?);
} }
Action::ConstantPool(constants) Action::ConstantPool(constants)
} }
OpCode::Decrement => Action::Decrement, OpCode::Decrement => Action::Decrement,
OpCode::DefineFunction => action_reader.read_define_function()?, OpCode::DefineFunction => action_reader.read_define_function()?,
OpCode::DefineFunction2 => action_reader.read_define_function_2()?, OpCode::DefineFunction2 => action_reader.read_define_function_2()?,
OpCode::DefineLocal => Action::DefineLocal, OpCode::DefineLocal => Action::DefineLocal,
OpCode::DefineLocal2 => Action::DefineLocal2, OpCode::DefineLocal2 => Action::DefineLocal2,
OpCode::Delete => Action::Delete, OpCode::Delete => Action::Delete,
OpCode::Delete2 => Action::Delete2, OpCode::Delete2 => Action::Delete2,
OpCode::Divide => Action::Divide, OpCode::Divide => Action::Divide,
OpCode::EndDrag => Action::EndDrag, OpCode::EndDrag => Action::EndDrag,
OpCode::Enumerate => Action::Enumerate, OpCode::Enumerate => Action::Enumerate,
OpCode::Enumerate2 => Action::Enumerate2, OpCode::Enumerate2 => Action::Enumerate2,
OpCode::Equals => Action::Equals, OpCode::Equals => Action::Equals,
OpCode::Equals2 => Action::Equals2, OpCode::Equals2 => Action::Equals2,
OpCode::Extends => Action::Extends, OpCode::Extends => Action::Extends,
OpCode::GetMember => Action::GetMember, OpCode::GetMember => Action::GetMember,
OpCode::GetProperty => Action::GetProperty, OpCode::GetProperty => Action::GetProperty,
OpCode::GetTime => Action::GetTime, OpCode::GetTime => Action::GetTime,
OpCode::GetUrl => Action::GetUrl { OpCode::GetUrl => Action::GetUrl {
url: try!(action_reader.read_c_string()), url: try!(action_reader.read_c_string()),
target: try!(action_reader.read_c_string()), target: try!(action_reader.read_c_string()),
}, },
OpCode::GetUrl2 => { OpCode::GetUrl2 => {
let flags = try!(action_reader.read_u8()); let flags = try!(action_reader.read_u8());
Action::GetUrl2 { Action::GetUrl2 {
is_target_sprite: flags & 0b10 != 0, is_target_sprite: flags & 0b10 != 0,
is_load_vars: flags & 0b1 != 0, is_load_vars: flags & 0b1 != 0,
send_vars_method: match flags >> 6 { send_vars_method: match flags >> 6 {
0 => SendVarsMethod::None, 0 => SendVarsMethod::None,
1 => SendVarsMethod::Get, 1 => SendVarsMethod::Get,
2 => SendVarsMethod::Post, 2 => SendVarsMethod::Post,
_ => { _ => {
return Err(Error::new( return Err(Error::new(
ErrorKind::InvalidData, ErrorKind::InvalidData,
"Invalid HTTP method in ActionGetUrl2", "Invalid HTTP method in ActionGetUrl2",
)) ))
} }
}, },
} }
} }
OpCode::GetVariable => Action::GetVariable, OpCode::GetVariable => Action::GetVariable,
OpCode::GotoFrame => { OpCode::GotoFrame => {
let frame = try!(action_reader.read_u16()); let frame = try!(action_reader.read_u16());
Action::GotoFrame(frame) Action::GotoFrame(frame)
} }
OpCode::GotoFrame2 => { OpCode::GotoFrame2 => {
let flags = try!(action_reader.read_u8()); let flags = try!(action_reader.read_u8());
Action::GotoFrame2 { Action::GotoFrame2 {
@ -117,32 +118,32 @@ impl<R: Read> Reader<R> {
0 0
}, },
} }
} }
OpCode::GotoLabel => Action::GotoLabel(try!(action_reader.read_c_string())), OpCode::GotoLabel => Action::GotoLabel(try!(action_reader.read_c_string())),
OpCode::Greater => Action::Greater, OpCode::Greater => Action::Greater,
OpCode::If => Action::If { offset: try!(action_reader.read_i16()) }, OpCode::If => Action::If { offset: try!(action_reader.read_i16()) },
OpCode::ImplementsOp => Action::ImplementsOp, OpCode::ImplementsOp => Action::ImplementsOp,
OpCode::Increment => Action::Increment, OpCode::Increment => Action::Increment,
OpCode::InitArray => Action::InitArray, OpCode::InitArray => Action::InitArray,
OpCode::InitObject => Action::InitObject, OpCode::InitObject => Action::InitObject,
OpCode::InstanceOf => Action::InstanceOf, OpCode::InstanceOf => Action::InstanceOf,
OpCode::Jump => Action::Jump { offset: try!(action_reader.read_i16()) }, OpCode::Jump => Action::Jump { offset: try!(action_reader.read_i16()) },
OpCode::Less => Action::Less, OpCode::Less => Action::Less,
OpCode::Less2 => Action::Less2, OpCode::Less2 => Action::Less2,
OpCode::MBAsciiToChar => Action::MBAsciiToChar, OpCode::MBAsciiToChar => Action::MBAsciiToChar,
OpCode::MBCharToAscii => Action::MBCharToAscii, OpCode::MBCharToAscii => Action::MBCharToAscii,
OpCode::MBStringExtract => Action::MBStringExtract, OpCode::MBStringExtract => Action::MBStringExtract,
OpCode::MBStringLength => Action::MBStringLength, OpCode::MBStringLength => Action::MBStringLength,
OpCode::Modulo => Action::Modulo, OpCode::Modulo => Action::Modulo,
OpCode::Multiply => Action::Multiply, OpCode::Multiply => Action::Multiply,
OpCode::NewMethod => Action::NewMethod, OpCode::NewMethod => Action::NewMethod,
OpCode::NewObject => Action::NewObject, OpCode::NewObject => Action::NewObject,
OpCode::NextFrame => Action::NextFrame, OpCode::NextFrame => Action::NextFrame,
OpCode::Not => Action::Not, OpCode::Not => Action::Not,
OpCode::Or => Action::Or, OpCode::Or => Action::Or,
OpCode::Play => Action::Play, OpCode::Play => Action::Play,
OpCode::Pop => Action::Pop, OpCode::Pop => Action::Pop,
OpCode::PreviousFrame => Action::PreviousFrame, OpCode::PreviousFrame => Action::PreviousFrame,
// TODO: Verify correct version for complex types. // TODO: Verify correct version for complex types.
OpCode::Push => { OpCode::Push => {
let mut values = vec![]; let mut values = vec![];
@ -150,42 +151,42 @@ impl<R: Read> Reader<R> {
values.push(value); values.push(value);
} }
Action::Push(values) Action::Push(values)
} }
OpCode::PushDuplicate => Action::PushDuplicate, OpCode::PushDuplicate => Action::PushDuplicate,
OpCode::RandomNumber => Action::RandomNumber, OpCode::RandomNumber => Action::RandomNumber,
OpCode::RemoveSprite => Action::RemoveSprite, OpCode::RemoveSprite => Action::RemoveSprite,
OpCode::Return => Action::Return, OpCode::Return => Action::Return,
OpCode::SetMember => Action::SetMember, OpCode::SetMember => Action::SetMember,
OpCode::SetProperty => Action::SetProperty, OpCode::SetProperty => Action::SetProperty,
OpCode::SetTarget => Action::SetTarget(action_reader.read_c_string()?), OpCode::SetTarget => Action::SetTarget(action_reader.read_c_string()?),
OpCode::SetTarget2 => Action::SetTarget2, OpCode::SetTarget2 => Action::SetTarget2,
OpCode::SetVariable => Action::SetVariable, OpCode::SetVariable => Action::SetVariable,
OpCode::StackSwap => Action::StackSwap, OpCode::StackSwap => Action::StackSwap,
OpCode::StartDrag => Action::StartDrag, OpCode::StartDrag => Action::StartDrag,
OpCode::Stop => Action::Stop, OpCode::Stop => Action::Stop,
OpCode::StopSounds => Action::StopSounds, OpCode::StopSounds => Action::StopSounds,
OpCode::StoreRegister => Action::StoreRegister(action_reader.read_u8()?), OpCode::StoreRegister => Action::StoreRegister(action_reader.read_u8()?),
OpCode::StrictEquals => Action::StrictEquals, OpCode::StrictEquals => Action::StrictEquals,
OpCode::StringAdd => Action::StringAdd, OpCode::StringAdd => Action::StringAdd,
OpCode::StringEquals => Action::StringEquals, OpCode::StringEquals => Action::StringEquals,
OpCode::StringExtract => Action::StringExtract, OpCode::StringExtract => Action::StringExtract,
OpCode::StringGreater => Action::StringGreater, OpCode::StringGreater => Action::StringGreater,
OpCode::StringLength => Action::StringLength, OpCode::StringLength => Action::StringLength,
OpCode::StringLess => Action::StringLess, OpCode::StringLess => Action::StringLess,
OpCode::Subtract => Action::Subtract, OpCode::Subtract => Action::Subtract,
OpCode::TargetPath => Action::TargetPath, OpCode::TargetPath => Action::TargetPath,
OpCode::Throw => Action::Throw, OpCode::Throw => Action::Throw,
OpCode::ToggleQuality => Action::ToggleQuality, OpCode::ToggleQuality => Action::ToggleQuality,
OpCode::ToInteger => Action::ToInteger, OpCode::ToInteger => Action::ToInteger,
OpCode::ToNumber => Action::ToNumber, OpCode::ToNumber => Action::ToNumber,
OpCode::ToString => Action::ToString, OpCode::ToString => Action::ToString,
OpCode::Trace => Action::Trace, OpCode::Trace => Action::Trace,
OpCode::Try => action_reader.read_try()?, OpCode::Try => action_reader.read_try()?,
OpCode::TypeOf => Action::TypeOf, OpCode::TypeOf => Action::TypeOf,
OpCode::WaitForFrame => Action::WaitForFrame { OpCode::WaitForFrame => Action::WaitForFrame {
frame: try!(action_reader.read_u16()), frame: try!(action_reader.read_u16()),
num_actions_to_skip: try!(action_reader.read_u8()), num_actions_to_skip: try!(action_reader.read_u8()),
}, },
OpCode::With => { OpCode::With => {
let code_length = action_reader.read_u16()?; let code_length = action_reader.read_u16()?;
let mut with_reader = Reader::new( let mut with_reader = Reader::new(
@ -193,10 +194,10 @@ impl<R: Read> Reader<R> {
self.version, self.version,
); );
Action::With { actions: with_reader.read_action_list()? } Action::With { actions: with_reader.read_action_list()? }
} }
OpCode::WaitForFrame2 => Action::WaitForFrame2 { OpCode::WaitForFrame2 => Action::WaitForFrame2 {
num_actions_to_skip: try!(action_reader.read_u8()), num_actions_to_skip: try!(action_reader.read_u8()),
}, },
} }
} else { } else {
action_reader.read_unknown_action(opcode, length)? action_reader.read_unknown_action(opcode, length)?
@ -225,23 +226,23 @@ impl<R: Read> Reader<R> {
} }
fn read_push_value(&mut self) -> Result<Value> { fn read_push_value(&mut self) -> Result<Value> {
let value = match try!(self.read_u8()) { let value = match try!(self.read_u8()) {
0 => Value::Str(try!(self.read_c_string())), 0 => Value::Str(try!(self.read_c_string())),
1 => Value::Float(try!(self.read_f32())), 1 => Value::Float(try!(self.read_f32())),
2 => Value::Null, 2 => Value::Null,
3 => Value::Undefined, 3 => Value::Undefined,
4 => Value::Register(try!(self.read_u8())), 4 => Value::Register(try!(self.read_u8())),
5 => Value::Bool(try!(self.read_u8()) != 0), 5 => Value::Bool(try!(self.read_u8()) != 0),
6 => Value::Double(try!(self.read_f64())), 6 => Value::Double(try!(self.read_f64())),
7 => Value::Int(try!(self.read_u32())), 7 => Value::Int(try!(self.read_u32())),
8 => Value::ConstantPool(try!(self.read_u8()) as u16), 8 => Value::ConstantPool(try!(self.read_u8()) as u16),
9 => Value::ConstantPool(try!(self.read_u16())), 9 => Value::ConstantPool(try!(self.read_u16())),
_ => { _ => {
return Err(Error::new( return Err(Error::new(
ErrorKind::InvalidData, ErrorKind::InvalidData,
"Invalid value type in ActionPush", "Invalid value type in ActionPush",
)) ))
} }
}; };
Ok(value) Ok(value)
} }

View File

@ -1,6 +1,5 @@
enum_from_primitive! {
#[allow(dead_code)] #[allow(dead_code)]
#[derive(Debug,PartialEq,Clone,Copy)] #[derive(Debug,PartialEq,Clone,Copy,FromPrimitive)]
pub enum OpCode { pub enum OpCode {
Add = 0xA0, Add = 0xA0,
AddI = 0xC5, AddI = 0xC5,
@ -146,4 +145,3 @@ pub enum OpCode {
TypeOf = 0x95, TypeOf = 0x95,
URShift = 0xa7, URShift = 0xa7,
} }
}

View File

@ -517,7 +517,7 @@ impl<R: Read> Reader<R> {
fn read_op(&mut self) -> Result<Option<Op>> { fn read_op(&mut self) -> Result<Option<Op>> {
use avm2::opcode::OpCode; use avm2::opcode::OpCode;
use num::FromPrimitive; use num_traits::FromPrimitive;
let opcode = match OpCode::from_u8(self.read_u8()?) { let opcode = match OpCode::from_u8(self.read_u8()?) {
Some(o) => o, Some(o) => o,

View File

@ -10,10 +10,10 @@
#![cfg_attr(feature = "clippy", plugin(clippy))] #![cfg_attr(feature = "clippy", plugin(clippy))]
extern crate byteorder; extern crate byteorder;
#[macro_use]
extern crate enum_primitive;
extern crate flate2; extern crate flate2;
extern crate num; #[macro_use]
extern crate num_derive;
extern crate num_traits;
extern crate xz2; extern crate xz2;
pub mod avm1; pub mod avm1;

View File

@ -2,7 +2,6 @@
use byteorder::{LittleEndian, ReadBytesExt}; use byteorder::{LittleEndian, ReadBytesExt};
use flate2::read::ZlibDecoder; use flate2::read::ZlibDecoder;
use num::FromPrimitive;
use std::collections::HashSet; use std::collections::HashSet;
use std::io::{Error, ErrorKind, Read, Result}; use std::io::{Error, ErrorKind, Read, Result};
use types::*; use types::*;
@ -409,6 +408,8 @@ impl<R: Read> Reader<R> {
} }
fn read_tag(&mut self) -> Result<Option<Tag>> { fn read_tag(&mut self) -> Result<Option<Tag>> {
use num_traits::FromPrimitive;
let (tag_code, length) = self.read_tag_code_and_length()?; let (tag_code, length) = self.read_tag_code_and_length()?;
let mut tag_reader = Reader::new(self.input.by_ref().take(length as u64), self.version); let mut tag_reader = Reader::new(self.input.by_ref().take(length as u64), self.version);

View File

@ -1,6 +1,5 @@
enum_from_primitive! {
#[allow(dead_code)] #[allow(dead_code)]
#[derive(Debug,PartialEq,Clone,Copy)] #[derive(Debug,PartialEq,Clone,Copy,FromPrimitive)]
pub enum TagCode { pub enum TagCode {
End = 0, End = 0,
ShowFrame = 1, ShowFrame = 1,
@ -86,4 +85,3 @@ pub enum TagCode {
EnableTelemetry = 93, EnableTelemetry = 93,
PlaceObject4 = 94, PlaceObject4 = 94,
} }
}