|
40 | 40 | */
|
41 | 41 | package com.oracle.graal.python.builtins.objects.cext.capi;
|
42 | 42 |
|
| 43 | +import java.util.logging.Level; |
| 44 | + |
43 | 45 | import com.oracle.graal.python.builtins.objects.bytes.PBytesLike;
|
44 | 46 | import com.oracle.graal.python.builtins.objects.cext.capi.PySequenceArrayWrapperFactory.ToNativeStorageNodeGen;
|
45 | 47 | import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
|
|
52 | 54 | import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
|
53 | 55 | import com.oracle.graal.python.util.PythonUtils;
|
54 | 56 | import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
|
| 57 | +import com.oracle.truffle.api.TruffleLogger; |
55 | 58 | import com.oracle.truffle.api.dsl.Cached;
|
56 | 59 | import com.oracle.truffle.api.dsl.Cached.Shared;
|
57 | 60 | import com.oracle.truffle.api.dsl.GenerateCached;
|
|
66 | 69 | */
|
67 | 70 | public final class PySequenceArrayWrapper {
|
68 | 71 |
|
| 72 | + private static final TruffleLogger LOGGER = CApiContext.getLogger(PySequenceArrayWrapper.class); |
| 73 | + |
69 | 74 | @GenerateInline
|
70 | 75 | @GenerateCached(false)
|
71 | 76 | @GenerateUncached
|
@@ -143,22 +148,32 @@ static boolean isMroSequenceStorage(SequenceStorage s) {
|
143 | 148 |
|
144 | 149 | @TruffleBoundary
|
145 | 150 | public static Object ensureNativeSequence(PSequence sequence) {
|
| 151 | + boolean loggable = LOGGER.isLoggable(Level.FINE); |
| 152 | + if (loggable) { |
| 153 | + LOGGER.fine(String.format("ensureNativeSequence(%s)", sequence)); |
| 154 | + } |
146 | 155 | /*
|
147 | 156 | * MroSequenceStorages are special. We cannot simply replace them with a
|
148 | 157 | * NativeSequenceStorage because we still need the "managed" one due to the assumptions.
|
149 | 158 | * Hence, if an MroSequenceStorage goes to native, we will create an additional
|
150 | 159 | * NativeSequenceStorage and link to it.
|
151 | 160 | */
|
| 161 | + Object result; |
152 | 162 | SequenceStorage sequenceStorage = sequence.getSequenceStorage();
|
153 | 163 | if (sequenceStorage instanceof NativeSequenceStorage nativeStorage) {
|
154 |
| - return nativeStorage.getPtr(); |
| 164 | + result = nativeStorage.getPtr(); |
155 | 165 | } else if (sequenceStorage instanceof MroSequenceStorage mro && mro.isNative()) {
|
156 |
| - return mro.getNativeMirror().getPtr(); |
| 166 | + result = mro.getNativeMirror().getPtr(); |
| 167 | + } else { |
| 168 | + NativeSequenceStorage nativeStorage = ToNativeStorageNode.executeUncached(sequenceStorage, sequence instanceof PBytesLike); |
| 169 | + if (!(sequenceStorage instanceof MroSequenceStorage)) { |
| 170 | + sequence.setSequenceStorage(nativeStorage); |
| 171 | + } |
| 172 | + result = nativeStorage.getPtr(); |
157 | 173 | }
|
158 |
| - NativeSequenceStorage nativeStorage = ToNativeStorageNode.executeUncached(sequenceStorage, sequence instanceof PBytesLike); |
159 |
| - if (!(sequenceStorage instanceof MroSequenceStorage)) { |
160 |
| - sequence.setSequenceStorage(nativeStorage); |
| 174 | + if (loggable) { |
| 175 | + LOGGER.fine(String.format("ensureNativeSequence(%s) = %s", sequence, PythonUtils.formatPointer(result))); |
161 | 176 | }
|
162 |
| - return nativeStorage.getPtr(); |
| 177 | + return result; |
163 | 178 | }
|
164 | 179 | }
|
0 commit comments