I ran into an apparent bug today when trying to stress test a program I 
wrote. The program was just supposed to tell you both the minimum and 
maximum integers supplied in the command line arguments. I tried using 
xargs to provide thousands of numbers when I encountered this issue. 
However, I can repro it as follows, using Leiningen 2.5.1 and Clojure 
1.6.0. As you can see, when I do lein run, it prints an exception about 
"Method code too large", but then prints out Hello World. And when I use 
the uberjar, it just prints the output twice.

jpaton2@jpaton2-mba ~/Projects> lein -v
Leiningen 2.5.1 on Java 1.8.0_60 Java HotSpot(TM) 64-Bit Server VM
jpaton2@jpaton2-mba ~/Projects> lein new app test-args
Generating a project called test-args based on the 'app' template.
jpaton2@jpaton2-mba ~/Projects> cd test-args/
jpaton2@jpaton2-mba ~/P/test-args> lein run
Hello, World!
jpaton2@jpaton2-mba ~/P/test-args> wc -l ../numbers
    7514 ../numbers
jpaton2@jpaton2-mba ~/P/test-args> xargs lein run -- < ../numbers
Exception in thread "main" java.lang.RuntimeException: Method code too 
large!, 
compiling:(/private/var/folders/wd/shmj7jgd7sqbk9wyh8dp0lz1jq62k4/T/form-init6518370413228051607.clj:1:165)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6651)
at clojure.lang.Compiler.analyze(Compiler.java:6445)
at clojure.lang.Compiler.eval(Compiler.java:6700)
at clojure.lang.Compiler.eval(Compiler.java:6693)
at clojure.lang.Compiler.load(Compiler.java:7130)
at clojure.lang.Compiler.loadFile(Compiler.java:7086)
at clojure.main$load_script.invoke(main.clj:274)
at clojure.main$init_opt.invoke(main.clj:279)
at clojure.main$initialize.invoke(main.clj:307)
at clojure.main$null_opt.invoke(main.clj:342)
at clojure.main$main.doInvoke(main.clj:420)
at clojure.lang.RestFn.invoke(RestFn.java:421)
at clojure.lang.Var.invoke(Var.java:383)
at clojure.lang.AFn.applyToHelper(AFn.java:156)
at clojure.lang.Var.applyTo(Var.java:700)
at clojure.main.main(main.java:37)
Caused by: java.lang.RuntimeException: Method code too large!
at clojure.asm.MethodWriter.getSize(MethodWriter.java:1872)
at clojure.asm.ClassWriter.toByteArray(ClassWriter.java:775)
at clojure.lang.Compiler$ObjExpr.compile(Compiler.java:4450)
at clojure.lang.Compiler$FnExpr.parse(Compiler.java:3904)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6642)
... 15 more
Hello, World!
jpaton2@jpaton2-mba ~/P/test-args> lein uberjar
Compiling test-args.core
Created 
/Users/jpaton2/Projects/test-args/target/uberjar+uberjar/test-args-0.1.0-SNAPSHOT.jar
Created 
/Users/jpaton2/Projects/test-args/target/uberjar/test-args-0.1.0-SNAPSHOT-standalone.jar
jpaton2@jpaton2-mba ~/P/test-args> xargs java -jar 
target/uberjar/test-args-0.1.0-SNAPSHOT-standalone.jar < ../numbers
Hello, World!
Hello, World!

I found, through trial and error, that it appears to be sharding the 
arguments in chunks of 5000, then calling -main once for each chunk. I can 
verify this by using a file with the first 7000 numbers and the following 
program:

(ns test-args.core
  (:gen-class))

(defn -main
  [& args]
  (println (apply max (map #(Integer/parseInt %) args))))

Using that for my core.clj file, I get the following:

jpaton2@jpaton2-mba ~/P/test-args> lein uberjar
Compiling test-args.core
Created 
/Users/jpaton2/Projects/test-args/target/uberjar+uberjar/test-args-0.1.0-SNAPSHOT.jar
Created 
/Users/jpaton2/Projects/test-args/target/uberjar/test-args-0.1.0-SNAPSHOT-standalone.jar
jpaton2@jpaton2-mba ~/P/test-args> xargs java -jar 
target/uberjar/test-args-0.1.0-SNAPSHOT-standalone.jar < ../numbers
4999
6999

Curious if this is a known problem and whether anyone can offer insight.

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to