|
1 | 1 | /*
|
2 |
| - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. |
| 2 | + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. |
3 | 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
4 | 4 | *
|
5 | 5 | * The Universal Permissive License (UPL), Version 1.0
|
|
40 | 40 | */
|
41 | 41 | package com.oracle.graal.python.builtins.modules.ctypes;
|
42 | 42 |
|
| 43 | +import com.oracle.graal.python.builtins.PythonBuiltinClassType; |
43 | 44 | import com.oracle.graal.python.builtins.modules.ctypes.memory.Pointer;
|
44 | 45 | import com.oracle.graal.python.builtins.modules.ctypes.memory.PointerNodes;
|
45 | 46 | import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
|
46 | 47 | import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
|
47 | 48 | import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper.PythonAbstractObjectNativeWrapper;
|
48 | 49 | import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions;
|
49 | 50 | import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject;
|
| 51 | +import com.oracle.graal.python.lib.PyObjectTypeCheck; |
| 52 | +import com.oracle.graal.python.nodes.object.GetClassNode; |
50 | 53 | import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
|
51 | 54 | import com.oracle.truffle.api.dsl.Bind;
|
52 | 55 | import com.oracle.truffle.api.dsl.Cached;
|
|
58 | 61 | import com.oracle.truffle.api.nodes.Node;
|
59 | 62 | import com.oracle.truffle.api.object.Shape;
|
60 | 63 | import com.oracle.truffle.api.profiles.InlinedConditionProfile;
|
| 64 | +import com.oracle.truffle.api.strings.TruffleString; |
61 | 65 |
|
62 | 66 | @ExportLibrary(PythonBufferAcquireLibrary.class)
|
63 | 67 | @ExportLibrary(PythonBufferAccessLibrary.class)
|
@@ -104,6 +108,31 @@ int getBufferLength() {
|
104 | 108 | return b_size;
|
105 | 109 | }
|
106 | 110 |
|
| 111 | + @ExportMessage |
| 112 | + TruffleString getFormatString( |
| 113 | + @Bind("$node") Node inliningTarget, |
| 114 | + @Shared @Cached GetClassNode getClassNode, |
| 115 | + @Shared @Cached StgDictBuiltins.PyTypeStgDictNode stgDictNode) { |
| 116 | + Object itemType = getClassNode.execute(inliningTarget, this); |
| 117 | + StgDictObject dict = stgDictNode.execute(inliningTarget, itemType); |
| 118 | + return dict.format; |
| 119 | + } |
| 120 | + |
| 121 | + @ExportMessage |
| 122 | + int getItemSize( |
| 123 | + @Bind("$node") Node inliningTarget, |
| 124 | + @Shared @Cached GetClassNode getClassNode, |
| 125 | + @Shared @Cached StgDictBuiltins.PyTypeStgDictNode stgDictNode, |
| 126 | + @Cached PyObjectTypeCheck typeCheck) { |
| 127 | + Object itemType = getClassNode.execute(inliningTarget, this); |
| 128 | + while (typeCheck.execute(inliningTarget, itemType, PythonBuiltinClassType.PyCArrayType)) { |
| 129 | + StgDictObject stgDict = stgDictNode.execute(inliningTarget, itemType); |
| 130 | + itemType = stgDict.proto; |
| 131 | + } |
| 132 | + StgDictObject itemDict = stgDictNode.execute(inliningTarget, itemType); |
| 133 | + return itemDict.size; |
| 134 | + } |
| 135 | + |
107 | 136 | @ExportMessage
|
108 | 137 | byte readByte(int byteIndex,
|
109 | 138 | @Bind("$node") Node inliningTarget,
|
|
0 commit comments