40
40
import static com .oracle .graal .python .nodes .SpecialMethodNames .__GT__ ;
41
41
import static com .oracle .graal .python .nodes .SpecialMethodNames .__LE__ ;
42
42
import static com .oracle .graal .python .nodes .SpecialMethodNames .__LT__ ;
43
+ import static com .oracle .graal .python .runtime .exception .PythonErrorType .IndexError ;
43
44
import static com .oracle .graal .python .runtime .exception .PythonErrorType .MemoryError ;
44
45
import static com .oracle .graal .python .runtime .exception .PythonErrorType .OverflowError ;
45
46
import static com .oracle .graal .python .runtime .exception .PythonErrorType .SystemError ;
@@ -2150,17 +2151,31 @@ public abstract static class CopyBytesFromByteStorage extends PNodeWithContext {
2150
2151
public abstract void execute (SequenceStorage src , int srcPos , byte [] dest , int destPos , int length );
2151
2152
2152
2153
@ Specialization
2153
- static void doByteSequenceStorage (ByteSequenceStorage src , int srcPos , byte [] dest , int destPos , int length ) {
2154
- PythonUtils .arraycopy (src .getInternalByteArray (), srcPos , dest , destPos , length );
2154
+ static void doByteSequenceStorage (ByteSequenceStorage src , int srcPos , byte [] dest , int destPos , int length ,
2155
+ @ Cached PRaiseNode raiseNode ) {
2156
+ try {
2157
+ PythonUtils .arraycopy (src .getInternalByteArray (), srcPos , dest , destPos , length );
2158
+ } catch (ArrayIndexOutOfBoundsException e ) {
2159
+ CompilerDirectives .transferToInterpreterAndInvalidate ();
2160
+ // This can happen when the array gets resized while being exported
2161
+ throw raiseNode .raise (IndexError , ErrorMessages .INVALID_BUFFER_ACCESS );
2162
+ }
2155
2163
}
2156
2164
2157
2165
@ Specialization (guards = "isByteStorage(src)" )
2158
2166
static void doNativeByte (NativeSequenceStorage src , int srcPos , byte [] dest , int destPos , int length ,
2159
- @ Cached GetItemScalarNode getItemNode ) {
2160
- for (int i = 0 ; i < length ; i ++) {
2161
- int elem = getItemNode .executeInt (src , srcPos + i );
2162
- assert elem >= 0 && elem < 256 ;
2163
- dest [destPos + i ] = (byte ) elem ;
2167
+ @ Cached GetItemScalarNode getItemNode ,
2168
+ @ Cached PRaiseNode raiseNode ) {
2169
+ try {
2170
+ for (int i = 0 ; i < length ; i ++) {
2171
+ int elem = getItemNode .executeInt (src , srcPos + i );
2172
+ assert elem >= 0 && elem < 256 ;
2173
+ dest [destPos + i ] = (byte ) elem ;
2174
+ }
2175
+ } catch (PException e ) {
2176
+ CompilerDirectives .transferToInterpreterAndInvalidate ();
2177
+ // This can happen when the array gets resized while being exported
2178
+ throw raiseNode .raise (IndexError , ErrorMessages .INVALID_BUFFER_ACCESS );
2164
2179
}
2165
2180
}
2166
2181
}
@@ -2172,15 +2187,29 @@ public abstract static class CopyBytesToByteStorage extends PNodeWithContext {
2172
2187
public abstract void execute (byte [] src , int srcPos , SequenceStorage dest , int destPos , int length );
2173
2188
2174
2189
@ Specialization
2175
- static void doByteSequenceStorage (byte [] src , int srcPos , ByteSequenceStorage dest , int destPos , int length ) {
2176
- PythonUtils .arraycopy (src , srcPos , dest .getInternalByteArray (), destPos , length );
2190
+ static void doByteSequenceStorage (byte [] src , int srcPos , ByteSequenceStorage dest , int destPos , int length ,
2191
+ @ Cached PRaiseNode raiseNode ) {
2192
+ try {
2193
+ PythonUtils .arraycopy (src , srcPos , dest .getInternalByteArray (), destPos , length );
2194
+ } catch (ArrayIndexOutOfBoundsException e ) {
2195
+ CompilerDirectives .transferToInterpreterAndInvalidate ();
2196
+ // This can happen when the array gets resized while being exported
2197
+ throw raiseNode .raise (IndexError , ErrorMessages .INVALID_BUFFER_ACCESS );
2198
+ }
2177
2199
}
2178
2200
2179
2201
@ Specialization (guards = "isByteStorage(dest)" )
2180
2202
static void doNativeByte (byte [] src , int srcPos , NativeSequenceStorage dest , int destPos , int length ,
2181
- @ Cached SetItemScalarNode setItemNode ) {
2182
- for (int i = 0 ; i < length ; i ++) {
2183
- setItemNode .execute (dest , destPos + i , src [srcPos + i ]);
2203
+ @ Cached SetItemScalarNode setItemNode ,
2204
+ @ Cached PRaiseNode raiseNode ) {
2205
+ try {
2206
+ for (int i = 0 ; i < length ; i ++) {
2207
+ setItemNode .execute (dest , destPos + i , src [srcPos + i ]);
2208
+ }
2209
+ } catch (PException e ) {
2210
+ CompilerDirectives .transferToInterpreterAndInvalidate ();
2211
+ // This can happen when the array gets resized while being exported
2212
+ throw raiseNode .raise (IndexError , ErrorMessages .INVALID_BUFFER_ACCESS );
2184
2213
}
2185
2214
}
2186
2215
}
0 commit comments