|
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