From ab447718ad0ae159ad22876688c82ce8c12e32a0 Mon Sep 17 00:00:00 2001 From: chaokunyang Date: Tue, 20 Feb 2024 14:55:28 +0800 Subject: [PATCH] fix get static field by unsafe --- .../fury/serializer/scala/SingletonCollectionSerializer.java | 4 +++- .../apache/fury/serializer/scala/SingletonMapSerializer.java | 4 +++- .../fury/serializer/scala/SingletonObjectSerializer.java | 4 +++- .../src/main/java/org/apache/fury/util/unsafe/_Lookup.java | 3 ++- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/java/fury-core/src/main/java/org/apache/fury/serializer/scala/SingletonCollectionSerializer.java b/java/fury-core/src/main/java/org/apache/fury/serializer/scala/SingletonCollectionSerializer.java index 07c30c0702..82d4a2dba8 100644 --- a/java/fury-core/src/main/java/org/apache/fury/serializer/scala/SingletonCollectionSerializer.java +++ b/java/fury-core/src/main/java/org/apache/fury/serializer/scala/SingletonCollectionSerializer.java @@ -36,6 +36,7 @@ @SuppressWarnings("rawtypes") public class SingletonCollectionSerializer extends AbstractCollectionSerializer { private final Field field; + private Object base = null; private long offset = -1; public SingletonCollectionSerializer(Fury fury, Class cls) { @@ -61,8 +62,9 @@ public Object read(MemoryBuffer buffer) { if (offset == -1) { Preconditions.checkArgument(!GraalvmSupport.isGraalBuildtime()); offset = this.offset = Platform.UNSAFE.staticFieldOffset(field); + base = Platform.UNSAFE.staticFieldBase(field); } - return Platform.getObject(type, offset); + return Platform.getObject(base, offset); } @Override diff --git a/java/fury-core/src/main/java/org/apache/fury/serializer/scala/SingletonMapSerializer.java b/java/fury-core/src/main/java/org/apache/fury/serializer/scala/SingletonMapSerializer.java index f27f561be5..e842b883ad 100644 --- a/java/fury-core/src/main/java/org/apache/fury/serializer/scala/SingletonMapSerializer.java +++ b/java/fury-core/src/main/java/org/apache/fury/serializer/scala/SingletonMapSerializer.java @@ -36,6 +36,7 @@ @SuppressWarnings("rawtypes") public class SingletonMapSerializer extends AbstractMapSerializer { private final Field field; + private Object base = null; private long offset = -1; public SingletonMapSerializer(Fury fury, Class cls) { @@ -61,8 +62,9 @@ public Object read(MemoryBuffer buffer) { if (offset == -1) { Preconditions.checkArgument(!GraalvmSupport.isGraalBuildtime()); offset = this.offset = Platform.UNSAFE.staticFieldOffset(field); + base = Platform.UNSAFE.staticFieldBase(field); } - return Platform.getObject(type, offset); + return Platform.getObject(base, offset); } @Override diff --git a/java/fury-core/src/main/java/org/apache/fury/serializer/scala/SingletonObjectSerializer.java b/java/fury-core/src/main/java/org/apache/fury/serializer/scala/SingletonObjectSerializer.java index 3399ad02ca..191a3e5404 100644 --- a/java/fury-core/src/main/java/org/apache/fury/serializer/scala/SingletonObjectSerializer.java +++ b/java/fury-core/src/main/java/org/apache/fury/serializer/scala/SingletonObjectSerializer.java @@ -34,6 +34,7 @@ @SuppressWarnings("rawtypes") public class SingletonObjectSerializer extends Serializer { private final Field field; + private Object base = null; private long offset = -1; public SingletonObjectSerializer(Fury fury, Class type) { @@ -54,7 +55,8 @@ public Object read(MemoryBuffer buffer) { if (offset == -1) { Preconditions.checkArgument(!GraalvmSupport.isGraalBuildtime()); offset = this.offset = Platform.UNSAFE.staticFieldOffset(field); + base = Platform.UNSAFE.staticFieldBase(field); } - return Platform.getObject(type, offset); + return Platform.getObject(base, offset); } } diff --git a/java/fury-core/src/main/java/org/apache/fury/util/unsafe/_Lookup.java b/java/fury-core/src/main/java/org/apache/fury/util/unsafe/_Lookup.java index fb8dd80815..adbadd8c8d 100644 --- a/java/fury-core/src/main/java/org/apache/fury/util/unsafe/_Lookup.java +++ b/java/fury-core/src/main/java/org/apache/fury/util/unsafe/_Lookup.java @@ -41,7 +41,8 @@ class _Lookup { try { Field implLookup = Lookup.class.getDeclaredField("IMPL_LOOKUP"); long fieldOffset = _JDKAccess.UNSAFE.staticFieldOffset(implLookup); - trustedLookup = (Lookup) _JDKAccess.UNSAFE.getObject(Lookup.class, fieldOffset); + Object fieldBase = _JDKAccess.UNSAFE.staticFieldBase(implLookup); + trustedLookup = (Lookup) _JDKAccess.UNSAFE.getObject(fieldBase, fieldOffset); } catch (Throwable ignored) { // ignored }