Skip to content

Commit e035ccc

Browse files
committed
fix bug when reading dex method & fields
1 parent ed4beaf commit e035ccc

File tree

5 files changed

+25
-35
lines changed

5 files changed

+25
-35
lines changed

Cargo.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ members = [
99
]
1010

1111
[workspace.package]
12-
version = "0.0.11" # JAVA_ASM_VERSION
12+
version = "0.0.12" # JAVA_ASM_VERSION
1313
authors = ["zsqw123"]
1414
edition = "2021"
1515
license = "Apache-2.0"
@@ -20,9 +20,9 @@ homepage = "https://crates.io/crates/java_asm"
2020
readme = "README.md"
2121

2222
[workspace.dependencies]
23-
java_asm_macro = { path = "asm_macro", version = "0.0.11" } # JAVA_ASM_VERSION
24-
java_asm = { path = "asm", version = "0.0.11" } # JAVA_ASM_VERSION
25-
java_asm_server = { path = "asm_server", version = "0.0.11" } # JAVA_ASM_VERSION
23+
java_asm_macro = { path = "asm_macro", version = "0.0.12" } # JAVA_ASM_VERSION
24+
java_asm = { path = "asm", version = "0.0.12" } # JAVA_ASM_VERSION
25+
java_asm_server = { path = "asm_server", version = "0.0.12" } # JAVA_ASM_VERSION
2626

2727
enum_dispatch = "0.3.13"
2828
zip = "2.2.0"

asm/src/dex/element.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,7 @@ use crate::AsmResult;
33
use crate::{DescriptorRef, StrRef};
44

55
pub trait AsElement<E> {
6-
fn to_element(&self, accessor: &DexFileAccessor, previous: Option<&Self>) -> AsmResult<E>;
7-
}
8-
9-
pub struct DexElement {
10-
6+
fn to_element(&self, accessor: &DexFileAccessor, previous_index: u32) -> AsmResult<(u32, E)>;
117
}
128

139
#[derive(Clone, Debug)]

asm/src/dex/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ impl DexFileAccessor {
6969
}
7070

7171
pub fn get_class_element(&self, class_data_off: DUInt) -> AsmResult<ClassContentElement> {
72-
self.get_data_impl::<ClassDataItem>(class_data_off)?.to_element(&self, None)
72+
self.get_data_impl::<ClassDataItem>(class_data_off)?.to_element(&self)
7373
}
7474

7575
pub fn get_class_smali(&self, class_def: ClassDef) -> AsmResult<SmaliNode> {

asm/src/impls/dex/r/element.rs

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -77,18 +77,11 @@ where
7777
{
7878
let vec_size = vec.len();
7979
let mut result = Vec::with_capacity(vec_size);
80-
let mut index = 0;
81-
while index < vec_size {
82-
let previous = if index != 0 {
83-
Some(&vec[index - 1])
84-
} else {
85-
None // cannot using `index - 1` because it may overflow when index is 0u32
86-
};
87-
// SAFETY: index is always less than vec_size
88-
let c = vec.get(index).unwrap();
89-
let element = c.to_element(accessor, previous)?;
80+
let mut prev_index = 0;
81+
for c in vec {
82+
let (current_index, element) = c.to_element(accessor, prev_index)?;
83+
prev_index = current_index;
9084
result.push(element);
91-
index += 1;
9285
}
9386
Ok(result)
9487
}
@@ -120,9 +113,9 @@ fn read_method(
120113
MethodElement { access_flags, name, shorty_descriptor, return_type, parameters, code_off }.ok()
121114
}
122115

123-
impl AsElement<ClassContentElement> for ClassDataItem {
124-
fn to_element(
125-
&self, accessor: &DexFileAccessor, _previous: Option<&ClassDataItem>,
116+
impl ClassDataItem {
117+
pub(crate) fn to_element(
118+
&self, accessor: &DexFileAccessor
126119
) -> AsmResult<ClassContentElement> {
127120
let static_fields = to_element_list_impl(
128121
accessor, &self.static_fields,
@@ -145,20 +138,18 @@ impl AsElement<ClassContentElement> for ClassDataItem {
145138

146139
impl AsElement<FieldElement> for EncodedField {
147140
fn to_element(
148-
&self, accessor: &DexFileAccessor, previous: Option<&EncodedField>,
149-
) -> AsmResult<FieldElement> {
150-
let previous_field_idx = previous.map_or(0, |f| f.field_idx_diff.value());
151-
let field_idx = self.field_idx_diff.value() + previous_field_idx;
152-
read_field(accessor, self, field_idx)
141+
&self, accessor: &DexFileAccessor, previous_index: u32,
142+
) -> AsmResult<(u32, FieldElement)> {
143+
let field_idx = self.field_idx_diff.value() + previous_index;
144+
Ok((field_idx, read_field(accessor, self, field_idx)?))
153145
}
154146
}
155147

156148
impl AsElement<MethodElement> for EncodedMethod {
157149
fn to_element(
158-
&self, accessor: &DexFileAccessor, previous: Option<&EncodedMethod>,
159-
) -> AsmResult<MethodElement> {
160-
let previous_method_idx = previous.map_or(0, |m| m.method_idx_diff.value());
161-
let method_idx = self.method_idx_diff.value() + previous_method_idx;
162-
read_method(accessor, self, method_idx)
150+
&self, accessor: &DexFileAccessor, previous_index: u32,
151+
) -> AsmResult<(u32, MethodElement)> {
152+
let method_idx = self.method_idx_diff.value() + previous_index;
153+
Ok((method_idx, read_method(accessor, self, method_idx)?))
163154
}
164155
}

asm_egui/src/smali.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,10 @@ fn token(
5353
let text_ui = simple_text(ui, s.to_string(), font, smali_style.desc)
5454
.on_hover_ui(|ui| {
5555
ui.style_mut().interaction.selectable_labels = true;
56-
ui.label(format!("descriptor: {s}"));
56+
ui.horizontal(|ui| {
57+
ui.label(format!("1descriptor: {s}"));
58+
ui.label(format!("2descriptor: {s}"));
59+
});
5760
});
5861
text_ui.context_menu(|ui| {
5962
ui.label(format!("descriptor: {s}"));

0 commit comments

Comments
 (0)