Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a new constructor BootstrapMethodInfo(enclosingClass, cpArgs) #101

Merged
merged 2 commits into from
Jul 20, 2018

Conversation

gayanW
Copy link
Collaborator

@gayanW gayanW commented Jul 19, 2018

JVMClassInfo.Initializer#setBootstrapMethod method assumes to have a bootstrap method with a structure similar to the following (which have 3 bootstrap method arguments)

BootstrapMethods:
  0: #83 REF_invokeStatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
    Method arguments:
      #84 (Ljava/lang/Object;)Ljava/lang/Object;
      #85 REF_invokeInterface java/lang/annotation/Annotation.annotationType:()Ljava/lang/Class;
      #86 (Ljava/lang/annotation/Annotation;)Ljava/lang/Class;

In case JPF encounters a bootstrap method with arbitrary number of arguments such as the StringConcatFactory.makeConcatWithConstants which have only one bootstrap method argument JVMClassInfo.Initializer#setBootstrapMethod throws an ArrayIndexOutOfBoundsException exception:

[junit] java.lang.ArrayIndexOutOfBoundsException: 1
[junit] 	at gov.nasa.jpf.jvm.JVMClassInfo$Initializer.setBootstrapMethod(JVMClassInfo.java:93)
[junit] 	at gov.nasa.jpf.jvm.ClassFile.setBootstrapMethod(ClassFile.java:659)
[junit] 	at gov.nasa.jpf.jvm.ClassFile.parseBootstrapMethodAttr(ClassFile.java:1422)
[junit] 	at gov.nasa.jpf.jvm.JVMClassInfo$Initializer.setClassAttribute(JVMClassInfo.java:80)
[junit] 	at gov.nasa.jpf.jvm.ClassFile.setClassAttribute(ClassFile.java:636)
[junit] 	at gov.nasa.jpf.jvm.ClassFile.parseClassAttributes(ClassFile.java:1306)
[junit] 	at gov.nasa.jpf.jvm.ClassFile.parse(ClassFile.java:875)
[junit] 	at gov.nasa.jpf.jvm.JVMClassInfo$Initializer.<init>(JVMClassInfo.java:48)

This prevents the above exception from being thrown, by adding a new constructor BootstrapMethodInfo#BootstrapMethodInfo(enclosingClass, cpArgs) for handling bootstrap methods with arbitrary number of bootstrap method arguments, without evaluating cpArgs in JVMClassInfo.Initializer#setBootstrapMethod.

Fixes: #53

gayanW added 2 commits July 19, 2018 21:33
JVMClassInfo.Initializer#setBootstrapMethod assumes to have a bootstrap
method with a structure similar to the following (with 3 bootstrap
method arguments)

BootstrapMethods:
  0: javapathfinder#83 REF_invokeStatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
    Method arguments:
      javapathfinder#84 (Ljava/lang/Object;)Ljava/lang/Object;
      javapathfinder#85 REF_invokeInterface java/lang/annotation/Annotation.annotationType:()Ljava/lang/Class;
      javapathfinder#86 (Ljava/lang/annotation/Annotation;)Ljava/lang/Class;

In case JPF encounters an bootstrap method with arbitrary number of
arguments such as the StringConcatFactory.makeConcatWithConstants which
have only one bootstrap method argument
JVMClassInfo.Initializer#setBootstrapMethod throws an
ArrayIndexOutOfBoundsException exception:

[junit] java.lang.ArrayIndexOutOfBoundsException: 1
[junit] 	at gov.nasa.jpf.jvm.JVMClassInfo$Initializer.setBootstrapMethod(JVMClassInfo.java:93)
[junit] 	at gov.nasa.jpf.jvm.ClassFile.setBootstrapMethod(ClassFile.java:659)
[junit] 	at gov.nasa.jpf.jvm.ClassFile.parseBootstrapMethodAttr(ClassFile.java:1422)
[junit] 	at gov.nasa.jpf.jvm.JVMClassInfo$Initializer.setClassAttribute(JVMClassInfo.java:80)
[junit] 	at gov.nasa.jpf.jvm.ClassFile.setClassAttribute(ClassFile.java:636)
[junit] 	at gov.nasa.jpf.jvm.ClassFile.parseClassAttributes(ClassFile.java:1306)
[junit] 	at gov.nasa.jpf.jvm.ClassFile.parse(ClassFile.java:875)
[junit] 	at gov.nasa.jpf.jvm.JVMClassInfo$Initializer.<init>(JVMClassInfo.java:48)

This prevents the above exception from being thrown, by adding a new
constructor BootstrapMethodInfo#BootstrapMethodInfo(enclosingClass,
cpArgs) for handling bootstrap methods with arbitrary number of
bootstrap method arguments, without evaluating cpArgs within
JVMClassInfo.Initializer#setBootstrapMethod.
This is added mainly to check whether the bootstrap methods in
StringConcatFactory is handled properly.
@cyrille-artho cyrille-artho merged commit 39567a9 into javapathfinder:java-10 Jul 20, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants