29
29
import org .jruby .truffle .runtime .UndefinedPlaceholder ;
30
30
import org .jruby .truffle .runtime .control .RaiseException ;
31
31
import org .jruby .truffle .runtime .core .*;
32
- import org .jruby .truffle .runtime .hash .Entry ;
33
- import org .jruby .truffle .runtime .hash .HashOperations ;
34
- import org .jruby .truffle .runtime .hash .HashSearchResult ;
35
- import org .jruby .truffle .runtime .hash .KeyValue ;
32
+ import org .jruby .truffle .runtime .hash .*;
36
33
import org .jruby .truffle .runtime .methods .InternalMethod ;
37
34
38
35
import java .util .Arrays ;
@@ -58,9 +55,9 @@ public Object construct(VirtualFrame frame, RubyClass hashClass, Object[] args)
58
55
final Object [] store = (Object []) array .getStore ();
59
56
60
57
final int size = array .getSize ();
61
- final Object [] newStore = new Object [HashOperations . SMALL_HASH_SIZE * 2 ];
58
+ final Object [] newStore = new Object [PackedArrayStrategy . TRUFFLE_HASH_PACKED_ARRAY_MAX * 2 ];
62
59
63
- for (int n = 0 ; n < HashOperations . SMALL_HASH_SIZE ; n ++) {
60
+ for (int n = 0 ; n < PackedArrayStrategy . TRUFFLE_HASH_PACKED_ARRAY_MAX ; n ++) {
64
61
if (n < size ) {
65
62
final Object pair = store [n ];
66
63
@@ -77,9 +74,7 @@ public Object construct(VirtualFrame frame, RubyClass hashClass, Object[] args)
77
74
}
78
75
79
76
final Object [] pairStore = (Object []) pairArray .getStore ();
80
-
81
- newStore [n * 2 ] = pairStore [0 ];
82
- newStore [n * 2 + 1 ] = pairStore [1 ];
77
+ PackedArrayStrategy .setKeyValue (newStore , n , pairStore [0 ], pairStore [1 ]);
83
78
}
84
79
}
85
80
@@ -110,7 +105,7 @@ public static boolean isSmallArrayOfPairs(RubyClass hashClass, Object[] args) {
110
105
111
106
final Object [] store = (Object []) array .getStore ();
112
107
113
- if (store .length > HashOperations . SMALL_HASH_SIZE ) {
108
+ if (store .length > PackedArrayStrategy . TRUFFLE_HASH_PACKED_ARRAY_MAX ) {
114
109
return false ;
115
110
}
116
111
@@ -165,18 +160,18 @@ public Object getPackedArray(VirtualFrame frame, RubyHash hash, Object key) {
165
160
final Object [] store = (Object []) hash .getStore ();
166
161
final int size = hash .getSize ();
167
162
168
- for (int n = 0 ; n < HashOperations . SMALL_HASH_SIZE ; n ++) {
163
+ for (int n = 0 ; n < PackedArrayStrategy . TRUFFLE_HASH_PACKED_ARRAY_MAX ; n ++) {
169
164
if (n < size ) {
170
165
final boolean equal ;
171
166
172
167
if (byIdentityProfile .profile (hash .isCompareByIdentity ())) {
173
- equal = equalNode .executeReferenceEqual (frame , key , store [ n * 2 ] );
168
+ equal = equalNode .executeReferenceEqual (frame , key , PackedArrayStrategy . getKey ( store , n ) );
174
169
} else {
175
- equal = eqlNode .callBoolean (frame , key , "eql?" , null , store [ n * 2 ] );
170
+ equal = eqlNode .callBoolean (frame , key , "eql?" , null , PackedArrayStrategy . getKey ( store , n ) );
176
171
}
177
172
178
173
if (equal ) {
179
- return store [ n * 2 + 1 ] ;
174
+ return PackedArrayStrategy . getValue ( store , n ) ;
180
175
}
181
176
}
182
177
}
@@ -255,7 +250,7 @@ public SetIndexNode(RubyContext context, SourceSection sourceSection) {
255
250
256
251
@ Specialization (guards = { "isNullStorage(hash)" , "!isRubyString(key)" })
257
252
public Object setNull (VirtualFrame frame , RubyHash hash , Object key , Object value ) {
258
- final Object [] store = new Object [HashOperations . SMALL_HASH_SIZE * 2 ];
253
+ final Object [] store = new Object [PackedArrayStrategy . TRUFFLE_HASH_PACKED_ARRAY_MAX * 2 ];
259
254
hashNode .call (frame , key , "hash" , null );
260
255
store [0 ] = key ;
261
256
store [1 ] = value ;
@@ -281,18 +276,18 @@ public Object setPackedArray(VirtualFrame frame, RubyHash hash, Object key, Obje
281
276
final Object [] store = (Object []) hash .getStore ();
282
277
final int size = hash .getSize ();
283
278
284
- for (int n = 0 ; n < HashOperations . SMALL_HASH_SIZE ; n ++) {
279
+ for (int n = 0 ; n < PackedArrayStrategy . TRUFFLE_HASH_PACKED_ARRAY_MAX ; n ++) {
285
280
if (n < size ) {
286
281
final boolean equal ;
287
282
288
283
if (byIdentityProfile .profile (hash .isCompareByIdentity ())) {
289
- equal = equalNode .executeReferenceEqual (frame , key , store [ n * 2 ] );
284
+ equal = equalNode .executeReferenceEqual (frame , key , PackedArrayStrategy . getKey ( store , n ) );
290
285
} else {
291
- equal = eqlNode .callBoolean (frame , key , "eql?" , null , store [ n * 2 ] );
286
+ equal = eqlNode .callBoolean (frame , key , "eql?" , null , PackedArrayStrategy . getKey ( store , n ) );
292
287
}
293
288
294
289
if (equal ) {
295
- store [ n * 2 + 1 ] = value ;
290
+ PackedArrayStrategy . setValue ( store , n , value ) ;
296
291
return value ;
297
292
}
298
293
}
@@ -302,7 +297,7 @@ public Object setPackedArray(VirtualFrame frame, RubyHash hash, Object key, Obje
302
297
303
298
final int newSize = size + 1 ;
304
299
305
- if (newSize <= HashOperations . SMALL_HASH_SIZE ) {
300
+ if (newSize <= PackedArrayStrategy . TRUFFLE_HASH_PACKED_ARRAY_MAX ) {
306
301
extendProfile .enter ();
307
302
store [size * 2 ] = key ;
308
303
store [size * 2 + 1 ] = value ;
@@ -459,9 +454,9 @@ public Object deletePackedArray(VirtualFrame frame, RubyHash hash, Object key, O
459
454
final Object [] store = (Object []) hash .getStore ();
460
455
final int size = hash .getSize ();
461
456
462
- for (int n = 0 ; n < HashOperations . SMALL_HASH_SIZE ; n ++) {
463
- if (n < size && eqlNode .callBoolean (frame , store [ n * 2 ] , "eql?" , null , key )) {
464
- final Object value = store [ n * 2 + 1 ] ;
457
+ for (int n = 0 ; n < PackedArrayStrategy . TRUFFLE_HASH_PACKED_ARRAY_MAX ; n ++) {
458
+ if (n < size && eqlNode .callBoolean (frame , PackedArrayStrategy . getKey ( store , n ) , "eql?" , null , key )) {
459
+ final Object value = PackedArrayStrategy . getValue ( store , n ) ;
465
460
466
461
// Move the later values down
467
462
int k = n * 2 ; // position of the key
@@ -549,13 +544,13 @@ public RubyHash eachPackedArray(VirtualFrame frame, RubyHash hash, RubyProc bloc
549
544
int count = 0 ;
550
545
551
546
try {
552
- for (int n = 0 ; n < HashOperations . SMALL_HASH_SIZE ; n ++) {
547
+ for (int n = 0 ; n < PackedArrayStrategy . TRUFFLE_HASH_PACKED_ARRAY_MAX ; n ++) {
553
548
if (CompilerDirectives .inInterpreter ()) {
554
549
count ++;
555
550
}
556
551
557
552
if (n < size ) {
558
- yield(frame , block , new RubyArray (getContext ().getCoreLibrary ().getArrayClass (), new Object []{store [ n * 2 ], store [ n * 2 + 1 ] }, 2 ));
553
+ yield(frame , block , new RubyArray (getContext ().getCoreLibrary ().getArrayClass (), new Object []{PackedArrayStrategy . getKey ( store , n ), PackedArrayStrategy . getValue ( store , n ) }, 2 ));
559
554
}
560
555
}
561
556
} finally {
@@ -688,7 +683,7 @@ public RubyHash dupPackedArray(RubyHash self, RubyHash from) {
688
683
}
689
684
690
685
final Object [] store = (Object []) from .getStore ();
691
- self .setStore (Arrays .copyOf (store , HashOperations . SMALL_HASH_SIZE * 2 ), from .getSize (), null , null );
686
+ self .setStore (Arrays .copyOf (store , PackedArrayStrategy . TRUFFLE_HASH_PACKED_ARRAY_MAX * 2 ), from .getSize (), null , null );
692
687
693
688
copyOther (self , from );
694
689
@@ -747,10 +742,10 @@ public RubyArray mapPackedArray(VirtualFrame frame, RubyHash hash, RubyProc bloc
747
742
int count = 0 ;
748
743
749
744
try {
750
- for (int n = 0 ; n < HashOperations . SMALL_HASH_SIZE ; n ++) {
745
+ for (int n = 0 ; n < PackedArrayStrategy . TRUFFLE_HASH_PACKED_ARRAY_MAX ; n ++) {
751
746
if (n < size ) {
752
- final Object key = store [ n * 2 ] ;
753
- final Object value = store [ n * 2 + 1 ] ;
747
+ final Object key = PackedArrayStrategy . getKey ( store , n ) ;
748
+ final Object value = PackedArrayStrategy . getValue ( store , n ) ;
754
749
result [n ] = yield (frame , block , key , value );
755
750
756
751
if (CompilerDirectives .inInterpreter ()) {
@@ -795,7 +790,7 @@ public abstract static class MergeNode extends YieldingCoreMethodNode {
795
790
private final BranchProfile considerResultIsSmallProfile = BranchProfile .create ();
796
791
private final BranchProfile resultIsSmallProfile = BranchProfile .create ();
797
792
798
- private final int smallHashSize = HashOperations . SMALL_HASH_SIZE ;
793
+ private final int smallHashSize = PackedArrayStrategy . TRUFFLE_HASH_PACKED_ARRAY_MAX ;
799
794
800
795
public MergeNode (RubyContext context , SourceSection sourceSection ) {
801
796
super (context , sourceSection );
@@ -805,7 +800,7 @@ public MergeNode(RubyContext context, SourceSection sourceSection) {
805
800
@ Specialization (guards = {"isPackedArrayStorage(hash)" , "isNullStorage(other)" , "!isCompareByIdentity(hash)" })
806
801
public RubyHash mergePackedArrayNull (RubyHash hash , RubyHash other , UndefinedPlaceholder block ) {
807
802
final Object [] store = (Object []) hash .getStore ();
808
- final Object [] copy = Arrays .copyOf (store , HashOperations . SMALL_HASH_SIZE * 2 );
803
+ final Object [] copy = Arrays .copyOf (store , PackedArrayStrategy . TRUFFLE_HASH_PACKED_ARRAY_MAX * 2 );
809
804
810
805
return new RubyHash (hash .getLogicalClass (), hash .getDefaultBlock (), hash .getDefaultValue (), copy , hash .getSize (), null );
811
806
}
@@ -826,11 +821,11 @@ public RubyHash mergePackedArrayPackedArray(VirtualFrame frame, RubyHash hash, R
826
821
827
822
int conflictsCount = 0 ;
828
823
829
- for (int a = 0 ; a < HashOperations . SMALL_HASH_SIZE ; a ++) {
824
+ for (int a = 0 ; a < PackedArrayStrategy . TRUFFLE_HASH_PACKED_ARRAY_MAX ; a ++) {
830
825
if (a < storeASize ) {
831
826
boolean merge = true ;
832
827
833
- for (int b = 0 ; b < HashOperations . SMALL_HASH_SIZE ; b ++) {
828
+ for (int b = 0 ; b < PackedArrayStrategy . TRUFFLE_HASH_PACKED_ARRAY_MAX ; b ++) {
834
829
if (b < storeBSize ) {
835
830
if (eqlNode .callBoolean (frame , storeA [a * 2 ], "eql?" , null , storeB [b * 2 ])) {
836
831
conflictsCount ++;
@@ -850,14 +845,14 @@ public RubyHash mergePackedArrayPackedArray(VirtualFrame frame, RubyHash hash, R
850
845
851
846
if (mergeFromACount == 0 ) {
852
847
nothingFromFirstProfile .enter ();
853
- return new RubyHash (hash .getLogicalClass (), hash .getDefaultBlock (), hash .getDefaultValue (), Arrays .copyOf (storeB , HashOperations . SMALL_HASH_SIZE * 2 ), storeBSize , null );
848
+ return new RubyHash (hash .getLogicalClass (), hash .getDefaultBlock (), hash .getDefaultValue (), Arrays .copyOf (storeB , PackedArrayStrategy . TRUFFLE_HASH_PACKED_ARRAY_MAX * 2 ), storeBSize , null );
854
849
}
855
850
856
851
considerNothingFromSecondProfile .enter ();
857
852
858
853
if (conflictsCount == storeBSize ) {
859
854
nothingFromSecondProfile .enter ();
860
- return new RubyHash (hash .getLogicalClass (), hash .getDefaultBlock (), hash .getDefaultValue (), Arrays .copyOf (storeA , HashOperations . SMALL_HASH_SIZE * 2 ), storeASize , null );
855
+ return new RubyHash (hash .getLogicalClass (), hash .getDefaultBlock (), hash .getDefaultValue (), Arrays .copyOf (storeA , PackedArrayStrategy . TRUFFLE_HASH_PACKED_ARRAY_MAX * 2 ), storeASize , null );
861
856
}
862
857
863
858
considerResultIsSmallProfile .enter ();
@@ -867,21 +862,21 @@ public RubyHash mergePackedArrayPackedArray(VirtualFrame frame, RubyHash hash, R
867
862
if (storeBSize + mergeFromACount <= smallHashSize ) {
868
863
resultIsSmallProfile .enter ();
869
864
870
- final Object [] merged = new Object [HashOperations . SMALL_HASH_SIZE * 2 ];
865
+ final Object [] merged = new Object [PackedArrayStrategy . TRUFFLE_HASH_PACKED_ARRAY_MAX * 2 ];
871
866
872
867
int index = 0 ;
873
868
874
869
for (int n = 0 ; n < storeASize ; n ++) {
875
870
if (mergeFromA [n ]) {
876
- merged [index ] = storeA [ n * 2 ] ;
877
- merged [index + 1 ] = storeA [ n * 2 + 1 ] ;
871
+ merged [index ] = PackedArrayStrategy . getKey ( storeA , n ) ;
872
+ merged [index + 1 ] = PackedArrayStrategy . getValue ( storeA , n ) ;
878
873
index += 2 ;
879
874
}
880
875
}
881
876
882
877
for (int n = 0 ; n < storeBSize ; n ++) {
883
- merged [index ] = storeB [ n * 2 ] ;
884
- merged [index + 1 ] = storeB [ n * 2 + 1 ] ;
878
+ merged [index ] = PackedArrayStrategy . getKey ( storeB , n ) ;
879
+ merged [index + 1 ] = PackedArrayStrategy . getValue ( storeB , n ) ;
885
880
index += 2 ;
886
881
}
887
882
@@ -1026,7 +1021,7 @@ public RubyArray shiftPackedArray(RubyHash hash) {
1026
1021
final Object key = store [0 ];
1027
1022
final Object value = store [1 ];
1028
1023
1029
- System .arraycopy (store , 2 , store , 0 , HashOperations . SMALL_HASH_SIZE * 2 - 2 );
1024
+ System .arraycopy (store , 2 , store , 0 , PackedArrayStrategy . TRUFFLE_HASH_PACKED_ARRAY_MAX * 2 - 2 );
1030
1025
1031
1026
hash .setSize (hash .getSize () - 1 );
1032
1027
0 commit comments