Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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;
        }
Beispiel #4
0
 void LeaveFunction()
 {
     // auto gc, just forget about it
     _current_func = _current_func.parent;
 }