Ticket #120 (new task)

Opened 5 months ago

Last modified 5 months ago

invoking methods with the same name as a field produces a confusing error

Reported by: jon Assigned to: dr2chase
Priority: major Milestone:
Component: interpreter Version:
Keywords: Cc:

Description

component x

export Executable

object foo(x:ZZ32)
    getter x():ZZ32 = x
end

run(args:String...) = do
    f = foo(1)
    println f.x()
end

end

Produces this error

/home/kazzmir/fortress/fortress-clean/bin/fortress
Guessing FORTRESS_HOME=/home/kazzmir/fortress/fortress-clean
com.sun.fortress.interpreter.evaluator.ProgramError: 
./x.fss:11:12~16: Unexpected method value 1: ZZ32 when invoking method x given receiver foo
        at com.sun.fortress.interpreter.evaluator.ProgramError.error(ProgramError.java:95)
        at com.sun.fortress.interpreter.evaluator.values.DottedMethodApplication.make(DottedMethodApplication.java:119)
        at com.sun.fortress.interpreter.evaluator.values.DottedMethodApplication.invokeMethod(DottedMethodApplication.java:132)
        at com.sun.fortress.interpreter.evaluator.Evaluator.invokeMethod(Evaluator.java:1158)
        at com.sun.fortress.interpreter.evaluator.Evaluator.juxtMemberSelection(Evaluator.java:1476)
        at com.sun.fortress.interpreter.evaluator.Evaluator.forTightJuxt(Evaluator.java:1394)
        at com.sun.fortress.interpreter.evaluator.Evaluator.forTightJuxt(Evaluator.java:1376)
        at com.sun.fortress.interpreter.evaluator.Evaluator.forTightJuxt(Evaluator.java:175)
        at com.sun.fortress.nodes.TightJuxt.accept(TightJuxt.java:57)
        at com.sun.fortress.interpreter.evaluator.Evaluator.eval(Evaluator.java:180)
        at com.sun.fortress.interpreter.evaluator.tasks.TupleTask.compute(TupleTask.java:41)
        at jsr166y.forkjoin.RecursiveAction.exec(RecursiveAction.java:247)
        at jsr166y.forkjoin.RecursiveAction.forkJoin(RecursiveAction.java:175)
        at com.sun.fortress.interpreter.evaluator.Evaluator.evalExprListParallel(Evaluator.java:494)
        at com.sun.fortress.interpreter.evaluator.Evaluator.forLooseJuxt(Evaluator.java:947)
        at com.sun.fortress.interpreter.evaluator.Evaluator.forLooseJuxt(Evaluator.java:175)
        at com.sun.fortress.nodes.LooseJuxt.accept(LooseJuxt.java:57)
        at com.sun.fortress.interpreter.evaluator.Evaluator.evalExprList(Evaluator.java:468)
        at com.sun.fortress.interpreter.evaluator.Evaluator.evalExprList(Evaluator.java:450)
        at com.sun.fortress.interpreter.evaluator.BuildLetEnvironments.forLocalVarDecl(BuildLetEnvironments.java:147)
        at com.sun.fortress.interpreter.evaluator.BuildLetEnvironments.forLocalVarDecl(BuildLetEnvironments.java:48)
        at com.sun.fortress.nodes.LocalVarDecl.accept(LocalVarDecl.java:99)
        at com.sun.fortress.interpreter.evaluator.BuildLetEnvironments.doLets(BuildLetEnvironments.java:151)
        at com.sun.fortress.interpreter.evaluator.Evaluator.evalExprList(Evaluator.java:466)
        at com.sun.fortress.interpreter.evaluator.Evaluator.evalExprList(Evaluator.java:450)
        at com.sun.fortress.interpreter.evaluator.Evaluator.forBlock(Evaluator.java:418)
        at com.sun.fortress.interpreter.evaluator.Evaluator.forBlock(Evaluator.java:175)
        at com.sun.fortress.nodes.Block.accept(Block.java:64)
        at com.sun.fortress.interpreter.evaluator.Evaluator.forDo(Evaluator.java:378)
        at com.sun.fortress.interpreter.evaluator.Evaluator.forDo(Evaluator.java:175)
        at com.sun.fortress.nodes.Do.accept(Do.java:64)
        at com.sun.fortress.interpreter.evaluator.Evaluator.eval(Evaluator.java:180)
        at com.sun.fortress.interpreter.evaluator.values.Closure.applyInner(Closure.java:212)
        at com.sun.fortress.interpreter.evaluator.values.Fcn.apply(Fcn.java:100)
        at com.sun.fortress.interpreter.drivers.Driver.runProgramTask(Driver.java:1159)
        at com.sun.fortress.interpreter.evaluator.tasks.EvaluatorTask.compute(EvaluatorTask.java:65)
        at jsr166y.forkjoin.RecursiveAction.forkJoin(RecursiveAction.java:234)
        at jsr166y.forkjoin.RecursiveAction.forkJoin(RecursiveAction.java:119)
        at jsr166y.forkjoin.Submission.compute(Submission.java:97)
        at jsr166y.forkjoin.Submission.exec(Submission.java:201)
        at jsr166y.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:285)

./x.fss:11:12~16: Unexpected method value 1: ZZ32 when invoking method x given receiver foo
Turn on -debug for Java-level error dump.

At the least that stack trace shouldn't be there and more preferably the error should be more helpful.

Change History

05/28/08 13:05:02 changed by jmaessen

Hmm, that's odd, we should never be letting a FortressError? cause a Java stack trace unless you're either: * Running with -debug (which exists specifically to enable this behavior for debugging the interpreter) * Running the test harness (in which case failures give a full stack trace)

I do not see a stack trace when running this program on my machine.

Right now fields and getters with the same name are not supported. This a shortcoming in the implementation of environments. It's definitely something we should fix (especially as we bring proper getters and setters on line).

05/28/08 13:40:46 changed by jon

I think you are right about the stack trace not being there. I had modified the CommandInterpreter? to dump the stack trace but I thought I had reverted that change before running this program. On a fresh checkout of the source I don't see the stack trace.