use serde::{Deserialize, Serialize};
use crate::node::constant::{
Class, Constant, ConstantPool, FieldRef, InterfaceMethodRef, MethodRef,
};
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub struct Ldc {
pub index: u8,
}
impl Ldc {
pub fn constant<'instruction, 'constant_pool: 'instruction>(
&'instruction self,
constant_pool: &'constant_pool ConstantPool,
) -> Option<&'constant_pool Constant> {
constant_pool.get_constant(self.index as u16)
}
}
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize)]
#[allow(non_camel_case_types)]
pub struct Ldc_W {
pub index: u16,
}
impl Ldc_W {
pub fn constant<'instruction, 'constant_pool: 'instruction>(
&'instruction self,
constant_pool: &'constant_pool ConstantPool,
) -> Option<&'constant_pool Constant> {
constant_pool.get_constant(self.index)
}
}
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize)]
#[allow(non_camel_case_types)]
pub struct Ldc2_W {
pub index: u16,
}
impl Ldc2_W {
pub fn constant<'instruction, 'constant_pool: 'instruction>(
&'instruction self,
constant_pool: &'constant_pool ConstantPool,
) -> Option<&'constant_pool Constant> {
constant_pool.get_constant(self.index)
}
}
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub struct GetStatic {
pub index: u16,
}
impl GetStatic {
pub fn field_ref<'instruction, 'constant_pool: 'instruction>(
&'instruction self,
constant_pool: &'constant_pool ConstantPool,
) -> Option<&'constant_pool FieldRef> {
constant_pool.get_field_ref(self.index)
}
}
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub struct PutStatic {
pub index: u16,
}
impl PutStatic {
pub fn field_ref<'instruction, 'constant_pool: 'instruction>(
&'instruction self,
constant_pool: &'constant_pool ConstantPool,
) -> Option<&'constant_pool FieldRef> {
constant_pool.get_field_ref(self.index)
}
}
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub struct GetField {
pub index: u16,
}
impl GetField {
pub fn field_ref<'instruction, 'constant_pool: 'instruction>(
&'instruction self,
constant_pool: &'constant_pool ConstantPool,
) -> Option<&'constant_pool FieldRef> {
constant_pool.get_field_ref(self.index)
}
}
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub struct PutField {
pub index: u16,
}
impl PutField {
pub fn field_ref<'instruction, 'constant_pool: 'instruction>(
&'instruction self,
constant_pool: &'constant_pool ConstantPool,
) -> Option<&'constant_pool FieldRef> {
constant_pool.get_field_ref(self.index)
}
}
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub struct InvokeVirtual {
pub index: u16,
}
impl InvokeVirtual {
pub fn method_ref<'instruction, 'constant_pool: 'instruction>(
&'instruction self,
constant_pool: &'constant_pool ConstantPool,
) -> Option<&'constant_pool MethodRef> {
constant_pool.get_method_ref(self.index)
}
}
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub struct InvokeSpecial {
pub index: u16,
}
impl InvokeSpecial {
pub fn method_ref<'instruction, 'constant_pool: 'instruction>(
&'instruction self,
constant_pool: &'constant_pool ConstantPool,
) -> Option<&'constant_pool MethodRef> {
constant_pool.get_method_ref(self.index)
}
}
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub struct InvokeStatic {
pub index: u16,
}
impl InvokeStatic {
pub fn method_ref<'instruction, 'constant_pool: 'instruction>(
&'instruction self,
constant_pool: &'constant_pool ConstantPool,
) -> Option<&'constant_pool MethodRef> {
constant_pool.get_method_ref(self.index)
}
}
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub struct InvokeInterface {
pub index: u16,
pub count: u8,
}
impl InvokeInterface {
pub fn interface_method_ref<'instruction, 'constant_pool: 'instruction>(
&'instruction self,
constant_pool: &'constant_pool ConstantPool,
) -> Option<&'constant_pool InterfaceMethodRef> {
constant_pool.get_interface_method_ref(self.index)
}
}
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub struct InvokeDynamic {
pub index: u16,
}
impl InvokeDynamic {
pub fn invoke_dynamic<'instruction, 'constant_pool: 'instruction>(
&'instruction self,
constant_pool: &'constant_pool ConstantPool,
) -> Option<&'constant_pool crate::node::constant::InvokeDynamic> {
constant_pool.get_invoke_dynamic(self.index)
}
}
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub struct New {
pub index: u16,
}
impl New {
pub fn class<'instruction, 'constant_pool: 'instruction>(
&'instruction self,
constant_pool: &'constant_pool ConstantPool,
) -> Option<&'constant_pool Class> {
constant_pool.get_class(self.index)
}
}
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub struct ANewArray {
pub index: u16,
}
impl ANewArray {
pub fn class<'instruction, 'constant_pool: 'instruction>(
&'instruction self,
constant_pool: &'constant_pool ConstantPool,
) -> Option<&'constant_pool Class> {
constant_pool.get_class(self.index)
}
}
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub struct CheckCast {
pub index: u16,
}
impl CheckCast {
pub fn class<'instruction, 'constant_pool: 'instruction>(
&'instruction self,
constant_pool: &'constant_pool ConstantPool,
) -> Option<&'constant_pool Class> {
constant_pool.get_class(self.index)
}
}
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub struct InstanceOf {
pub index: u16,
}
impl InstanceOf {
pub fn class<'instruction, 'constant_pool: 'instruction>(
&'instruction self,
constant_pool: &'constant_pool ConstantPool,
) -> Option<&'constant_pool Class> {
constant_pool.get_class(self.index)
}
}
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub enum Wide {
ILOAD(u16),
FLOAD(u16),
ALOAD(u16),
LLOAD(u16),
DLOAD(u16),
ISTORE(u16),
FSTORE(u16),
ASTORE(u16),
LSTORE(u16),
DSTORE(u16),
RET(u16),
IINC(u16, i16),
}
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub struct MultiANewArray {
pub index: u16,
pub dimensions: u8,
}
impl MultiANewArray {
pub fn class<'instruction, 'constant_pool: 'instruction>(
&'instruction self,
constant_pool: &'constant_pool ConstantPool,
) -> Option<&'constant_pool Class> {
constant_pool.get_class(self.index)
}
}