예제 #1
0
        void EmitTryRead_GenSwitch(SerializerCodeGen g, Local fieldNumber, MetaType metaType, SubType[] subTypes, Action <MetaType> returnGen)
        {
            using (g.ctx.StartDebugBlockAuto(this))
            {
                if (subTypes.Length == 0)
                {
                    returnGen(metaType);
                    return;
                }

                // may be optimized to check -1
                g.ctx.MarkDebug("// Start of switch");
                g.Switch(fieldNumber);
                {
                    foreach (var subType in subTypes)
                    {
                        g.ctx.MarkDebug("// Switch case");
                        g.Case(subType.FieldNumber);
                        returnGen(subType.DerivedType);
                        g.ctx.MarkDebug("// Switch case - break");
                        g.Break();
                    }

                    g.ctx.MarkDebug("// Default switch case");
                    g.DefaultCase();
                    returnGen(metaType);
                    g.ctx.MarkDebug("// Default switch case - break");
                    g.Break();
                }
                g.ctx.MarkDebug("// End of switch");
                g.End();
            }
        }