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