use crate::dex::insn_syntax::*;
use crate::dex::raw::{DUInt, DUShort};
use crate::impls::jvms::r::U32BasedSize;
use java_asm_macro::ReadFrom;
use crate::dex::DInt;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum DexInsn {
Nop(F00x), Move(F12x), MoveFrom16(F22x), Move16(F32x), MoveWide(F12x), MoveWideFrom16(F22x), MoveWide16(F32x), MoveObject(F12x), MoveObjectFrom16(F22x), MoveObject16(F32x), MoveResult(F11x), MoveResultWide(F11x), MoveResultObject(F11x), MoveException(F11x), ReturnVoid(F10x), Return(F11x), ReturnWide(F11x), ReturnObject(F11x), Const4(F11n), Const16(F21s), Const(F31i), ConstHigh16(F21h), ConstWide16(F21s), ConstWide32(F31i), ConstWide(F51l), ConstWideHigh16(F21h), ConstString(F21c), ConstStringJumbo(F31c), ConstClass(F21c), MonitorEnter(F11x), MonitorExit(F11x), CheckCast(F21c), InstanceOf(F22c), ArrayLength(F12x), NewInstance(F21c), NewArray(F22c), FilledNewArray(F35c), FilledNewArrayRange(F3rc), FillArrayData(F31t), Throw(F11x), Goto(F10t), Goto16(F20t), Goto32(F30t), PackedSwitch(F31t), SparseSwitch(F31t), Cmpkind(F23x), IfTest(F22t), IfTestz(F21t), ArrayOp(F23x), IInstanceOp(F22c), SStaticOp(F21c), InvokeKind(F35c), InvokeKindRange(F3rc), Unop(F12x), Binop(F23x), Binop2Addr(F12x), BinopLit16(F22s), BinopLit8(F22b), InvokePoly(F45cc), InvokePolyRange(F4rcc), InvokeCustom(F35c), InvokeCustomRange(F3rc), ConstMethodHandle(F21c), ConstMethodType(F21c),
NotUsed(F10x),
PackedSwitchPayload(PackedSwitchPayload),
SparseSwitchPayload(SparseSwitchPayload),
FillArrayDataPayload(FillArrayDataPayload),
}
macro_rules! insn_width_impl {
($($width:expr, [$($variant:ident),*],)*) => {
impl DexInsn {
pub fn insn_width(&self) -> usize {
match self {
$(
$(DexInsn::$variant(_) => $width,)*
)*
}
}
}
};
}
insn_width_impl! {
1, [Nop, Move, MoveWide, MoveObject, MoveResult, MoveResultWide, MoveResultObject, MoveException,
ReturnVoid, Return, ReturnWide, ReturnObject, Const4, MonitorEnter, MonitorExit, ArrayLength,
Throw, Goto, Unop, Binop2Addr, NotUsed],
2, [MoveFrom16, MoveWideFrom16, MoveObjectFrom16,
Const16, ConstHigh16, ConstWide16, ConstWideHigh16, ConstString, ConstClass,
CheckCast, InstanceOf, NewInstance, NewArray,
Goto16, Cmpkind, IfTest, IfTestz, ArrayOp, IInstanceOp, SStaticOp,
Binop, BinopLit16, BinopLit8, ConstMethodHandle, ConstMethodType],
3, [Move16, MoveWide16, MoveObject16, Goto32, Const, ConstWide32, ConstStringJumbo,
FilledNewArray, FilledNewArrayRange, FillArrayData, PackedSwitch, SparseSwitch,
InvokeKind, InvokeKindRange, InvokeCustom, InvokeCustomRange],
4, [InvokePoly, InvokePolyRange],
5, [ConstWide],
0, [PackedSwitchPayload, SparseSwitchPayload, FillArrayDataPayload],
}
#[derive(Debug, Clone, PartialEq, Eq, ReadFrom)]
pub struct PackedSwitchPayload {
pub ident: DUShort, pub size: DUShort,
pub first_key: DInt,
#[index(size)]
pub targets: Vec<DInt>,
}
#[derive(Debug, Clone, PartialEq, Eq, ReadFrom)]
pub struct SparseSwitchPayload {
pub ident: DUShort, pub size: DUShort,
#[index(size)]
pub keys: Vec<DInt>,
#[index(size)]
pub targets: Vec<DInt>,
}
#[derive(Debug, Clone, PartialEq, Eq, ReadFrom)]
pub struct FillArrayDataPayload {
pub ident: DUShort, pub element_width: DUShort,
pub size: U32BasedSize,
#[index(size)]
pub data: Vec<u8>,
}