This is the mail archive of the
kawa@sourceware.org
mailing list for the Kawa project.
issue: class field and its usage from lambda
- From: Fushacko Tito <imdagger at yandex dot ru>
- To: kawa at sourceware dot org
- Date: Tue, 07 Aug 2012 20:05:00 +0400
- Subject: issue: class field and its usage from lambda
Hi. I'm tried to use Kawa 1.12.1 (revision 7282) and 1.12 stable. Could anyone help me and explain why --main flag changes Kawa compiler's behavior radically? There is my simplified program (it looks little bit synthetic now):
(define-class FailClass ()
(x ::float access: 'private init: 0.0)
((wrap-x) (lambda () x))
((calculate-position)
(letrec ( (wrap-func (lambda () (wrap-x))) )
(wrap-func))))
For both Kawa 1.12.1 (revision 7282) and Kawa 1.12 release i got this traceback:
[imdagger@blacktears]$ java -jar /home/imdagger/kawa/kawa/kawa-1.12.1.jar -C test.scm
(compiling test.scm to test)
test.scm:4: internal error while compiling test.scm
java.lang.NullPointerException
at gnu.expr.LambdaExp.setCallersNeedStaticLink(LambdaExp.java:209)
at gnu.expr.LambdaExp.setNeedsStaticLink(LambdaExp.java:199)
at gnu.expr.FindCapturedVars.capture(FindCapturedVars.java:419)
at gnu.expr.FindCapturedVars.capture(FindCapturedVars.java:509)
at gnu.expr.FindCapturedVars.visitReferenceExp(FindCapturedVars.java:484)
at gnu.expr.FindCapturedVars.visitReferenceExp(FindCapturedVars.java:11)
at gnu.expr.ReferenceExp.visit(ReferenceExp.java:183)
at gnu.expr.ExpVisitor.visit(ExpVisitor.java:53)
at gnu.expr.LambdaExp.visitChildrenOnly(LambdaExp.java:1716)
at gnu.expr.LambdaExp.visitChildren(LambdaExp.java:1703)
at gnu.expr.ExpVisitor.visitExpression(ExpVisitor.java:29)
at gnu.expr.ExpVisitor.visitScopeExp(ExpVisitor.java:98)
at gnu.expr.ExpVisitor.visitLambdaExp(ExpVisitor.java:102)
at gnu.expr.FindCapturedVars.visitLambdaExp(FindCapturedVars.java:297)
at gnu.expr.FindCapturedVars.visitLambdaExp(FindCapturedVars.java:11)
at gnu.expr.LambdaExp.visit(LambdaExp.java:1692)
at gnu.expr.ExpVisitor.visit(ExpVisitor.java:53)
at gnu.expr.LambdaExp.visitChildrenOnly(LambdaExp.java:1716)
at gnu.expr.LambdaExp.visitChildren(LambdaExp.java:1703)
at gnu.expr.ExpVisitor.visitExpression(ExpVisitor.java:29)
at gnu.expr.ExpVisitor.visitScopeExp(ExpVisitor.java:98)
at gnu.expr.ExpVisitor.visitLambdaExp(ExpVisitor.java:102)
at gnu.expr.FindCapturedVars.visitLambdaExp(FindCapturedVars.java:297)
at gnu.expr.FindCapturedVars.visitLambdaExp(FindCapturedVars.java:11)
at gnu.expr.ClassExp.visitChildren(ClassExp.java:787)
at gnu.expr.ExpVisitor.visitExpression(ExpVisitor.java:29)
at gnu.expr.ExpVisitor.visitScopeExp(ExpVisitor.java:98)
at gnu.expr.ExpVisitor.visitLambdaExp(ExpVisitor.java:102)
at gnu.expr.FindCapturedVars.visitLambdaExp(FindCapturedVars.java:297)
at gnu.expr.FindCapturedVars.visitLambdaExp(FindCapturedVars.java:11)
at gnu.expr.ExpVisitor.visitClassExp(ExpVisitor.java:103)
at gnu.expr.FindCapturedVars.visitClassExp(FindCapturedVars.java:125)
at gnu.expr.FindCapturedVars.visitClassExp(FindCapturedVars.java:11)
at gnu.expr.ClassExp.visit(ClassExp.java:762)
at gnu.expr.ExpVisitor.visit(ExpVisitor.java:57)
at gnu.expr.ExpVisitor.visitAndUpdate(ExpVisitor.java:143)
at gnu.expr.ExpVisitor.visitSetExp(ExpVisitor.java:109)
at gnu.expr.FindCapturedVars.visitSetExp(FindCapturedVars.java:541)
at gnu.expr.FindCapturedVars.visitSetExp(FindCapturedVars.java:11)
at gnu.expr.SetExp.visit(SetExp.java:432)
at gnu.expr.ExpVisitor.visit(ExpVisitor.java:53)
at gnu.expr.LambdaExp.visitChildrenOnly(LambdaExp.java:1716)
at gnu.expr.LambdaExp.visitChildren(LambdaExp.java:1703)
at gnu.expr.ExpVisitor.visitExpression(ExpVisitor.java:29)
at gnu.expr.ExpVisitor.visitScopeExp(ExpVisitor.java:98)
at gnu.expr.ExpVisitor.visitLambdaExp(ExpVisitor.java:102)
at gnu.expr.FindCapturedVars.visitLambdaExp(FindCapturedVars.java:297)
at gnu.expr.FindCapturedVars.visitModuleExp(FindCapturedVars.java:152)
at gnu.expr.FindCapturedVars.visitModuleExp(FindCapturedVars.java:11)
at gnu.expr.ModuleExp.visit(ModuleExp.java:472)
at gnu.expr.FindCapturedVars.findCapturedVars(FindCapturedVars.java:17)
at gnu.expr.Compilation.process(Compilation.java:1940)
at gnu.expr.ModuleInfo.loadByStages(ModuleInfo.java:305)
at gnu.expr.ModuleInfo.loadByStages(ModuleInfo.java:290)
at gnu.expr.ModuleInfo.loadByStages(ModuleInfo.java:290)
at kawa.repl.compileFiles(repl.java:824)
at kawa.repl.processArgs(repl.java:444)
at kawa.repl.main(repl.java:870)
But --main option changes result:
[imdagger@blacktears]$ java -jar /home/imdagger/kawa/kawa/kawa-1.12.1.jar --main -C test.scm
(compiling test.scm to test)
Also experimentally I have got source which works for both cases, I used (this):x explicitly:
(define-class FailClass ()
(x ::float access: 'private init: 0.0)
((wrap-x) (lambda () (this):x))
((calculate-position)
(letrec ( (wrap-func (lambda () (wrap-x))) )
(wrap-func))))
Is it a bug or I should always use explicit way and avoid implicit usage object's fields?