/// <summary> /// Writes out an array initialization. /// </summary> /// <param name="builder">The <see cref="Builder"/> to build the initialization in.</param> /// <param name="elementType">The element <see cref="Type"/> in the array.</param> /// <param name="values">The <see cref="Value"/>s to initialize array elements to.</param> /// <returns>The pointer <see cref="Value"/> to the allocated and initialized array.</returns> public static Value InitArray(this Builder builder, Type elementType, params Value[] values) { var arrayLen = values.Length; var arrayType = new Type.Array(elementType, arrayLen); int index = 0; return(InitArray( builder, arrayType, values.Select(v => new KeyValuePair <int, Value>(index++, v)))); }
/// <summary> /// Reads an UTF-8 encoded string from memory. /// </summary> /// <param name="ptr">The pointer to read from.</param> /// <param name="length">The length of the string to read (in bytes).</param> /// <returns>The read string</returns> public string ReadUtf8FromMemory(Value ptr, int length) { if (!(ptr is PtrValue ptrValue)) { throw new ArgumentException("Must read from a pointer value!", nameof(ptr)); } var arrayType = new Type.Array(Type.U8, length); var arrayValue = (Value.Array)ReadFromMemory(ptrValue.OffsetBy(0, arrayType)); // Convert to bytes var bytes = arrayValue.Values.Select(v => (byte)((Value.Int)v).Value).ToArray(); return(Encoding.UTF8.GetString(bytes)); }
public void ArrayElement2() { var b = GetBuilder(); var arrTy = new Type.Array(Type.I32, 3); var arrPtr = b.Alloc(arrTy); var intPtr = b.Cast(new Type.Ptr(Type.I32), arrPtr); for (int i = 0; i < 3; ++i) { b.Store(b.Add(intPtr, Type.I32.NewValue(i)), Type.I32.NewValue(2 * i + 1)); } b.Ret(b.Load(b.Add(intPtr, Type.I32.NewValue(2)))); TestOnAllBackends(b, Type.I32.NewValue(5)); }