Skip to content

Commit 7f47600

Browse files
committed
[GR-44445] Introduce weak cache for promoted TruffleStrings.
PullRequest: graalpython/2660
2 parents 53d02ba + af78886 commit 7f47600

File tree

3 files changed

+25
-2
lines changed

3 files changed

+25
-2
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextBuiltins.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ public abstract static class PromoteBorrowedValue extends Node {
216216
public abstract Object execute(Object value);
217217

218218
@Specialization
219-
static PythonBuiltinObject doString(TruffleString str,
219+
public static PString doString(TruffleString str,
220220
@Cached PythonObjectFactory factory) {
221221
return factory.createString(str);
222222
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiContext.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltinRegistry;
6868
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltinExecutable;
6969
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath;
70+
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.PromoteBorrowedValue;
7071
import com.oracle.graal.python.builtins.objects.PNone;
7172
import com.oracle.graal.python.builtins.objects.PNotImplemented;
7273
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PCallCapiFunction;
@@ -88,6 +89,7 @@
8889
import com.oracle.graal.python.builtins.objects.frame.PFrame;
8990
import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
9091
import com.oracle.graal.python.builtins.objects.module.PythonModule;
92+
import com.oracle.graal.python.builtins.objects.str.PString;
9193
import com.oracle.graal.python.builtins.objects.thread.PLock;
9294
import com.oracle.graal.python.nodes.ErrorMessages;
9395
import com.oracle.graal.python.nodes.IndirectCallNode;
@@ -101,6 +103,7 @@
101103
import com.oracle.graal.python.runtime.PythonOptions;
102104
import com.oracle.graal.python.runtime.exception.PException;
103105
import com.oracle.graal.python.util.PythonUtils;
106+
import com.oracle.graal.python.util.WeakIdentityHashMap;
104107
import com.oracle.truffle.api.CallTarget;
105108
import com.oracle.truffle.api.CompilerAsserts;
106109
import com.oracle.truffle.api.CompilerDirectives;
@@ -160,6 +163,8 @@ public final class CApiContext extends CExtContext {
160163
*/
161164
@CompilationFinal(dimensions = 1) private final PrimitiveNativeWrapper[] primitiveNativeWrapperCache;
162165

166+
private final WeakIdentityHashMap<TruffleString, PString> promotedTruffleStringCache;
167+
163168
/**
164169
* Required to emulate PyLongObject's ABI; number of bits per digit (equal to
165170
* {@code PYLONG_BITS_IN_DIGIT}.
@@ -205,6 +210,7 @@ public static TruffleLogger getLogger(Class<?> clazz) {
205210
private CApiContext() {
206211
super(null, null, null);
207212
primitiveNativeWrapperCache = null;
213+
promotedTruffleStringCache = null;
208214
llvmTypeCache = null;
209215
}
210216

@@ -221,6 +227,7 @@ public CApiContext(PythonContext context, Object hpyLibrary) {
221227
CApiTransitions.incRef(nativeWrapper, PythonNativeWrapper.IMMORTAL_REFCNT);
222228
primitiveNativeWrapperCache[i] = nativeWrapper;
223229
}
230+
promotedTruffleStringCache = new WeakIdentityHashMap<>();
224231
}
225232

226233
public int getPyLongBitsInDigit() {
@@ -347,6 +354,16 @@ public Object getModuleByIndex(int i) {
347354
return null;
348355
}
349356

357+
@TruffleBoundary
358+
public Object getOrInsertPromotedTruffleString(TruffleString obj) {
359+
PString pString = promotedTruffleStringCache.get(obj);
360+
if (pString == null) {
361+
pString = PromoteBorrowedValue.doString(obj, getContext().factory());
362+
promotedTruffleStringCache.put(obj, pString);
363+
}
364+
return pString;
365+
}
366+
350367
@TruffleBoundary
351368
public AllocInfo traceFree(Object ptr, @SuppressWarnings("unused") PFrame.Reference curFrame, @SuppressWarnings("unused") TruffleString clazzName) {
352369
if (allocatedNativeMemory == null) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/CApiTransitions.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,13 @@ public static Object pythonToNative(Object obj, boolean transfer) {
568568
} else if (obj instanceof DescriptorDeleteMarker) {
569569
return PythonContext.get(null).getNativeNull().getPtr();
570570
} else {
571-
PythonNativeWrapper wrapper = GetNativeWrapperNodeGen.getUncached().execute(obj);
571+
Object promoted;
572+
if (obj instanceof TruffleString) {
573+
promoted = PythonContext.get(null).getCApiContext().getOrInsertPromotedTruffleString((TruffleString) obj);
574+
} else {
575+
promoted = obj;
576+
}
577+
PythonNativeWrapper wrapper = GetNativeWrapperNodeGen.getUncached().execute(promoted);
572578
if (transfer) {
573579
// native part needs to decRef to release
574580
incRef(wrapper, 1);

0 commit comments

Comments
 (0)