Skip to content

Commit 8e83314

Browse files
committed
Store ZipFile raw bytes in Java array and reconstruct ZipArchive on demand
1 parent f089dea commit 8e83314

1 file changed

Lines changed: 17 additions & 17 deletions

File tree

java_runtime/src/classes/java/util/zip/zip_file.rs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1-
use alloc::{string::ToString, sync::Arc, vec, vec::Vec};
1+
use alloc::{string::ToString, vec, vec::Vec};
22
use core::iter;
33

44
// XXX for zip..
55
extern crate std;
66
use std::io::{Cursor, Read};
77

8-
use parking_lot::Mutex;
98
use zip::ZipArchive;
109

1110
use java_class_proto::{JavaFieldProto, JavaMethodProto};
12-
use jvm::{ClassInstanceRef, Jvm, Result, runtime::JavaLangString};
11+
use jvm::{Array, ClassInstanceRef, Jvm, Result, runtime::JavaLangString};
1312

1413
use crate::{
1514
RuntimeClassProto, RuntimeContext,
@@ -20,8 +19,6 @@ use crate::{
2019
},
2120
};
2221

23-
type JavaZipArchive = Arc<Mutex<ZipArchive<Cursor<Vec<u8>>>>>;
24-
2522
// class java.util.zip.ZipFile
2623
pub struct ZipFile;
2724

@@ -47,11 +44,19 @@ impl ZipFile {
4744
),
4845
JavaMethodProto::new("entries", "()Ljava/util/Enumeration;", Self::entries, Default::default()),
4946
],
50-
fields: vec![JavaFieldProto::new("zip", "[B", Default::default())],
47+
fields: vec![JavaFieldProto::new("zipData", "[B", Default::default())],
5148
access_flags: Default::default(),
5249
}
5350
}
5451

52+
async fn get_zip_archive(jvm: &Jvm, this: &ClassInstanceRef<Self>) -> Result<ZipArchive<Cursor<Vec<u8>>>> {
53+
let zip_data: ClassInstanceRef<Array<i8>> = jvm.get_field(this, "zipData", "[B").await?;
54+
let length = jvm.array_length(&zip_data).await?;
55+
let mut buf = vec![0u8; length];
56+
jvm.array_raw_buffer(&zip_data).await?.read(0, &mut buf).unwrap();
57+
Ok(ZipArchive::new(Cursor::new(buf)).unwrap())
58+
}
59+
5560
async fn init(jvm: &Jvm, _: &mut RuntimeContext, mut this: ClassInstanceRef<Self>, file: ClassInstanceRef<File>) -> Result<()> {
5661
tracing::debug!("java.util.zip.ZipFile::<init>({:?}, {:?})", &this, &file,);
5762

@@ -63,10 +68,7 @@ impl ZipFile {
6368
let buf = jvm.instantiate_array("B", length as _).await?;
6469
let _: i32 = jvm.invoke_virtual(&is, "read", "([B)I", (buf.clone(),)).await?;
6570

66-
let mut rust_buf = vec![0; length as _];
67-
jvm.array_raw_buffer(&buf).await?.read(0, &mut rust_buf).unwrap();
68-
let zip = Arc::new(Mutex::new(ZipArchive::new(Cursor::new(rust_buf)).unwrap()));
69-
jvm.put_rust_object_field(&mut this, "zip", zip).await?;
71+
jvm.put_field(&mut this, "zipData", "[B", buf).await?;
7072

7173
Ok(())
7274
}
@@ -82,8 +84,8 @@ impl ZipFile {
8284
let entry = jvm.new_class("java/util/zip/ZipEntry", "(Ljava/lang/String;)V", (name.clone(),)).await?;
8385
let name = JavaLangString::to_rust_string(jvm, &name).await?;
8486

85-
let zip: JavaZipArchive = jvm.get_rust_object_field(&this, "zip").await?;
86-
let file_size = zip.lock().by_name(&name).map(|x| x.size());
87+
let mut zip = Self::get_zip_archive(jvm, &this).await?;
88+
let file_size = zip.by_name(&name).map(|x| x.size());
8789

8890
if let Ok(x) = file_size {
8991
let _: () = jvm.invoke_virtual(&entry, "setSize", "(J)V", (x as i64,)).await?;
@@ -97,8 +99,8 @@ impl ZipFile {
9799
async fn entries(jvm: &Jvm, _: &mut RuntimeContext, this: ClassInstanceRef<Self>) -> Result<ClassInstanceRef<Enumeration>> {
98100
tracing::debug!("java.util.zip.ZipFile::entries({:?})", &this);
99101

100-
let zip: JavaZipArchive = jvm.get_rust_object_field(&this, "zip").await?;
101-
let names = zip.lock().file_names().map(|x| x.to_string()).collect::<Vec<_>>();
102+
let zip = Self::get_zip_archive(jvm, &this).await?;
103+
let names = zip.file_names().map(|x| x.to_string()).collect::<Vec<_>>();
102104

103105
let mut name_array = jvm.instantiate_array("Ljava/lang/String;", names.len() as _).await?;
104106
for (i, name) in names.iter().enumerate() {
@@ -129,9 +131,7 @@ impl ZipFile {
129131
let entry_name = JavaLangString::to_rust_string(jvm, &entry_name).await?;
130132

131133
let data = {
132-
let zip: JavaZipArchive = jvm.get_rust_object_field(&this, "zip").await?;
133-
134-
let mut zip = zip.lock();
134+
let mut zip = Self::get_zip_archive(jvm, &this).await?;
135135
let mut file = zip.by_name(&entry_name).unwrap();
136136

137137
let mut buf = Vec::new();

0 commit comments

Comments
 (0)