On 15.06.2016 14:36, Winnebeck, Jason wrote:
OK, I see the PR. I would be interested to hear Jochen's comments because the 
way the class is documented it looks like that class is meant to be called in 
situations with constrained conditions.

yes

I mean, doesn't the normal String cast in Groovy go through 
DefaultGroovyMethods.asType?

no. asType is only for calling asType directly, or using the casting "as". A normal cast is done by the means of ScriptBytecodeAdapter#castToType and friends. The idea with ShortTypeHandling was to have a class with no dynamic method calls and small methods for the easy cases, with reuse in the static compiler maybe. The default for a cast using "as", is the normal cast.

I see in that method there is a specialization when casting to String that calls 
InvokerHelper.toString, which has a lot of logic in it. For your issue GROOVY-7853 around 
primitive arrays I see that asType goes to InvokerHelper.toString, which calls 
InvokerHelper.format, which sees its class "isArray()" is true, then it has a 
specialization for char[] but if it's not char[] it casts the array to a collection and 
invokes Invoker.format on that -- which seems to go through a lot of effort casting 
everything in there recursively to a String when everything is guaranteed to be a 
primitive at that point.

In that sense, even the fix provided in PR 345 doesn't match the standard 
Groovy cast to String operator, which recursively formats the elements in the 
array, instead you just use toString.

But I also wonder if the real bug is that the compiler generates 
ShortTypeHandling calls when it should be reverting to the full asType instead.

there is also the problem with a dynamically added toString() method.
Actually GROOVY-7853 makes me think that this method in ShortTypeHandling should not be called at all and that the castToType route should be taken instead.... and ensured we will pick up the dynamic toString method there as well.

bye Jochen


Reply via email to