Skip to content

Commit 093a6dc

Browse files
Merge pull request #520 from theseus-rs/remove-value-to-methods
refactor: replace Value.to_<type> methods with TryInto
2 parents 1b7b779 + 4063196 commit 093a6dc

File tree

20 files changed

+106
-179
lines changed

20 files changed

+106
-179
lines changed

ristretto_classloader/src/object.rs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ impl TryInto<bool> for Object {
449449

450450
fn try_into(self) -> Result<bool> {
451451
let value = self.class_value("java/lang/Boolean")?;
452-
let value = value.to_int()?;
452+
let value: i32 = value.try_into()?;
453453
Ok(value != 0)
454454
}
455455
}
@@ -459,8 +459,9 @@ impl TryInto<char> for Object {
459459

460460
fn try_into(self) -> Result<char> {
461461
let value = self.class_value("java/lang/Character")?;
462+
let value: i32 = value.try_into()?;
462463
#[expect(clippy::cast_sign_loss)]
463-
let value = value.to_int()? as u32;
464+
let value = value as u32;
464465
let character = char::try_from(value)
465466
.map_err(|_| InvalidValueType("Invalid character value".to_string()))?;
466467
Ok(character)
@@ -472,7 +473,7 @@ impl TryInto<i8> for Object {
472473

473474
fn try_into(self) -> Result<i8> {
474475
let value = self.class_value("java/lang/Byte")?;
475-
let value = value.to_int()?;
476+
let value: i32 = value.try_into()?;
476477
let value =
477478
i8::try_from(value).map_err(|_| InvalidValueType("Invalid byte value".to_string()))?;
478479
Ok(value)
@@ -494,7 +495,7 @@ impl TryInto<i16> for Object {
494495

495496
fn try_into(self) -> Result<i16> {
496497
let value = self.class_value("java/lang/Short")?;
497-
let value = value.to_int()?;
498+
let value: i32 = value.try_into()?;
498499
let value = i16::try_from(value)
499500
.map_err(|_| InvalidValueType("Invalid short value".to_string()))?;
500501
Ok(value)
@@ -516,7 +517,7 @@ impl TryInto<i32> for Object {
516517

517518
fn try_into(self) -> Result<i32> {
518519
let value = self.class_value("java/lang/Integer")?;
519-
let value = value.to_int()?;
520+
let value: i32 = value.try_into()?;
520521
Ok(value)
521522
}
522523
}
@@ -536,7 +537,7 @@ impl TryInto<i64> for Object {
536537

537538
fn try_into(self) -> Result<i64> {
538539
let value = self.class_value("java/lang/Long")?;
539-
let value = value.to_long()?;
540+
let value = value.try_into()?;
540541
Ok(value)
541542
}
542543
}
@@ -576,7 +577,7 @@ impl TryInto<f32> for Object {
576577

577578
fn try_into(self) -> Result<f32> {
578579
let value = self.class_value("java/lang/Float")?;
579-
let value = value.to_float()?;
580+
let value = value.try_into()?;
580581
Ok(value)
581582
}
582583
}
@@ -586,7 +587,7 @@ impl TryInto<f64> for Object {
586587

587588
fn try_into(self) -> Result<f64> {
588589
let value = self.class_value("java/lang/Double")?;
589-
let value = value.to_double()?;
590+
let value = value.try_into()?;
590591
Ok(value)
591592
}
592593
}
@@ -603,7 +604,7 @@ impl TryInto<String> for Object {
603604
};
604605
match reference {
605606
ByteArray(bytes) => {
606-
let coder = self.value("coder")?.to_int()?;
607+
let coder: i32 = self.value("coder")?.try_into()?;
607608
if coder == 0 {
608609
// Latin-1 encoded string
609610
let bytes = bytes

ristretto_classloader/src/value.rs

Lines changed: 27 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -17,62 +17,20 @@ pub enum Value {
1717
}
1818

1919
impl Value {
20-
/// Returns the value as an `i32`.
21-
///
22-
/// # Errors
23-
///
24-
/// if the value is not an `Int`.
25-
pub fn to_int(&self) -> Result<i32> {
26-
match self {
27-
Value::Int(value) => Ok(*value),
28-
_ => Err(InvalidValueType("Expected an int value".to_string())),
29-
}
30-
}
31-
32-
/// Returns the value as an `i64`.
33-
///
34-
/// # Errors
35-
///
36-
/// if the value is not a `Long`
37-
pub fn to_long(&self) -> Result<i64> {
38-
match self {
39-
Value::Long(value) => Ok(*value),
40-
_ => Err(InvalidValueType("Expected a long value".to_string())),
41-
}
42-
}
43-
44-
/// Returns the value as an `f32`.
45-
///
46-
/// # Errors
47-
///
48-
/// if the value is not a `Float`
49-
pub fn to_float(&self) -> Result<f32> {
50-
match self {
51-
Value::Float(value) => Ok(*value),
52-
_ => Err(InvalidValueType("Expected a float value".to_string())),
53-
}
54-
}
55-
56-
/// Returns the value as an `f64`.
57-
///
58-
/// # Errors
59-
///
60-
/// if the value is not a `Double`
61-
pub fn to_double(&self) -> Result<f64> {
62-
match self {
63-
Value::Double(value) => Ok(*value),
64-
_ => Err(InvalidValueType("Expected a double value".to_string())),
65-
}
20+
/// Returns true if the value is null.
21+
#[must_use]
22+
pub fn is_null(&self) -> bool {
23+
matches!(self, Value::Object(None))
6624
}
6725

68-
/// Returns the value as an `Option<Reference>`.
26+
/// Returns a reference to the value if it is an object.
6927
///
7028
/// # Errors
7129
///
72-
/// if the value is not a `Reference`
73-
pub fn to_reference(&self) -> Result<Option<Reference>> {
30+
/// If the value is not an object or if it cannot be converted to a reference.
31+
pub fn as_reference(&self) -> Result<&Reference> {
7432
match self {
75-
Value::Object(value) => Ok(value.clone()),
33+
Value::Object(Some(reference)) => Ok(reference),
7634
_ => Err(InvalidValueType("Expected a reference value".to_string())),
7735
}
7836
}
@@ -689,88 +647,63 @@ mod tests {
689647
}
690648

691649
#[test]
692-
fn test_int_format() -> Result<()> {
650+
fn test_int_format() {
693651
let value = Value::Int(42);
694-
assert_eq!(42, value.to_int()?);
695652
assert_eq!("int(42)", value.to_string());
696653
assert!(value.is_category_1());
697654
assert!(!value.is_category_2());
698-
Ok(())
699-
}
700-
701-
#[test]
702-
fn test_to_int_error() {
703-
let result = Value::Long(42).to_int();
704-
assert!(matches!(result, Err(InvalidValueType(_))));
705655
}
706656

707657
#[test]
708-
fn test_long_format() -> Result<()> {
658+
fn test_long_format() {
709659
let value = Value::Long(42);
710-
assert_eq!(42, value.to_long()?);
711660
assert_eq!("long(42)", value.to_string());
712661
assert!(!value.is_category_1());
713662
assert!(value.is_category_2());
714-
Ok(())
715-
}
716-
717-
#[test]
718-
fn test_to_long_error() {
719-
let result = Value::Int(42).to_long();
720-
assert!(matches!(result, Err(InvalidValueType(_))));
721663
}
722664

723665
#[test]
724-
fn test_float_format() -> Result<()> {
666+
fn test_float_format() {
725667
let value = Value::Float(42.1);
726-
let compare_value = value.to_float()? - 42.1f32;
727-
assert!(compare_value.abs() < 0.1f32);
728668
assert_eq!("float(42.1)", value.to_string());
729669
assert!(value.is_category_1());
730670
assert!(!value.is_category_2());
731-
Ok(())
732671
}
733672

734673
#[test]
735-
fn test_to_float_error() {
736-
let result = Value::Int(42).to_float();
737-
assert!(matches!(result, Err(InvalidValueType(_))));
738-
}
739-
740-
#[test]
741-
fn test_double_format() -> Result<()> {
674+
fn test_double_format() {
742675
let value = Value::Double(42.1);
743-
let compare_value = value.to_double()? - 42.1f64;
744-
assert!(compare_value.abs() < 0.1f64);
745676
assert_eq!("double(42.1)", value.to_string());
746677
assert!(!value.is_category_1());
747678
assert!(value.is_category_2());
748-
Ok(())
749679
}
750680

751681
#[test]
752-
fn test_to_double_error() {
753-
let result = Value::Int(42).to_double();
754-
assert!(matches!(result, Err(InvalidValueType(_))));
755-
}
756-
757-
#[test]
758-
fn test_object_format() -> Result<()> {
682+
fn test_object_format() {
759683
let value = Value::Object(None);
760-
assert_eq!(None, value.to_reference()?);
761684
assert_eq!("Object(null)", value.to_string());
685+
assert!(value.is_null());
762686
assert!(value.is_category_1());
763687
assert!(!value.is_category_2());
764688
assert_eq!(
765689
"byte[1, 2, 3]",
766690
format!("{}", Value::from(vec![1i8, 2i8, 3i8]))
767691
);
692+
}
693+
694+
#[test]
695+
fn test_as_reference() -> Result<()> {
696+
let reference = Reference::from(vec![1i8, 2i8, 3i8]);
697+
let value = Value::Object(Some(reference));
698+
let reference = value.as_reference()?;
699+
let array = reference.as_byte_vec_ref()?;
700+
assert_eq!(array.to_vec(), vec![1, 2, 3]);
768701
Ok(())
769702
}
770703

771704
#[test]
772-
fn test_to_object_error() {
773-
let result = Value::Int(42).to_reference();
705+
fn test_as_reference_error() {
706+
let result: Result<&Reference> = Value::Int(42).as_reference();
774707
assert!(matches!(result, Err(InvalidValueType(_))));
775708
}
776709

@@ -782,6 +715,7 @@ mod tests {
782715
let object = Object::new(class)?;
783716
let string_bytes: Vec<i8> = "foo".as_bytes().to_vec().iter().map(|&b| b as i8).collect();
784717
let string_value = Value::from(string_bytes);
718+
assert!(!string_value.is_null());
785719
object.set_value("value", string_value)?;
786720
let value = Value::from(object);
787721
assert_eq!("String(\"foo\")", value.to_string());
@@ -1322,7 +1256,7 @@ mod tests {
13221256
let value = Value::from(object);
13231257
let original_values = vec![value];
13241258
let value = Value::try_from((original_class.clone(), original_values.clone()))?;
1325-
let reference = value.to_reference()?.expect("vec");
1259+
let reference: Reference = value.try_into()?;
13261260
let reference_class_name = reference.class_name().to_string();
13271261
let reference_values: Vec<Value> = reference.try_into()?;
13281262
assert_eq!(original_class.name(), reference_class_name);

ristretto_cli/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ fn process_error(error: Error) -> Result<()> {
146146
if let Value::Object(Some(ref _file_object)) = file {
147147
source = file.try_into()?;
148148
}
149-
let line = stack_trace_element.value("lineNumber")?.to_int()?;
149+
let line: i32 = stack_trace_element.value("lineNumber")?.try_into()?;
150150
if line > 0 {
151151
if source.is_empty() {
152152
source = format!("{line}");

ristretto_vm/src/intrinsic_methods/java/io/console.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,8 @@ mod tests {
6363
let (_vm, thread) = crate::test::thread().await.expect("thread");
6464
let value = encoding(thread, Parameters::default())
6565
.await?
66-
.expect("encoding")
67-
.to_reference()?;
68-
assert!(value.is_none());
66+
.expect("encoding");
67+
assert!(value.is_null());
6968
Ok(())
7069
}
7170

ristretto_vm/src/intrinsic_methods/java/io/filedescriptor.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,16 @@ pub(crate) fn file_descriptor_from_java_object(
2626
let fd = if vm.java_class_file_version() >= &JAVA_11 {
2727
#[cfg(not(target_os = "windows"))]
2828
{
29-
let fd = file_descriptor.value("fd")?.to_int()?;
29+
let fd: i32 = file_descriptor.value("fd")?.try_into()?;
3030
i64::from(fd)
3131
}
3232
#[cfg(target_os = "windows")]
3333
{
34-
let fd: i64 = file_descriptor.value("handle")?.to_long()?;
34+
let fd: i64 = file_descriptor.value("handle")?.try_into()?;
3535
fd
3636
}
3737
} else {
38-
let fd = file_descriptor.value("fd")?.to_int()?;
38+
let fd: i32 = file_descriptor.value("fd")?.try_into()?;
3939
i64::from(fd)
4040
};
4141
Ok(fd)

ristretto_vm/src/intrinsic_methods/java/io/unixfilesystem.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1049,7 +1049,7 @@ mod tests {
10491049
let mut parameters = Parameters::default();
10501050
parameters.push(file_object);
10511051
let value = list(thread, parameters).await?.expect("paths");
1052-
let reference = value.to_reference()?.expect("paths");
1052+
let reference: Reference = value.try_into()?;
10531053
let class_name = reference.class_name().to_string();
10541054
let elements: Vec<Value> = reference.try_into()?;
10551055
assert_eq!(class_name, "java/lang/String");
@@ -1067,7 +1067,7 @@ mod tests {
10671067
let mut parameters = Parameters::default();
10681068
parameters.push(file_object);
10691069
let value = list_0(thread, parameters).await?.expect("paths");
1070-
let reference = value.to_reference()?.expect("paths");
1070+
let reference: Reference = value.clone().try_into()?;
10711071
let class_name = reference.class_name().to_string();
10721072
let elements: Vec<Value> = value.try_into()?;
10731073
assert_eq!(class_name, "java/lang/String");

ristretto_vm/src/intrinsic_methods/java/io/winntfilesystem.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ mod tests {
262262
use super::*;
263263
use crate::JavaError::RuntimeException;
264264
use crate::JavaObject;
265+
use ristretto_classloader::Reference;
265266
use std::path::Path;
266267
use tempfile::NamedTempFile;
267268

@@ -491,7 +492,7 @@ mod tests {
491492
let mut parameters = Parameters::default();
492493
parameters.push(file_object);
493494
let value = list(thread, parameters).await?.expect("paths");
494-
let reference = value.to_reference()?.expect("paths");
495+
let reference: Reference = value.clone().try_into()?;
495496
let class_name = reference.class_name().to_string();
496497
let elements: Vec<Value> = value.try_into()?;
497498
assert_eq!(class_name, "java/lang/String");

ristretto_vm/src/intrinsic_methods/java/lang/class.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1186,7 +1186,7 @@ mod tests {
11861186
let value = get_declared_classes_0(thread, parameters)
11871187
.await?
11881188
.expect("interfaces");
1189-
let reference = value.to_reference()?.expect("interfaces");
1189+
let reference: Reference = value.try_into()?;
11901190
let class_name = reference.class_name().to_string();
11911191
let values: Vec<Value> = reference.try_into()?;
11921192
assert_eq!(class_name, "[Ljava/lang/Class;");
@@ -1213,7 +1213,7 @@ mod tests {
12131213
let value = get_declared_constructors_0(thread, parameters)
12141214
.await?
12151215
.expect("constructors");
1216-
let reference = value.to_reference()?.expect("constructors");
1216+
let reference: Reference = value.try_into()?;
12171217
let class_name = reference.class_name().to_string();
12181218
let values: Vec<Value> = reference.try_into()?;
12191219
assert_eq!(class_name, "[Ljava/lang/reflect/Constructor;");
@@ -1253,7 +1253,7 @@ mod tests {
12531253
let value = get_declared_fields_0(thread, parameters)
12541254
.await?
12551255
.expect("fields");
1256-
let reference = value.to_reference()?.expect("fields");
1256+
let reference: Reference = value.try_into()?;
12571257
let class_name = reference.class_name().to_string();
12581258
let values: Vec<Value> = reference.try_into()?;
12591259
assert_eq!(class_name, "[Ljava/lang/reflect/Field;");
@@ -1297,7 +1297,7 @@ mod tests {
12971297
let value = get_declared_methods_0(thread, parameters)
12981298
.await?
12991299
.expect("methods");
1300-
let reference = value.to_reference()?.expect("methods");
1300+
let reference: Reference = value.try_into()?;
13011301
let class_name = reference.class_name().to_string();
13021302
let values: Vec<Value> = reference.try_into()?;
13031303
assert_eq!(class_name, "[Ljava/lang/reflect/Method;");
@@ -1438,7 +1438,7 @@ mod tests {
14381438
let value = get_interfaces_0(thread, parameters)
14391439
.await?
14401440
.expect("interfaces");
1441-
let reference = value.to_reference()?.expect("interfaces");
1441+
let reference: Reference = value.try_into()?;
14421442
let class_name = reference.class_name().to_string();
14431443
let values: Vec<Value> = reference.try_into()?;
14441444
assert_eq!(class_name, "[Ljava/lang/Class;");

0 commit comments

Comments
 (0)