Пример #1
0
        /// <summary>
        /// Defines a new label.
        ///
        /// This label can be used for branching, leave, and switch instructions.
        ///
        /// A label must be marked exactly once after being defined, using the MarkLabel() method.
        /// </summary>
        public Label DefineLabel(string name = null)
        {
            name = name ?? AutoNamer.Next(this, "_label", Locals.Names, Labels.Names);

            if (CurrentLabels.ContainsKey(name))
            {
                throw new InvalidOperationException("Label with name '" + name + "' already exists");
            }

            var label = IL.DefineLabel();

            var ret = new Label(this, label, name);

            UnusedLabels.Add(ret);
            UnmarkedLabels.Add(ret);

            CurrentLabels[name] = ret;

            return(ret);
        }
Пример #2
0
	private void CacheCurrentLabels()
	{
		if (m_currentLabelsCache != null)
			return;

		m_currentLabelsCache = new CurrentLabels();
		Dictionary<int, int> labels = m_lwf.GetMovieLabels(this);
		if (labels == null)
			return;

		foreach (KeyValuePair<int, int> kvp in labels) {
			LabelData labelData = new LabelData{
				frame = kvp.Value + 1,
				name = m_lwf.data.strings[kvp.Key],
			};
			m_currentLabelsCache.Add(labelData);
		}
		m_currentLabelsCache.Sort((a, b) => {
			return a.frame - b.frame;
		});
	}