Skip to content

Commit

Permalink
Added CreateStruct, Fixed CreateMap
Browse files Browse the repository at this point in the history
  • Loading branch information
cschuchardt88 committed Sep 20, 2024
1 parent 9946450 commit 49aea69
Showing 1 changed file with 44 additions and 12 deletions.
56 changes: 44 additions & 12 deletions src/Neo/VM/Helper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,18 +54,50 @@ public static ScriptBuilder CreateArray<T>(this ScriptBuilder builder, IReadOnly
/// <param name="builder">The <see cref="ScriptBuilder"/> to be used.</param>
/// <param name="map">The key/value pairs of the map.</param>
/// <returns>The same instance as <paramref name="builder"/>.</returns>
public static ScriptBuilder CreateMap<TKey, TValue>(this ScriptBuilder builder, IEnumerable<KeyValuePair<TKey, TValue>> map = null)
public static ScriptBuilder CreateMap<TKey, TValue>(this ScriptBuilder builder, IEnumerable<KeyValuePair<TKey, TValue>> map)
where TKey : notnull
where TValue : notnull
{
builder.Emit(OpCode.NEWMAP);
if (map != null)
foreach (var p in map)
{
builder.Emit(OpCode.DUP);
builder.EmitPush(p.Key);
builder.EmitPush(p.Value);
builder.Emit(OpCode.SETITEM);
}
return builder;
var count = map.Count();

if (count == 0)
return builder.Emit(OpCode.NEWMAP);

foreach (var (key, value) in map)
{
builder.EmitPush(value);
builder.EmitPush(key);
}
builder.EmitPush(count);
return builder.Emit(OpCode.PACKMAP);
}

public static ScriptBuilder CreateMap<TKey, TValue>(this ScriptBuilder builder, IReadOnlyDictionary<TKey, TValue> map)
where TKey : notnull
where TValue : notnull
{
if (map.Count == 0)
return builder.Emit(OpCode.NEWMAP);

foreach (var (key, value) in map)
{
builder.EmitPush(value);
builder.EmitPush(key);
}
builder.EmitPush(map.Count);
return builder.Emit(OpCode.PACKMAP);
}


public static ScriptBuilder CreateStruct<T>(this ScriptBuilder builder, IReadOnlyList<T> array)
where T : notnull
{
if (array.Count == 0)
return builder.Emit(OpCode.NEWSTRUCT0);
for (var i = array.Count - 1; i >= 0; i--)
builder.EmitPush(array[i]);
builder.EmitPush(array.Count);
return builder.Emit(OpCode.PACKSTRUCT);
}

/// <summary>
Expand Down Expand Up @@ -218,7 +250,7 @@ public static ScriptBuilder EmitPush(this ScriptBuilder builder, object obj)
builder.EmitPush(data);
break;
case char data:
builder.EmitPush((ushort)data);
builder.EmitPush(data);
break;
case ushort data:
builder.EmitPush(data);
Expand Down

0 comments on commit 49aea69

Please sign in to comment.