示例#1
0
        public void CEB_BuildPrimitive()
        {
            var id  = new Identifier("id", PrimitiveType.Word32, null);
            var ceb = new ComplexExpressionBuilder(PrimitiveType.Word32, null, id, null, 0);

            Assert.AreEqual("id", ceb.BuildComplex(false).ToString());
        }
        public void CEB_BuildPointerFetch()
        {
            var ptr = new Identifier("ptr", PrimitiveType.Word32, null);
            var ceb = new ComplexExpressionBuilder(ptrInt, ptrPoint, new Pointer(PrimitiveType.Word32, 4), null, ptr, null, 0);

            ceb.Dereferenced = true;
            Assert.AreEqual("ptr->dw0000", ceb.BuildComplex().ToString());
        }
示例#3
0
        public void CEB_BuildUnionFetch()
        {
            var ptr = new Identifier("ptr", PrimitiveType.Word32, null);

            CreateTv(ptr, ptrUnion, Ptr32(PrimitiveType.Real32));
            var ceb = new ComplexExpressionBuilder(PrimitiveType.Real32, null, ptr, null, 0);

            Assert.AreEqual("ptr->r", ceb.BuildComplex(true).ToString());
        }
        public void CEB_BuildPointer()
        {
            var ptr = new Identifier("ptr", PrimitiveType.Word32, null);

            store.EnsureExpressionTypeVariable(factory, ptr);
            var ceb = new ComplexExpressionBuilder(ptrInt, ptrPoint, new Pointer(PrimitiveType.Word32, 4), null, ptr, null, 0);

            Assert.AreEqual("&ptr->dw0000", ceb.BuildComplex().ToString());
        }
