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()); } }
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))); }
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())); }
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); }