Esempio n. 1
0
        private void V_GetTable(StkId t, StkId key, StkId val)
        {
            for (int loop = 0; loop < MAXTAGLOOP; ++loop)
            {
                StkId tmObj;
                if (t.V.TtIsTable())
                {
                    var tbl = t.V.HValue();
                    var res = tbl.Get(ref key.V);
                    if (!res.V.TtIsNil())
                    {
                        val.V.SetObj(ref res.V);
                        return;
                    }

                    tmObj = FastTM(tbl.MetaTable, TMS.TM_INDEX);
                    if (tmObj == null)
                    {
                        val.V.SetObj(ref res.V);
                        return;
                    }
                }
                else if (t.V.Tt == (int)LuaType.LUA_TLIGHTUSERDATA)
                {
                    TValue res;
                    if (Utl.GetLightUserDataPropValue(t.V, key.V, out res))
                    {
                        val.V.SetObj(ref res);
                    }
                    else
                    {
                        G_RunError(res.SValue());
                    }
                    return;

                    // else will try the tag method
                }
                else
                {
                    tmObj = T_GetTMByObj(ref t.V, TMS.TM_INDEX);
                    if (tmObj.V.TtIsNil())
                    {
                        G_SimpleTypeError(ref t.V, "index");
                    }
                }

                if (tmObj.V.TtIsFunction())
                {
                    CallTM(ref tmObj.V, ref t.V, ref key.V, val, true);
                    return;
                }

                t = tmObj;
            }
            G_RunError("loop in gettable");
        }