Skip to content

Commit 8dd4276

Browse files
Merge pull request #537 from theseus-rs/fix-object-clone
fix: correct java.lang.Object.clone()
2 parents 3fb7c46 + f48674e commit 8dd4276

File tree

6 files changed

+351
-284
lines changed

6 files changed

+351
-284
lines changed

ristretto_classloader/src/object.rs

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -306,22 +306,6 @@ impl Object {
306306
std::ptr::eq(self, other)
307307
}
308308

309-
/// Deep clone the object.
310-
///
311-
/// # Errors
312-
///
313-
/// if the fields cannot be cloned.
314-
pub fn deep_clone(&self) -> Result<Self> {
315-
let mut values = Vec::with_capacity(self.values.len());
316-
for value in &self.values {
317-
values.push(value.deep_clone()?);
318-
}
319-
Ok(Self {
320-
class: self.class.clone(),
321-
values,
322-
})
323-
}
324-
325309
/// Convert the object to a bool value.
326310
///
327311
/// # Errors
@@ -747,20 +731,6 @@ mod tests {
747731
Ok(())
748732
}
749733

750-
#[tokio::test]
751-
async fn test_deep_clone() -> Result<()> {
752-
let class = load_class("java.lang.Integer").await?;
753-
let mut object = Object::new(class)?;
754-
object.set_value("value", Value::Int(1))?;
755-
let mut clone = object.deep_clone()?;
756-
assert_eq!(object, clone);
757-
assert!(!object.ptr_eq(&clone));
758-
759-
clone.set_value("value", Value::Int(2))?;
760-
assert_ne!(object, clone);
761-
Ok(())
762-
}
763-
764734
#[tokio::test]
765735
async fn test_eq_same_references() -> Result<()> {
766736
let class = load_class("java.lang.Integer").await?;

ristretto_classloader/src/reference.rs

Lines changed: 0 additions & 210 deletions
Original file line numberDiff line numberDiff line change
@@ -331,70 +331,6 @@ impl Reference {
331331
}
332332
}
333333

334-
/// Returns a deep clone of the reference.
335-
///
336-
/// # Errors
337-
///
338-
/// if the reference cannot be cloned.
339-
pub fn deep_clone(&self) -> Result<Reference> {
340-
let value = match self {
341-
Reference::ByteArray(array) => {
342-
let array = array.read();
343-
Reference::ByteArray(Gc::new(RwLock::new(array.clone())))
344-
}
345-
Reference::CharArray(array) => {
346-
let array = array.read();
347-
Reference::CharArray(Gc::new(RwLock::new(array.to_vec())))
348-
}
349-
Reference::ShortArray(array) => {
350-
let array = array.read();
351-
Reference::ShortArray(Gc::new(RwLock::new(array.to_vec())))
352-
}
353-
Reference::IntArray(array) => {
354-
let array = array.read();
355-
Reference::IntArray(Gc::new(RwLock::new(array.to_vec())))
356-
}
357-
Reference::LongArray(array) => {
358-
let array = array.read();
359-
Reference::LongArray(Gc::new(RwLock::new(array.to_vec())))
360-
}
361-
Reference::FloatArray(array) => {
362-
let array = array.read();
363-
Reference::FloatArray(Gc::new(RwLock::new(array.to_vec())))
364-
}
365-
Reference::DoubleArray(array) => {
366-
let array = array.read();
367-
Reference::DoubleArray(Gc::new(RwLock::new(array.to_vec())))
368-
}
369-
Reference::Array(object_array) => {
370-
let array = object_array.elements.read();
371-
let array = array.to_vec();
372-
let mut cloned_values = Vec::with_capacity(array.len());
373-
for value in array {
374-
match value {
375-
Some(reference) => cloned_values.push(Some(reference.deep_clone()?)),
376-
None => cloned_values.push(value),
377-
}
378-
}
379-
let object_array = ObjectArray {
380-
class: object_array.class.clone(),
381-
elements: Gc::new(RwLock::new(cloned_values)),
382-
};
383-
Reference::Array(object_array)
384-
}
385-
Reference::Object(object) => {
386-
let object = object.read();
387-
if object.class().name() == "java/lang/Class" {
388-
// Special case for Class objects, which should not be deep cloned.
389-
self.clone()
390-
} else {
391-
Reference::Object(Gc::new(RwLock::new(object.deep_clone()?)))
392-
}
393-
}
394-
};
395-
Ok(value)
396-
}
397-
398334
/// Convert the object to a bool value.
399335
///
400336
/// # Errors
@@ -1369,22 +1305,6 @@ mod tests {
13691305
Ok(())
13701306
}
13711307

