public void fill_memory(byte[] b, ref int dynamic_memory_start) { int elements_struct_size = this.list.Sum(l => l.struct_size()); this.pointer_to_list = DataExtensions.FirstAvailableSize(b, dynamic_memory_start, elements_struct_size); Binary.BigEndian.Set(this.list.Count, b, address.Value); Binary.BigEndian.Set(this.pointer_to_list, b, address.Value + 4); DataExtensions.FillBytes(b, this.pointer_to_list, this.pointer_to_list + elements_struct_size); int curr_address = this.pointer_to_list; foreach (var item in list) { item.address = curr_address; curr_address += item.struct_size(); } if (curr_address > dynamic_memory_start) { dynamic_memory_start = curr_address; } foreach (var item in list) { item.fill_memory(b, ref dynamic_memory_start); } }
public void fill_memory(byte[] b, ref int dynamic_memory_start) { int aligned_char_length = Program.GetAligned_u32(value.Length + 1); this.pointer_to_string = DataExtensions.FirstAvailableSize(b, dynamic_memory_start, aligned_char_length); DataExtensions.FillBytes(b, this.pointer_to_string, this.pointer_to_string + aligned_char_length); for (int i = 0; i < value.Length; i++) { b[i + this.pointer_to_string] = (byte)this.value[i]; } b[value.Length + this.pointer_to_string] = (byte)'\0'; Binary.BigEndian.Set(this.pointer_to_string, b, address.Value); }