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).

Parents Comment Children
No Data