Пример #1
0
 public SafeLabel GetLabel(string Name)
 {
     if (!Labels.ContainsKey(Name))
     {
         Labels.Add(Name, SafeILGenerator.DefineLabel(Name));
     }
     return(Labels[Name]);
 }
Пример #2
0
        public void SwitchStatement(CParser.SwitchStatement SwitchStatement)
        {
            PutDebugLine(SwitchStatement);

            SafeILGenerator.SaveRestoreTypeStack(() =>
            {
                // TODO: improve speed with tables and proper switch instead of lot of "if" checks.
                var MapLabels    = new Dictionary <int, SafeLabel>();
                var DefaultLabel = SafeILGenerator.DefineLabel("SwitchDefault");
                var EndLabel     = SafeILGenerator.DefineLabel("SwitchEnd");

                //var SwitchExpressionLocal = SafeILGenerator.DeclareLocal<long>("SwitchReference");
                //SafeILGenerator.LoadLocal(SwitchExpressionLocal);

                //foreach (var SwitchCaseStatement in SwitchStatement.Statements.Statements.Where(Item => Item is CParser.SwitchCaseStatement).Cast<CParser.SwitchCaseStatement>())
                foreach (var Statement in SwitchStatement.Statements.Statements)
                {
                    var SwitchCaseStatement    = Statement as CParser.SwitchCaseStatement;
                    var SwitchDefaultStatement = Statement as CParser.SwitchDefaultStatement;

                    if (SwitchCaseStatement != null)
                    {
                        var Value               = SwitchCaseStatement.Value.GetConstantValue <int>(null);
                        var CaseLabel           = SafeILGenerator.DefineLabel("SwitchCase");
                        SwitchCaseStatement.Tag = CaseLabel;
                        //Console.WriteLine("Value: {0}", Value);
                        MapLabels.Add(Value, CaseLabel);
                    }
                    else if (SwitchDefaultStatement != null)
                    {
                        SwitchDefaultStatement.Tag = DefaultLabel;
                    }
                }

                Traverse(SwitchStatement.ReferenceExpression);
                SafeILGenerator.Switch(MapLabels, DefaultLabel);

                Scopable.RefScope(ref BreakableContext, new LabelContext(EndLabel), () =>
                {
                    Traverse(SwitchStatement.Statements);
                });

                if (!DefaultLabel.Marked)
                {
                    DefaultLabel.Mark();
                }

                EndLabel.Mark();
            });
        }