private static void SetKeyValue(LuaValue baseValue, LuaValue key, LuaValue value) { LuaValue newIndex = LuaNil.Nil; LuaTable table = baseValue as LuaTable; if (table != null) { if (table.ContainsKey(key)) { table.SetKeyValue(key, value); return; } else { if (table.MetaTable != null) { newIndex = table.MetaTable.GetValue("__newindex"); } if (newIndex == LuaNil.Nil) { table.SetKeyValue(key, value); return; } } } else { LuaUserdata userdata = baseValue as LuaUserdata; if (userdata != null) { if (userdata.MetaTable != null) { newIndex = userdata.MetaTable.GetValue("__newindex"); } if (newIndex == LuaNil.Nil) { throw new Exception("Assign field of userdata without __newindex defined."); } } } LuaFunction func = newIndex as LuaFunction; if (func != null) { func.Invoke(new LuaValue[] { baseValue, key, value }); } else { SetKeyValue(newIndex, key, value); } }
public override LuaValue Evaluate(LuaTable enviroment) { LuaTable table = new LuaTable(); foreach (Field field in this.FieldList) { NameValue nameValue = field as NameValue; if (nameValue != null) { table.SetNameValue(nameValue.Name, nameValue.Value.Evaluate(enviroment)); continue; } KeyValue keyValue = field as KeyValue; if (keyValue != null) { table.SetKeyValue( keyValue.Key.Evaluate(enviroment), keyValue.Value.Evaluate(enviroment)); continue; } ItemValue itemValue = field as ItemValue; if (itemValue != null) { table.AddValue(itemValue.Value.Evaluate(enviroment)); continue; } } return table; }
public override LuaValue Evaluate(LuaTable enviroment) { LuaTable table = new LuaTable(); foreach (Field field in this.FieldList) { NameValue nameValue = field as NameValue; if (nameValue != null) { table.SetNameValue(nameValue.Name, nameValue.Value.Evaluate(enviroment)); continue; } KeyValue keyValue = field as KeyValue; if (keyValue != null) { table.SetKeyValue( keyValue.Key.Evaluate(enviroment), keyValue.Value.Evaluate(enviroment)); continue; } ItemValue itemValue = field as ItemValue; if (itemValue != null) { table.AddValue(itemValue.Value.Evaluate(enviroment)); continue; } } return(table); }