@@ -471,8 +471,22 @@ private IsBuiltinClassProfile getIsOverflowErrorProfile() {
471
471
abstract static class ReadBytesAtNode extends Node {
472
472
public abstract void execute (byte [] dest , int destOffset , int len , PMemoryView self , Object ptr , int offset );
473
473
474
- @ Specialization (guards = "ptr != null" )
475
- static void doNative (byte [] dest , int destOffset , int len , @ SuppressWarnings ("unused" ) PMemoryView self , Object ptr , int offset ,
474
+ @ Specialization (guards = {"ptr != null" , "cachedLen == len" , "cachedLen <= 8" }, limit = "4" )
475
+ @ ExplodeLoop
476
+ static void doNativeCached (byte [] dest , int destOffset , @ SuppressWarnings ("unused" ) int len , @ SuppressWarnings ("unused" ) PMemoryView self , Object ptr , int offset ,
477
+ @ Cached ("len" ) int cachedLen ,
478
+ @ CachedLibrary (limit = "1" ) InteropLibrary lib ) {
479
+ try {
480
+ for (int i = 0 ; i < cachedLen ; i ++) {
481
+ dest [destOffset + i ] = (byte ) lib .readArrayElement (ptr , offset + i );
482
+ }
483
+ } catch (UnsupportedMessageException | InvalidArrayIndexException e ) {
484
+ throw CompilerDirectives .shouldNotReachHere ("native buffer read failed" );
485
+ }
486
+ }
487
+
488
+ @ Specialization (guards = "ptr != null" , replaces = "doNativeCached" )
489
+ static void doNativeGeneric (byte [] dest , int destOffset , int len , @ SuppressWarnings ("unused" ) PMemoryView self , Object ptr , int offset ,
476
490
@ CachedLibrary (limit = "1" ) InteropLibrary lib ) {
477
491
try {
478
492
for (int i = 0 ; i < len ; i ++) {
@@ -483,8 +497,21 @@ static void doNative(byte[] dest, int destOffset, int len, @SuppressWarnings("un
483
497
}
484
498
}
485
499
486
- @ Specialization (guards = "ptr == null" )
487
- static void doManaged (byte [] dest , int destOffset , int len , PMemoryView self , @ SuppressWarnings ("unused" ) Object ptr , int offset ,
500
+ @ Specialization (guards = {"ptr == null" , "cachedLen == len" , "cachedLen <= 8" }, limit = "4" )
501
+ @ ExplodeLoop
502
+ static void doManagedCached (byte [] dest , int destOffset , @ SuppressWarnings ("unused" ) int len , PMemoryView self , @ SuppressWarnings ("unused" ) Object ptr , int offset ,
503
+ @ Cached ("len" ) int cachedLen ,
504
+ @ Cached SequenceNodes .GetSequenceStorageNode getStorageNode ,
505
+ @ Cached SequenceStorageNodes .GetItemScalarNode getItemNode ) {
506
+ // TODO assumes byte storage
507
+ SequenceStorage storage = getStorageNode .execute (self .getOwner ());
508
+ for (int i = 0 ; i < cachedLen ; i ++) {
509
+ dest [destOffset + i ] = (byte ) getItemNode .executeInt (storage , offset + i );
510
+ }
511
+ }
512
+
513
+ @ Specialization (guards = "ptr == null" , replaces = "doManagedCached" )
514
+ static void doManagedGeneric (byte [] dest , int destOffset , int len , PMemoryView self , @ SuppressWarnings ("unused" ) Object ptr , int offset ,
488
515
@ Cached SequenceNodes .GetSequenceStorageNode getStorageNode ,
489
516
@ Cached SequenceStorageNodes .GetItemScalarNode getItemNode ) {
490
517
// TODO assumes byte storage
@@ -499,8 +526,22 @@ static void doManaged(byte[] dest, int destOffset, int len, PMemoryView self, @S
499
526
abstract static class WriteBytesAtNode extends Node {
500
527
public abstract void execute (byte [] src , int srcOffset , int len , PMemoryView self , Object ptr , int offset );
501
528
502
- @ Specialization (guards = "ptr != null" )
503
- static void doNative (byte [] src , int srcOffset , int len , @ SuppressWarnings ("unused" ) PMemoryView self , Object ptr , int offset ,
529
+ @ Specialization (guards = {"ptr != null" , "cachedLen == len" , "cachedLen <= 8" }, limit = "4" )
530
+ @ ExplodeLoop
531
+ static void doNativeCached (byte [] src , int srcOffset , @ SuppressWarnings ("unused" ) int len , @ SuppressWarnings ("unused" ) PMemoryView self , Object ptr , int offset ,
532
+ @ Cached ("len" ) int cachedLen ,
533
+ @ CachedLibrary (limit = "1" ) InteropLibrary lib ) {
534
+ try {
535
+ for (int i = 0 ; i < cachedLen ; i ++) {
536
+ lib .writeArrayElement (ptr , offset + i , src [srcOffset + i ]);
537
+ }
538
+ } catch (UnsupportedMessageException | InvalidArrayIndexException | UnsupportedTypeException e ) {
539
+ throw CompilerDirectives .shouldNotReachHere ("native buffer read failed" );
540
+ }
541
+ }
542
+
543
+ @ Specialization (guards = "ptr != null" , replaces = "doNativeCached" )
544
+ static void doNativeGeneric (byte [] src , int srcOffset , int len , @ SuppressWarnings ("unused" ) PMemoryView self , Object ptr , int offset ,
504
545
@ CachedLibrary (limit = "1" ) InteropLibrary lib ) {
505
546
try {
506
547
for (int i = 0 ; i < len ; i ++) {
@@ -511,8 +552,21 @@ static void doNative(byte[] src, int srcOffset, int len, @SuppressWarnings("unus
511
552
}
512
553
}
513
554
514
- @ Specialization (guards = "ptr == null" )
515
- static void doManaged (byte [] src , int srcOffset , int len , PMemoryView self , @ SuppressWarnings ("unused" ) Object ptr , int offset ,
555
+ @ Specialization (guards = {"ptr == null" , "cachedLen == len" , "cachedLen <= 8" }, limit = "4" )
556
+ @ ExplodeLoop
557
+ static void doManagedCached (byte [] src , int srcOffset , @ SuppressWarnings ("unused" ) int len , PMemoryView self , @ SuppressWarnings ("unused" ) Object ptr , int offset ,
558
+ @ Cached ("len" ) int cachedLen ,
559
+ @ Cached SequenceNodes .GetSequenceStorageNode getStorageNode ,
560
+ @ Cached SequenceStorageNodes .SetItemScalarNode setItemNode ) {
561
+ // TODO assumes byte storage
562
+ SequenceStorage storage = getStorageNode .execute (self .getOwner ());
563
+ for (int i = 0 ; i < cachedLen ; i ++) {
564
+ setItemNode .execute (storage , offset + i , src [srcOffset + i ]);
565
+ }
566
+ }
567
+
568
+ @ Specialization (guards = "ptr == null" , replaces = "doManagedCached" )
569
+ static void doManagedGeneric (byte [] src , int srcOffset , int len , PMemoryView self , @ SuppressWarnings ("unused" ) Object ptr , int offset ,
516
570
@ Cached SequenceNodes .GetSequenceStorageNode getStorageNode ,
517
571
@ Cached SequenceStorageNodes .SetItemScalarNode setItemNode ) {
518
572
// TODO assumes byte storage
@@ -526,7 +580,7 @@ static void doManaged(byte[] src, int srcOffset, int len, PMemoryView self, @Sup
526
580
abstract static class ReadItemAtNode extends Node {
527
581
public abstract Object execute (PMemoryView self , Object ptr , int offset );
528
582
529
- @ Specialization (guards = {"ptr != null" , "cachedItemSize == self.getItemSize()" , "cachedItemSize <= 8" })
583
+ @ Specialization (guards = {"ptr != null" , "cachedItemSize == self.getItemSize()" , "cachedItemSize <= 8" }, limit = "4" )
530
584
@ ExplodeLoop
531
585
static Object doNativeCached (PMemoryView self , Object ptr , int offset ,
532
586
@ Cached ("self.getItemSize()" ) int cachedItemSize ,
@@ -559,7 +613,7 @@ static Object doNativeGeneric(PMemoryView self, Object ptr, int offset,
559
613
return unpackValueNode .execute (self .getFormat (), self .getFormatString (), bytes );
560
614
}
561
615
562
- @ Specialization (guards = {"ptr == null" , "cachedItemSize == self.getItemSize()" , "cachedItemSize <= 8" })
616
+ @ Specialization (guards = {"ptr == null" , "cachedItemSize == self.getItemSize()" , "cachedItemSize <= 8" }, limit = "4" )
563
617
@ ExplodeLoop
564
618
static Object doManagedCached (PMemoryView self , @ SuppressWarnings ("unused" ) Object ptr , int offset ,
565
619
@ Cached ("self.getItemSize()" ) int cachedItemSize ,
@@ -592,7 +646,7 @@ static Object doManagedGeneric(PMemoryView self, @SuppressWarnings("unused") Obj
592
646
abstract static class WriteItemAtNode extends Node {
593
647
public abstract void execute (VirtualFrame frame , PMemoryView self , Object ptr , int offset , Object object );
594
648
595
- @ Specialization (guards = {"ptr != null" , "cachedItemSize == self.getItemSize()" , "cachedItemSize <= 8" })
649
+ @ Specialization (guards = {"ptr != null" , "cachedItemSize == self.getItemSize()" , "cachedItemSize <= 8" }, limit = "4" )
596
650
@ ExplodeLoop
597
651
static void doNativeCached (VirtualFrame frame , PMemoryView self , Object ptr , int offset , Object object ,
598
652
@ Cached ("self.getItemSize()" ) int cachedItemSize ,
@@ -625,7 +679,7 @@ static void doNativeGeneric(VirtualFrame frame, PMemoryView self, Object ptr, in
625
679
}
626
680
}
627
681
628
- @ Specialization (guards = {"ptr == null" , "cachedItemSize == self.getItemSize()" , "cachedItemSize <= 8" })
682
+ @ Specialization (guards = {"ptr == null" , "cachedItemSize == self.getItemSize()" , "cachedItemSize <= 8" }, limit = "4" )
629
683
@ ExplodeLoop
630
684
static void doManagedCached (VirtualFrame frame , PMemoryView self , @ SuppressWarnings ("unused" ) Object ptr , int offset , Object object ,
631
685
@ Cached ("self.getItemSize()" ) int cachedItemSize ,
0 commit comments