'This function returns all the shadowed variables in a dict
in the form name: alias and will write the required assignments
into the current scope.  No indentation takes place.
This also predefines locally declared variables from the loop
body because under some circumstances it may be the case that
`extra_vars` is passed to `Frame.find_shadowed`.'

def push_scope(self, frame, extra_vars=()):

    aliases = {}
    for name in frame.find_shadowed(extra_vars):
        aliases[name] = ident = self.temporary_identifier()
        self.writeline(('%s    =    l_%s' % (ident, name)))
    to_declare = set()
    for name in frame.identifiers.declared_locally:
        if (name not in aliases):
            to_declare.add(('l_' + name))
    if to_declare:
        self.writeline(('    =    '.join(to_declare) + '    =    missing'))
    return aliases
