public CodeExpression GetReaderExpression(CodeExpression reader)
        {
            CodeExpression returnExpression;

            // Might as well return an empty string
            if (!_reference.IsValid())
            {
                returnExpression = CodeGen.GetPrimitive(String.Empty);
            }
            else
            {
                string name = _isByteLength ? "FixBS" : "FixS";
                List <CodeExpression> parameters = new List <CodeExpression>();

                parameters.Add(reader);
                parameters.Add(CodeGen.GetEnum(StringEncoding));
                parameters.Add(CodeGen.GetField(CodeGen.GetThis(), _reference.GetNames()));

                EvalExpression lengthRead = LengthReadExpression;

                if (lengthRead.IsValid)
                {
                    parameters.Add(CodeGen.GetPrimitive(lengthRead.Expression));
                }
                else
                {
                    parameters.Add(CodeGen.GetPrimitive(_adjustment));
                }

                returnExpression = CodeGen.CallMethod(CodeGen.GetThis(), name, parameters.ToArray());
            }

            return(returnExpression);
        }
        public CodeExpression GetReaderExpression(CodeExpression reader)
        {
            CodeExpression      ret   = null;
            IMemberReaderWriter entry = BaseEntry as IMemberReaderWriter;

            if (_reference.IsValid())
            {
                string name = _isByteLength ? "SAB" : "SA";
                List <CodeExpression> parameters = new List <CodeExpression>();

                parameters.Add(reader);

                EvalExpression lengthRead = LengthReadExpression;

                parameters.Add(CodeGen.GetField(CodeGen.GetThis(), _reference.GetNames()));

                if (lengthRead.IsValid)
                {
                    parameters.Add(CodeGen.GetPrimitive(lengthRead.Expression));
                }
                else
                {
                    parameters.Add(CodeGen.GetPrimitive(_adjustment));
                }

                ret = CodeGen.CallMethod(CodeGen.GetThis(), name, BaseEntry.GetTypeReference(), parameters.ToArray());
            }
            else
            {
                ret = CodeGen.CreateArray(GetTypeReference(), 0);
            }

            return(ret);
        }
