/// <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); }
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; }); }