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"); }