@@ -409,7 +409,7 @@ public String describe() {
409
409
410
410
public void thrown (String ex ) {
411
411
sp = sbase ;
412
- stack [sp ++] = 'L' +ex +';' ;
412
+ stack [sp ++] = ( 'L' +ex +';' ). intern () ;
413
413
}
414
414
415
415
private void pushReturn (String s ) {
@@ -445,7 +445,7 @@ public void execute(int index, AbstractInsnNode anode) {
445
445
switch (anode .getType ()) {
446
446
case AbstractInsnNode .VAR_INSN :
447
447
vi = (VarInsnNode ) anode ;
448
- if (vi .var != 0 && ("D" . equals ( stack [vi .var -1 ]) || "J" . equals ( stack [vi .var -1 ]) ))
448
+ if (vi .var != 0 && ("D" == stack [vi .var -1 ] || "J" == stack [vi .var -1 ]))
449
449
stack [vi .var -1 ] = "T" ;
450
450
break ;
451
451
case AbstractInsnNode .TYPE_INSN :
@@ -475,13 +475,13 @@ public void execute(int index, AbstractInsnNode anode) {
475
475
stack [sp ++] = stack [vi .var ];
476
476
break ;
477
477
case Opcodes .ANEWARRAY :
478
- stack [sp -1 ] = "[" + tidesc ;
478
+ stack [sp -1 ] = ( "[" + tidesc ). intern () ;
479
479
break ;
480
480
case Opcodes .ASTORE :
481
481
stack [vi .var ] = stack [--sp ];
482
482
break ;
483
483
case Opcodes .CHECKCAST :
484
- stack [sp -1 ] = tidesc ;
484
+ stack [sp -1 ] = tidesc . intern () ;
485
485
break ;
486
486
case Opcodes .DSTORE :
487
487
stack [vi .var ] = "D" ;
@@ -491,7 +491,7 @@ public void execute(int index, AbstractInsnNode anode) {
491
491
case Opcodes .DUP2 :
492
492
// [b] a -> [b] a [b] a
493
493
a = stack [--sp ];
494
- b = ("D" . equals ( a ) || "J" . equals ( a ) ) ? "X" : stack [--sp ];
494
+ b = ("D" == a || "J" == a ) ? "X" : stack [--sp ];
495
495
496
496
if (!"X" .equals (b )) stack [sp ++] = b ;
497
497
stack [sp ++] = a ;
@@ -501,27 +501,27 @@ public void execute(int index, AbstractInsnNode anode) {
501
501
case Opcodes .DUP2_X1 :
502
502
// c [b] a -> [b] a c [b] a
503
503
a = stack [--sp ];
504
- b = ("D" . equals ( a ) || "J" . equals ( a ) ) ? "X" : stack [--sp ];
504
+ b = ("D" == a || "J" == a ) ? "X" : stack [--sp ];
505
505
c = stack [--sp ];
506
506
507
- if (! "X" . equals ( b ) ) stack [sp ++] = b ;
507
+ if ("X" != b ) stack [sp ++] = b ;
508
508
stack [sp ++] = a ;
509
509
stack [sp ++] = c ;
510
- if (! "X" . equals ( b ) ) stack [sp ++] = b ;
510
+ if ("X" != b ) stack [sp ++] = b ;
511
511
stack [sp ++] = a ;
512
512
break ;
513
513
case Opcodes .DUP2_X2 :
514
514
// [d] c [b] a -> b a d c b a
515
515
a = stack [--sp ];
516
- b = ("D" . equals ( a ) || "J" . equals ( a ) ) ? "X" : stack [--sp ];
516
+ b = ("D" == a || "J" == a ) ? "X" : stack [--sp ];
517
517
c = stack [--sp ];
518
- d = ("D" . equals ( c ) || "J" . equals ( c ) ) ? "X" : stack [--sp ];
518
+ d = ("D" == c || "J" == c ) ? "X" : stack [--sp ];
519
519
520
- if (! "X" . equals ( b ) ) stack [sp ++] = b ;
520
+ if ("X" != b ) stack [sp ++] = b ;
521
521
stack [sp ++] = a ;
522
- if (! "X" . equals ( d ) ) stack [sp ++] = d ;
522
+ if ("X" != d ) stack [sp ++] = d ;
523
523
stack [sp ++] = c ;
524
- if (! "X" . equals ( b ) ) stack [sp ++] = b ;
524
+ if ("X" != b ) stack [sp ++] = b ;
525
525
stack [sp ++] = a ;
526
526
527
527
break ;
@@ -544,10 +544,10 @@ public void execute(int index, AbstractInsnNode anode) {
544
544
// [d] c a -> a [d] c a
545
545
a = stack [--sp ];
546
546
c = stack [--sp ];
547
- d = ("D" . equals ( c ) || "J" . equals ( c ) ) ? "X" : stack [--sp ];
547
+ d = ("D" == c || "J" == c ) ? "X" : stack [--sp ];
548
548
549
549
stack [sp ++] = a ;
550
- if (! "X" . equals ( d ) ) stack [sp ++] = d ;
550
+ if ("X" != d ) stack [sp ++] = d ;
551
551
stack [sp ++] = c ;
552
552
stack [sp ++] = a ;
553
553
break ;
@@ -558,11 +558,11 @@ public void execute(int index, AbstractInsnNode anode) {
558
558
559
559
case Opcodes .GETFIELD :
560
560
sp --;
561
- pushReturn (fi .desc );
561
+ pushReturn (fi .desc . intern () );
562
562
break ;
563
563
564
564
case Opcodes .GETSTATIC :
565
- pushReturn (fi .desc );
565
+ pushReturn (fi .desc . intern () );
566
566
break ;
567
567
568
568
case Opcodes .INVOKEINTERFACE :
@@ -577,10 +577,10 @@ public void execute(int index, AbstractInsnNode anode) {
577
577
if (a .charAt (0 ) == 'U' ) {
578
578
b = a .substring (a .indexOf (':' )+1 );
579
579
for (int i = 0 ; i < stack .length ; i ++)
580
- if (a . equals ( stack [i ]) ) stack [i ] = b ;
580
+ if (a == stack [i ]) stack [i ] = b ;
581
581
}
582
582
}
583
- pushReturn (midesc .getReturnType ().getDescriptor ());
583
+ pushReturn (midesc .getReturnType ().getDescriptor (). intern () );
584
584
break ;
585
585
586
586
case Opcodes .ISTORE :
@@ -639,7 +639,7 @@ public void execute(int index, AbstractInsnNode anode) {
639
639
}
640
640
641
641
case Opcodes .NEW :
642
- stack [sp ++] = "U" +index +':' +tidesc ;
642
+ stack [sp ++] = ( "U" +index +':' +tidesc ). intern () ;
643
643
break ;
644
644
645
645
case Opcodes .POP2 :
@@ -702,7 +702,8 @@ public void merge(int index, Frame f) {
702
702
String a = f .stack [i ];
703
703
String b = slot .stack [i ];
704
704
String c = lub (a ,b );
705
- if (!b .equals (c )) {
705
+ if (b != c ) {
706
+ //System.out.printf("%d.%d %s -> %s\n", index, i, b, c);
706
707
slot .stack [i ] = c ;
707
708
changed = true ;
708
709
}
@@ -715,13 +716,16 @@ public void merge(int index, Frame f) {
715
716
void mark (int index ) {
716
717
if (changedVec [index ]) return ;
717
718
changedVec [index ] = true ;
718
- changedStack [changedSp ++] = index ;
719
+ changedQueue [changedHead ++] = index ;
720
+ if (changedHead == changedQueue .length ) changedHead = 0 ;
719
721
}
720
722
721
723
// computes the least upper bound of two verification types; we use descriptors, but U44:Lbar; for uninitialized(44), 0 for null, and T for TOP
722
724
String lub (String a ,String b ) {
723
725
// same type? trivial
724
- if (a .equals (b )) return a ;
726
+ if (a == b ) return a ;
727
+ if (a == "T" ) return a ;
728
+ if (b == "T" ) return b ;
725
729
726
730
char a0 = a .charAt (0 );
727
731
char b0 = b .charAt (0 );
@@ -742,7 +746,7 @@ String lub(String a,String b) {
742
746
String cc = lub (a .substring (1 ), b .substring (1 ));
743
747
if (cc .charAt (0 ) == 'T' ) // children are not compatible, but we know we have *some* array, which is an object
744
748
return "Ljava/lang/Object;" ;
745
- return '[' +cc ;
749
+ return ( '[' +cc ). intern () ;
746
750
} else {
747
751
if (b0 != 'L' ) return "Ljava/lang/Object;" ;
748
752
@@ -772,27 +776,30 @@ private void getTypes() {
772
776
int locwp = 0 ;
773
777
774
778
if ((access & Opcodes .ACC_STATIC ) == 0 ) {
775
- initial .stack [locwp ++] = 'L' +tgtype +';' ;
779
+ initial .stack [locwp ++] = ( 'L' +tgtype +';' ). intern () ;
776
780
}
777
781
for (Type arg : Type .getArgumentTypes (desc )) {
778
- initial .stack [locwp ] = arg .getDescriptor ();
782
+ initial .stack [locwp ] = arg .getDescriptor (). intern () ;
779
783
locwp += arg .getSize ();
780
784
}
781
785
initial .sp = initial .sbase = nlocal ;
782
786
state .merge (0 , initial );
783
787
784
788
int insn ;
789
+ int step = 0 ;
785
790
while ((insn = state .next ()) >= 0 ) {
786
791
Frame in = state .frames [insn ].clone ();
787
792
788
- if (TYPE_TRACE ) System .out .printf ("INFERENCE STEP: insn=%d locals=[%s] stack=[%s]\n " , insn , Arrays .toString (Arrays .copyOfRange (in .stack , 0 , nlocal )), Arrays .toString (Arrays .copyOfRange (in .stack , in .sbase , in .sp )));
793
+ if (TYPE_TRACE ) System .out .printf ("INFERENCE STEP: insn=%d [%d] locals=[%s] stack=[%s]\n " , insn , insnList [ insn ]. getOpcode () , Arrays .toString (Arrays .copyOfRange (in .stack , 0 , nlocal )), Arrays .toString (Arrays .copyOfRange (in .stack , in .sbase , in .sp )));
789
794
in .execute (insn , insnList [insn ]);
790
795
791
796
for (ControlEdge ce : successors [insn ]) {
792
797
// assume exceptions follow non-exceptions
793
798
if (ce .exn != null ) in .thrown (ce .exn );
794
799
state .merge (ce .to , in );
795
800
}
801
+ step ++;
802
+ if ((step % 10000 ) == 0 ) System .out .printf ("Inference step %d\n " , step );
796
803
}
797
804
types = state .frames ;
798
805
}
0 commit comments