view dmd/XorExp.d @ 56:51605de93870

TupleExp.optimize UnrolledLoopStatement.ctor UnrolledLoopStatement.semantic UnrolledLoopStatement.blockExit OrOrExp.checkSideEffect FuncExp.syntaxCopy FuncLiteralDeclaration.syntaxCopy WhileStatement.hasBreak StructInitializer.toExpression StructLiteralExp.ctor StructLiteralExp.optimize BinExp.commonSemanticAssign ModAssignExp.opId Argument.isLazyArray CommaExp.implicitConvTo CommaExp.castTo TypeClass.isBaseOf createTypeInfoArray TypeTuple.getTypeInfoDeclaration TypeInfoTupleDeclaration.ctor TypeNext.constConv XorExp.implicitConvTo TemplateParameter.isTemplateValueParameter
author korDen
date Sat, 21 Aug 2010 14:16:53 +0400
parents 832f71e6f96c
children cab4c37afb89
line wrap: on
line source

module dmd.XorExp;

import dmd.Expression;
import dmd.Identifier;
import dmd.InterState;
import dmd.MATCH;
import dmd.Id;
import dmd.Type;
import dmd.OutBuffer;
import dmd.Loc;
import dmd.Scope;
import dmd.IntRange;
import dmd.IRState;
import dmd.ArrayTypes;
import dmd.BinExp;
import dmd.TOK;
import dmd.TY;

import dmd.backend.elem;
import dmd.expression.Util;
import dmd.expression.Xor;

class XorExp : BinExp
{
	this(Loc loc, Expression e1, Expression e2)
	{
		super(loc, TOK.TOKxor, XorExp.sizeof, e1, e2);
	}

	Expression semantic(Scope sc)
	{
		Expression e;

		if (!type)
		{	
			BinExp.semanticp(sc);
			e = op_overload(sc);
			if (e)
				return e;
			if (e1.type.toBasetype().ty == Tbool &&
				e2.type.toBasetype().ty == Tbool)
			{
				type = e1.type;
				e = this;
			}
			else
			{
				typeCombine(sc);
				if (e1.op != TOKslice && e2.op != TOKslice)
				{
					e1.checkIntegral();
					e2.checkIntegral();
				}
			}
		}
		return this;
	}

	Expression optimize(int result)
	{
		Expression e;

		e1 = e1.optimize(result);
		e2 = e2.optimize(result);
		if (e1.isConst() == 1 && e2.isConst() == 1)
			e = Xor(type, e1, e2);
		else
			e = this;

		return e;
	}

	Expression interpret(InterState* istate)
	{
		assert(false);
	}

	void buildArrayIdent(OutBuffer buf, Expressions arguments)
	{
		Exp_buildArrayIdent(buf, arguments, "Xor");
	}

	Expression buildArrayLoop(Arguments fparams)
	{
		/* Evaluate assign expressions left to right		
		 */								
		Expression ex1 = e1.buildArrayLoop(fparams);		
		Expression ex2 = e2.buildArrayLoop(fparams);		
		Expression e = new XorExp(Loc(0), ex1, ex2);			
		return e;							
	}

	MATCH implicitConvTo(Type t)
	{
		MATCH result = Expression.implicitConvTo(t);

		if (result == MATCHnomatch)
		{
			MATCH m1 = e1.implicitConvTo(t);
			MATCH m2 = e2.implicitConvTo(t);

			// Pick the worst match
			result = (m1 < m2) ? m1 : m2;
		}
		return result;
	}

	IntRange getIntRange()
	{
		assert(false);
	}

	bool isCommutative()
	{
		return true;
	}

	Identifier opId()
	{
		return Id.ixor;
	}

	Identifier opId_r()
	{
		return Id.ixor_r;
	}

	elem* toElem(IRState* irs)
	{
		assert(false);
	}
}