I initially discovered this in 1.9.2 with slime and all that, but I reproduced this on a build of d0a525323b640223bacfb17cde59db995f43cce9 from GitHub with ./abcl --noinit. I don't have a completely minimized case, but it's pretty small.
uname -a:
Darwin sew-MBA.local 24.1.0 Darwin Kernel Version 24.1.0: Thu Oct 10 21:05:14 PDT 2024; root:xnu-11215.41.3~2/RELEASE_ARM64_T8103 arm64
Reproduction:
Armed Bear Common Lisp 1.9.3-dev
Java 23.0.1 Homebrew
OpenJDK 64-Bit Server VM
Low-level initialization completed in 0.158 seconds.
Startup completed in 0.698 seconds.
Type ":help" for a list of available commands.
CL-USER(1): (setq class (jcall "arrayType" (jstatic "forPrimitiveName" "java.lang.Class" "float")))
#<java.lang.Class class [F {6290834B}>
CL-USER(2): (defun represent (class)
(cond
((jcall "isPrimitive" class)
(intern (string-upcase (jcall "getName" class)) "KEYWORD"))
((jcall "isArray" class)
(list :array (represent (jcall "componentType" class))))
(t (jcall "getName" class))))
REPRESENT
CL-USER(3): (represent class)
(:ARRAY :FLOAT)
CL-USER(4): (compile 'represent)
REPRESENT
NIL
NIL
CL-USER(5): (represent class)
:FLOAT
:EXTERNAL
CL-USER(6):
I think the interpreted result is correct, but either way it seems like a bug that they're different.
My story gets stranger. I tried to reproduce it with DRIBBLE (for this email) and I couldn't:
COMMON-LISP-USER> (setq class (jcall "arrayType" (jstatic "forPrimitiveName" "java.lang.Class" "float")))
#<java.lang.Class class [F {194B1E17}>
COMMON-LISP-USER> (defun represent (class)
(cond
((jcall "isPrimitive" class)
(intern (string-upcase (jcall "getName" class)) "KEYWORD"))
((jcall "isArray" class)
(list :array (represent (jcall "componentType" class))))
(t (jcall "getName" class))))
REPRESENT
COMMON-LISP-USER> (represent class)
(:ARRAY :FLOAT)
COMMON-LISP-USER> (compile 'represent)
REPRESENT
COMMON-LISP-USER> (represent class)
(:ARRAY :FLOAT)
COMMON-LISP-USER> (dribble)
If it's any help, I tried re-implementing the function a number of ways, and this was the first one I found that didn't exhibit the problem:
(defun represent (class)
(if (jcall "isArray" class)
(let*((component (jcall "componentType" class))
(mangled (represent component)))
(list :array mangled))
(let ((classname (jcall "getName" class)))
(if (jcall "isPrimitive" class)
(alexandria:make-keyword (string-upcase classname))
(jcall "getName" class)))))
Thanks all!