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