35
35
import java .lang .constant .ConstantDescs ;
36
36
import java .lang .constant .MethodTypeDesc ;
37
37
import java .lang .reflect .AccessFlag ;
38
+ import java .util .Arrays ;
39
+ import java .util .Comparator ;
38
40
import java .util .List ;
39
41
import java .util .Objects ;
40
- import java .util .TreeMap ;
41
42
42
43
import static java .lang .classfile .ClassFile .*;
43
44
@@ -46,6 +47,7 @@ public class StackMapDecoder {
46
47
private static final int
47
48
SAME_LOCALS_1_STACK_ITEM_EXTENDED = 247 ,
48
49
SAME_EXTENDED = 251 ;
50
+ private static final StackMapFrameInfo [] NO_STACK_FRAME_INFOS = new StackMapFrameInfo [0 ];
49
51
50
52
private final ClassReader classReader ;
51
53
private final int pos ;
@@ -103,15 +105,20 @@ public static void writeFrames(BufWriter b, List<StackMapFrameInfo> entries) {
103
105
mi .methodTypeSymbol (),
104
106
(mi .methodFlags () & ACC_STATIC ) != 0 );
105
107
int prevOffset = -1 ;
106
- var map = new TreeMap <Integer , StackMapFrameInfo >();
108
+ // avoid using method handles due to early bootstrap
109
+ StackMapFrameInfo [] infos = entries .toArray (NO_STACK_FRAME_INFOS );
107
110
//sort by resolved label offsets first to allow unordered entries
108
- for (var fr : entries ) {
109
- map .put (dcb .labelToBci (fr .target ()), fr );
110
- }
111
- b .writeU2 (map .size ());
112
- for (var me : map .entrySet ()) {
113
- int offset = me .getKey ();
114
- var fr = me .getValue ();
111
+ Arrays .sort (infos , new Comparator <StackMapFrameInfo >() {
112
+ public int compare (final StackMapFrameInfo o1 , final StackMapFrameInfo o2 ) {
113
+ return Integer .compare (dcb .labelToBci (o1 .target ()), dcb .labelToBci (o2 .target ()));
114
+ }
115
+ });
116
+ b .writeU2 (infos .length );
117
+ for (var fr : infos ) {
118
+ int offset = dcb .labelToBci (fr .target ());
119
+ if (offset == prevOffset ) {
120
+ throw new IllegalArgumentException ("Duplicated stack frame bytecode index: " + offset );
121
+ }
115
122
writeFrame (buf , offset - prevOffset - 1 , prevLocals , fr );
116
123
prevOffset = offset ;
117
124
prevLocals = fr .locals ();
0 commit comments