Skip to content

JVM crash with split-at

In some cases, an invocation of split-at results in a JVM crash. A simple example is below. split-at works fine if given a literal integer as the second argument (e.g., 2 in the example below).

$ cat w.scm
(import (scheme base)
        (scheme write)
        (only (srfi 1) split-at))

(let ((lst '(0 1 2 3)))
  (if (odd? (length lst))
      (error 'odd)
      (split-at lst
                (/ (length lst) 2))))
$ kawa w.scm
Exception in thread "main" java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    w.run(Lgnu/mapping/CallContext;)V @52: invokestatic
  Reason:
    Type 'gnu/math/RatNum' (current frame, stack[1]) is not assignable to 'gnu/math/IntNum'
  Current Frame:
    bci: @52
    flags: { }
    locals: { 'w', 'gnu/mapping/CallContext', 'gnu/lists/Consumer' }
    stack: { 'gnu/lists/PairWithPosition', 'gnu/math/RatNum' }
  Bytecode:
    0x0000000: 2bb4 0008 4db2 000c b600 1204 7e99 0014
    0x0000010: 04bd 0014 5903 b200 1853 b800 1eb2 0024
    0x0000020: bfb2 000c b200 0cb6 0012 b800 2a05 b800
    0x0000030: 2ab8 002f b800 352c b800 3bb1          
  Stackmap Table:
    append_frame(@16,Object[#90])
    same_frame(@33)

	at java.lang.Class.getDeclaredFields0(Native Method)
	at java.lang.Class.privateGetDeclaredFields(Class.java:2583)
	at java.lang.Class.getDeclaredField(Class.java:2068)
	at gnu.expr.ModuleContext.findInstance(ModuleContext.java:71)
	at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:286)
	at gnu.expr.CompiledModule.evalModule(CompiledModule.java:42)
	at gnu.expr.CompiledModule.evalModule(CompiledModule.java:60)
	at kawa.Shell.runFile(Shell.java:571)
	at kawa.Shell.runFileOrClass(Shell.java:474)
	at kawa.repl.processArgs(repl.java:710)
	at kawa.repl.main(repl.java:830)
$ kawa --version
Kawa 3.1.1 (git describe: 3.1.1-6-g079d3a6f1-dirty)
Copyright (C) 2020 Per Bothner
$ java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-8u242-b08-1~deb9u1-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)
$