Under Review
over 2 years ago

Sdk 4.1.6 can't lookup static methods from within the class

Given:

module Statics {
    var ok as Boolean = false;
    class C {
        function initialize() {
            C.foo();
        }
        static function bar() as Void {
            C.foo();
        }

        private static function foo() as Void {
            ok = true;
        }
    }

    (:test)
    function static_from_initialize(logger as Logger) as Boolean {
        ok = false;
        var c = new C();
        return ok;
    }
    (:test)
    function static_from_static(logger as Logger) as Boolean {
        ok = false;
        C.bar();
        return ok;
    }
}

The code compiles and works as expected with sdk-4.1.5 and earlier (ie C.foo() is successfully called, both from C.initialize() and from C.bar()),

With sdk-4.1.6 the type checker is happy (it compiles with Strict type checking), but fails at runtime with:

Executing test Statics.static_from_initialize...

Error: Symbol Not Found Error
Details: Could not find symbol 'foo'
Stack: 
  - initialize() at /Users/mwilliams/www/git/monkeyc-optimizer/test/OptimizerTests/source/OptimizerTestsLookup.mc:288 0x10003151 
  - static_from_initialize() at /Users/mwilliams/www/git/monkeyc-optimizer/test/OptimizerTests/source/OptimizerTestsLookup.mc:302 0x10003181 
  - evaluate_test_entries_30_to_39() at UnitTests.mc:182 0x10001bc6 
  - runTest() at UnitTests.mc:215 0x10001d92 
ERROR
------------------------------------------------------------------------------
Executing test Statics.static_from_static...

Error: Symbol Not Found Error
Details: Could not find symbol 'foo'
Stack: 
  - bar() at /Users/mwilliams/www/git/monkeyc-optimizer/test/OptimizerTests/source/OptimizerTestsLookup.mc:291 0x1000312f 
  - static_from_static() at /Users/mwilliams/www/git/monkeyc-optimizer/test/OptimizerTests/source/OptimizerTestsLookup.mc:308 0x100031b2 
  - evaluate_test_entries_30_to_39() at UnitTests.mc:185 0x10001bed 
  - runTest() at UnitTests.mc:215 0x10001d92 
ERROR

I caught this building the Meditate folder in the open source project https://github.com/vtrifonov-esfiddle/Meditate . The built project runs correctly with 4.1.5 and earlier, but fails when you hit the start button with 4.1.6.

It also looks like the 4.2.0-beta sdk has the same issue - and in fact it seems to be another compiler2 vs compiler1 issue, because compiling with 4.1.6 or 4.2.0-beta at -O0 fixes the problem.

EDIT:

The bug only affects private and protected references. And if I look at the output with -g, I see this with from sdk-4.1.5:

        lgetv 0
        spush C
        getv 
        spush <globals/Statics/C/<>foo>
        getv 
        frpush 
        invokem 1
        popv 
        

But this from sdk-4.1.6

    lgetv 0
    spush C
    getv
    spush foo
    getv
    frpush
    invokem 1
    popv

So 4.1.5 is correctly pushing the "private" symbol for foo, while 4.1.6 is incorrectly pushing the public symbol.

Also, if I make foo protected, instead of private, and create a class D which extends C, and have that try to call C.foo, it fails the same way with 4.1.6 AND 4.1.5 (but again, the type checker is happy with both compiler versions).