107 lines
4.8 KiB
Rust
107 lines
4.8 KiB
Rust
use core::fmt::{Display, Formatter, Debug};
|
|
|
|
#[derive(Debug, Copy, Clone)]
|
|
pub enum MethodAccessFlag {
|
|
Public = 0x0001, // Declared public; may be accessed from outside its package.
|
|
Private = 0x0002, // Declared private; accessible only within the defining class and other classes belonging to the same nest (§5.4.4).
|
|
Protected = 0x0004, // Declared protected; may be accessed within subclasses.
|
|
Static = 0x0008, // Declared static.
|
|
Final = 0x0010, // Declared final; must not be overridden (§5.4.5).
|
|
Synchronized = 0x0020, // Declared synchronized; invocation is wrapped by a monitor use.
|
|
Bridge = 0x0040, // A bridge method, generated by the compiler.
|
|
Varargs = 0x0080, // Declared with variable number of arguments.
|
|
Native = 0x0100, // Declared native; implemented in a language other than the Java programming language.
|
|
Abstract = 0x0400, // Declared abstract; no implementation is provided.
|
|
Strict = 0x0800, // In a class file whose major version number is at least 46 and at most 60: Declared strict.
|
|
Synthetic = 0x1000, // Declared synthetic; not present in the source code.
|
|
}
|
|
|
|
pub struct MethodAccessFlagMask {
|
|
pub mask: u16,
|
|
}
|
|
|
|
impl Debug for MethodAccessFlagMask {
|
|
fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), std::fmt::Error> {
|
|
let mut flag_vec = Vec::new();
|
|
|
|
let flags = [MethodAccessFlag::Public,MethodAccessFlag::Private,MethodAccessFlag::Protected,MethodAccessFlag::Static,MethodAccessFlag::Final,MethodAccessFlag::Synchronized,MethodAccessFlag::Bridge,MethodAccessFlag::Varargs,MethodAccessFlag::Native,MethodAccessFlag::Abstract,MethodAccessFlag::Strict,MethodAccessFlag::Synthetic];
|
|
|
|
for flag in flags {
|
|
if (flag as u16 & self.mask) != 0 {
|
|
flag_vec.push(flag)
|
|
}
|
|
}
|
|
|
|
f.debug_list().entries(flag_vec)
|
|
.finish()
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Copy, Clone)]
|
|
pub enum ClassAccessFlag {
|
|
Public = 0x0001, // Declared public; may be accessed from outside its package.
|
|
Final = 0x0010, // Declared final; no subclasses allowed.
|
|
Super = 0x0020, // Treat superclass methods specially when invoked by the invokespecial instruction.
|
|
Interface = 0x0200, // Is an interface, not a class.
|
|
Abstract = 0x0400, // Declared abstract; must not be instantiated.
|
|
Synthetic = 0x1000, // Declared synthetic; not present in the source code.
|
|
Annotation = 0x2000, // Declared as an annotation interface.
|
|
Enum = 0x4000, // Declared as an enum class.
|
|
Module = 0x8000, // Is a module, not a class or interface.
|
|
}
|
|
|
|
pub struct ClassAccessFlagMask {
|
|
pub mask: u16,
|
|
}
|
|
|
|
impl Debug for ClassAccessFlagMask {
|
|
fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), std::fmt::Error> {
|
|
let mut flag_vec = Vec::new();
|
|
|
|
let flags = [ClassAccessFlag::Public,ClassAccessFlag::Final,ClassAccessFlag::Super,ClassAccessFlag::Interface,ClassAccessFlag::Abstract,ClassAccessFlag::Synthetic,ClassAccessFlag::Annotation,ClassAccessFlag::Enum,ClassAccessFlag::Module];
|
|
for flag in flags {
|
|
if (flag as u16 & self.mask) != 0 {
|
|
flag_vec.push(flag)
|
|
}
|
|
}
|
|
|
|
f.debug_list().entries(flag_vec)
|
|
.finish()
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Clone, Copy)]
|
|
#[repr(u16)]
|
|
pub enum FieldAccessFlag {
|
|
Public = 0x0001, // Declared public; may be accessed from outside its package.
|
|
Private = 0x0002, // Declared private; accessible only within the defining class and other classes belonging to the same nest (§5.4.4).
|
|
Protected = 0x0004, // Declared protected; may be accessed within subclasses.
|
|
Static = 0x0008, // Declared static.
|
|
Final = 0x0010, // Declared final; never directly assigned to after object construction (JLS §17.5).
|
|
Volatile = 0x0040, // Declared volatile; cannot be cached.
|
|
Transient = 0x0080, // Declared transient; not written or read by a persistent object manager.
|
|
Synthetic = 0x1000, // Declared synthetic; not present in the source code.
|
|
Enum = 0x4000, // Declared as an element of an enum class.
|
|
}
|
|
|
|
pub struct FieldAccessFlagMask {
|
|
pub mask: u16
|
|
}
|
|
|
|
impl Debug for FieldAccessFlagMask {
|
|
fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), std::fmt::Error> {
|
|
let mut flag_vec = Vec::new();
|
|
|
|
let flags = [FieldAccessFlag::Public,FieldAccessFlag::Private,FieldAccessFlag::Protected,FieldAccessFlag::Static,FieldAccessFlag::Final,FieldAccessFlag::Volatile,FieldAccessFlag::Transient,FieldAccessFlag::Synthetic,FieldAccessFlag::Enum,];
|
|
|
|
for flag in flags {
|
|
if (flag as u16 & self.mask) != 0 {
|
|
flag_vec.push(flag)
|
|
}
|
|
}
|
|
|
|
f.debug_list().entries(flag_vec)
|
|
.finish()
|
|
}
|
|
}
|
|
|