private void Parse_EventMemberDeclaration(int class_id, ModifierList ml, ModifierList owner_ml) { int num2; int num3; this.Match("Event"); base.CheckModifiers(ml, this.event_modifiers); int id = this.Parse_Ident(); if (ml.HasModifier(Modifier.Abstract) && !owner_ml.HasModifier(Modifier.Abstract)) { string str = base.GetName(id); string str2 = base.GetName(class_id); base.RaiseErrorEx(false, "CS0513. '{0}' is abstract but it is contained in nonabstract class '{1}'", new object[] { str, str2 }); } if (base.IsCurrText('(')) { int num4 = 1; int num5 = base.NewVar(); base.SetName(num5, base.GetName(id) + "EventHandler"); base.BeginDelegate(num5, ml); num2 = base.NewVar(); this.BeginMethod(num2, MemberKind.Method, ml, num4); this.Gen(base.code.OP_ADD_PATTERN, num5, num2, 0); if (base.IsCurrText('(')) { this.Match('('); if (!base.IsCurrText(')')) { this.Parse_ParameterList(num2, false); } this.Match(')'); } if (base.IsCurrText("As")) { this.Match("As"); this.Parse_Attributes(); num4 = this.Parse_Type(); this.Gen(base.code.OP_ASSIGN_TYPE, num2, num4, 0); this.Gen(base.code.OP_ASSIGN_TYPE, base.CurrResultId, num4, 0); } this.InitMethod(num2); int num6 = base.NewVar(); int num7 = base.NewVar(); int resultId = base.GetResultId(num2); int thisId = base.GetThisId(num2); int num10 = base.NewLabel(); int l = base.NewLabel(); this.Gen(base.code.OP_FIND_FIRST_DELEGATE, thisId, num6, num7); this.Gen(base.code.OP_GO_NULL, num10, num6, 0); for (int i = 0; i < this.param_ids.Count; i++) { this.Gen(base.code.OP_PUSH, this.param_ids[i], this.param_mods[i], num6); } this.Gen(base.code.OP_PUSH, num7, 0, 0); this.Gen(base.code.OP_CALL_SIMPLE, num6, this.param_ids.Count, resultId); base.SetLabelHere(l); this.Gen(base.code.OP_FIND_NEXT_DELEGATE, thisId, num6, num7); this.Gen(base.code.OP_GO_NULL, num10, num6, 0); for (int j = 0; j < this.param_ids.Count; j++) { this.Gen(base.code.OP_PUSH, this.param_ids[j], this.param_mods[j], num6); } this.Gen(base.code.OP_PUSH, num7, 0, 0); this.Gen(base.code.OP_CALL_SIMPLE, num6, this.param_ids.Count, resultId); this.Gen(base.code.OP_GO, l, 0, 0); base.SetLabelHere(num10); this.EndMethod(num2); base.EndDelegate(num5); num3 = num5; } else { this.Match("As"); num3 = this.Parse_Type(); } ModifierList list = ml.Clone(); list.Delete(Modifier.Public); base.BeginField(id, list, num3); string name = base.GetName(id); base.SetName(id, "__" + name); base.EndField(id); int num17 = base.NewVar(); base.SetName(num17, name); base.BeginEvent(num17, ml, num3, 0); this.Gen(base.code.OP_ADD_EVENT_FIELD, num17, id, 0); num2 = base.NewVar(); base.SetName(num2, "add_" + name); this.BeginMethod(num2, MemberKind.Method, list, 1); int num14 = base.NewVar(); base.SetName(num14, "value"); this.Gen(base.code.OP_ADD_PARAM, num2, num14, 0); this.Gen(base.code.OP_ASSIGN_TYPE, num14, num3, 0); this.InitMethod(num2); int num15 = base.NewVar(); base.SetName(num15, base.GetName(id)); int res = base.NewVar(); this.Gen(base.code.OP_EVAL, 0, 0, num15); this.Gen(base.code.OP_PLUS, num15, num14, res); this.Gen(base.code.OP_ASSIGN, num15, res, num15); this.EndMethod(num2); this.Gen(base.code.OP_ADD_ADD_ACCESSOR, num17, num2, 0); num2 = base.NewVar(); base.SetName(num2, "remove_" + name); this.BeginMethod(num2, MemberKind.Method, list, 1); num14 = base.NewVar(); base.SetName(num14, "value"); this.Gen(base.code.OP_ADD_PARAM, num2, num14, 0); this.Gen(base.code.OP_ASSIGN_TYPE, num14, num3, 0); this.InitMethod(num2); num15 = base.NewVar(); base.SetName(num15, base.GetName(id)); res = base.NewVar(); this.Gen(base.code.OP_EVAL, 0, 0, num15); this.Gen(base.code.OP_MINUS, num15, num14, res); this.Gen(base.code.OP_ASSIGN, num15, res, num15); this.EndMethod(num2); this.Gen(base.code.OP_ADD_REMOVE_ACCESSOR, num17, num2, 0); base.EndEvent(num17); this.MatchLineTerminator(); }