Hi Vladimir,

I know just enough about this area to be dangerous....


src/share/classes/java/lang/invoke/BoundMethodHandle.java

 865     private static final SpeciesData[] SPECIES_DATA_CACHE = new 
SpeciesData[4];


Only 3 elements are stored in the above array?



src/share/classes/java/lang/invoke/MethodHandleImpl.java

 634         // t_{i+2}:L=ValueConversions.unbox(t_{i+1}) OR 
ValueConversions.identity(t_{i+1})
 635         if (type.returnType().isPrimitive()) {
 636             names[UNBOX_RESULT] = new 
Name(ValueConversions.unbox(type.returnType()),
 637                                               names[TRY_CATCH]);
 638         } else {
 639             names[UNBOX_RESULT] = new Name(ValueConversions.identity(),
 640                                               names[TRY_CATCH]);
 641         }


You could create the form without the identity transform for the non-primitive 
case?

  final int UNBOX_RESULT = type.returnType().isPrimitive() ? nameCursor++ : 0;
...

  if (UNBOX_RESULT > 0) { ...
      names[UNBOX_RESULT] = new Name(ValueConversions.unbox(type.returnType()), 
names[TRY_CATCH]);
  }



 699         try {
 700             GUARD_WITH_CATCH
 701                     = IMPL_LOOKUP.findStatic(MethodHandleImpl.class, 
"guardWithCatch",
 702                     MethodType.methodType(Object.class, 
MethodHandle.class, Class.class, MethodHandle.class, Object[].class));
 703         } catch (ReflectiveOperationException ex) {
 704             throw new RuntimeException(ex);
 705         }
 706         return GUARD_WITH_CATCH;


Should #704 be:

  throw newInternalError(ex);

?


test/java/lang/invoke/MethodHandles/TestCatchException.java

 100         Object o = new Object();
 101         Object[] obj1 = new Object[] { "str" };
 102 
 103         Object r1 = target.invokeExact(o, o, o, o, o, o, o, o, obj1);
 104         Object r2 = gwc.invokeExact(o, o, o, o, o, o, o, o, obj1);
 105         assertTrue(r1 != null);
 106         assertTrue(r1.equals(r2));

To be on the safe side should probably assert as follows:

  assertEquals(r1, obj);
  assertEquals(r2, obj);

Paul.


On Feb 19, 2014, at 10:46 PM, Vladimir Ivanov <vladimir.x.iva...@oracle.com> 
wrote:

> http://cr.openjdk.java.net/~vlivanov/8027827/final/webrev.00
> https://jbs.oracle.com/bugs/browse/JDK-8027827
> 354 lines changed: 193 ins; 91 del; 70 mod
> 
> OVERVIEW
> 
> MethodHandles.catchException combinator implementation is based on generic 
> invokers (MethodHandleImpl$GuardWithCatch.invoke_*). It is significantly 
> slower than a Java equivalent (try-catch).
> 
> Future Nashorn performance improvements require catchException combinator 
> speed to be on par with try-catch in Java.
> 
> So, it should be represented in a more efficient form.
> 
> I chose the following lambda form representation:
> 
>  t_{i}:L=ValueConversions.array(a1:L,...,a_{k}:L);
> t_{i+1}:L=MethodHandleImpl.guardWithCatch(t_{p1}, t_{p2}, t_{p3}, t_{i}:L);
> t_{i+2}:I=ValueConversions.unbox(t7:L);
>     OR :L=ValueConversions.identity(t_{n+1})
>     OR :V=ValueConversions.ignore(t_{n+1})
> 
> where:
>  a1, ..., a_{k} - arguments
>  t_{p1}, t_{p2}, t_{p3} - target method handle, exception class, catcher 
> method handle respectively; passed as bounded parameters;
> 
> During lambda form compilation it is converted into bytecode equivalent of 
> the following Java code:
>  try {
>      return target.invokeBasic(...);
>  } catch(Throwable e) {
>      if (!exClass.isInstance(e)) throw e;
>      return catcher.invokeBasic(e, ...);
>  }
> 
> There's a set of microbenchmarks (attached to the bug) I wrote to verify 
> performance characteristics of new implementation.
> 
> FURTHER WORK
> 
> What is missing is lambda form caching. The plan is to have a single lambda 
> form per basic type, but it needs more work - current representation is 
> suitable for sharing on bytecode level, but lambda form interpretation 
> doesn't work well (arguments boxing + result unboxing are problematic).
> 
> TESTING
> 
> Tests: microbenchmarks, jdk/java/lang/invoke/, nashorn with optimistic types 
> (unit tests, octane).
> 
> Tested in 2 modes:
>  * COMPILE_THRESHOLD=30
>  * COMPILE_THRESHOLD=0 -Xverify:all
> 
> OTHER
> 
> 1) Update of cached name and member in LF compilation loop (see 
> InvokerBytecodeGenerator.generateCustomizedCodeBytes) fixes a bug during 
> compilation of selectAlternative when running with COMPILE_THRESHOLD=0.
> 
> 2) As part of this change, I fix existing bug [1], so I add regression test 
> for it.
> 
> Thanks!
> 
> Best regards,
> Vladimir Ivanov
> 
> [1] https://bugs.openjdk.java.net/browse/JDK-8034120

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to