private static EnumThunkReaderDelegate <EnumType> CreateFindFlagsEnumThunkReader(IReadOnlyList <Tuple <string, object> > names) { var thunkReaderRef = typeof(ThunkReader).MakeByRefType(); var underlyingType = Enum.GetUnderlyingType(typeof(EnumType)); var resultValue = "result_value"; var nameToResults = names .Select(name => NameAutomata <EnumType> .CreateName( thunkReaderRef, name.Item1, emit => { LoadConstantOfType(emit, name.Item2, underlyingType); emit.LoadLocal(resultValue); emit.Or(); emit.StoreLocal(resultValue); })) .ToList(); var underlyingDefault = underlyingType.DefaultValue(); var ret = NameAutomata <EnumType> .CreateFold <EnumThunkReaderDelegate <EnumType> >( thunkReaderRef, nameToResults, emit => { emit.DeclareLocal(underlyingType, resultValue); LoadConstantOfType(emit, Convert.ChangeType(0, underlyingType), underlyingType); emit.StoreLocal(resultValue); }, emit => { emit.LoadLocal(resultValue); emit.Return(); }, true, true, false, defaultValue : underlyingDefault ); return((EnumThunkReaderDelegate <EnumType>)ret); }
private static Func <TextReader, EnumType> CreateFindFlagsEnum(IReadOnlyList <Tuple <string, object> > names) { var underlyingType = Enum.GetUnderlyingType(typeof(EnumType)); var resultValue = "result_value"; var nameToResults = names .Select(name => NameAutomata <EnumType> .CreateName( typeof(TextReader), name.Item1, emit => { LoadConstantOfType(emit, name.Item2, underlyingType); emit.LoadLocal(resultValue); emit.Or(); emit.StoreLocal(resultValue); })) .ToList(); var ret = NameAutomata <EnumType> .CreateFold <Func <TextReader, EnumType> >( typeof(TextReader), nameToResults, emit => { emit.DeclareLocal(underlyingType, resultValue); LoadConstantOfType(emit, 0, underlyingType); emit.StoreLocal(resultValue); }, emit => { emit.LoadLocal(resultValue); emit.Return(); }, true, true, false, defaultValue : null ); return((Func <TextReader, EnumType>)ret); }