示例#5
0
        public void CEB_BuildPointer()
        {
            var ptr = new Identifier("ptr", PrimitiveType.Word32, null);

            CreateTv(ptr, ptrPoint, Ptr32(PrimitiveType.Word32));
            var ceb = new ComplexExpressionBuilder(PrimitiveType.Word32, null, ptr, null, 0);

            Assert.AreEqual("&ptr->dw0000", ceb.BuildComplex(false).ToString());
        }
        public void CEB_BuildUnionFetch()
        {
            var ptr = new Identifier("ptr", PrimitiveType.Word32, null);
            ComplexExpressionBuilder ceb = new ComplexExpressionBuilder(
                ptrWord,
                ptrUnion,
                new Pointer(PrimitiveType.Real32, 4),
                null, ptr, null, 0);

            ceb.Dereferenced = true;
            Assert.AreEqual("ptr->r", ceb.BuildComplex().ToString());
        }
 public void CEB_BuildMemberAccessFetch()
 {
     var ds = new Identifier("ds", PrimitiveType.SegmentSelector, null);
     var bx = new Identifier("bx", PrimitiveType.Word16, null);
     var sa = new SegmentedAccess(null, ds, bx, PrimitiveType.Word16);
     var tvDs = CreateTv(ds, Ptr16(Segment()), ds.DataType);
     var tvBx = CreateTv(bx, MemPtr(Segment(), PrimitiveType.Word16), MemPtr(new TypeVariable(43), PrimitiveType.Word16));
     var ceb = new ComplexExpressionBuilder(
         new Pointer(PrimitiveType.Word16, 2),
         tvBx.Class.DataType, tvBx.OriginalDataType, ds, bx, null, 0);
     ceb.Dereferenced = true;
     Assert.AreEqual("ds->*bx", ceb.BuildComplex().ToString());
 }
        public void CEB_BuildMemberAccessFetch()
        {
            var ds   = new Identifier("ds", PrimitiveType.SegmentSelector, null);
            var bx   = new Identifier("bx", PrimitiveType.Word16, null);
            var sa   = new SegmentedAccess(null, ds, bx, PrimitiveType.Word16);
            var tvDs = CreateTv(ds, Ptr16(Segment()), ds.DataType);
            var tvBx = CreateTv(bx, MemPtr(Segment(), PrimitiveType.Word16), MemPtr(new TypeVariable(43), PrimitiveType.Word16));
            var ceb  = new ComplexExpressionBuilder(
                new Pointer(PrimitiveType.Word16, 2),
                tvBx.Class.DataType, tvBx.OriginalDataType, ds, bx, null, 0);

            ceb.Dereferenced = true;
            Assert.AreEqual("ds->*bx", ceb.BuildComplex().ToString());
        }
 public void CEB_BuildByteArrayFetch()
 {
     var i = new Identifier("i", PrimitiveType.Word32, null);
     DataType arrayOfBytes = new ArrayType(PrimitiveType.Byte, 0);
     StructureType str = Struct(
         Fld(0x01000, arrayOfBytes));
     CreateTv(globals, Ptr32(str), Ptr32(PrimitiveType.Byte));
     CreateTv(i, PrimitiveType.Int32, PrimitiveType.Word32);
     var ceb = new ComplexExpressionBuilder(
         PrimitiveType.Byte,
         globals.TypeVariable.DataType,
         globals.TypeVariable.OriginalDataType,
         null,
         globals, i, 0x1000);
     ceb.Dereferenced = true;
     Assert.AreEqual("globals->a1000[i]", ceb.BuildComplex().ToString());
 }
        public void CEB_BuildByteArrayFetch()
        {
            var           i            = new Identifier("i", PrimitiveType.Word32, null);
            DataType      arrayOfBytes = new ArrayType(PrimitiveType.Byte, 0);
            StructureType str          = Struct(
                Fld(0x01000, arrayOfBytes));

            CreateTv(globals, Ptr32(str), Ptr32(PrimitiveType.Byte));
            CreateTv(i, PrimitiveType.Int32, PrimitiveType.Word32);
            var ceb = new ComplexExpressionBuilder(
                PrimitiveType.Byte,
                globals.TypeVariable.DataType,
                globals.TypeVariable.OriginalDataType,
                null,
                globals, i, 0x1000);

            ceb.Dereferenced = true;
            Assert.AreEqual("globals->a1000[i]", ceb.BuildComplex().ToString());
        }
 public void CEB_BuildPointerFetch()
 {
     var ptr = new Identifier("ptr", PrimitiveType.Word32, null);
     var ceb = new ComplexExpressionBuilder(ptrInt, ptrPoint, new Pointer(PrimitiveType.Word32, 4), null, ptr, null, 0);
     ceb.Dereferenced = true;
     Assert.AreEqual("ptr->dw0000", ceb.BuildComplex().ToString());
 }
 public void CEB_BuildPointer()
 {
     var ptr = new Identifier("ptr", PrimitiveType.Word32, null);
     store.EnsureExpressionTypeVariable(factory, ptr);
     var ceb = new ComplexExpressionBuilder(ptrInt, ptrPoint, new Pointer(PrimitiveType.Word32, 4), null, ptr, null, 0);
     Assert.AreEqual("&ptr->dw0000", ceb.BuildComplex().ToString());
 }
 public void CEB_BuildUnionFetch()
 {
     var ptr = new Identifier("ptr", PrimitiveType.Word32, null);
     ComplexExpressionBuilder ceb = new ComplexExpressionBuilder(
         ptrWord,
         ptrUnion,
         new Pointer(PrimitiveType.Real32, 4),
         null, ptr, null, 0);
     ceb.Dereferenced = true;
     Assert.AreEqual("ptr->r", ceb.BuildComplex().ToString());
 }
 public void CEB_BuildPrimitive()
 {
     var id = new Identifier("id", PrimitiveType.Word32, null);
     var ceb = new ComplexExpressionBuilder(PrimitiveType.Word32, PrimitiveType.Word32, PrimitiveType.Word32, null, id, null, 0);
     Assert.AreEqual("id", ceb.BuildComplex().ToString());
 }
 public void CEB_BuildUnionFetch()
 {
     var ptr = new Identifier("ptr", PrimitiveType.Word32, null);
     CreateTv(ptr, ptrUnion, Ptr32(PrimitiveType.Real32));
     var ceb = new ComplexExpressionBuilder(PrimitiveType.Real32, null, ptr, null, 0);
     Assert.AreEqual("ptr->r", ceb.BuildComplex(true).ToString());
 }
 private Instruction MakeAssignment(Expression dst, Expression src)
 {
     src = src.Accept(this);
     var tvDst = dst.TypeVariable;
     dst = dst.Accept(this);
     var dtSrc = DataTypeOf(src);
     var dtDst = DataTypeOf(dst);
     if (!TypesAreCompatible(dtSrc, dtDst))
     {
         UnionType uDst = dtDst.ResolveAs<UnionType>();
         UnionType uSrc = dtSrc.ResolveAs<UnionType>();
         if (uDst != null)
         {
             // ceb = new ComplexExpressionBuilder(dtDst, dtDst, dtSrc, null, dst, null, 0);
             tvDst.DataType = dtDst;
             tvDst.OriginalDataType = dtSrc;
             dst.TypeVariable = tvDst;
             var ceb = new ComplexExpressionBuilder(dtSrc, null, dst, null, 0);
             dst = ceb.BuildComplex(false);
         }
         else if (uSrc != null)
         {
             //throw new NotImplementedException();
             //var ceb = new ComplexExpressionBuilder(dtSrc, dtSrc, dtDst, null, src, null, 0);
             //src = ceb.BuildComplex(false);
             src = new Cast(dtDst, src);
         }
         else
         {
             Debug.Print("{2} [{0}] = {3} [{1}] not supported.", dtDst, dtSrc, dst, src);
             src = new Cast(dtDst, src);
         }
     }
     var idDst = dst as Identifier;
     if (idDst != null)
         return new Assignment(idDst, src);
     else
         return new Store(dst, src);
 }
