コード例 #1
0
        /// <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))));
        }
コード例 #2
0
        /// <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));
        }
コード例 #3
0
        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));
        }