"""
Visit all known INSTANCEs to see which methods can be marked as
non-virtual: a method is marked as non-virtual when it's never
overridden in the subclasses: this means that backends can translate
oosends relative to that method into non-virtual call (or maybe
switching back to a direct_call if the backend doesn't support
non-virtual calls, such as JVM).
"""

from rpython.rtyper.ootypesystem import ootype

def check_virtual_methods(INSTANCE=ootype.ROOT, super_methods = {}):
    my_methods = super_methods.copy()
    for name, method in INSTANCE._methods.iteritems():
        method._virtual = False
        my_methods[name] = method
        if name in super_methods:
            super_methods[name]._virtual = True

    for SUB_INSTANCE in INSTANCE._subclasses:
        check_virtual_methods(SUB_INSTANCE, my_methods)
