8000 CLJ-2858 Fix encoding of FnInvoker method for prim-returning FIs with… · clojure/clojure@9048cd1 · GitHub
[go: up one dir, main page]

Skip to content

Commit 9048cd1

Browse files
committed
CLJ-2858 Fix encoding of FnInvoker method for prim-returning FIs with arity > 2
1 parent 68dbd07 commit 9048cd1

File tree

7 files changed

+391
-370
lines changed

7 files changed

+391
-370
lines changed

codegen/gen_fn_adapter_tests.clj

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -126,24 +126,24 @@ public class AdapterExerciser {")
126126
(defn gen-test-functional-adapters-in-def []
127127
(let [sb (StringBuilder. ^String (def-test-header "generated-functional-adapters-in-def"))
128128
adapter-signatures (gen-sigs)]
129-
(doseq [[idx sig] (map-indexed (fn [idx itm] [idx itm]) adapter-signatures)]
129+
(doseq [sig adapter-signatures]
130130
(let [{:keys [fn-vars fn-body]} (format-parts sig)]
131131
(.append sb "\n")
132132
(.append sb (format " (def %sadapter (fn [%s] %s))" sig fn-vars fn-body))
133133
(.append sb "\n")
134-
(.append sb (format " (is (= (.method%s ^AdapterExerciser exerciser %sadapter) %s))" sig sig idx))))
134+
(.append sb (format " (is (= (.method%s ^AdapterExerciser exerciser %sadapter) %s))" sig sig (str "\"" sig "\"")))))
135135
(.append sb ")")
136136
(spit "generated_functional_adapters_in_def.clj" (.toString sb))))
137137

138138
(defn gen-test-functional-adapters-in-def-requiring-reflection []
139139
(let [sb (StringBuilder. ^String (def-test-header "generated-functional-adapters-in-def-requiring-reflection"))
140140
adapter-signatures (gen-sigs)]
141-
(doseq [[idx sig] (map-indexed (fn [idx itm] [idx itm]) adapter-signatures)]
141+
(doseq [sig adapter-signatures]
142142
(let [{:keys [fn-vars fn-body]} (format-parts sig)]
143143
(.append sb "\n")
144144
(.append sb (format " (def %sadapter (fn [%s] %s))" sig fn-vars fn-body))
145145
(.append sb "\n")
146-
(.append sb (format " (is (= (.method%s exerciser %sadapter) %s))" sig sig idx))))
146+
(.append sb (format " (is (= (.method%s exerciser %sadapter) %s))" sig sig (str "\"" sig "\"")))))
147147
(.append sb ")")
148148
(spit "generated_functional_adapters_in_def_requiring_reflection.clj" (.toString sb))))
149149

@@ -157,13 +157,20 @@ public class AdapterExerciser {")
157157
(.append sb (format " public interface %s {\n" sig))
158158
(.append sb (format " public %s takes%sRet%s(%s);\n" return-type (str/join "" input-types) return-type-initial java-vars))
159159
(.append sb " }")))
160-
(doseq [[idx sig] (map-indexed (fn [idx itm] [idx itm]) adapter-signatures)]
160+
(doseq [sig adapter-signatures]
161161
(.append sb "\n")
162-
(.append sb (format " public int method%s(%s a) { return %s; }" sig sig idx)))
162+
(.append sb (format " public String method%s(%s a) { return %s; }" sig s 10000 ig (str "\"" sig "\""))))
163163
(.append sb "}")
164164
(spit "AdapterExerciser.java" (.toString sb))))
165165

166+
(defn gen-all []
167+
(gen-test-all-fi-adapters-in-let)
168+
(gen-test-functional-adapters-in-def)
169+
(gen-test-functional-adapters-in-def-requiring-reflection)
170+
(gen-adapter-exerciser-class))
171+
166172
(comment
173+
(gen-all)
167174
(gen-test-all-fi-adapters-in-let)
168175
(gen-test-functional-adapters-in-def)
169176
(gen-test-functional-adapters-in-def-requiring-reflection)

src/jvm/clojure/lang/Compiler.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1672,7 +1672,11 @@ static boolean maybeEmitFIAdapter(ObjExpr objx, GeneratorAdapter gen, Expr expr,
16721672
invokerParams[i + 1] = paramCount <= 2 ? toInvokerParamType(targetMethod.getParameterTypes()[i]) : Object.class;
16731673
invokeMethodBuilder.append(FnInvokers.encodeInvokerType(invokerParams[i + 1]));
16741674
}
1675-
char invokerReturnCode = FnInvokers.encodeInvokerType(targetMethod.getReturnType());
1675+
// FnInvokers has prim returns for <= 2 params, only boolean or Object for higher
1676+
Class retType = targetMethod.getReturnType();
1677+
char invokerReturnCode = FnInvokers.encodeInvokerType(
1678+
paramCount <= 2 ? retType :
1679+
(Boolean.TYPE.equals(retType) ? retType : Object.class));
16761680
invokeMethodBuilder.append(invokerReturnCode);
16771681
String invokerMethodName = invokeMethodBuilder.toString();
16781682

test/clojure/test_clojure/generated_all_fi_adapters_in_let.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
(ns clojure.test-clojure.generated-all-fi-adapters-in-let
33
(:use clojure.test)
44
(:require [clojure.string :as str])
5-
(:import (clojure.test AdapterExerciser AdapterExerciser$L
5+
(:import (clojure.test AdapterExerciser AdapterExerciser$L
66
AdapterExerciser$I
77
AdapterExerciser$S
88
AdapterExerciser$B

0 commit comments

Comments
 (0)
0