def check_unitialized(self, tree):
    params = [p.value for p in def_helper.get_def_params(tree)]
    block = def_helper.get_def_body(tree)

    possibly_undef = tokset_difference(block.live_in, tokset_new(params))
    if not tokset_empty(possibly_undef):
      for var, tok in possibly_undef.items():
        msg = i18n.i18n('Variable "%s" possibly uninitialized') % (var,)
        area = position.ProgramAreaNear(tok)
        raise GbsUninitializedVarException(msg, area)
    def compile_routine_def(self, tree):
        "Compile a single definition."
        prfn = def_helper.get_def_keyword(tree)
        name = def_helper.get_def_name(tree).value
        self._current_def_name = name
        params = [param.value for param in def_helper.get_def_params(tree)]

        immutable_params = []
        if prfn == 'function':
            immutable_params = params
        elif prfn == 'procedure' and len(params) > 1:
            immutable_params = params[1:]

        code = gbs_vm.GbsCompiledCode(tree, prfn, name, params, self.explicit_board)
        code.add_enter()
        for p in immutable_params:
                code.push(('setImmutable', p), near=tree)
        self.compile_commands(def_helper.get_def_body(tree), code)
        if prfn == 'procedure' and self.explicit_board:
            code.push(('pushFrom', params[0]), near=tree)
        code.add_leave_return()
        code.build_label_table()
        self.code.routines[name] = code