Welcome! Please see the About page for a little more info on how this works.

0 votes
in Java Interop by

Attached is a program that reproduces this issue. We have a proxy, p', which sub-classes java.io.InputStream. There are three methods named read' in java.io.InputStream: abstract int read(); int read(byte(link: ) b); and int read(byte(link: ) b, int off, int len); see http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html. In the definition of proxy p', we implement the abstract variant of method read', making `p' a concrete instance of java.io.InputStream.

The first invocation, (. p read), returns -1, which is expected.

The second invocation, (. p (read b 0 n)), should call int read(byte(link: ) b, int off, int len); in java.io.InputStream. But these are actual behavior:

$ clojure1.2 ~/tmp/proxy-bug.clj
Exception in thread "main" java.lang.IllegalArgumentException: Wrong number of args (4) passed to: user$eval1$fn (proxy-bug.clj:0)

    at clojure.lang.Compiler.eval(Compiler.java:5441)
    at clojure.lang.Compiler.load(Compiler.java:5858)
    at clojure.lang.Compiler.loadFile(Compiler.java:5821)
    at clojure.main$load_script.invoke(main.clj:221)
    at clojure.main$script_opt.invoke(main.clj:273)
    at clojure.main$main.doInvoke(main.clj:354)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.lang.Var.invoke(Var.java:365)
    at clojure.lang.AFn.applyToHelper(AFn.java:161)
    at clojure.lang.Var.applyTo(Var.java:482)
    at clojure.main.main(main.java:37)

Caused by: java.lang.IllegalArgumentException: Wrong number of args (4) passed to: user$eval1$fn

    at clojure.lang.AFn.throwArity(AFn.java:437)
    at clojure.lang.AFn.invoke(AFn.java:51)
    at user.proxy$java.io.InputStream$0.read(Unknown Source)
    at user$eval1.invoke(proxy-bug.clj:9)
    at clojure.lang.Compiler.eval(Compiler.java:5425)
    ... 10 more

$ clojure1.2 ~/tmp/proxy-bug.clj
Exception in thread "main" java.lang.IllegalArgumentException: Wrong number of args (4) passed to: user$eval1$fn (proxy-bug.clj:0)

    at clojure.lang.Compiler.eval(Compiler.java:5441)
    at clojure.lang.Compiler.load(Compiler.java:5858)
    at clojure.lang.Compiler.loadFile(Compiler.java:5821)
    at clojure.main$load_script.invoke(main.clj:221)
    at clojure.main$script_opt.invoke(main.clj:273)
    at clojure.main$main.doInvoke(main.clj:354)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.lang.Var.invoke(Var.java:365)
    at clojure.lang.AFn.applyToHelper(AFn.java:161)
    at clojure.lang.Var.applyTo(Var.java:482)
    at clojure.main.main(main.java:37)

Caused by: java.lang.IllegalArgumentException: Wrong number of args (4) passed to: user$eval1$fn

    at clojure.lang.AFn.throwArity(AFn.java:437)
    at clojure.lang.AFn.invoke(AFn.java:51)
    at user.proxy$java.io.InputStream$0.read(Unknown Source)
    at user$eval1.invoke(proxy-bug.clj:9)
    at clojure.lang.Compiler.eval(Compiler.java:5425)
    ... 10 more

3 Answers

0 votes
by

Comment made by: herberteuler@yahoo.com.cn

The second behavior should be in Clojure 1.3:

$ clojure1.3 ~/tmp/proxy-bug.clj
Exception in thread "main" clojure.lang.ArityException: Wrong number of args (4) passed to: user$eval1$fn

    at clojure.lang.AFn.throwArity(AFn.java:437)
    at clojure.lang.AFn.invoke(AFn.java:51)
    at user.proxy$java.io.InputStream$0.read(Unknown Source)
    at user$eval1.invoke(proxy-bug.clj:9)
    at clojure.lang.Compiler.eval(Compiler.java:6468)
    at clojure.lang.Compiler.load(Compiler.java:6905)
    at clojure.lang.Compiler.loadFile(Compiler.java:6866)
    at clojure.main$load_script.invoke(main.clj:282)
    at clojure.main$script_opt.invoke(main.clj:342)
    at clojure.main$main.doInvoke(main.clj:426)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.lang.Var.invoke(Var.java:401)
    at clojure.lang.AFn.applyToHelper(AFn.java:161)
    at clojure.lang.Var.applyTo(Var.java:518)
    at clojure.main.main(main.java:37)

Sorry for the inconvenience.

0 votes
by

Comment made by: mullr

Verified with Clojure 1.5.1:

`
clojure.lang.ArityException: Wrong number of args (4) passed to: user$eval147$fn

                                  AFn.java:437 clojure.lang.AFn.throwArity
                                   AFn.java:51 clojure.lang.AFn.invoke
                              (Unknown Source) user.proxy/java.io.InputStream[fn]
                              NO_SOURCE_FILE:9 user/eval147
                            Compiler.java:6619 clojure.lang.Compiler.eval
                            Compiler.java:6582 clojure.lang.Compiler.eval
                                 core.clj:2852 clojure.core/eval
                                  main.clj:259 clojure.main/repl[fn]
                                  main.clj:259 clojure.main/repl[fn]
                                  main.clj:277 clojure.main/repl[fn]
                                  main.clj:277 clojure.main/repl
                              RestFn.java:1096 clojure.lang.RestFn.invoke
                     interruptible_eval.clj:56 clojure.tools.nrepl.middleware.interruptible-eval/evaluate[fn]
                                  AFn.java:159 clojure.lang.AFn.applyToHelper
                                  AFn.java:151 clojure.lang.AFn.applyTo
                                  core.clj:617 clojure.core/apply
                                 core.clj:1788 clojure.core/with-bindings*
                               RestFn.java:425 clojure.lang.RestFn.invoke
                     interruptible_eval.clj:41 clojure.tools.nrepl.middleware.interruptible-eval/evaluate
                    interruptible_eval.clj:171 clojure.tools.nrepl.middleware.interruptible-eval/interruptible-eval[fn]
                                 core.clj:2330 clojure.core/comp[fn]
                    interruptible_eval.clj:138 clojure.tools.nrepl.middleware.interruptible-eval/run-next[fn]
                                   AFn.java:24 clojure.lang.AFn.run
                  ThreadPoolExecutor.java:1110 java.util.concurrent.ThreadPoolExecutor.runWorker
                   ThreadPoolExecutor.java:603 java.util.concurrent.ThreadPoolExecutor$Worker.run
                               Thread.java:722 java.lang.Thread.run

`

0 votes
by
Reference: https://clojure.atlassian.net/browse/CLJ-1001 (reported by alex+import)
...