From 9a769cc7b6259dd39ffa87a4bd9bc7b4c5e351d8 Mon Sep 17 00:00:00 2001 From: Vladimir Dostoyevskiy <99822064+VDostoyevskiy@users.noreply.github.com> Date: Mon, 8 Jan 2024 01:56:49 +0800 Subject: [PATCH] Rust refactor (#617) * Introduce deref_direct_bytebuffer * Cleanup * Cleanup * Cleanup --------- Co-authored-by: GG Bond --- app/src/main/rust/src/lib.rs | 45 ++++++++++++------------- app/src/main/rust/src/parser/fav.rs | 4 +-- app/src/main/rust/src/parser/home.rs | 4 +-- app/src/main/rust/src/parser/list.rs | 4 +-- app/src/main/rust/src/parser/torrent.rs | 4 +-- 5 files changed, 29 insertions(+), 32 deletions(-) diff --git a/app/src/main/rust/src/lib.rs b/app/src/main/rust/src/lib.rs index 7cb6d2c85..d3dc2270a 100644 --- a/app/src/main/rust/src/lib.rs +++ b/app/src/main/rust/src/lib.rs @@ -18,7 +18,7 @@ use log::LevelFilter; use serde::Serialize; use std::ffi::c_void; use std::io::Cursor; -use std::ptr::{slice_from_raw_parts, slice_from_raw_parts_mut}; +use std::ptr::slice_from_raw_parts_mut; use std::str::from_utf8_unchecked; use tl::{Bytes, Node, NodeHandle, Parser, VDom}; @@ -62,39 +62,36 @@ where handle.get(parser) } -fn parse_marshal_inplace(env: &mut JNIEnv, str: JByteBuffer, limit: jint, mut f: F) -> i32 +fn deref_direct_bytebuffer<'a>(env: &JNIEnv, buffer: &JByteBuffer) -> &'a mut [u8] { + let ptr = env.get_direct_buffer_address(buffer).unwrap(); + let cap = env.get_direct_buffer_capacity(buffer).unwrap(); + unsafe { &mut *slice_from_raw_parts_mut(ptr, cap) } +} + +fn throw_msg(env: &mut JNIEnv, msg: &str) -> i32 { + env.throw_new("java/lang/RuntimeException", msg).ok(); + 0 +} + +fn parse_marshal_inplace(env: &mut JNIEnv, str: JByteBuffer, limit: jint, f: F) -> i32 where - F: FnMut(&VDom, &Parser, &str) -> Result, + F: Fn(&VDom, &str) -> Result, R: Serialize, { - let ptr = env.get_direct_buffer_address(&str).unwrap(); - let html = unsafe { - let buff = slice_from_raw_parts(ptr, limit as usize); - from_utf8_unchecked(&*buff) - }; - let mut f = || { + let buffer = deref_direct_bytebuffer(env, &str); + let html = unsafe { from_utf8_unchecked(&buffer[..limit as usize]) }; + let f = || { let dom = tl::parse(html, tl::ParserOptions::default()).map_err(|_| html)?; - let parser = dom.parser(); - f(&dom, parser, html) + f(&dom, html) }; match f() { // Nothing to marshal - Err(err) => { - env.throw_new("java/lang/RuntimeException", err).ok(); - 0 - } + Err(err) => throw_msg(env, err), Ok(value) => { - let mut cursor = unsafe { - let slice = slice_from_raw_parts_mut(ptr, 0x80000); - Cursor::new(&mut *slice) - }; + let mut cursor = Cursor::new(buffer); match serde_cbor::to_writer(&mut cursor, &value) { Ok(_) => cursor.position() as i32, - Err(err) => { - env.throw_new("java/lang/RuntimeException", format!("{}", err)) - .ok(); - 0 - } + Err(err) => throw_msg(env, &format!("{}", err)), } } } diff --git a/app/src/main/rust/src/parser/fav.rs b/app/src/main/rust/src/parser/fav.rs index b155f5110..d2586fed8 100644 --- a/app/src/main/rust/src/parser/fav.rs +++ b/app/src/main/rust/src/parser/fav.rs @@ -57,7 +57,7 @@ fn parse_fav(dom: &VDom, parser: &Parser, html: &str) -> Result jint { - parse_marshal_inplace(&mut env, input, limit, |dom, parser, html| { - parse_fav(dom, parser, html) + parse_marshal_inplace(&mut env, input, limit, |dom, html| { + parse_fav(dom, dom.parser(), html) }) } diff --git a/app/src/main/rust/src/parser/home.rs b/app/src/main/rust/src/parser/home.rs index 93f0063bb..38d88035a 100644 --- a/app/src/main/rust/src/parser/home.rs +++ b/app/src/main/rust/src/parser/home.rs @@ -33,7 +33,7 @@ fn parse_limit(dom: &VDom, parser: &Parser) -> Option { #[allow(non_snake_case)] #[jni_fn("com.hippo.ehviewer.client.parser.HomeParserKt")] pub fn parseLimit(mut env: JNIEnv, _class: JClass, input: JByteBuffer, limit: jint) -> jint { - parse_marshal_inplace(&mut env, input, limit, |dom, parser, _| { - parse_limit(dom, parser).ok_or("Can't parse Limit") + parse_marshal_inplace(&mut env, input, limit, |dom, _| { + parse_limit(dom, dom.parser()).ok_or("Can't parse Limit") }) } diff --git a/app/src/main/rust/src/parser/list.rs b/app/src/main/rust/src/parser/list.rs index c73da0cad..4fc76c440 100644 --- a/app/src/main/rust/src/parser/list.rs +++ b/app/src/main/rust/src/parser/list.rs @@ -241,7 +241,7 @@ pub fn parse_info_list( #[allow(non_snake_case)] #[jni_fn("com.hippo.ehviewer.client.parser.GalleryListParserKt")] pub fn parseGalleryInfoList(mut env: JNIEnv, _: JClass, buffer: JByteBuffer, limit: jint) -> jint { - parse_marshal_inplace(&mut env, buffer, limit, |dom, parser, str| { - parse_info_list(dom, parser, str) + parse_marshal_inplace(&mut env, buffer, limit, |dom, str| { + parse_info_list(dom, dom.parser(), str) }) } diff --git a/app/src/main/rust/src/parser/torrent.rs b/app/src/main/rust/src/parser/torrent.rs index 125117720..514062026 100644 --- a/app/src/main/rust/src/parser/torrent.rs +++ b/app/src/main/rust/src/parser/torrent.rs @@ -44,7 +44,7 @@ fn parse_torrent_list(dom: &VDom, parser: &Parser) -> Result, &'sta #[allow(non_snake_case)] #[jni_fn("com.hippo.ehviewer.client.parser.TorrentParserKt")] pub fn parseTorrent(mut env: JNIEnv, _class: JClass, buffer: JByteBuffer, limit: jint) -> jint { - parse_marshal_inplace(&mut env, buffer, limit, |dom, parser, _html| { - parse_torrent_list(dom, parser) + parse_marshal_inplace(&mut env, buffer, limit, |dom, _| { + parse_torrent_list(dom, dom.parser()) }) }