Пример #3
0
        public override CodeExpression GetReaderExpression(CodeExpression reader)
        {
            CodeExpression refExpr;

            if (_magicParser)
            {
                List <CodeExpression> args = new List <CodeExpression>();

                args.Add(reader);

                foreach (SequenceChoice choice in _choices)
                {
                    if (choice.SequenceType != null)
                    {
                        args.Add(CodeGen.GetTypeOf(new CodeTypeReference(choice.SequenceType.Name)));
                    }
                }

                if (DefaultType != null)
                {
                    args.Add(CodeGen.GetTypeOf(new CodeTypeReference(DefaultType.Name)));
                }

                return(CodeGen.CallMethod(CodeGen.GetThis(), "RSC", args.ToArray()));
            }
            else
            {
                if (_reference.IsValid())
                {
                    refExpr = CodeGen.GetField(CodeGen.GetThis(), _reference.GetNames());
                }
                else
                {
                    refExpr = CodeGen.GetPrimitive(null);
                }

                List <CodeExpression> args = new List <CodeExpression>();

                args.Add(reader);
                args.Add(refExpr);

                foreach (SequenceChoice choice in _choices)
                {
                    if ((choice.BooleanExpression.IsValid) && (choice.SequenceType != null))
                    {
                        args.Add(CodeGen.GetPrimitive(choice.BooleanExpression.Expression));
                        args.Add(CodeGen.GetTypeOf(new CodeTypeReference(choice.SequenceType.Name)));
                    }
                }

                if (DefaultType != null)
                {
                    args.Add(CodeGen.GetPrimitive("true"));
                    args.Add(CodeGen.GetTypeOf(new CodeTypeReference(DefaultType.Name)));
                }

                return(CodeGen.CallMethod(CodeGen.GetThis(), "RSC", args.ToArray()));
            }
        }
        private CodeExpression GetLength()
        {
            CodeExpression ret = CodeGen.GetCast(typeof(int), CodeGen.GetField(CodeGen.GetThis(), _reference.GetNames()));

            if (_adjustment != 0)
            {
                ret = CodeGen.GetOperator(ret, CodeBinaryOperatorType.Add, CodeGen.GetPrimitive(_adjustment));
            }

            return(ret);
        }
        public override System.CodeDom.CodeMemberMethod GetPreSerializeMethod()
        {
            CodeMemberMethod method = base.GetPreSerializeMethod();

            if (_reference.IsValid())
            {
                CodeExpression right = CodeGen.GetProperty(CodeGen.GetThisField(Name), "Length");

                if (_isByteLength)
                {
                    PrimitiveMemberEntry entry    = BaseEntry as PrimitiveMemberEntry;
                    BitFieldMemberEntry  bitField = entry as BitFieldMemberEntry;

                    if (bitField != null)
                    {
                        right = CodeGen.CallMethod(CodeGen.GetThis(), "CLBits", right, CodeGen.GetPrimitive(bitField.Bits));
                    }
                    else
                    {
                        right = CodeGen.GetOperator(CodeGen.GetPrimitive(entry.GetSize()), CodeBinaryOperatorType.Multiply, right);
                    }
                }

                EvalExpression lengthWrite = LengthWriteExpression;

                if (lengthWrite.IsValid)
                {
                    right = lengthWrite.GetEvalExpression(right);
                }
                else if (_adjustment != 0)
                {
                    right = CodeGen.GetOperator(right, CodeBinaryOperatorType.Subtract, CodeGen.GetPrimitive(_adjustment));
                }

                if (_reference.GetTargetMember().BaseType is StringParserType)
                {
                    right = CodeGen.CallMethod(right, "ToString");
                }
                else
                {
                    right = CodeGen.GetCast(_reference.GetTargetMember().GetTypeReference(), right);
                }

                method.Statements.Add(CodeGen.GetAssign(CodeGen.GetField(CodeGen.GetThis(), _reference.GetNames()), right));
            }

            return(method);
        }
        public CodeExpression GetReaderExpression(CodeExpression reader)
        {
            CodeExpression       ret;
            PrimitiveMemberEntry entry = BaseEntry as PrimitiveMemberEntry;

            if (_reference.IsValid())
            {
                CodeExpression lengthExpression;
                EvalExpression lengthRead = LengthReadExpression;

                if (lengthRead.IsValid)
                {
                    lengthExpression = CodeGen.CallMethod(CodeGen.GetThis(), "CL", CodeGen.GetField(CodeGen.GetThis(), _reference.GetNames()), CodeGen.GetPrimitive(lengthRead.Expression));
                }
                else
                {
                    Type refType = ((BuiltinParserType)_reference.GetTargetMember().BaseType).DataType;
                    lengthExpression = CodeGen.GetField(CodeGen.GetThis(), _reference.GetNames());

                    if (refType != typeof(int))
                    {
                        lengthExpression = CodeGen.CallMethod(CodeGen.GetThis(), "CL", lengthExpression);
                    }

                    if (_adjustment != 0)
                    {
                        lengthExpression = CodeGen.GetOperator(lengthExpression, CodeBinaryOperatorType.Add, CodeGen.GetPrimitive(_adjustment));
                    }
                }

                if (_isByteLength)
                {
                    ret = CodeGen.CallMethod(CodeGen.GetThis(), "FixBPA", BaseEntry.GetTypeReference(), reader, lengthExpression, ((IntegerPrimitiveMemberEntry)BaseEntry).GetEndian());
                }
                else
                {
                    ret = CodeGen.CallMethod(CodeGen.GetThis(), "FixPA", BaseEntry.GetTypeReference(), reader, lengthExpression, ((IntegerPrimitiveMemberEntry)BaseEntry).GetEndian());
                }
            }
            else
            {
                ret = CodeGen.CreateArray(BaseEntry.GetTypeReference(), 0);
            }

            return(ret);
        }
