6060import com .oracle .graal .python .builtins .objects .common .SequenceStorageNodes .ListGeneralizationNode ;
6161import com .oracle .graal .python .builtins .objects .common .SequenceStorageNodes .NormalizeIndexNode ;
6262import com .oracle .graal .python .builtins .objects .common .SequenceStorageNodes .StorageToNativeNode ;
63+ import com .oracle .graal .python .builtins .objects .ints .PInt ;
6364import com .oracle .graal .python .builtins .objects .list .ListBuiltins ;
6465import com .oracle .graal .python .builtins .objects .list .ListBuiltinsFactory ;
6566import 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 ;
6671import com .oracle .graal .python .builtins .objects .tuple .PTuple ;
6772import com .oracle .graal .python .builtins .objects .tuple .TupleBuiltins ;
6873import com .oracle .graal .python .builtins .objects .tuple .TupleBuiltinsFactory ;
8287import com .oracle .truffle .api .dsl .ImportStatic ;
8388import com .oracle .truffle .api .dsl .Specialization ;
8489import com .oracle .truffle .api .dsl .TypeSystemReference ;
90+ import com .oracle .truffle .api .frame .VirtualFrame ;
8591import com .oracle .truffle .api .interop .ForeignAccess ;
8692import com .oracle .truffle .api .interop .Message ;
8793import com .oracle .truffle .api .interop .MessageResolution ;
@@ -111,8 +117,8 @@ public Object access(PySequenceArrayWrapper object) {
111117 abstract static class ReadNode extends Node {
112118 @ Child private ReadArrayItemNode readArrayItemNode ;
113119
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 );
116122 }
117123
118124 private ReadArrayItemNode getReadArrayItemNode () {
@@ -144,20 +150,20 @@ public Object access(PySequenceArrayWrapper object, Object key, Object value) {
144150
145151 @ ImportStatic (SpecialMethodNames .class )
146152 @ TypeSystemReference (PythonTypes .class )
147- abstract static class ReadArrayItemNode extends Node {
153+ abstract static class ReadArrayItemNode extends PNodeWithContext {
148154
149155 @ Child private ToSulongNode toSulongNode ;
150156
151- public abstract Object execute (Object arrayObject , Object idx );
157+ public abstract Object execute (VirtualFrame frame , Object arrayObject , Object idx );
152158
153159 @ Specialization
154- Object doTuple (PTuple tuple , long idx ,
160+ Object doTuple (@ SuppressWarnings ( "unused" ) VirtualFrame frame , PTuple tuple , long idx ,
155161 @ Cached ("createTupleGetItem()" ) TupleBuiltins .GetItemNode getItemNode ) {
156162 return getToSulongNode ().execute (getItemNode .execute (tuple , idx ));
157163 }
158164
159165 @ Specialization
160- Object doTuple (PList list , long idx ,
166+ Object doTuple (@ SuppressWarnings ( "unused" ) VirtualFrame frame , PList list , long idx ,
161167 @ Cached ("createListGetItem()" ) ListBuiltins .GetItemNode getItemNode ) {
162168 return getToSulongNode ().execute (getItemNode .execute (list , idx ));
163169 }
@@ -168,7 +174,7 @@ Object doTuple(PList list, long idx,
168174 * {@code uint64_t} since we do not know how many bytes are requested.
169175 */
170176 @ Specialization
171- long doBytesI64 (PIBytesLike bytesLike , long byteIdx ,
177+ long doBytesI64 (@ SuppressWarnings ( "unused" ) VirtualFrame frame , PIBytesLike bytesLike , long byteIdx ,
172178 @ Cached ("createClassProfile()" ) ValueProfile profile ,
173179 @ Cached ("create()" ) SequenceStorageNodes .LenNode lenNode ,
174180 @ Cached ("create()" ) SequenceStorageNodes .GetItemNode getItemNode ) {
@@ -179,9 +185,13 @@ long doBytesI64(PIBytesLike bytesLike, long byteIdx,
179185 return 0L ;
180186 }
181187 int i = (int ) byteIdx ;
182- long result = 0 ;
183188 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 ;
185195 if (i + 1 < len )
186196 result |= ((long ) getItemNode .executeInt (store , i + 1 ) << 8L ) & 0xFF00L ;
187197 if (i + 2 < len )
@@ -199,8 +209,28 @@ long doBytesI64(PIBytesLike bytesLike, long byteIdx,
199209 return result ;
200210 }
201211
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+
202232 @ Specialization (guards = {"!isTuple(object)" , "!isList(object)" })
203- Object doGeneric (Object object , long idx ,
233+ Object doGeneric (@ SuppressWarnings ( "unused" ) VirtualFrame frame , Object object , long idx ,
204234 @ Cached ("create(__GETITEM__)" ) LookupAndCallBinaryNode getItemNode ) {
205235 return getToSulongNode ().execute (getItemNode .executeObject (object , idx ));
206236 }
@@ -515,7 +545,7 @@ Object doPtrArrayMultiCtx(@SuppressWarnings("unused") PSequence object) {
515545 }
516546
517547 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 ;
519549 }
520550
521551 public static GetTypeIDNode create () {
0 commit comments