|
49 | 49 | import static com.oracle.graal.python.nodes.SpecialMethodNames.T_INSERT;
|
50 | 50 | import static com.oracle.graal.python.nodes.StringLiterals.J_LLVM_LANGUAGE;
|
51 | 51 | import static com.oracle.graal.python.nodes.StringLiterals.T_COLON;
|
| 52 | +import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING; |
52 | 53 | import static com.oracle.graal.python.nodes.StringLiterals.T_PATH;
|
53 | 54 | import static com.oracle.graal.python.nodes.StringLiterals.T_STRICT;
|
54 | 55 | import static com.oracle.graal.python.nodes.StringLiterals.T_SURROGATEESCAPE;
|
|
90 | 91 | import com.oracle.graal.python.builtins.modules.GraalPythonModuleBuiltinsFactory.DebugNodeFactory;
|
91 | 92 | import com.oracle.graal.python.builtins.objects.PNone;
|
92 | 93 | import com.oracle.graal.python.builtins.objects.bytes.PBytes;
|
| 94 | +import com.oracle.graal.python.builtins.objects.bytes.PBytesLike; |
93 | 95 | import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
|
| 96 | +import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext; |
| 97 | +import com.oracle.graal.python.builtins.objects.cext.capi.PySequenceArrayWrapper.ToNativeStorageNode; |
94 | 98 | import com.oracle.graal.python.builtins.objects.code.CodeNodes;
|
95 | 99 | import com.oracle.graal.python.builtins.objects.code.PCode;
|
96 | 100 | import com.oracle.graal.python.builtins.objects.common.DynamicObjectStorage;
|
|
140 | 144 | import com.oracle.graal.python.runtime.exception.PException;
|
141 | 145 | import com.oracle.graal.python.runtime.exception.PythonExitException;
|
142 | 146 | import com.oracle.graal.python.runtime.object.PythonObjectFactory;
|
| 147 | +import com.oracle.graal.python.runtime.sequence.PSequence; |
| 148 | +import com.oracle.graal.python.runtime.sequence.storage.NativeSequenceStorage; |
143 | 149 | import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
|
144 | 150 | import com.oracle.graal.python.util.PythonUtils;
|
145 | 151 | import com.oracle.truffle.api.CallTarget;
|
@@ -253,6 +259,7 @@ public void postInitialize(Python3Core core) {
|
253 | 259 | mod.setAttribute(tsLiteral("dump_truffle_ast"), PNone.NO_VALUE);
|
254 | 260 | mod.setAttribute(tsLiteral("tdebug"), PNone.NO_VALUE);
|
255 | 261 | mod.setAttribute(tsLiteral("set_storage_strategy"), PNone.NO_VALUE);
|
| 262 | + mod.setAttribute(tsLiteral("storage_to_native"), PNone.NO_VALUE); |
256 | 263 | mod.setAttribute(tsLiteral("dump_heap"), PNone.NO_VALUE);
|
257 | 264 | mod.setAttribute(tsLiteral("is_native_object"), PNone.NO_VALUE);
|
258 | 265 | }
|
@@ -779,6 +786,36 @@ private void validate(HashingStorage dictStorage) {
|
779 | 786 | }
|
780 | 787 | }
|
781 | 788 |
|
| 789 | + @Builtin(name = "storage_to_native", minNumOfPositionalArgs = 1) |
| 790 | + @GenerateNodeFactory |
| 791 | + abstract static class StorageToNative extends PythonUnaryBuiltinNode { |
| 792 | + @Specialization |
| 793 | + @TruffleBoundary |
| 794 | + Object toNative(PBytesLike bytes) { |
| 795 | + ensureCapi(); |
| 796 | + NativeSequenceStorage newStorage = ToNativeStorageNode.getUncached().execute(bytes.getSequenceStorage(), true); |
| 797 | + bytes.setSequenceStorage(newStorage); |
| 798 | + return bytes; |
| 799 | + } |
| 800 | + |
| 801 | + @Specialization |
| 802 | + @TruffleBoundary |
| 803 | + Object toNative(PSequence sequence) { |
| 804 | + ensureCapi(); |
| 805 | + NativeSequenceStorage newStorage = ToNativeStorageNode.getUncached().execute(sequence.getSequenceStorage(), false); |
| 806 | + sequence.setSequenceStorage(newStorage); |
| 807 | + return sequence; |
| 808 | + } |
| 809 | + |
| 810 | + private void ensureCapi() { |
| 811 | + try { |
| 812 | + CApiContext.ensureCapiWasLoaded(null, getContext(), T_EMPTY_STRING, T_EMPTY_STRING); |
| 813 | + } catch (Exception e) { |
| 814 | + throw CompilerDirectives.shouldNotReachHere(e); |
| 815 | + } |
| 816 | + } |
| 817 | + } |
| 818 | + |
782 | 819 | @Builtin(name = J_EXTEND, minNumOfPositionalArgs = 1, doc = "Extends Java class and return HostAdapterCLass")
|
783 | 820 | @GenerateNodeFactory
|
784 | 821 | public abstract static class JavaExtendNode extends PythonUnaryBuiltinNode {
|
|
0 commit comments