Пример #7
0
        private CodeExpression GetLength()
        {
            Type refType = ((BuiltinParserType)_reference.GetTargetMember().BaseType).DataType;

            CodeExpression ret = CodeGen.GetField(CodeGen.GetThis(), _reference.GetNames());

            if (refType != typeof(int))
            {
                ret = CodeGen.CallMethod(CodeGen.GetThis(), "CL", ret);
            }

            if (_adjustment != 0)
            {
                ret = CodeGen.GetOperator(ret, CodeBinaryOperatorType.Add, CodeGen.GetPrimitive(_adjustment));
            }

            return(ret);
        }
        public override CodeMemberMethod GetPreSerializeMethod()
        {
            CodeMemberMethod method = base.GetPreSerializeMethod();

            if (_reference.IsValid())
            {
                CodeExpression right;

                if (_isByteLength)
                {
                    right = CodeGen.CallMethod(CodeGen.GetThis(), "SBL", CodeGen.GetThisField(Name), CodeGen.GetEnum(StringEncoding));
                }
                else
                {
                    right = CodeGen.GetProperty(CodeGen.GetThisField(Name), "Length");
                }

                EvalExpression lengthWrite = LengthWriteExpression;

                if (lengthWrite.IsValid)
                {
                    right = lengthWrite.GetEvalExpression(right);
                }
                else if (_adjustment != 0)
                {
                    right = CodeGen.GetOperator(right, CodeBinaryOperatorType.Subtract, CodeGen.GetPrimitive(_adjustment));
                }

                if (_reference.GetTargetMember().BaseType is StringParserType)
                {
                    right = CodeGen.CallMethod(right, "ToString");
                }
                else
                {
                    right = CodeGen.GetCast(_reference.GetTargetMember().GetTypeReference(), right);
                }

                method.Statements.Add(CodeGen.GetAssign(CodeGen.GetField(CodeGen.GetThis(), _reference.GetNames()), right));
            }

            return(method);
        }
Пример #9
0
        public override System.CodeDom.CodeMemberMethod GetPreSerializeMethod()
        {
            CodeMemberMethod method = base.GetPreSerializeMethod();

            if (_reference.IsValid())
            {
                CodeExpression right;

                if (_isByteLength)
                {
                    // Should really save this out and reuse when it comes to actually writing the data, seems a waste
                    method.Statements.Add(CodeGen.MakeVariable(typeof(DataWriter), "writer", CodeGen.CreateObject(typeof(DataWriter))));

                    IMemberReaderWriter entry = BaseEntry as IMemberReaderWriter;

                    List <CodeStatement> loopStatements = new List <CodeStatement>();

                    loopStatements.Add(CodeGen.GetStatement(entry.GetWriterExpression(CodeGen.GetWriter(), CodeGen.GetIndex(CodeGen.GetThisField(Name),
                                                                                                                            CodeGen.GetVariable("i")))));

                    method.Statements.Add(CodeGen.GetForLoop("i", 0, CodeGen.GetProperty(CodeGen.GetThisField(Name), "Length"),
                                                             1, loopStatements.ToArray()));

                    right = CodeGen.GetProperty(CodeGen.GetVariable("writer"), "BytesWritten");
                }
                else
                {
                    right = CodeGen.GetProperty(CodeGen.GetThisField(Name), "Length");
                }

                if (_adjustment != 0)
                {
                    right = CodeGen.GetOperator(right, CodeBinaryOperatorType.Subtract, CodeGen.GetPrimitive(_adjustment));
                }

                method.Statements.Add(CodeGen.GetAssign(CodeGen.GetField(CodeGen.GetThis(),
                                                                         _reference.GetNames()), CodeGen.GetCast(_reference.GetTargetMember().GetTypeReference(), right)));
            }

            return(method);
        }