示例#17
0
		public Instruction MakeAssignment(Expression dst, Expression src)
		{
			var tvDst = dst.TypeVariable;
			var tvSrc = src.TypeVariable;
			src = src.Accept(this);
			DataType dtSrc = DataTypeOf(src);
			dst = dst.Accept(this);
			DataType dtDst = DataTypeOf(dst);
            if (!TypesAreCompatible(dtSrc, dtDst))
			{
				UnionType uDst = dtDst.ResolveAs<UnionType>();
				UnionType uSrc = dtSrc.ResolveAs<UnionType>();
				if (uDst != null)
				{
					var ceb = new ComplexExpressionBuilder(dtDst, dtDst, dtSrc, null, dst, null, 0);
					dst = ceb.BuildComplex();
				}
				else if (uSrc != null)
				{
					var ceb = new ComplexExpressionBuilder(dtSrc, dtSrc, dtDst, null, src, null, 0);
					src = ceb.BuildComplex();
				}
				else
					throw new NotImplementedException(string.Format("{0} [{1}] = {2} [{3}] (in assignment {4} = {5}) not supported.", tvDst, dtDst, tvSrc, dtSrc, dst, src));
			}
			return new Core.Absyn.AbsynAssignment(dst, src);
		}
示例#18
0
 public override Expression VisitMkSequence(MkSequence seq)
 {
     var head = seq.Head.Accept(this);
     var tail = seq.Tail.Accept(this);
     Constant c = seq.Tail as Constant;
     var ptHead = head.TypeVariable.DataType as PrimitiveType;
     if (head.TypeVariable.DataType is Pointer || (ptHead != null && ptHead.Domain == Domain.Selector))
     {
         if (c != null)
         {
             ComplexExpressionBuilder ceb = new ComplexExpressionBuilder(
                 seq.TypeVariable.DataType,
                 head.TypeVariable.DataType,
                 head.TypeVariable.OriginalDataType,
                 null,
                 head,
                 null,
                 StructureField.ToOffset(c));
             return ceb.BuildComplex();
         }
         else
         {
             var ceb = new ComplexExpressionBuilder(
                 seq.TypeVariable.DataType,
                 seq.TypeVariable.DataType,
                 seq.TypeVariable.OriginalDataType,
                 head,
                 new MemberPointerSelector(seq.DataType, head, tail),
                 null,
                 0);
             return ceb.BuildComplex();
         }
     }
     else
     {
     }
     return new MkSequence(seq.DataType, head, tail);
 }
示例#19
0
 private Expression TransformComplexSum(BinaryExpression binExp, DataType dtLeft, DataType dtRight)
 {
     if (dtRight.IsComplex)
         throw new TypeInferenceException(
             "Both left and right sides of a binary expression can't be complex types.{0}{1}: {2}:[{3}] {4}:[{5}].",
             Environment.NewLine, binExp,
             binExp.Left.TypeVariable, dtLeft,
             binExp.Right.TypeVariable, dtRight);
     Constant c = binExp.Right as Constant;
     if (c != null)
     {
         ComplexExpressionBuilder ceb = new ComplexExpressionBuilder(
             binExp.TypeVariable.DataType,
             dtLeft,
             binExp.Left.TypeVariable.OriginalDataType,
             null,
             binExp.Left,
             null,
             StructureField.ToOffset(c));
         return ceb.BuildComplex();
     }
     return binExp;
 }
        public void CEB_BuildPointer()
		{
			var ptr = new Identifier("ptr", PrimitiveType.Word32, null);
            CreateTv(ptr, ptrPoint, Ptr32(PrimitiveType.Word32));
			var ceb = new ComplexExpressionBuilder(PrimitiveType.Word32, null, ptr, null, 0);
			Assert.AreEqual("&ptr->dw0000", ceb.BuildComplex(false).ToString());
		}
 public Expression RewriteComplexExpression(Expression complex, Expression index, int offset, bool dereferenced)
 {
     var cOther = index as Constant;
     if (cOther != null)
     {
         offset += cOther.ToInt32();
         index = null;
     }
     var ceb = new ComplexExpressionBuilder(null, basePtr, complex, index, offset);
     return ceb.BuildComplex(dereferenced);
 }