示例#1
0
 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();
 }