public override void EmitMetaSetup(DomBlock block, Offsets offsets)
        {
            var tmp = block.TempVar();
            PropertyDecorator element = Decorator.ElementDecorator;

            element.Definition.Name += "[]";

            offsets.OffsetStorage = "{0} + ({1} * {2}) /*required-storage:{2}*/".Expr(Decorator.OffsetStorage, tmp,
                                                                                      element.RequiredStorage);
            offsets.OffsetProperties = "{0} + ({1} * {2}) /*required-properties:{2}*/".Expr(Decorator.OffsetProperties,
                                                                                            tmp, element.RequiredProperties);

            if (element.RequiredObjects == 0)
            {
                offsets.OffsetObjects = "0 /*required-objects:{0}*/".Expr(element.RequiredObjects);
            }
            else
            {
                offsets.OffsetObjects = "{0} + ({1} * {2}) /*required-objects:{2}*/".Expr(Decorator.OffsetObjects + 1,
                                                                                          tmp, element.RequiredObjects);
            }

            block.Stmts.For(tmp, tmp + " < " + Decorator.PropertyType.ElementCount,
                            body => { Create(element).EmitMetaSetup(new DomBlock(body, tmp + "_"), offsets, tmp.Expr()); });
        }
        public override void EmitObjectSetup(DomBlock block, Offsets offsets)
        {
            PropertyDecorator element = Decorator.ElementDecorator;

            if (element is PropertyDecoratorStruct)
            {
                PropertyDecoratorStruct structDecorator = (PropertyDecoratorStruct)element;
                EmitInitObject(Decorator.ClrType, block, offsets,             /* size */
                               Decorator.PropertyType.ElementCount.Literal(), /* stride */
                               structDecorator.RequiredObjects.Literal());

                var tmp = block.TempVar();
                element.Definition.Name += "[]";

                offsets.OffsetStorage = "offsets.OffsetStorage + {0} + ({1} * {2})".Expr(Decorator.OffsetStorage, tmp,
                                                                                         element.RequiredStorage);
                offsets.OffsetObjects = "offsets.OffsetObjects + {0} + ({1} * {2})".Expr(Decorator.OffsetObjects + 1,
                                                                                         tmp, element.RequiredObjects);
                offsets.OffsetProperties =
                    "offsets.OffsetProperties + {0} + ({1} * {2})".Expr(Decorator.OffsetProperties, tmp,
                                                                        element.RequiredProperties);

                block.Stmts.For(tmp, tmp + " < " + Decorator.PropertyType.ElementCount,
                                body => { Create(element).EmitObjectSetup(new DomBlock(body, tmp + "_"), offsets); });
            }
            else
            {
                EmitInitObject(Decorator.ClrType, block, offsets, /* size */
                               Decorator.PropertyType.ElementCount.Literal(), /* stride */ element.RequiredStorage.Literal());
            }
        }
예제 #3
0
        public void EmitInitObject(string type, DomBlock block, Offsets offsets, params CodeExpression[] ctorArguments)
        {
            var tmp = block.Stmts.Var(type, block.TempVar());

            block.Stmts.Add(tmp.Assign(type.New(ctorArguments)));
            block.Stmts.Add(tmp.Call("Init", Decorator.Definition.Name.Literal(), "obj.Root".Expr(),
                                     "Ascension.Networking.NetworkObj_Meta.Offsets".New(offsets.OffsetProperties, offsets.OffsetStorage,
                                                                                        offsets.OffsetObjects)));
        }
예제 #4
0
        public virtual void EmitMetaSetup(DomBlock block, Offsets offsets, CodeExpression indexExpression)
        {
            var tmp = block.Stmts.Var(SerializerClassName, block.TempVar());

            block.Stmts.Assign(tmp, SerializerClassName.New());
            block.Stmts.Assign(tmp.Field("PropertyMeta"), "this".Expr());

            EmitAddSettings(tmp, block.Stmts, offsets);

            block.Stmts.Add("this".Expr()
                            .Call("AddProperty", offsets.OffsetProperties, offsets.OffsetObjects, tmp,
                                  indexExpression ?? (-1).Literal()));
        }
예제 #5
0
        protected override void EmitFactory()
        {
            base.EmitFactory();

            MetaType.DeclareMethod(typeof(void), "Dispatch", method =>
            {
                method.DeclareParameter("Ascension.Networking.Event", "ev");
                method.DeclareParameter(typeof(object).FullName, "target");

                DomBlock block = new DomBlock(method.Statements);

                var tmp = block.TempVar();

                block.Stmts.Expr("{0} {1} = target as {0}", Decorator.ListenerInterface, tmp);
                block.Stmts.Expr("if ({0} != null) {{ {0}.OnEvent(({1})ev); }}", tmp, Decorator.Name);
            }).PrivateImplementationType = new CodeTypeReference(Decorator.FactoryInterface);
        }