This is an automated email from the ASF dual-hosted git repository.
chaokunyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fury.git
The following commit(s) were added to refs/heads/main by this push:
new eee65280 feat(java): support jdk17+ record copy (#1741)
eee65280 is described below
commit eee65280990b10a4e875b6a17da8112cddea9c9e
Author: Shawn Yang <[email protected]>
AuthorDate: Sat Jul 20 19:02:28 2024 +0800
feat(java): support jdk17+ record copy (#1741)
## What does this PR do?
This PR supports jdk17+ record copy
## Related issues
#1739
#1701
Closes #1740
## Does this PR introduce any user-facing change?
<!--
If any user-facing interface changes, please [open an
issue](https://github.com/apache/fury/issues/new/choose) describing the
need to do so and update the document if necessary.
-->
- [ ] Does this PR introduce any public API change?
- [ ] Does this PR introduce any binary protocol compatibility change?
## Benchmark
<!--
When the PR has an impact on performance (if you don't know whether the
PR will have an impact on performance, you can submit the PR first, and
if it will have impact on performance, the code reviewer will explain
it), be sure to attach a benchmark data here.
-->
---
.../fury/integration_tests/RecordSerializersTest.java | 10 ++++++++++
.../fury/serializer/AbstractObjectSerializer.java | 17 +++++++++++++++--
.../apache/fury/serializer/CompatibleSerializer.java | 4 ++--
.../apache/fury/serializer/MetaSharedSerializer.java | 4 ++--
.../org/apache/fury/serializer/ObjectSerializer.java | 4 ++--
.../java/org/apache/fury/util/record/RecordUtils.java | 3 ++-
6 files changed, 33 insertions(+), 9 deletions(-)
diff --git
a/integration_tests/latest_jdk_tests/src/test/java/org/apache/fury/integration_tests/RecordSerializersTest.java
b/integration_tests/latest_jdk_tests/src/test/java/org/apache/fury/integration_tests/RecordSerializersTest.java
index 8922ced0..c582f8b9 100644
---
a/integration_tests/latest_jdk_tests/src/test/java/org/apache/fury/integration_tests/RecordSerializersTest.java
+++
b/integration_tests/latest_jdk_tests/src/test/java/org/apache/fury/integration_tests/RecordSerializersTest.java
@@ -235,4 +235,14 @@ public class RecordSerializersTest {
}
private record PrivateRecord(String foo) {}
+
+ @Test(dataProvider = "codegen")
+ public void testCopy(boolean codegen) {
+ Fury fury = Fury.builder().withCodegen(codegen).build();
+ fury.register(Foo.class);
+ fury.register(PrivateRecord.class);
+ Assert.assertEquals(fury.copy(new PrivateRecord("foo")), new
PrivateRecord("foo"));
+ Foo foo = new Foo(10, "abc", new ArrayList<>(Arrays.asList("a", "b")),
'x');
+ Assert.assertEquals(fury.copy(foo), foo);
+ }
}
diff --git
a/java/fury-core/src/main/java/org/apache/fury/serializer/AbstractObjectSerializer.java
b/java/fury-core/src/main/java/org/apache/fury/serializer/AbstractObjectSerializer.java
index 8591c6c8..7a53478c 100644
---
a/java/fury-core/src/main/java/org/apache/fury/serializer/AbstractObjectSerializer.java
+++
b/java/fury-core/src/main/java/org/apache/fury/serializer/AbstractObjectSerializer.java
@@ -26,8 +26,10 @@ import java.lang.invoke.MethodHandle;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.List;
+import java.util.stream.Collectors;
import org.apache.fury.Fury;
import org.apache.fury.collection.Tuple2;
import org.apache.fury.collection.Tuple3;
@@ -44,6 +46,7 @@ import org.apache.fury.type.DescriptorGrouper;
import org.apache.fury.type.FinalObjectTypeStub;
import org.apache.fury.type.GenericType;
import org.apache.fury.util.record.RecordComponent;
+import org.apache.fury.util.record.RecordInfo;
import org.apache.fury.util.record.RecordUtils;
public abstract class AbstractObjectSerializer<T> extends Serializer<T> {
@@ -52,6 +55,7 @@ public abstract class AbstractObjectSerializer<T> extends
Serializer<T> {
protected final boolean isRecord;
protected final MethodHandle constructor;
private InternalFieldInfo[] fieldInfos;
+ private RecordInfo copyRecordInfo;
public AbstractObjectSerializer(Fury fury, Class<T> type) {
this(
@@ -78,7 +82,9 @@ public abstract class AbstractObjectSerializer<T> extends
Serializer<T> {
if (isRecord) {
Object[] fieldValues = copyFields(originObj);
try {
- return (T) constructor.invokeWithArguments(fieldValues);
+ T t = (T) constructor.invokeWithArguments(fieldValues);
+ Arrays.fill(copyRecordInfo.getRecordComponents(), null);
+ return t;
} catch (Throwable e) {
Platform.throwException(e);
}
@@ -117,7 +123,7 @@ public abstract class AbstractObjectSerializer<T> extends
Serializer<T> {
fieldValues[i] = fury.copyObject(fieldValue, fieldInfo.classId);
}
}
- return fieldValues;
+ return RecordUtils.remapping(copyRecordInfo, fieldValues);
}
private void copyFields(T originObj, T newObj) {
@@ -242,6 +248,13 @@ public abstract class AbstractObjectSerializer<T> extends
Serializer<T> {
System.arraycopy(infos.f0.f0, 0, fieldInfos, 0, infos.f0.f0.length);
System.arraycopy(infos.f1, 0, fieldInfos, infos.f0.f0.length,
infos.f1.length);
System.arraycopy(infos.f2, 0, fieldInfos, fieldInfos.length -
infos.f2.length, infos.f2.length);
+ if (isRecord) {
+ List<String> fieldNames =
+ Arrays.stream(fieldInfos)
+ .map(f -> f.fieldAccessor.getField().getName())
+ .collect(Collectors.toList());
+ copyRecordInfo = new RecordInfo(type, fieldNames);
+ }
return fieldInfos;
}
diff --git
a/java/fury-core/src/main/java/org/apache/fury/serializer/CompatibleSerializer.java
b/java/fury-core/src/main/java/org/apache/fury/serializer/CompatibleSerializer.java
index d018e5dd..433093d8 100644
---
a/java/fury-core/src/main/java/org/apache/fury/serializer/CompatibleSerializer.java
+++
b/java/fury-core/src/main/java/org/apache/fury/serializer/CompatibleSerializer.java
@@ -301,10 +301,10 @@ public final class CompatibleSerializer<T> extends
CompatibleSerializerBase<T> {
if (isRecord) {
Object[] fieldValues = new Object[fieldResolver.getNumFields()];
readFields(buffer, fieldValues);
- RecordUtils.remapping(recordInfo, fieldValues);
+ fieldValues = RecordUtils.remapping(recordInfo, fieldValues);
assert constructor != null;
try {
- T t = (T)
constructor.invokeWithArguments(recordInfo.getRecordComponents());
+ T t = (T) constructor.invokeWithArguments(fieldValues);
Arrays.fill(recordInfo.getRecordComponents(), null);
return t;
} catch (Throwable e) {
diff --git
a/java/fury-core/src/main/java/org/apache/fury/serializer/MetaSharedSerializer.java
b/java/fury-core/src/main/java/org/apache/fury/serializer/MetaSharedSerializer.java
index 1292fcbd..ee962872 100644
---
a/java/fury-core/src/main/java/org/apache/fury/serializer/MetaSharedSerializer.java
+++
b/java/fury-core/src/main/java/org/apache/fury/serializer/MetaSharedSerializer.java
@@ -128,9 +128,9 @@ public class MetaSharedSerializer<T> extends
AbstractObjectSerializer<T> {
Object[] fieldValues =
new Object[finalFields.length + otherFields.length +
containerFields.length];
readFields(buffer, fieldValues);
- RecordUtils.remapping(recordInfo, fieldValues);
+ fieldValues = RecordUtils.remapping(recordInfo, fieldValues);
try {
- T t = (T)
constructor.invokeWithArguments(recordInfo.getRecordComponents());
+ T t = (T) constructor.invokeWithArguments(fieldValues);
Arrays.fill(recordInfo.getRecordComponents(), null);
return t;
} catch (Throwable e) {
diff --git
a/java/fury-core/src/main/java/org/apache/fury/serializer/ObjectSerializer.java
b/java/fury-core/src/main/java/org/apache/fury/serializer/ObjectSerializer.java
index 2c72fb2e..374b5be9 100644
---
a/java/fury-core/src/main/java/org/apache/fury/serializer/ObjectSerializer.java
+++
b/java/fury-core/src/main/java/org/apache/fury/serializer/ObjectSerializer.java
@@ -230,9 +230,9 @@ public final class ObjectSerializer<T> extends
AbstractObjectSerializer<T> {
public T read(MemoryBuffer buffer) {
if (isRecord) {
Object[] fields = readFields(buffer);
- RecordUtils.remapping(recordInfo, fields);
+ fields = RecordUtils.remapping(recordInfo, fields);
try {
- T obj = (T)
constructor.invokeWithArguments(recordInfo.getRecordComponents());
+ T obj = (T) constructor.invokeWithArguments(fields);
Arrays.fill(recordInfo.getRecordComponents(), null);
return obj;
} catch (Throwable e) {
diff --git
a/java/fury-core/src/main/java/org/apache/fury/util/record/RecordUtils.java
b/java/fury-core/src/main/java/org/apache/fury/util/record/RecordUtils.java
index 65652e05..6b2de31c 100644
--- a/java/fury-core/src/main/java/org/apache/fury/util/record/RecordUtils.java
+++ b/java/fury-core/src/main/java/org/apache/fury/util/record/RecordUtils.java
@@ -278,7 +278,7 @@ public class RecordUtils {
return recordComponentsIndex;
}
- public static void remapping(RecordInfo recordInfo, Object[] fields) {
+ public static Object[] remapping(RecordInfo recordInfo, Object[] fields) {
int[] recordComponentsIndex = recordInfo.getRecordComponentsIndex();
Object[] recordComponents = recordInfo.getRecordComponents();
Object[] recordComponentsDefaultValues =
recordInfo.getRecordComponentsDefaultValues();
@@ -291,5 +291,6 @@ public class RecordUtils {
recordComponents[i] = recordComponentsDefaultValues[i];
}
}
+ return recordComponents;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]