예제 #1
0
        private static Exp OptimizeBnot(UnopExp exp)
        {
            switch (exp.Exp)
            {
            case IntegerExp ie:
            {
                ie.Val = ~ie.Val;
                return(ie);
            }

            case FloatExp fe:
            {
                if (LuaMath.FloatToInteger(fe.Val, out var ret))
                {
                    return(new IntegerExp
                        {
                            Line = exp.Line,
                            Val = ~ret
                        });
                }

                break;
            }
            }

            return(exp);
        }
예제 #2
0
        private bool StringToInteger(string s, out LuaInt ret)
        {
            if (Parser.ParseInteger(s, out ret))
            {
                return(true);
            }

            if (Parser.ParseFloat(s, out var f))
            {
                return(LuaMath.FloatToInteger(f, out ret));
            }

            ret = 0;
            return(false);
        }
예제 #3
0
        public bool ToInteger(out LuaInt ret)
        {
            if (IsInt())
            {
                ret = (LuaInt)_numValue;
                return(true);
            }
            else if (IsFloat())
            {
                return(LuaMath.FloatToInteger(_numValue, out ret));
            }
            else if (IsString())
            {
                return(StringToInteger((string)_objValue, out ret));
            }

            ret = 0;
            return(false);
        }
예제 #4
0
        private static bool CastToInt(Exp exp, out LuaInt ret)
        {
            ret = 0;
            switch (exp)
            {
            case IntegerExp ie:
            {
                ret = ie.Val;
                return(true);
            }

            case FloatExp fe:
            {
                return(LuaMath.FloatToInteger(fe.Val, out ret));
            }

            default:
                return(false);
            }
        }
예제 #5
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);
        }
예제 #6
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());
            }
        }