RFR: implementation for JEP 334: JVM Constants API

jbvernee jbvernee at xs4all.nl
Fri Jun 1 13:04:32 UTC 2018


Hello,

(Thanks, Brian, for your earlier response. I've been interested in the 
constants API/condy/constant propagation since first hearing about it 
last year, so it's great to be able to get involved :)

I have some more code review comments. This time I looked at the 
implementations as well. I hope it's okay for a non-member to give 
comments about that, but after writing them down I didn't want to just 
throw them away.

They're organized by file:

Class.java

- For `arrayType()` you can change it to return `Class<T[]>` (useful for 
reflection), which is a valid sub-signature. (I mentioned this before, 
but it seems to have fallen through the cracks)

Enum.java

- For `EnumDesc.constantBootstrap` I think you can require a `ClassDesc` 
directly as a parameter instead of a descriptor string that you then 
have to convert to a ClassDesc? (When you use it in `describeConstable` 
you have to convert your ClassDesc to a descriptor string. It'd be 
simpler if you could just pass the ClassDesc)

VarHandle.java

- For `VarHandleDesc.Kind.toBSMArgs` you could change it to return a 
`ConstantDesc<?>[]`, since the only use case requires an array. (also, 
see the next comment)

- In `VarHandleDesc.describeConstable` you can use `Constable<?>[] args 
= kind.toBSMArgs(declaringClass, constantName(), varType)` (assuming the 
changed return type), instead of having the ternary.

X-VarHandle.java.template

- In the different `describeConstable` maybe use `orElseThrow()` instead 
of `get()` on the optionals. (I think get() will be deprecated soon?)

- For the last one (line 662), instead of doing an explicit `isPresent` 
check, you can also use `Optional::map`: `return 
arrayTypeRef.map(VarHandleDesc::ofArray);`. (If it's ok to use indy 
there?)

ClassDesc.java

- Some of the string manipulation going on with descriptor strings looks 
kinda cryptic (for instance, several places use `descriptor.length() == 
1`, instead of a more descriptive function call, e.g. 
`isPrimitveDescriptor(descriptor)`). It might be a good idea to factor 
out the nitty gritty string manipulation into a DescriptorStrings class 
as static helpers, and use static imports (I don't know if that exists 
in the JDK, but there seems to be a wide demand for it).

- In `arrayType(int)`, add an exception message here. e.g.: `"rank must 
be positive, but was: " + rank`.

ConstantClassDesc.java

- In the constructor, I suggest factoring out the if-condition to an 
`isReferenceDescriptor(String descriptor)` helper. (more descriptive)

- In `resolveConstantDesc` (line 77): You can use `if(c.isPrimitive())` 
instead of `c.descriptorString().length() == 1`

- In the same method (line 82): You can use `clazz = clazz.arrayType()` 
instead of `clazz = Array.newInstance(clazz, 0).getClass();`

DynamicConstantDesc.java

- The `resolveArgs` method uses an odd dance to propagate the exception 
thrown from the lambda, imho it's better to just use a traditional 
for-loop here instead of the stream.


Best regards,
Jorn Vernee


More information about the amber-dev mailing list