public void DefineFunction(IToken idToken, int nargs, int nlocals) { FunctionSymbol searchSym; if (_functions.TryGetValue(idToken.Text, out searchSym)) { if (searchSym.IsFwdRef) { searchSym.Define(_ip, nargs, nlocals); searchSym.ResolveFwdRefs(_code); } else { throw new GenerationException(String.Format("Function '{0}' already defined", idToken.Text)); } } else { searchSym = new FunctionSymbol(idToken.Text, _ip, _constPool.Count, nargs, nlocals); _functions.Add(idToken.Text, searchSym); _constPool.Add(searchSym); } }
public int GetFunctionIndex(string funcId) { FunctionSymbol searchSym; if (_functions.TryGetValue(funcId, out searchSym)) { if (searchSym.IsFwdRef) { searchSym.AddFwdRef(_ip); } return searchSym.ConstIndex; } else { searchSym = new FunctionSymbol(funcId, _constPool.Count); _functions.Add(funcId, searchSym); _constPool.Add(searchSym); searchSym.AddFwdRef(_ip); return searchSym.ConstIndex; } }