1
1
package dev .xdark .ssvm .jit ;
2
2
3
+ import dev .xdark .ssvm .VirtualMachine ;
3
4
import dev .xdark .ssvm .execution .ExecutionContext ;
4
5
import dev .xdark .ssvm .execution .VMException ;
5
6
import dev .xdark .ssvm .mirror .ArrayJavaClass ;
@@ -233,19 +234,23 @@ public Value compareDouble(Value a, Value b, int nan) {
233
234
}
234
235
}
235
236
236
- public void getStatic (String owner , String name , String desc , ExecutionContext ctx ) {
237
+ public Value getStaticA (String owner , String name , String desc , ExecutionContext ctx ) {
237
238
val vm = ctx .getVM ();
238
239
val helper = vm .getHelper ();
239
240
InstanceJavaClass klass = (InstanceJavaClass ) helper .findClass (ctx .getOwner ().getClassLoader (), owner , true );
240
241
while (klass != null ) {
241
242
val value = klass .getStaticValue (name , desc );
242
243
if (value != null ) {
243
- ctx .getStack ().pushGeneric (value );
244
- return ;
244
+ return value ;
245
245
}
246
246
klass = klass .getSuperClass ();
247
247
}
248
248
helper .throwException (vm .getSymbols ().java_lang_NoSuchFieldError , name );
249
+ return null ;
250
+ }
251
+
252
+ public void getStatic (String owner , String name , String desc , ExecutionContext ctx ) {
253
+ ctx .getStack ().pushGeneric (getStaticA (owner , name , desc , ctx ));
249
254
}
250
255
251
256
// special intrinsic versions.
@@ -511,10 +516,13 @@ public void invokeVirtual(String owner, String name, String desc, ExecutionConte
511
516
val vm = ctx .getVM ();
512
517
val stack = ctx .getStack ();
513
518
val args = Type .getArgumentTypes (desc );
514
- int localsLength = args .length + 1 ;
519
+ int localsLength = 1 ;
520
+ for (val arg : args ) {
521
+ localsLength += arg .getSize ();
522
+ }
515
523
val locals = new Value [localsLength ];
516
524
while (localsLength -- != 0 ) {
517
- locals [localsLength ] = stack .popGeneric ();
525
+ locals [localsLength ] = stack .pop ();
518
526
}
519
527
val result = vm .getHelper ().invokeVirtual (name , desc , new Value [0 ], locals );
520
528
val v = result .getResult ();
@@ -537,10 +545,13 @@ public void invokeSpecial(String owner, String name, String desc, ExecutionConte
537
545
val klass = (InstanceJavaClass ) helper .findClass (ctx .getOwner ().getClassLoader (), owner , true );
538
546
val stack = ctx .getStack ();
539
547
val args = Type .getArgumentTypes (desc );
540
- int localsLength = args .length + 1 ;
548
+ int localsLength = 1 ;
549
+ for (val arg : args ) {
550
+ localsLength += arg .getSize ();
551
+ }
541
552
val locals = new Value [localsLength ];
542
553
while (localsLength -- != 0 ) {
543
- locals [localsLength ] = stack .popGeneric ();
554
+ locals [localsLength ] = stack .pop ();
544
555
}
545
556
val result = helper .invokeExact (klass , name , desc , new Value [0 ], locals );
546
557
val v = result .getResult ();
@@ -550,31 +561,16 @@ public void invokeSpecial(String owner, String name, String desc, ExecutionConte
550
561
}
551
562
552
563
public void invokeStatic (String owner , String name , String desc , ExecutionContext ctx ) {
553
- val vm = ctx .getVM ();
554
- val helper = vm .getHelper ();
555
- InstanceJavaClass klass ;
556
- try {
557
- klass = (InstanceJavaClass ) helper .findClass (ctx .getOwner ().getClassLoader (), owner , true );
558
- } catch (VMException ex ) {
559
- val oop = ex .getOop ();
560
- if (oop .isNull () || !vm .getSymbols ().java_lang_Error .isAssignableFrom (oop .getJavaClass ())) {
561
- val cnfe = helper .newException (vm .getSymbols ().java_lang_NoClassDefFoundError , owner , oop );
562
- throw new VMException (cnfe );
563
- }
564
- throw ex ;
565
- }
566
- val mn = klass .getStaticMethodRecursively (name , desc );
567
- if (mn == null ) {
568
- helper .throwException (vm .getSymbols ().java_lang_NoSuchMethodError , owner + '.' + name + desc );
569
- }
564
+ val mn = resolveStaticMethod (owner , name , desc , ctx );
570
565
val stack = ctx .getStack ();
571
- val args = mn .getArgumentTypes ();
572
- int localsLength = args .length ;
566
+ int localsLength = mn .getMaxArgs ();
573
567
val locals = new Value [localsLength ];
574
568
while (localsLength -- != 0 ) {
575
- locals [localsLength ] = stack .popGeneric ();
569
+ locals [localsLength ] = stack .pop ();
576
570
}
577
- val result = helper .invokeStatic (klass , mn , new Value [0 ], locals );
571
+ val vm = ctx .getVM ();
572
+ val helper = vm .getHelper ();
573
+ val result = helper .invokeStatic (mn .getOwner (), mn , new Value [0 ], locals );
578
574
val v = result .getResult ();
579
575
if (!v .isVoid ()) {
580
576
stack .pushGeneric (v );
@@ -601,6 +597,14 @@ public Value invokeStatic(Value[] locals, Object owner, Object method, Execution
601
597
return result .getResult ();
602
598
}
603
599
600
+ public Value invokeStatic (Value [] locals , String owner , String name , String desc , ExecutionContext ctx ) {
601
+ val helper = ctx .getHelper ();
602
+ val mn = resolveStaticMethod (owner , name , desc , ctx );
603
+ val stack = ctx .getStack ();
604
+ val result = helper .invokeStatic (mn .getOwner (), mn , new Value [0 ], locals );
605
+ return result .getResult ();
606
+ }
607
+
604
608
public Value invokeSpecial (Value [] locals , Object owner , Object method , ExecutionContext ctx ) {
605
609
val vm = ctx .getVM ();
606
610
val helper = vm .getHelper ();
@@ -631,10 +635,13 @@ public void invokeInterface(String owner, String name, String desc, ExecutionCon
631
635
val klass = (InstanceJavaClass ) helper .findClass (ctx .getOwner ().getClassLoader (), owner , true );
632
636
val stack = ctx .getStack ();
633
637
val args = Type .getArgumentTypes (desc );
634
- int localsLength = args .length + 1 ;
638
+ int localsLength = 1 ;
639
+ for (val arg : args ) {
640
+ localsLength += arg .getSize ();
641
+ }
635
642
val locals = new Value [localsLength ];
636
643
while (localsLength -- != 0 ) {
637
- locals [localsLength ] = stack .popGeneric ();
644
+ locals [localsLength ] = stack .pop ();
638
645
}
639
646
val result = helper .invokeInterface (klass , name , desc , new Value [0 ], locals );
640
647
val v = result .getResult ();
@@ -900,7 +907,28 @@ public Value invokeDynamic(Value[] args, Object constants, int index, ExecutionC
900
907
}
901
908
return InvokeDynamicLinker .dynamicCall (args , result .desc , result .handle , ctx );
902
909
}
903
-
910
+
911
+ private static JavaMethod resolveStaticMethod (String owner , String name , String desc , ExecutionContext ctx ) {
912
+ val vm = ctx .getVM ();
913
+ val helper = vm .getHelper ();
914
+ InstanceJavaClass klass ;
915
+ try {
916
+ klass = (InstanceJavaClass ) helper .findClass (ctx .getOwner ().getClassLoader (), owner , true );
917
+ } catch (VMException ex ) {
918
+ val oop = ex .getOop ();
919
+ if (oop .isNull () || !vm .getSymbols ().java_lang_Error .isAssignableFrom (oop .getJavaClass ())) {
920
+ val cnfe = helper .newException (vm .getSymbols ().java_lang_NoClassDefFoundError , owner , oop );
921
+ throw new VMException (cnfe );
922
+ }
923
+ throw ex ;
924
+ }
925
+ val mn = klass .getStaticMethodRecursively (name , desc );
926
+ if (mn == null ) {
927
+ helper .throwException (vm .getSymbols ().java_lang_NoSuchMethodError , owner + '.' + name + desc );
928
+ }
929
+ return mn ;
930
+ }
931
+
904
932
@ RequiredArgsConstructor (access = AccessLevel .PACKAGE )
905
933
private static final class DynamicLinkResult {
906
934
final InstanceValue handle ;
0 commit comments