public override CodeNode VisitCreateFieldLocalForWriting(CreateFieldLocalForWritingNode node) { if (_FieldLocals.ContainsKey(node.FieldIndex)) { throw new InvalidOperationException(string.Format("Local for index {0} has already been created", node.FieldIndex)); } var local = ILGen.DeclareLocal(node.LocalType); _FieldLocals.Add(node.FieldIndex, local); if (node.LocalType.GetConstructor(new Type[0]) != null) { Log($"Creating new object for field {node.FieldIndex}"); ILGen.Newobj(local.LocalType); ILGen.Stloc(local); } else if (local.LocalType.IsValueType) { Log($"Initializing valuetype for field {node.FieldIndex}"); ILGen.Ldloca(local); ILGen.Initobj(local.LocalType); } else { Log($"Loading null for field {node.FieldIndex}"); ILGen.Ldnull(); ILGen.Stloc(local); } return(node); }
public override CodeNode VisitCreateFieldLocalForWriting(CreateFieldLocalForWritingNode node) { _Writer.WriteStartElement("CreateFieldLocalForWriting"); _Writer.WriteAttributeString("FieldIndex", node.FieldIndex.ToString()); _Writer.WriteAttributeString("LocalType", node.LocalType.ToString()); _Writer.WriteEndElement(); return(node); }
public virtual CodeNode VisitCreateFieldLocalForWriting(CreateFieldLocalForWritingNode node) { return(node); }