This is the mail archive of the
kawa@sourceware.org
mailing list for the Kawa project.
Re: Reflection on function argument types
- From: Per Bothner <per at bothner dot com>
- To: Duncan Mak <duncanmak at gmail dot com>, kawa mailing list <kawa at sourceware dot org>
- Date: Sun, 1 Jan 2017 10:19:18 -0800
- Subject: Re: Reflection on function argument types
- Authentication-results: sourceware.org; auth=none
- References: <CABgWrqqcC2v96NiJ_m7MqFBRtjpbFy0FaoWDKLULmtgS3vTNEQ@mail.gmail.com>
On 12/27/2016 09:34 PM, Duncan Mak wrote:
I wrote the following code:
(import (srfi 1))
(define (foo (a :: integer)) (+ a a))
(define (hello-number (n :: number) (i :: number)) (list "number" n))
(define (hello-string (s :: string)) (list "string" s))
(define (print-types (func :: gnu.mapping.MethodProc))
(display (procedure-property func 'name)) (newline)
(for-each (lambda (t) (display t) (newline))
(map (lambda (i) (func:getParameterType i)) (iota
(func:numParameters))))
(newline))
(print-types foo)
(print-types hello-number)
(print-types hello-string)
I'm surprise to see that the output differs between foo and hello-*:
foo
Type integer
hello-number
ClassType java.lang.Object
ClassType java.lang.Object
hello-string
ClassType java.lang.Object
Why is it that I only see java.lang.Object for the hello-* functions?
Shouldn't number and string show up, like it did for foo?
This turns out to be a problem with demangling. 'foo' works because
it doesn't have any special characters.
In ModuleMethod.java in resolveParameterTypes it says:
String mangledName = Mangling.mangleNameIfNeeded(name);
but it should be:
String mangledName = Mangling.mangleName(name);
Unfortunately, fixing this improves the accuracy of type-checking
enough to cause some problems. For example this code
(simplified from r7rs-tests.scm):
(let ((val 'abc))
(cond ((and (complex? val)
(not (nan? val)))
(display val))))
Kawa complains that the call to nan? is invalid because the argument val
is a symbol. This is bogus, since the previous test to complex? ensures
nan? is never called.
I created this issue:
https://gitlab.com/kashell/Kawa/issues/1
--
--Per Bothner
per@bothner.com http://per.bothner.com/