/// <summary> /// Called when the item is a table item. /// </summary> /// <param name="target">The object that was passed to IParseItem.Visit.</param> /// <returns>The passed target or a modification of it.</returns> /// <exception cref="System.ArgumentNullException">If target is null.</exception> public IParseItem Visit(TableItem target) { if (target == null) throw new ArgumentNullException("target"); var gen = compiler.CurrentGenerator; var loc = compiler.CreateTemporary(typeof(ILuaValue)); // loc = E.Runtime.CreateTable(); gen.Emit(OpCodes.Ldarg_1); gen.Emit(OpCodes.Callvirt, typeof(ILuaEnvironment).GetMethod("get_Runtime")); gen.Emit(OpCodes.Callvirt, typeof(ILuaRuntime).GetMethod("CreateTable")); gen.Emit(OpCodes.Stloc, loc); foreach (var item in target.Fields) { // Does not need to use SetItemRaw becuase there is no Metatable. // loc.SetIndex({item.Item1}, {item.Item2}); gen.Emit(OpCodes.Ldloc, loc); item.Key.Accept(this); item.Value.Accept(this); gen.Emit(OpCodes.Callvirt, typeof(ILuaValue).GetMethod("SetIndex")); } //! push loc; gen.Emit(OpCodes.Ldloc, loc); compiler.RemoveTemporary(loc); return target; }
/// <summary> /// Called when the item is a table item. /// </summary> /// <param name="target">The object that was passed to IParseItem.Visit.</param> /// <returns>The passed target or a modification of it.</returns> /// <exception cref="System.ArgumentNullException">If target is null.</exception> public IParseItem Visit(TableItem target) { if (target == null) throw new ArgumentNullException("target"); foreach (var item in target.Fields) { item.Key.Accept(this); item.Value.Accept(this); } return target; }
/// <summary> /// Reads a table from the input. Input must be either on the starting '{'. /// </summary> /// <param name="input">Where to read input from.</param> /// <param name="token">The token to append the read Tokenm to.</param> /// <returns>The table that was read.</returns> protected virtual TableItem ReadTable(ITokenizer input, ref Token token) { Token debug = input.Read(); if (debug.Value != "{") throw new SyntaxException( string.Format(Resources.TokenInvalidExpecting, debug.Value, "table", "{"), input.Name, debug); TableItem ret = new TableItem(); Token last = input.Peek(); while (last.Value != "}") { if (last.Value == "[") { Read(input, ref debug); // read the "[" var temp = ReadExp(input, ref debug); if (temp == null) throw new SyntaxException(string.Format(Resources.InvalidDefinition, "table"), input.Name, debug); // read ']' last = Read(input, ref debug); if (last.Value != "]") throw new SyntaxException( string.Format(Resources.TokenInvalidExpecting, last.Value, "table", "]"), input.Name, last); // read '=' last = Read(input, ref debug); if (last.Value != "=") throw new SyntaxException( string.Format(Resources.TokenInvalidExpecting, last.Value, "table", "="), input.Name, last); // read the expression var val = ReadExp(input, ref debug); if (val == null) throw new SyntaxException(string.Format(Resources.InvalidDefinition, "table"), input.Name, debug); ret.AddItem(temp, val); } else { var val = ReadExp(input, ref debug); if (input.Peek().Value == "=") { Read(input, ref debug); // read '=' NameItem name = val as NameItem; if (name == null) throw new SyntaxException(string.Format(Resources.InvalidDefinition, "table"), input.Name, debug); // read the expression var exp = ReadExp(input, ref debug); ret.AddItem(new LiteralItem(name.Name), exp); } else { ret.AddItem(null, val); } } if (input.Peek().Value != "," && input.Peek().Value != ";") break; else Read(input, ref debug); last = input.Peek(); } // end While Token end = Read(input, ref debug); // read the "}" if (end.Value != "}") throw new SyntaxException( string.Format(Resources.TokenInvalidExpecting, end.Value, "table", "}"), input.Name, end); ret.Debug = debug; token.Append(debug); return ret; }