~ chicken-core (chicken-5) e39865ff77837f1b82a96e70aae92ffc1bbaf554
commit e39865ff77837f1b82a96e70aae92ffc1bbaf554
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Tue Jun 14 11:03:35 2011 +0200
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Sat Jun 18 17:11:16 2011 +0200
applied patch by sjamaan to fix #584; store both raw and aliased name in callback-names list
diff --git a/compiler.scm b/compiler.scm
index 760fb2ef..654dfcfe 100644
--- a/compiler.scm
+++ b/compiler.scm
@@ -1122,14 +1122,16 @@
((##core#foreign-callback-wrapper)
(let-values ([(args lam) (split-at (cdr x) 4)])
(let* ([lam (car lam)]
- [name (cadr (first args))]
+ [raw-c-name (cadr (first args))]
+ [name (##sys#alias-global-hook raw-c-name #t dest)]
[rtype (cadr (third args))]
[atypes (cadr (fourth args))]
[vars (second lam)] )
- (if (valid-c-identifier? name)
- (set! callback-names (cons name callback-names))
+ (if (valid-c-identifier? raw-c-name)
+ (set! callback-names
+ (cons (cons raw-c-name name) callback-names))
(quit "name `~S' of external definition is not a valid C identifier"
- name) )
+ raw-c-name) )
(when (or (not (proper-list? vars))
(not (proper-list? atypes))
(not (= (length vars) (length atypes))) )
@@ -1204,7 +1206,7 @@
e se #f #f h) ) ]
[(assq sym external-to-pointer)
=> (lambda (a) (walk (cdr a) e se #f #f h)) ]
- [(memq sym callback-names)
+ [(assq sym callback-names)
`(##core#inline_ref (,(symbol->string sym) c-pointer)) ]
[else
(walk
@@ -2024,7 +2026,7 @@
#t]
[else #f] ) )
vars) )
- (cond [(and has (not (memq sym callback-names)))
+ (cond [(and has (not (rassoc sym callback-names eq?)))
(put! db (first lparams) 'has-unused-parameters #t) ]
[rest
(set! explicitly-consed (cons rest explicitly-consed))
diff --git a/tests/compiler-tests.scm b/tests/compiler-tests.scm
index f4feb011..6b7432fc 100644
--- a/tests/compiler-tests.scm
+++ b/tests/compiler-tests.scm
@@ -138,6 +138,25 @@
"print_foo(\"bar\");"))
+;; Unused arguments in foreign callback wrappers are not optimized away (#584)
+(module bla (foo)
+
+(import chicken scheme foreign)
+
+(define-external
+ (blabla (int a) (c-string b) (int c) (int d) (c-string e) (int f))
+ int
+ f)
+
+(define (foo) ((foreign-safe-lambda* int () "C_return(blabla(1, \"2\", 3, 4, \"5\", 6));")))
+
+(assert (location blabla))
+)
+
+(import bla)
+(assert (= (foo) 6))
+
+
;;; compiler-syntax for map/for-each must be careful when the
; operator may have side-effects (currently only lambda exprs and symbols
; are allowed)
Trap