Ejemplo n.º 1
0
        private void V_SetTable(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 oldval = tbl.Get(ref key.V);
                    if (!oldval.V.TtIsNil())
                    {
                        tbl.Set(ref key.V, ref val.V);
                        return;
                    }

                    // check meta method
                    tmObj = FastTM(tbl.MetaTable, TMS.TM_NEWINDEX);
                    if (tmObj == null)
                    {
                        tbl.Set(ref key.V, ref val.V);
                        return;
                    }
                }
                else if (t.V.Tt == (int)LuaType.LUA_TLIGHTUSERDATA)
                {
                    if (!Utl.SetLightUserDataPropValue(t.V, key.V, ref val.V))
                    {
                        G_RunError(val.V.SValue());
                    }
                    return;

                    // else will try the tag method
                }
                else
                {
                    tmObj = T_GetTMByObj(ref t.V, TMS.TM_NEWINDEX);
                    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, false);
                    return;
                }

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