Exemple #1
0
        private bool Eq(LuaValue a, LuaValue b, LuaState ls)
        {
            if (a.IsNil())
            {
                return(b.IsNil());
            }
            else if (a.IsBool())
            {
                return(b.IsBool() && a.GetBoolValue() == b.GetBoolValue());
            }
            else if (a.IsString())
            {
                return(b.IsString() && a.GetStrValue() == b.GetStrValue());
            }
            else if (a.IsInt())
            {
                if (b.IsInt())
                {
                    return(a.GetIntValue() == b.GetIntValue());
                }
                else if (b.IsFloat())
                {
                    return(a.GetIntValue() == b.GetFloatValue());
                }
                else
                {
                    return(false);
                }
            }
            else if (a.IsFloat())
            {
                if (b.IsFloat())
                {
                    return(a.GetFloatValue() == b.GetFloatValue());
                }
                else if (b.IsInt())
                {
                    return(a.GetFloatValue() == b.GetIntValue());
                }
                else
                {
                    return(false);
                }
            }
            else if (a.IsTable() &&
                     b.IsTable() &&
                     a.GetTableValue() != b.GetTableValue() && ls != null)
            {
                if (LuaValue.CallMetaMethod(a, b, "__eq", ls, out var metaMethodRet))
                {
                    return(metaMethodRet.ToBoolean());
                }

                return(a.GetValue() == b.GetValue());
            }
            else
            {
                return(a.GetValue() == b.GetValue());
            }
        }
Exemple #2
0
        public LuaValue Get(LuaValue key)
        {
            LuaInt idx = 0;

            if (key.IsInt())
            {
                idx = key.GetIntValue();
            }
            else if (key.IsFloat())
            {
                if (LuaMath.FloatToInteger(key.GetFloatValue(), out var fi))
                {
                    idx = fi;
                }
            }

            if (idx >= 1 && idx <= Len())
            {
                return(_arr[(int)(idx - 1)]);
            }

            return(_map != null && _map.TryGetValue(key.GetValue(), out var ret) ? ret : LuaValue.Nil);
        }
Exemple #3
0
        public void Put(LuaValue key, LuaValue val)
        {
            if (key is null || key.IsNil())
            {
                Debug.Panic("table index is nil!");
            }

            if (key.IsFloat() && LuaFloat.IsNaN(key.GetFloatValue()))
            {
                Debug.Panic("table index is Nan!");
            }

            _changed = true;

            LuaInt idx = 0;

            if (key.IsInt())
            {
                idx = key.GetIntValue();
            }
            else if (key.IsFloat())
            {
                if (LuaMath.FloatToInteger(key.GetFloatValue(), out var fi))
                {
                    idx = fi;
                }
            }

            if (idx >= 1)
            {
                var arrLen = Len();
                if (idx <= arrLen)
                {
                    _arr[(int)(idx - 1)] = val;
                    if (idx == arrLen && val.IsNil())
                    {
                        ShrinkArray();
                    }
                    return;
                }

                if (idx == arrLen + 1)
                {
                    if (_map != null && _map.ContainsKey(key.GetIntValue()))
                    {
                        _map.Remove(key.GetIntValue());
                    }

                    if (!val.IsNil())
                    {
                        if (_arr == null)
                        {
                            _arr = new List <LuaValue>();
                        }

                        _arr.Add(val);
                        ExpandArray();
                    }

                    return;
                }
            }

            if (!val.IsNil())
            {
                if (_map == null)
                {
                    _map = new Dictionary <object, LuaValue>();
                }

                _map[key.GetValue()] = val;
            }
            else
            {
                _map.Remove(key.GetValue());
            }
        }