Readit News logoReadit News
leibnitz27 · 7 years ago
One little thing - the string that's running out of space here is the signature of the interface, not the signature of the method. You could use that fact together with method scoped type parameters to get a few more, if it weren't for the fact the descriptor would blow up too soon already.

Since it's not mentioned in the article - the signature of a method is the description containing generic information. The descriptor is the erased signature, which, because A strips to Ljava/lang/Object; will likely be a fair bit longer.

An aside - you can (mostly) still get away with corrupting signatures, if you want to obfuscate code.

(eg https://github.com/ItzSomebody/StopDecompilingMyJava/blob/ma... )

(yes, I used to blow up on one of these in https://www.benf.org/other/cfr - (my java decompiler), but it's all good now).

hyperpape · 7 years ago
Thanks for that. I confess I got a bit lazy about checking which string was at issue--I'll try to do an update when I get home, if I can make time.
cobbzilla · 7 years ago
A fun short article, but if you’re too lazy to read, the summary answer is “way more than you will ever need.”
RobertDeNiro · 7 years ago
Or if you need that much, your design is severely broken
smcl · 7 years ago
I tried this with the F# mono REPL - it eventually failed after creating a let binding with 1328 params: http://blog.mclemon.io/f-number-polymorphic-parameter-overfl...
agumonkey · 7 years ago
one can store a whole Forth OS in a java signature
te_platt · 7 years ago
I was both impressed and horrified. Well done.
twoodfin · 7 years ago
I think it's pretty cool that the result emerges, as the author points out, not from the implementation details of any particular JVM, but from well-defined parts of the Java specs intersecting in a fully determined way.
deathwarmedover · 7 years ago
I wonder if it would be feasible to scan, say, GitHub or Apache projects to find the highest parameter count in the wild?
erdeszt · 7 years ago
Do you mean type parameters or regular parameters? If it's the former(and Scala is allowed) then I think Rho's Result type is a pretty good bet with it's ~60 type arguments: https://github.com/http4s/rho/blob/989db04e6dd828518770a42fd...
nkkollaw · 7 years ago
Ugh, why would they do that?
saagarjha · 7 years ago
From the other news on the front page, scanning the former should now give you the latter as well :)
aiCeivi9 · 7 years ago
I can bet it will be Spring. It was always in Top 3 for thing like:

- longest method name

- longest class name

- deepest inheritance tree

peeters · 7 years ago
Doubtful. I'd guess it's a general utility library like Guava, where they're doing something with heterogeneous type "vararg" methods. Often they'll have a number of overloads to give the most type help, before reverting to less helpful vararg types.

Anything that's heterogeneous, with dynamic arity to the library but known static types to the caller would be a good candidate. Like NTuple type implementations.

LoSboccacc · 7 years ago
this reminds me of that one table with more than 255 columns which hibernate converted into a class that could not be compiled since the constructor had too many parameters. we split it up using the component mapping to realize some of these column as if they were composition.

the early '00 were a lawless wasteland.

maaaats · 7 years ago
Ah, reminds me of something I had to do only two years ago.

Business side would send an excel file with thousands of lines and some columns with some definitions. These we would export to csv and turn into a huge enum using some generator. One definition per line in the excel document, on the form Rule67_Oslo(245, 167, NO_TRANSFER). One day it failed, as the byte count was too big. Managed to strip down the definitions some, but a few weeks later it was impossible to add new rules again. No idea why someone would make that design in the first place, old legacy system. But it was hard to refactor as well, as those constants were littered everywhere in the code as well. I switched teams before it was solved, but I think the fix was mainly that business had to find one rule to remove every time they wanted to add a new one..

LanceH · 7 years ago
If you were using Hibernate in 2000 and not caught up in the EJB hype, you were ahead of the game.
LoSboccacc · 7 years ago
maybe because I was fresh out of academia then but neither xml defined behavior nor the ejb looked like something that really removed work, moreover I've always been biased against things I can't put a break-point and debug in the event of having issues (which is also why I skipped on angular, for example).
sebazzz · 7 years ago
I imagine that the limit on the .NET CLR is even lower because there needs to be runtime support for type parameters all the way down to the JIT.
reifiedgent · 7 years ago
I modified the python script to generate C# and it compiled with 131072 type parameters. It did take 9 minutes though so I didn't continue after that.
int_19h · 7 years ago
In theory, the maximum encodable compressed unsigned integer, as used by GenParamCount in MSIL, is 0x1FFFFFFF.
Aweorih · 7 years ago
> Nonetheless, if I was king, I'd consider explicitly banning any class or method from having more than 255 type parameters.

As he says there is probably no use case where you need so many and the additional overhead of time to implement this is (in my eyes) a bit wasted. But he can be actually the king by contributing to the openJDK project.