60
60
import com .oracle .graal .python .builtins .objects .common .SequenceStorageNodes .ListGeneralizationNode ;
61
61
import com .oracle .graal .python .builtins .objects .common .SequenceStorageNodes .NormalizeIndexNode ;
62
62
import com .oracle .graal .python .builtins .objects .common .SequenceStorageNodes .StorageToNativeNode ;
63
+ import com .oracle .graal .python .builtins .objects .ints .PInt ;
63
64
import com .oracle .graal .python .builtins .objects .list .ListBuiltins ;
64
65
import com .oracle .graal .python .builtins .objects .list .ListBuiltinsFactory ;
65
66
import com .oracle .graal .python .builtins .objects .list .PList ;
67
+ import com .oracle .graal .python .builtins .objects .memoryview .PMemoryView ;
68
+ import com .oracle .graal .python .builtins .objects .mmap .MMapBuiltins ;
69
+ import com .oracle .graal .python .builtins .objects .mmap .PMMap ;
70
+ import com .oracle .graal .python .builtins .objects .slice .PSlice ;
66
71
import com .oracle .graal .python .builtins .objects .tuple .PTuple ;
67
72
import com .oracle .graal .python .builtins .objects .tuple .TupleBuiltins ;
68
73
import com .oracle .graal .python .builtins .objects .tuple .TupleBuiltinsFactory ;
82
87
import com .oracle .truffle .api .dsl .ImportStatic ;
83
88
import com .oracle .truffle .api .dsl .Specialization ;
84
89
import com .oracle .truffle .api .dsl .TypeSystemReference ;
90
+ import com .oracle .truffle .api .frame .VirtualFrame ;
85
91
import com .oracle .truffle .api .interop .ForeignAccess ;
86
92
import com .oracle .truffle .api .interop .Message ;
87
93
import com .oracle .truffle .api .interop .MessageResolution ;
@@ -111,8 +117,8 @@ public Object access(PySequenceArrayWrapper object) {
111
117
abstract static class ReadNode extends Node {
112
118
@ Child private ReadArrayItemNode readArrayItemNode ;
113
119
114
- public Object access (PySequenceArrayWrapper object , Object key ) {
115
- return getReadArrayItemNode ().execute (object .getDelegate (), key );
120
+ public Object access (VirtualFrame frame , PySequenceArrayWrapper object , Object key ) {
121
+ return getReadArrayItemNode ().execute (frame , object .getDelegate (), key );
116
122
}
117
123
118
124
private ReadArrayItemNode getReadArrayItemNode () {
@@ -144,20 +150,20 @@ public Object access(PySequenceArrayWrapper object, Object key, Object value) {
144
150
145
151
@ ImportStatic (SpecialMethodNames .class )
146
152
@ TypeSystemReference (PythonTypes .class )
147
- abstract static class ReadArrayItemNode extends Node {
153
+ abstract static class ReadArrayItemNode extends PNodeWithContext {
148
154
149
155
@ Child private ToSulongNode toSulongNode ;
150
156
151
- public abstract Object execute (Object arrayObject , Object idx );
157
+ public abstract Object execute (VirtualFrame frame , Object arrayObject , Object idx );
152
158
153
159
@ Specialization
154
- Object doTuple (PTuple tuple , long idx ,
160
+ Object doTuple (@ SuppressWarnings ( "unused" ) VirtualFrame frame , PTuple tuple , long idx ,
155
161
@ Cached ("createTupleGetItem()" ) TupleBuiltins .GetItemNode getItemNode ) {
156
162
return getToSulongNode ().execute (getItemNode .execute (tuple , idx ));
157
163
}
158
164
159
165
@ Specialization
160
- Object doTuple (PList list , long idx ,
166
+ Object doTuple (@ SuppressWarnings ( "unused" ) VirtualFrame frame , PList list , long idx ,
161
167
@ Cached ("createListGetItem()" ) ListBuiltins .GetItemNode getItemNode ) {
162
168
return getToSulongNode ().execute (getItemNode .execute (list , idx ));
163
169
}
@@ -168,7 +174,7 @@ Object doTuple(PList list, long idx,
168
174
* {@code uint64_t} since we do not know how many bytes are requested.
169
175
*/
170
176
@ Specialization
171
- long doBytesI64 (PIBytesLike bytesLike , long byteIdx ,
177
+ long doBytesI64 (@ SuppressWarnings ( "unused" ) VirtualFrame frame , PIBytesLike bytesLike , long byteIdx ,
172
178
@ Cached ("createClassProfile()" ) ValueProfile profile ,
173
179
@ Cached ("create()" ) SequenceStorageNodes .LenNode lenNode ,
174
180
@ Cached ("create()" ) SequenceStorageNodes .GetItemNode getItemNode ) {
@@ -179,9 +185,13 @@ long doBytesI64(PIBytesLike bytesLike, long byteIdx,
179
185
return 0L ;
180
186
}
181
187
int i = (int ) byteIdx ;
182
- long result = 0 ;
183
188
SequenceStorage store = profiled .getSequenceStorage ();
184
- result |= getItemNode .executeInt (store , i );
189
+ return packLong (store , getItemNode , len , i );
190
+ }
191
+
192
+ private static long packLong (SequenceStorage store , SequenceStorageNodes .GetItemNode getItemNode , int len , int i ) {
193
+ long result = 0 ;
194
+ result |= getItemNode .executeInt (store , i ) & 0xFFL ;
185
195
if (i + 1 < len )
186
196
result |= ((long ) getItemNode .executeInt (store , i + 1 ) << 8L ) & 0xFF00L ;
187
197
if (i + 2 < len )
@@ -199,8 +209,28 @@ long doBytesI64(PIBytesLike bytesLike, long byteIdx,
199
209
return result ;
200
210
}
201
211
212
+ @ Specialization
213
+ long doMMap (VirtualFrame frame , PMMap list , long idx ,
214
+ @ Cached ("create()" ) MMapBuiltins .GetItemNode getItemNode ,
215
+ @ Cached ("create()" ) SequenceNodes .GetSequenceStorageNode getStorageNode ,
216
+ @ Cached ("create()" ) SequenceStorageNodes .LenNode lenNode ,
217
+ @ Cached ("create()" ) SequenceStorageNodes .GetItemNode getStoreItemNode ) {
218
+ try {
219
+ int i = PInt .intValueExact (idx );
220
+ PSlice sl = factory ().createSlice (i , i + 8 , 1 );
221
+ Object bytes = getItemNode .executeObject (frame , list , sl );
222
+ SequenceStorage storage = getStorageNode .execute (bytes );
223
+ int storageLen = lenNode .execute (storage );
224
+ return packLong (storage , getStoreItemNode , storageLen , 0 );
225
+ } catch (ArithmeticException e ) {
226
+ // TODO raise native exception
227
+ CompilerDirectives .transferToInterpreter ();
228
+ throw new IllegalArgumentException ();
229
+ }
230
+ }
231
+
202
232
@ Specialization (guards = {"!isTuple(object)" , "!isList(object)" })
203
- Object doGeneric (Object object , long idx ,
233
+ Object doGeneric (@ SuppressWarnings ( "unused" ) VirtualFrame frame , Object object , long idx ,
204
234
@ Cached ("create(__GETITEM__)" ) LookupAndCallBinaryNode getItemNode ) {
205
235
return getToSulongNode ().execute (getItemNode .executeObject (object , idx ));
206
236
}
@@ -515,7 +545,7 @@ Object doPtrArrayMultiCtx(@SuppressWarnings("unused") PSequence object) {
515
545
}
516
546
517
547
protected static boolean hasByteArrayContent (Object object ) {
518
- return object instanceof PBytes || object instanceof PByteArray ;
548
+ return object instanceof PBytes || object instanceof PByteArray || object instanceof PMemoryView || object instanceof PMMap ;
519
549
}
520
550
521
551
public static GetTypeIDNode create () {
0 commit comments