Hi,
On SO recently, someone asked how to generate a varargs method with gen-class [1]
i.e how can the equivalent of this method be generated:
void foo(String... args) { ...}
I did some investigation into a possible answer.
Thinking that varargs methods in java are a trick of the compiler I expected to be able to generate
void foo(String[] args) {...}
with this...
(ns foo
(:gen-class
:name Foo
:methods [[foo ["[Ljava.lang.String;"] void]]
))
and for it to 'just work'(tm). decompiling the generated class I get...
$ javap -classpath . Foo
public class Foo extends java.lang.Object{
public static {};
public Foo();
public java.lang.Object clone();
public int hashCode();
public java.lang.String toString();
public boolean equals(java.lang.Object);
public void foo(java.lang.String[]);
public static void main(java.lang.String[]);
}
The problem is that the foo method is not recognized as a varargs method if you compile against it.
After some digging I discovered that for a method to be recognized as a varargs, the ACC_VARARGS flag must be on the method in the bytecode.
In the clojure-1.4.0 src I found that the flag is defined in ./src/jvm/clojure/asm/Opcodes.java but is never referenced anywhere, which leads me to the conclusion that currently it isn't possible to generate a varargs method in clojure.
Am I missing something?
Should I raise this as an issue on JIRA?