int PrepareUpvalue(GenerateFunction func, string name, out bool is_local) { int index; index = SearchFunctionLocalName(func, name); if (index >= 0) { is_local = true; return(index); } index = func.function.SearchUpValue(name); if (index < 0 && func.parent != null) { bool is_from_parent = false; index = PrepareUpvalue(func.parent, name, out is_from_parent); if (index >= 0) { index = func.function.AddUpValue(name, index, is_from_parent); } } is_local = false; return(index); }
int SearchFunctionLocalName(GenerateFunction func, string name) { var block = func.current_block; while (block != null) { LocalNameInfo name_info = null; if (block.names.TryGetValue(name, out name_info)) { return(name_info.register); } else { block = block.parent; } } return(-1); }
void EnterFunction(int define_line, string define_name) { var func = new GenerateFunction(); var parent = _current_func; func.parent = parent; func.function = new Function(); func.function.SetFileName(_file_name); func.define_line = define_line; if (parent != null) { var index = parent.function.AddChildFunction(func.function); func.func_index = index; } if (define_name == null) { define_name = parent.define_name + "+" + func.func_index; } func.define_name = define_name; func.function.SetFuncName(define_name); _current_func = func; }
void LeaveFunction() { // auto gc, just forget about it _current_func = _current_func.parent; }