|
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