1372-
#[test]
1373-
fn test_deep_clone_byte_array() -> Result<()> {
1374-
let reference = Reference::from(vec![1i8]);
1375-
let clone = reference.deep_clone()?;
1376-
assert_eq!(reference, clone);
1377-
1378-
{
1379-
let mut array = clone.as_byte_vec_mut()?;
1380-
if let Some(element) = array.get_mut(0) {
1381-
*element = 2;
1382-
}
1383-
}
1384-
assert_ne!(reference, clone);
1385-
Ok(())
1386-
}
1387-
13881308
#[test]
13891309
fn test_hash_code_char_array() {
13901310
let reference = Reference::from(vec![1 as char]);
@@ -1430,22 +1350,6 @@ mod tests {
14301350
Ok(())
14311351
}
14321352

1433-
#[test]
1434-
fn test_deep_clone_char_array() -> Result<()> {
1435-
let reference = Reference::from(vec![1 as char]);
1436-
let clone = reference.deep_clone()?;
1437-
assert_eq!(reference, clone);
1438-
1439-
{
1440-
let mut array = clone.as_char_vec_mut()?;
1441-
if let Some(element) = array.get_mut(0) {
1442-
*element = 2;
1443-
}
1444-
}
1445-
assert_ne!(reference, clone);
1446-
Ok(())
1447-
}
1448-
14491353
#[test]
14501354
fn test_hash_code_short_array() {
14511355
let reference = Reference::from(vec![1i16]);
@@ -1491,22 +1395,6 @@ mod tests {
14911395
Ok(())
14921396
}
14931397

1494-
#[test]
1495-
fn test_deep_clone_short_array() -> Result<()> {
1496-
let reference = Reference::from(vec![1i16]);
1497-
let clone = reference.deep_clone()?;
1498-
assert_eq!(reference, clone);
1499-
1500-
{
1501-
let mut array = clone.as_short_vec_mut()?;
1502-
if let Some(element) = array.get_mut(0) {
1503-
*element = 2;
1504-
}
1505-
}
1506-
assert_ne!(reference, clone);
1507-
Ok(())
1508-
}
1509-
15101398
#[test]
15111399
fn test_hash_code_int_array() {
15121400
let reference = Reference::from(vec![1i32]);
@@ -1552,22 +1440,6 @@ mod tests {
15521440
Ok(())
15531441
}
15541442

1555-
#[test]
1556-
fn test_deep_clone_int_array() -> Result<()> {
1557-
let reference = Reference::from(vec![1i32]);
1558-
let clone = reference.deep_clone()?;
1559-
assert_eq!(reference, clone);
1560-
1561-
{
1562-
let mut array = clone.as_int_vec_mut()?;
1563-
if let Some(element) = array.get_mut(0) {
1564-
*element = 2;
1565-
}
1566-
}
1567-
assert_ne!(reference, clone);
1568-
Ok(())
1569-
}
1570-
15711443
#[test]
15721444
fn test_hash_code_long_array() {
15731445
let reference = Reference::from(vec![1i64]);
@@ -1613,22 +1485,6 @@ mod tests {
16131485
Ok(())
16141486
}
16151487

1616-
#[test]
1617-
fn test_deep_clone_long_array() -> Result<()> {
1618-
let reference = Reference::from(vec![1i64]);
1619-
let clone = reference.deep_clone()?;
1620-
assert_eq!(reference, clone);
1621-
1622-
{
1623-
let mut array = clone.as_long_vec_mut()?;
1624-
if let Some(element) = array.get_mut(0) {
1625-
*element = 2;
1626-
}
1627-
}
1628-
assert_ne!(reference, clone);
1629-
Ok(())
1630-
}
1631-
16321488
#[test]
16331489
fn test_hash_code_float_array() {
16341490
let reference = Reference::from(vec![1.0f32]);
@@ -1674,22 +1530,6 @@ mod tests {
16741530
Ok(())
16751531
}
16761532

1677-
#[test]
1678-
fn test_deep_clone_float_array() -> Result<()> {
1679-
let reference = Reference::from(vec![1.0f32]);
1680-
let clone = reference.deep_clone()?;
1681-
assert_eq!(reference, clone);
1682-
1683-
{
1684-
let mut array = clone.as_float_vec_mut()?;
1685-
if let Some(element) = array.get_mut(0) {
1686-
*element = 2.0;
1687-
}
1688-
}
1689-
assert_ne!(reference, clone);
1690-
Ok(())
1691-
}
1692-
16931533
#[test]
16941534
fn test_hash_code_double_array() {
16951535
let reference = Reference::from(vec![1.0f64]);
@@ -1735,22 +1575,6 @@ mod tests {
17351575
Ok(())
17361576
}
17371577

1738-
#[test]
1739-
fn test_deep_clone_double_array() -> Result<()> {
1740-
let reference = Reference::from(vec![1.0f64]);
1741-
let clone = reference.deep_clone()?;
1742-
assert_eq!(reference, clone);
1743-
1744-
{
1745-
let mut array = clone.as_double_vec_mut()?;
1746-
if let Some(element) = array.get_mut(0) {
1747-
*element = 2.0;
1748-
}
1749-
}
1750-
assert_ne!(reference, clone);
1751-
Ok(())
1752-
}
1753-
17541578
#[tokio::test]
17551579
async fn test_hash_code_reference_array() -> Result<()> {
17561580
let class = load_class("java.lang.Object").await?;
@@ -1803,23 +1627,6 @@ mod tests {
18031627
Ok(())
18041628
}
18051629

1806-
#[tokio::test]
1807-
async fn test_deep_clone_reference_array() -> Result<()> {
1808-
let class = load_class("java.lang.Object").await?;
1809-
let reference = Reference::from((class.clone(), vec![None]));
1810-
let clone = reference.deep_clone()?;
1811-
assert_eq!(reference, clone);
1812-
1813-
{
1814-
let (_class, mut array) = clone.as_class_vec_mut()?;
1815-
if let Some(element) = array.get_mut(0) {
1816-
*element = Some(Reference::from(vec![1i8]));
1817-
}
1818-
}
1819-
assert_ne!(reference, clone);
1820-
Ok(())
1821-
}
1822-
18231630
#[tokio::test]
18241631
async fn test_hash_code_object() -> Result<()> {
18251632
let class = load_class("java.lang.Object").await?;
@@ -1870,23 +1677,6 @@ mod tests {
18701677
Ok(())
18711678
}
18721679

1873-
#[tokio::test]
1874-
async fn test_deep_clone_object() -> Result<()> {
1875-
let class = load_class("java.lang.Integer").await?;
1876-
let mut object = Object::new(class)?;
1877-
object.set_value("value", Value::Int(1))?;
1878-
let reference = Reference::from(object);
1879-
let clone = reference.deep_clone()?;
1880-
assert_eq!(reference, clone);
1881-
1882-
{
1883-
let mut cloned_object = clone.as_object_mut()?;
1884-
cloned_object.set_value("value", Value::Int(2))?;
1885-
}
1886-
assert_ne!(reference, clone);
1887-
Ok(())
1888-
}
1889-
18901680
#[tokio::test]
18911681
async fn test_array_eq() -> Result<()> {
18921682
let class = load_class("java.lang.Object").await?;

ristretto_classloader/src/value.rs

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -245,20 +245,6 @@ impl Value {
245245
matches!(self, Value::Long(_) | Value::Double(_))
246246
}
247247

248-
/// Returns a deep clone of the value.
249-
///
250-
/// # Errors
251-
///
252-
/// if the value cannot be cloned.
253-
pub fn deep_clone(&self) -> Result<Self> {
254-
let value = match self {
255-
Value::Object(Some(reference)) => Value::Object(Some(reference.deep_clone()?)),
256-
_ => self.clone(),
257-
};
258-
259-
Ok(value)
260-
}
261-
262248
/// Returns the reference to `Vec<i8>`.
263249
///
264250
/// # Errors
@@ -888,26 +874,6 @@ mod tests {
888874
Ok(())
889875
}
890876

891-
#[test]
892-
fn test_deep_clone() -> Result<()> {
893-
let value = Value::from(vec![1i32]);
894-
let clone = value.deep_clone()?;
895-
assert_eq!(value, clone);
896-
897-
let Value::Object(Some(ref reference)) = clone else {
898-
unreachable!("Expected an IntArray reference");
899-
};
900-
901-
{
902-
let mut array = reference.as_int_vec_mut()?;
903-
if let Some(element) = array.get_mut(0) {
904-
*element = 2;
905-
}
906-
}
907-
assert_ne!(value, clone);
908-
Ok(())
909-
}
910-
911877
#[test]
912878
fn test_hash_int() {
913879
let mut hasher = DefaultHasher::new();

0 commit comments

Comments
 (0)