示例#1
0
        /// <summary>
        /// Defines instance initializer which init given traits.
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        public AbcMethod DefineTraitsInitializer(params object[] args)
        {
            var pairs = args
                        .Pairwise(x => x is string? 1 : 0)
                        .Select(x =>
            {
                var t = x.First as AbcTrait;
                if (t == null)
                {
                    throw new InvalidOperationException();
                }
                if (!t.IsSlot)
                {
                    throw new InvalidOperationException();
                }
                return(new KeyValuePair <AbcTrait, string>(t, x.Second as string));
            })
                        .ToList();

            var traits = pairs.Select(x => x.Key).ToList();

            return(DefineMethod(
                       Sig.global(AvmTypeCode.Void, args),
                       code =>
            {
                code.PushThisScope();

                code.ConstructSuper();

                for (int i = 0; i < traits.Count; ++i)
                {
                    code.LoadThis();
                    code.GetLocal(i + 1);
                    code.SetProperty(traits[i]);
                }

                code.ReturnVoid();
            }
                       ));
        }
示例#2
0
 public AbcMethod DefineEmptyMethod()
 {
     return(DefineMethod(
                Sig.global(null),
                code => code.ReturnVoid()));
 }