public static ContractParameter ToParameter(this StackItem item) { switch (item) { case VMArray array: return(new ContractParameter { Type = ContractParameterType.Array, Value = array.Select(p => p.ToParameter()).ToList() }); case Map map: return(new ContractParameter { Type = ContractParameterType.Map, Value = map.Select(p => new KeyValuePair <ContractParameter, ContractParameter>(p.Key.ToParameter(), p.Value.ToParameter())).ToList() }); case VMBoolean _: return(new ContractParameter { Type = ContractParameterType.Boolean, Value = item.GetBoolean() }); case ByteArray _: return(new ContractParameter { Type = ContractParameterType.ByteArray, Value = item.GetByteArray() }); case Integer _: return(new ContractParameter { Type = ContractParameterType.Integer, Value = item.GetBigInteger() }); case InteropInterface _: return(new ContractParameter { Type = ContractParameterType.InteropInterface }); default: throw new ArgumentException(); } }
public static ContractParameter ToParameter(this StackItem item) { TR.Enter(); switch (item) { case VMArray array: return(TR.Exit(new ContractParameter { Type = ContractParameterType.Array, Value = array.Select(p => p.ToParameter()).ToArray() })); case VMBoolean _: return(TR.Exit(new ContractParameter { Type = ContractParameterType.Boolean, Value = item.GetBoolean() })); case ByteArray _: return(TR.Exit(new ContractParameter { Type = ContractParameterType.ByteArray, Value = item.GetByteArray() })); case Integer _: return(TR.Exit(new ContractParameter { Type = ContractParameterType.Integer, Value = item.GetBigInteger() })); case InteropInterface _: return(TR.Exit(new ContractParameter { Type = ContractParameterType.InteropInterface })); default: TR.Exit(); throw new ArgumentException(); } }
public static ContractParameter ToParameter(this StackItem item) { switch (item.GetType().Name) { case "Array": case "Struct": return(new ContractParameter { Type = ContractParameterType.Array, Value = item.GetArray().Select(p => p.ToParameter()).ToArray() }); case "Boolean": return(new ContractParameter { Type = ContractParameterType.Boolean, Value = item.GetBoolean() }); case "ByteArray": return(new ContractParameter { Type = ContractParameterType.ByteArray, Value = item.GetByteArray() }); case "Integer": return(new ContractParameter { Type = ContractParameterType.Integer, Value = item.GetBigInteger() }); case "InteropInterface": return(new ContractParameter { Type = ContractParameterType.InteropInterface }); default: throw new ArgumentException(); } }
private static ContractParameter ToParameter(StackItem item, List <Tuple <StackItem, ContractParameter> > context) { ContractParameter parameter = null; switch (item) { case VMArray array: if (context is null) { context = new List <Tuple <StackItem, ContractParameter> >(); } else { parameter = context.FirstOrDefault(p => ReferenceEquals(p.Item1, item))?.Item2; } if (parameter is null) { parameter = new ContractParameter { Type = ContractParameterType.Array }; context.Add(new Tuple <StackItem, ContractParameter>(item, parameter)); parameter.Value = array.Select(p => ToParameter(p, context)).ToList(); } break; case Map map: if (context is null) { context = new List <Tuple <StackItem, ContractParameter> >(); } else { parameter = context.FirstOrDefault(p => ReferenceEquals(p.Item1, item))?.Item2; } if (parameter is null) { parameter = new ContractParameter { Type = ContractParameterType.Map }; context.Add(new Tuple <StackItem, ContractParameter>(item, parameter)); parameter.Value = map.Select(p => new KeyValuePair <ContractParameter, ContractParameter>(ToParameter(p.Key, context), ToParameter(p.Value, context))).ToList(); } break; case VMBoolean _: parameter = new ContractParameter { Type = ContractParameterType.Boolean, Value = item.GetBoolean() }; break; case ByteArray _: parameter = new ContractParameter { Type = ContractParameterType.ByteArray, Value = item.GetByteArray() }; break; case Integer _: parameter = new ContractParameter { Type = ContractParameterType.Integer, Value = item.GetBigInteger() }; break; case InteropInterface _: parameter = new ContractParameter { Type = ContractParameterType.InteropInterface }; break; default: throw new ArgumentException(); } return(parameter); }
private void SerializeStackItem(StackItem item, BinaryWriter writer) { List <StackItem> serialized = new List <StackItem>(); Stack <StackItem> unserialized = new Stack <StackItem>(); unserialized.Push(item); while (unserialized.Count > 0) { item = unserialized.Pop(); switch (item) { case ByteArray _: writer.Write((byte)StackItemType.ByteArray); writer.WriteVarBytes(item.GetByteArray()); break; case VMBoolean _: writer.Write((byte)StackItemType.Boolean); writer.Write(item.GetBoolean()); break; case Integer _: writer.Write((byte)StackItemType.Integer); writer.WriteVarBytes(item.GetByteArray()); break; case InteropInterface _: throw new NotSupportedException(); case VMArray array: if (serialized.Any(p => ReferenceEquals(p, array))) { throw new NotSupportedException(); } serialized.Add(array); if (array is Struct) { writer.Write((byte)StackItemType.Struct); } else { writer.Write((byte)StackItemType.Array); } writer.WriteVarInt(array.Count); for (int i = array.Count - 1; i >= 0; i--) { unserialized.Push(array[i]); } break; case Map map: if (serialized.Any(p => ReferenceEquals(p, map))) { throw new NotSupportedException(); } serialized.Add(map); writer.Write((byte)StackItemType.Map); writer.WriteVarInt(map.Count); foreach (var pair in map.Reverse()) { unserialized.Push(pair.Value); unserialized.Push(pair.Key); } break; } } }