fix == for ids
This commit is contained in:
parent
67efc6365d
commit
026b9ddd41
6 changed files with 41 additions and 15 deletions
|
|
@ -60,7 +60,11 @@ impl IdMethodType {
|
||||||
self.parameters.clone()
|
self.parameters.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn __hash__(&self) -> u64 {
|
pub fn __eq__(&self, other: &Self) -> bool {
|
||||||
|
self == other
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn __hash__(&self) -> u64 {
|
||||||
let mut hasher = DefaultHasher::new();
|
let mut hasher = DefaultHasher::new();
|
||||||
self.hash(&mut hasher);
|
self.hash(&mut hasher);
|
||||||
hasher.finish()
|
hasher.finish()
|
||||||
|
|
@ -323,12 +327,16 @@ impl IdType {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn __hash__(&self) -> u64 {
|
pub fn __hash__(&self) -> u64 {
|
||||||
let mut hasher = DefaultHasher::new();
|
let mut hasher = DefaultHasher::new();
|
||||||
self.hash(&mut hasher);
|
self.hash(&mut hasher);
|
||||||
hasher.finish()
|
hasher.finish()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn __eq__(&self, other: &Self) -> bool {
|
||||||
|
self == other
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: TESTS
|
// TODO: TESTS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -366,29 +374,39 @@ impl IdField {
|
||||||
pub fn __str__(&self) -> String {
|
pub fn __str__(&self) -> String {
|
||||||
let class: String = self.class_.get_name().into();
|
let class: String = self.class_.get_name().into();
|
||||||
let name: String = (&self.name).into();
|
let name: String = (&self.name).into();
|
||||||
format!("{class}.{name}")
|
let ty: String = self.type_.get_name().into();
|
||||||
|
format!("({ty}) {class}.{name}")
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn __repr__(&self) -> String {
|
pub fn __repr__(&self) -> String {
|
||||||
let class: String = self.class_.get_name().into();
|
let class: String = self.class_.__repr__();
|
||||||
let name: String = (&self.name).into();
|
let name: String = (&self.name).into();
|
||||||
format!("IdField({class}.{name})")
|
let ty: String = self.type_.__repr__();
|
||||||
|
format!("IdField(({ty}){class}.{name})")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn __hash__(&self) -> u64 {
|
pub fn __eq__(&self, other: &Self) -> bool {
|
||||||
|
self == other
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn __hash__(&self) -> u64 {
|
||||||
let mut hasher = DefaultHasher::new();
|
let mut hasher = DefaultHasher::new();
|
||||||
self.hash(&mut hasher);
|
self.hash(&mut hasher);
|
||||||
hasher.finish()
|
hasher.finish()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The Id of a method.
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||||
pub struct IdMethod {
|
pub struct IdMethod {
|
||||||
|
/// The class containing the method.
|
||||||
#[pyo3(get, set)]
|
#[pyo3(get, set)]
|
||||||
pub class_: IdType,
|
pub class_: IdType,
|
||||||
|
/// The prototype (aka type or signature) of the method.
|
||||||
#[pyo3(get, set)]
|
#[pyo3(get, set)]
|
||||||
pub proto: IdMethodType,
|
pub proto: IdMethodType,
|
||||||
|
/// The name of the method.
|
||||||
#[pyo3(get, set)]
|
#[pyo3(get, set)]
|
||||||
pub name: DexString,
|
pub name: DexString,
|
||||||
}
|
}
|
||||||
|
|
@ -396,7 +414,11 @@ pub struct IdMethod {
|
||||||
#[pymethods]
|
#[pymethods]
|
||||||
impl IdMethod {
|
impl IdMethod {
|
||||||
#[new]
|
#[new]
|
||||||
pub fn new(class_: IdType, proto: IdMethodType, name: DexString) -> Self {
|
pub fn new(
|
||||||
|
#[pyo3(from_py_with = "crate::dex_string::as_dex_string")] name: DexString,
|
||||||
|
proto: IdMethodType,
|
||||||
|
class_: IdType,
|
||||||
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
class_,
|
class_,
|
||||||
proto,
|
proto,
|
||||||
|
|
@ -423,7 +445,11 @@ impl IdMethod {
|
||||||
format!("DexMethod({})", self.__str__())
|
format!("DexMethod({})", self.__str__())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn __hash__(&self) -> u64 {
|
pub fn __eq__(&self, other: &Self) -> bool {
|
||||||
|
self == other
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn __hash__(&self) -> u64 {
|
||||||
let mut hasher = DefaultHasher::new();
|
let mut hasher = DefaultHasher::new();
|
||||||
self.hash(&mut hasher);
|
self.hash(&mut hasher);
|
||||||
hasher.finish()
|
hasher.finish()
|
||||||
|
|
|
||||||
|
|
@ -93,7 +93,7 @@ impl DexString {
|
||||||
.extract()
|
.extract()
|
||||||
.or(<String as FromPyObject>::extract(other).map(|string| string.into()))?;
|
.or(<String as FromPyObject>::extract(other).map(|string| string.into()))?;
|
||||||
match op {
|
match op {
|
||||||
CompareOp::Eq => Ok((self == &other).into_py(py)),
|
CompareOp::Eq => Ok((self == &other).into_py(py)), // TODO: alpha order?
|
||||||
_ => Ok(py.NotImplemented()),
|
_ => Ok(py.NotImplemented()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -99,9 +99,8 @@ impl Field {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn __repr__(&self) -> String {
|
pub fn __repr__(&self) -> String {
|
||||||
let name: String = (&self.descriptor.name).into();
|
let descr = self.descriptor.__str__();
|
||||||
let ty: String = (&self.descriptor.type_.0).into();
|
format!("Field({descr})")
|
||||||
format!("Field({name}, {ty})")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return the value as a python object
|
/// Return the value as a python object
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,7 @@ fn androscalpel(_py: Python, m: &PyModule) -> PyResult<()> {
|
||||||
m.add_class::<DexAnnotation>()?;
|
m.add_class::<DexAnnotation>()?;
|
||||||
m.add_class::<DexArray>()?;
|
m.add_class::<DexArray>()?;
|
||||||
m.add_class::<FieldVisibility>()?;
|
m.add_class::<FieldVisibility>()?;
|
||||||
|
m.add_class::<MethodVisibility>()?;
|
||||||
m.add_class::<Method>()?;
|
m.add_class::<Method>()?;
|
||||||
m.add_class::<Field>()?;
|
m.add_class::<Field>()?;
|
||||||
m.add_class::<Class>()?;
|
m.add_class::<Class>()?;
|
||||||
|
|
|
||||||
|
|
@ -99,8 +99,7 @@ impl Method {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn __repr__(&self) -> String {
|
pub fn __repr__(&self) -> String {
|
||||||
let name: String = (&self.descriptor.name).into();
|
let dscr = self.descriptor.__str__();
|
||||||
let ty: String = self.descriptor.proto.__str__();
|
format!("Method({dscr})")
|
||||||
format!("Method({name}, {ty})")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
1
test.py
1
test.py
|
|
@ -6,6 +6,7 @@ logging.getLogger().setLevel(logging.INFO)
|
||||||
|
|
||||||
import androscalpel as asc
|
import androscalpel as asc
|
||||||
import zipfile as z
|
import zipfile as z
|
||||||
|
from androscalpel import *
|
||||||
|
|
||||||
APK_NAME = "test.apk"
|
APK_NAME = "test.apk"
|
||||||
DEX_NAME = "classes.dex"
|
DEX_NAME = "classes.dex"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue