示例#1
0
        private int AuxGetInfo(string what, LuaDebug ar, StkId func, CallInfo ci)
        {
            int status = 1;

            for (int i = 0; i < what.Length; ++i)
            {
                char c = what[i];
                switch (c)
                {
                case 'S':
                {
                    FuncInfo(ar, func);
                    break;
                }

                case 'l':
                {
                    ar.CurrentLine = (ci != null && ci.IsLua) ? GetCurrentLine(ci) : -1;
                    break;
                }

                case 'u':
                {
                    Utl.Assert(func.V.TtIsFunction());
                    if (func.V.ClIsLuaClosure())
                    {
                        var lcl = func.V.ClLValue();
                        ar.NumUps    = lcl.Upvals.Length;
                        ar.IsVarArg  = lcl.Proto.IsVarArg;
                        ar.NumParams = lcl.Proto.NumParams;
                    }
                    else if (func.V.ClIsCsClosure())
                    {
                        var ccl = func.V.ClCsValue();
                        ar.NumUps    = ccl.Upvals.Length;
                        ar.IsVarArg  = true;
                        ar.NumParams = 0;
                    }
                    else
                    {
                        throw new System.NotImplementedException();
                    }
                    break;
                }

                case 't':
                {
                    ar.IsTailCall = (ci != null)
                                                        ? ((ci.CallStatus & CallStatus.CIST_TAIL) != 0)
                                                        : false;
                    break;
                }

                case 'n':
                {
                    var prevCI = BaseCI[ci.Index - 1];
                    if (ci != null &&
                        ((ci.CallStatus & CallStatus.CIST_TAIL) == 0) &&
                        prevCI.IsLua)
                    {
                        ar.NameWhat = GetFuncName(prevCI, out ar.Name);
                    }
                    else
                    {
                        ar.NameWhat = null;
                    }
                    if (ar.NameWhat == null)
                    {
                        ar.NameWhat = "";                                 // not found
                        ar.Name     = null;
                    }
                    break;
                }

                case 'L':
                case 'f':                         // handled by GetInfo
                    break;

                default: status = 0;                         // invalid option
                    break;
                }
            }
            return(status);
        }
示例#2
0
 private bool IsInStack(CallInfo ci, StkId o)
 {
     // TODO
     return(false);
 }