+ SeqPointInfoInflated info_inflated;
+ guint8 *ptr = (guint8*) info;
+ int value;
+
+ ptr += decode_var_int (ptr, &value);
+
+ info_inflated.len = value >> 2;
+ info_inflated.has_debug_data = (value & 1) != 0;
+ info_inflated.alloc_data = (value & 2) != 0;
+
+ if (info_inflated.alloc_data)
+ info_inflated.data = ptr;
+ else
+ memcpy (&info_inflated.data, ptr, sizeof (guint8*));
+
+ return info_inflated;
+}
+
+static MonoSeqPointInfo*
+seq_point_info_new (int len, gboolean alloc_data, guint8 *data, gboolean has_debug_data)
+{
+ MonoSeqPointInfo *info;
+ guint8 *info_ptr;
+ guint8 buffer[4];
+ int buffer_len;
+ int value;
+ int data_size;
+
+ value = len << 2;
+ if (has_debug_data)
+ value |= 1;
+ if (alloc_data)
+ value |= 2;
+
+ buffer_len = encode_var_int (buffer, value);
+
+ data_size = buffer_len + (alloc_data? len : sizeof (guint8*));
+ info_ptr = g_new0 (guint8, data_size);
+ info = (MonoSeqPointInfo*) info_ptr;
+
+ memcpy (info_ptr, buffer, buffer_len);
+ info_ptr += buffer_len;
+
+ if (alloc_data)
+ memcpy (info_ptr, data, len);
+ else
+ memcpy (info_ptr, &data, sizeof (guint8*));
+
+ mono_jit_stats.allocated_seq_points_size += data_size;
+
+ return info;
+}