Пример #1
0
        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);
        }
Пример #2
0
 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);
 }
Пример #3
0
 public virtual CodeNode VisitCreateFieldLocalForWriting(CreateFieldLocalForWritingNode node)
 {
     return(node);
 }